From 76792ef9adbe6dcacab7ef896f23230c5a9b456e Mon Sep 17 00:00:00 2001 From: longfellowJian <779035789@qq.com> Date: Thu, 27 Mar 2025 16:06:44 +0800 Subject: [PATCH] =?UTF-8?q?=E5=88=9D=E5=A7=8B=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 1 + Externals/Rhino.Mocks.xml | 5624 +++ Externals/log4net.xml | 28655 ++++++++++++++++ README.md | 22 + SEClient/Commands.cs | 711 + SEClient/Contract/SevenExcellence-Home.png | Bin 0 -> 36404 bytes SEClient/Contract/SevenExcellence-Home.xcf | Bin 0 -> 104330 bytes SEClient/Contract/SevenExcellence.png | Bin 0 -> 93409 bytes SEClient/Contract/generateServices.bat | 14 + SEClient/Contract/importer.xsd | 72 + SEClient/Contract/result_types_platform.xsd | 39 + SEClient/Contract/results_labx_2.cs | 19069 ++++++++++ SEClient/Contract/results_labxdirect.cs | 19067 ++++++++++ SEClient/Contract/results_labxdirect.xsd | 320 + SEClient/Contract/service.xsd | 3483 ++ SEClient/Contract/service.xsd.backup | 3146 ++ SEClient/LancePdkXML.cs | 306 + .../NotificationBroker/LocalSubscription.cs | 91 + .../NotificationBroker/NotificationBroker.cs | 223 + .../NotificationBroker/NotificationHelper.cs | 53 + .../Notifications/LogWrittenNotification.cs | 16 + .../Notifications/Notification.cs | 53 + .../Notifications/NotificationScope.cs | 21 + SEClient/NotificationBroker/Subscription.cs | 65 + .../ISubscriptionFilter.cs | 24 + .../SubscriptionFilterOperation.cs | 22 + SEClient/NotificationBroker/Subscriptions.cs | 176 + .../NotificationBroker/Validation/Validate.cs | 95 + SEClient/Properties/AssemblyInfo.cs | 36 + SEClient/ResultMessageSerializer.cs | 307 + SEClient/SEClient.cs | 319 + SEClient/SEClient.csproj | 104 + SEClient/SECommandDispatcher.cs | 222 + SEClient/SEConnection.cs | 154 + SEClient/SERecord.cs | 745 + SEClient/SETelegram.cs | 228 + SEClient/SEText.cs | 15 + SEClient/Validation/Validate.cs | 95 + SEClient/XmlUtilities.cs | 99 + SEClient/bin/Debug/log4net.xml | 28271 +++++++++++++++ SEClient/decfloat.cs | 69 + ...amework,Version=v4.8.AssemblyAttributes.cs | 4 + .../obj/Debug/SEClient.csproj.CopyComplete | 0 .../SEClient.csproj.FileListAbsolute.txt | 19 + SEClient/obj/Debug/_IsIncrementalBuild | 1 + SEClient/packages.config | 4 + SECockpit.sln | 32 + SERemoteControl/AboutBox.Designer.cs | 185 + SERemoteControl/AboutBox.cs | 105 + SERemoteControl/AboutBox.resx | 120 + SERemoteControl/App.config | 21 + SERemoteControl/FormMain.Designer.cs | 776 + SERemoteControl/FormMain.cs | 616 + SERemoteControl/FormMain.resx | 1648 + SERemoteControl/LogWrittenEventArgs.cs | 16 + SERemoteControl/Program.cs | 22 + SERemoteControl/Properties/AssemblyInfo.cs | 37 + SERemoteControl/Properties/Icon1.ico | Bin 0 -> 91182 bytes .../Properties/Resources.Designer.cs | 83 + SERemoteControl/Properties/Resources.resx | 127 + .../Properties/Settings.Designer.cs | 50 + SERemoteControl/Properties/Settings.settings | 12 + SERemoteControl/Properties/app.manifest | 73 + SERemoteControl/SERemoteControl.csproj | 177 + .../SERemoteControl_TemporaryKey.pfx | Bin 0 -> 1660 bytes SERemoteControl/Settings.cs | 28 + SERemoteControl/SevenExcellence.png | Bin 0 -> 93409 bytes .../bin/Debug/SERemoteControl.exe.config | 21 + SERemoteControl/bin/Debug/log4net.xml | 28271 +++++++++++++++ ...amework,Version=v4.8.AssemblyAttributes.cs | 4 + .../Debug/SERemoteControl.AboutBox.resources | Bin 0 -> 180 bytes .../Debug/SERemoteControl.FormMain.resources | Bin 0 -> 91748 bytes ...moteControl.Properties.Resources.resources | Bin 0 -> 202594 bytes .../Debug/SERemoteControl.csproj.CopyComplete | 0 ...ERemoteControl.csproj.FileListAbsolute.txt | 35 + SERemoteControl/obj/Debug/_IsIncrementalBuild | 1 + SERemoteControl/packages.config | 4 + UnitTestProject/Properties/AssemblyInfo.cs | 36 + UnitTestProject/UnitTest1.cs | 235 + UnitTestProject/UnitTestProject.csproj | 95 + ...amework,Version=v4.8.AssemblyAttributes.cs | 4 + .../log4net.3.0.3-preview.1/.signature.p7s | Bin 0 -> 12917 bytes packages/log4net.3.0.3-preview.1/README.md | 31 + .../lib/net462/log4net.xml | 28271 +++++++++++++++ .../lib/netstandard2.0/log4net.xml | 27591 +++++++++++++++ .../log4net.3.0.3-preview.1.nupkg | Bin 0 -> 718681 bytes .../log4net.3.0.3-preview.1/package-icon.png | Bin 0 -> 40042 bytes 87 files changed, 200787 insertions(+) create mode 100644 .gitignore create mode 100644 Externals/Rhino.Mocks.xml create mode 100644 Externals/log4net.xml create mode 100644 README.md create mode 100644 SEClient/Commands.cs create mode 100644 SEClient/Contract/SevenExcellence-Home.png create mode 100644 SEClient/Contract/SevenExcellence-Home.xcf create mode 100644 SEClient/Contract/SevenExcellence.png create mode 100644 SEClient/Contract/generateServices.bat create mode 100644 SEClient/Contract/importer.xsd create mode 100644 SEClient/Contract/result_types_platform.xsd create mode 100644 SEClient/Contract/results_labx_2.cs create mode 100644 SEClient/Contract/results_labxdirect.cs create mode 100644 SEClient/Contract/results_labxdirect.xsd create mode 100644 SEClient/Contract/service.xsd create mode 100644 SEClient/Contract/service.xsd.backup create mode 100644 SEClient/LancePdkXML.cs create mode 100644 SEClient/NotificationBroker/LocalSubscription.cs create mode 100644 SEClient/NotificationBroker/NotificationBroker.cs create mode 100644 SEClient/NotificationBroker/NotificationHelper.cs create mode 100644 SEClient/NotificationBroker/Notifications/LogWrittenNotification.cs create mode 100644 SEClient/NotificationBroker/Notifications/Notification.cs create mode 100644 SEClient/NotificationBroker/Notifications/NotificationScope.cs create mode 100644 SEClient/NotificationBroker/Subscription.cs create mode 100644 SEClient/NotificationBroker/SubscriptionFilters/ISubscriptionFilter.cs create mode 100644 SEClient/NotificationBroker/SubscriptionFilters/SubscriptionFilterOperation.cs create mode 100644 SEClient/NotificationBroker/Subscriptions.cs create mode 100644 SEClient/NotificationBroker/Validation/Validate.cs create mode 100644 SEClient/Properties/AssemblyInfo.cs create mode 100644 SEClient/ResultMessageSerializer.cs create mode 100644 SEClient/SEClient.cs create mode 100644 SEClient/SEClient.csproj create mode 100644 SEClient/SECommandDispatcher.cs create mode 100644 SEClient/SEConnection.cs create mode 100644 SEClient/SERecord.cs create mode 100644 SEClient/SETelegram.cs create mode 100644 SEClient/SEText.cs create mode 100644 SEClient/Validation/Validate.cs create mode 100644 SEClient/XmlUtilities.cs create mode 100644 SEClient/bin/Debug/log4net.xml create mode 100644 SEClient/decfloat.cs create mode 100644 SEClient/obj/Debug/.NETFramework,Version=v4.8.AssemblyAttributes.cs create mode 100644 SEClient/obj/Debug/SEClient.csproj.CopyComplete create mode 100644 SEClient/obj/Debug/SEClient.csproj.FileListAbsolute.txt create mode 100644 SEClient/obj/Debug/_IsIncrementalBuild create mode 100644 SEClient/packages.config create mode 100644 SECockpit.sln create mode 100644 SERemoteControl/AboutBox.Designer.cs create mode 100644 SERemoteControl/AboutBox.cs create mode 100644 SERemoteControl/AboutBox.resx create mode 100644 SERemoteControl/App.config create mode 100644 SERemoteControl/FormMain.Designer.cs create mode 100644 SERemoteControl/FormMain.cs create mode 100644 SERemoteControl/FormMain.resx create mode 100644 SERemoteControl/LogWrittenEventArgs.cs create mode 100644 SERemoteControl/Program.cs create mode 100644 SERemoteControl/Properties/AssemblyInfo.cs create mode 100644 SERemoteControl/Properties/Icon1.ico create mode 100644 SERemoteControl/Properties/Resources.Designer.cs create mode 100644 SERemoteControl/Properties/Resources.resx create mode 100644 SERemoteControl/Properties/Settings.Designer.cs create mode 100644 SERemoteControl/Properties/Settings.settings create mode 100644 SERemoteControl/Properties/app.manifest create mode 100644 SERemoteControl/SERemoteControl.csproj create mode 100644 SERemoteControl/SERemoteControl_TemporaryKey.pfx create mode 100644 SERemoteControl/Settings.cs create mode 100644 SERemoteControl/SevenExcellence.png create mode 100644 SERemoteControl/bin/Debug/SERemoteControl.exe.config create mode 100644 SERemoteControl/bin/Debug/log4net.xml create mode 100644 SERemoteControl/obj/Debug/.NETFramework,Version=v4.8.AssemblyAttributes.cs create mode 100644 SERemoteControl/obj/Debug/SERemoteControl.AboutBox.resources create mode 100644 SERemoteControl/obj/Debug/SERemoteControl.FormMain.resources create mode 100644 SERemoteControl/obj/Debug/SERemoteControl.Properties.Resources.resources create mode 100644 SERemoteControl/obj/Debug/SERemoteControl.csproj.CopyComplete create mode 100644 SERemoteControl/obj/Debug/SERemoteControl.csproj.FileListAbsolute.txt create mode 100644 SERemoteControl/obj/Debug/_IsIncrementalBuild create mode 100644 SERemoteControl/packages.config create mode 100644 UnitTestProject/Properties/AssemblyInfo.cs create mode 100644 UnitTestProject/UnitTest1.cs create mode 100644 UnitTestProject/UnitTestProject.csproj create mode 100644 UnitTestProject/obj/Debug/.NETFramework,Version=v4.8.AssemblyAttributes.cs create mode 100644 packages/log4net.3.0.3-preview.1/.signature.p7s create mode 100644 packages/log4net.3.0.3-preview.1/README.md create mode 100644 packages/log4net.3.0.3-preview.1/lib/net462/log4net.xml create mode 100644 packages/log4net.3.0.3-preview.1/lib/netstandard2.0/log4net.xml create mode 100644 packages/log4net.3.0.3-preview.1/log4net.3.0.3-preview.1.nupkg create mode 100644 packages/log4net.3.0.3-preview.1/package-icon.png diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..ec747fa --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +null \ No newline at end of file diff --git a/Externals/Rhino.Mocks.xml b/Externals/Rhino.Mocks.xml new file mode 100644 index 0000000..b1f7638 --- /dev/null +++ b/Externals/Rhino.Mocks.xml @@ -0,0 +1,5624 @@ + + + + Rhino.Mocks + + + + + Defines constraints and return values for arguments of a mock. + Only use Arg inside a method call on a mock that is recording. + Example: + ExpectCall( + mock.foo( + Arg<int>.Is.GreaterThan(2), + Arg<string>.Is.Anything + )); + Use Arg.Text for string specific constraints + Use Arg<ListClass>.List for list specific constraints + + + + + + Register the predicate as a constraint for the current call. + + The predicate. + default(T) + + Allow you to use code to create constraints + + demo.AssertWasCalled(x => x.Bar(Arg{string}.Matches(a => a.StartsWith("b") && a.Contains("ba")))); + + + + + + Define a complex constraint for this argument by passing several constraints + combined with operators. (Use Is in simple cases.) + Example: Arg<string>.Matches(Is.Equal("Hello") || Text.EndsWith("u")); + + Constraints using Is, Text and List + Dummy to satisfy the compiler + + + + Define a Ref argument. + + Constraints for this argument + value returned by the mock + + + + + Define a out parameter. Use it together with the keyword out and use the + Dummy field available by the return value. + Example: mock.foo( out Arg<string>.Out("hello").Dummy ); + + + + + + + Define a simple constraint for this argument. (Use Matches in simple cases.) + Example: + Arg<int>.Is.Anthing + Arg<string>.Is.Equal("hello") + + + + + Define Constraints on list arguments. + + + + + Use the Arg class (without generic) to define Text constraints + + + + + Evaluate an equal constraint for . + + The object the parameter should equal to + + + + Define constraints on text arguments. + + + + + Used to manage the static state of the Arg<T> class"/> + + + + + Resets the static state + + + + + Returns return values for the out and ref parameters + Note: the array returned has the size of the number of out and ref + argument definitions + + + + + + Returns the constraints for all arguments. + Out arguments have an Is.Anything constraint and are also in the list. + + + + + + What should BackToRecord clear + + + + + Retain all expectations and behaviors and return to mock + + + + + All expectations + + + + + Event subscribers for this instance + + + + + Methods that should be forwarded to the base class implementation + + + + + Properties that should behave like properties + + + + + Remove all the behavior of the object + + + + + Interface for constraints + + + + + Determines if the object pass the constraints + + + + + And operator for constraints + + + + + Not operator for constraints + + + + + Or operator for constraints + + + + + Allow overriding of || or && + + + + + + + Allow overriding of || or && + + + + + + + Gets the message for this constraint + + + + + + Constrain that the public field has a specified value + + + + + Constrain that the public field matches another constraint. + + + + + Creates a new instance. + + Name of the public field. + Constraint to place on the public field value. + + + + Creates a new instance, specifying a disambiguating + for the public field. + + The type that declares the public field, used to disambiguate between public fields. + Name of the public field. + Constraint to place on the public field value. + + + + Determines if the object passes the constraint. + + + + + Gets the message for this constraint + + + + + + Creates a new instance. + + Name of the public field. + Expected value. + + + + Creates a new instance, specifying a disambiguating + for the public field. + + The type that declares the public field, used to disambiguate between public fields. + Name of the public field. + Expected value. + + + + Constrain that the property has a specified value + + + + + Constrain that the property matches another constraint. + + + + + Creates a new instance. + + Name of the property. + Constraint to place on the property value. + + + + Creates a new instance, specifying a disambiguating + for the property. + + The type that declares the property, used to disambiguate between properties. + Name of the property. + Constraint to place on the property value. + + + + Determines if the object passes the constraint. + + + + + Gets the message for this constraint + + + + + + Creates a new instance. + + Name of the property. + Expected value. + + + + Creates a new instance, specifying a disambiguating + for the property. + + The type that declares the property, used to disambiguate between properties. + Name of the property. + Expected value. + + + + Constrain that the parameter must be of the specified type + + + + + Creates a new instance. + + Type. + + + + Determines if the object pass the constraints + + + + + Gets the message for this constraint + + + + + + Constraint that determines whether an object is the same object as another. + + + + + Creates a new instance. + + Obj. + + + + Determines if the object passes the constraints. + + + + + Gets the message for this constraint. + + + + + Evaluate a parameter using constraints + + + + + Create new instance + + + + + + Determines if the object pass the constraints + + + + + Gets the message for this constraint + + + + + + A constraint based on lambda expression, we are using Expression{T} + because we want to be able to get good error reporting on that. + + + + + Initializes a new instance of the class. + + The expr. + + + + Determines if the object pass the constraints + + + + + + + Gets the message for this constraint + + + + + + Constrain that the list contains the same items as the parameter list + + + + + Creates a new instance. + + In list. + + + + Determines if the object pass the constraints + + + + + Gets the message for this constraint + + + + + + Constrain that the parameter is one of the items in the list + + + + + Creates a new instance. + + In list. + + + + Determines if the object pass the constraints + + + + + Gets the message for this constraint + + + + + + Constrain that the object is inside the parameter list + + + + + Creates a new instance. + + In list. + + + + Determines if the object pass the constraints + + + + + Gets the message for this constraint + + + + + + Applies another AbstractConstraint to the collection count. + + + + + Creates a new instance. + + The constraint that should be applied to the collection count. + + + + Determines if the parameter conforms to this constraint. + + + + + Gets the message for this constraint. + + + + + Applies another AbstractConstraint to a specific list element. + + + + + Creates a new instance. + + The zero-based index of the list element. + The constraint that should be applied to the list element. + + + + Determines if the parameter conforms to this constraint. + + + + + Gets the message for this constraint + + + + + + Applies another AbstractConstraint to a specific generic keyed list element. + + + + + Creates a new instance. + + The key of the list element. + The constraint that should be applied to the list element. + + + + Determines if the parameter conforms to this constraint. + + + + + Gets the message for this constraint + + + + + + Constrains that all elements are in the parameter list + + + + + Initializes a new instance of the class. + + The these. + + + + Determines if the object pass the constraints + + + + + + + Gets the message for this constraint + + + + + + Combines two constraints, constraint pass if either is fine. + + + + + Creates a new instance. + + C1. + C2. + + + + Determines if the object pass the constraints + + + + + Gets the message for this constraint + + + + + + Negate a constraint + + + + + Creates a new instance. + + C1. + + + + Determines if the object pass the constraints + + + + + Gets the message for this constraint + + + + + + Combines two constraints + + + + + + Creates a new instance. + + C1. + C2. + + + + Determines if the object pass the constraints + + + + + Gets the message for this constraint + + + + + + Constrain the argument to validate according to regex pattern + + + + + Creates a new instance. + + Pattern. + + + + Determines if the object pass the constraints + + + + + Gets the message for this constraint + + + + + + Constraint that evaluate whatever an argument contains the specified string. + + + + + Creates a new instance. + + Inner string. + + + + Determines if the object pass the constraints + + + + + Gets the message for this constraint + + + + + + Constraint that evaluate whatever an argument ends with the specified string + + + + + Creates a new instance. + + End. + + + + Determines if the object pass the constraints + + + + + Gets the message for this constraint + + + + + + Constraint that evaluate whatever an argument start with the specified string + + + + + Creates a new instance. + + Start. + + + + Determines if the object pass the constraints + + + + + Gets the message for this constraint + + + + + + Constraint that evaluate whatever an object equals another + + + + + Creates a new instance. + + Obj. + + + + Determines if the object pass the constraints + + + + + Gets the message for this constraint + + + + + + Constraint that always returns true + + + + + Determines if the object pass the constraints + + + + + Gets the message for this constraint + + + + + + Constraint that evaluate whatever a comparable is greater than another + + + + + Creates a new instance. + + + + + Determines if the object pass the constraints + + + + + Gets the message for this constraint + + + + + + Initializes a new constraint object. + + The expected object, The actual object is passed in as a parameter to the method + + + + Evaluate this constraint. + + The actual object that was passed in the method call to the mock. + True when the constraint is met, else false. + + + + Checks if the properties of the object + are the same as the properies of the object. + + The expected object + The actual object + True when both objects have the same values, else False. + + + + + + + + + This is the real heart of the beast. + + + + Used by CheckReferenceType to check all properties of the reference type. + + The expected object + The actual object + True when both objects have the same values, else False. + + + + Used by CheckReferenceType to check all fields of the reference type. + + The expected object + The actual object + True when both objects have the same values, else False. + + + + Checks the items of both collections + + The expected collection + + True if both collections contain the same items in the same order. + + + + Builds a propertyname from the Stack _properties like 'Order.Product.Price' + to be used in the error message. + + A nested property name. + + + + Rhino.Mocks uses this property to generate an error message. + + + A message telling the tester why the constraint failed. + + + + + Provides access to the constraintes defined in the class to be used in context + with the syntax. + + The type of the argument + + + + Evaluate a greater than constraint for . + + The object the parameter should be greater than + + + + Evaluate a less than constraint for . + + The object the parameter should be less than + + + + Evaluate a less than or equal constraint for . + + The object the parameter should be less than or equal to + + + + Evaluate a greater than or equal constraint for . + + The object the parameter should be greater than or equal to + + + + Evaluate an equal constraint for . + + The object the parameter should equal to + + + + Converts the object type to a better match if this is a primitive type. + + The obj. + + + + + Converts the object type to match. + + + Because of implicit conversions and the way ArgConstraints this method is needed to check + object type and potentially change the object type for a better "match" so that obj1.Equals(obj2) + will return the proper "answer" + + The obj. + + + + + Evaluate a not equal constraint for . + + The object the parameter should not equal to + + + + Evaluate a same as constraint. + + The object the parameter should the same as. + + + + Evaluate a not same as constraint. + + The object the parameter should not be the same as. + + + + Throws NotSupportedException. Don't use Equals to define constraints. Use Equal instead. + + + + + + + Serves as a hash function for a particular type. + + + A hash code for the current . + + + + + A constraints that accept anything + + + + + + A constraint that accept only nulls + + + + + + A constraint that accept only non null values + + + + + + A constraint that accept only value of the specified type. + The check is performed on the type that has been defined + as the argument type. + + + + + Provides access to the constraints defined in the class to be used in context + with the syntax. + + + + + Determines whether the specified object is in the parameter. + The parameter must be IEnumerable. + + Obj. + + + + + Determines whatever the parameter is in the collection. + + + + + Determines that the parameter collection is identical to the specified collection + + + + + Determines that the parameter collection has the specified number of elements. + + The constraint that should be applied to the collection count. + + + + Determines that an element of the parameter collections conforms to another AbstractConstraint. + + The zero-based index of the list element. + The constraint which should be applied to the list element. + + + + Determines that all elements of the specified collection are in the the parameter collection + + The collection to compare against + The constraint which should be applied to the list parameter. + + + + Throws NotSupportedException. Don't use Equals to define constraints. Use Equal instead. + + + + + + + Serves as a hash function for a particular type. + + + A hash code for the current . + + + + + Provides a dummy field to pass as out or ref argument. + + + + + + Dummy field to satisfy the compiler. Used for out and ref arguments. + + + + + Central location for constraints for object's public fields + + + + + Constrains the parameter to have a public field with the specified value + + Name of the public field. + Expected value. + + + + + Constrains the parameter to have a public field with the specified value. + + The type that declares the public field, used to disambiguate between public fields. + Name of the public field. + Expected value. + + + + + Constrains the parameter to have a public field satisfying a specified constraint. + + Name of the public field. + Constraint for the public field. + + + + Constrains the parameter to have a public field satisfying a specified constraint. + + The type that declares the public field, used to disambiguate between public fields. + Name of the public field. + Constraint for the public field. + + + + Determines whether the parameter has the specified public field and that it is null. + + Name of the public field. + + + + + Determines whether the parameter has the specified public field and that it is null. + + The type that declares the public field, used to disambiguate between public fields. + Name of the public field. + + + + + Determines whether the parameter has the specified public field and that it is not null. + + Name of the public field. + + + + + Determines whether the parameter has the specified public field and that it is not null. + + The type that declares the public field, used to disambiguate between public fields. + Name of the public field. + + + + + Central location for constraints + + + + + Evaluate a greater than constraint for . + + The object the parameter should be greater than + + + + Evaluate a less than constraint for . + + The object the parameter should be less than + + + + Evaluate a less than or equal constraint for . + + The object the parameter should be less than or equal to + + + + Evaluate a greater than or equal constraint for . + + The object the parameter should be greater than or equal to + + + + Evaluate an equal constraint for . + + The object the parameter should equal to + + + + Evaluate a not equal constraint for . + + The object the parameter should not equal to + + + + Evaluate a same as constraint. + + The object the parameter should the same as. + + + + Evaluate a not same as constraint. + + The object the parameter should not be the same as. + + + + A constraints that accept anything + + + + + + A constraint that accept only nulls + + + + + + A constraint that accept only non null values + + + + + + A constraint that accept only value of the specified type + + + + + A constraint that accept only value of the specified type + + + + + Evaluate a parameter using a predicate + + The predicate to use + + + + Central location for constraints about lists and collections + + + + + Determines whether the specified obj is in the parameter. + The parameter must be IEnumerable. + + Obj. + + + + + Determines whatever the parameter is in the collection. + + + + + Determines that the parameter collection is identical to the specified collection + + + + + Determines that the parameter collection has the specified number of elements. + + The constraint that should be applied to the collection count. + + + + Determines that an element of the parameter collections conforms to another AbstractConstraint. + + The zero-based index of the list element. + The constraint which should be applied to the list element. + + + + Determines that an element of the parameter collections conforms to another AbstractConstraint. + + The key of the element. + The constraint which should be applied to the element. + + + + Determines that all elements of the specified collection are in the the parameter collection + + The collection to compare against + The constraint which should be applied to the list parameter. + + + + Central location for constraints for object's properties + + + + + Constrains the parameter to have property with the specified value + + Name of the property. + Expected value. + + + + + Constrains the parameter to have property with the specified value. + + The type that declares the property, used to disambiguate between properties. + Name of the property. + Expected value. + + + + + Constrains the parameter to have a property satisfying a specified constraint. + + Name of the property. + Constraint for the property. + + + + Constrains the parameter to have a property satisfying a specified constraint. + + The type that declares the property, used to disambiguate between properties. + Name of the property. + Constraint for the property. + + + + Determines whether the parameter has the specified property and that it is null. + + Name of the property. + + + + + Determines whether the parameter has the specified property and that it is null. + + The type that declares the property, used to disambiguate between properties. + Name of the property. + + + + + Determines whether the parameter has the specified property and that it is not null. + + Name of the property. + + + + + Determines whether the parameter has the specified property and that it is not null. + + The type that declares the property, used to disambiguate between properties. + Name of the property. + + + + + constraints the parameter to have the exact same property values as the expected object. + + An object, of the same type as the parameter, whose properties are set with the expected values. + An instance of the constraint that will do the actual check. + + The parameter's public property values and public field values will be matched against the expected object's + public property values and public field values. The first mismatch will be reported and no further matching is done. + The matching is recursive for any property or field that has properties or fields of it's own. + Collections are supported through IEnumerable, which means the constraint will check if the actual and expected + collection contain the same values in the same order, where the values contained by the collection can have properties + and fields of their own that will be checked as well because of the recursive nature of this constraint. + + + + + Central location for all text related constraints + + + + + Constrain the argument to starts with the specified string + + + + + Constrain the argument to end with the specified string + + + + + Constrain the argument to contain the specified string + + + + + Constrain the argument to validate according to regex pattern + + + + + Provides access to the constraintes defined in the class to be used in context + with the syntax. + + + + + Constrain the argument to starts with the specified string + + + + + + Constrain the argument to end with the specified string + + + + + Constrain the argument to contain the specified string + + + + + Constrain the argument to validate according to regex pattern + + + + + Throws NotSupportedException. Don't use Equals to define constraints. Use Equal instead. + + + + + + + Serves as a hash function for a particular type. + + + A hash code for the current . + + + + + This class defines a lot of method signatures, which we will use + to allow compatability on net-2.0 + + + + + dummy + + + + + dummy + + + + + dummy + + + + + dummy + + + + + dummy + + + + + dummy + + + + + dummy + + + + + dummy + + + + + dummy + + + + + dummy + + + + + dummy + + + + + dummy + + + dummy + + + + + dummy + + + + + dummy + + + + + dummy + + + + + dummy + + + + + dummy + + + + + dummy + + + + + dummy + + + + + dummy + + + + + dummy + + + + + Allows expectations to be set on methods that should never be called. + For methods with void return value, you need to use LastCall or + DoNotExpect.Call() with a delegate. + + + + + Sets LastCall.Repeat.Never() on /any/ proxy on /any/ repository on the current thread. + This method if not safe for multi threading scenarios. + + + + + Accepts a delegate that will execute inside the method which + LastCall.Repeat.Never() will be applied to. + It is expected to be used with anonymous delegates / lambda expressions and only one + method should be called. + + + IService mockSrv = mocks.CreateMock(typeof(IService)) as IService; + DoNotExpect.Call(delegate{ mockSrv.Stop(); }); + ... + + + + + An expectaton violation was detected. + + + + + Creates a new instance. + + Message. + + + + Serialization constructor + + + + + Signals that an object was call on a mock repository which doesn't + belong to this mock repository or not a mock + + + + + Creates a new instance. + + Message. + + + + Serialization constructor + + + + + Allows to set expectation on methods that has return values. + For methods with void return value, you need to use LastCall + + + + + The method options for the last call on /any/ proxy on /any/ repository on the current thread. + This method if not safe for multi threading scenarios, use . + + + + + Accepts a delegate that will execute inside the method, and then return the resulting + instance. + It is expected to be used with anonymous delegates / lambda expressions and only one + method should be called. + + + IService mockSrv = mocks.CreateMock(typeof(IService)) as IService; + Expect.Call(delegate{ mockSrv.Start(); }).Throw(new NetworkException()); + ... + + + + + Get the method options for the last method call on the mockInstance. + + + + + A delegate that can be used to get better syntax on Expect.Call(delegate { foo.DoSomething(); }); + + + + + Abstract class that holds common information for + expectations. + + + + + Interface to validate that a method call is correct. + + + + + Validate the arguments for the method. + This method can be called numerous times, so be careful about side effects + + The arguments with which the method was called + + + + Add an actual method call to this expectation + + + + + Returns the return value or throw the exception and setup any output / ref parameters + that has been set. + + + + + Builds the verification failure message. + + + + + + Gets the error message. + + + + + + Range of expected calls + + + + + Number of call actually made for this method + + + + + If this expectation is still waiting for calls. + + + + + The return value for a method matching this expectation + + + + + Gets or sets the exception to throw on a method matching this expectation. + + + + + Gets a value indicating whether this instance's action is staisfied. + A staisfied instance means that there are no more requirements from + this method. A method with non void return value must register either + a return value or an exception to throw. + + + + + Gets the method this expectation is for. + + + + + Gets or sets what special condtions there are for this method + repeating. + + + + + Gets a value indicating whether this expectation was satisfied + + + + + Specify whatever this expectation has a return value set + You can't check ReturnValue for this because a valid return value include null. + + + + + An action to execute when the method is matched. + + + + + Set the out / ref parameters for the method call. + The indexing is zero based and ignores any non out/ref parameter. + It is possible not to pass all the parameters. This method can be called only once. + + + + + Documentation Message + + + + + Gets the invocation for this expectation + + The invocation. + + + + Occurs when the exceptation is match on a method call + + + + + Allow to set the return value in the future, if it was already set. + + + + + Number of actuall calls made that passed this expectation + + + + + Range of expected calls that should pass this expectation. + + + + + The return value for a method matching this expectation + + + + + The exception to throw on a method matching this expectation. + + + + + The method this expectation is for. + + + + + The return value for this method was set + + + + + Whether this method will repeat + unlimited number of times. + + + + + A delegate that will be run when the + expectation is matched. + + + + + The arguments that matched this expectation. + + + + + Documentation message + + + + + The method originalInvocation + + + + + Get the hash code + + + + + Add an actual actualMethodCall call to this expectation + + + + + Builds the verification failure message. + + + + + + Returns the return value or throw the exception and setup output / ref parameters + + + + + Validate the arguments for the method on the child methods + + The arguments with which the method was called + + + + Creates a new instance. + + The originalInvocation for this method, required because it contains the generic type infromation + Number of method calls for this expectations + + + + Creates a new instance. + + Expectation. + + + + Validate the arguments for the method on the child methods + + The arguments with which the method was called + + + + Determines if this object equal to obj + + + + + The error message for these arguments + + + + + Asserts that the delegate has the same parameters as the expectation's method call + + + + + Setter for the outpur / ref parameters for this expecataion. + Can only be set once. + + + + + Specify whether this expectation has a return value set + You can't check ReturnValue for this because a valid return value include null. + + + + + Gets the method this expectation is for. + + + + + Gets the originalInvocation for this expectation + + The originalInvocation. + + + + Gets or sets what special condtions there are for this method + + + + + Range of expected calls + + + + + Number of call actually made for this method + + + + + If this expectation is still waiting for calls. + + + + + Gets a value indicating whether this expectation was satisfied + + + + + The return value for a method matching this expectation + + + + + An action to execute when the method is matched. + + + + + Gets or sets the exception to throw on a method matching this expectation. + + + + + Gets a value indicating whether this instance's action is staisfied. + A staisfied instance means that there are no more requirements from + this method. A method with non void return value must register either + a return value or an exception to throw or an action to execute. + + + + + Documentation message + + + + + Occurs when the exceptation is match on a method call + + + + + Allow to set the return value in the future, if it was already set. + + + + + Gets the error message. + + + + + + Expectation that matches any arguments for the method. + + + + + Creates a new instance. + + Invocation for this expectation + Number of method calls for this expectations + + + + Creates a new instance. + + Expectation. + + + + Validate the arguments for the method. + + The arguments with which the method was called + + + + Determines if the object equal to expectation + + + + + Get the hash code + + + + + Gets the error message. + + + + + + Summary description for ArgsEqualExpectation. + + + + + Creates a new instance. + + Expected args. + The invocation for this expectation + Number of method calls for this expectations + + + + Validate the arguments for the method. + + The arguments with which the method was called + + + + Determines if the object equal to expectation + + + + + Get the hash code + + + + + Gets the error message. + + + + + + Get the expected args. + + + + + Call a specified callback to verify the expectation + + + + + Creates a new instance. + + Expectation. + Callback. + + + + Creates a new instance. + + Invocation for this expectation + Callback. + Number of method calls for this expectations + + + + Validate the arguments for the method on the child methods + + The arguments with which the method was called + + + + Determines if the object equal to expectation + + + + + Get the hash code + + + + + Gets the error message. + + + + + + Expect the method's arguments to match the contraints + + + + + Creates a new instance. + + Invocation for this expectation + Constraints. + Number of method calls for this expectations + + + + Creates a new instance. + + Expectation. + Constraints. + + + + Validate the arguments for the method. + + The arguments with which the method was called + + + + Determines if the object equal to expectation + + + + + Get the hash code + + + + + Gets the error message. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Summary for AndSpecification + + + + + + + + + + + + + + + + + + + + + + Summary description for FollowsEventNamingStandard + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Summary descritpion for NamedEventExistsOnDeclaringType + + + + + + + + + Doesn't log anything, just makes happy noises + + + + + Log expectations - allows to see what is going on inside Rhino Mocks + + + + + Logs the expectation as is was recorded + + The invocation. + The expectation. + + + + Logs the expectation as it was recorded + + The invocation. + The expectation. + + + + Logs the unexpected method call. + + The invocation. + The message. + + + + Logs the expectation as is was recorded + + The invocation. + The expectation. + + + + Logs the expectation as it was recorded + + The invocation. + The expectation. + + + + Logs the unexpected method call. + + The invocation. + The message. + + + + Operation on a remoting proxy + + + It is not possible to directly communicate to a real proxy via transparent proxy. + Transparent proxy impersonates a user type and only methods of that user type are callable. + The only methods that are guaranteed to exist on any transparent proxy are methods defined + in Object: namely ToString(), GetHashCode(), and Equals()). + + These three methods are the only way to tell the real proxy to do something. + Equals() is the most suitable of all, since it accepts an arbitrary object parameter. + The RemotingProxy code is built so that if it is compared to an IRemotingProxyOperation, + transparentProxy.Equals(operation) will call operation.Process(realProxy). + This way we can retrieve a real proxy from transparent proxy and perform + arbitrary operation on it. + + + + + Generates remoting proxies and provides utility functions + + + + + Create the proxy using remoting + + + + + Check whether an object is a transparent proxy with a RemotingProxy behind it + + Object to check + true if the object is a transparent proxy with a RemotingProxy instance behind it, false otherwise + We use Equals() method to communicate with the real proxy behind the object. + See IRemotingProxyOperation for more details + + + + Retrieve a mocked object from a transparent proxy + + Transparent proxy with a RemotingProxy instance behind it + Mocked object associated with the proxy + We use Equals() method to communicate with the real proxy behind the object. + See IRemotingProxyOperation for more details + + + + Implementation of IInvocation based on remoting proxy + + Some methods are marked NotSupported since they either don't make sense + for remoting proxies, or they are never called by Rhino Mocks + + + + Rudimetry implementation that simply logs methods calls as text. + + + + + Initializes a new instance of the class. + + The writer. + + + + Logs the expectation as it was recorded + + The invocation. + The expectation. + + + + Logs the expectation as it was recorded + + The invocation. + The expectation. + + + + Logs the unexpected method call. + + The invocation. + The message. + + + + Behave like a stub, all properties and events acts normally, methods calls + return default values by default (but can use expectations to set them up), etc. + + + + + Records all the expectations for a mock + + + + + Different actions on this mock + + + + + Add a method call for this state' mock. + + The invocation for this method + The method that was called + The arguments this method was called with + + + + Verify that this mock expectations have passed. + + + + + Verify that we can move to replay state and move + to the reply state. + + + + + Gets a mock state that match the original mock state of the object. + + + + + Get the options for the last method call + + + + + Set the exception to throw when Verify is called. + This is used to report exception that may have happened but where caught in the code. + This way, they are reported anyway when Verify() is called. + + + + + This method is called to indicate that a property behavior call. + This is done so we generate good error message in the common case of people using + Stubbed properties with Return(). + + + + + Gets the matching verify state for this state + + + + + Get the options for the last method call + + + + + Get the options for the last method call + + + + + Set the exception to throw when Verify is called. + This is used to report exception that may have happened but where caught in the code. + This way, they are reported anyway when Verify() is called. + + + + + This method is called to indicate that a property behavior call. + This is done so we generate good error message in the common case of people using + Stubbed properties with Return(). + + + + + Creates a new instance. + + Repository. + The proxy that generates the method calls + + + + Add a method call for this state' mock. + + The invocation for this method + The method that was called + The arguments this method was called with + + + + Verify that we can move to replay state and move + to the reply state. + + + + + Verify that we can move to replay state and move + to the reply state. + + + + + Verify that this mock expectations have passed. + + + + + Gets a mock state that match the original mock state of the object. + + + + + Asserts the previous method is closed (had an expectation set on it so we can replay it correctly) + + + + + Get the default call count range expectation + + + + + + Gets the last expectation. + + + + + Gets the total method calls count. + + + + + Get the options for the last method call + + + + + Gets the matching verify state for this state + + + + + Initializes a new instance of the class. + + The proxy that generates the method calls + Repository. + + + + We don't care much about expectations here, so we will remove the expectation if + it is not closed. + + + + + Verify that we can move to replay state and move + to the reply state. + + + + + + Get the default call count range expectation + + + + + + Validate expectations on recorded methods, but in general completely ignoring them. + Similar to except that it would return a + when BackToRecord is called. + + + + + Validate all expectations on a mock + + + + + The repository for this state + + + + + The proxy object for this state + + + + + Get the options for the last method call + + + + + Creates a new instance. + + The previous state for this method + + + + Add a method call for this state' mock. + + The invocation for this method + The method that was called + The arguments this method was called with + + + + Add a method call for this state' mock. + This allows derived method to cleanly get a the setupresult behavior while adding + their own. + + The invocation for this method + The method that was called + The arguments this method was called with + + + + Set the exception to throw when Verify is called. + This is used to report exception that may have happened but where caught in the code. + This way, they are reported anyway when Verify() is called. + + + + + not relevant + + + + + Verify that this mock expectations have passed. + + + + + Verify that we can move to replay state and move + to the reply state. + + + + + Gets a mock state that match the original mock state of the object. + + + + + Get the options for the last method call + + + + + Gets the matching verify state for this state + + + + + Initializes a new instance of the class. + + The previous state for this method + + + + Add a method call for this state' mock. + + The invocation for this method + The method that was called + The arguments this method was called with + + + + Gets a mock state that matches the original mock state of the object. + + + + + Write rhino mocks log info to the trace + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + if set to true [log recorded]. + if set to true [log replayed]. + if set to true [log unexpected]. + + + + Logs the expectation as is was recorded + + The invocation. + The expectation. + + + + Logs the expectation as it was recorded + + The invocation. + The expectation. + + + + Logs the unexpected method call. + + The invocation. + The message. + + + + Writes log information as stack traces about rhino mocks activity + + + + + Allows to redirect output to a different location. + + + + + Logs the expectation as is was recorded + + The invocation. + The expectation. + + + + Logs the expectation as it was recorded + + The invocation. + The expectation. + + + + Logs the unexpected method call. + + The invocation. + The message. + + + + Marker interface used to indicate that this is a partial mock. + + + + + Options for CallOriginalMethod + + + + + No expectation is created, the method will be called directly + + + + + Normal expectation is created, but when the method is later called, it will also call the original method + + + + + This is a data structure that is used by + to pass + the current method to the relevant delegate + + + + + Initializes a new instance of the class. + + The invocation. + + + + Gets the args for this method invocation + + + + + Get the method that was caused this invocation + + + + + Gets or sets the return value for this method invocation + + The return value. + + + + Adds optional new usage: + using(mockRepository.Record()) { + Expect.Call(mock.Method()).Return(retVal); + } + using(mockRepository.Playback()) { + // Execute code + } + N.B. mockRepository.ReplayAll() and mockRepository.VerifyAll() + calls are taken care of by Record/Playback + + + Creates proxied instances of types. + + + + Generates a stub without needing a + Arguments for 's constructor + The of stub to create. + The stub + + + + Generates a stub without needing a + The of stub. + Arguments for the 's constructor. + The stub + + + + Generate a mock object without needing a + type of mock object to create. + Arguments for 's constructor + the mock object + + + + Generate a multi-mock object without needing a + The typeof object to generate a mock for. + A second interface to generate a multi-mock for. + Arguments for 's constructor + the multi-mock object + + + + Generate a multi-mock object without without needing a + The typeof object to generate a mock for. + An interface to generate a multi-mock for. + A second interface to generate a multi-mock for. + Arguments for 's constructor + the multi-mock object + + + + Creates a multi-mock without without needing a + The type of mock to create, this can be a class + Any extra interfaces to add to the multi-mock, these can only be interfaces. + Arguments for 's constructor + the multi-mock object + + + + Creates a strict mock without without needing a + Any arguments required for the 's constructor + The type of mock object to create. + The mock object with strict replay semantics + + + + Creates a strict multi-mock without needing a + Any arguments required for the 's constructor + The type of mock object to create, this can be a class. + An interface to generate a multi-mock for, this must be an interface! + The multi-mock object with strict replay semantics + + + + Creates a strict multi-mock without needing a + Any arguments required for the 's constructor + The type of mock object to create, this can be a class. + An interface to generate a multi-mock for, this must be an interface! + A second interface to generate a multi-mock for, this must be an interface! + The multi-mock object with strict replay semantics + + + + Creates a strict multi-mock without needing a + The type of mock object to create, this can be a class + Any extra interfaces to generate a multi-mock for, these must be interaces! + Any arguments for the 's constructor + The strict multi-mock object + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Generate a mock object with dynamic replay semantics and remoting without needing the mock repository + + + + + Generate a mock object with strict replay semantics and remoting without needing the mock repository + + + + Helper method to create a mock object without a repository instance and put the object back into replay mode. + The type of mock object to create + A delegate that uses a mock repository instance to create the underlying mock + The mock object in the replay mode. + + + + + + + + + + + + + + This is a map of types to ProxyGenerators. + + + + + This is used to record the last repository that has a method called on it. + + + + + this is used to get to the last proxy on this repository. + + + + + For mock delegates, maps the proxy instance from intercepted invocations + back to the delegate that was originally returned to client code, if any. + + + + + All the proxies in the mock repositories + + + + + This is here because we can't put it in any of the recorders, since repeatable methods + have no orderring, and if we try to handle them using the usual manner, we would get into + wierd situations where repeatable method that was defined in an orderring block doesn't + exists until we enter this block. + + + + + Creates a new instance. + + + + + Move the repository to ordered mode + + + + + Move the repository to un-ordered mode + + + + + Creates a mock for the specified type. + + Type. + Arguments for the class' constructor, if mocking a concrete class + + + + Creates a strict mock for the specified type. + + Type. + Arguments for the class' constructor, if mocking a concrete class + + + + Creates a remoting mock for the specified type. + + Type. + Arguments for the class' constructor, if mocking a concrete class + + + + Creates a strict remoting mock for the specified type. + + Type. + Arguments for the class' constructor, if mocking a concrete class + + + + Creates a remoting mock for the specified type. + + + Arguments for the class' constructor, if mocking a concrete class + + + + + Creates a strict remoting mock for the specified type. + + + Arguments for the class' constructor, if mocking a concrete class + + + + + Creates a mock from several types, with strict semantics. + Only may be a class. + + + + + Creates a strict mock from several types, with strict semantics. + Only may be a class. + + + + + Creates a mock from several types, with strict semantics. + Only may be a class. + + The main type to mock. + Extra interface types to mock. + Arguments for the class' constructor, if mocking a concrete class. + + + + Creates a strict mock from several types, with strict semantics. + Only may be a class. + + The main type to mock. + Extra interface types to mock. + Arguments for the class' constructor, if mocking a concrete class. + + + + Creates a mock from several types, with dynamic semantics. + Only may be a class. + + The main type to mock. + Extra interface types to mock. + + + + Creates a mock from several types, with dynamic semantics. + Only may be a class. + + The main type to mock. + Extra interface types to mock. + Arguments for the class' constructor, if mocking a concrete class. + + + Creates a dynamic mock for the specified type. + Type. + Arguments for the class' constructor, if mocking a concrete class + + + Creates a dynamic mock for the specified type. + Type. + Arguments for the class' constructor, if mocking a concrete class + + + Creates a dynamic mock for the specified type. + + Arguments for the class' constructor, if mocking a concrete class + + + + Creates a mock object that defaults to calling the class methods if no expectation is set on the method. + Type. + Arguments for the class' constructor. + + + Creates a mock object that defaults to calling the class methods. + Type. + Extra interface types to mock. + + + Creates a mock object that defaults to calling the class methods. + Type. + Extra interface types to mock. + Arguments for the class' constructor. + + + Creates a mock object using remoting proxies + Type to mock - must be MarshalByRefObject + Mock object + Proxy mock can mock non-virtual methods, but not static methods + Creates the mock state for this proxy + + + + Cause the mock state to change to replay, any further call is compared to the + ones that were called in the record state. + + This method *cannot* be called from inside an ordering. + the object to move to replay state + + + + Cause the mock state to change to replay, any further call is compared to the + ones that were called in the record state. + + the object to move to replay state + + + + Move the mocked object back to record state.You can (and it's recommended) to run {Verify()} before you use this method. + Will delete all current expectations! + + + + Move the mocked object back to record state. + Optionally, can delete all current expectations, but allows more granularity about how + it would behave with regard to the object state. + + + + + Verify that all the expectations for this object were fulfilled. + + the object to verify the expectations for + + + + Get the method options for the last call on + mockedInstance. + + The mock object + Method options for the last call + + + + Maps an invocation proxy back to the mock object instance that was originally + returned to client code which might have been a delegate to this proxy. + + The mock object proxy from the intercepted invocation + The mock object + + + This is provided to allow advance extention functionality, where Rhino Mocks standard functionality is not enough. + The type to mock + Delegate that create the first state of the mocked object (usualy the record state). + Additional types to be implemented, this can be only interfaces + optional arguments for the constructor + + + + + Method: GetMockedObject + Get an IProxy from a mocked object instance, or throws if the + object is not a mock object. + + + + + Method: GetMockedObjectOrNull + Get an IProxy from a mocked object instance, or null if the + object is not a mock object. + + + + Pops the recorder. + + + Pushes the recorder. + New recorder. + + + + All the mock objects in this repository will be moved + to record state. + + + + + All the mock objects in this repository will be moved + to record state. + + + + + Replay all the mocks from this repository + + + + + Verify all the mocks from this repository + + + + + Gets the proxy generator for a specific type. Having a single ProxyGenerator + with multiple types linearly degrades the performance so this implementation + keeps one ProxyGenerator per type. + + + + Set the exception to be thrown when verified is called. + + + + Creates a mock for the spesified type with strict mocking semantics. + Strict semantics means that any call that wasn't explicitly recorded is considered an error and would cause an exception to be thrown. + + Arguments for the class' constructor, if mocking a concrete class + + + + Creates a mock for the spesified type with strict mocking semantics. + Strict semantics means that any call that wasn't explicitly recorded is considered an error and would cause an exception to be thrown. + + Arguments for the class' constructor, if mocking a concrete class + + + + Creates a dynamic mock for the specified type. + + Arguments for the class' constructor, if mocking a concrete class + + + + Creates a mock object from several types. + + + + + Creates a strict mock object from several types. + + + + + Create a mock object from several types with dynamic semantics. + + + + + Create a mock object from several types with partial semantics. + + + + + Create a mock object from several types with strict semantics. + + Extra interface types to mock. + Arguments for the class' constructor, if mocking a concrete class + + + + Create a strict mock object from several types with strict semantics. + + Extra interface types to mock. + Arguments for the class' constructor, if mocking a concrete class + + + + Create a mock object from several types with dynamic semantics. + + Extra interface types to mock. + Arguments for the class' constructor, if mocking a concrete class + + + + Create a mock object from several types with partial semantics. + + Extra interface types to mock. + Arguments for the class' constructor, if mocking a concrete class + + + + Create a mock object with from a class that defaults to calling the class methods + + Arguments for the class' constructor, if mocking a concrete class + + + + Create a stub object, one that has properties and events ready for use, and + can have methods called on it. It requires an explicit step in order to create + an expectation for a stub. + + The arguments for constructor. + + + + Create a stub object, one that has properties and events ready for use, and + can have methods called on it. It requires an explicit step in order to create + an expectation for a stub. + + The type. + The arguments for constructor. + The stub + + + + Returns true if the passed mock is currently in replay mode. + + The mock to test. + True if the mock is in replay mode, false otherwise. + + + + Determines whether the specified proxy is a stub. + + The proxy. + + + + Register a call on a prperty behavior + + + + + + Gets the recorder. + + + + + + Gets the replayer for this repository. + + + + + + Gets the last proxy which had a method call. + + + + + Delegate: CreateMockState + This is used internally to cleanly handle the creation of different + RecordMockStates. + + + + + A set of extension methods that adds Arrange Act Assert mode to Rhino Mocks + + + + + Create an expectation on this mock for this action to occur + + + The mock. + The action. + + + + + Reset all expectations on this mock object + + + The mock. + + + + Reset the selected expectation on this mock object + + + The mock. + The options to reset the expectations on this mock. + + + + Cause the mock state to change to replay, any further call is compared to the + ones that were called in the record state. + + the mocked object to move to replay state + + + + Gets the mock repository for this specificied mock object + + + The mock. + + + + + Create an expectation on this mock for this action to occur + + + + The mock. + The action. + + + + + Tell the mock object to perform a certain action when a matching + method is called. + Does not create an expectation for this method. + + + The mock. + The action. + + + + + Tell the mock object to perform a certain action when a matching + method is called. + Does not create an expectation for this method. + + + + The mock. + The action. + + + + + Gets the arguments for calls made on this mock object and the method that was called + in the action. + + + The mock. + The action. + + + Here we will get all the arguments for all the calls made to DoSomething(int) + + var argsForCalls = foo54.GetArgumentsForCallsMadeOn(x => x.DoSomething(0)) + + + + + + Gets the arguments for calls made on this mock object and the method that was called + in the action and matches the given constraints + + + The mock. + The action. + The setup constraints. + + + Here we will get all the arguments for all the calls made to DoSomething(int) + + var argsForCalls = foo54.GetArgumentsForCallsMadeOn(x => x.DoSomething(0)) + + + + + + Asserts that a particular method was called on this mock object + + + The mock. + The action. + + + + Asserts that a particular method was called on this mock object that match + a particular constraint set. + + + The mock. + The action. + The setup constraints. + + + + Asserts that a particular method was called on this mock object that match + a particular constraint set. + + + The mock. + The action. + + + + Asserts that a particular method was called on this mock object that match + a particular constraint set. + + + The mock. + The action. + The setup constraints. + + + + Asserts that a particular method was NOT called on this mock object + + + The mock. + The action. + + + + Asserts that a particular method was NOT called on this mock object that match + a particular constraint set. + + + The mock. + The action. + The setup constraints. + + + + Asserts that a particular method was NOT called on this mock object + + + The mock. + The action. + + + + Asserts that a particular method was NOT called on this mock object + + + The mock. + The action. + The setup constraints. + + + + Finds the approprite implementation type of this item. + This is the class or an interface outside of the rhino mocks. + + The mocked obj. + + + + + Verifies all expectations on this mock object + + The mock object. + + + + Gets the event raiser for the event that was called in the action passed + + The type of the event source. + The mock object. + The event subscription. + + + + + Raise the specified event using the passed arguments. + The even is extracted from the passed labmda + + The type of the event source. + The mock object. + The event subscription. + The sender. + The instance containing the event data. + + + + Raise the specified event using the passed arguments. + The even is extracted from the passed labmda + + The type of the event source. + The mock object. + The event subscription. + The args. + + + TODO: Make this better! It currently breaks down when mocking classes or + ABC's that call other virtual methods which are getting intercepted too. I wish + we could just walk Expression{Action{Action{T}} to assert only a single + method is being made. + + The workaround is to not call foo.AssertWasCalled .. rather foo.VerifyAllExpectations() + The type of mock object + The mock repository + The actual mock object to assert expectations on. + + + + Fake type that disallow creating it. + Should have been System.Type, but we can't use it. + + + + + Utility class for dealing with messing generics scenarios. + + + + + There are issues with trying to get this to work correctly with open generic types, since this is an edge case, + I am letting the runtime handle it. + + + + + Gets the real type, including de-constructing and constructing the type of generic + methods parameters. + + The type. + The invocation. + + + + + Because we need to support complex types here (simple generics were handled above) we + need to be aware of the following scenarios: + List[T] and List[Foo[T]] + + + + + ExpectationsList + + + + + Dictionary + + + + + Dictionary class + + + + + Create a new instance of ProxyStateDictionary + + + + + Allows to call a method and immediately get it's options. + + + + + Interface to allow calling a method and immediately get it's options. + + + + + Get the method options for the call + + The method call should go here, the return value is ignored + + + + Creates a new instance. + + + + + Get the method options for the call + + The method call should go here, the return value is ignored + + + + Allows to call a method and immediately get it's options. + Set the expected number for the call to Any() + + + + + Creates a new instance. + + Proxy. + Mocked instance. + + + + Get the method options for the call + + The method call should go here, the return value is ignored + + + + This class is reponsible for taking a delegate and creating a wrapper + interface around it, so it can be mocked. + + + + + The scope for all the delegate interfaces create by this mock repository. + + + + + Gets a type with an "Invoke" method suitable for use as a target of the + specified delegate type. + + + + + + + Raise events for all subscribers for an event + + + + + Raise events for all subscribers for an event + + + + + Raise the event + + + + + The most common form for the event handler signature + + + + + Create an event raiser for the specified event on this instance. + + + + + Creates a new instance of EventRaiser + + + + + Raise the event + + + + + The most common signature for events + Here to allow intellisense to make better guesses about how + it should suggest parameters. + + + + + Allows to define what would happen when a method + is called. + + + + + Allows to define what would happen when a method + is called. + + + + + Set the return value for the method. + + The object the method will return + IRepeat that defines how many times the method will return this value + + + + Allow to override this return value in the future + + IRepeat that defines how many times the method will return this value + + + + Throws the specified exception when the method is called. + + Exception to throw + + + + Ignores the arguments for this method. Any argument will be matched + againt this method. + + + + + Add constraints for the method's arguments. + + + + + Set a callback method for the last call + + + + + Set a delegate to be called when the expectation is matched. + The delegate return value will be returned from the expectation. + + + + + Set a delegate to be called when the expectation is matched. + The delegate return value will be returned from the expectation. + + + + + Set a delegate to be called when the expectation is matched. + The delegate return value will be returned from the expectation. + + + + + Set a delegate to be called when the expectation is matched. + The delegate return value will be returned from the expectation. + + + + + Set a delegate to be called when the expectation is matched. + The delegate return value will be returned from the expectation. + + + + + Set a delegate to be called when the expectation is matched. + The delegate return value will be returned from the expectation. + + + + + Set a delegate to be called when the expectation is matched. + The delegate return value will be returned from the expectation. + + + + + Set a delegate to be called when the expectation is matched. + The delegate return value will be returned from the expectation. + + + + + Set a delegate to be called when the expectation is matched. + The delegate return value will be returned from the expectation. + + + + + Set a delegate to be called when the expectation is matched. + The delegate return value will be returned from the expectation. + + + + + Set a delegate to be called when the expectation is matched. + The delegate return value will be returned from the expectation. + + + + + Set a delegate to be called when the expectation is matched. + The delegate return value will be returned from the expectation. + + + + + Set a delegate to be called when the expectation is matched + and allow to optionally modify the invocation as needed + + + + + Call the original method on the class, bypassing the mocking layers. + + + + + + Call the original method on the class, optionally bypassing the mocking layers. + + + + + + Use the property as a simple property, getting/setting the values without + causing mock expectations. + + + + + Expect last (property) call as property setting, ignore the argument given + + + + + + Expect last (property) call as property setting with a given argument. + + + + + + + Get an event raiser for the last subscribed event. + + + + + Set the parameter values for out and ref parameters. + This is done using zero based indexing, and _ignoring_ any non out/ref parameter. + + + + + Documentation message for the expectation + + Message + + + + Better syntax to define repeats. + + + + + Allows to specify the number of time for method calls + + + + + Repeat the method twice. + + + + + Repeat the method once. + + + + + Repeat the method at least once, then repeat as many time as it would like. + + + + + Repeat the method any number of times. + This has special affects in that this method would now ignore orderring. + + + + + Set the range to repeat an action. + + Min. + Max. + + + + Set the amount of times to repeat an action. + + + + + This method must not appear in the replay state. + This has special affects in that this method would now ignore orderring. + + + + + Creates a new instance. + + the repository for this expectation + the recorder for this proxy + the proxy for this expectation + Expectation. + + + + Add constraints for the method's arguments. + + + + + Set a callback method for the last call + + + + + Set a callback method for the last call + + + + + Set a callback method for the last call + + + + + Set a callback method for the last call + + + + + Set a callback method for the last call + + + + + Set a callback method for the last call + + + + + Set a callback method for the last call + + + + + Set a callback method for the last call + + + + + Set a callback method for the last call + + + + + Set a callback method for the last call + + + + + Set a callback method for the last call + + + + + Set a callback method for the last call + + + + + Set a delegate to be called when the expectation is matched. + The delegate return value will be returned from the expectation. + + + + + Set a delegate to be called when the expectation is matched. + The delegate return value will be returned from the expectation. + + + + + Set the return value for the method. + + The object the method will return + IRepeat that defines how many times the method will return this value + + + + Set the return value for the method, but allow to override this return value in the future + + IRepeat that defines how many times the method will return this value + + + + Throws the specified exception when the method is called. + + Exception to throw + + + + Ignores the arguments for this method. Any argument will be matched + againt this method. + + + + + Call the original method on the class, bypassing the mocking layers. + + + + + + Call the original method on the class, optionally bypassing the mocking layers + + + + + + Use the property as a simple property, getting/setting the values without + causing mock expectations. + + + + + Expect last (property) call as property setting, ignore the argument given + + + + + + Expect last (property) call as property setting with a given argument. + + + + + + + Gets the event raiser for the last event + + + + + Set the parameter values for out and ref parameters. + This is done using zero based indexing, and _ignoring_ any non out/ref parameter. + + + + + Repeat the method twice. + + + + + Repeat the method once. + + + + + Repeat the method at least once, then repeat as many time as it would like. + + + + + This method must not appear in the replay state. + + + + + Documentation message for the expectation + + Message + + + + Repeat the method any number of times. + + + + + Set the range to repeat an action. + + Min. + Max. + + + + Set the amount of times to repeat an action. + + + + + Better syntax to define repeats. + + + + + This class will provide hash code for hashtables without needing + to call the GetHashCode() on the object, which may very well be mocked. + This class has no state so it is a singelton to avoid creating a lot of objects + that does the exact same thing. See flyweight patterns. + + + + + Get the hash code for a proxy object without calling GetHashCode() + on the object. + + + + + Compares two instances of mocked objects + + + + + Compare two mocked objects + + + + + The next hash code value for a mock object. + This is safe for multi threading. + + + + + The sole instance of + + + + + This is a dummy type that is used merely to give DynamicProxy the proxy instance that + it needs to create IProxy's types. + + + + + Interface to find the repository of a mocked object + + + + + Return true if it should call the original method on the object + instead of pass it to the message chain. + + The method to call + + + + Register a method to be called on the object directly + + + + + Register a property on the object that will behave as a simple property + + + + + Check if the method was registered as a property method. + + + + + Do get/set on the property, according to need. + + + + + Do add/remove on the event + + + + + Get the subscribers of a spesific event + + + + + Gets the declaring type of the method, taking into acccount the possible generic + parameters that it was created with. + + + + + Clears the state of the object, remove original calls, property behavior, subscribed events, etc. + + + + + Get all the method calls arguments that were made against this object with the specificed + method. + + + Only method calls in replay mode are counted + + + + + Records the method call + + + + + Mocks that are tied to this mock lifestyle + + + + + The unique hash code of this mock, which is not related + to the value of the GetHashCode() call on the object. + + + + + Gets the repository. + + + + + Gets the implemented types by this mocked object + + The implemented. + + + + Gets or sets the constructor arguments. + + The constructor arguments. + + + + The mocked instance that this is representing + + + + + Create a new instance of + + + + + Return true if it should call the original method on the object + instead of pass it to the message chain. + + The method to call + + + + Register a method to be called on the object directly + + + + + Register a property on the object that will behave as a simple property + Return true if there is already a value for the property + + + + + Check if the method was registered as a property method. + + + + + Do get/set on the property, according to need. + + + + + Do add/remove on the event + + + + + Get the subscribers of a spesific event + + + + + Gets the declaring type of the method, taking into acccount the possible generic + parameters that it was created with. + + + + + Get all the method calls arguments that were made against this object with the specificed + method. + + + + + Only method calls in replay mode are counted + + + + + Records the method call + + + + + + + Clears the state of the object, remove original calls, property behavior, subscribed events, etc. + + + + + Mocks that are tied to this mock lifestyle + + + + + The unique hash code of this proxy, which is not related + to the value of the GetHashCode() call on the object. + + + + + Gets the repository. + + + + + Gets or sets the constructor arguments. + + The constructor arguments. + + + + The mocked instance that this is representing + + + + + Gets the implemented types by this mocked object + + The implemented. + + + + Range for expected method calls + + + + + Creates a new instance. + + Min. + Max. + + + + Return the string representation of this range. + + + + + Gets or sets the min. + + + + + + Gets or sets the max. + + + + + + Records all the expectations for a mock and + return a ReplayDynamicMockState when Replay() + is called. + + + + + Creates a new instance. + + Repository. + The proxy that generates the method calls + + + + Verify that we can move to replay state and move + to the reply state. + + + + + Get the default call count range expectation + + + + + + Gets a mock state that match the original mock state of the object. + + + + + Records all the expectations for a mock and + return a ReplayPartialMockState when Replay() + is called. + + + + + Creates a new instance. + + Repository. + The proxy that generates the method calls + + + + Verify that we can move to replay state and move + to the reply state. + + + + + Gets a mock state that matches the original mock state of the object. + + + + + Options for special repeat option + + + + + This method can be called only as many times as the IMethodOptions.Expect allows. + + + + + This method should never be called + + + + + This method can be call any number of times + + + + + This method will call the original method + + + + + This method will call the original method, bypassing the mocking layer + + + + + This method will simulate simple property behavior + + + + + Validate all expectations on a mock and ignores calls to + any method that was not setup properly. + + + + + Creates a new instance. + + The previous state for this method + + + + Add a method call for this state' mock. + + The invocation for this method + The method that was called + The arguments this method was called with + + + + Gets a mock state that match the original mock state of the object. + + + + + Validate all expectations on a mock and ignores calls to + any method that was not setup properly. + + + + + Creates a new instance. + + The previous state for this method + + + + Add a method call for this state' mock. + + The invocation for this method + The method that was called + The arguments this method was called with + + + + Gets a mock state that match the original mock state of the object. + + + + + Summary description for RhinoInterceptor. + + + + + Creates a new instance. + + + + + Intercept a method call and direct it to the repository. + + + + + Validate arguments for methods + + + + + Validate that the passed argument is not null. + + The object to validate + The name of the argument + + If the obj is null, an ArgumentNullException with the passed name + is thrown. + + + + + Validate that the arguments are equal. + + Expected args. + Actual Args. + + + + Validate that the two arguments are equals, including validation for + when the arguments are collections, in which case it will validate their values. + + + + + This method is safe for use even if any of the objects is a mocked object + that override equals. + + + + + Throw an object already verified when accessed + + + + + Create a new instance of VerifiedMockState + + The previous mock state, used to get the initial record state + + + + Add a method call for this state' mock. + + The invocation for this method + The method that was called + The arguments this method was called with + + + + Verify that this mock expectations have passed. + + + + + Verify that we can move to replay state and move + to the reply state. + + + + + Gets a mock state that match the original mock state of the object. + + + + + Get the options for the last method call + + + + + Set the exception to throw when Verify is called. + This is used to report exception that may have happened but where caught in the code. + This way, they are reported anyway when Verify() is called. + + + + + not relevant + + + + + Gets the matching verify state for this state + + + + + Get the options for the last method call + + + + + Records the actions on all the mocks created by a repository. + + + + + Records the specified call with the specified args on the mocked object. + + + + + Get the expectation for this method on this object with this arguments + + + + + This check the methods that were setup using the SetupResult.For() + or LastCall.Repeat.Any() and that bypass the whole expectation model. + + + + + Gets the all expectations for a mocked object and method combination, + regardless of the expected arguments / callbacks / contraints. + + Mocked object. + Method. + List of all relevant expectation + + + + Gets the all expectations for proxy. + + Mocked object. + List of all relevant expectation + + + + Removes all the repeatable expectations for proxy. + + Mocked object. + + + + Replaces the old expectation with the new expectation for the specified proxy/method pair. + This replace ALL expectations that equal to old expectations. + + Proxy. + Method. + Old expectation. + New expectation. + + + + Adds the recorder and turn it into the active recorder. + + Recorder. + + + + Moves to previous recorder. + + + + + Gets the recorded expectation or null. + + + + + Gets the next expected calls string. + + + + + Moves to parent recorder. + + + + + Set the expectation so it can repeat any number of times. + + + + + Removes the expectation from the recorder + + + + + Clear the replayer to call (and all its chain of replayers) + This also removes it from the list of expectations, so it will never be considered again + + + + + Get the expectation for this method on this object with this arguments + + + + + Gets a value indicating whether this instance has expectations that weren't satisfied yet. + + + true if this instance has expectations; otherwise, false. + + + + + Allows to set various options for the last method call on + a specified object. + If the method has a return value, it's recommended to use Expect + + + + + Allows to get an interface to work on the last call. + + The mocked object + Interface that allows to set options for the last method call on this object + + + + Set the return value for the method. + + The object the method will return + IRepeat that defines how many times the method will return this value + + + + Set the return value for the method. This overload is needed for LastCall.Return(null) + + The object the method will return + IRepeat that defines how many times the method will return this value + + + + Throws the specified exception when the method is called. + + Exception to throw + + + + Ignores the arguments for this method. Any argument will be matched + againt this method. + + + + + Add constraints for the method's arguments. + + + + + Set a callback method for the last call + + + + + Set a callback method for the last call + + + + + Set a callback method for the last call + + + + + Set a callback method for the last call + + + + + Set a callback method for the last call + + + + + Set a callback method for the last call + + + + + Set a callback method for the last call + + + + + Set a callback method for the last call + + + + + Set a callback method for the last call + + + + + Set a callback method for the last call + + + + + Set a callback method for the last call + + + + + Set a callback method for the last call + + + + + Call the original method on the class, bypassing the mocking layers, for the last call. + + + + + Call the original method on the class, optionally bypassing the mocking layers, for the last call. + + + + + Set a delegate to be called when the expectation is matched. + The delegate return value will be returned from the expectation. + + + + + Gets an interface that will raise the last event when called. + + + + + Set the parameter values for out and ref parameters. + This is done using zero based indexing, and _ignoring_ any non out/ref parameter. + + + + + Documentation message for the expectation + + Message + + + + Use the property as a simple property, getting/setting the values without + causing mock expectations. + + + + + Better syntax to define repeats. + + + + + Base class for method recorders, handle delegating to inner recorder if needed. + + + + + List of the expected actions on for this recorder + The legal values are: + * Expectations + * Method Recorders + + + + + The current recorder. + + + + + The current replayer; + + + + + The parent recorder of this one, may be null. + + + + + This contains a list of all the replayers that should be ignored + for a spesific method call. A replayer gets into this list by calling + ClearReplayerToCall() on its parent. This list is Clear()ed on each new invocation. + + + + + All the repeatable methods calls. + + + + + Counts the recursion depth of the current expectation search stack + + + + + Creates a new instance. + + + + + Creates a new instance. + + Parent recorder. + Repeatable methods + + + + Records the specified call with the specified args on the mocked object. + + + + + Get the expectation for this method on this object with this arguments + + + + + Gets the all expectations for a mocked object and method combination, + regardless of the expected arguments / callbacks / contraints. + + Mocked object. + Method. + List of all relevant expectation + + + + Gets the all expectations for proxy. + + Mocked object. + List of all relevant expectation + + + + Replaces the old expectation with the new expectation for the specified proxy/method pair. + This replace ALL expectations that equal to old expectations. + + Proxy. + Method. + Old expectation. + New expectation. + + + + Remove the all repeatable expectations for proxy. + + Mocked object. + + + + Set the expectation so it can repeat any number of times. + + + + + Removes the expectation from the recorder + + + + + Adds the recorder and turn it into the active recorder. + + Recorder. + + + + Moves to previous recorder. + + + + + Moves to parent recorder. + + + + + Gets the recorded expectation or null. + + + + + Clear the replayer to call (and all its chain of replayers). + This also removes it from the list of expectations, so it will never be considered again + + + + + Get the expectation for this method on this object with this arguments + + + + + Gets the next expected calls string. + + + + + Handles the real getting of the recorded expectation or null. + + + + + Handle the real execution of this method for the derived class + + + + + Handle the real execution of this method for the derived class + + + + + Handle the real execution of this method for the derived class + + + + + Handle the real execution of this method for the derived class + + + + + Handle the real execution of this method for the derived class + + + + + Handle the real execution of this method for the derived class + + + + + Should this replayer be considered valid for this call? + + + + + This check the methods that were setup using the SetupResult.For() + or LastCall.Repeat.Any() and that bypass the whole expectation model. + + + + + Gets a value indicating whether this instance has expectations that weren't satisfied yet. + + + true if this instance has expectations; otherwise, false. + + + + + Handle the real execution of this method for the derived class + + + + + Ordered collection of methods, methods must arrive in specified order + in order to pass. + + + + + Unordered collection of method records, any expectation that exist + will be matched. + + + + + The parent recorder we have redirected to. + Useful for certain edge cases in orderring. + See: FieldProblem_Entropy for the details. + + + + + Creates a new instance. + + Parent recorder. + Repeatable methods + + + + Creates a new instance. + + + + + Records the specified call with the specified args on the mocked object. + + Mocked object. + Method. + Expectation. + + + + Get the expectation for this method on this object with this arguments + + Invocation for this method + Mocked object. + Method. + Args. + True is the call was recorded, false otherwise + + + + Gets the all expectations for a mocked object and method combination, + regardless of the expected arguments / callbacks / contraints. + + Mocked object. + Method. + List of all relevant expectation + + + + Gets the all expectations for proxy. + + Mocked object. + List of all relevant expectation + + + + Replaces the old expectation with the new expectation for the specified proxy/method pair. + This replace ALL expectations that equal to old expectations. + + Proxy. + Method. + Old expectation. + New expectation. + + + + Handle the real execution of this method for the derived class + + + + + Handles the real getting of the recorded expectation or null. + + + + + Handle the real execution of this method for the derived class + + + + + Gets the next expected calls string. + + + + + Create an exception for an unexpected method call. + + + + + Gets a value indicating whether this instance has expectations that weren't satisfied yet. + + + true if this instance has expectations; otherwise, false. + + + + + Creates a new instance. + + Parent recorder. + Repetable methods + + + + Creates a new instance. + + + + + Handles the real getting of the recorded expectation or null. + + + + + Get the expectation for this method on this object with this arguments + + + + + Gets the next expected calls string. + + + + + Hold an expectation for a method call on an object + + + + + Creates a new instance. + + Proxy. + Method. + Expectation. + + + + Determines if the object equal to this instance + + Obj. + + + + + Gets the hash code. + + + + + + Gets the proxy. + + + + + + Gets the method. + + + + + + Gets the expectation. + + + + + + Holds a pair of mocked object and a method + and allows to compare them against each other. + This allows us to have a distinction between mockOne.MyMethod() and + mockTwo.MyMethod()... + + + + + Creates a new instance. + + Proxy. + Method. + + + + Determines whatever obj equals to this instance. + ProxyMethodPairs are equal when they point to the same /instance/ of + an object, and to the same method. + + Obj. + + + + + Gets the hash code. + + + + + + Gets the proxy. + + + + + + Gets the method. + + + + + + Change the recorder from ordered to unordered and vice versa + + + + + Creates a new instance. + + + + + Disposes this instance. + + + + + Accessor for the current mocker + + + + + The current mocker + + + + + Used for [assembly: InternalsVisibleTo(RhinoMocks.StrongName)] + Used for [assembly: InternalsVisibleTo(RhinoMocks.NormalName)] + + + + + Strong name for the Dynamic Proxy assemblies. Used for InternalsVisibleTo specification. + + + + + Normal name for dynamic proxy assemblies. Used for InternalsVisibleTo specification. + + + + + Logs all method calls for methods + + + + + Setup method calls to repeat any number of times. + + + + + Get the method options and set the last method call to repeat + any number of times. + This also means that the method would transcend ordering + + + + + Get the method options for the last method call on the mockInstance and set it + to repeat any number of times. + This also means that the method would transcend ordering + + + + + Utility class for working with method calls. + + + + + Return the string representation of a method call and its arguments. + + The method + The method arguments + Invocation of the method, used to get the generics arguments + Delegate to format the parameter + The string representation of this method call + + + + Return the string representation of a method call and its arguments. + + The invocation of the method, used to get the generic parameters + The method + The method arguments + The string representation of this method call + + + + Delegate to format the argument for the string representation of + the method call. + + + + + Utility to get the default value for a type + + + + + The default value for a type. + Null for reference types and void + 0 for value types. + First element for enums + Note that we need to get the value even for opened generic types, such as those from + generic methods. + + Type. + The invocation. + the default value + + + + Allows easier access to MockRepository, works closely with Mocker.Current to + allow access to a context where the mock repository is automatially verified at + the end of the code block. + + + + + Initialize a code block where Mocker.Current is initialized. + At the end of the code block, all the expectation will be verified. + This overload will create a new MockRepository. + + The code that will be executed under the mock context + + + + Initialize a code block where Mocker.Current is initialized. + At the end of the code block, all the expectation will be verified. + This overload will create a new MockRepository. + + The mock repository to use, at the end of the code block, VerifyAll() will be called on the repository. + The code that will be executed under the mock context + + + + Create a FluentMocker + + The mock repository to use. + + + + A method with no arguments and no return value that will be called under the mock context. + + + + + FluentMocker implements some kind of fluent interface attempt + for saying "With the Mocks [mocks], Expecting (in same order) [things] verify [that]." + + + + + Interface to verify previously defined expectations + + + + + Verifies if a piece of code + + + + + Defines unordered expectations + + A delegate describing the expectations + an IMockVerifier + + + + Defines ordered expectations + + A delegate describing the expectations + an IMockVerifier + + + + Verifies previously defined expectations + + + + + This delegate is compatible with the System.Func{T,R} signature + We have to define our own to get compatability with 2.0 + + + + + This attribute is here so we can get better Pex integration + Using this means that Pex will not try to inspect the work of + the actual proxies being generated by Rhino Mocks + + + + diff --git a/Externals/log4net.xml b/Externals/log4net.xml new file mode 100644 index 0000000..db9e99f --- /dev/null +++ b/Externals/log4net.xml @@ -0,0 +1,28655 @@ + + + + log4net + + + + + Appender that logs to a database. + + + + appends logging events to a table within a + database. The appender can be configured to specify the connection + string by setting the property. + The connection type (provider) can be specified by setting the + property. For more information on database connection strings for + your specific database see http://www.connectionstrings.com/. + + + Records are written into the database either using a prepared + statement or a stored procedure. The property + is set to (System.Data.CommandType.Text) to specify a prepared statement + or to (System.Data.CommandType.StoredProcedure) to specify a stored + procedure. + + + The prepared statement text or the name of the stored procedure + must be set in the property. + + + The prepared statement or stored procedure can take a number + of parameters. Parameters are added using the + method. This adds a single to the + ordered list of parameters. The + type may be subclassed if required to provide database specific + functionality. The specifies + the parameter name, database type, size, and how the value should + be generated using a . + + + + An example of a SQL Server table that could be logged to: + + CREATE TABLE [dbo].[Log] ( + [ID] [int] IDENTITY (1, 1) NOT NULL , + [Date] [datetime] NOT NULL , + [Thread] [varchar] (255) NOT NULL , + [Level] [varchar] (20) NOT NULL , + [Logger] [varchar] (255) NOT NULL , + [Message] [varchar] (4000) NOT NULL + ) ON [PRIMARY] + + + + An example configuration to log to the above table: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Julian Biddle + Nicko Cadell + Gert Driesen + Lance Nehring + + + + Abstract base class implementation of that + buffers events in a fixed size buffer. + + + + This base class should be used by appenders that need to buffer a + number of events before logging them. For example the + buffers events and then submits the entire contents of the buffer to + the underlying database in one go. + + + Subclasses should override the + method to deliver the buffered events. + + The BufferingAppenderSkeleton maintains a fixed size cyclic + buffer of events. The size of the buffer is set using + the property. + + A is used to inspect + each event as it arrives in the appender. If the + triggers, then the current buffer is sent immediately + (see ). Otherwise the event + is stored in the buffer. For example, an evaluator can be used to + deliver the events immediately when an ERROR event arrives. + + + The buffering appender can be configured in a mode. + By default the appender is NOT lossy. When the buffer is full all + the buffered events are sent with . + If the property is set to true then the + buffer will not be sent when it is full, and new events arriving + in the appender will overwrite the oldest event in the buffer. + In lossy mode the buffer will only be sent when the + triggers. This can be useful behavior when you need to know about + ERROR events but not about events with a lower level, configure an + evaluator that will trigger when an ERROR event arrives, the whole + buffer will be sent which gives a history of events leading up to + the ERROR event. + + + Nicko Cadell + Gert Driesen + + + + Abstract base class implementation of . + + + + This class provides the code for common functionality, such + as support for threshold filtering and support for general filters. + + + Appenders can also implement the interface. Therefore + they would require that the method + be called after the appenders properties have been configured. + + + Nicko Cadell + Gert Driesen + + + + Implement this interface for your own strategies for printing log statements. + + + + Implementors should consider extending the + class which provides a default implementation of this interface. + + + Appenders can also implement the interface. Therefore + they would require that the method + be called after the appenders properties have been configured. + + + Nicko Cadell + Gert Driesen + + + + Closes the appender and releases resources. + + + + Releases any resources allocated within the appender such as file handles, + network connections, etc. + + + It is a programming error to append to a closed appender. + + + + + + Log the logging event in Appender specific way. + + The event to log + + + This method is called to log a message into this appender. + + + + + + Gets or sets the name of this appender. + + The name of the appender. + + The name uniquely identifies the appender. + + + + + Interface for appenders that support bulk logging. + + + + This interface extends the interface to + support bulk logging of objects. Appenders + should only implement this interface if they can bulk log efficiently. + + + Nicko Cadell + + + + Log the array of logging events in Appender specific way. + + The events to log + + + This method is called to log an array of events into this appender. + + + + + + Interface used to delay activate a configured object. + + + + This allows an object to defer activation of its options until all + options have been set. This is required for components which have + related options that remain ambiguous until all are set. + + + If a component implements this interface then the method + must be called by the container after its all the configured properties have been set + and before the component can be used. + + + Nicko Cadell + + + + Activate the options that were previously set with calls to properties. + + + + This allows an object to defer activation of its options until all + options have been set. This is required for components which have + related options that remain ambiguous until all are set. + + + If a component implements this interface then this method must be called + after its properties have been set before the component can be used. + + + + + + Initial buffer size + + + + + Maximum buffer size before it is recycled + + + + + Default constructor + + + Empty default constructor + + + + + Finalizes this appender by calling the implementation's + method. + + + + If this appender has not been closed then the Finalize method + will call . + + + + + + Initialize the appender based on the options set + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Closes the appender and release resources. + + + + Release any resources allocated within the appender such as file handles, + network connections, etc. + + + It is a programming error to append to a closed appender. + + + This method cannot be overridden by subclasses. This method + delegates the closing of the appender to the + method which must be overridden in the subclass. + + + + + + Performs threshold checks and invokes filters before + delegating actual logging to the subclasses specific + method. + + The event to log. + + + This method cannot be overridden by derived classes. A + derived class should override the method + which is called by this method. + + + The implementation of this method is as follows: + + + + + + Checks that the severity of the + is greater than or equal to the of this + appender. + + + + Checks that the chain accepts the + . + + + + + Calls and checks that + it returns true. + + + + + If all of the above steps succeed then the + will be passed to the abstract method. + + + + + + Performs threshold checks and invokes filters before + delegating actual logging to the subclasses specific + method. + + The array of events to log. + + + This method cannot be overridden by derived classes. A + derived class should override the method + which is called by this method. + + + The implementation of this method is as follows: + + + + + + Checks that the severity of the + is greater than or equal to the of this + appender. + + + + Checks that the chain accepts the + . + + + + + Calls and checks that + it returns true. + + + + + If all of the above steps succeed then the + will be passed to the method. + + + + + + Test if the logging event should we output by this appender + + the event to test + true if the event should be output, false if the event should be ignored + + + This method checks the logging event against the threshold level set + on this appender and also against the filters specified on this + appender. + + + The implementation of this method is as follows: + + + + + + Checks that the severity of the + is greater than or equal to the of this + appender. + + + + Checks that the chain accepts the + . + + + + + + + + + Adds a filter to the end of the filter chain. + + the filter to add to this appender + + + The Filters are organized in a linked list. + + + Setting this property causes the new filter to be pushed onto the + back of the filter chain. + + + + + + Clears the filter list for this appender. + + + + Clears the filter list for this appender. + + + + + + Checks if the message level is below this appender's threshold. + + to test against. + + + If there is no threshold set, then the return value is always true. + + + + true if the meets the + requirements of this appender. + + + + + Is called when the appender is closed. Derived classes should override + this method if resources need to be released. + + + + Releases any resources allocated within the appender such as file handles, + network connections, etc. + + + It is a programming error to append to a closed appender. + + + + + + Subclasses of should implement this method + to perform actual logging. + + The event to append. + + + A subclass must implement this method to perform + logging of the . + + This method will be called by + if all the conditions listed for that method are met. + + + To restrict the logging of events in the appender + override the method. + + + + + + Append a bulk array of logging events. + + the array of logging events + + + This base class implementation calls the + method for each element in the bulk array. + + + A sub class that can better process a bulk array of events should + override this method in addition to . + + + + + + Called before as a precondition. + + + + This method is called by + before the call to the abstract method. + + + This method can be overridden in a subclass to extend the checks + made before the event is passed to the method. + + + A subclass should ensure that they delegate this call to + this base class if it is overridden. + + + true if the call to should proceed. + + + + Renders the to a string. + + The event to render. + The event rendered as a string. + + + Helper method to render a to + a string. This appender must have a + set to render the to + a string. + + If there is exception data in the logging event and + the layout does not process the exception, this method + will append the exception text to the rendered string. + + + Where possible use the alternative version of this method + . + That method streams the rendering onto an existing Writer + which can give better performance if the caller already has + a open and ready for writing. + + + + + + Renders the to a string. + + The event to render. + The TextWriter to write the formatted event to + + + Helper method to render a to + a string. This appender must have a + set to render the to + a string. + + If there is exception data in the logging event and + the layout does not process the exception, this method + will append the exception text to the rendered string. + + + Use this method in preference to + where possible. If, however, the caller needs to render the event + to a string then does + provide an efficient mechanism for doing so. + + + + + + The layout of this appender. + + + See for more information. + + + + + The name of this appender. + + + See for more information. + + + + + The level threshold of this appender. + + + + There is no level threshold filtering by default. + + + See for more information. + + + + + + It is assumed and enforced that errorHandler is never null. + + + + It is assumed and enforced that errorHandler is never null. + + + See for more information. + + + + + + The first filter in the filter chain. + + + + Set to null initially. + + + See for more information. + + + + + + The last filter in the filter chain. + + + See for more information. + + + + + Flag indicating if this appender is closed. + + + See for more information. + + + + + The guard prevents an appender from repeatedly calling its own DoAppend method + + + + + StringWriter used to render events + + + + + Gets or sets the threshold of this appender. + + + The threshold of the appender. + + + + All log events with lower level than the threshold level are ignored + by the appender. + + + In configuration files this option is specified by setting the + value of the option to a level + string, such as "DEBUG", "INFO" and so on. + + + + + + Gets or sets the for this appender. + + The of the appender + + + The provides a default + implementation for the property. + + + + + + The filter chain. + + The head of the filter chain filter chain. + + + Returns the head Filter. The Filters are organized in a linked list + and so all Filters on this Appender are available through the result. + + + + + + Gets or sets the for this appender. + + The layout of the appender. + + + See for more information. + + + + + + + Gets or sets the name of this appender. + + The name of the appender. + + + The name uniquely identifies the appender. + + + + + + Tests if this appender requires a to be set. + + + + In the rather exceptional case, where the appender + implementation admits a layout but can also work without it, + then the appender should return true. + + + This default implementation always returns true. + + + + true if the appender requires a layout object, otherwise false. + + + + + The default buffer size. + + + The default size of the cyclic buffer used to store events. + This is set to 512 by default. + + + + + Initializes a new instance of the class. + + + + Protected default constructor to allow subclassing. + + + + + + Initializes a new instance of the class. + + the events passed through this appender must be + fixed by the time that they arrive in the derived class' SendBuffer method. + + + Protected constructor to allow subclassing. + + + The should be set if the subclass + expects the events delivered to be fixed even if the + is set to zero, i.e. when no buffering occurs. + + + + + + Flush the currently buffered events + + + + Flushes any events that have been buffered. + + + If the appender is buffering in mode then the contents + of the buffer will NOT be flushed to the appender. + + + + + + Flush the currently buffered events + + set to true to flush the buffer of lossy events + + + Flushes events that have been buffered. If is + false then events will only be flushed if this buffer is non-lossy mode. + + + If the appender is buffering in mode then the contents + of the buffer will only be flushed if is true. + In this case the contents of the buffer will be tested against the + and if triggering will be output. All other buffered + events will be discarded. + + + If is true then the buffer will always + be emptied by calling this method. + + + + + + Initialize the appender based on the options set + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Close this appender instance. + + + + Close this appender instance. If this appender is marked + as not then the remaining events in + the buffer must be sent when the appender is closed. + + + + + + This method is called by the method. + + the event to log + + + Stores the in the cyclic buffer. + + + The buffer will be sent (i.e. passed to the + method) if one of the following conditions is met: + + + + The cyclic buffer is full and this appender is + marked as not lossy (see ) + + + An is set and + it is triggered for the + specified. + + + + Before the event is stored in the buffer it is fixed + (see ) to ensure that + any data referenced by the event will be valid when the buffer + is processed. + + + + + + Sends the contents of the buffer. + + The first logging event. + The buffer containing the events that need to be send. + + + The subclass must override . + + + + + + Sends the events. + + The events that need to be send. + + + The subclass must override this method to process the buffered events. + + + + + + The size of the cyclic buffer used to hold the logging events. + + + Set to by default. + + + + + The cyclic buffer used to store the logging events. + + + + + The triggering event evaluator that causes the buffer to be sent immediately. + + + The object that is used to determine if an event causes the entire + buffer to be sent immediately. This field can be null, which + indicates that event triggering is not to be done. The evaluator + can be set using the property. If this appender + has the ( property) set to + true then an must be set. + + + + + Indicates if the appender should overwrite events in the cyclic buffer + when it becomes full, or if the buffer should be flushed when the + buffer is full. + + + If this field is set to true then an must + be set. + + + + + The triggering event evaluator filters discarded events. + + + The object that is used to determine if an event that is discarded should + really be discarded or if it should be sent to the appenders. + This field can be null, which indicates that all discarded events will + be discarded. + + + + + Value indicating which fields in the event should be fixed + + + By default all fields are fixed + + + + + The events delivered to the subclass must be fixed. + + + + + Gets or sets a value that indicates whether the appender is lossy. + + + true if the appender is lossy, otherwise false. The default is false. + + + + This appender uses a buffer to store logging events before + delivering them. A triggering event causes the whole buffer + to be send to the remote sink. If the buffer overruns before + a triggering event then logging events could be lost. Set + to false to prevent logging events + from being lost. + + If is set to true then an + must be specified. + + + + + Gets or sets the size of the cyclic buffer used to hold the + logging events. + + + The size of the cyclic buffer used to hold the logging events. + + + + The option takes a positive integer + representing the maximum number of logging events to collect in + a cyclic buffer. When the is reached, + oldest events are deleted as new events are added to the + buffer. By default the size of the cyclic buffer is 512 events. + + + If the is set to a value less than + or equal to 1 then no buffering will occur. The logging event + will be delivered synchronously (depending on the + and properties). Otherwise the event will + be buffered. + + + + + + Gets or sets the that causes the + buffer to be sent immediately. + + + The that causes the buffer to be + sent immediately. + + + + The evaluator will be called for each event that is appended to this + appender. If the evaluator triggers then the current buffer will + immediately be sent (see ). + + If is set to true then an + must be specified. + + + + + Gets or sets the value of the to use. + + + The value of the to use. + + + + The evaluator will be called for each event that is discarded from this + appender. If the evaluator triggers then the current buffer will immediately + be sent (see ). + + + + + + Gets or sets a value indicating if only part of the logging event data + should be fixed. + + + true if the appender should only fix part of the logging event + data, otherwise false. The default is false. + + + + Setting this property to true will cause only part of the + event data to be fixed and serialized. This will improve performance. + + + See for more information. + + + + + + Gets or sets a the fields that will be fixed in the event + + + The event fields that will be fixed before the event is buffered + + + + The logging event needs to have certain thread specific values + captured before it can be buffered. See + for details. + + + + + + + Initializes a new instance of the class. + + + Public default constructor to initialize a new instance of this class. + + + + + Initialize the appender based on the options set + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Override the parent method to close the database + + + + Closes the database command and database connection. + + + + + + Inserts the events into the database. + + The events to insert into the database. + + + Insert all the events specified in the + array into the database. + + + + + + Adds a parameter to the command. + + The parameter to add to the command. + + + Adds a parameter to the ordered list of command parameters. + + + + + + Writes the events to the database using the transaction specified. + + The transaction that the events will be executed under. + The array of events to insert into the database. + + + The transaction argument can be null if the appender has been + configured not to use transactions. See + property for more information. + + + + + + Formats the log message into database statement text. + + The event being logged. + + This method can be overridden by subclasses to provide + more control over the format of the database statement. + + + Text that can be passed to a . + + + + + Connects to the database. + + + + + Retrieves the class type of the ADO.NET provider. + + + + Gets the Type of the ADO.NET provider to use to connect to the + database. This method resolves the type specified in the + property. + + + Subclasses can override this method to return a different type + if necessary. + + + The of the ADO.NET provider + + + + Prepares the database command and initialize the parameters. + + + + + Flag to indicate if we are using a command object + + + + Set to true when the appender is to use a prepared + statement or stored procedure to insert into the database. + + + + + + The list of objects. + + + + The list of objects. + + + + + + The security context to use for privileged calls + + + + + The that will be used + to insert logging events into a database. + + + + + The database command. + + + + + Database connection string. + + + + + String type name of the type name. + + + + + The text of the command. + + + + + The command type. + + + + + Indicates whether to use transactions when writing to the database. + + + + + Indicates whether to use transactions when writing to the database. + + + + + Gets or sets the database connection string that is used to connect to + the database. + + + The database connection string used to connect to the database. + + + + The connections string is specific to the connection type. + See for more information. + + + Connection string for MS Access via ODBC: + "DSN=MS Access Database;UID=admin;PWD=;SystemDB=C:\data\System.mdw;SafeTransactions = 0;FIL=MS Access;DriverID = 25;DBQ=C:\data\train33.mdb" + + Another connection string for MS Access via ODBC: + "Driver={Microsoft Access Driver (*.mdb)};DBQ=C:\Work\cvs_root\log4net-1.2\access.mdb;UID=;PWD=;" + + Connection string for MS Access via OLE DB: + "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Work\cvs_root\log4net-1.2\access.mdb;User Id=;Password=;" + + + + + Gets or sets the type name of the connection + that should be created. + + + The type name of the connection. + + + + The type name of the ADO.NET provider to use. + + + The default is to use the OLE DB provider. + + + Use the OLE DB Provider. This is the default value. + System.Data.OleDb.OleDbConnection, System.Data, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + Use the MS SQL Server Provider. + System.Data.SqlClient.SqlConnection, System.Data, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + Use the ODBC Provider. + Microsoft.Data.Odbc.OdbcConnection,Microsoft.Data.Odbc,version=1.0.3300.0,publicKeyToken=b77a5c561934e089,culture=neutral + This is an optional package that you can download from + http://msdn.microsoft.com/downloads + search for ODBC .NET Data Provider. + + Use the Oracle Provider. + System.Data.OracleClient.OracleConnection, System.Data.OracleClient, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + This is an optional package that you can download from + http://msdn.microsoft.com/downloads + search for .NET Managed Provider for Oracle. + + + + + Gets or sets the command text that is used to insert logging events + into the database. + + + The command text used to insert logging events into the database. + + + + Either the text of the prepared statement or the + name of the stored procedure to execute to write into + the database. + + + The property determines if + this text is a prepared statement or a stored procedure. + + + + + + Gets or sets the command type to execute. + + + The command type to execute. + + + + This value may be either (System.Data.CommandType.Text) to specify + that the is a prepared statement to execute, + or (System.Data.CommandType.StoredProcedure) to specify that the + property is the name of a stored procedure + to execute. + + + The default value is (System.Data.CommandType.Text). + + + + + + Should transactions be used to insert logging events in the database. + + + true if transactions should be used to insert logging events in + the database, otherwise false. The default value is true. + + + + Gets or sets a value that indicates whether transactions should be used + to insert logging events in the database. + + + When set a single transaction will be used to insert the buffered events + into the database. Otherwise each event will be inserted without using + an explicit transaction. + + + + + + Gets or sets the used to call the NetSend method. + + + The used to call the NetSend method. + + + + Unless a specified here for this appender + the is queried for the + security context to use. The default behavior is to use the security context + of the current thread. + + + + + + Should this appender try to reconnect to the database on error. + + + true if the appender should try to reconnect to the database after an + error has occurred, otherwise false. The default value is false, + i.e. not to try to reconnect. + + + + The default behaviour is for the appender not to try to reconnect to the + database if an error occurs. Subsequent logging events are discarded. + + + To force the appender to attempt to reconnect to the database set this + property to true. + + + When the appender attempts to connect to the database there may be a + delay of up to the connection timeout specified in the connection string. + This delay will block the calling application's thread. + Until the connection can be reestablished this potential delay may occur multiple times. + + + + + + Gets or sets the underlying . + + + The underlying . + + + creates a to insert + logging events into a database. Classes deriving from + can use this property to get or set this . Use the + underlying returned from if + you require access beyond that which provides. + + + + + Parameter type used by the . + + + + This class provides the basic database parameter properties + as defined by the interface. + + This type can be subclassed to provide database specific + functionality. The two methods that are called externally are + and . + + + + + + Initializes a new instance of the class. + + + Default constructor for the AdoNetAppenderParameter class. + + + + + Prepare the specified database command object. + + The command to prepare. + + + Prepares the database command object by adding + this parameter to its collection of parameters. + + + + + + Renders the logging event and set the parameter value in the command. + + The command containing the parameter. + The event to be rendered. + + + Renders the logging event using this parameters layout + object. Sets the value of the parameter on the command object. + + + + + + The name of this parameter. + + + + + The database type for this parameter. + + + + + Flag to infer type rather than use the DbType + + + + + The precision for this parameter. + + + + + The scale for this parameter. + + + + + The size for this parameter. + + + + + The to use to render the + logging event into an object for this parameter. + + + + + Gets or sets the name of this parameter. + + + The name of this parameter. + + + + The name of this parameter. The parameter name + must match up to a named parameter to the SQL stored procedure + or prepared statement. + + + + + + Gets or sets the database type for this parameter. + + + The database type for this parameter. + + + + The database type for this parameter. This property should + be set to the database type from the + enumeration. See . + + + This property is optional. If not specified the ADO.NET provider + will attempt to infer the type from the value. + + + + + + + Gets or sets the precision for this parameter. + + + The precision for this parameter. + + + + The maximum number of digits used to represent the Value. + + + This property is optional. If not specified the ADO.NET provider + will attempt to infer the precision from the value. + + + + + + + Gets or sets the scale for this parameter. + + + The scale for this parameter. + + + + The number of decimal places to which Value is resolved. + + + This property is optional. If not specified the ADO.NET provider + will attempt to infer the scale from the value. + + + + + + + Gets or sets the size for this parameter. + + + The size for this parameter. + + + + The maximum size, in bytes, of the data within the column. + + + This property is optional. If not specified the ADO.NET provider + will attempt to infer the size from the value. + + + + + + + Gets or sets the to use to + render the logging event into an object for this + parameter. + + + The used to render the + logging event into an object for this parameter. + + + + The that renders the value for this + parameter. + + + The can be used to adapt + any into a + for use in the property. + + + + + + Appends logging events to the terminal using ANSI color escape sequences. + + + + AnsiColorTerminalAppender appends log events to the standard output stream + or the error output stream using a layout specified by the + user. It also allows the color of a specific level of message to be set. + + + This appender expects the terminal to understand the VT100 control set + in order to interpret the color codes. If the terminal or console does not + understand the control codes the behavior is not defined. + + + By default, all output is written to the console's standard output stream. + The property can be set to direct the output to the + error stream. + + + NOTE: This appender writes each message to the System.Console.Out or + System.Console.Error that is set at the time the event is appended. + Therefore it is possible to programmatically redirect the output of this appender + (for example NUnit does this to capture program output). While this is the desired + behavior of this appender it may have security implications in your application. + + + When configuring the ANSI colored terminal appender, a mapping should be + specified to map a logging level to a color. For example: + + + + + + + + + + + + + + + The Level is the standard log4net logging level and ForeColor and BackColor can be any + of the following values: + + Blue + Green + Red + White + Yellow + Purple + Cyan + + These color values cannot be combined together to make new colors. + + + The attributes can be any combination of the following: + + Brightforeground is brighter + Dimforeground is dimmer + Underscoremessage is underlined + Blinkforeground is blinking (does not work on all terminals) + Reverseforeground and background are reversed + Hiddenoutput is hidden + Strikethroughmessage has a line through it + + While any of these attributes may be combined together not all combinations + work well together, for example setting both Bright and Dim attributes makes + no sense. + + + Patrick Wagstrom + Nicko Cadell + + + + The to use when writing to the Console + standard output stream. + + + + The to use when writing to the Console + standard output stream. + + + + + + The to use when writing to the Console + standard error output stream. + + + + The to use when writing to the Console + standard error output stream. + + + + + + Ansi code to reset terminal + + + + + Initializes a new instance of the class. + + + The instance of the class is set up to write + to the standard output stream. + + + + + Add a mapping of level to color + + The mapping to add + + + Add a mapping to this appender. + Each mapping defines the foreground and background colours + for a level. + + + + + + This method is called by the method. + + The event to log. + + + Writes the event to the console. + + + The format of the output will depend on the appender's layout. + + + + + + Initialize the options for this appender + + + + Initialize the level to color mappings set on this appender. + + + + + + Flag to write output to the error stream rather than the standard output stream + + + + + Mapping from level object to color value + + + + + Target is the value of the console output stream. + + + Target is the value of the console output stream. + This is either "Console.Out" or "Console.Error". + + + + Target is the value of the console output stream. + This is either "Console.Out" or "Console.Error". + + + + + + This appender requires a to be set. + + true + + + This appender requires a to be set. + + + + + + The enum of possible display attributes + + + + The following flags can be combined together to + form the ANSI color attributes. + + + + + + + text is bright + + + + + text is dim + + + + + text is underlined + + + + + text is blinking + + + Not all terminals support this attribute + + + + + text and background colors are reversed + + + + + text is hidden + + + + + text is displayed with a strikethrough + + + + + The enum of possible foreground or background color values for + use with the color mapping method + + + + The output can be in one for the following ANSI colors. + + + + + + + color is black + + + + + color is red + + + + + color is green + + + + + color is yellow + + + + + color is blue + + + + + color is magenta + + + + + color is cyan + + + + + color is white + + + + + A class to act as a mapping between the level that a logging call is made at and + the color it should be displayed as. + + + + Defines the mapping between a level and the color it should be displayed in. + + + + + + An entry in the + + + + This is an abstract base class for types that are stored in the + object. + + + Nicko Cadell + + + + Default protected constructor + + + + Default protected constructor + + + + + + Initialize any options defined on this entry + + + + Should be overridden by any classes that need to initialise based on their options + + + + + + The level that is the key for this mapping + + + The that is the key for this mapping + + + + Get or set the that is the key for this + mapping subclass. + + + + + + Initialize the options for the object + + + + Combine the and together + and append the attributes. + + + + + + The mapped foreground color for the specified level + + + + Required property. + The mapped foreground color for the specified level + + + + + + The mapped background color for the specified level + + + + Required property. + The mapped background color for the specified level + + + + + + The color attributes for the specified level + + + + Required property. + The color attributes for the specified level + + + + + + The combined , and + suitable for setting the ansi terminal color. + + + + + A strongly-typed collection of objects. + + Nicko Cadell + + + + Creates a read-only wrapper for a AppenderCollection instance. + + list to create a readonly wrapper arround + + An AppenderCollection wrapper that is read-only. + + + + + An empty readonly static AppenderCollection + + + + + Initializes a new instance of the AppenderCollection class + that is empty and has the default initial capacity. + + + + + Initializes a new instance of the AppenderCollection class + that has the specified initial capacity. + + + The number of elements that the new AppenderCollection is initially capable of storing. + + + + + Initializes a new instance of the AppenderCollection class + that contains elements copied from the specified AppenderCollection. + + The AppenderCollection whose elements are copied to the new collection. + + + + Initializes a new instance of the AppenderCollection class + that contains elements copied from the specified array. + + The array whose elements are copied to the new list. + + + + Initializes a new instance of the AppenderCollection class + that contains elements copied from the specified collection. + + The collection whose elements are copied to the new list. + + + + Allow subclasses to avoid our default constructors + + + + + + + Copies the entire AppenderCollection to a one-dimensional + array. + + The one-dimensional array to copy to. + + + + Copies the entire AppenderCollection to a one-dimensional + array, starting at the specified index of the target array. + + The one-dimensional array to copy to. + The zero-based index in at which copying begins. + + + + Adds a to the end of the AppenderCollection. + + The to be added to the end of the AppenderCollection. + The index at which the value has been added. + + + + Removes all elements from the AppenderCollection. + + + + + Creates a shallow copy of the . + + A new with a shallow copy of the collection data. + + + + Determines whether a given is in the AppenderCollection. + + The to check for. + true if is found in the AppenderCollection; otherwise, false. + + + + Returns the zero-based index of the first occurrence of a + in the AppenderCollection. + + The to locate in the AppenderCollection. + + The zero-based index of the first occurrence of + in the entire AppenderCollection, if found; otherwise, -1. + + + + + Inserts an element into the AppenderCollection at the specified index. + + The zero-based index at which should be inserted. + The to insert. + + is less than zero + -or- + is equal to or greater than . + + + + + Removes the first occurrence of a specific from the AppenderCollection. + + The to remove from the AppenderCollection. + + The specified was not found in the AppenderCollection. + + + + + Removes the element at the specified index of the AppenderCollection. + + The zero-based index of the element to remove. + + is less than zero + -or- + is equal to or greater than . + + + + + Returns an enumerator that can iterate through the AppenderCollection. + + An for the entire AppenderCollection. + + + + Adds the elements of another AppenderCollection to the current AppenderCollection. + + The AppenderCollection whose elements should be added to the end of the current AppenderCollection. + The new of the AppenderCollection. + + + + Adds the elements of a array to the current AppenderCollection. + + The array whose elements should be added to the end of the AppenderCollection. + The new of the AppenderCollection. + + + + Adds the elements of a collection to the current AppenderCollection. + + The collection whose elements should be added to the end of the AppenderCollection. + The new of the AppenderCollection. + + + + Sets the capacity to the actual number of elements. + + + + + Return the collection elements as an array + + the array + + + + is less than zero + -or- + is equal to or greater than . + + + + + is less than zero + -or- + is equal to or greater than . + + + + + Gets the number of elements actually contained in the AppenderCollection. + + + + + Gets a value indicating whether access to the collection is synchronized (thread-safe). + + true if access to the ICollection is synchronized (thread-safe); otherwise, false. + + + + Gets an object that can be used to synchronize access to the collection. + + + + + Gets or sets the at the specified index. + + The zero-based index of the element to get or set. + + is less than zero + -or- + is equal to or greater than . + + + + + Gets a value indicating whether the collection has a fixed size. + + true if the collection has a fixed size; otherwise, false. The default is false + + + + Gets a value indicating whether the IList is read-only. + + true if the collection is read-only; otherwise, false. The default is false + + + + Gets or sets the number of elements the AppenderCollection can contain. + + + + + Supports type-safe iteration over a . + + + + + + Advances the enumerator to the next element in the collection. + + + true if the enumerator was successfully advanced to the next element; + false if the enumerator has passed the end of the collection. + + + The collection was modified after the enumerator was created. + + + + + Sets the enumerator to its initial position, before the first element in the collection. + + + + + Gets the current element in the collection. + + + + + Type visible only to our subclasses + Used to access protected constructor + + + + + + A value + + + + + Supports simple iteration over a . + + + + + + Initializes a new instance of the Enumerator class. + + + + + + Advances the enumerator to the next element in the collection. + + + true if the enumerator was successfully advanced to the next element; + false if the enumerator has passed the end of the collection. + + + The collection was modified after the enumerator was created. + + + + + Sets the enumerator to its initial position, before the first element in the collection. + + + + + Gets the current element in the collection. + + + + + + + + + Appends log events to the ASP.NET system. + + + + + Diagnostic information and tracing messages that you specify are appended to the output + of the page that is sent to the requesting browser. Optionally, you can view this information + from a separate trace viewer (Trace.axd) that displays trace information for every page in a + given application. + + + Trace statements are processed and displayed only when tracing is enabled. You can control + whether tracing is displayed to a page, to the trace viewer, or both. + + + The logging event is passed to the or + method depending on the level of the logging event. + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + + Default constructor. + + + + + + Write the logging event to the ASP.NET trace + + the event to log + + + Write the logging event to the ASP.NET trace + HttpContext.Current.Trace + (). + + + + + + This appender requires a to be set. + + true + + + This appender requires a to be set. + + + + + + Buffers events and then forwards them to attached appenders. + + + + The events are buffered in this appender until conditions are + met to allow the appender to deliver the events to the attached + appenders. See for the + conditions that cause the buffer to be sent. + + The forwarding appender can be used to specify different + thresholds and filters for the same appender at different locations + within the hierarchy. + + + Nicko Cadell + Gert Driesen + + + + Interface for attaching appenders to objects. + + + + Interface for attaching, removing and retrieving appenders. + + + Nicko Cadell + Gert Driesen + + + + Attaches an appender. + + The appender to add. + + + Add the specified appender. The implementation may + choose to allow or deny duplicate appenders. + + + + + + Gets an attached appender with the specified name. + + The name of the appender to get. + + The appender with the name specified, or null if no appender with the + specified name is found. + + + + Returns an attached appender with the specified. + If no appender with the specified name is found null will be + returned. + + + + + + Removes all attached appenders. + + + + Removes and closes all attached appenders + + + + + + Removes the specified appender from the list of attached appenders. + + The appender to remove. + The appender removed from the list + + + The appender removed is not closed. + If you are discarding the appender you must call + on the appender removed. + + + + + + Removes the appender with the specified name from the list of appenders. + + The name of the appender to remove. + The appender removed from the list + + + The appender removed is not closed. + If you are discarding the appender you must call + on the appender removed. + + + + + + Gets all attached appenders. + + + A collection of attached appenders. + + + + Gets a collection of attached appenders. + If there are no attached appenders the + implementation should return an empty + collection rather than null. + + + + + + Initializes a new instance of the class. + + + + Default constructor. + + + + + + Closes the appender and releases resources. + + + + Releases any resources allocated within the appender such as file handles, + network connections, etc. + + + It is a programming error to append to a closed appender. + + + + + + Send the events. + + The events that need to be send. + + + Forwards the events to the attached appenders. + + + + + + Adds an to the list of appenders of this + instance. + + The to add to this appender. + + + If the specified is already in the list of + appenders, then it won't be added again. + + + + + + Looks for the appender with the specified name. + + The name of the appender to lookup. + + The appender with the specified name, or null. + + + + Get the named appender attached to this buffering appender. + + + + + + Removes all previously added appenders from this appender. + + + + This is useful when re-reading configuration information. + + + + + + Removes the specified appender from the list of appenders. + + The appender to remove. + The appender removed from the list + + The appender removed is not closed. + If you are discarding the appender you must call + on the appender removed. + + + + + Removes the appender with the specified name from the list of appenders. + + The name of the appender to remove. + The appender removed from the list + + The appender removed is not closed. + If you are discarding the appender you must call + on the appender removed. + + + + + Implementation of the interface + + + + + Gets the appenders contained in this appender as an + . + + + If no appenders can be found, then an + is returned. + + + A collection of the appenders in this appender. + + + + + Appends logging events to the console. + + + + ColoredConsoleAppender appends log events to the standard output stream + or the error output stream using a layout specified by the + user. It also allows the color of a specific type of message to be set. + + + By default, all output is written to the console's standard output stream. + The property can be set to direct the output to the + error stream. + + + NOTE: This appender writes directly to the application's attached console + not to the System.Console.Out or System.Console.Error TextWriter. + The System.Console.Out and System.Console.Error streams can be + programmatically redirected (for example NUnit does this to capture program output). + This appender will ignore these redirections because it needs to use Win32 + API calls to colorize the output. To respect these redirections the + must be used. + + + When configuring the colored console appender, mapping should be + specified to map a logging level to a color. For example: + + + + + + + + + + + + + + The Level is the standard log4net logging level and ForeColor and BackColor can be any + combination of the following values: + + Blue + Green + Red + White + Yellow + Purple + Cyan + HighIntensity + + + + Rick Hobbs + Nicko Cadell + + + + The to use when writing to the Console + standard output stream. + + + + The to use when writing to the Console + standard output stream. + + + + + + The to use when writing to the Console + standard error output stream. + + + + The to use when writing to the Console + standard error output stream. + + + + + + Initializes a new instance of the class. + + + The instance of the class is set up to write + to the standard output stream. + + + + + Initializes a new instance of the class + with the specified layout. + + the layout to use for this appender + + The instance of the class is set up to write + to the standard output stream. + + + + + Initializes a new instance of the class + with the specified layout. + + the layout to use for this appender + flag set to true to write to the console error stream + + When is set to true, output is written to + the standard error output stream. Otherwise, output is written to the standard + output stream. + + + + + Add a mapping of level to color - done by the config file + + The mapping to add + + + Add a mapping to this appender. + Each mapping defines the foreground and background colors + for a level. + + + + + + This method is called by the method. + + The event to log. + + + Writes the event to the console. + + + The format of the output will depend on the appender's layout. + + + + + + Initialize the options for this appender + + + + Initialize the level to color mappings set on this appender. + + + + + + Flag to write output to the error stream rather than the standard output stream + + + + + Mapping from level object to color value + + + + + The console output stream writer to write to + + + + This writer is not thread safe. + + + + + + Target is the value of the console output stream. + This is either "Console.Out" or "Console.Error". + + + Target is the value of the console output stream. + This is either "Console.Out" or "Console.Error". + + + + Target is the value of the console output stream. + This is either "Console.Out" or "Console.Error". + + + + + + This appender requires a to be set. + + true + + + This appender requires a to be set. + + + + + + The enum of possible color values for use with the color mapping method + + + + The following flags can be combined together to + form the colors. + + + + + + + color is blue + + + + + color is green + + + + + color is red + + + + + color is white + + + + + color is yellow + + + + + color is purple + + + + + color is cyan + + + + + color is intensified + + + + + A class to act as a mapping between the level that a logging call is made at and + the color it should be displayed as. + + + + Defines the mapping between a level and the color it should be displayed in. + + + + + + Initialize the options for the object + + + + Combine the and together. + + + + + + The mapped foreground color for the specified level + + + + Required property. + The mapped foreground color for the specified level. + + + + + + The mapped background color for the specified level + + + + Required property. + The mapped background color for the specified level. + + + + + + The combined and suitable for + setting the console color. + + + + + Appends logging events to the console. + + + + ConsoleAppender appends log events to the standard output stream + or the error output stream using a layout specified by the + user. + + + By default, all output is written to the console's standard output stream. + The property can be set to direct the output to the + error stream. + + + NOTE: This appender writes each message to the System.Console.Out or + System.Console.Error that is set at the time the event is appended. + Therefore it is possible to programmatically redirect the output of this appender + (for example NUnit does this to capture program output). While this is the desired + behavior of this appender it may have security implications in your application. + + + Nicko Cadell + Gert Driesen + + + + The to use when writing to the Console + standard output stream. + + + + The to use when writing to the Console + standard output stream. + + + + + + The to use when writing to the Console + standard error output stream. + + + + The to use when writing to the Console + standard error output stream. + + + + + + Initializes a new instance of the class. + + + The instance of the class is set up to write + to the standard output stream. + + + + + Initializes a new instance of the class + with the specified layout. + + the layout to use for this appender + + The instance of the class is set up to write + to the standard output stream. + + + + + Initializes a new instance of the class + with the specified layout. + + the layout to use for this appender + flag set to true to write to the console error stream + + When is set to true, output is written to + the standard error output stream. Otherwise, output is written to the standard + output stream. + + + + + This method is called by the method. + + The event to log. + + + Writes the event to the console. + + + The format of the output will depend on the appender's layout. + + + + + + Target is the value of the console output stream. + This is either "Console.Out" or "Console.Error". + + + Target is the value of the console output stream. + This is either "Console.Out" or "Console.Error". + + + + Target is the value of the console output stream. + This is either "Console.Out" or "Console.Error". + + + + + + This appender requires a to be set. + + true + + + This appender requires a to be set. + + + + + + Appends log events to the system. + + + + The application configuration file can be used to control what listeners + are actually used. See the MSDN documentation for the + class for details on configuring the + debug system. + + + Events are written using the + method. The event's logger name is passed as the value for the category name to the Write method. + + + Nicko Cadell + + + + Initializes a new instance of the . + + + + Default constructor. + + + + + + Initializes a new instance of the + with a specified layout. + + The layout to use with this appender. + + + Obsolete constructor. + + + + + + Writes the logging event to the system. + + The event to log. + + + Writes the logging event to the system. + If is true then the + is called. + + + + + + Immediate flush means that the underlying writer or output stream + will be flushed at the end of each append operation. + + + + Immediate flush is slower but ensures that each append request is + actually written. If is set to + false, then there is a good chance that the last few + logs events are not actually written to persistent media if and + when the application crashes. + + + The default value is true. + + + + + Gets or sets a value that indicates whether the appender will + flush at the end of each write. + + + The default behavior is to flush at the end of each + write. If the option is set tofalse, then the underlying + stream can defer writing to physical medium to a later time. + + + Avoiding the flush operation at the end of each append results + in a performance gain of 10 to 20 percent. However, there is safety + trade-off involved in skipping flushing. Indeed, when flushing is + skipped, then it is likely that the last few log events will not + be recorded on disk when the application exits. This is a high + price to pay even for a 20% performance gain. + + + + + + This appender requires a to be set. + + true + + + This appender requires a to be set. + + + + + + Writes events to the system event log. + + + + The EventID of the event log entry can be + set using the EventLogEventID property () + on the . + + + There is a limit of 32K characters for an event log message + + + When configuring the EventLogAppender a mapping can be + specified to map a logging level to an event log entry type. For example: + + + <mapping> + <level value="ERROR" /> + <eventLogEntryType value="Error" /> + </mapping> + <mapping> + <level value="DEBUG" /> + <eventLogEntryType value="Information" /> + </mapping> + + + The Level is the standard log4net logging level and eventLogEntryType can be any value + from the enum, i.e.: + + Erroran error event + Warninga warning event + Informationan informational event + + + + Aspi Havewala + Douglas de la Torre + Nicko Cadell + Gert Driesen + Thomas Voss + + + + Initializes a new instance of the class. + + + + Default constructor. + + + + + + Initializes a new instance of the class + with the specified . + + The to use with this appender. + + + Obsolete constructor. + + + + + + Add a mapping of level to - done by the config file + + The mapping to add + + + Add a mapping to this appender. + Each mapping defines the event log entry type for a level. + + + + + + Initialize the appender based on the options set + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Create an event log source + + + Uses different API calls under NET_2_0 + + + + + This method is called by the + method. + + the event to log + + Writes the event to the system event log using the + . + + If the event has an EventID property (see ) + set then this integer will be used as the event log event id. + + + There is a limit of 32K characters for an event log message + + + + + + Get the equivalent for a + + the Level to convert to an EventLogEntryType + The equivalent for a + + Because there are fewer applicable + values to use in logging levels than there are in the + this is a one way mapping. There is + a loss of information during the conversion. + + + + + The log name is the section in the event logs where the messages + are stored. + + + + + Name of the application to use when logging. This appears in the + application column of the event log named by . + + + + + The name of the machine which holds the event log. This is + currently only allowed to be '.' i.e. the current machine. + + + + + Mapping from level object to EventLogEntryType + + + + + The security context to use for privileged calls + + + + + The name of the log where messages will be stored. + + + The string name of the log where messages will be stored. + + + This is the name of the log as it appears in the Event Viewer + tree. The default value is to log into the Application + log, this is where most applications write their events. However + if you need a separate log for your application (or applications) + then you should set the appropriately. + This should not be used to distinguish your event log messages + from those of other applications, the + property should be used to distinguish events. This property should be + used to group together events into a single log. + + + + + + Property used to set the Application name. This appears in the + event logs when logging. + + + The string used to distinguish events from different sources. + + + Sets the event log source property. + + + + + This property is used to return the name of the computer to use + when accessing the event logs. Currently, this is the current + computer, denoted by a dot "." + + + The string name of the machine holding the event log that + will be logged into. + + + This property cannot be changed. It is currently set to '.' + i.e. the local machine. This may be changed in future. + + + + + Gets or sets the used to write to the EventLog. + + + The used to write to the EventLog. + + + + The system security context used to write to the EventLog. + + + Unless a specified here for this appender + the is queried for the + security context to use. The default behavior is to use the security context + of the current thread. + + + + + + This appender requires a to be set. + + true + + + This appender requires a to be set. + + + + + + A class to act as a mapping between the level that a logging call is made at and + the color it should be displayed as. + + + + Defines the mapping between a level and its event log entry type. + + + + + + The for this entry + + + + Required property. + The for this entry + + + + + + Appends logging events to a file. + + + + Logging events are sent to the file specified by + the property. + + + The file can be opened in either append or overwrite mode + by specifying the property. + If the file path is relative it is taken as relative from + the application base directory. The file encoding can be + specified by setting the property. + + + The layout's and + values will be written each time the file is opened and closed + respectively. If the property is + then the file may contain multiple copies of the header and footer. + + + This appender will first try to open the file for writing when + is called. This will typically be during configuration. + If the file cannot be opened for writing the appender will attempt + to open the file again each time a message is logged to the appender. + If the file cannot be opened for writing when a message is logged then + the message will be discarded by this appender. + + + The supports pluggable file locking models via + the property. + The default behavior, implemented by + is to obtain an exclusive write lock on the file until this appender is closed. + The alternative model, , only holds a + write lock while the appender is writing a logging event. + + + Nicko Cadell + Gert Driesen + Rodrigo B. de Oliveira + Douglas de la Torre + Niall Daley + + + + Sends logging events to a . + + + + An Appender that writes to a . + + + This appender may be used stand alone if initialized with an appropriate + writer, however it is typically used as a base class for an appender that + can open a to write to. + + + Nicko Cadell + Gert Driesen + Douglas de la Torre + + + + Initializes a new instance of the class. + + + + Default constructor. + + + + + + Initializes a new instance of the class and + sets the output destination to a new initialized + with the specified . + + The layout to use with this appender. + The to output to. + + + Obsolete constructor. + + + + + + Initializes a new instance of the class and sets + the output destination to the specified . + + The layout to use with this appender + The to output to + + The must have been previously opened. + + + + Obsolete constructor. + + + + + + This method determines if there is a sense in attempting to append. + + + + This method checked if an output target has been set and if a + layout has been set. + + + false if any of the preconditions fail. + + + + This method is called by the + method. + + The event to log. + + + Writes a log statement to the output stream if the output stream exists + and is writable. + + + The format of the output will depend on the appender's layout. + + + + + + This method is called by the + method. + + The array of events to log. + + + This method writes all the bulk logged events to the output writer + before flushing the stream. + + + + + + Close this appender instance. The underlying stream or writer is also closed. + + + Closed appenders cannot be reused. + + + + + Writes the footer and closes the underlying . + + + + Writes the footer and closes the underlying . + + + + + + Closes the underlying . + + + + Closes the underlying . + + + + + + Clears internal references to the underlying + and other variables. + + + + Subclasses can override this method for an alternate closing behavior. + + + + + + Writes a footer as produced by the embedded layout's property. + + + + Writes a footer as produced by the embedded layout's property. + + + + + + Writes a header produced by the embedded layout's property. + + + + Writes a header produced by the embedded layout's property. + + + + + + Called to allow a subclass to lazily initialize the writer + + + + This method is called when an event is logged and the or + have not been set. This allows a subclass to + attempt to initialize the writer multiple times. + + + + + + This is the where logging events + will be written to. + + + + + Immediate flush means that the underlying + or output stream will be flushed at the end of each append operation. + + + + Immediate flush is slower but ensures that each append request is + actually written. If is set to + false, then there is a good chance that the last few + logging events are not actually persisted if and when the application + crashes. + + + The default value is true. + + + + + + Gets or set whether the appender will flush at the end + of each append operation. + + + + The default behavior is to flush at the end of each + append operation. + + + If this option is set to false, then the underlying + stream can defer persisting the logging event to a later + time. + + + + Avoiding the flush operation at the end of each append results in + a performance gain of 10 to 20 percent. However, there is safety + trade-off involved in skipping flushing. Indeed, when flushing is + skipped, then it is likely that the last few log events will not + be recorded on disk when the application exits. This is a high + price to pay even for a 20% performance gain. + + + + + Sets the where the log output will go. + + + + The specified must be open and writable. + + + The will be closed when the appender + instance is closed. + + + Note: Logging to an unopened will fail. + + + + + + Gets or set the and the underlying + , if any, for this appender. + + + The for this appender. + + + + + This appender requires a to be set. + + true + + + This appender requires a to be set. + + + + + + Gets or sets the where logging events + will be written to. + + + The where logging events are written. + + + + This is the where logging events + will be written to. + + + + + + Default constructor + + + + Default constructor + + + + + + Construct a new appender using the layout, file and append mode. + + the layout to use with this appender + the full path to the file to write to + flag to indicate if the file should be appended to + + + Obsolete constructor. + + + + + + Construct a new appender using the layout and file specified. + The file will be appended to. + + the layout to use with this appender + the full path to the file to write to + + + Obsolete constructor. + + + + + + Activate the options on the file appender. + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + This will cause the file to be opened. + + + + + + Closes any previously opened file and calls the parent's . + + + + Resets the filename and the file stream. + + + + + + Called to initialize the file writer + + + + Will be called for each logged message until the file is + successfully opened. + + + + + + This method is called by the + method. + + The event to log. + + + Writes a log statement to the output stream if the output stream exists + and is writable. + + + The format of the output will depend on the appender's layout. + + + + + + This method is called by the + method. + + The array of events to log. + + + Acquires the output file locks once before writing all the events to + the stream. + + + + + + Writes a footer as produced by the embedded layout's property. + + + + Writes a footer as produced by the embedded layout's property. + + + + + + Writes a header produced by the embedded layout's property. + + + + Writes a header produced by the embedded layout's property. + + + + + + Closes the underlying . + + + + Closes the underlying . + + + + + + Closes the previously opened file. + + + + Writes the to the file and then + closes the file. + + + + + + Sets and opens the file where the log output will go. The specified file must be writable. + + The path to the log file. Must be a fully qualified path. + If true will append to fileName. Otherwise will truncate fileName + + + Calls but guarantees not to throw an exception. + Errors are passed to the . + + + + + + Sets and opens the file where the log output will go. The specified file must be writable. + + The path to the log file. Must be a fully qualified path. + If true will append to fileName. Otherwise will truncate fileName + + + If there was already an opened file, then the previous file + is closed first. + + + This method will ensure that the directory structure + for the specified exists. + + + + + + Sets the quiet writer used for file output + + the file stream that has been opened for writing + + + This implementation of creates a + over the and passes it to the + method. + + + This method can be overridden by sub classes that want to wrap the + in some way, for example to encrypt the output + data using a System.Security.Cryptography.CryptoStream. + + + + + + Sets the quiet writer being used. + + the writer over the file stream that has been opened for writing + + + This method can be overridden by sub classes that want to + wrap the in some way. + + + + + + Convert a path into a fully qualified path. + + The path to convert. + The fully qualified path. + + + Converts the path specified to a fully + qualified path. If the path is relative it is + taken as relative from the application base + directory. + + + + + + Flag to indicate if we should append to the file + or overwrite the file. The default is to append. + + + + + The name of the log file. + + + + + The encoding to use for the file stream. + + + + + The security context to use for privileged calls + + + + + The stream to log to. Has added locking semantics + + + + + The locking model to use + + + + + Gets or sets the path to the file that logging will be written to. + + + The path to the file that logging will be written to. + + + + If the path is relative it is taken as relative from + the application base directory. + + + + + + Gets or sets a flag that indicates whether the file should be + appended to or overwritten. + + + Indicates whether the file should be appended to or overwritten. + + + + If the value is set to false then the file will be overwritten, if + it is set to true then the file will be appended to. + + The default value is true. + + + + + Gets or sets used to write to the file. + + + The used to write to the file. + + + + The default encoding set is + which is the encoding for the system's current ANSI code page. + + + + + + Gets or sets the used to write to the file. + + + The used to write to the file. + + + + Unless a specified here for this appender + the is queried for the + security context to use. The default behavior is to use the security context + of the current thread. + + + + + + Gets or sets the used to handle locking of the file. + + + The used to lock the file. + + + + Gets or sets the used to handle locking of the file. + + + There are two built in locking models, and . + The former locks the file from the start of logging to the end and the + later lock only for the minimal amount of time when logging each message. + + + The default locking model is the . + + + + + + Write only that uses the + to manage access to an underlying resource. + + + + + True asynchronous writes are not supported, the implementation forces a synchronous write. + + + + + Exception base type for log4net. + + + + This type extends . It + does not add any new functionality but does differentiate the + type of exception being thrown. + + + Nicko Cadell + Gert Driesen + + + + Constructor + + + + Initializes a new instance of the class. + + + + + + Constructor + + A message to include with the exception. + + + Initializes a new instance of the class with + the specified message. + + + + + + Constructor + + A message to include with the exception. + A nested exception to include. + + + Initializes a new instance of the class + with the specified message and inner exception. + + + + + + Serialization constructor + + The that holds the serialized object data about the exception being thrown. + The that contains contextual information about the source or destination. + + + Initializes a new instance of the class + with serialized data. + + + + + + Locking model base class + + + + Base class for the locking models available to the derived loggers. + + + + + + Open the output file + + The filename to use + Whether to append to the file, or overwrite + The encoding to use + + + Open the file specified and prepare for logging. + No writes will be made until is called. + Must be called before any calls to , + and . + + + + + + Close the file + + + + Close the file. No further writes will be made. + + + + + + Acquire the lock on the file + + A stream that is ready to be written to. + + + Acquire the lock on the file in preparation for writing to it. + Return a stream pointing to the file. + must be called to release the lock on the output file. + + + + + + Release the lock on the file + + + + Release the lock on the file. No further writes will be made to the + stream until is called again. + + + + + + Gets or sets the for this LockingModel + + + The for this LockingModel + + + + The file appender this locking model is attached to and working on + behalf of. + + + The file appender is used to locate the security context and the error handler to use. + + + The value of this property will be set before is + called. + + + + + + Hold an exclusive lock on the output file + + + + Open the file once for writing and hold it open until is called. + Maintains an exclusive lock on the file during this time. + + + + + + Open the file specified and prepare for logging. + + The filename to use + Whether to append to the file, or overwrite + The encoding to use + + + Open the file specified and prepare for logging. + No writes will be made until is called. + Must be called before any calls to , + and . + + + + + + Close the file + + + + Close the file. No further writes will be made. + + + + + + Acquire the lock on the file + + A stream that is ready to be written to. + + + Does nothing. The lock is already taken + + + + + + Release the lock on the file + + + + Does nothing. The lock will be released when the file is closed. + + + + + + Acquires the file lock for each write + + + + Opens the file once for each / cycle, + thus holding the lock for the minimal amount of time. This method of locking + is considerably slower than but allows + other processes to move/delete the log file whilst logging continues. + + + + + + Prepares to open the file when the first message is logged. + + The filename to use + Whether to append to the file, or overwrite + The encoding to use + + + Open the file specified and prepare for logging. + No writes will be made until is called. + Must be called before any calls to , + and . + + + + + + Close the file + + + + Close the file. No further writes will be made. + + + + + + Acquire the lock on the file + + A stream that is ready to be written to. + + + Acquire the lock on the file in preparation for writing to it. + Return a stream pointing to the file. + must be called to release the lock on the output file. + + + + + + Release the lock on the file + + + + Release the lock on the file. No further writes will be made to the + stream until is called again. + + + + + + This appender forwards logging events to attached appenders. + + + + The forwarding appender can be used to specify different thresholds + and filters for the same appender at different locations within the hierarchy. + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + + Default constructor. + + + + + + Closes the appender and releases resources. + + + + Releases any resources allocated within the appender such as file handles, + network connections, etc. + + + It is a programming error to append to a closed appender. + + + + + + Forward the logging event to the attached appenders + + The event to log. + + + Delivers the logging event to all the attached appenders. + + + + + + Forward the logging events to the attached appenders + + The array of events to log. + + + Delivers the logging events to all the attached appenders. + + + + + + Adds an to the list of appenders of this + instance. + + The to add to this appender. + + + If the specified is already in the list of + appenders, then it won't be added again. + + + + + + Looks for the appender with the specified name. + + The name of the appender to lookup. + + The appender with the specified name, or null. + + + + Get the named appender attached to this appender. + + + + + + Removes all previously added appenders from this appender. + + + + This is useful when re-reading configuration information. + + + + + + Removes the specified appender from the list of appenders. + + The appender to remove. + The appender removed from the list + + The appender removed is not closed. + If you are discarding the appender you must call + on the appender removed. + + + + + Removes the appender with the specified name from the list of appenders. + + The name of the appender to remove. + The appender removed from the list + + The appender removed is not closed. + If you are discarding the appender you must call + on the appender removed. + + + + + Implementation of the interface + + + + + Gets the appenders contained in this appender as an + . + + + If no appenders can be found, then an + is returned. + + + A collection of the appenders in this appender. + + + + + Logs events to a local syslog service. + + + + This appender uses the POSIX libc library functions openlog, syslog, and closelog. + If these functions are not available on the local system then this appender will not work! + + + The functions openlog, syslog, and closelog are specified in SUSv2 and + POSIX 1003.1-2001 standards. These are used to log messages to the local syslog service. + + + This appender talks to a local syslog service. If you need to log to a remote syslog + daemon and you cannot configure your local syslog service to do this you may be + able to use the to log via UDP. + + + Syslog messages must have a facility and and a severity. The severity + is derived from the Level of the logging event. + The facility must be chosen from the set of defined syslog + values. The facilities list is predefined + and cannot be extended. + + + An identifier is specified with each log message. This can be specified + by setting the property. The identity (also know + as the tag) must not contain white space. The default value for the + identity is the application name (from ). + + + Rob Lyon + Nicko Cadell + + + + Initializes a new instance of the class. + + + This instance of the class is set up to write + to a local syslog service. + + + + + Add a mapping of level to severity + + The mapping to add + + + Adds a to this appender. + + + + + + Initialize the appender based on the options set. + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + This method is called by the method. + + The event to log. + + + Writes the event to a remote syslog daemon. + + + The format of the output will depend on the appender's layout. + + + + + + Close the syslog when the appender is closed + + + + Close the syslog when the appender is closed + + + + + + Translates a log4net level to a syslog severity. + + A log4net level. + A syslog severity. + + + Translates a log4net level to a syslog severity. + + + + + + Generate a syslog priority. + + The syslog facility. + The syslog severity. + A syslog priority. + + + + The facility. The default facility is . + + + + + The message identity + + + + + Marshaled handle to the identity string. We have to hold on to the + string as the openlog and syslog APIs just hold the + pointer to the ident and dereference it for each log message. + + + + + Mapping from level object to syslog severity + + + + + Open connection to system logger. + + + + + Generate a log message. + + + + The libc syslog method takes a format string and a variable argument list similar + to the classic printf function. As this type of vararg list is not supported + by C# we need to specify the arguments explicitly. Here we have specified the + format string with a single message argument. The caller must set the format + string to "%s". + + + + + + Close descriptor used to write to system logger. + + + + + Message identity + + + + An identifier is specified with each log message. This can be specified + by setting the property. The identity (also know + as the tag) must not contain white space. The default value for the + identity is the application name (from ). + + + + + + Syslog facility + + + Set to one of the values. The list of + facilities is predefined and cannot be extended. The default value + is . + + + + + This appender requires a to be set. + + true + + + This appender requires a to be set. + + + + + + syslog severities + + + + The log4net Level maps to a syslog severity using the + method and the + class. The severity is set on . + + + + + + system is unusable + + + + + action must be taken immediately + + + + + critical conditions + + + + + error conditions + + + + + warning conditions + + + + + normal but significant condition + + + + + informational + + + + + debug-level messages + + + + + syslog facilities + + + + The syslog facility defines which subsystem the logging comes from. + This is set on the property. + + + + + + kernel messages + + + + + random user-level messages + + + + + mail system + + + + + system daemons + + + + + security/authorization messages + + + + + messages generated internally by syslogd + + + + + line printer subsystem + + + + + network news subsystem + + + + + UUCP subsystem + + + + + clock (cron/at) daemon + + + + + security/authorization messages (private) + + + + + ftp daemon + + + + + NTP subsystem + + + + + log audit + + + + + log alert + + + + + clock daemon + + + + + reserved for local use + + + + + reserved for local use + + + + + reserved for local use + + + + + reserved for local use + + + + + reserved for local use + + + + + reserved for local use + + + + + reserved for local use + + + + + reserved for local use + + + + + A class to act as a mapping between the level that a logging call is made at and + the syslog severity that is should be logged at. + + + + A class to act as a mapping between the level that a logging call is made at and + the syslog severity that is should be logged at. + + + + + + The mapped syslog severity for the specified level + + + + Required property. + The mapped syslog severity for the specified level + + + + + + Stores logging events in an array. + + + + The memory appender stores all the logging events + that are appended in an in-memory array. + + + Use the method to get + the current list of events that have been appended. + + + Use the method to clear the + current list of events. + + + Julian Biddle + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + + Default constructor. + + + + + + Gets the events that have been logged. + + The events that have been logged + + + Gets the events that have been logged. + + + + + + This method is called by the method. + + the event to log + + Stores the in the events list. + + + + + Clear the list of events + + + Clear the list of events + + + + + The list of events that have been appended. + + + + + Value indicating which fields in the event should be fixed + + + By default all fields are fixed + + + + + Gets or sets a value indicating whether only part of the logging event + data should be fixed. + + + true if the appender should only fix part of the logging event + data, otherwise false. The default is false. + + + + Setting this property to true will cause only part of the event + data to be fixed and stored in the appender, hereby improving performance. + + + See for more information. + + + + + + Gets or sets the fields that will be fixed in the event + + + + The logging event needs to have certain thread specific values + captured before it can be buffered. See + for details. + + + + + + Logs entries by sending network messages using the + native function. + + + + You can send messages only to names that are active + on the network. If you send the message to a user name, + that user must be logged on and running the Messenger + service to receive the message. + + + The receiver will get a top most window displaying the + messages one at a time, therefore this appender should + not be used to deliver a high volume of messages. + + + The following table lists some possible uses for this appender : + + + + + Action + Property Value(s) + + + Send a message to a user account on the local machine + + + = <name of the local machine> + + + = <user name> + + + + + Send a message to a user account on a remote machine + + + = <name of the remote machine> + + + = <user name> + + + + + Send a message to a domain user account + + + = <name of a domain controller | uninitialized> + + + = <user name> + + + + + Send a message to all the names in a workgroup or domain + + + = <workgroup name | domain name>* + + + + + Send a message from the local machine to a remote machine + + + = <name of the local machine | uninitialized> + + + = <name of the remote machine> + + + + + + + Note : security restrictions apply for sending + network messages, see + for more information. + + + + + An example configuration section to log information + using this appender from the local machine, named + LOCAL_PC, to machine OPERATOR_PC : + + + + + + + + + + Nicko Cadell + Gert Driesen + + + + The DNS or NetBIOS name of the server on which the function is to execute. + + + + + The sender of the network message. + + + + + The message alias to which the message should be sent. + + + + + The security context to use for privileged calls + + + + + Initializes the appender. + + + The default constructor initializes all fields to their default values. + + + + + Initialize the appender based on the options set. + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + The appender will be ignored if no was specified. + + + The required property was not specified. + + + + This method is called by the method. + + The event to log. + + + Sends the event using a network message. + + + + + + Sends a buffer of information to a registered message alias. + + The DNS or NetBIOS name of the server on which the function is to execute. + The message alias to which the message buffer should be sent + The originator of the message. + The message text. + The length, in bytes, of the message text. + + + The following restrictions apply for sending network messages: + + + + + Platform + Requirements + + + Windows NT + + + No special group membership is required to send a network message. + + + Admin, Accounts, Print, or Server Operator group membership is required to + successfully send a network message on a remote server. + + + + + Windows 2000 or later + + + If you send a message on a domain controller that is running Active Directory, + access is allowed or denied based on the access control list (ACL) for the securable + object. The default ACL permits only Domain Admins and Account Operators to send a network message. + + + On a member server or workstation, only Administrators and Server Operators can send a network message. + + + + + + + For more information see Security Requirements for the Network Management Functions. + + + + + If the function succeeds, the return value is zero. + + + + + + Gets or sets the sender of the message. + + + The sender of the message. + + + If this property is not specified, the message is sent from the local computer. + + + + + Gets or sets the message alias to which the message should be sent. + + + The recipient of the message. + + + This property should always be specified in order to send a message. + + + + + Gets or sets the DNS or NetBIOS name of the remote server on which the function is to execute. + + + DNS or NetBIOS name of the remote server on which the function is to execute. + + + + For Windows NT 4.0 and earlier, the string should begin with \\. + + + If this property is not specified, the local computer is used. + + + + + + Gets or sets the used to call the NetSend method. + + + The used to call the NetSend method. + + + + Unless a specified here for this appender + the is queried for the + security context to use. The default behavior is to use the security context + of the current thread. + + + + + + This appender requires a to be set. + + true + + + This appender requires a to be set. + + + + + + Appends log events to the OutputDebugString system. + + + + OutputDebugStringAppender appends log events to the + OutputDebugString system. + + + The string is passed to the native OutputDebugString + function. + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + + Default constructor. + + + + + + Write the logging event to the output debug string API + + the event to log + + + Write the logging event to the output debug string API + + + + + + Stub for OutputDebugString native method + + the string to output + + + Stub for OutputDebugString native method + + + + + + This appender requires a to be set. + + true + + + This appender requires a to be set. + + + + + + Logs events to a remote syslog daemon. + + + + The BSD syslog protocol is used to remotely log to + a syslog daemon. The syslogd listens for for messages + on UDP port 514. + + + The syslog UDP protocol is not authenticated. Most syslog daemons + do not accept remote log messages because of the security implications. + You may be able to use the LocalSyslogAppender to talk to a local + syslog service. + + + There is an RFC 3164 that claims to document the BSD Syslog Protocol. + This RFC can be seen here: http://www.faqs.org/rfcs/rfc3164.html. + This appender generates what the RFC calls an "Original Device Message", + i.e. does not include the TIMESTAMP or HOSTNAME fields. By observation + this format of message will be accepted by all current syslog daemon + implementations. The daemon will attach the current time and the source + hostname or IP address to any messages received. + + + Syslog messages must have a facility and and a severity. The severity + is derived from the Level of the logging event. + The facility must be chosen from the set of defined syslog + values. The facilities list is predefined + and cannot be extended. + + + An identifier is specified with each log message. This can be specified + by setting the property. The identity (also know + as the tag) must not contain white space. The default value for the + identity is the application name (from ). + + + Rob Lyon + Nicko Cadell + + + + Sends logging events as connectionless UDP datagrams to a remote host or a + multicast group using an . + + + + UDP guarantees neither that messages arrive, nor that they arrive in the correct order. + + + To view the logging results, a custom application can be developed that listens for logging + events. + + + When decoding events send via this appender remember to use the same encoding + to decode the events as was used to send the events. See the + property to specify the encoding to use. + + + + This example shows how to log receive logging events that are sent + on IP address 244.0.0.1 and port 8080 to the console. The event is + encoded in the packet as a unicode string and it is decoded as such. + + IPEndPoint remoteEndPoint = new IPEndPoint(IPAddress.Any, 0); + UdpClient udpClient; + byte[] buffer; + string loggingEvent; + + try + { + udpClient = new UdpClient(8080); + + while(true) + { + buffer = udpClient.Receive(ref remoteEndPoint); + loggingEvent = System.Text.Encoding.Unicode.GetString(buffer); + Console.WriteLine(loggingEvent); + } + } + catch(Exception e) + { + Console.WriteLine(e.ToString()); + } + + + Dim remoteEndPoint as IPEndPoint + Dim udpClient as UdpClient + Dim buffer as Byte() + Dim loggingEvent as String + + Try + remoteEndPoint = new IPEndPoint(IPAddress.Any, 0) + udpClient = new UdpClient(8080) + + While True + buffer = udpClient.Receive(ByRef remoteEndPoint) + loggingEvent = System.Text.Encoding.Unicode.GetString(buffer) + Console.WriteLine(loggingEvent) + Wend + Catch e As Exception + Console.WriteLine(e.ToString()) + End Try + + + An example configuration section to log information using this appender to the + IP 224.0.0.1 on port 8080: + + + + + + + + + + Gert Driesen + Nicko Cadell + + + + Initializes a new instance of the class. + + + The default constructor initializes all fields to their default values. + + + + + Initialize the appender based on the options set. + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + The appender will be ignored if no was specified or + an invalid remote or local TCP port number was specified. + + + The required property was not specified. + The TCP port number assigned to or is less than or greater than . + + + + This method is called by the method. + + The event to log. + + + Sends the event using an UDP datagram. + + + Exceptions are passed to the . + + + + + + Closes the UDP connection and releases all resources associated with + this instance. + + + + Disables the underlying and releases all managed + and unmanaged resources associated with the . + + + + + + Initializes the underlying connection. + + + + The underlying is initialized and binds to the + port number from which you intend to communicate. + + + Exceptions are passed to the . + + + + + + The IP address of the remote host or multicast group to which + the logging event will be sent. + + + + + The TCP port number of the remote host or multicast group to + which the logging event will be sent. + + + + + The cached remote endpoint to which the logging events will be sent. + + + + + The TCP port number from which the will communicate. + + + + + The instance that will be used for sending the + logging events. + + + + + The encoding to use for the packet. + + + + + Gets or sets the IP address of the remote host or multicast group to which + the underlying should sent the logging event. + + + The IP address of the remote host or multicast group to which the logging event + will be sent. + + + + Multicast addresses are identified by IP class D addresses (in the range 224.0.0.0 to + 239.255.255.255). Multicast packets can pass across different networks through routers, so + it is possible to use multicasts in an Internet scenario as long as your network provider + supports multicasting. + + + Hosts that want to receive particular multicast messages must register their interest by joining + the multicast group. Multicast messages are not sent to networks where no host has joined + the multicast group. Class D IP addresses are used for multicast groups, to differentiate + them from normal host addresses, allowing nodes to easily detect if a message is of interest. + + + Static multicast addresses that are needed globally are assigned by IANA. A few examples are listed in the table below: + + + + + IP Address + Description + + + 224.0.0.1 + + + Sends a message to all system on the subnet. + + + + + 224.0.0.2 + + + Sends a message to all routers on the subnet. + + + + + 224.0.0.12 + + + The DHCP server answers messages on the IP address 224.0.0.12, but only on a subnet. + + + + + + + A complete list of actually reserved multicast addresses and their owners in the ranges + defined by RFC 3171 can be found at the IANA web site. + + + The address range 239.0.0.0 to 239.255.255.255 is reserved for administrative scope-relative + addresses. These addresses can be reused with other local groups. Routers are typically + configured with filters to prevent multicast traffic in this range from flowing outside + of the local network. + + + + + + Gets or sets the TCP port number of the remote host or multicast group to which + the underlying should sent the logging event. + + + An integer value in the range to + indicating the TCP port number of the remote host or multicast group to which the logging event + will be sent. + + + The underlying will send messages to this TCP port number + on the remote host or multicast group. + + The value specified is less than or greater than . + + + + Gets or sets the TCP port number from which the underlying will communicate. + + + An integer value in the range to + indicating the TCP port number from which the underlying will communicate. + + + + The underlying will bind to this port for sending messages. + + + Setting the value to 0 (the default) will cause the udp client not to bind to + a local port. + + + The value specified is less than or greater than . + + + + Gets or sets used to write the packets. + + + The used to write the packets. + + + + The used to write the packets. + + + + + + Gets or sets the underlying . + + + The underlying . + + + creates a to send logging events + over a network. Classes deriving from can use this + property to get or set this . Use the underlying + returned from if you require access beyond that which + provides. + + + + + Gets or sets the cached remote endpoint to which the logging events should be sent. + + + The cached remote endpoint to which the logging events will be sent. + + + The method will initialize the remote endpoint + with the values of the and + properties. + + + + + This appender requires a to be set. + + true + + + This appender requires a to be set. + + + + + + Syslog port 514 + + + + + Initializes a new instance of the class. + + + This instance of the class is set up to write + to a remote syslog daemon. + + + + + Add a mapping of level to severity + + The mapping to add + + + Add a mapping to this appender. + + + + + + This method is called by the method. + + The event to log. + + + Writes the event to a remote syslog daemon. + + + The format of the output will depend on the appender's layout. + + + + + + Initialize the options for this appender + + + + Initialize the level to syslog severity mappings set on this appender. + + + + + + Translates a log4net level to a syslog severity. + + A log4net level. + A syslog severity. + + + Translates a log4net level to a syslog severity. + + + + + + Generate a syslog priority. + + The syslog facility. + The syslog severity. + A syslog priority. + + + Generate a syslog priority. + + + + + + The facility. The default facility is . + + + + + The message identity + + + + + Mapping from level object to syslog severity + + + + + Message identity + + + + An identifier is specified with each log message. This can be specified + by setting the property. The identity (also know + as the tag) must not contain white space. The default value for the + identity is the application name (from ). + + + + + + Syslog facility + + + Set to one of the values. The list of + facilities is predefined and cannot be extended. The default value + is . + + + + + syslog severities + + + + The syslog severities. + + + + + + system is unusable + + + + + action must be taken immediately + + + + + critical conditions + + + + + error conditions + + + + + warning conditions + + + + + normal but significant condition + + + + + informational + + + + + debug-level messages + + + + + syslog facilities + + + + The syslog facilities + + + + + + kernel messages + + + + + random user-level messages + + + + + mail system + + + + + system daemons + + + + + security/authorization messages + + + + + messages generated internally by syslogd + + + + + line printer subsystem + + + + + network news subsystem + + + + + UUCP subsystem + + + + + clock (cron/at) daemon + + + + + security/authorization messages (private) + + + + + ftp daemon + + + + + NTP subsystem + + + + + log audit + + + + + log alert + + + + + clock daemon + + + + + reserved for local use + + + + + reserved for local use + + + + + reserved for local use + + + + + reserved for local use + + + + + reserved for local use + + + + + reserved for local use + + + + + reserved for local use + + + + + reserved for local use + + + + + A class to act as a mapping between the level that a logging call is made at and + the syslog severity that is should be logged at. + + + + A class to act as a mapping between the level that a logging call is made at and + the syslog severity that is should be logged at. + + + + + + The mapped syslog severity for the specified level + + + + Required property. + The mapped syslog severity for the specified level + + + + + + Delivers logging events to a remote logging sink. + + + + This Appender is designed to deliver events to a remote sink. + That is any object that implements the + interface. It delivers the events using .NET remoting. The + object to deliver events to is specified by setting the + appenders property. + + The RemotingAppender buffers events before sending them. This allows it to + make more efficient use of the remoting infrastructure. + + Once the buffer is full the events are still not sent immediately. + They are scheduled to be sent using a pool thread. The effect is that + the send occurs asynchronously. This is very important for a + number of non obvious reasons. The remoting infrastructure will + flow thread local variables (stored in the ), + if they are marked as , across the + remoting boundary. If the server is not contactable then + the remoting infrastructure will clear the + objects from the . To prevent a logging failure from + having side effects on the calling application the remoting call must be made + from a separate thread to the one used by the application. A + thread is used for this. If no thread is available then + the events will block in the thread pool manager until a thread is available. + + Because the events are sent asynchronously using pool threads it is possible to close + this appender before all the queued events have been sent. + When closing the appender attempts to wait until all the queued events have been sent, but + this will timeout after 30 seconds regardless. + + If this appender is being closed because the + event has fired it may not be possible to send all the queued events. During process + exit the runtime limits the time that a + event handler is allowed to run for. If the runtime terminates the threads before + the queued events have been sent then they will be lost. To ensure that all events + are sent the appender must be closed before the application exits. See + for details on how to shutdown + log4net programmatically. + + + Nicko Cadell + Gert Driesen + Daniel Cazzulino + + + + Initializes a new instance of the class. + + + + Default constructor. + + + + + + Initialize the appender based on the options set + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Send the contents of the buffer to the remote sink. + + + The events are not sent immediately. They are scheduled to be sent + using a pool thread. The effect is that the send occurs asynchronously. + This is very important for a number of non obvious reasons. The remoting + infrastructure will flow thread local variables (stored in the ), + if they are marked as , across the + remoting boundary. If the server is not contactable then + the remoting infrastructure will clear the + objects from the . To prevent a logging failure from + having side effects on the calling application the remoting call must be made + from a separate thread to the one used by the application. A + thread is used for this. If no thread is available then + the events will block in the thread pool manager until a thread is available. + + The events to send. + + + + Override base class close. + + + + This method waits while there are queued work items. The events are + sent asynchronously using work items. These items + will be sent once a thread pool thread is available to send them, therefore + it is possible to close the appender before all the queued events have been + sent. + + This method attempts to wait until all the queued events have been sent, but this + method will timeout after 30 seconds regardless. + + If the appender is being closed because the + event has fired it may not be possible to send all the queued events. During process + exit the runtime limits the time that a + event handler is allowed to run for. + + + + + A work item is being queued into the thread pool + + + + + A work item from the thread pool has completed + + + + + Send the contents of the buffer to the remote sink. + + + This method is designed to be used with the . + This method expects to be passed an array of + objects in the state param. + + the logging events to send + + + + The URL of the remote sink. + + + + + The local proxy (.NET remoting) for the remote logging sink. + + + + + The number of queued callbacks currently waiting or executing + + + + + Event used to signal when there are no queued work items + + + This event is set when there are no queued work items. In this + state it is safe to close the appender. + + + + + Gets or sets the URL of the well-known object that will accept + the logging events. + + + The well-known URL of the remote sink. + + + + The URL of the remoting sink that will accept logging events. + The sink must implement the + interface. + + + + + + Interface used to deliver objects to a remote sink. + + + This interface must be implemented by a remoting sink + if the is to be used + to deliver logging events to the sink. + + + + + Delivers logging events to the remote sink + + Array of events to log. + + + Delivers logging events to the remote sink + + + + + + Appender that rolls log files based on size or date or both. + + + + RollingFileAppender can roll log files based on size or date or both + depending on the setting of the property. + When set to the log file will be rolled + once its size exceeds the . + When set to the log file will be rolled + once the date boundary specified in the property + is crossed. + When set to the log file will be + rolled once the date boundary specified in the property + is crossed, but within a date boundary the file will also be rolled + once its size exceeds the . + When set to the log file will be rolled when + the appender is configured. This effectively means that the log file can be + rolled once per program execution. + + + A of few additional optional features have been added: + + Attach date pattern for current log file + Backup number increments for newer files + Infinite number of backups by file size + + + + + + For large or infinite numbers of backup files a + greater than zero is highly recommended, otherwise all the backup files need + to be renamed each time a new backup is created. + + + When Date/Time based rolling is used setting + to will reduce the number of file renamings to few or none. + + + + + + Changing or without clearing + the log file directory of backup files will cause unexpected and unwanted side effects. + + + + + If Date/Time based rolling is enabled this appender will attempt to roll existing files + in the directory without a Date/Time tag based on the last write date of the base log file. + The appender only rolls the log file when a message is logged. If Date/Time based rolling + is enabled then the appender will not roll the log file at the Date/Time boundary but + at the point when the next message is logged after the boundary has been crossed. + + + + The extends the and + has the same behavior when opening the log file. + The appender will first try to open the file for writing when + is called. This will typically be during configuration. + If the file cannot be opened for writing the appender will attempt + to open the file again each time a message is logged to the appender. + If the file cannot be opened for writing when a message is logged then + the message will be discarded by this appender. + + + When rolling a backup file necessitates deleting an older backup file the + file to be deleted is moved to a temporary name before being deleted. + + + + + A maximum number of backup files when rolling on date/time boundaries is not supported. + + + + Nicko Cadell + Gert Driesen + Aspi Havewala + Douglas de la Torre + Edward Smit + + + + Initializes a new instance of the class. + + + + Default constructor. + + + + + + Sets the quiet writer being used. + + + This method can be overridden by sub classes. + + the writer to set + + + + Write out a logging event. + + the event to write to file. + + + Handles append time behavior for RollingFileAppender. This checks + if a roll over either by date (checked first) or time (checked second) + is need and then appends to the file last. + + + + + + Write out an array of logging events. + + the events to write to file. + + + Handles append time behavior for RollingFileAppender. This checks + if a roll over either by date (checked first) or time (checked second) + is need and then appends to the file last. + + + + + + Performs any required rolling before outputting the next event + + + + Handles append time behavior for RollingFileAppender. This checks + if a roll over either by date (checked first) or time (checked second) + is need and then appends to the file last. + + + + + + Creates and opens the file for logging. If + is false then the fully qualified name is determined and used. + + the name of the file to open + true to append to existing file + + This method will ensure that the directory structure + for the specified exists. + + + + + Get the current output file name + + the base file name + the output file name + + The output file name is based on the base fileName specified. + If is set then the output + file name is the same as the base file passed in. Otherwise + the output file depends on the date pattern, on the count + direction or both. + + + + + Determines curSizeRollBackups (only within the current roll point) + + + + + Generates a wildcard pattern that can be used to find all files + that are similar to the base file name. + + + + + + + Builds a list of filenames for all files matching the base filename plus a file + pattern. + + + + + + + Initiates a roll over if needed for crossing a date boundary since the last run. + + + + + Initializes based on existing conditions at time of . + + + + Initializes based on existing conditions at time of . + The following is done + + determine curSizeRollBackups (only within the current roll point) + initiates a roll over if needed for crossing a date boundary since the last run. + + + + + + + Does the work of bumping the 'current' file counter higher + to the highest count when an incremental file name is seen. + The highest count is either the first file (when count direction + is greater than 0) or the last file (when count direction less than 0). + In either case, we want to know the highest count that is present. + + + + + + + Takes a list of files and a base file name, and looks for + 'incremented' versions of the base file. Bumps the max + count up to the highest count seen. + + + + + + + Calculates the RollPoint for the datePattern supplied. + + the date pattern to calculate the check period for + The RollPoint that is most accurate for the date pattern supplied + + Essentially the date pattern is examined to determine what the + most suitable roll point is. The roll point chosen is the roll point + with the smallest period that can be detected using the date pattern + supplied. i.e. if the date pattern only outputs the year, month, day + and hour then the smallest roll point that can be detected would be + and hourly roll point as minutes could not be detected. + + + + + Initialize the appender based on the options set + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + Sets initial conditions including date/time roll over information, first check, + scheduledFilename, and calls to initialize + the current number of backups. + + + + + + Rollover the file(s) to date/time tagged file(s). + + set to true if the file to be rolled is currently open + + + Rollover the file(s) to date/time tagged file(s). + Resets curSizeRollBackups. + If fileIsOpen is set then the new file is opened (through SafeOpenFile). + + + + + + Renames file to file . + + Name of existing file to roll. + New name for file. + + + Renames file to file . It + also checks for existence of target file and deletes if it does. + + + + + + Test if a file exists at a specified path + + the path to the file + true if the file exists + + + Test if a file exists at a specified path + + + + + + Deletes the specified file if it exists. + + The file to delete. + + + Delete a file if is exists. + The file is first moved to a new filename then deleted. + This allows the file to be removed even when it cannot + be deleted, but it still can be moved. + + + + + + Implements file roll base on file size. + + + + If the maximum number of size based backups is reached + (curSizeRollBackups == maxSizeRollBackups) then the oldest + file is deleted -- its index determined by the sign of countDirection. + If countDirection < 0, then files + {File.1, ..., File.curSizeRollBackups -1} + are renamed to {File.2, ..., + File.curSizeRollBackups}. Moreover, File is + renamed File.1 and closed. + + + A new file is created to receive further log output. + + + If maxSizeRollBackups is equal to zero, then the + File is truncated with no backup files created. + + + If maxSizeRollBackups < 0, then File is + renamed if needed and no files are deleted. + + + + + + Implements file roll. + + the base name to rename + + + If the maximum number of size based backups is reached + (curSizeRollBackups == maxSizeRollBackups) then the oldest + file is deleted -- its index determined by the sign of countDirection. + If countDirection < 0, then files + {File.1, ..., File.curSizeRollBackups -1} + are renamed to {File.2, ..., + File.curSizeRollBackups}. + + + If maxSizeRollBackups is equal to zero, then the + File is truncated with no backup files created. + + + If maxSizeRollBackups < 0, then File is + renamed if needed and no files are deleted. + + + This is called by to rename the files. + + + + + + Get the start time of the next window for the current rollpoint + + the current date + the type of roll point we are working with + the start time for the next roll point an interval after the currentDateTime date + + + Returns the date of the next roll point after the currentDateTime date passed to the method. + + + The basic strategy is to subtract the time parts that are less significant + than the rollpoint from the current time. This should roll the time back to + the start of the time window for the current rollpoint. Then we add 1 window + worth of time and get the start time of the next window for the rollpoint. + + + + + + This object supplies the current date/time. Allows test code to plug in + a method to control this class when testing date/time based rolling. + + + + + The date pattern. By default, the pattern is set to ".yyyy-MM-dd" + meaning daily rollover. + + + + + The actual formatted filename that is currently being written to + or will be the file transferred to on roll over + (based on staticLogFileName). + + + + + The timestamp when we shall next recompute the filename. + + + + + Holds date of last roll over + + + + + The type of rolling done + + + + + The default maximum file size is 10MB + + + + + There is zero backup files by default + + + + + How many sized based backups have been made so far + + + + + The rolling file count direction. + + + + + The rolling mode used in this appender. + + + + + Cache flag set if we are rolling by date. + + + + + Cache flag set if we are rolling by size. + + + + + Value indicating whether to always log to the same file. + + + + + FileName provided in configuration. Used for rolling properly + + + + + The 1st of January 1970 in UTC + + + + + Gets or sets the date pattern to be used for generating file names + when rolling over on date. + + + The date pattern to be used for generating file names when rolling + over on date. + + + + Takes a string in the same format as expected by + . + + + This property determines the rollover schedule when rolling over + on date. + + + + + + Gets or sets the maximum number of backup files that are kept before + the oldest is erased. + + + The maximum number of backup files that are kept before the oldest is + erased. + + + + If set to zero, then there will be no backup files and the log file + will be truncated when it reaches . + + + If a negative number is supplied then no deletions will be made. Note + that this could result in very slow performance as a large number of + files are rolled over unless is used. + + + The maximum applies to each time based group of files and + not the total. + + + + + + Gets or sets the maximum size that the output file is allowed to reach + before being rolled over to backup files. + + + The maximum size in bytes that the output file is allowed to reach before being + rolled over to backup files. + + + + This property is equivalent to except + that it is required for differentiating the setter taking a + argument from the setter taking a + argument. + + + The default maximum file size is 10MB (10*1024*1024). + + + + + + Gets or sets the maximum size that the output file is allowed to reach + before being rolled over to backup files. + + + The maximum size that the output file is allowed to reach before being + rolled over to backup files. + + + + This property allows you to specify the maximum size with the + suffixes "KB", "MB" or "GB" so that the size is interpreted being + expressed respectively in kilobytes, megabytes or gigabytes. + + + For example, the value "10KB" will be interpreted as 10240 bytes. + + + The default maximum file size is 10MB. + + + If you have the option to set the maximum file size programmatically + consider using the property instead as this + allows you to set the size in bytes as a . + + + + + + Gets or sets the rolling file count direction. + + + The rolling file count direction. + + + + Indicates if the current file is the lowest numbered file or the + highest numbered file. + + + By default newer files have lower numbers ( < 0), + i.e. log.1 is most recent, log.5 is the 5th backup, etc... + + + >= 0 does the opposite i.e. + log.1 is the first backup made, log.5 is the 5th backup made, etc. + For infinite backups use >= 0 to reduce + rollover costs. + + The default file count direction is -1. + + + + + Gets or sets the rolling style. + + The rolling style. + + + The default rolling style is . + + + When set to this appender's + property is set to false, otherwise + the appender would append to a single file rather than rolling + the file each time it is opened. + + + + + + Gets or sets a value indicating whether to always log to + the same file. + + + true if always should be logged to the same file, otherwise false. + + + + By default file.log is always the current file. Optionally + file.log.yyyy-mm-dd for current formatted datePattern can by the currently + logging file (or file.log.curSizeRollBackup or even + file.log.yyyy-mm-dd.curSizeRollBackup). + + + This will make time based rollovers with a large number of backups + much faster as the appender it won't have to rename all the backups! + + + + + + Style of rolling to use + + + + Style of rolling to use + + + + + + Roll files once per program execution + + + + Roll files once per program execution. + Well really once each time this appender is + configured. + + + Setting this option also sets AppendToFile to + false on the RollingFileAppender, otherwise + this appender would just be a normal file appender. + + + + + + Roll files based only on the size of the file + + + + + Roll files based only on the date + + + + + Roll files based on both the size and date of the file + + + + + The code assumes that the following 'time' constants are in a increasing sequence. + + + + The code assumes that the following 'time' constants are in a increasing sequence. + + + + + + Roll the log not based on the date + + + + + Roll the log for each minute + + + + + Roll the log for each hour + + + + + Roll the log twice a day (midday and midnight) + + + + + Roll the log each day (midnight) + + + + + Roll the log each week + + + + + Roll the log each month + + + + + This interface is used to supply Date/Time information to the . + + + This interface is used to supply Date/Time information to the . + Used primarily to allow test classes to plug themselves in so they can + supply test date/times. + + + + + Gets the current time. + + The current time. + + + Gets the current time. + + + + + + Default implementation of that returns the current time. + + + + + Gets the current time. + + The current time. + + + Gets the current time. + + + + + + Send an e-mail when a specific logging event occurs, typically on errors + or fatal errors. + + + + The number of logging events delivered in this e-mail depend on + the value of option. The + keeps only the last + logging events in its + cyclic buffer. This keeps memory requirements at a reasonable level while + still delivering useful application context. + + + Authentication and setting the server Port are only available on the MS .NET 1.1 runtime. + For these features to be enabled you need to ensure that you are using a version of + the log4net assembly that is built against the MS .NET 1.1 framework and that you are + running the your application on the MS .NET 1.1 runtime. On all other platforms only sending + unauthenticated messages to a server listening on port 25 (the default) is supported. + + + Authentication is supported by setting the property to + either or . + If using authentication then the + and properties must also be set. + + + To set the SMTP server port use the property. The default port is 25. + + + Nicko Cadell + Gert Driesen + + + + Default constructor + + + + Default constructor + + + + + + Sends the contents of the cyclic buffer as an e-mail message. + + The logging events to send. + + + + Send the email message + + the body text to include in the mail + + + + Gets or sets a semicolon-delimited list of recipient e-mail addresses. + + + A semicolon-delimited list of e-mail addresses. + + + + A semicolon-delimited list of recipient e-mail addresses. + + + + + + Gets or sets the e-mail address of the sender. + + + The e-mail address of the sender. + + + + The e-mail address of the sender. + + + + + + Gets or sets the subject line of the e-mail message. + + + The subject line of the e-mail message. + + + + The subject line of the e-mail message. + + + + + + Gets or sets the name of the SMTP relay mail server to use to send + the e-mail messages. + + + The name of the e-mail relay server. If SmtpServer is not set, the + name of the local SMTP server is used. + + + + The name of the e-mail relay server. If SmtpServer is not set, the + name of the local SMTP server is used. + + + + + + Obsolete + + + Use the BufferingAppenderSkeleton Fix methods instead + + + + Obsolete property. + + + + + + The mode to use to authentication with the SMTP server + + + Authentication is only available on the MS .NET 1.1 runtime. + + Valid Authentication mode values are: , + , and . + The default value is . When using + you must specify the + and to use to authenticate. + When using the Windows credentials for the current + thread, if impersonating, or the process will be used to authenticate. + + + + + + The username to use to authenticate with the SMTP server + + + Authentication is only available on the MS .NET 1.1 runtime. + + A and must be specified when + is set to , + otherwise the username will be ignored. + + + + + + The password to use to authenticate with the SMTP server + + + Authentication is only available on the MS .NET 1.1 runtime. + + A and must be specified when + is set to , + otherwise the password will be ignored. + + + + + + The port on which the SMTP server is listening + + + Server Port is only available on the MS .NET 1.1 runtime. + + The port on which the SMTP server is listening. The default + port is 25. The Port can only be changed when running on + the MS .NET 1.1 runtime. + + + + + + Gets or sets the priority of the e-mail message + + + One of the values. + + + + Sets the priority of the e-mails generated by this + appender. The default priority is . + + + If you are using this appender to report errors then + you may want to set the priority to . + + + + + + This appender requires a to be set. + + true + + + This appender requires a to be set. + + + + + + Values for the property. + + + + SMTP authentication modes. + + + + + + No authentication + + + + + Basic authentication. + + + Requires a username and password to be supplied + + + + + Integrated authentication + + + Uses the Windows credentials from the current thread or process to authenticate. + + + + + Send an email when a specific logging event occurs, typically on errors + or fatal errors. Rather than sending via smtp it writes a file into the + directory specified by . This allows services such + as the IIS SMTP agent to manage sending the messages. + + + + The configuration for this appender is identical to that of the SMTPAppender, + except that instead of specifying the SMTPAppender.SMTPHost you specify + . + + + The number of logging events delivered in this e-mail depend on + the value of option. The + keeps only the last + logging events in its + cyclic buffer. This keeps memory requirements at a reasonable level while + still delivering useful application context. + + + Niall Daley + Nicko Cadell + + + + Default constructor + + + + Default constructor + + + + + + Sends the contents of the cyclic buffer as an e-mail message. + + The logging events to send. + + + Sends the contents of the cyclic buffer as an e-mail message. + + + + + + Activate the options on this appender. + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Convert a path into a fully qualified path. + + The path to convert. + The fully qualified path. + + + Converts the path specified to a fully + qualified path. If the path is relative it is + taken as relative from the application base + directory. + + + + + + The security context to use for privileged calls + + + + + Gets or sets a semicolon-delimited list of recipient e-mail addresses. + + + A semicolon-delimited list of e-mail addresses. + + + + A semicolon-delimited list of e-mail addresses. + + + + + + Gets or sets the e-mail address of the sender. + + + The e-mail address of the sender. + + + + The e-mail address of the sender. + + + + + + Gets or sets the subject line of the e-mail message. + + + The subject line of the e-mail message. + + + + The subject line of the e-mail message. + + + + + + Gets or sets the path to write the messages to. + + + + Gets or sets the path to write the messages to. This should be the same + as that used by the agent sending the messages. + + + + + + Gets or sets the used to write to the pickup directory. + + + The used to write to the pickup directory. + + + + Unless a specified here for this appender + the is queried for the + security context to use. The default behavior is to use the security context + of the current thread. + + + + + + This appender requires a to be set. + + true + + + This appender requires a to be set. + + + + + + Appender that allows clients to connect via Telnet to receive log messages + + + + The TelnetAppender accepts socket connections and streams logging messages + back to the client. + The output is provided in a telnet-friendly way so that a log can be monitored + over a TCP/IP socket. + This allows simple remote monitoring of application logging. + + + The default is 23 (the telnet port). + + + Keith Long + Nicko Cadell + + + + Default constructor + + + + Default constructor + + + + + + Overrides the parent method to close the socket handler + + + + Closes all the outstanding connections. + + + + + + Initialize the appender based on the options set. + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + Create the socket handler and wait for connections + + + + + + Writes the logging event to each connected client. + + The event to log. + + + Writes the logging event to each connected client. + + + + + + Gets or sets the TCP port number on which this will listen for connections. + + + An integer value in the range to + indicating the TCP port number on which this will listen for connections. + + + + The default value is 23 (the telnet port). + + + The value specified is less than + or greater than . + + + + This appender requires a to be set. + + true + + + This appender requires a to be set. + + + + + + Helper class to manage connected clients + + + + The SocketHandler class is used to accept connections from + clients. It is threaded so that clients can connect/disconnect + asynchronously. + + + + + + Opens a new server port on + + the local port to listen on for connections + + + Creates a socket handler on the specified local server port. + + + + + + Sends a string message to each of the connected clients + + the text to send + + + Sends a string message to each of the connected clients + + + + + + Add a client to the internal clients list + + client to add + + + + Remove a client from the internal clients list + + client to remove + + + + Callback used to accept a connection on the server socket + + The result of the asynchronous operation + + + On connection adds to the list of connections + if there are two many open connections you will be disconnected + + + + + + Close all network connections + + + + Make sure we close all network connections + + + + + + Test if this handler has active connections + + + true if this handler has active connections + + + + This property will be true while this handler has + active connections, that is at least one connection that + the handler will attempt to send a message to. + + + + + + Class that represents a client connected to this handler + + + + Class that represents a client connected to this handler + + + + + + Create this for the specified + + the client's socket + + + Opens a stream writer on the socket. + + + + + + Write a string to the client + + string to send + + + Write a string to the client + + + + + + Cleanup the clients connection + + + + Close the socket connection. + + + + + + Appends log events to the system. + + + + The application configuration file can be used to control what listeners + are actually used. See the MSDN documentation for the + class for details on configuring the + trace system. + + + Events are written using the System.Diagnostics.Trace.Write(string,string) + method. The event's logger name is passed as the value for the category name to the Write method. + + + Compact Framework
+ The Compact Framework does not support the + class for any operation except Assert. When using the Compact Framework this + appender will write to the system rather than + the Trace system. This appender will therefore behave like the . +
+
+ Douglas de la Torre + Nicko Cadell + Gert Driesen +
+ + + Initializes a new instance of the . + + + + Default constructor. + + + + + + Initializes a new instance of the + with a specified layout. + + The layout to use with this appender. + + + Obsolete constructor. + + + + + + Writes the logging event to the system. + + The event to log. + + + Writes the logging event to the system. + + + + + + Immediate flush means that the underlying writer or output stream + will be flushed at the end of each append operation. + + + + Immediate flush is slower but ensures that each append request is + actually written. If is set to + false, then there is a good chance that the last few + logs events are not actually written to persistent media if and + when the application crashes. + + + The default value is true. + + + + + Gets or sets a value that indicates whether the appender will + flush at the end of each write. + + + The default behavior is to flush at the end of each + write. If the option is set tofalse, then the underlying + stream can defer writing to physical medium to a later time. + + + Avoiding the flush operation at the end of each append results + in a performance gain of 10 to 20 percent. However, there is safety + trade-off involved in skipping flushing. Indeed, when flushing is + skipped, then it is likely that the last few log events will not + be recorded on disk when the application exits. This is a high + price to pay even for a 20% performance gain. + + + + + + This appender requires a to be set. + + true + + + This appender requires a to be set. + + + + + + Assembly level attribute that specifies a domain to alias to this assembly's repository. + + + + AliasDomainAttribute is obsolete. Use AliasRepositoryAttribute instead of AliasDomainAttribute. + + + An assembly's logger repository is defined by its , + however this can be overridden by an assembly loaded before the target assembly. + + + An assembly can alias another assembly's domain to its repository by + specifying this attribute with the name of the target domain. + + + This attribute can only be specified on the assembly and may be used + as many times as necessary to alias all the required domains. + + + Nicko Cadell + Gert Driesen + + + + Assembly level attribute that specifies a repository to alias to this assembly's repository. + + + + An assembly's logger repository is defined by its , + however this can be overridden by an assembly loaded before the target assembly. + + + An assembly can alias another assembly's repository to its repository by + specifying this attribute with the name of the target repository. + + + This attribute can only be specified on the assembly and may be used + as many times as necessary to alias all the required repositories. + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class with + the specified repository to alias to this assembly's repository. + + The repository to alias to this assemby's repository. + + + Initializes a new instance of the class with + the specified repository to alias to this assembly's repository. + + + + + + Gets or sets the repository to alias to this assemby's repository. + + + The repository to alias to this assemby's repository. + + + + The name of the repository to alias to this assemby's repository. + + + + + + Initializes a new instance of the class with + the specified domain to alias to this assembly's repository. + + The domain to alias to this assemby's repository. + + + Obsolete. Use instead of . + + + + + + Use this class to quickly configure a . + + + + Allows very simple programmatic configuration of log4net. + + + Only one appender can be configured using this configurator. + The appender is set at the root of the hierarchy and all logging + events will be delivered to that appender. + + + Appenders can also implement the interface. Therefore + they would require that the method + be called after the appenders properties have been configured. + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + + Uses a private access modifier to prevent instantiation of this class. + + + + + + Initializes the log4net system with a default configuration. + + + + Initializes the log4net logging system using a + that will write to Console.Out. The log messages are + formatted using the layout object + with the + layout style. + + + + + + Initializes the log4net system using the specified appender. + + The appender to use to log all logging events. + + + Initializes the log4net system using the specified appender. + + + + + + Initializes the with a default configuration. + + The repository to configure. + + + Initializes the specified repository using a + that will write to Console.Out. The log messages are + formatted using the layout object + with the + layout style. + + + + + + Initializes the using the specified appender. + + The repository to configure. + The appender to use to log all logging events. + + + Initializes the using the specified appender. + + + + + + Base class for all log4net configuration attributes. + + + This is an abstract class that must be extended by + specific configurators. This attribute allows the + configurator to be parameterized by an assembly level + attribute. + + Nicko Cadell + Gert Driesen + + + + Constructor used by subclasses. + + the ordering priority for this configurator + + + The is used to order the configurator + attributes before they are invoked. Higher priority configurators are executed + before lower priority ones. + + + + + + Configures the for the specified assembly. + + The assembly that this attribute was defined on. + The repository to configure. + + + Abstract method implemented by a subclass. When this method is called + the subclass should configure the . + + + + + + Compare this instance to another ConfiguratorAttribute + + the object to compare to + see + + + Compares the priorities of the two instances. + Sorts by priority in descending order. Objects with the same priority are + randomly ordered. + + + + + + Assembly level attribute that specifies the logging domain for the assembly. + + + + DomainAttribute is obsolete. Use RepositoryAttribute instead of DomainAttribute. + + + Assemblies are mapped to logging domains. Each domain has its own + logging repository. This attribute specified on the assembly controls + the configuration of the domain. The property specifies the name + of the domain that this assembly is a part of. The + specifies the type of the repository objects to create for the domain. If + this attribute is not specified and a is not specified + then the assembly will be part of the default shared logging domain. + + + This attribute can only be specified on the assembly and may only be used + once per assembly. + + + Nicko Cadell + Gert Driesen + + + + Assembly level attribute that specifies the logging repository for the assembly. + + + + Assemblies are mapped to logging repository. This attribute specified + on the assembly controls + the configuration of the repository. The property specifies the name + of the repository that this assembly is a part of. The + specifies the type of the object + to create for the assembly. If this attribute is not specified or a + is not specified then the assembly will be part of the default shared logging repository. + + + This attribute can only be specified on the assembly and may only be used + once per assembly. + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + + Default constructor. + + + + + + Initialize a new instance of the class + with the name of the repository. + + The name of the repository. + + + Initialize the attribute with the name for the assembly's repository. + + + + + + Gets or sets the name of the logging repository. + + + The string name to use as the name of the repository associated with this + assembly. + + + + This value does not have to be unique. Several assemblies can share the + same repository. They will share the logging configuration of the repository. + + + + + + Gets or sets the type of repository to create for this assembly. + + + The type of repository to create for this assembly. + + + + The type of the repository to create for the assembly. + The type must implement the + interface. + + + This will be the type of repository created when + the repository is created. If multiple assemblies reference the + same repository then the repository is only created once using the + of the first assembly to call into the + repository. + + + + + + Initializes a new instance of the class. + + + + Obsolete. Use RepositoryAttribute instead of DomainAttribute. + + + + + + Initialize a new instance of the class + with the name of the domain. + + The name of the domain. + + + Obsolete. Use RepositoryAttribute instead of DomainAttribute. + + + + + + Use this class to initialize the log4net environment using an Xml tree. + + + + DOMConfigurator is obsolete. Use XmlConfigurator instead of DOMConfigurator. + + + Configures a using an Xml tree. + + + Nicko Cadell + Gert Driesen + + + + Private constructor + + + + + Automatically configures the log4net system based on the + application's configuration settings. + + + + DOMConfigurator is obsolete. Use XmlConfigurator instead of DOMConfigurator. + + Each application has a configuration file. This has the + same name as the application with '.config' appended. + This file is XML and calling this function prompts the + configurator to look in that file for a section called + log4net that contains the configuration data. + + + + + Automatically configures the using settings + stored in the application's configuration file. + + + + DOMConfigurator is obsolete. Use XmlConfigurator instead of DOMConfigurator. + + Each application has a configuration file. This has the + same name as the application with '.config' appended. + This file is XML and calling this function prompts the + configurator to look in that file for a section called + log4net that contains the configuration data. + + The repository to configure. + + + + Configures log4net using a log4net element + + + + DOMConfigurator is obsolete. Use XmlConfigurator instead of DOMConfigurator. + + Loads the log4net configuration from the XML element + supplied as . + + The element to parse. + + + + Configures the using the specified XML + element. + + + + DOMConfigurator is obsolete. Use XmlConfigurator instead of DOMConfigurator. + + Loads the log4net configuration from the XML element + supplied as . + + The repository to configure. + The element to parse. + + + + Configures log4net using the specified configuration file. + + The XML file to load the configuration from. + + + DOMConfigurator is obsolete. Use XmlConfigurator instead of DOMConfigurator. + + + The configuration file must be valid XML. It must contain + at least one element called log4net that holds + the log4net configuration data. + + + The log4net configuration file can possible be specified in the application's + configuration file (either MyAppName.exe.config for a + normal application on Web.config for an ASP.NET application). + + + The following example configures log4net using a configuration file, of which the + location is stored in the application's configuration file : + + + using log4net.Config; + using System.IO; + using System.Configuration; + + ... + + DOMConfigurator.Configure(new FileInfo(ConfigurationSettings.AppSettings["log4net-config-file"])); + + + In the .config file, the path to the log4net can be specified like this : + + + + + + + + + + + + + Configures log4net using the specified configuration file. + + A stream to load the XML configuration from. + + + DOMConfigurator is obsolete. Use XmlConfigurator instead of DOMConfigurator. + + + The configuration data must be valid XML. It must contain + at least one element called log4net that holds + the log4net configuration data. + + + Note that this method will NOT close the stream parameter. + + + + + + Configures the using the specified configuration + file. + + The repository to configure. + The XML file to load the configuration from. + + + DOMConfigurator is obsolete. Use XmlConfigurator instead of DOMConfigurator. + + + The configuration file must be valid XML. It must contain + at least one element called log4net that holds + the configuration data. + + + The log4net configuration file can possible be specified in the application's + configuration file (either MyAppName.exe.config for a + normal application on Web.config for an ASP.NET application). + + + The following example configures log4net using a configuration file, of which the + location is stored in the application's configuration file : + + + using log4net.Config; + using System.IO; + using System.Configuration; + + ... + + DOMConfigurator.Configure(new FileInfo(ConfigurationSettings.AppSettings["log4net-config-file"])); + + + In the .config file, the path to the log4net can be specified like this : + + + + + + + + + + + + + Configures the using the specified configuration + file. + + The repository to configure. + The stream to load the XML configuration from. + + + DOMConfigurator is obsolete. Use XmlConfigurator instead of DOMConfigurator. + + + The configuration data must be valid XML. It must contain + at least one element called log4net that holds + the configuration data. + + + Note that this method will NOT close the stream parameter. + + + + + + Configures log4net using the file specified, monitors the file for changes + and reloads the configuration if a change is detected. + + The XML file to load the configuration from. + + + DOMConfigurator is obsolete. Use XmlConfigurator instead of DOMConfigurator. + + + The configuration file must be valid XML. It must contain + at least one element called log4net that holds + the configuration data. + + + The configuration file will be monitored using a + and depends on the behavior of that class. + + + For more information on how to configure log4net using + a separate configuration file, see . + + + + + + + Configures the using the file specified, + monitors the file for changes and reloads the configuration if a change + is detected. + + The repository to configure. + The XML file to load the configuration from. + + + DOMConfigurator is obsolete. Use XmlConfigurator instead of DOMConfigurator. + + + The configuration file must be valid XML. It must contain + at least one element called log4net that holds + the configuration data. + + + The configuration file will be monitored using a + and depends on the behavior of that class. + + + For more information on how to configure log4net using + a separate configuration file, see . + + + + + + + Assembly level attribute to configure the . + + + + AliasDomainAttribute is obsolete. Use AliasRepositoryAttribute instead of AliasDomainAttribute. + + + This attribute may only be used at the assembly scope and can only + be used once per assembly. + + + Use this attribute to configure the + without calling one of the + methods. + + + Nicko Cadell + Gert Driesen + + + + Assembly level attribute to configure the . + + + + This attribute may only be used at the assembly scope and can only + be used once per assembly. + + + Use this attribute to configure the + without calling one of the + methods. + + + If neither of the or + properties are set the configuration is loaded from the application's .config file. + If set the property takes priority over the + property. The property + specifies a path to a file to load the config from. The path is relative to the + application's base directory; . + The property is used as a postfix to the assembly file name. + The config file must be located in the application's base directory; . + For example in a console application setting the to + config has the same effect as not specifying the or + properties. + + + The property can be set to cause the + to watch the configuration file for changes. + + + + Log4net will only look for assembly level configuration attributes once. + When using the log4net assembly level attributes to control the configuration + of log4net you must ensure that the first call to any of the + methods is made from the assembly with the configuration + attributes. + + + If you cannot guarantee the order in which log4net calls will be made from + different assemblies you must use programmatic configuration instead, i.e. + call the method directly. + + + + Nicko Cadell + Gert Driesen + + + + Default constructor + + + + Default constructor + + + + + + Configures the for the specified assembly. + + The assembly that this attribute was defined on. + The repository to configure. + + + Configure the repository using the . + The specified must extend the + class otherwise the will not be able to + configure it. + + + The does not extend . + + + + Attempt to load configuration from the local file system + + The assembly that this attribute was defined on. + The repository to configure. + + + + Configure the specified repository using a + + The repository to configure. + the FileInfo pointing to the config file + + + + Attempt to load configuration from a URI + + The assembly that this attribute was defined on. + The repository to configure. + + + + Gets or sets the filename of the configuration file. + + + The filename of the configuration file. + + + + If specified, this is the name of the configuration file to use with + the . This file path is relative to the + application base directory (). + + + The takes priority over the . + + + + + + Gets or sets the extension of the configuration file. + + + The extension of the configuration file. + + + + If specified this is the extension for the configuration file. + The path to the config file is built by using the application + base directory (), + the assembly file name and the config file extension. + + + If the is set to MyExt then + possible config file names would be: MyConsoleApp.exe.MyExt or + MyClassLibrary.dll.MyExt. + + + The takes priority over the . + + + + + + Gets or sets a value indicating whether to watch the configuration file. + + + true if the configuration should be watched, false otherwise. + + + + If this flag is specified and set to true then the framework + will watch the configuration file and will reload the config each time + the file is modified. + + + The config file can only be watched if it is loaded from local disk. + In a No-Touch (Smart Client) deployment where the application is downloaded + from a web server the config file may not reside on the local disk + and therefore it may not be able to watch it. + + + Watching configuration is not supported on the SSCLI. + + + + + + Class to register for the log4net section of the configuration file + + + The log4net section of the configuration file needs to have a section + handler registered. This is the section handler used. It simply returns + the XML element that is the root of the section. + + + Example of registering the log4net section handler : + + + +
+ + + log4net configuration XML goes here + + + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + + Default constructor. + + + + + + Parses the configuration section. + + The configuration settings in a corresponding parent configuration section. + The configuration context when called from the ASP.NET configuration system. Otherwise, this parameter is reserved and is a null reference. + The for the log4net section. + The for the log4net section. + + + Returns the containing the configuration data, + + + + + + Assembly level attribute that specifies a plugin to attach to + the repository. + + + + Specifies the type of a plugin to create and attach to the + assembly's repository. The plugin type must implement the + interface. + + + Nicko Cadell + Gert Driesen + + + + Interface used to create plugins. + + + + Interface used to create a plugin. + + + Nicko Cadell + Gert Driesen + + + + Creates the plugin object. + + the new plugin instance + + + Create and return a new plugin instance. + + + + + + Initializes a new instance of the class + with the specified type. + + The type name of plugin to create. + + + Create the attribute with the plugin type specified. + + + Where possible use the constructor that takes a . + + + + + + Initializes a new instance of the class + with the specified type. + + The type of plugin to create. + + + Create the attribute with the plugin type specified. + + + + + + Creates the plugin object defined by this attribute. + + + + Creates the instance of the object as + specified by this attribute. + + + The plugin object. + + + + Returns a representation of the properties of this object. + + + + Overrides base class method to + return a representation of the properties of this object. + + + A representation of the properties of this object + + + + Gets or sets the type for the plugin. + + + The type for the plugin. + + + + The type for the plugin. + + + + + + Gets or sets the type name for the plugin. + + + The type name for the plugin. + + + + The type name for the plugin. + + + Where possible use the property instead. + + + + + + Assembly level attribute to configure the . + + + + This attribute may only be used at the assembly scope and can only + be used once per assembly. + + + Use this attribute to configure the + without calling one of the + methods. + + + Nicko Cadell + + + + Construct provider attribute with type specified + + the type of the provider to use + + + The provider specified must subclass the + class. + + + + + + Configures the SecurityContextProvider + + The assembly that this attribute was defined on. + The repository to configure. + + + Creates a provider instance from the specified. + Sets this as the default security context provider . + + + + + + Gets or sets the type of the provider to use. + + + the type of the provider to use. + + + + The provider specified must subclass the + class. + + + + + + Use this class to initialize the log4net environment using an Xml tree. + + + + Configures a using an Xml tree. + + + Nicko Cadell + Gert Driesen + + + + Private constructor + + + + + Automatically configures the log4net system based on the + application's configuration settings. + + + + Each application has a configuration file. This has the + same name as the application with '.config' appended. + This file is XML and calling this function prompts the + configurator to look in that file for a section called + log4net that contains the configuration data. + + + To use this method to configure log4net you must specify + the section + handler for the log4net configuration section. See the + for an example. + + + + + + + Automatically configures the using settings + stored in the application's configuration file. + + + + Each application has a configuration file. This has the + same name as the application with '.config' appended. + This file is XML and calling this function prompts the + configurator to look in that file for a section called + log4net that contains the configuration data. + + + To use this method to configure log4net you must specify + the section + handler for the log4net configuration section. See the + for an example. + + + The repository to configure. + + + + Configures log4net using a log4net element + + + + Loads the log4net configuration from the XML element + supplied as . + + + The element to parse. + + + + Configures the using the specified XML + element. + + + Loads the log4net configuration from the XML element + supplied as . + + The repository to configure. + The element to parse. + + + + Configures log4net using the specified configuration file. + + The XML file to load the configuration from. + + + The configuration file must be valid XML. It must contain + at least one element called log4net that holds + the log4net configuration data. + + + The log4net configuration file can possible be specified in the application's + configuration file (either MyAppName.exe.config for a + normal application on Web.config for an ASP.NET application). + + + The first element matching <configuration> will be read as the + configuration. If this file is also a .NET .config file then you must specify + a configuration section for the log4net element otherwise .NET will + complain. Set the type for the section handler to , for example: + + +
+ + + + + The following example configures log4net using a configuration file, of which the + location is stored in the application's configuration file : + + + using log4net.Config; + using System.IO; + using System.Configuration; + + ... + + XmlConfigurator.Configure(new FileInfo(ConfigurationSettings.AppSettings["log4net-config-file"])); + + + In the .config file, the path to the log4net can be specified like this : + + + + + + + + + + + + + Configures log4net using the specified configuration URI. + + A URI to load the XML configuration from. + + + The configuration data must be valid XML. It must contain + at least one element called log4net that holds + the log4net configuration data. + + + The must support the URI scheme specified. + + + + + + Configures log4net using the specified configuration data stream. + + A stream to load the XML configuration from. + + + The configuration data must be valid XML. It must contain + at least one element called log4net that holds + the log4net configuration data. + + + Note that this method will NOT close the stream parameter. + + + + + + Configures the using the specified configuration + file. + + The repository to configure. + The XML file to load the configuration from. + + + The configuration file must be valid XML. It must contain + at least one element called log4net that holds + the configuration data. + + + The log4net configuration file can possible be specified in the application's + configuration file (either MyAppName.exe.config for a + normal application on Web.config for an ASP.NET application). + + + The first element matching <configuration> will be read as the + configuration. If this file is also a .NET .config file then you must specify + a configuration section for the log4net element otherwise .NET will + complain. Set the type for the section handler to , for example: + + +
+ + + + + The following example configures log4net using a configuration file, of which the + location is stored in the application's configuration file : + + + using log4net.Config; + using System.IO; + using System.Configuration; + + ... + + XmlConfigurator.Configure(new FileInfo(ConfigurationSettings.AppSettings["log4net-config-file"])); + + + In the .config file, the path to the log4net can be specified like this : + + + + + + + + + + + + + Configures the using the specified configuration + URI. + + The repository to configure. + A URI to load the XML configuration from. + + + The configuration data must be valid XML. It must contain + at least one element called log4net that holds + the configuration data. + + + The must support the URI scheme specified. + + + + + + Configures the using the specified configuration + file. + + The repository to configure. + The stream to load the XML configuration from. + + + The configuration data must be valid XML. It must contain + at least one element called log4net that holds + the configuration data. + + + Note that this method will NOT close the stream parameter. + + + + + + Configures log4net using the file specified, monitors the file for changes + and reloads the configuration if a change is detected. + + The XML file to load the configuration from. + + + The configuration file must be valid XML. It must contain + at least one element called log4net that holds + the configuration data. + + + The configuration file will be monitored using a + and depends on the behavior of that class. + + + For more information on how to configure log4net using + a separate configuration file, see . + + + + + + + Configures the using the file specified, + monitors the file for changes and reloads the configuration if a change + is detected. + + The repository to configure. + The XML file to load the configuration from. + + + The configuration file must be valid XML. It must contain + at least one element called log4net that holds + the configuration data. + + + The configuration file will be monitored using a + and depends on the behavior of that class. + + + For more information on how to configure log4net using + a separate configuration file, see . + + + + + + + Configures the specified repository using a log4net element. + + The hierarchy to configure. + The element to parse. + + + Loads the log4net configuration from the XML element + supplied as . + + + This method is ultimately called by one of the Configure methods + to load the configuration from an . + + + + + + Class used to watch config files. + + + + Uses the to monitor + changes to a specified file. Because multiple change notifications + may be raised when the file is modified, a timer is used to + compress the notifications into a single event. The timer + waits for time before delivering + the event notification. If any further + change notifications arrive while the timer is waiting it + is reset and waits again for to + elapse. + + + + + + The default amount of time to wait after receiving notification + before reloading the config file. + + + + + Watch a specified config file used to configure a repository + + The repository to configure. + The configuration file to watch. + + + Watch a specified config file used to configure a repository + + + + + + Holds the FileInfo used to configure the XmlConfigurator + + + + + Holds the repository being configured. + + + + + The timer used to compress the notification events. + + + + + Initializes a new instance of the class. + + The repository to configure. + The configuration file to watch. + + + Initializes a new instance of the class. + + + + + + Event handler used by . + + The firing the event. + The argument indicates the file that caused the event to be fired. + + + This handler reloads the configuration from the file when the event is fired. + + + + + + Event handler used by . + + The firing the event. + The argument indicates the file that caused the event to be fired. + + + This handler reloads the configuration from the file when the event is fired. + + + + + + Called by the timer when the configuration has been updated. + + null + + + + The implementation of the interface suitable + for use with the compact framework + + + + This implementation is a simple + mapping between repository name and + object. + + + The .NET Compact Framework 1.0 does not support retrieving assembly + level attributes therefore unlike the DefaultRepositorySelector + this selector does not examine the calling assembly for attributes. + + + Nicko Cadell + + + + Interface used by the to select the . + + + + The uses a + to specify the policy for selecting the correct + to return to the caller. + + + Nicko Cadell + Gert Driesen + + + + Gets the for the specified assembly. + + The assembly to use to lookup to the + The for the assembly. + + + Gets the for the specified assembly. + + + How the association between and + is made is not defined. The implementation may choose any method for + this association. The results of this method must be repeatable, i.e. + when called again with the same arguments the result must be the + save value. + + + + + + Gets the named . + + The name to use to lookup to the . + The named + + Lookup a named . This is the repository created by + calling . + + + + + Creates a new repository for the assembly specified. + + The assembly to use to create the domain to associate with the . + The type of repository to create, must implement . + The repository created. + + + The created will be associated with the domain + specified such that a call to with the + same assembly specified will return the same repository instance. + + + How the association between and + is made is not defined. The implementation may choose any method for + this association. + + + + + + Creates a new repository with the name specified. + + The name to associate with the . + The type of repository to create, must implement . + The repository created. + + + The created will be associated with the name + specified such that a call to with the + same name will return the same repository instance. + + + + + + Test if a named repository exists + + the named repository to check + true if the repository exists + + + Test if a named repository exists. Use + to create a new repository and to retrieve + a repository. + + + + + + Gets an array of all currently defined repositories. + + + An array of the instances created by + this . + + + Gets an array of all of the repositories created by this selector. + + + + + + Event to notify that a logger repository has been created. + + + Event to notify that a logger repository has been created. + + + + Event raised when a new repository is created. + The event source will be this selector. The event args will + be a which + holds the newly created . + + + + + + Create a new repository selector + + the type of the repositories to create, must implement + + + Create an new compact repository selector. + The default type for repositories must be specified, + an appropriate value would be . + + + throw if is null + throw if does not implement + + + + Get the for the specified assembly + + not used + The default + + + The argument is not used. This selector does not create a + separate repository for each assembly. + + + As a named repository is not specified the default repository is + returned. The default repository is named log4net-default-repository. + + + + + + Get the named + + the name of the repository to lookup + The named + + + Get the named . The default + repository is log4net-default-repository. Other repositories + must be created using the . + If the named repository does not exist an exception is thrown. + + + throw if is null + throw if the does not exist + + + + Create a new repository for the assembly specified + + not used + the type of repository to create, must implement + the repository created + + + The argument is not used. This selector does not create a + separate repository for each assembly. + + + If the is null then the + default repository type specified to the constructor is used. + + + As a named repository is not specified the default repository is + returned. The default repository is named log4net-default-repository. + + + + + + Create a new repository for the repository specified + + the repository to associate with the + the type of repository to create, must implement . + If this param is null then the default repository type is used. + the repository created + + + The created will be associated with the repository + specified such that a call to with the + same repository specified will return the same repository instance. + + + If the named repository already exists an exception will be thrown. + + + If is null then the default + repository type specified to the constructor is used. + + + throw if is null + throw if the already exists + + + + Test if a named repository exists + + the named repository to check + true if the repository exists + + + Test if a named repository exists. Use + to create a new repository and to retrieve + a repository. + + + + + + Gets a list of objects + + an array of all known objects + + + Gets an array of all of the repositories created by this selector. + + + + + + Notify the registered listeners that the repository has been created + + The repository that has been created + + + Raises the LoggerRepositoryCreatedEvent + event. + + + + + + Event to notify that a logger repository has been created. + + + Event to notify that a logger repository has been created. + + + + Event raised when a new repository is created. + The event source will be this selector. The event args will + be a which + holds the newly created . + + + + + + The default implementation of the interface. + + + + Uses attributes defined on the calling assembly to determine how to + configure the hierarchy for the repository. + + + Nicko Cadell + Gert Driesen + + + + Creates a new repository selector. + + The type of the repositories to create, must implement + + + Create an new repository selector. + The default type for repositories must be specified, + an appropriate value would be . + + + is . + does not implement . + + + + Gets the for the specified assembly. + + The assembly use to lookup the . + + + The type of the created and the repository + to create can be overridden by specifying the + attribute on the . + + + The default values are to use the + implementation of the interface and to use the + as the name of the repository. + + + The created will be automatically configured using + any attributes defined on + the . + + + The for the assembly + is . + + + + Gets the for the specified repository. + + The repository to use to lookup the . + The for the specified repository. + + + Returns the named repository. If is null + a is thrown. If the repository + does not exist a is thrown. + + + Use to create a repository. + + + is . + does not exist. + + + + Create a new repository for the assembly specified + + the assembly to use to create the repository to associate with the . + The type of repository to create, must implement . + The repository created. + + + The created will be associated with the repository + specified such that a call to with the + same assembly specified will return the same repository instance. + + + The type of the created and + the repository to create can be overridden by specifying the + attribute on the + . The default values are to use the + implementation of the + interface and to use the + as the name of the repository. + + + The created will be automatically + configured using any + attributes defined on the . + + + If a repository for the already exists + that repository will be returned. An error will not be raised and that + repository may be of a different type to that specified in . + Also the attribute on the + assembly may be used to override the repository type specified in + . + + + is . + + + + Creates a new repository for the assembly specified. + + the assembly to use to create the repository to associate with the . + The type of repository to create, must implement . + The name to assign to the created repository + Set to true to read and apply the assembly attributes + The repository created. + + + The created will be associated with the repository + specified such that a call to with the + same assembly specified will return the same repository instance. + + + The type of the created and + the repository to create can be overridden by specifying the + attribute on the + . The default values are to use the + implementation of the + interface and to use the + as the name of the repository. + + + The created will be automatically + configured using any + attributes defined on the . + + + If a repository for the already exists + that repository will be returned. An error will not be raised and that + repository may be of a different type to that specified in . + Also the attribute on the + assembly may be used to override the repository type specified in + . + + + is . + + + + Creates a new repository for the specified repository. + + The repository to associate with the . + The type of repository to create, must implement . + If this param is then the default repository type is used. + The new repository. + + + The created will be associated with the repository + specified such that a call to with the + same repository specified will return the same repository instance. + + + is . + already exists. + + + + Test if a named repository exists + + the named repository to check + true if the repository exists + + + Test if a named repository exists. Use + to create a new repository and to retrieve + a repository. + + + + + + Gets a list of objects + + an array of all known objects + + + Gets an array of all of the repositories created by this selector. + + + + + + Aliases a repository to an existing repository. + + The repository to alias. + The repository that the repository is aliased to. + + + The repository specified will be aliased to the repository when created. + The repository must not already exist. + + + When the repository is created it must utilize the same repository type as + the repository it is aliased to, otherwise the aliasing will fail. + + + + is . + -or- + is . + + + + + Notifies the registered listeners that the repository has been created. + + The repository that has been created. + + + Raises the event. + + + + + + Gets the repository name and repository type for the specified assembly. + + The assembly that has a . + in/out param to hold the repository name to use for the assembly, caller should set this to the default value before calling. + in/out param to hold the type of the repository to create for the assembly, caller should set this to the default value before calling. + is . + + + + Configures the repository using information from the assembly. + + The assembly containing + attributes which define the configuration for the repository. + The repository to configure. + + is . + -or- + is . + + + + + Loads the attribute defined plugins on the assembly. + + The assembly that contains the attributes. + The repository to add the plugins to. + + is . + -or- + is . + + + + + Loads the attribute defined aliases on the assembly. + + The assembly that contains the attributes. + The repository to alias to. + + is . + -or- + is . + + + + + Event to notify that a logger repository has been created. + + + Event to notify that a logger repository has been created. + + + + Event raised when a new repository is created. + The event source will be this selector. The event args will + be a which + holds the newly created . + + + + + + Defined error codes that can be passed to the method. + + + + Values passed to the method. + + + Nicko Cadell + + + + A general error + + + + + Error while writing output + + + + + Failed to flush file + + + + + Failed to close file + + + + + Unable to open output file + + + + + No layout specified + + + + + Failed to parse address + + + + + Appenders may delegate their error handling to an . + + + + Error handling is a particularly tedious to get right because by + definition errors are hard to predict and to reproduce. + + + Nicko Cadell + Gert Driesen + + + + Handles the error and information about the error condition is passed as + a parameter. + + The message associated with the error. + The that was thrown when the error occurred. + The error code associated with the error. + + + Handles the error and information about the error condition is passed as + a parameter. + + + + + + Prints the error message passed as a parameter. + + The message associated with the error. + The that was thrown when the error occurred. + + + See . + + + + + + Prints the error message passed as a parameter. + + The message associated with the error. + + + See . + + + + + + Interface for objects that require fixing. + + + + Interface that indicates that the object requires fixing before it + can be taken outside the context of the appender's + method. + + + When objects that implement this interface are stored + in the context properties maps + and + are fixed + (see ) the + method will be called. + + + Nicko Cadell + + + + Get a portable version of this object + + the portable instance of this object + + + Get a portable instance object that represents the current + state of this object. The portable object can be stored + and logged from any thread with identical results. + + + + + + Interface that all loggers implement + + + + This interface supports logging events and testing if a level + is enabled for logging. + + + These methods will not throw exceptions. Note to implementor, ensure + that the implementation of these methods cannot allow an exception + to be thrown to the caller. + + + Nicko Cadell + Gert Driesen + + + + This generic form is intended to be used by wrappers. + + The declaring type of the method that is + the stack boundary into the logging system for this call. + The level of the message to be logged. + The message object to log. + the exception to log, including its stack trace. Pass null to not log an exception. + + + Generates a logging event for the specified using + the and . + + + + + + This is the most generic printing method that is intended to be used + by wrappers. + + The event being logged. + + + Logs the specified logging event through this logger. + + + + + + Checks if this logger is enabled for a given passed as parameter. + + The level to check. + + true if this logger is enabled for level, otherwise false. + + + + Test if this logger is going to log events of the specified . + + + + + + Gets the name of the logger. + + + The name of the logger. + + + + The name of this logger + + + + + + Gets the where this + Logger instance is attached to. + + + The that this logger belongs to. + + + + Gets the where this + Logger instance is attached to. + + + + + + Base interface for all wrappers + + + + Base interface for all wrappers. + + + All wrappers must implement this interface. + + + Nicko Cadell + + + + Get the implementation behind this wrapper object. + + + The object that in implementing this object. + + + + The object that in implementing this + object. The Logger object may not + be the same object as this object because of logger decorators. + This gets the actual underlying objects that is used to process + the log events. + + + + + + Delegate used to handle logger repository creation event notifications + + The which created the repository. + The event args + that holds the instance that has been created. + + + Delegate used to handle logger repository creation event notifications. + + + + + + Provides data for the event. + + + + A + event is raised every time a is created. + + + + + + The created + + + + + Construct instance using specified + + the that has been created + + + Construct instance using specified + + + + + + The that has been created + + + The that has been created + + + + The that has been created + + + + + + Test if an triggers an action + + + + Implementations of this interface allow certain appenders to decide + when to perform an appender specific action. + + + The action or behavior triggered is defined by the implementation. + + + Nicko Cadell + + + + Test if this event triggers the action + + The event to check + true if this event triggers the action, otherwise false + + + Return true if this event triggers the action + + + + + + Defines the default set of levels recognized by the system. + + + + Each has an associated . + + + Levels have a numeric that defines the relative + ordering between levels. Two Levels with the same + are deemed to be equivalent. + + + The levels that are recognized by log4net are set for each + and each repository can have different levels defined. The levels are stored + in the on the repository. Levels are + looked up by name from the . + + + When logging at level INFO the actual level used is not but + the value of LoggerRepository.LevelMap["INFO"]. The default value for this is + , but this can be changed by reconfiguring the level map. + + + Each level has a in addition to its . The + is the string that is written into the output log. By default + the display name is the same as the level name, but this can be used to alias levels + or to localize the log output. + + + Some of the predefined levels recognized by the system are: + + + + . + + + . + + + . + + + . + + + . + + + . + + + . + + + + Nicko Cadell + Gert Driesen + + + + Constructor + + Integer value for this level, higher values represent more severe levels. + The string name of this level. + The display name for this level. This may be localized or otherwise different from the name + + + Initializes a new instance of the class with + the specified level name and value. + + + + + + Constructor + + Integer value for this level, higher values represent more severe levels. + The string name of this level. + + + Initializes a new instance of the class with + the specified level name and value. + + + + + + Returns the representation of the current + . + + + A representation of the current . + + + + Returns the level . + + + + + + Compares levels. + + The object to compare against. + true if the objects are equal. + + + Compares the levels of instances, and + defers to base class if the target object is not a + instance. + + + + + + Returns a hash code + + A hash code for the current . + + + Returns a hash code suitable for use in hashing algorithms and data + structures like a hash table. + + + Returns the hash code of the level . + + + + + + Compares this instance to a specified object and returns an + indication of their relative values. + + A instance or to compare with this instance. + + A 32-bit signed integer that indicates the relative order of the + values compared. The return value has these meanings: + + + Value + Meaning + + + Less than zero + This instance is less than . + + + Zero + This instance is equal to . + + + Greater than zero + + This instance is greater than . + -or- + is . + + + + + + + must be an instance of + or ; otherwise, an exception is thrown. + + + is not a . + + + + Returns a value indicating whether a specified + is greater than another specified . + + A + A + + true if is greater than + ; otherwise, false. + + + + Compares two levels. + + + + + + Returns a value indicating whether a specified + is less than another specified . + + A + A + + true if is less than + ; otherwise, false. + + + + Compares two levels. + + + + + + Returns a value indicating whether a specified + is greater than or equal to another specified . + + A + A + + true if is greater than or equal to + ; otherwise, false. + + + + Compares two levels. + + + + + + Returns a value indicating whether a specified + is less than or equal to another specified . + + A + A + + true if is less than or equal to + ; otherwise, false. + + + + Compares two levels. + + + + + + Returns a value indicating whether two specified + objects have the same value. + + A or . + A or . + + true if the value of is the same as the + value of ; otherwise, false. + + + + Compares two levels. + + + + + + Returns a value indicating whether two specified + objects have different values. + + A or . + A or . + + true if the value of is different from + the value of ; otherwise, false. + + + + Compares two levels. + + + + + + Compares two specified instances. + + The first to compare. + The second to compare. + + A 32-bit signed integer that indicates the relative order of the + two values compared. The return value has these meanings: + + + Value + Meaning + + + Less than zero + is less than . + + + Zero + is equal to . + + + Greater than zero + is greater than . + + + + + + Compares two levels. + + + + + + The level designates a higher level than all the rest. + + + + + The level designates very severe error events. + System unusable, emergencies. + + + + + The level designates very severe error events + that will presumably lead the application to abort. + + + + + The level designates very severe error events. + Take immediate action, alerts. + + + + + The level designates very severe error events. + Critical condition, critical. + + + + + The level designates very severe error events. + + + + + The level designates error events that might + still allow the application to continue running. + + + + + The level designates potentially harmful + situations. + + + + + The level designates informational messages + that highlight the progress of the application at the highest level. + + + + + The level designates informational messages that + highlight the progress of the application at coarse-grained level. + + + + + The level designates fine-grained informational + events that are most useful to debug an application. + + + + + The level designates fine-grained informational + events that are most useful to debug an application. + + + + + The level designates fine-grained informational + events that are most useful to debug an application. + + + + + The level designates fine-grained informational + events that are most useful to debug an application. + + + + + The level designates fine-grained informational + events that are most useful to debug an application. + + + + + The level designates fine-grained informational + events that are most useful to debug an application. + + + + + The level designates the lowest level possible. + + + + + Gets the name of this level. + + + The name of this level. + + + + Gets the name of this level. + + + + + + Gets the value of this level. + + + The value of this level. + + + + Gets the value of this level. + + + + + + Gets the display name of this level. + + + The display name of this level. + + + + Gets the display name of this level. + + + + + + A strongly-typed collection of objects. + + Nicko Cadell + + + + Creates a read-only wrapper for a LevelCollection instance. + + list to create a readonly wrapper arround + + A LevelCollection wrapper that is read-only. + + + + + Initializes a new instance of the LevelCollection class + that is empty and has the default initial capacity. + + + + + Initializes a new instance of the LevelCollection class + that has the specified initial capacity. + + + The number of elements that the new LevelCollection is initially capable of storing. + + + + + Initializes a new instance of the LevelCollection class + that contains elements copied from the specified LevelCollection. + + The LevelCollection whose elements are copied to the new collection. + + + + Initializes a new instance of the LevelCollection class + that contains elements copied from the specified array. + + The array whose elements are copied to the new list. + + + + Initializes a new instance of the LevelCollection class + that contains elements copied from the specified collection. + + The collection whose elements are copied to the new list. + + + + Allow subclasses to avoid our default constructors + + + + + + Copies the entire LevelCollection to a one-dimensional + array. + + The one-dimensional array to copy to. + + + + Copies the entire LevelCollection to a one-dimensional + array, starting at the specified index of the target array. + + The one-dimensional array to copy to. + The zero-based index in at which copying begins. + + + + Adds a to the end of the LevelCollection. + + The to be added to the end of the LevelCollection. + The index at which the value has been added. + + + + Removes all elements from the LevelCollection. + + + + + Creates a shallow copy of the . + + A new with a shallow copy of the collection data. + + + + Determines whether a given is in the LevelCollection. + + The to check for. + true if is found in the LevelCollection; otherwise, false. + + + + Returns the zero-based index of the first occurrence of a + in the LevelCollection. + + The to locate in the LevelCollection. + + The zero-based index of the first occurrence of + in the entire LevelCollection, if found; otherwise, -1. + + + + + Inserts an element into the LevelCollection at the specified index. + + The zero-based index at which should be inserted. + The to insert. + + is less than zero + -or- + is equal to or greater than . + + + + + Removes the first occurrence of a specific from the LevelCollection. + + The to remove from the LevelCollection. + + The specified was not found in the LevelCollection. + + + + + Removes the element at the specified index of the LevelCollection. + + The zero-based index of the element to remove. + + is less than zero + -or- + is equal to or greater than . + + + + + Returns an enumerator that can iterate through the LevelCollection. + + An for the entire LevelCollection. + + + + Adds the elements of another LevelCollection to the current LevelCollection. + + The LevelCollection whose elements should be added to the end of the current LevelCollection. + The new of the LevelCollection. + + + + Adds the elements of a array to the current LevelCollection. + + The array whose elements should be added to the end of the LevelCollection. + The new of the LevelCollection. + + + + Adds the elements of a collection to the current LevelCollection. + + The collection whose elements should be added to the end of the LevelCollection. + The new of the LevelCollection. + + + + Sets the capacity to the actual number of elements. + + + + + is less than zero + -or- + is equal to or greater than . + + + + + is less than zero + -or- + is equal to or greater than . + + + + + Gets the number of elements actually contained in the LevelCollection. + + + + + Gets a value indicating whether access to the collection is synchronized (thread-safe). + + true if access to the ICollection is synchronized (thread-safe); otherwise, false. + + + + Gets an object that can be used to synchronize access to the collection. + + + + + Gets or sets the at the specified index. + + The zero-based index of the element to get or set. + + is less than zero + -or- + is equal to or greater than . + + + + + Gets a value indicating whether the collection has a fixed size. + + true if the collection has a fixed size; otherwise, false. The default is false + + + + Gets a value indicating whether the IList is read-only. + + true if the collection is read-only; otherwise, false. The default is false + + + + Gets or sets the number of elements the LevelCollection can contain. + + + + + Supports type-safe iteration over a . + + + + + Advances the enumerator to the next element in the collection. + + + true if the enumerator was successfully advanced to the next element; + false if the enumerator has passed the end of the collection. + + + The collection was modified after the enumerator was created. + + + + + Sets the enumerator to its initial position, before the first element in the collection. + + + + + Gets the current element in the collection. + + + + + Type visible only to our subclasses + Used to access protected constructor + + + + + A value + + + + + Supports simple iteration over a . + + + + + Initializes a new instance of the Enumerator class. + + + + + + Advances the enumerator to the next element in the collection. + + + true if the enumerator was successfully advanced to the next element; + false if the enumerator has passed the end of the collection. + + + The collection was modified after the enumerator was created. + + + + + Sets the enumerator to its initial position, before the first element in the collection. + + + + + Gets the current element in the collection. + + + + + An evaluator that triggers at a threshold level + + + + This evaluator will trigger if the level of the event + passed to + is equal to or greater than the + level. + + + Nicko Cadell + + + + The threshold for triggering + + + + + Create a new evaluator using the threshold. + + + + Create a new evaluator using the threshold. + + + This evaluator will trigger if the level of the event + passed to + is equal to or greater than the + level. + + + + + + Create a new evaluator using the specified threshold. + + the threshold to trigger at + + + Create a new evaluator using the specified threshold. + + + This evaluator will trigger if the level of the event + passed to + is equal to or greater than the + level. + + + + + + Is this the triggering event? + + The event to check + This method returns true, if the event level + is equal or higher than the . + Otherwise it returns false + + + This evaluator will trigger if the level of the event + passed to + is equal to or greater than the + level. + + + + + + the threshold to trigger at + + + The that will cause this evaluator to trigger + + + + This evaluator will trigger if the level of the event + passed to + is equal to or greater than the + level. + + + + + + Mapping between string name and Level object + + + + Mapping between string name and object. + This mapping is held separately for each . + The level name is case insensitive. + + + Nicko Cadell + + + + Mapping from level name to Level object. The + level name is case insensitive + + + + + Construct the level map + + + + Construct the level map. + + + + + + Clear the internal maps of all levels + + + + Clear the internal maps of all levels + + + + + + Create a new Level and add it to the map + + the string to display for the Level + the level value to give to the Level + + + Create a new Level and add it to the map + + + + + + + Create a new Level and add it to the map + + the string to display for the Level + the level value to give to the Level + the display name to give to the Level + + + Create a new Level and add it to the map + + + + + + Add a Level to the map + + the Level to add + + + Add a Level to the map + + + + + + Lookup a named level from the map + + the name of the level to lookup is taken from this level. + If the level is not set on the map then this level is added + the level in the map with the name specified + + + Lookup a named level from the map. The name of the level to lookup is taken + from the property of the + argument. + + + If no level with the specified name is found then the + argument is added to the level map + and returned. + + + + + + Lookup a by name + + The name of the Level to lookup + a Level from the map with the name specified + + + Returns the from the + map with the name specified. If the no level is + found then null is returned. + + + + + + Return all possible levels as a list of Level objects. + + all possible levels as a list of Level objects + + + Return all possible levels as a list of Level objects. + + + + + + The internal representation of caller location information. + + + + This class uses the System.Diagnostics.StackTrace class to generate + a call stack. The caller's information is then extracted from this stack. + + + The System.Diagnostics.StackTrace class is not supported on the + .NET Compact Framework 1.0 therefore caller location information is not + available on that framework. + + + The System.Diagnostics.StackTrace class has this to say about Release builds: + + + "StackTrace information will be most informative with Debug build configurations. + By default, Debug builds include debug symbols, while Release builds do not. The + debug symbols contain most of the file, method name, line number, and column + information used in constructing StackFrame and StackTrace objects. StackTrace + might not report as many method calls as expected, due to code transformations + that occur during optimization." + + + This means that in a Release build the caller information may be incomplete or may + not exist at all! Therefore caller location information cannot be relied upon in a Release build. + + + Nicko Cadell + Gert Driesen + + + + When location information is not available the constant + NA is returned. Current value of this string + constant is ?. + + + + + Constructor + + The declaring type of the method that is + the stack boundary into the logging system for this call. + + + Initializes a new instance of the + class based on the current thread. + + + + + + Constructor + + The fully qualified class name. + The method name. + The file name. + The line number of the method within the file. + + + Initializes a new instance of the + class with the specified data. + + + + + + Gets the fully qualified class name of the caller making the logging + request. + + + The fully qualified class name of the caller making the logging + request. + + + + Gets the fully qualified class name of the caller making the logging + request. + + + + + + Gets the file name of the caller. + + + The file name of the caller. + + + + Gets the file name of the caller. + + + + + + Gets the line number of the caller. + + + The line number of the caller. + + + + Gets the line number of the caller. + + + + + + Gets the method name of the caller. + + + The method name of the caller. + + + + Gets the method name of the caller. + + + + + + Gets all available caller information + + + All available caller information, in the format + fully.qualified.classname.of.caller.methodName(Filename:line) + + + + Gets all available caller information, in the format + fully.qualified.classname.of.caller.methodName(Filename:line) + + + + + + Static manager that controls the creation of repositories + + + + Static manager that controls the creation of repositories + + + This class is used by the wrapper managers (e.g. ) + to provide access to the objects. + + + This manager also holds the that is used to + lookup and create repositories. The selector can be set either programmatically using + the property, or by setting the log4net.RepositorySelector + AppSetting in the applications config file to the fully qualified type name of the + selector to use. + + + Nicko Cadell + Gert Driesen + + + + Private constructor to prevent instances. Only static methods should be used. + + + + Private constructor to prevent instances. Only static methods should be used. + + + + + + Hook the shutdown event + + + + On the full .NET runtime, the static constructor hooks up the + AppDomain.ProcessExit and AppDomain.DomainUnload> events. + These are used to shutdown the log4net system as the application exits. + + + + + + Register for ProcessExit and DomainUnload events on the AppDomain + + + + This needs to be in a separate method because the events make + a LinkDemand for the ControlAppDomain SecurityPermission. Because + this is a LinkDemand it is demanded at JIT time. Therefore we cannot + catch the exception in the method itself, we have to catch it in the + caller. + + + + + + Return the default instance. + + the repository to lookup in + Return the default instance + + + Gets the for the repository specified + by the argument. + + + + + + Returns the default instance. + + The assembly to use to lookup the repository. + The default instance. + + + + Return the default instance. + + the repository to lookup in + Return the default instance + + + Gets the for the repository specified + by the argument. + + + + + + Returns the default instance. + + The assembly to use to lookup the repository. + The default instance. + + + Returns the default instance. + + + + + + Returns the named logger if it exists. + + The repository to lookup in. + The fully qualified logger name to look for. + + The logger found, or null if the named logger does not exist in the + specified repository. + + + + If the named logger exists (in the specified repository) then it + returns a reference to the logger, otherwise it returns + null. + + + + + + Returns the named logger if it exists. + + The assembly to use to lookup the repository. + The fully qualified logger name to look for. + + The logger found, or null if the named logger does not exist in the + specified assembly's repository. + + + + If the named logger exists (in the specified assembly's repository) then it + returns a reference to the logger, otherwise it returns + null. + + + + + + Returns all the currently defined loggers in the specified repository. + + The repository to lookup in. + All the defined loggers. + + + The root logger is not included in the returned array. + + + + + + Returns all the currently defined loggers in the specified assembly's repository. + + The assembly to use to lookup the repository. + All the defined loggers. + + + The root logger is not included in the returned array. + + + + + + Retrieves or creates a named logger. + + The repository to lookup in. + The name of the logger to retrieve. + The logger with the name specified. + + + Retrieves a logger named as the + parameter. If the named logger already exists, then the + existing instance will be returned. Otherwise, a new instance is + created. + + + By default, loggers do not have a set level but inherit + it from the hierarchy. This is one of the central features of + log4net. + + + + + + Retrieves or creates a named logger. + + The assembly to use to lookup the repository. + The name of the logger to retrieve. + The logger with the name specified. + + + Retrieves a logger named as the + parameter. If the named logger already exists, then the + existing instance will be returned. Otherwise, a new instance is + created. + + + By default, loggers do not have a set level but inherit + it from the hierarchy. This is one of the central features of + log4net. + + + + + + Shorthand for . + + The repository to lookup in. + The of which the fullname will be used as the name of the logger to retrieve. + The logger with the name specified. + + + Gets the logger for the fully qualified name of the type specified. + + + + + + Shorthand for . + + the assembly to use to lookup the repository + The of which the fullname will be used as the name of the logger to retrieve. + The logger with the name specified. + + + Gets the logger for the fully qualified name of the type specified. + + + + + + Shuts down the log4net system. + + + + Calling this method will safely close and remove all + appenders in all the loggers including root contained in all the + default repositories. + + + Some appenders need to be closed before the application exists. + Otherwise, pending logging events might be lost. + + + The shutdown method is careful to close nested + appenders before closing regular appenders. This is allows + configurations where a regular appender is attached to a logger + and again to a nested appender. + + + + + + Shuts down the repository for the repository specified. + + The repository to shutdown. + + + Calling this method will safely close and remove all + appenders in all the loggers including root contained in the + repository for the specified. + + + Some appenders need to be closed before the application exists. + Otherwise, pending logging events might be lost. + + + The shutdown method is careful to close nested + appenders before closing regular appenders. This is allows + configurations where a regular appender is attached to a logger + and again to a nested appender. + + + + + + Shuts down the repository for the repository specified. + + The assembly to use to lookup the repository. + + + Calling this method will safely close and remove all + appenders in all the loggers including root contained in the + repository for the repository. The repository is looked up using + the specified. + + + Some appenders need to be closed before the application exists. + Otherwise, pending logging events might be lost. + + + The shutdown method is careful to close nested + appenders before closing regular appenders. This is allows + configurations where a regular appender is attached to a logger + and again to a nested appender. + + + + + + Resets all values contained in this repository instance to their defaults. + + The repository to reset. + + + Resets all values contained in the repository instance to their + defaults. This removes all appenders from all loggers, sets + the level of all non-root loggers to null, + sets their additivity flag to true and sets the level + of the root logger to . Moreover, + message disabling is set its default "off" value. + + + + + + Resets all values contained in this repository instance to their defaults. + + The assembly to use to lookup the repository to reset. + + + Resets all values contained in the repository instance to their + defaults. This removes all appenders from all loggers, sets + the level of all non-root loggers to null, + sets their additivity flag to true and sets the level + of the root logger to . Moreover, + message disabling is set its default "off" value. + + + + + + Creates a repository with the specified name. + + The name of the repository, this must be unique amongst repositories. + The created for the repository. + + + CreateDomain is obsolete. Use CreateRepository instead of CreateDomain. + + + Creates the default type of which is a + object. + + + The name must be unique. Repositories cannot be redefined. + An will be thrown if the repository already exists. + + + The specified repository already exists. + + + + Creates a repository with the specified name. + + The name of the repository, this must be unique amongst repositories. + The created for the repository. + + + Creates the default type of which is a + object. + + + The name must be unique. Repositories cannot be redefined. + An will be thrown if the repository already exists. + + + The specified repository already exists. + + + + Creates a repository with the specified name and repository type. + + The name of the repository, this must be unique to the repository. + A that implements + and has a no arg constructor. An instance of this type will be created to act + as the for the repository specified. + The created for the repository. + + + CreateDomain is obsolete. Use CreateRepository instead of CreateDomain. + + + The name must be unique. Repositories cannot be redefined. + An Exception will be thrown if the repository already exists. + + + The specified repository already exists. + + + + Creates a repository with the specified name and repository type. + + The name of the repository, this must be unique to the repository. + A that implements + and has a no arg constructor. An instance of this type will be created to act + as the for the repository specified. + The created for the repository. + + + The name must be unique. Repositories cannot be redefined. + An Exception will be thrown if the repository already exists. + + + The specified repository already exists. + + + + Creates a repository for the specified assembly and repository type. + + The assembly to use to get the name of the repository. + A that implements + and has a no arg constructor. An instance of this type will be created to act + as the for the repository specified. + The created for the repository. + + + CreateDomain is obsolete. Use CreateRepository instead of CreateDomain. + + + The created will be associated with the repository + specified such that a call to with the + same assembly specified will return the same repository instance. + + + + + + Creates a repository for the specified assembly and repository type. + + The assembly to use to get the name of the repository. + A that implements + and has a no arg constructor. An instance of this type will be created to act + as the for the repository specified. + The created for the repository. + + + The created will be associated with the repository + specified such that a call to with the + same assembly specified will return the same repository instance. + + + + + + Gets an array of all currently defined repositories. + + An array of all the known objects. + + + Gets an array of all currently defined repositories. + + + + + + Internal method to get pertinent version info. + + A string of version info. + + + + Called when the event fires + + the that is exiting + null + + + Called when the event fires. + + + When the event is triggered the log4net system is . + + + + + + Called when the event fires + + the that is exiting + null + + + Called when the event fires. + + + When the event is triggered the log4net system is . + + + + + + Initialize the default repository selector + + + + + Gets or sets the repository selector used by the . + + + The repository selector used by the . + + + + The repository selector () is used by + the to create and select repositories + (). + + + The caller to supplies either a string name + or an assembly (if not supplied the assembly is inferred using + ). + + + This context is used by the selector to lookup a specific repository. + + + For the full .NET Framework, the default repository is DefaultRepositorySelector; + for the .NET Compact Framework CompactRepositorySelector is the default + repository. + + + + + + Implementation of the interface. + + + + This class should be used as the base for all wrapper implementations. + + + Nicko Cadell + Gert Driesen + + + + Constructs a new wrapper for the specified logger. + + The logger to wrap. + + + Constructs a new wrapper for the specified logger. + + + + + + The logger that this object is wrapping + + + + + Gets the implementation behind this wrapper object. + + + The object that this object is implementing. + + + + The Logger object may not be the same object as this object + because of logger decorators. + + + This gets the actual underlying objects that is used to process + the log events. + + + + + + Portable data structure used by + + + + Portable data structure used by + + + Nicko Cadell + + + + The logger name. + + + + The logger name. + + + + + + Level of logging event. + + + + Level of logging event. Level cannot be Serializable + because it is a flyweight. Due to its special serialization it + cannot be declared final either. + + + + + + The application supplied message. + + + + The application supplied message of logging event. + + + + + + The name of thread + + + + The name of thread in which this logging event was generated + + + + + + The time the event was logged + + + + The TimeStamp is stored in the local time zone for this computer. + + + + + + Location information for the caller. + + + + Location information for the caller. + + + + + + String representation of the user + + + + String representation of the user's windows name, + like DOMAIN\username + + + + + + String representation of the identity. + + + + String representation of the current thread's principal identity. + + + + + + The string representation of the exception + + + + The string representation of the exception + + + + + + String representation of the AppDomain. + + + + String representation of the AppDomain. + + + + + + Additional event specific properties + + + + A logger or an appender may attach additional + properties to specific events. These properties + have a string key and an object value. + + + + + + Flags passed to the property + + + + Flags passed to the property + + + Nicko Cadell + + + + Fix the MDC + + + + + Fix the NDC + + + + + Fix the rendered message + + + + + Fix the thread name + + + + + Fix the callers location information + + + CAUTION: Very slow to generate + + + + + Fix the callers windows user name + + + CAUTION: Slow to generate + + + + + Fix the domain friendly name + + + + + Fix the callers principal name + + + CAUTION: May be slow to generate + + + + + Fix the exception text + + + + + Fix the event properties + + + + + No fields fixed + + + + + All fields fixed + + + + + Partial fields fixed + + + + This set of partial fields gives good performance. The following fields are fixed: + + + + + + + + + + + + + The internal representation of logging events. + + + + When an affirmative decision is made to log then a + instance is created. This instance + is passed around to the different log4net components. + + + This class is of concern to those wishing to extend log4net. + + + Some of the values in instances of + are considered volatile, that is the values are correct at the + time the event is delivered to appenders, but will not be consistent + at any time afterwards. If an event is to be stored and then processed + at a later time these volatile values must be fixed by calling + . There is a performance penalty + for incurred by calling but it + is essential to maintaining data consistency. + + + Nicko Cadell + Gert Driesen + Douglas de la Torre + Daniel Cazzulino + + + + The key into the Properties map for the host name value. + + + + + The key into the Properties map for the thread identity value. + + + + + The key into the Properties map for the user name value. + + + + + Initializes a new instance of the class + from the supplied parameters. + + The declaring type of the method that is + the stack boundary into the logging system for this call. + The repository this event is logged in. + The name of the logger of this event. + The level of this event. + The message of this event. + The exception for this event. + + + Except , and , + all fields of LoggingEvent are filled when actually needed. Call + to cache all data locally + to prevent inconsistencies. + + This method is called by the log4net framework + to create a logging event. + + + + + + Initializes a new instance of the class + using specific data. + + The declaring type of the method that is + the stack boundary into the logging system for this call. + The repository this event is logged in. + Data used to initialize the logging event. + The fields in the struct that have already been fixed. + + + This constructor is provided to allow a + to be created independently of the log4net framework. This can + be useful if you require a custom serialization scheme. + + + Use the method to obtain an + instance of the class. + + + The parameter should be used to specify which fields in the + struct have been preset. Fields not specified in the + will be captured from the environment if requested or fixed. + + + + + + Initializes a new instance of the class + using specific data. + + The declaring type of the method that is + the stack boundary into the logging system for this call. + The repository this event is logged in. + Data used to initialize the logging event. + + + This constructor is provided to allow a + to be created independently of the log4net framework. This can + be useful if you require a custom serialization scheme. + + + Use the method to obtain an + instance of the class. + + + This constructor sets this objects flags to , + this assumes that all the data relating to this event is passed in via the + parameter and no other data should be captured from the environment. + + + + + + Initializes a new instance of the class + using specific data. + + Data used to initialize the logging event. + + + This constructor is provided to allow a + to be created independently of the log4net framework. This can + be useful if you require a custom serialization scheme. + + + Use the method to obtain an + instance of the class. + + + This constructor sets this objects flags to , + this assumes that all the data relating to this event is passed in via the + parameter and no other data should be captured from the environment. + + + + + + Serialization constructor + + The that holds the serialized object data. + The that contains contextual information about the source or destination. + + + Initializes a new instance of the class + with serialized data. + + + + + + Ensure that the repository is set. + + the value for the repository + + + + Write the rendered message to a TextWriter + + the writer to write the message to + + + Unlike the property this method + does store the message data in the internal cache. Therefore + if called only once this method should be faster than the + property, however if the message is + to be accessed multiple times then the property will be more efficient. + + + + + + Serializes this object into the provided. + + The to populate with data. + The destination for this serialization. + + + The data in this event must be fixed before it can be serialized. + + + The method must be called during the + method call if this event + is to be used outside that method. + + + + + + Gets the portable data for this . + + The for this event. + + + A new can be constructed using a + instance. + + + Does a fix of the data + in the logging event before returning the event data. + + + + + + Gets the portable data for this . + + The set of data to ensure is fixed in the LoggingEventData + The for this event. + + + A new can be constructed using a + instance. + + + + + + Returns this event's exception's rendered using the + . + + + This event's exception's rendered using the . + + + + Obsolete. Use instead. + + + + + + Returns this event's exception's rendered using the + . + + + This event's exception's rendered using the . + + + + Returns this event's exception's rendered using the + . + + + + + + Fix instance fields that hold volatile data. + + + + Some of the values in instances of + are considered volatile, that is the values are correct at the + time the event is delivered to appenders, but will not be consistent + at any time afterwards. If an event is to be stored and then processed + at a later time these volatile values must be fixed by calling + . There is a performance penalty + incurred by calling but it + is essential to maintaining data consistency. + + + Calling is equivalent to + calling passing the parameter + false. + + + See for more + information. + + + + + + Fixes instance fields that hold volatile data. + + Set to true to not fix data that takes a long time to fix. + + + Some of the values in instances of + are considered volatile, that is the values are correct at the + time the event is delivered to appenders, but will not be consistent + at any time afterwards. If an event is to be stored and then processed + at a later time these volatile values must be fixed by calling + . There is a performance penalty + for incurred by calling but it + is essential to maintaining data consistency. + + + The param controls the data that + is fixed. Some of the data that can be fixed takes a long time to + generate, therefore if you do not require those settings to be fixed + they can be ignored by setting the param + to true. This setting will ignore the + and settings. + + + Set to false to ensure that all + settings are fixed. + + + + + + Fix the fields specified by the parameter + + the fields to fix + + + Only fields specified in the will be fixed. + Fields will not be fixed if they have previously been fixed. + It is not possible to 'unfix' a field. + + + + + + Lookup a composite property in this event + + the key for the property to lookup + the value for the property + + + This event has composite properties that combine together properties from + several different contexts in the following order: + + + this events properties + + This event has that can be set. These + properties are specific to this event only. + + + + the thread properties + + The that are set on the current + thread. These properties are shared by all events logged on this thread. + + + + the global properties + + The that are set globally. These + properties are shared by all the threads in the AppDomain. + + + + + + + + + Get all the composite properties in this event + + the containing all the properties + + + See for details of the composite properties + stored by the event. + + + This method returns a single containing all the + properties defined for this event. + + + + + + The internal logging event data. + + + + + The internal logging event data. + + + + + The internal logging event data. + + + + + The fully qualified Type of the calling + logger class in the stack frame (i.e. the declaring type of the method). + + + + + The application supplied message of logging event. + + + + + The exception that was thrown. + + + This is not serialized. The string representation + is serialized instead. + + + + + The repository that generated the logging event + + + This is not serialized. + + + + + The fix state for this event + + + These flags indicate which fields have been fixed. + Not serialized. + + + + + Indicated that the internal cache is updateable (ie not fixed) + + + This is a seperate flag to m_fixFlags as it allows incrementel fixing and simpler + changes in the caching strategy. + + + + + Gets the time when the current process started. + + + This is the time when this process started. + + + + The TimeStamp is stored in the local time zone for this computer. + + + Tries to get the start time for the current process. + Failing that it returns the time of the first call to + this property. + + + Note that AppDomains may be loaded and unloaded within the + same process without the process terminating and therefore + without the process start time being reset. + + + + + + Gets the of the logging event. + + + The of the logging event. + + + + Gets the of the logging event. + + + + + + Gets the time of the logging event. + + + The time of the logging event. + + + + The TimeStamp is stored in the local time zone for this computer. + + + + + + Gets the name of the logger that logged the event. + + + The name of the logger that logged the event. + + + + Gets the name of the logger that logged the event. + + + + + + Gets the location information for this logging event. + + + The location information for this logging event. + + + + The collected information is cached for future use. + + + See the class for more information on + supported frameworks and the different behavior in Debug and + Release builds. + + + + + + Gets the message object used to initialize this event. + + + The message object used to initialize this event. + + + + Gets the message object used to initialize this event. + Note that this event may not have a valid message object. + If the event is serialized the message object will not + be transferred. To get the text of the message the + property must be used + not this property. + + + If there is no defined message object for this event then + null will be returned. + + + + + + Gets the exception object used to initialize this event. + + + The exception object used to initialize this event. + + + + Gets the exception object used to initialize this event. + Note that this event may not have a valid exception object. + If the event is serialized the exception object will not + be transferred. To get the text of the exception the + method must be used + not this property. + + + If there is no defined exception object for this event then + null will be returned. + + + + + + The that this event was created in. + + + + The that this event was created in. + + + + + + Gets the message, rendered through the . + + + The message rendered through the . + + + + The collected information is cached for future use. + + + + + + Gets the name of the current thread. + + + The name of the current thread, or the thread ID when + the name is not available. + + + + The collected information is cached for future use. + + + + + + Gets the name of the current user. + + + The name of the current user, or NOT AVAILABLE when the + underlying runtime has no support for retrieving the name of the + current user. + + + + Calls WindowsIdentity.GetCurrent().Name to get the name of + the current windows user. + + + To improve performance, we could cache the string representation of + the name, and reuse that as long as the identity stayed constant. + Once the identity changed, we would need to re-assign and re-render + the string. + + + However, the WindowsIdentity.GetCurrent() call seems to + return different objects every time, so the current implementation + doesn't do this type of caching. + + + Timing for these operations: + + + + Method + Results + + + WindowsIdentity.GetCurrent() + 10000 loops, 00:00:00.2031250 seconds + + + WindowsIdentity.GetCurrent().Name + 10000 loops, 00:00:08.0468750 seconds + + + + This means we could speed things up almost 40 times by caching the + value of the WindowsIdentity.GetCurrent().Name property, since + this takes (8.04-0.20) = 7.84375 seconds. + + + + + + Gets the identity of the current thread principal. + + + The string name of the identity of the current thread principal. + + + + Calls System.Threading.Thread.CurrentPrincipal.Identity.Name to get + the name of the current thread principal. + + + + + + Gets the AppDomain friendly name. + + + The AppDomain friendly name. + + + + Gets the AppDomain friendly name. + + + + + + Additional event specific properties. + + + Additional event specific properties. + + + + A logger or an appender may attach additional + properties to specific events. These properties + have a string key and an object value. + + + This property is for events that have been added directly to + this event. The aggregate properties (which include these + event properties) can be retrieved using + and . + + + Once the properties have been fixed this property + returns the combined cached properties. This ensures that updates to + this property are always reflected in the underlying storage. When + returning the combined properties there may be more keys in the + Dictionary than expected. + + + + + + The fixed fields in this event + + + The set of fields that are fixed in this event + + + + Fields will not be fixed if they have previously been fixed. + It is not possible to 'unfix' a field. + + + + + + Implementation of wrapper interface. + + + + This implementation of the interface + forwards to the held by the base class. + + + This logger has methods to allow the caller to log at the following + levels: + + + + DEBUG + + The and methods log messages + at the DEBUG level. That is the level with that name defined in the + repositories . The default value + for this level is . The + property tests if this level is enabled for logging. + + + + INFO + + The and methods log messages + at the INFO level. That is the level with that name defined in the + repositories . The default value + for this level is . The + property tests if this level is enabled for logging. + + + + WARN + + The and methods log messages + at the WARN level. That is the level with that name defined in the + repositories . The default value + for this level is . The + property tests if this level is enabled for logging. + + + + ERROR + + The and methods log messages + at the ERROR level. That is the level with that name defined in the + repositories . The default value + for this level is . The + property tests if this level is enabled for logging. + + + + FATAL + + The and methods log messages + at the FATAL level. That is the level with that name defined in the + repositories . The default value + for this level is . The + property tests if this level is enabled for logging. + + + + + The values for these levels and their semantic meanings can be changed by + configuring the for the repository. + + + Nicko Cadell + Gert Driesen + + + + The ILog interface is use by application to log messages into + the log4net framework. + + + + Use the to obtain logger instances + that implement this interface. The + static method is used to get logger instances. + + + This class contains methods for logging at different levels and also + has properties for determining if those logging levels are + enabled in the current configuration. + + + This interface can be implemented in different ways. This documentation + specifies reasonable behavior that a caller can expect from the actual + implementation, however different implementations reserve the right to + do things differently. + + + Simple example of logging messages + + ILog log = LogManager.GetLogger("application-log"); + + log.Info("Application Start"); + log.Debug("This is a debug message"); + + if (log.IsDebugEnabled) + { + log.Debug("This is another debug message"); + } + + + + + Nicko Cadell + Gert Driesen + + + Log a message object with the level. + + Log a message object with the level. + + The message object to log. + + + This method first checks if this logger is DEBUG + enabled by comparing the level of this logger with the + level. If this logger is + DEBUG enabled, then it converts the message object + (passed as parameter) to a string by invoking the appropriate + . It then + proceeds to call all the registered appenders in this logger + and also higher in the hierarchy depending on the value of + the additivity flag. + + WARNING Note that passing an + to this method will print the name of the + but no stack trace. To print a stack trace use the + form instead. + + + + + + + + Log a message object with the level including + the stack trace of the passed + as a parameter. + + The message object to log. + The exception to log, including its stack trace. + + + See the form for more detailed information. + + + + + + + Log a formatted string with the level. + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + An that supplies culture-specific formatting information + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + Log a message object with the level. + + Logs a message object with the level. + + + + This method first checks if this logger is INFO + enabled by comparing the level of this logger with the + level. If this logger is + INFO enabled, then it converts the message object + (passed as parameter) to a string by invoking the appropriate + . It then + proceeds to call all the registered appenders in this logger + and also higher in the hierarchy depending on the value of the + additivity flag. + + WARNING Note that passing an + to this method will print the name of the + but no stack trace. To print a stack trace use the + form instead. + + + The message object to log. + + + + + + Logs a message object with the INFO level including + the stack trace of the passed + as a parameter. + + The message object to log. + The exception to log, including its stack trace. + + + See the form for more detailed information. + + + + + + + Log a formatted message string with the level. + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + An that supplies culture-specific formatting information + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + Log a message object with the level. + + Log a message object with the level. + + + + This method first checks if this logger is WARN + enabled by comparing the level of this logger with the + level. If this logger is + WARN enabled, then it converts the message object + (passed as parameter) to a string by invoking the appropriate + . It then + proceeds to call all the registered appenders in this logger + and also higher in the hierarchy depending on the value of the + additivity flag. + + WARNING Note that passing an + to this method will print the name of the + but no stack trace. To print a stack trace use the + form instead. + + + The message object to log. + + + + + + Log a message object with the level including + the stack trace of the passed + as a parameter. + + The message object to log. + The exception to log, including its stack trace. + + + See the form for more detailed information. + + + + + + + Log a formatted message string with the level. + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + An that supplies culture-specific formatting information + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + Log a message object with the level. + + Logs a message object with the level. + + The message object to log. + + + This method first checks if this logger is ERROR + enabled by comparing the level of this logger with the + level. If this logger is + ERROR enabled, then it converts the message object + (passed as parameter) to a string by invoking the appropriate + . It then + proceeds to call all the registered appenders in this logger + and also higher in the hierarchy depending on the value of the + additivity flag. + + WARNING Note that passing an + to this method will print the name of the + but no stack trace. To print a stack trace use the + form instead. + + + + + + + + Log a message object with the level including + the stack trace of the passed + as a parameter. + + The message object to log. + The exception to log, including its stack trace. + + + See the form for more detailed information. + + + + + + + Log a formatted message string with the level. + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + An that supplies culture-specific formatting information + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + Log a message object with the level. + + Log a message object with the level. + + + + This method first checks if this logger is FATAL + enabled by comparing the level of this logger with the + level. If this logger is + FATAL enabled, then it converts the message object + (passed as parameter) to a string by invoking the appropriate + . It then + proceeds to call all the registered appenders in this logger + and also higher in the hierarchy depending on the value of the + additivity flag. + + WARNING Note that passing an + to this method will print the name of the + but no stack trace. To print a stack trace use the + form instead. + + + The message object to log. + + + + + + Log a message object with the level including + the stack trace of the passed + as a parameter. + + The message object to log. + The exception to log, including its stack trace. + + + See the form for more detailed information. + + + + + + + Log a formatted message string with the level. + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + An that supplies culture-specific formatting information + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Checks if this logger is enabled for the level. + + + true if this logger is enabled for events, false otherwise. + + + + This function is intended to lessen the computational cost of + disabled log debug statements. + + For some ILog interface log, when you write: + + log.Debug("This is entry number: " + i ); + + + You incur the cost constructing the message, string construction and concatenation in + this case, regardless of whether the message is logged or not. + + + If you are worried about speed (who isn't), then you should write: + + + if (log.IsDebugEnabled) + { + log.Debug("This is entry number: " + i ); + } + + + This way you will not incur the cost of parameter + construction if debugging is disabled for log. On + the other hand, if the log is debug enabled, you + will incur the cost of evaluating whether the logger is debug + enabled twice. Once in and once in + the . This is an insignificant overhead + since evaluating a logger takes about 1% of the time it + takes to actually log. This is the preferred style of logging. + + Alternatively if your logger is available statically then the is debug + enabled state can be stored in a static variable like this: + + + private static readonly bool isDebugEnabled = log.IsDebugEnabled; + + + Then when you come to log you can write: + + + if (isDebugEnabled) + { + log.Debug("This is entry number: " + i ); + } + + + This way the debug enabled state is only queried once + when the class is loaded. Using a private static readonly + variable is the most efficient because it is a run time constant + and can be heavily optimized by the JIT compiler. + + + Of course if you use a static readonly variable to + hold the enabled state of the logger then you cannot + change the enabled state at runtime to vary the logging + that is produced. You have to decide if you need absolute + speed or runtime flexibility. + + + + + + + + Checks if this logger is enabled for the level. + + + true if this logger is enabled for events, false otherwise. + + + For more information see . + + + + + + + + Checks if this logger is enabled for the level. + + + true if this logger is enabled for events, false otherwise. + + + For more information see . + + + + + + + + Checks if this logger is enabled for the level. + + + true if this logger is enabled for events, false otherwise. + + + For more information see . + + + + + + + + Checks if this logger is enabled for the level. + + + true if this logger is enabled for events, false otherwise. + + + For more information see . + + + + + + + + Construct a new wrapper for the specified logger. + + The logger to wrap. + + + Construct a new wrapper for the specified logger. + + + + + + Virtual method called when the configuration of the repository changes + + the repository holding the levels + + + Virtual method called when the configuration of the repository changes + + + + + + Logs a message object with the DEBUG level. + + The message object to log. + + + This method first checks if this logger is DEBUG + enabled by comparing the level of this logger with the + DEBUG level. If this logger is + DEBUG enabled, then it converts the message object + (passed as parameter) to a string by invoking the appropriate + . It then + proceeds to call all the registered appenders in this logger + and also higher in the hierarchy depending on the value of the + additivity flag. + + + WARNING Note that passing an + to this method will print the name of the + but no stack trace. To print a stack trace use the + form instead. + + + + + + Logs a message object with the DEBUG level + + The message object to log. + The exception to log, including its stack trace. + + + Logs a message object with the DEBUG level including + the stack trace of the passed + as a parameter. + + + See the form for more detailed information. + + + + + + + Logs a formatted message string with the DEBUG level. + + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the DEBUG level. + + A String containing zero or more format items + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the DEBUG level. + + A String containing zero or more format items + An Object to format + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the DEBUG level. + + A String containing zero or more format items + An Object to format + An Object to format + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the DEBUG level. + + An that supplies culture-specific formatting information + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a message object with the INFO level. + + The message object to log. + + + This method first checks if this logger is INFO + enabled by comparing the level of this logger with the + INFO level. If this logger is + INFO enabled, then it converts the message object + (passed as parameter) to a string by invoking the appropriate + . It then + proceeds to call all the registered appenders in this logger + and also higher in the hierarchy depending on the value of + the additivity flag. + + + WARNING Note that passing an + to this method will print the name of the + but no stack trace. To print a stack trace use the + form instead. + + + + + + Logs a message object with the INFO level. + + The message object to log. + The exception to log, including its stack trace. + + + Logs a message object with the INFO level including + the stack trace of the + passed as a parameter. + + + See the form for more detailed information. + + + + + + + Logs a formatted message string with the INFO level. + + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the INFO level. + + A String containing zero or more format items + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the INFO level. + + A String containing zero or more format items + An Object to format + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the INFO level. + + A String containing zero or more format items + An Object to format + An Object to format + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the INFO level. + + An that supplies culture-specific formatting information + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a message object with the WARN level. + + the message object to log + + + This method first checks if this logger is WARN + enabled by comparing the level of this logger with the + WARN level. If this logger is + WARN enabled, then it converts the message object + (passed as parameter) to a string by invoking the appropriate + . It then + proceeds to call all the registered appenders in this logger and + also higher in the hierarchy depending on the value of the + additivity flag. + + + WARNING Note that passing an to this + method will print the name of the but no + stack trace. To print a stack trace use the + form instead. + + + + + + Logs a message object with the WARN level + + The message object to log. + The exception to log, including its stack trace. + + + Logs a message object with the WARN level including + the stack trace of the + passed as a parameter. + + + See the form for more detailed information. + + + + + + + Logs a formatted message string with the WARN level. + + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the WARN level. + + A String containing zero or more format items + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the WARN level. + + A String containing zero or more format items + An Object to format + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the WARN level. + + A String containing zero or more format items + An Object to format + An Object to format + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the WARN level. + + An that supplies culture-specific formatting information + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a message object with the ERROR level. + + The message object to log. + + + This method first checks if this logger is ERROR + enabled by comparing the level of this logger with the + ERROR level. If this logger is + ERROR enabled, then it converts the message object + (passed as parameter) to a string by invoking the appropriate + . It then + proceeds to call all the registered appenders in this logger and + also higher in the hierarchy depending on the value of the + additivity flag. + + + WARNING Note that passing an to this + method will print the name of the but no + stack trace. To print a stack trace use the + form instead. + + + + + + Logs a message object with the ERROR level + + The message object to log. + The exception to log, including its stack trace. + + + Logs a message object with the ERROR level including + the stack trace of the + passed as a parameter. + + + See the form for more detailed information. + + + + + + + Logs a formatted message string with the ERROR level. + + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the ERROR level. + + A String containing zero or more format items + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the ERROR level. + + A String containing zero or more format items + An Object to format + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the ERROR level. + + A String containing zero or more format items + An Object to format + An Object to format + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the ERROR level. + + An that supplies culture-specific formatting information + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a message object with the FATAL level. + + The message object to log. + + + This method first checks if this logger is FATAL + enabled by comparing the level of this logger with the + FATAL level. If this logger is + FATAL enabled, then it converts the message object + (passed as parameter) to a string by invoking the appropriate + . It then + proceeds to call all the registered appenders in this logger and + also higher in the hierarchy depending on the value of the + additivity flag. + + + WARNING Note that passing an to this + method will print the name of the but no + stack trace. To print a stack trace use the + form instead. + + + + + + Logs a message object with the FATAL level + + The message object to log. + The exception to log, including its stack trace. + + + Logs a message object with the FATAL level including + the stack trace of the + passed as a parameter. + + + See the form for more detailed information. + + + + + + + Logs a formatted message string with the FATAL level. + + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the FATAL level. + + A String containing zero or more format items + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the FATAL level. + + A String containing zero or more format items + An Object to format + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the FATAL level. + + A String containing zero or more format items + An Object to format + An Object to format + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the FATAL level. + + An that supplies culture-specific formatting information + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Event handler for the event + + the repository + Empty + + + + The fully qualified name of this declaring type not the type of any subclass. + + + + + Checks if this logger is enabled for the DEBUG + level. + + + true if this logger is enabled for DEBUG events, + false otherwise. + + + + This function is intended to lessen the computational cost of + disabled log debug statements. + + + For some log Logger object, when you write: + + + log.Debug("This is entry number: " + i ); + + + You incur the cost constructing the message, concatenation in + this case, regardless of whether the message is logged or not. + + + If you are worried about speed, then you should write: + + + if (log.IsDebugEnabled()) + { + log.Debug("This is entry number: " + i ); + } + + + This way you will not incur the cost of parameter + construction if debugging is disabled for log. On + the other hand, if the log is debug enabled, you + will incur the cost of evaluating whether the logger is debug + enabled twice. Once in IsDebugEnabled and once in + the Debug. This is an insignificant overhead + since evaluating a logger takes about 1% of the time it + takes to actually log. + + + + + + Checks if this logger is enabled for the INFO level. + + + true if this logger is enabled for INFO events, + false otherwise. + + + + See for more information and examples + of using this method. + + + + + + + Checks if this logger is enabled for the WARN level. + + + true if this logger is enabled for WARN events, + false otherwise. + + + + See for more information and examples + of using this method. + + + + + + + Checks if this logger is enabled for the ERROR level. + + + true if this logger is enabled for ERROR events, + false otherwise. + + + + See for more information and examples of using this method. + + + + + + + Checks if this logger is enabled for the FATAL level. + + + true if this logger is enabled for FATAL events, + false otherwise. + + + + See for more information and examples of using this method. + + + + + + + A SecurityContext used by log4net when interacting with protected resources + + + + A SecurityContext used by log4net when interacting with protected resources + for example with operating system services. This can be used to impersonate + a principal that has been granted privileges on the system resources. + + + Nicko Cadell + + + + Impersonate this SecurityContext + + State supplied by the caller + An instance that will + revoke the impersonation of this SecurityContext, or null + + + Impersonate this security context. Further calls on the current + thread should now be made in the security context provided + by this object. When the result + method is called the security + context of the thread should be reverted to the state it was in + before was called. + + + + + + The providers default instances. + + + + A configured component that interacts with potentially protected system + resources uses a to provide the elevated + privileges required. If the object has + been not been explicitly provided to the component then the component + will request one from this . + + + By default the is + an instance of which returns only + objects. This is a reasonable default + where the privileges required are not know by the system. + + + This default behavior can be overridden by subclassing the + and overriding the method to return + the desired objects. The default provider + can be replaced by programmatically setting the value of the + property. + + + An alternative is to use the log4net.Config.SecurityContextProviderAttribute + This attribute can be applied to an assembly in the same way as the + log4net.Config.XmlConfiguratorAttribute". The attribute takes + the type to use as the as an argument. + + + Nicko Cadell + + + + The default provider + + + + + Protected default constructor to allow subclassing + + + + Protected default constructor to allow subclassing + + + + + + Create a SecurityContext for a consumer + + The consumer requesting the SecurityContext + An impersonation context + + + The default implementation is to return a . + + + Subclasses should override this method to provide their own + behavior. + + + + + + Gets or sets the default SecurityContextProvider + + + The default SecurityContextProvider + + + + The default provider is used by configured components that + require a and have not had one + given to them. + + + By default this is an instance of + that returns objects. + + + The default provider can be set programmatically by setting + the value of this property to a sub class of + that has the desired behavior. + + + + + + Delegate used to handle creation of new wrappers. + + The logger to wrap in a wrapper. + + + Delegate used to handle creation of new wrappers. This delegate + is called from the + method to construct the wrapper for the specified logger. + + + The delegate to use is supplied to the + constructor. + + + + + + Maps between logger objects and wrapper objects. + + + + This class maintains a mapping between objects and + objects. Use the method to + lookup the for the specified . + + + New wrapper instances are created by the + method. The default behavior is for this method to delegate construction + of the wrapper to the delegate supplied + to the constructor. This allows specialization of the behavior without + requiring subclassing of this type. + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the + + The handler to use to create the wrapper objects. + + + Initializes a new instance of the class with + the specified handler to create the wrapper objects. + + + + + + Gets the wrapper object for the specified logger. + + The wrapper object for the specified logger + + + If the logger is null then the corresponding wrapper is null. + + + Looks up the wrapper it it has previously been requested and + returns it. If the wrapper has never been requested before then + the virtual method is + called. + + + + + + Creates the wrapper object for the specified logger. + + The logger to wrap in a wrapper. + The wrapper object for the logger. + + + This implementation uses the + passed to the constructor to create the wrapper. This method + can be overridden in a subclass. + + + + + + Called when a monitored repository shutdown event is received. + + The that is shutting down + + + This method is called when a that this + is holding loggers for has signaled its shutdown + event . The default + behavior of this method is to release the references to the loggers + and their wrappers generated for this repository. + + + + + + Event handler for repository shutdown event. + + The sender of the event. + The event args. + + + + Map of logger repositories to hashtables of ILogger to ILoggerWrapper mappings + + + + + The handler to use to create the extension wrapper objects. + + + + + Internal reference to the delegate used to register for repository shutdown events. + + + + + Gets the map of logger repositories. + + + Map of logger repositories. + + + + Gets the hashtable that is keyed on . The + values are hashtables keyed on with the + value being the corresponding . + + + + + + Formats a as "HH:mm:ss,fff". + + + + Formats a in the format "HH:mm:ss,fff" for example, "15:49:37,459". + + + Nicko Cadell + Gert Driesen + + + + Render a as a string. + + + + Interface to abstract the rendering of a + instance into a string. + + + The method is used to render the + date to a text writer. + + + Nicko Cadell + Gert Driesen + + + + Formats the specified date as a string. + + The date to format. + The writer to write to. + + + Format the as a string and write it + to the provided. + + + + + + String constant used to specify AbsoluteTimeDateFormat in layouts. Current value is ABSOLUTE. + + + + + String constant used to specify DateTimeDateFormat in layouts. Current value is DATE. + + + + + String constant used to specify ISO8601DateFormat in layouts. Current value is ISO8601. + + + + + Renders the date into a string. Format is "HH:mm:ss". + + The date to render into a string. + The string builder to write to. + + + Subclasses should override this method to render the date + into a string using a precision up to the second. This method + will be called at most once per second and the result will be + reused if it is needed again during the same second. + + + + + + Renders the date into a string. Format is "HH:mm:ss,fff". + + The date to render into a string. + The writer to write to. + + + Uses the method to generate the + time string up to the seconds and then appends the current + milliseconds. The results from are + cached and is called at most once + per second. + + + Sub classes should override + rather than . + + + + + + Last stored time with precision up to the second. + + + + + Last stored time with precision up to the second, formatted + as a string. + + + + + Last stored time with precision up to the second, formatted + as a string. + + + + + Formats a as "dd MMM yyyy HH:mm:ss,fff" + + + + Formats a in the format + "dd MMM yyyy HH:mm:ss,fff" for example, + "06 Nov 1994 15:49:37,459". + + + Nicko Cadell + Gert Driesen + Angelika Schnagl + + + + Default constructor. + + + + Initializes a new instance of the class. + + + + + + Formats the date without the milliseconds part + + The date to format. + The string builder to write to. + + + Formats a DateTime in the format "dd MMM yyyy HH:mm:ss" + for example, "06 Nov 1994 15:49:37". + + + The base class will append the ",fff" milliseconds section. + This method will only be called at most once per second. + + + + + + The format info for the invariant culture. + + + + + Formats the as "yyyy-MM-dd HH:mm:ss,fff". + + + + Formats the specified as a string: "yyyy-MM-dd HH:mm:ss,fff". + + + Nicko Cadell + Gert Driesen + + + + Default constructor + + + + Initializes a new instance of the class. + + + + + + Formats the date without the milliseconds part + + The date to format. + The string builder to write to. + + + Formats the date specified as a string: "yyyy-MM-dd HH:mm:ss". + + + The base class will append the ",fff" milliseconds section. + This method will only be called at most once per second. + + + + + + Formats the using the method. + + + + Formats the using the method. + + + Nicko Cadell + Gert Driesen + + + + Constructor + + The format string. + + + Initializes a new instance of the class + with the specified format string. + + + The format string must be compatible with the options + that can be supplied to . + + + + + + Formats the date using . + + The date to convert to a string. + The writer to write to. + + + Uses the date format string supplied to the constructor to call + the method to format the date. + + + + + + The format string used to format the . + + + + The format string must be compatible with the options + that can be supplied to . + + + + + + This filter drops all . + + + + You can add this filter to the end of a filter chain to + switch from the default "accept all unless instructed otherwise" + filtering behavior to a "deny all unless instructed otherwise" + behavior. + + + Nicko Cadell + Gert Driesen + + + + Subclass this type to implement customized logging event filtering + + + + Users should extend this class to implement customized logging + event filtering. Note that and + , the parent class of all standard + appenders, have built-in filtering rules. It is suggested that you + first use and understand the built-in rules before rushing to write + your own custom filters. + + + This abstract class assumes and also imposes that filters be + organized in a linear chain. The + method of each filter is called sequentially, in the order of their + addition to the chain. + + + The method must return one + of the integer constants , + or . + + + If the value is returned, then the log event is dropped + immediately without consulting with the remaining filters. + + + If the value is returned, then the next filter + in the chain is consulted. If there are no more filters in the + chain, then the log event is logged. Thus, in the presence of no + filters, the default behavior is to log all logging events. + + + If the value is returned, then the log + event is logged without consulting the remaining filters. + + + The philosophy of log4net filters is largely inspired from the + Linux ipchains. + + + Nicko Cadell + Gert Driesen + + + + Implement this interface to provide customized logging event filtering + + + + Users should implement this interface to implement customized logging + event filtering. Note that and + , the parent class of all standard + appenders, have built-in filtering rules. It is suggested that you + first use and understand the built-in rules before rushing to write + your own custom filters. + + + This abstract class assumes and also imposes that filters be + organized in a linear chain. The + method of each filter is called sequentially, in the order of their + addition to the chain. + + + The method must return one + of the integer constants , + or . + + + If the value is returned, then the log event is dropped + immediately without consulting with the remaining filters. + + + If the value is returned, then the next filter + in the chain is consulted. If there are no more filters in the + chain, then the log event is logged. Thus, in the presence of no + filters, the default behavior is to log all logging events. + + + If the value is returned, then the log + event is logged without consulting the remaining filters. + + + The philosophy of log4net filters is largely inspired from the + Linux ipchains. + + + Nicko Cadell + Gert Driesen + + + + Decide if the logging event should be logged through an appender. + + The LoggingEvent to decide upon + The decision of the filter + + + If the decision is , then the event will be + dropped. If the decision is , then the next + filter, if any, will be invoked. If the decision is then + the event will be logged without consulting with other filters in + the chain. + + + + + + Property to get and set the next filter + + + The next filter in the chain + + + + Filters are typically composed into chains. This property allows the next filter in + the chain to be accessed. + + + + + + Points to the next filter in the filter chain. + + + + See for more information. + + + + + + Initialize the filter with the options set + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + Typically filter's options become active immediately on set, + however this method must still be called. + + + + + + Decide if the should be logged through an appender. + + The to decide upon + The decision of the filter + + + If the decision is , then the event will be + dropped. If the decision is , then the next + filter, if any, will be invoked. If the decision is then + the event will be logged without consulting with other filters in + the chain. + + + This method is marked abstract and must be implemented + in a subclass. + + + + + + Property to get and set the next filter + + + The next filter in the chain + + + + Filters are typically composed into chains. This property allows the next filter in + the chain to be accessed. + + + + + + Default constructor + + + + + Always returns the integer constant + + the LoggingEvent to filter + Always returns + + + Ignores the event being logged and just returns + . This can be used to change the default filter + chain behavior from to . This filter + should only be used as the last filter in the chain + as any further filters will be ignored! + + + + + + The return result from + + + + The return result from + + + + + + The log event must be dropped immediately without + consulting with the remaining filters, if any, in the chain. + + + + + This filter is neutral with respect to the log event. + The remaining filters, if any, should be consulted for a final decision. + + + + + The log event must be logged immediately without + consulting with the remaining filters, if any, in the chain. + + + + + This is a very simple filter based on matching. + + + + The filter admits two options and + . If there is an exact match between the value + of the option and the of the + , then the method returns in + case the option value is set + to true, if it is false then + is returned. If the does not match then + the result will be . + + + Nicko Cadell + Gert Driesen + + + + flag to indicate if the filter should on a match + + + + + the to match against + + + + + Default constructor + + + + + Tests if the of the logging event matches that of the filter + + the event to filter + see remarks + + + If the of the event matches the level of the + filter then the result of the function depends on the + value of . If it is true then + the function will return , it it is false then it + will return . If the does not match then + the result will be . + + + + + + when matching + + + + The property is a flag that determines + the behavior when a matching is found. If the + flag is set to true then the filter will the + logging event, otherwise it will the event. + + + The default is true i.e. to the event. + + + + + + The that the filter will match + + + + The level that this filter will attempt to match against the + level. If a match is found then + the result depends on the value of . + + + + + + This is a simple filter based on matching. + + + + The filter admits three options and + that determine the range of priorities that are matched, and + . If there is a match between the range + of priorities and the of the , then the + method returns in case the + option value is set to true, if it is false + then is returned. If there is no match, is returned. + + + Nicko Cadell + Gert Driesen + + + + Flag to indicate the behavior when matching a + + + + + the minimum value to match + + + + + the maximum value to match + + + + + Default constructor + + + + + Check if the event should be logged. + + the logging event to check + see remarks + + + If the of the logging event is outside the range + matched by this filter then + is returned. If the is matched then the value of + is checked. If it is true then + is returned, otherwise + is returned. + + + + + + when matching and + + + + The property is a flag that determines + the behavior when a matching is found. If the + flag is set to true then the filter will the + logging event, otherwise it will the event. + + + The default is true i.e. to the event. + + + + + + Set the minimum matched + + + + The minimum level that this filter will attempt to match against the + level. If a match is found then + the result depends on the value of . + + + + + + Sets the maximum matched + + + + The maximum level that this filter will attempt to match against the + level. If a match is found then + the result depends on the value of . + + + + + + Simple filter to match a string in the event's logger name. + + + + The works very similar to the . It admits two + options and . If the + of the starts + with the value of the option, then the + method returns in + case the option value is set to true, + if it is false then is returned. + + + Daniel Cazzulino + + + + Flag to indicate the behavior when we have a match + + + + + The logger name string to substring match against the event + + + + + Default constructor + + + + + Check if this filter should allow the event to be logged + + the event being logged + see remarks + + + The rendered message is matched against the . + If the equals the beginning of + the incoming () + then a match will have occurred. If no match occurs + this function will return + allowing other filters to check the event. If a match occurs then + the value of is checked. If it is + true then is returned otherwise + is returned. + + + + + + when matching + + + + The property is a flag that determines + the behavior when a matching is found. If the + flag is set to true then the filter will the + logging event, otherwise it will the event. + + + The default is true i.e. to the event. + + + + + + The that the filter will match + + + + This filter will attempt to match this value against logger name in + the following way. The match will be done against the beginning of the + logger name (using ). The match is + case sensitive. If a match is found then + the result depends on the value of . + + + + + + Simple filter to match a keyed string in the + + + + Simple filter to match a keyed string in the + + + As the MDC has been replaced with layered properties the + should be used instead. + + + Nicko Cadell + Gert Driesen + + + + Simple filter to match a string an event property + + + + Simple filter to match a string in the value for a + specific event property + + + Nicko Cadell + + + + Simple filter to match a string in the rendered message + + + + Simple filter to match a string in the rendered message + + + Nicko Cadell + Gert Driesen + + + + Flag to indicate the behavior when we have a match + + + + + The string to substring match against the message + + + + + A string regex to match + + + + + A regex object to match (generated from m_stringRegexToMatch) + + + + + Default constructor + + + + + Initialize and precompile the Regex if required + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Check if this filter should allow the event to be logged + + the event being logged + see remarks + + + The rendered message is matched against the . + If the occurs as a substring within + the message then a match will have occurred. If no match occurs + this function will return + allowing other filters to check the event. If a match occurs then + the value of is checked. If it is + true then is returned otherwise + is returned. + + + + + + when matching or + + + + The property is a flag that determines + the behavior when a matching is found. If the + flag is set to true then the filter will the + logging event, otherwise it will the event. + + + The default is true i.e. to the event. + + + + + + Sets the static string to match + + + + The string that will be substring matched against + the rendered message. If the message contains this + string then the filter will match. If a match is found then + the result depends on the value of . + + + One of or + must be specified. + + + + + + Sets the regular expression to match + + + + The regular expression pattern that will be matched against + the rendered message. If the message matches this + pattern then the filter will match. If a match is found then + the result depends on the value of . + + + One of or + must be specified. + + + + + + The key to use to lookup the string from the event properties + + + + + Default constructor + + + + + Check if this filter should allow the event to be logged + + the event being logged + see remarks + + + The event property for the is matched against + the . + If the occurs as a substring within + the property value then a match will have occurred. If no match occurs + this function will return + allowing other filters to check the event. If a match occurs then + the value of is checked. If it is + true then is returned otherwise + is returned. + + + + + + The key to lookup in the event properties and then match against. + + + + The key name to use to lookup in the properties map of the + . The match will be performed against + the value of this property if it exists. + + + + + + Simple filter to match a string in the + + + + Simple filter to match a string in the + + + As the MDC has been replaced with named stacks stored in the + properties collections the should + be used instead. + + + Nicko Cadell + Gert Driesen + + + + Default constructor + + + + Sets the to "NDC". + + + + + + Write the event appdomain name to the output + + + + Writes the to the output writer. + + + Daniel Cazzulino + Nicko Cadell + + + + Abstract class that provides the formatting functionality that + derived classes need. + + + Conversion specifiers in a conversion patterns are parsed to + individual PatternConverters. Each of which is responsible for + converting a logging event in a converter specific manner. + + Nicko Cadell + + + + Abstract class that provides the formatting functionality that + derived classes need. + + + + Conversion specifiers in a conversion patterns are parsed to + individual PatternConverters. Each of which is responsible for + converting a logging event in a converter specific manner. + + + Nicko Cadell + Gert Driesen + + + + Initial buffer size + + + + + Maximum buffer size before it is recycled + + + + + Protected constructor + + + + Initializes a new instance of the class. + + + + + + Evaluate this pattern converter and write the output to a writer. + + that will receive the formatted result. + The state object on which the pattern converter should be executed. + + + Derived pattern converters must override this method in order to + convert conversion specifiers in the appropriate way. + + + + + + Set the next pattern converter in the chains + + the pattern converter that should follow this converter in the chain + the next converter + + + The PatternConverter can merge with its neighbor during this method (or a sub class). + Therefore the return value may or may not be the value of the argument passed in. + + + + + + Write the pattern converter to the writer with appropriate formatting + + that will receive the formatted result. + The state object on which the pattern converter should be executed. + + + This method calls to allow the subclass to perform + appropriate conversion of the pattern converter. If formatting options have + been specified via the then this method will + apply those formattings before writing the output. + + + + + + Fast space padding method. + + to which the spaces will be appended. + The number of spaces to be padded. + + + Fast space padding method. + + + + + + The option string to the converter + + + + + Write an dictionary to a + + the writer to write to + a to use for object conversion + the value to write to the writer + + + Writes the to a writer in the form: + + + {key1=value1, key2=value2, key3=value3} + + + If the specified + is not null then it is used to render the key and value to text, otherwise + the object's ToString method is called. + + + + + + Write an object to a + + the writer to write to + a to use for object conversion + the value to write to the writer + + + Writes the Object to a writer. If the specified + is not null then it is used to render the object to text, otherwise + the object's ToString method is called. + + + + + + Get the next pattern converter in the chain + + + the next pattern converter in the chain + + + + Get the next pattern converter in the chain + + + + + + Gets or sets the formatting info for this converter + + + The formatting info for this converter + + + + Gets or sets the formatting info for this converter + + + + + + Gets or sets the option value for this converter + + + The option for this converter + + + + Gets or sets the option value for this converter + + + + + + Initializes a new instance of the class. + + + + + Derived pattern converters must override this method in order to + convert conversion specifiers in the correct way. + + that will receive the formatted result. + The on which the pattern converter should be executed. + + + + Derived pattern converters must override this method in order to + convert conversion specifiers in the correct way. + + that will receive the formatted result. + The state object on which the pattern converter should be executed. + + + + Flag indicating if this converter handles exceptions + + + false if this converter handles exceptions + + + + + Flag indicating if this converter handles the logging event exception + + false if this converter handles the logging event exception + + + If this converter handles the exception object contained within + , then this property should be set to + false. Otherwise, if the layout ignores the exception + object, then the property should be set to true. + + + Set this value to override a this default setting. The default + value is true, this converter does not handle the exception. + + + + + + Write the event appdomain name to the output + + that will receive the formatted result. + the event being logged + + + Writes the to the output . + + + + + + Date pattern converter, uses a to format + the date of a . + + + + Render the to the writer as a string. + + + The value of the determines + the formatting of the date. The following values are allowed: + + + Option value + Output + + + ISO8601 + + Uses the formatter. + Formats using the "yyyy-MM-dd HH:mm:ss,fff" pattern. + + + + DATE + + Uses the formatter. + Formats using the "dd MMM yyyy HH:mm:ss,fff" for example, "06 Nov 1994 15:49:37,459". + + + + ABSOLUTE + + Uses the formatter. + Formats using the "HH:mm:ss,yyyy" for example, "15:49:37,459". + + + + other + + Any other pattern string uses the formatter. + This formatter passes the pattern string to the + method. + For details on valid patterns see + DateTimeFormatInfo Class. + + + + + + The is in the local time zone and is rendered in that zone. + To output the time in Universal time see . + + + Nicko Cadell + + + + The used to render the date to a string + + + + The used to render the date to a string + + + + + + Initialize the converter pattern based on the property. + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Convert the pattern into the rendered message + + that will receive the formatted result. + the event being logged + + + Pass the to the + for it to render it to the writer. + + + The passed is in the local time zone. + + + + + + Write the exception text to the output + + + + If an exception object is stored in the logging event + it will be rendered into the pattern output with a + trailing newline. + + + If there is no exception then nothing will be output + and no trailing newline will be appended. + It is typical to put a newline before the exception + and to have the exception as the last data in the pattern. + + + Nicko Cadell + + + + Default constructor + + + + + Write the exception text to the output + + that will receive the formatted result. + the event being logged + + + If an exception object is stored in the logging event + it will be rendered into the pattern output with a + trailing newline. + + + If there is no exception then nothing will be output + and no trailing newline will be appended. + It is typical to put a newline before the exception + and to have the exception as the last data in the pattern. + + + + + + Writes the caller location file name to the output + + + + Writes the value of the for + the event to the output writer. + + + Nicko Cadell + + + + Write the caller location file name to the output + + that will receive the formatted result. + the event being logged + + + Writes the value of the for + the to the output . + + + + + + Write the caller location info to the output + + + + Writes the to the output writer. + + + Nicko Cadell + + + + Write the caller location info to the output + + that will receive the formatted result. + the event being logged + + + Writes the to the output writer. + + + + + + Writes the event identity to the output + + + + Writes the value of the to + the output writer. + + + Daniel Cazzulino + Nicko Cadell + + + + Writes the event identity to the output + + that will receive the formatted result. + the event being logged + + + Writes the value of the + to + the output . + + + + + + Write the event level to the output + + + + Writes the display name of the event + to the writer. + + + Nicko Cadell + + + + Write the event level to the output + + that will receive the formatted result. + the event being logged + + + Writes the of the + to the . + + + + + + Write the caller location line number to the output + + + + Writes the value of the for + the event to the output writer. + + + Nicko Cadell + + + + Write the caller location line number to the output + + that will receive the formatted result. + the event being logged + + + Writes the value of the for + the to the output . + + + + + + Converter for logger name + + + + Outputs the of the event. + + + Nicko Cadell + + + + Converter to output and truncate '.' separated strings + + + + This abstract class supports truncating a '.' separated string + to show a specified number of elements from the right hand side. + This is used to truncate class names that are fully qualified. + + + Subclasses should override the method to + return the fully qualified string. + + + Nicko Cadell + + + + Initialize the converter + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Get the fully qualified string data + + the event being logged + the fully qualified name + + + Overridden by subclasses to get the fully qualified name before the + precision is applied to it. + + + Return the fully qualified '.' (dot/period) separated string. + + + + + + Convert the pattern to the rendered message + + that will receive the formatted result. + the event being logged + + Render the to the precision + specified by the property. + + + + + Gets the fully qualified name of the logger + + the event being logged + The fully qualified logger name + + + Returns the of the . + + + + + + Writes the event message to the output + + + + Uses the method + to write out the event message. + + + Nicko Cadell + + + + Writes the event message to the output + + that will receive the formatted result. + the event being logged + + + Uses the method + to write out the event message. + + + + + + Write the method name to the output + + + + Writes the caller location to + the output. + + + Nicko Cadell + + + + Write the method name to the output + + that will receive the formatted result. + the event being logged + + + Writes the caller location to + the output. + + + + + + Converter to include event NDC + + + + Outputs the value of the event property named NDC. + + + The should be used instead. + + + Nicko Cadell + + + + Write the event NDC to the output + + that will receive the formatted result. + the event being logged + + + As the thread context stacks are now stored in named event properties + this converter simply looks up the value of the NDC property. + + + The should be used instead. + + + + + + Property pattern converter + + + + Writes out the value of a named property. The property name + should be set in the + property. + + + If the is set to null + then all the properties are written as key value pairs. + + + Nicko Cadell + + + + Write the property value to the output + + that will receive the formatted result. + the event being logged + + + Writes out the value of a named property. The property name + should be set in the + property. + + + If the is set to null + then all the properties are written as key value pairs. + + + + + + Converter to output the relative time of the event + + + + Converter to output the time of the event relative to the start of the program. + + + Nicko Cadell + + + + Write the relative time to the output + + that will receive the formatted result. + the event being logged + + + Writes out the relative time of the event in milliseconds. + That is the number of milliseconds between the event + and the . + + + + + + Helper method to get the time difference between two DateTime objects + + start time (in the current local time zone) + end time (in the current local time zone) + the time difference in milliseconds + + + + Converter to include event thread name + + + + Writes the to the output. + + + Nicko Cadell + + + + Write the ThreadName to the output + + that will receive the formatted result. + the event being logged + + + Writes the to the . + + + + + + Pattern converter for the class name + + + + Outputs the of the event. + + + Nicko Cadell + + + + Gets the fully qualified name of the class + + the event being logged + The fully qualified type name for the caller location + + + Returns the of the . + + + + + + Converter to include event user name + + Douglas de la Torre + Nicko Cadell + + + + Convert the pattern to the rendered message + + that will receive the formatted result. + the event being logged + + + + Write the TimeStamp to the output + + + + Date pattern converter, uses a to format + the date of a . + + + Uses a to format the + in Universal time. + + + See the for details on the date pattern syntax. + + + + Nicko Cadell + + + + Write the TimeStamp to the output + + that will receive the formatted result. + the event being logged + + + Pass the to the + for it to render it to the writer. + + + The passed is in the local time zone, this is converted + to Universal time before it is rendered. + + + + + + + A Layout that renders only the Exception text from the logging event + + + + A Layout that renders only the Exception text from the logging event. + + + This Layout should only be used with appenders that utilize multiple + layouts (e.g. ). + + + Nicko Cadell + Gert Driesen + + + + Extend this abstract class to create your own log layout format. + + + + This is the base implementation of the + interface. Most layout objects should extend this class. + + + + + + Subclasses must implement the + method. + + + Subclasses should set the in their default + constructor. + + + + Nicko Cadell + Gert Driesen + + + + Interface implemented by layout objects + + + + An object is used to format a + as text. The method is called by an + appender to transform the into a string. + + + The layout can also supply and + text that is appender before any events and after all the events respectively. + + + Nicko Cadell + Gert Driesen + + + + Implement this method to create your own layout format. + + The TextWriter to write the formatted event to + The event to format + + + This method is called by an appender to format + the as text and output to a writer. + + + If the caller does not have a and prefers the + event to be formatted as a then the following + code can be used to format the event into a . + + + StringWriter writer = new StringWriter(); + Layout.Format(writer, loggingEvent); + string formattedEvent = writer.ToString(); + + + + + + The content type output by this layout. + + The content type + + + The content type output by this layout. + + + This is a MIME type e.g. "text/plain". + + + + + + The header for the layout format. + + the layout header + + + The Header text will be appended before any logging events + are formatted and appended. + + + + + + The footer for the layout format. + + the layout footer + + + The Footer text will be appended after all the logging events + have been formatted and appended. + + + + + + Flag indicating if this layout handle exceptions + + false if this layout handles exceptions + + + If this layout handles the exception object contained within + , then the layout should return + false. Otherwise, if the layout ignores the exception + object, then the layout should return true. + + + + + + The header text + + + + See for more information. + + + + + + The footer text + + + + See for more information. + + + + + + Flag indicating if this layout handles exceptions + + + + false if this layout handles exceptions + + + + + + Empty default constructor + + + + Empty default constructor + + + + + + Activate component options + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + This method must be implemented by the subclass. + + + + + + Implement this method to create your own layout format. + + The TextWriter to write the formatted event to + The event to format + + + This method is called by an appender to format + the as text. + + + + + + The content type output by this layout. + + The content type is "text/plain" + + + The content type output by this layout. + + + This base class uses the value "text/plain". + To change this value a subclass must override this + property. + + + + + + The header for the layout format. + + the layout header + + + The Header text will be appended before any logging events + are formatted and appended. + + + + + + The footer for the layout format. + + the layout footer + + + The Footer text will be appended after all the logging events + have been formatted and appended. + + + + + + Flag indicating if this layout handles exceptions + + false if this layout handles exceptions + + + If this layout handles the exception object contained within + , then the layout should return + false. Otherwise, if the layout ignores the exception + object, then the layout should return true. + + + Set this value to override a this default setting. The default + value is true, this layout does not handle the exception. + + + + + + Default constructor + + + + Constructs a ExceptionLayout + + + + + + Activate component options + + + + Part of the component activation + framework. + + + This method does nothing as options become effective immediately. + + + + + + Gets the exception text from the logging event + + The TextWriter to write the formatted event to + the event being logged + + + Write the exception string to the . + The exception string is retrieved from . + + + + + + Interface for raw layout objects + + + + Interface used to format a + to an object. + + + This interface should not be confused with the + interface. This interface is used in + only certain specialized situations where a raw object is + required rather than a formatted string. The + is not generally useful than this interface. + + + Nicko Cadell + Gert Driesen + + + + Implement this method to create your own layout format. + + The event to format + returns the formatted event + + + Implement this method to create your own layout format. + + + + + + Adapts any to a + + + + Where an is required this adapter + allows a to be specified. + + + Nicko Cadell + Gert Driesen + + + + The layout to adapt + + + + + Construct a new adapter + + the layout to adapt + + + Create the adapter for the specified . + + + + + + Format the logging event as an object. + + The event to format + returns the formatted event + + + Format the logging event as an object. + + + Uses the object supplied to + the constructor to perform the formatting. + + + + + + A flexible layout configurable with pattern string. + + + + The goal of this class is to a + as a string. The results + depend on the conversion pattern. + + + The conversion pattern is closely related to the conversion + pattern of the printf function in C. A conversion pattern is + composed of literal text and format control expressions called + conversion specifiers. + + + You are free to insert any literal text within the conversion + pattern. + + + Each conversion specifier starts with a percent sign (%) and is + followed by optional format modifiers and a conversion + pattern name. The conversion pattern name specifies the type of + data, e.g. logger, level, date, thread name. The format + modifiers control such things as field width, padding, left and + right justification. The following is a simple example. + + + Let the conversion pattern be "%-5level [%thread]: %message%newline" and assume + that the log4net environment was set to use a PatternLayout. Then the + statements + + + ILog log = LogManager.GetLogger(typeof(TestApp)); + log.Debug("Message 1"); + log.Warn("Message 2"); + + would yield the output + + DEBUG [main]: Message 1 + WARN [main]: Message 2 + + + Note that there is no explicit separator between text and + conversion specifiers. The pattern parser knows when it has reached + the end of a conversion specifier when it reads a conversion + character. In the example above the conversion specifier + %-5level means the level of the logging event should be left + justified to a width of five characters. + + + The recognized conversion pattern names are: + + + + Conversion Pattern Name + Effect + + + a + Equivalent to appdomain + + + appdomain + + Used to output the friendly name of the AppDomain where the + logging event was generated. + + + + c + Equivalent to logger + + + C + Equivalent to type + + + class + Equivalent to type + + + d + Equivalent to date + + + date + + + Used to output the date of the logging event in the local time zone. + To output the date in universal time use the %utcdate pattern. + The date conversion + specifier may be followed by a date format specifier enclosed + between braces. For example, %date{HH:mm:ss,fff} or + %date{dd MMM yyyy HH:mm:ss,fff}. If no date format specifier is + given then ISO8601 format is + assumed (). + + + The date format specifier admits the same syntax as the + time pattern string of the . + + + For better results it is recommended to use the log4net date + formatters. These can be specified using one of the strings + "ABSOLUTE", "DATE" and "ISO8601" for specifying + , + and respectively + . For example, + %date{ISO8601} or %date{ABSOLUTE}. + + + These dedicated date formatters perform significantly + better than . + + + + + exception + + + Used to output the exception passed in with the log message. + + + If an exception object is stored in the logging event + it will be rendered into the pattern output with a + trailing newline. + If there is no exception then nothing will be output + and no trailing newline will be appended. + It is typical to put a newline before the exception + and to have the exception as the last data in the pattern. + + + + + F + Equivalent to file + + + file + + + Used to output the file name where the logging request was + issued. + + + WARNING Generating caller location information is + extremely slow. Its use should be avoided unless execution speed + is not an issue. + + + See the note below on the availability of caller location information. + + + + + identity + + + Used to output the user name for the currently active user + (Principal.Identity.Name). + + + WARNING Generating caller information is + extremely slow. Its use should be avoided unless execution speed + is not an issue. + + + + + l + Equivalent to location + + + L + Equivalent to line + + + location + + + Used to output location information of the caller which generated + the logging event. + + + The location information depends on the CLI implementation but + usually consists of the fully qualified name of the calling + method followed by the callers source the file name and line + number between parentheses. + + + The location information can be very useful. However, its + generation is extremely slow. Its use should be avoided + unless execution speed is not an issue. + + + See the note below on the availability of caller location information. + + + + + level + + + Used to output the level of the logging event. + + + + + line + + + Used to output the line number from where the logging request + was issued. + + + WARNING Generating caller location information is + extremely slow. Its use should be avoided unless execution speed + is not an issue. + + + See the note below on the availability of caller location information. + + + + + logger + + + Used to output the logger of the logging event. The + logger conversion specifier can be optionally followed by + precision specifier, that is a decimal constant in + brackets. + + + If a precision specifier is given, then only the corresponding + number of right most components of the logger name will be + printed. By default the logger name is printed in full. + + + For example, for the logger name "a.b.c" the pattern + %logger{2} will output "b.c". + + + + + m + Equivalent to message + + + M + Equivalent to method + + + message + + + Used to output the application supplied message associated with + the logging event. + + + + + mdc + + + The MDC (old name for the ThreadContext.Properties) is now part of the + combined event properties. This pattern is supported for compatibility + but is equivalent to property. + + + + + method + + + Used to output the method name where the logging request was + issued. + + + WARNING Generating caller location information is + extremely slow. Its use should be avoided unless execution speed + is not an issue. + + + See the note below on the availability of caller location information. + + + + + n + Equivalent to newline + + + newline + + + Outputs the platform dependent line separator character or + characters. + + + This conversion pattern offers the same performance as using + non-portable line separator strings such as "\n", or "\r\n". + Thus, it is the preferred way of specifying a line separator. + + + + + ndc + + + Used to output the NDC (nested diagnostic context) associated + with the thread that generated the logging event. + + + + + p + Equivalent to level + + + P + Equivalent to property + + + properties + Equivalent to property + + + property + + + Used to output the an event specific property. The key to + lookup must be specified within braces and directly following the + pattern specifier, e.g. %property{user} would include the value + from the property that is keyed by the string 'user'. Each property value + that is to be included in the log must be specified separately. + Properties are added to events by loggers or appenders. By default + the log4net:HostName property is set to the name of machine on + which the event was originally logged. + + + If no key is specified, e.g. %property then all the keys and their + values are printed in a comma separated list. + + + The properties of an event are combined from a number of different + contexts. These are listed below in the order in which they are searched. + + + + the event properties + + The event has that can be set. These + properties are specific to this event only. + + + + the thread properties + + The that are set on the current + thread. These properties are shared by all events logged on this thread. + + + + the global properties + + The that are set globally. These + properties are shared by all the threads in the AppDomain. + + + + + + + + r + Equivalent to timestamp + + + t + Equivalent to thread + + + timestamp + + + Used to output the number of milliseconds elapsed since the start + of the application until the creation of the logging event. + + + + + thread + + + Used to output the name of the thread that generated the + logging event. Uses the thread number if no name is available. + + + + + type + + + Used to output the fully qualified type name of the caller + issuing the logging request. This conversion specifier + can be optionally followed by precision specifier, that + is a decimal constant in brackets. + + + If a precision specifier is given, then only the corresponding + number of right most components of the class name will be + printed. By default the class name is output in fully qualified form. + + + For example, for the class name "log4net.Layout.PatternLayout", the + pattern %type{1} will output "PatternLayout". + + + WARNING Generating the caller class information is + slow. Thus, its use should be avoided unless execution speed is + not an issue. + + + See the note below on the availability of caller location information. + + + + + u + Equivalent to identity + + + username + + + Used to output the WindowsIdentity for the currently + active user. + + + WARNING Generating caller WindowsIdentity information is + extremely slow. Its use should be avoided unless execution speed + is not an issue. + + + + + utcdate + + + Used to output the date of the logging event in universal time. + The date conversion + specifier may be followed by a date format specifier enclosed + between braces. For example, %utcdate{HH:mm:ss,fff} or + %utcdate{dd MMM yyyy HH:mm:ss,fff}. If no date format specifier is + given then ISO8601 format is + assumed (). + + + The date format specifier admits the same syntax as the + time pattern string of the . + + + For better results it is recommended to use the log4net date + formatters. These can be specified using one of the strings + "ABSOLUTE", "DATE" and "ISO8601" for specifying + , + and respectively + . For example, + %utcdate{ISO8601} or %utcdate{ABSOLUTE}. + + + These dedicated date formatters perform significantly + better than . + + + + + w + Equivalent to username + + + x + Equivalent to ndc + + + X + Equivalent to mdc + + + % + + + The sequence %% outputs a single percent sign. + + + + + + The single letter patterns are deprecated in favor of the + longer more descriptive pattern names. + + + By default the relevant information is output as is. However, + with the aid of format modifiers it is possible to change the + minimum field width, the maximum field width and justification. + + + The optional format modifier is placed between the percent sign + and the conversion pattern name. + + + The first optional format modifier is the left justification + flag which is just the minus (-) character. Then comes the + optional minimum field width modifier. This is a decimal + constant that represents the minimum number of characters to + output. If the data item requires fewer characters, it is padded on + either the left or the right until the minimum width is + reached. The default is to pad on the left (right justify) but you + can specify right padding with the left justification flag. The + padding character is space. If the data item is larger than the + minimum field width, the field is expanded to accommodate the + data. The value is never truncated. + + + This behavior can be changed using the maximum field + width modifier which is designated by a period followed by a + decimal constant. If the data item is longer than the maximum + field, then the extra characters are removed from the + beginning of the data item and not from the end. For + example, it the maximum field width is eight and the data item is + ten characters long, then the first two characters of the data item + are dropped. This behavior deviates from the printf function in C + where truncation is done from the end. + + + Below are various format modifier examples for the logger + conversion specifier. + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Format modifierleft justifyminimum widthmaximum widthcomment
%20loggerfalse20none + + Left pad with spaces if the logger name is less than 20 + characters long. + +
%-20loggertrue20none + + Right pad with spaces if the logger + name is less than 20 characters long. + +
%.30loggerNAnone30 + + Truncate from the beginning if the logger + name is longer than 30 characters. + +
%20.30loggerfalse2030 + + Left pad with spaces if the logger name is shorter than 20 + characters. However, if logger name is longer than 30 characters, + then truncate from the beginning. + +
%-20.30loggertrue2030 + + Right pad with spaces if the logger name is shorter than 20 + characters. However, if logger name is longer than 30 characters, + then truncate from the beginning. + +
+
+ + Note about caller location information.
+ The following patterns %type %file %line %method %location %class %C %F %L %l %M + all generate caller location information. + Location information uses the System.Diagnostics.StackTrace class to generate + a call stack. The caller's information is then extracted from this stack. +
+ + + The System.Diagnostics.StackTrace class is not supported on the + .NET Compact Framework 1.0 therefore caller location information is not + available on that framework. + + + + + The System.Diagnostics.StackTrace class has this to say about Release builds: + + + "StackTrace information will be most informative with Debug build configurations. + By default, Debug builds include debug symbols, while Release builds do not. The + debug symbols contain most of the file, method name, line number, and column + information used in constructing StackFrame and StackTrace objects. StackTrace + might not report as many method calls as expected, due to code transformations + that occur during optimization." + + + This means that in a Release build the caller information may be incomplete or may + not exist at all! Therefore caller location information cannot be relied upon in a Release build. + + + + Additional pattern converters may be registered with a specific + instance using the method. + +
+ + This is a more detailed pattern. + %timestamp [%thread] %level %logger %ndc - %message%newline + + + A similar pattern except that the relative time is + right padded if less than 6 digits, thread name is right padded if + less than 15 characters and truncated if longer and the logger + name is left padded if shorter than 30 characters and truncated if + longer. + %-6timestamp [%15.15thread] %-5level %30.30logger %ndc - %message%newline + + Nicko Cadell + Gert Driesen + Douglas de la Torre + Daniel Cazzulino +
+ + + Default pattern string for log output. + + + + Default pattern string for log output. + Currently set to the string "%message%newline" + which just prints the application supplied message. + + + + + + A detailed conversion pattern + + + + A conversion pattern which includes Time, Thread, Logger, and Nested Context. + Current value is %timestamp [%thread] %level %logger %ndc - %message%newline. + + + + + + Internal map of converter identifiers to converter types. + + + + This static map is overridden by the m_converterRegistry instance map + + + + + + the pattern + + + + + the head of the pattern converter chain + + + + + patterns defined on this PatternLayout only + + + + + Initialize the global registry + + + + Defines the builtin global rules. + + + + + + Constructs a PatternLayout using the DefaultConversionPattern + + + + The default pattern just produces the application supplied message. + + + Note to Inheritors: This constructor calls the virtual method + . If you override this method be + aware that it will be called before your is called constructor. + + + As per the contract the + method must be called after the properties on this object have been + configured. + + + + + + Constructs a PatternLayout using the supplied conversion pattern + + the pattern to use + + + Note to Inheritors: This constructor calls the virtual method + . If you override this method be + aware that it will be called before your is called constructor. + + + When using this constructor the method + need not be called. This may not be the case when using a subclass. + + + + + + Create the pattern parser instance + + the pattern to parse + The that will format the event + + + Creates the used to parse the conversion string. Sets the + global and instance rules on the . + + + + + + Initialize layout options + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Produces a formatted string as specified by the conversion pattern. + + the event being logged + The TextWriter to write the formatted event to + + + Parse the using the patter format + specified in the property. + + + + + + Add a converter to this PatternLayout + + the converter info + + + This version of the method is used by the configurator. + Programmatic users should use the alternative method. + + + + + + Add a converter to this PatternLayout + + the name of the conversion pattern for this converter + the type of the converter + + + Add a named pattern converter to this instance. This + converter will be used in the formatting of the event. + This method must be called before . + + + The specified must extend the + type. + + + + + + The pattern formatting string + + + + The ConversionPattern option. This is the string which + controls formatting and consists of a mix of literal content and + conversion specifiers. + + + + + + Wrapper class used to map converter names to converter types + + + + Pattern converter info class used during configuration to + pass to the + method. + + + + + + default constructor + + + + + Gets or sets the name of the conversion pattern + + + + The name of the pattern in the format string + + + + + + Gets or sets the type of the converter + + + + The value specified must extend the + type. + + + + + + Type converter for the interface + + + + Used to convert objects to the interface. + Supports converting from the interface to + the interface using the . + + + Nicko Cadell + Gert Driesen + + + + Interface supported by type converters + + + + This interface supports conversion from arbitrary types + to a single target type. See . + + + Nicko Cadell + Gert Driesen + + + + Can the source type be converted to the type supported by this object + + the type to convert + true if the conversion is possible + + + Test if the can be converted to the + type supported by this converter. + + + + + + Convert the source object to the type supported by this object + + the object to convert + the converted object + + + Converts the to the type supported + by this converter. + + + + + + Can the sourceType be converted to an + + the source to be to be converted + true if the source type can be converted to + + + Test if the can be converted to a + . Only is supported + as the . + + + + + + Convert the value to a object + + the value to convert + the object + + + Convert the object to a + object. If the object + is a then the + is used to adapt between the two interfaces, otherwise an + exception is thrown. + + + + + + Extract the value of a property from the + + + + Extract the value of a property from the + + + Nicko Cadell + + + + Constructs a RawPropertyLayout + + + + + Lookup the property for + + The event to format + returns property value + + + Looks up and returns the object value of the property + named . If there is no property defined + with than name then null will be returned. + + + + + + The name of the value to lookup in the LoggingEvent Properties collection. + + + Value to lookup in the LoggingEvent Properties collection + + + + String name of the property to lookup in the . + + + + + + Extract the date from the + + + + Extract the date from the + + + Nicko Cadell + Gert Driesen + + + + Constructs a RawTimeStampLayout + + + + + Gets the as a . + + The event to format + returns the time stamp + + + Gets the as a . + + + The time stamp is in local time. To format the time stamp + in universal time use . + + + + + + Extract the date from the + + + + Extract the date from the + + + Nicko Cadell + Gert Driesen + + + + Constructs a RawUtcTimeStampLayout + + + + + Gets the as a . + + The event to format + returns the time stamp + + + Gets the as a . + + + The time stamp is in universal time. To format the time stamp + in local time use . + + + + + + A very simple layout + + + + SimpleLayout consists of the level of the log statement, + followed by " - " and then the log message itself. For example, + + DEBUG - Hello world + + + + Nicko Cadell + Gert Driesen + + + + Constructs a SimpleLayout + + + + + Initialize layout options + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Produces a simple formatted output. + + the event being logged + The TextWriter to write the formatted event to + + + Formats the event as the level of the even, + followed by " - " and then the log message itself. The + output is terminated by a newline. + + + + + + Layout that formats the log events as XML elements. + + + + The output of the consists of a series of + log4net:event elements. It does not output a complete well-formed XML + file. The output is designed to be included as an external entity + in a separate file to form a correct XML file. + + + For example, if abc is the name of the file where + the output goes, then a well-formed XML file would + be: + + + <?xml version="1.0" ?> + + <!DOCTYPE log4net:events SYSTEM "log4net-events.dtd" [<!ENTITY data SYSTEM "abc">]> + + <log4net:events version="1.2" xmlns:log4net="http://logging.apache.org/log4net/schemas/log4net-events-1.2> + &data; + </log4net:events> + + + This approach enforces the independence of the + and the appender where it is embedded. + + + The version attribute helps components to correctly + interpret output generated by . The value of + this attribute should be "1.2" for release 1.2 and later. + + + Alternatively the Header and Footer properties can be + configured to output the correct XML header, open tag and close tag. + When setting the Header and Footer properties it is essential + that the underlying data store not be appendable otherwise the data + will become invalid XML. + + + Nicko Cadell + Gert Driesen + + + + Layout that formats the log events as XML elements. + + + + This is an abstract class that must be subclassed by an implementation + to conform to a specific schema. + + + Deriving classes must implement the method. + + + Nicko Cadell + Gert Driesen + + + + Protected constructor to support subclasses + + + + Initializes a new instance of the class + with no location info. + + + + + + Protected constructor to support subclasses + + + + The parameter determines whether + location information will be output by the layout. If + is set to true, then the + file name and line number of the statement at the origin of the log + statement will be output. + + + If you are embedding this layout within an SMTPAppender + then make sure to set the LocationInfo option of that + appender as well. + + + + + + Initialize layout options + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Produces a formatted string. + + The event being logged. + The TextWriter to write the formatted event to + + + Format the and write it to the . + + + This method creates an that writes to the + . The is passed + to the method. Subclasses should override the + method rather than this method. + + + + + + Does the actual writing of the XML. + + The writer to use to output the event to. + The event to write. + + + Subclasses should override this method to format + the as XML. + + + + + + Flag to indicate if location information should be included in + the XML events. + + + + + Writer adapter that ignores Close + + + + + The string to replace invalid chars with + + + + + Gets a value indicating whether to include location information in + the XML events. + + + true if location information should be included in the XML + events; otherwise, false. + + + + If is set to true, then the file + name and line number of the statement at the origin of the log + statement will be output. + + + If you are embedding this layout within an SMTPAppender + then make sure to set the LocationInfo option of that + appender as well. + + + + + + The string to replace characters that can not be expressed in XML with. + + + Not all characters may be expressed in XML. This property contains the + string to replace those that can not with. This defaults to a ?. Set it + to the empty string to simply remove offending characters. For more + details on the allowed character ranges see http://www.w3.org/TR/REC-xml/#charsets + Character replacement will occur in the log message, the property names + and the property values. + + + + + + + Gets the content type output by this layout. + + + As this is the XML layout, the value is always "text/xml". + + + + As this is the XML layout, the value is always "text/xml". + + + + + + Constructs an XmlLayout + + + + + Constructs an XmlLayout. + + + + The LocationInfo option takes a boolean value. By + default, it is set to false which means there will be no location + information output by this layout. If the the option is set to + true, then the file name and line number of the statement + at the origin of the log statement will be output. + + + If you are embedding this layout within an SmtpAppender + then make sure to set the LocationInfo option of that + appender as well. + + + + + + Initialize layout options + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + Builds a cache of the element names + + + + + + Does the actual writing of the XML. + + The writer to use to output the event to. + The event to write. + + + Override the base class method + to write the to the . + + + + + + The prefix to use for all generated element names + + + + + The prefix to use for all element names + + + + The default prefix is log4net. Set this property + to change the prefix. If the prefix is set to an empty string + then no prefix will be written. + + + + + + Set whether or not to base64 encode the message. + + + + By default the log message will be written as text to the xml + output. This can cause problems when the message contains binary + data. By setting this to true the contents of the message will be + base64 encoded. If this is set then invalid character replacement + (see ) will not be performed + on the log message. + + + + + + Set whether or not to base64 encode the property values. + + + + By default the properties will be written as text to the xml + output. This can cause problems when one or more properties contain + binary data. By setting this to true the values of the properties + will be base64 encoded. If this is set then invalid character replacement + (see ) will not be performed + on the property values. + + + + + + Layout that formats the log events as XML elements compatible with the log4j schema + + + + Formats the log events according to the http://logging.apache.org/log4j schema. + + + Nicko Cadell + + + + The 1st of January 1970 in UTC + + + + + Constructs an XMLLayoutSchemaLog4j + + + + + Constructs an XMLLayoutSchemaLog4j. + + + + The LocationInfo option takes a boolean value. By + default, it is set to false which means there will be no location + information output by this layout. If the the option is set to + true, then the file name and line number of the statement + at the origin of the log statement will be output. + + + If you are embedding this layout within an SMTPAppender + then make sure to set the LocationInfo option of that + appender as well. + + + + + + Actually do the writing of the xml + + the writer to use + the event to write + + + Generate XML that is compatible with the log4j schema. + + + + + + The version of the log4j schema to use. + + + + Only version 1.2 of the log4j schema is supported. + + + + + + The default object Renderer. + + + + The default renderer supports rendering objects and collections to strings. + + + See the method for details of the output. + + + Nicko Cadell + Gert Driesen + + + + Implement this interface in order to render objects as strings + + + + Certain types require special case conversion to + string form. This conversion is done by an object renderer. + Object renderers implement the + interface. + + + Nicko Cadell + Gert Driesen + + + + Render the object to a string + + The map used to lookup renderers + The object to render + The writer to render to + + + Render the object to a + string. + + + The parameter is + provided to lookup and render other objects. This is + very useful where contains + nested objects of unknown type. The + method can be used to render these objects. + + + + + + Default constructor + + + + Default constructor + + + + + + Render the object to a string + + The map used to lookup renderers + The object to render + The writer to render to + + + Render the object to a string. + + + The parameter is + provided to lookup and render other objects. This is + very useful where contains + nested objects of unknown type. The + method can be used to render these objects. + + + The default renderer supports rendering objects to strings as follows: + + + + Value + Rendered String + + + null + + "(null)" + + + + + + + For a one dimensional array this is the + array type name, an open brace, followed by a comma + separated list of the elements (using the appropriate + renderer), followed by a close brace. + + + For example: int[] {1, 2, 3}. + + + If the array is not one dimensional the + Array.ToString() is returned. + + + + + , & + + + Rendered as an open brace, followed by a comma + separated list of the elements (using the appropriate + renderer), followed by a close brace. + + + For example: {a, b, c}. + + + All collection classes that implement its subclasses, + or generic equivalents all implement the interface. + + + + + + + + Rendered as the key, an equals sign ('='), and the value (using the appropriate + renderer). + + + For example: key=value. + + + + + other + + Object.ToString() + + + + + + + + Render the array argument into a string + + The map used to lookup renderers + the array to render + The writer to render to + + + For a one dimensional array this is the + array type name, an open brace, followed by a comma + separated list of the elements (using the appropriate + renderer), followed by a close brace. For example: + int[] {1, 2, 3}. + + + If the array is not one dimensional the + Array.ToString() is returned. + + + + + + Render the enumerator argument into a string + + The map used to lookup renderers + the enumerator to render + The writer to render to + + + Rendered as an open brace, followed by a comma + separated list of the elements (using the appropriate + renderer), followed by a close brace. For example: + {a, b, c}. + + + + + + Render the DictionaryEntry argument into a string + + The map used to lookup renderers + the DictionaryEntry to render + The writer to render to + + + Render the key, an equals sign ('='), and the value (using the appropriate + renderer). For example: key=value. + + + + + + Map class objects to an . + + + + Maintains a mapping between types that require special + rendering and the that + is used to render them. + + + The method is used to render an + object using the appropriate renderers defined in this map. + + + Nicko Cadell + Gert Driesen + + + + Default Constructor + + + + Default constructor. + + + + + + Render using the appropriate renderer. + + the object to render to a string + the object rendered as a string + + + This is a convenience method used to render an object to a string. + The alternative method + should be used when streaming output to a . + + + + + + Render using the appropriate renderer. + + the object to render to a string + The writer to render to + + + Find the appropriate renderer for the type of the + parameter. This is accomplished by calling the + method. Once a renderer is found, it is + applied on the object and the result is returned + as a . + + + + + + Gets the renderer for the specified object type + + the object to lookup the renderer for + the renderer for + + + Gets the renderer for the specified object type. + + + Syntactic sugar method that calls + with the type of the object parameter. + + + + + + Gets the renderer for the specified type + + the type to lookup the renderer for + the renderer for the specified type + + + Returns the renderer for the specified type. + If no specific renderer has been defined the + will be returned. + + + + + + Internal function to recursively search interfaces + + the type to lookup the renderer for + the renderer for the specified type + + + + Clear the map of renderers + + + + Clear the custom renderers defined by using + . The + cannot be removed. + + + + + + Register an for . + + the type that will be rendered by + the renderer for + + + Register an object renderer for a specific source type. + This renderer will be returned from a call to + specifying the same as an argument. + + + + + + Get the default renderer instance + + the default renderer + + + Get the default renderer + + + + + + Interface implemented by logger repository plugins. + + + + Plugins define additional behavior that can be associated + with a . + The held by the + property is used to store the plugins for a repository. + + + The log4net.Config.PluginAttribute can be used to + attach plugins to repositories created using configuration + attributes. + + + Nicko Cadell + Gert Driesen + + + + Attaches the plugin to the specified . + + The that this plugin should be attached to. + + + A plugin may only be attached to a single repository. + + + This method is called when the plugin is attached to the repository. + + + + + + Is called when the plugin is to shutdown. + + + + This method is called to notify the plugin that + it should stop operating and should detach from + the repository. + + + + + + Gets the name of the plugin. + + + The name of the plugin. + + + + Plugins are stored in the + keyed by name. Each plugin instance attached to a + repository must be a unique name. + + + + + + A strongly-typed collection of objects. + + Nicko Cadell + + + + Creates a read-only wrapper for a PluginCollection instance. + + list to create a readonly wrapper arround + + A PluginCollection wrapper that is read-only. + + + + + Initializes a new instance of the PluginCollection class + that is empty and has the default initial capacity. + + + + + Initializes a new instance of the PluginCollection class + that has the specified initial capacity. + + + The number of elements that the new PluginCollection is initially capable of storing. + + + + + Initializes a new instance of the PluginCollection class + that contains elements copied from the specified PluginCollection. + + The PluginCollection whose elements are copied to the new collection. + + + + Initializes a new instance of the PluginCollection class + that contains elements copied from the specified array. + + The array whose elements are copied to the new list. + + + + Initializes a new instance of the PluginCollection class + that contains elements copied from the specified collection. + + The collection whose elements are copied to the new list. + + + + Allow subclasses to avoid our default constructors + + + + + + + Copies the entire PluginCollection to a one-dimensional + array. + + The one-dimensional array to copy to. + + + + Copies the entire PluginCollection to a one-dimensional + array, starting at the specified index of the target array. + + The one-dimensional array to copy to. + The zero-based index in at which copying begins. + + + + Adds a to the end of the PluginCollection. + + The to be added to the end of the PluginCollection. + The index at which the value has been added. + + + + Removes all elements from the PluginCollection. + + + + + Creates a shallow copy of the . + + A new with a shallow copy of the collection data. + + + + Determines whether a given is in the PluginCollection. + + The to check for. + true if is found in the PluginCollection; otherwise, false. + + + + Returns the zero-based index of the first occurrence of a + in the PluginCollection. + + The to locate in the PluginCollection. + + The zero-based index of the first occurrence of + in the entire PluginCollection, if found; otherwise, -1. + + + + + Inserts an element into the PluginCollection at the specified index. + + The zero-based index at which should be inserted. + The to insert. + + is less than zero + -or- + is equal to or greater than . + + + + + Removes the first occurrence of a specific from the PluginCollection. + + The to remove from the PluginCollection. + + The specified was not found in the PluginCollection. + + + + + Removes the element at the specified index of the PluginCollection. + + The zero-based index of the element to remove. + + is less than zero. + -or- + is equal to or greater than . + + + + + Returns an enumerator that can iterate through the PluginCollection. + + An for the entire PluginCollection. + + + + Adds the elements of another PluginCollection to the current PluginCollection. + + The PluginCollection whose elements should be added to the end of the current PluginCollection. + The new of the PluginCollection. + + + + Adds the elements of a array to the current PluginCollection. + + The array whose elements should be added to the end of the PluginCollection. + The new of the PluginCollection. + + + + Adds the elements of a collection to the current PluginCollection. + + The collection whose elements should be added to the end of the PluginCollection. + The new of the PluginCollection. + + + + Sets the capacity to the actual number of elements. + + + + + is less than zero. + -or- + is equal to or greater than . + + + + + is less than zero. + -or- + is equal to or greater than . + + + + + Gets the number of elements actually contained in the PluginCollection. + + + + + Gets a value indicating whether access to the collection is synchronized (thread-safe). + + true if access to the ICollection is synchronized (thread-safe); otherwise, false. + + + + Gets an object that can be used to synchronize access to the collection. + + + An object that can be used to synchronize access to the collection. + + + + + Gets or sets the at the specified index. + + + The at the specified index. + + The zero-based index of the element to get or set. + + is less than zero. + -or- + is equal to or greater than . + + + + + Gets a value indicating whether the collection has a fixed size. + + true if the collection has a fixed size; otherwise, false. The default is false. + + + + Gets a value indicating whether the IList is read-only. + + true if the collection is read-only; otherwise, false. The default is false. + + + + Gets or sets the number of elements the PluginCollection can contain. + + + The number of elements the PluginCollection can contain. + + + + + Supports type-safe iteration over a . + + + + + + Advances the enumerator to the next element in the collection. + + + true if the enumerator was successfully advanced to the next element; + false if the enumerator has passed the end of the collection. + + + The collection was modified after the enumerator was created. + + + + + Sets the enumerator to its initial position, before the first element in the collection. + + + + + Gets the current element in the collection. + + + + + Type visible only to our subclasses + Used to access protected constructor + + + + + + A value + + + + + Supports simple iteration over a . + + + + + + Initializes a new instance of the Enumerator class. + + + + + + Advances the enumerator to the next element in the collection. + + + true if the enumerator was successfully advanced to the next element; + false if the enumerator has passed the end of the collection. + + + The collection was modified after the enumerator was created. + + + + + Sets the enumerator to its initial position, before the first element in the collection. + + + + + Gets the current element in the collection. + + + The current element in the collection. + + + + + + + + Map of repository plugins. + + + + This class is a name keyed map of the plugins that are + attached to a repository. + + + Nicko Cadell + Gert Driesen + + + + Constructor + + The repository that the plugins should be attached to. + + + Initialize a new instance of the class with a + repository that the plugins should be attached to. + + + + + + Adds a to the map. + + The to add to the map. + + + The will be attached to the repository when added. + + + If there already exists a plugin with the same name + attached to the repository then the old plugin will + be and replaced with + the new plugin. + + + + + + Removes a from the map. + + The to remove from the map. + + + Remove a specific plugin from this map. + + + + + + Gets a by name. + + The name of the to lookup. + + The from the map with the name specified, or + null if no plugin is found. + + + + Lookup a plugin by name. If the plugin is not found null + will be returned. + + + + + + Gets all possible plugins as a list of objects. + + All possible plugins as a list of objects. + + + Get a collection of all the plugins defined in this map. + + + + + + Base implementation of + + + + Default abstract implementation of the + interface. This base class can be used by implementors + of the interface. + + + Nicko Cadell + Gert Driesen + + + + Constructor + + the name of the plugin + + Initializes a new Plugin with the specified name. + + + + + Attaches this plugin to a . + + The that this plugin should be attached to. + + + A plugin may only be attached to a single repository. + + + This method is called when the plugin is attached to the repository. + + + + + + Is called when the plugin is to shutdown. + + + + This method is called to notify the plugin that + it should stop operating and should detach from + the repository. + + + + + + The name of this plugin. + + + + + The repository this plugin is attached to. + + + + + Gets or sets the name of the plugin. + + + The name of the plugin. + + + + Plugins are stored in the + keyed by name. Each plugin instance attached to a + repository must be a unique name. + + + The name of the plugin must not change one the + plugin has been attached to a repository. + + + + + + The repository for this plugin + + + The that this plugin is attached to. + + + + Gets or sets the that this plugin is + attached to. + + + + + + Plugin that listens for events from the + + + + This plugin publishes an instance of + on a specified . This listens for logging events delivered from + a remote . + + + When an event is received it is relogged within the attached repository + as if it had been raised locally. + + + Nicko Cadell + Gert Driesen + + + + Default constructor + + + + Initializes a new instance of the class. + + + The property must be set. + + + + + + Construct with sink Uri. + + The name to publish the sink under in the remoting infrastructure. + See for more details. + + + Initializes a new instance of the class + with specified name. + + + + + + Attaches this plugin to a . + + The that this plugin should be attached to. + + + A plugin may only be attached to a single repository. + + + This method is called when the plugin is attached to the repository. + + + + + + Is called when the plugin is to shutdown. + + + + When the plugin is shutdown the remote logging + sink is disconnected. + + + + + + Gets or sets the URI of this sink. + + + The URI of this sink. + + + + This is the name under which the object is marshaled. + + + + + + + Delivers objects to a remote sink. + + + + Internal class used to listen for logging events + and deliver them to the local repository. + + + + + + Constructor + + The repository to log to. + + + Initializes a new instance of the for the + specified . + + + + + + Logs the events to the repository. + + The events to log. + + + The events passed are logged to the + + + + + + Obtains a lifetime service object to control the lifetime + policy for this instance. + + null to indicate that this instance should live forever. + + + Obtains a lifetime service object to control the lifetime + policy for this instance. This object should live forever + therefore this implementation returns null. + + + + + + The underlying that events should + be logged to. + + + + + Default implementation of + + + + This default implementation of the + interface is used to create the default subclass + of the object. + + + Nicko Cadell + Gert Driesen + + + + Interface abstracts creation of instances + + + + This interface is used by the to + create new objects. + + + The method is called + to create a named . + + + Implement this interface to create new subclasses of . + + + Nicko Cadell + Gert Driesen + + + + Create a new instance + + The name of the . + The instance for the specified name. + + + Create a new instance with the + specified name. + + + Called by the to create + new named instances. + + + If the is null then the root logger + must be returned. + + + + + + Default constructor + + + + Initializes a new instance of the class. + + + + + + Create a new instance + + The name of the . + The instance for the specified name. + + + Create a new instance with the + specified name. + + + Called by the to create + new named instances. + + + If the is null then the root logger + must be returned. + + + + + + Default internal subclass of + + + + This subclass has no additional behavior over the + class but does allow instances + to be created. + + + + + + Implementation of used by + + + + Internal class used to provide implementation of + interface. Applications should use to get + logger instances. + + + This is one of the central classes in the log4net implementation. One of the + distinctive features of log4net are hierarchical loggers and their + evaluation. The organizes the + instances into a rooted tree hierarchy. + + + The class is abstract. Only concrete subclasses of + can be created. The + is used to create instances of this type for the . + + + Nicko Cadell + Gert Driesen + Aspi Havewala + Douglas de la Torre + + + + This constructor created a new instance and + sets its name. + + The name of the . + + + This constructor is protected and designed to be used by + a subclass that is not abstract. + + + Loggers are constructed by + objects. See for the default + logger creator. + + + + + + Add to the list of appenders of this + Logger instance. + + An appender to add to this logger + + + Add to the list of appenders of this + Logger instance. + + + If is already in the list of + appenders, then it won't be added again. + + + + + + Look for the appender named as name + + The name of the appender to lookup + The appender with the name specified, or null. + + + Returns the named appender, or null if the appender is not found. + + + + + + Remove all previously added appenders from this Logger instance. + + + + Remove all previously added appenders from this Logger instance. + + + This is useful when re-reading configuration information. + + + + + + Remove the appender passed as parameter form the list of appenders. + + The appender to remove + The appender removed from the list + + + Remove the appender passed as parameter form the list of appenders. + The appender removed is not closed. + If you are discarding the appender you must call + on the appender removed. + + + + + + Remove the appender passed as parameter form the list of appenders. + + The name of the appender to remove + The appender removed from the list + + + Remove the named appender passed as parameter form the list of appenders. + The appender removed is not closed. + If you are discarding the appender you must call + on the appender removed. + + + + + + This generic form is intended to be used by wrappers. + + The declaring type of the method that is + the stack boundary into the logging system for this call. + The level of the message to be logged. + The message object to log. + The exception to log, including its stack trace. + + + Generate a logging event for the specified using + the and . + + + This method must not throw any exception to the caller. + + + + + + This is the most generic printing method that is intended to be used + by wrappers. + + The event being logged. + + + Logs the specified logging event through this logger. + + + This method must not throw any exception to the caller. + + + + + + Checks if this logger is enabled for a given passed as parameter. + + The level to check. + + true if this logger is enabled for level, otherwise false. + + + + Test if this logger is going to log events of the specified . + + + This method must not throw any exception to the caller. + + + + + + Deliver the to the attached appenders. + + The event to log. + + + Call the appenders in the hierarchy starting at + this. If no appenders could be found, emit a + warning. + + + This method calls all the appenders inherited from the + hierarchy circumventing any evaluation of whether to log or not + to log the particular log request. + + + + + + Closes all attached appenders implementing the interface. + + + + Used to ensure that the appenders are correctly shutdown. + + + + + + This is the most generic printing method. This generic form is intended to be used by wrappers + + The level of the message to be logged. + The message object to log. + The exception to log, including its stack trace. + + + Generate a logging event for the specified using + the . + + + + + + Creates a new logging event and logs the event without further checks. + + The declaring type of the method that is + the stack boundary into the logging system for this call. + The level of the message to be logged. + The message object to log. + The exception to log, including its stack trace. + + + Generates a logging event and delivers it to the attached + appenders. + + + + + + Creates a new logging event and logs the event without further checks. + + The event being logged. + + + Delivers the logging event to the attached appenders. + + + + + + The fully qualified type of the Logger class. + + + + + The name of this logger. + + + + + The assigned level of this logger. + + + + The level variable need not be + assigned a value in which case it is inherited + form the hierarchy. + + + + + + The parent of this logger. + + + + The parent of this logger. + All loggers have at least one ancestor which is the root logger. + + + + + + Loggers need to know what Hierarchy they are in. + + + + Loggers need to know what Hierarchy they are in. + The hierarchy that this logger is a member of is stored + here. + + + + + + Helper implementation of the interface + + + + + Flag indicating if child loggers inherit their parents appenders + + + + Additivity is set to true by default, that is children inherit + the appenders of their ancestors by default. If this variable is + set to false then the appenders found in the + ancestors of this logger are not used. However, the children + of this logger will inherit its appenders, unless the children + have their additivity flag set to false too. See + the user manual for more details. + + + + + + Lock to protect AppenderAttachedImpl variable m_appenderAttachedImpl + + + + + Gets or sets the parent logger in the hierarchy. + + + The parent logger in the hierarchy. + + + + Part of the Composite pattern that makes the hierarchy. + The hierarchy is parent linked rather than child linked. + + + + + + Gets or sets a value indicating if child loggers inherit their parent's appenders. + + + true if child loggers inherit their parent's appenders. + + + + Additivity is set to true by default, that is children inherit + the appenders of their ancestors by default. If this variable is + set to false then the appenders found in the + ancestors of this logger are not used. However, the children + of this logger will inherit its appenders, unless the children + have their additivity flag set to false too. See + the user manual for more details. + + + + + + Gets the effective level for this logger. + + The nearest level in the logger hierarchy. + + + Starting from this logger, searches the logger hierarchy for a + non-null level and returns it. Otherwise, returns the level of the + root logger. + + The Logger class is designed so that this method executes as + quickly as possible. + + + + + Gets or sets the where this + Logger instance is attached to. + + The hierarchy that this logger belongs to. + + + This logger must be attached to a single . + + + + + + Gets or sets the assigned , if any, for this Logger. + + + The of this logger. + + + + The assigned can be null. + + + + + + Get the appenders contained in this logger as an + . + + A collection of the appenders in this logger + + + Get the appenders contained in this logger as an + . If no appenders + can be found, then a is returned. + + + + + + Gets the logger name. + + + The name of the logger. + + + + The name of this logger + + + + + + Gets the where this + Logger instance is attached to. + + + The that this logger belongs to. + + + + Gets the where this + Logger instance is attached to. + + + + + + Construct a new Logger + + the name of the logger + + + Initializes a new instance of the class + with the specified name. + + + + + + Delegate used to handle logger creation event notifications. + + The in which the has been created. + The event args that hold the instance that has been created. + + + Delegate used to handle logger creation event notifications. + + + + + + Provides data for the event. + + + + A event is raised every time a + is created. + + + + + + The created + + + + + Constructor + + The that has been created. + + + Initializes a new instance of the event argument + class,with the specified . + + + + + + Gets the that has been created. + + + The that has been created. + + + + The that has been created. + + + + + + Hierarchical organization of loggers + + + + The casual user should not have to deal with this class + directly. + + + This class is specialized in retrieving loggers by name and + also maintaining the logger hierarchy. Implements the + interface. + + + The structure of the logger hierarchy is maintained by the + method. The hierarchy is such that children + link to their parent but parents do not have any references to their + children. Moreover, loggers can be instantiated in any order, in + particular descendant before ancestor. + + + In case a descendant is created before a particular ancestor, + then it creates a provision node for the ancestor and adds itself + to the provision node. Other descendants of the same ancestor add + themselves to the previously created provision node. + + + Nicko Cadell + Gert Driesen + + + + Base implementation of + + + + Default abstract implementation of the interface. + + + Skeleton implementation of the interface. + All types can extend this type. + + + Nicko Cadell + Gert Driesen + + + + Interface implemented by logger repositories. + + + + This interface is implemented by logger repositories. e.g. + . + + + This interface is used by the + to obtain interfaces. + + + Nicko Cadell + Gert Driesen + + + + Check if the named logger exists in the repository. If so return + its reference, otherwise returns null. + + The name of the logger to lookup + The Logger object with the name specified + + + If the names logger exists it is returned, otherwise + null is returned. + + + + + + Returns all the currently defined loggers as an Array. + + All the defined loggers + + + Returns all the currently defined loggers as an Array. + + + + + + Returns a named logger instance + + The name of the logger to retrieve + The logger object with the name specified + + + Returns a named logger instance. + + + If a logger of that name already exists, then it will be + returned. Otherwise, a new logger will be instantiated and + then linked with its existing ancestors as well as children. + + + + + Shutdown the repository + + + Shutting down a repository will safely close and remove + all appenders in all loggers including the root logger. + + + Some appenders need to be closed before the + application exists. Otherwise, pending logging events might be + lost. + + + The method is careful to close nested + appenders before closing regular appenders. This is allows + configurations where a regular appender is attached to a logger + and again to a nested appender. + + + + + + Reset the repositories configuration to a default state + + + + Reset all values contained in this instance to their + default state. + + + Existing loggers are not removed. They are just reset. + + + This method should be used sparingly and with care as it will + block all logging until it is completed. + + + + + + Log the through this repository. + + the event to log + + + This method should not normally be used to log. + The interface should be used + for routine logging. This interface can be obtained + using the method. + + + The logEvent is delivered to the appropriate logger and + that logger is then responsible for logging the event. + + + + + + Returns all the Appenders that are configured as an Array. + + All the Appenders + + + Returns all the Appenders that are configured as an Array. + + + + + + The name of the repository + + + The name of the repository + + + + The name of the repository. + + + + + + RendererMap accesses the object renderer map for this repository. + + + RendererMap accesses the object renderer map for this repository. + + + + RendererMap accesses the object renderer map for this repository. + + + The RendererMap holds a mapping between types and + objects. + + + + + + The plugin map for this repository. + + + The plugin map for this repository. + + + + The plugin map holds the instances + that have been attached to this repository. + + + + + + Get the level map for the Repository. + + + + Get the level map for the Repository. + + + The level map defines the mappings between + level names and objects in + this repository. + + + + + + The threshold for all events in this repository + + + The threshold for all events in this repository + + + + The threshold for all events in this repository. + + + + + + Flag indicates if this repository has been configured. + + + Flag indicates if this repository has been configured. + + + + Flag indicates if this repository has been configured. + + + + + + Event to notify that the repository has been shutdown. + + + Event to notify that the repository has been shutdown. + + + + Event raised when the repository has been shutdown. + + + + + + Event to notify that the repository has had its configuration reset. + + + Event to notify that the repository has had its configuration reset. + + + + Event raised when the repository's configuration has been + reset to default. + + + + + + Event to notify that the repository has had its configuration changed. + + + Event to notify that the repository has had its configuration changed. + + + + Event raised when the repository's configuration has been changed. + + + + + + Repository specific properties + + + Repository specific properties + + + + These properties can be specified on a repository specific basis. + + + + + + Default Constructor + + + + Initializes the repository with default (empty) properties. + + + + + + Construct the repository using specific properties + + the properties to set for this repository + + + Initializes the repository with specified properties. + + + + + + Test if logger exists + + The name of the logger to lookup + The Logger object with the name specified + + + Check if the named logger exists in the repository. If so return + its reference, otherwise returns null. + + + + + + Returns all the currently defined loggers in the repository + + All the defined loggers + + + Returns all the currently defined loggers in the repository as an Array. + + + + + + Return a new logger instance + + The name of the logger to retrieve + The logger object with the name specified + + + Return a new logger instance. + + + If a logger of that name already exists, then it will be + returned. Otherwise, a new logger will be instantiated and + then linked with its existing ancestors as well as children. + + + + + + Shutdown the repository + + + + Shutdown the repository. Can be overridden in a subclass. + This base class implementation notifies the + listeners and all attached plugins of the shutdown event. + + + + + + Reset the repositories configuration to a default state + + + + Reset all values contained in this instance to their + default state. + + + Existing loggers are not removed. They are just reset. + + + This method should be used sparingly and with care as it will + block all logging until it is completed. + + + + + + Log the logEvent through this repository. + + the event to log + + + This method should not normally be used to log. + The interface should be used + for routine logging. This interface can be obtained + using the method. + + + The logEvent is delivered to the appropriate logger and + that logger is then responsible for logging the event. + + + + + + Returns all the Appenders that are configured as an Array. + + All the Appenders + + + Returns all the Appenders that are configured as an Array. + + + + + + Adds an object renderer for a specific class. + + The type that will be rendered by the renderer supplied. + The object renderer used to render the object. + + + Adds an object renderer for a specific class. + + + + + + Notify the registered listeners that the repository is shutting down + + Empty EventArgs + + + Notify any listeners that this repository is shutting down. + + + + + + Notify the registered listeners that the repository has had its configuration reset + + Empty EventArgs + + + Notify any listeners that this repository's configuration has been reset. + + + + + + Notify the registered listeners that the repository has had its configuration changed + + Empty EventArgs + + + Notify any listeners that this repository's configuration has changed. + + + + + + Raise a configuration changed event on this repository + + EventArgs.Empty + + + Applications that programmatically change the configuration of the repository should + raise this event notification to notify listeners. + + + + + + The name of the repository + + + The string name of the repository + + + + The name of this repository. The name is + used to store and lookup the repositories + stored by the . + + + + + + The threshold for all events in this repository + + + The threshold for all events in this repository + + + + The threshold for all events in this repository + + + + + + RendererMap accesses the object renderer map for this repository. + + + RendererMap accesses the object renderer map for this repository. + + + + RendererMap accesses the object renderer map for this repository. + + + The RendererMap holds a mapping between types and + objects. + + + + + + The plugin map for this repository. + + + The plugin map for this repository. + + + + The plugin map holds the instances + that have been attached to this repository. + + + + + + Get the level map for the Repository. + + + + Get the level map for the Repository. + + + The level map defines the mappings between + level names and objects in + this repository. + + + + + + Flag indicates if this repository has been configured. + + + Flag indicates if this repository has been configured. + + + + Flag indicates if this repository has been configured. + + + + + + Event to notify that the repository has been shutdown. + + + Event to notify that the repository has been shutdown. + + + + Event raised when the repository has been shutdown. + + + + + + Event to notify that the repository has had its configuration reset. + + + Event to notify that the repository has had its configuration reset. + + + + Event raised when the repository's configuration has been + reset to default. + + + + + + Event to notify that the repository has had its configuration changed. + + + Event to notify that the repository has had its configuration changed. + + + + Event raised when the repository's configuration has been changed. + + + + + + Repository specific properties + + + Repository specific properties + + + These properties can be specified on a repository specific basis + + + + + Basic Configurator interface for repositories + + + + Interface used by basic configurator to configure a + with a default . + + + A should implement this interface to support + configuration by the . + + + Nicko Cadell + Gert Driesen + + + + Initialize the repository using the specified appender + + the appender to use to log all logging events + + + Configure the repository to route all logging events to the + specified appender. + + + + + + Configure repository using XML + + + + Interface used by Xml configurator to configure a . + + + A should implement this interface to support + configuration by the . + + + Nicko Cadell + Gert Driesen + + + + Initialize the repository using the specified config + + the element containing the root of the config + + + The schema for the XML configuration data is defined by + the implementation. + + + + + + Default constructor + + + + Initializes a new instance of the class. + + + + + + Construct with properties + + The properties to pass to this repository. + + + Initializes a new instance of the class. + + + + + + Construct with a logger factory + + The factory to use to create new logger instances. + + + Initializes a new instance of the class with + the specified . + + + + + + Construct with properties and a logger factory + + The properties to pass to this repository. + The factory to use to create new logger instances. + + + Initializes a new instance of the class with + the specified . + + + + + + Test if a logger exists + + The name of the logger to lookup + The Logger object with the name specified + + + Check if the named logger exists in the hierarchy. If so return + its reference, otherwise returns null. + + + + + + Returns all the currently defined loggers in the hierarchy as an Array + + All the defined loggers + + + Returns all the currently defined loggers in the hierarchy as an Array. + The root logger is not included in the returned + enumeration. + + + + + + Return a new logger instance named as the first parameter using + the default factory. + + + + Return a new logger instance named as the first parameter using + the default factory. + + + If a logger of that name already exists, then it will be + returned. Otherwise, a new logger will be instantiated and + then linked with its existing ancestors as well as children. + + + The name of the logger to retrieve + The logger object with the name specified + + + + Shutting down a hierarchy will safely close and remove + all appenders in all loggers including the root logger. + + + + Shutting down a hierarchy will safely close and remove + all appenders in all loggers including the root logger. + + + Some appenders need to be closed before the + application exists. Otherwise, pending logging events might be + lost. + + + The Shutdown method is careful to close nested + appenders before closing regular appenders. This is allows + configurations where a regular appender is attached to a logger + and again to a nested appender. + + + + + + Reset all values contained in this hierarchy instance to their default. + + + + Reset all values contained in this hierarchy instance to their + default. This removes all appenders from all loggers, sets + the level of all non-root loggers to null, + sets their additivity flag to true and sets the level + of the root logger to . Moreover, + message disabling is set its default "off" value. + + + Existing loggers are not removed. They are just reset. + + + This method should be used sparingly and with care as it will + block all logging until it is completed. + + + + + + Log the logEvent through this hierarchy. + + the event to log + + + This method should not normally be used to log. + The interface should be used + for routine logging. This interface can be obtained + using the method. + + + The logEvent is delivered to the appropriate logger and + that logger is then responsible for logging the event. + + + + + + Returns all the Appenders that are currently configured + + An array containing all the currently configured appenders + + + Returns all the instances that are currently configured. + All the loggers are searched for appenders. The appenders may also be containers + for appenders and these are also searched for additional loggers. + + + The list returned is unordered but does not contain duplicates. + + + + + + Collect the appenders from an . + The appender may also be a container. + + + + + + + Collect the appenders from an container + + + + + + + Initialize the log4net system using the specified appender + + the appender to use to log all logging events + + + + Initialize the log4net system using the specified appender + + the appender to use to log all logging events + + + This method provides the same functionality as the + method implemented + on this object, but it is protected and therefore can be called by subclasses. + + + + + + Initialize the log4net system using the specified config + + the element containing the root of the config + + + + Initialize the log4net system using the specified config + + the element containing the root of the config + + + This method provides the same functionality as the + method implemented + on this object, but it is protected and therefore can be called by subclasses. + + + + + + Test if this hierarchy is disabled for the specified . + + The level to check against. + + true if the repository is disabled for the level argument, false otherwise. + + + + If this hierarchy has not been configured then this method will + always return true. + + + This method will return true if this repository is + disabled for level object passed as parameter and + false otherwise. + + + See also the property. + + + + + + Clear all logger definitions from the internal hashtable + + + + This call will clear all logger definitions from the internal + hashtable. Invoking this method will irrevocably mess up the + logger hierarchy. + + + You should really know what you are doing before + invoking this method. + + + + + + Return a new logger instance named as the first parameter using + . + + The name of the logger to retrieve + The factory that will make the new logger instance + The logger object with the name specified + + + If a logger of that name already exists, then it will be + returned. Otherwise, a new logger will be instantiated by the + parameter and linked with its existing + ancestors as well as children. + + + + + + Sends a logger creation event to all registered listeners + + The newly created logger + + Raises the logger creation event. + + + + + Updates all the parents of the specified logger + + The logger to update the parents for + + + This method loops through all the potential parents of + . There 3 possible cases: + + + + No entry for the potential parent of exists + + We create a ProvisionNode for this potential + parent and insert in that provision node. + + + + The entry is of type Logger for the potential parent. + + The entry is 's nearest existing parent. We + update 's parent field with this entry. We also break from + he loop because updating our parent's parent is our parent's + responsibility. + + + + The entry is of type ProvisionNode for this potential parent. + + We add to the list of children for this + potential parent. + + + + + + + + Replace a with a in the hierarchy. + + + + + + We update the links for all the children that placed themselves + in the provision node 'pn'. The second argument 'log' is a + reference for the newly created Logger, parent of all the + children in 'pn'. + + + We loop on all the children 'c' in 'pn'. + + + If the child 'c' has been already linked to a child of + 'log' then there is no need to update 'c'. + + + Otherwise, we set log's parent field to c's parent and set + c's parent field to log. + + + + + + Define or redefine a Level using the values in the argument + + the level values + + + Define or redefine a Level using the values in the argument + + + Supports setting levels via the configuration file. + + + + + + Set a Property using the values in the argument + + the property value + + + Set a Property using the values in the argument. + + + Supports setting property values via the configuration file. + + + + + + Event used to notify that a logger has been created. + + + + Event raised when a logger is created. + + + + + + Has no appender warning been emitted + + + + Flag to indicate if we have already issued a warning + about not having an appender warning. + + + + + + Get the root of this hierarchy + + + + Get the root of this hierarchy. + + + + + + Gets or sets the default instance. + + The default + + + The logger factory is used to create logger instances. + + + + + + A class to hold the value, name and display name for a level + + + + A class to hold the value, name and display name for a level + + + + + + Override Object.ToString to return sensible debug info + + string info about this object + + + + Value of the level + + + + If the value is not set (defaults to -1) the value will be looked + up for the current level with the same name. + + + + + + Name of the level + + + The name of the level + + + + The name of the level. + + + + + + Display name for the level + + + The display name of the level + + + + The display name of the level. + + + + + + A class to hold the key and data for a property set in the config file + + + + A class to hold the key and data for a property set in the config file + + + + + + Override Object.ToString to return sensible debug info + + string info about this object + + + + Property Key + + + Property Key + + + + Property Key. + + + + + + Property Value + + + Property Value + + + + Property Value. + + + + + + Used internally to accelerate hash table searches. + + + + Internal class used to improve performance of + string keyed hashtables. + + + The hashcode of the string is cached for reuse. + The string is stored as an interned value. + When comparing two objects for equality + the reference equality of the interned strings is compared. + + + Nicko Cadell + Gert Driesen + + + + Construct key with string name + + + + Initializes a new instance of the class + with the specified name. + + + Stores the hashcode of the string and interns + the string key to optimize comparisons. + + + The Compact Framework 1.0 the + method does not work. On the Compact Framework + the string keys are not interned nor are they + compared by reference. + + + The name of the logger. + + + + Returns a hash code for the current instance. + + A hash code for the current instance. + + + Returns the cached hashcode. + + + + + + Determines whether two instances + are equal. + + The to compare with the current . + + true if the specified is equal to the current ; otherwise, false. + + + + Compares the references of the interned strings. + + + + + + Provision nodes are used where no logger instance has been specified + + + + instances are used in the + when there is no specified + for that node. + + + A provision node holds a list of child loggers on behalf of + a logger that does not exist. + + + Nicko Cadell + Gert Driesen + + + + Create a new provision node with child node + + A child logger to add to this node. + + + Initializes a new instance of the class + with the specified child logger. + + + + + + The sits at the root of the logger hierarchy tree. + + + + The is a regular except + that it provides several guarantees. + + + First, it cannot be assigned a null + level. Second, since the root logger cannot have a parent, the + property always returns the value of the + level field without walking the hierarchy. + + + Nicko Cadell + Gert Driesen + + + + Construct a + + The level to assign to the root logger. + + + Initializes a new instance of the class with + the specified logging level. + + + The root logger names itself as "root". However, the root + logger cannot be retrieved by name. + + + + + + Gets the assigned level value without walking the logger hierarchy. + + The assigned level value without walking the logger hierarchy. + + + Because the root logger cannot have a parent and its level + must not be null this property just returns the + value of . + + + + + + Gets or sets the assigned for the root logger. + + + The of the root logger. + + + + Setting the level of the root logger to a null reference + may have catastrophic results. We prevent this here. + + + + + + Initializes the log4net environment using an XML DOM. + + + + Configures a using an XML DOM. + + + Nicko Cadell + Gert Driesen + + + + Construct the configurator for a hierarchy + + The hierarchy to build. + + + Initializes a new instance of the class + with the specified . + + + + + + Configure the hierarchy by parsing a DOM tree of XML elements. + + The root element to parse. + + + Configure the hierarchy by parsing a DOM tree of XML elements. + + + + + + Parse appenders by IDREF. + + The appender ref element. + The instance of the appender that the ref refers to. + + + Parse an XML element that represents an appender and return + the appender. + + + + + + Parses an appender element. + + The appender element. + The appender instance or null when parsing failed. + + + Parse an XML element that represents an appender and return + the appender instance. + + + + + + Parses a logger element. + + The logger element. + + + Parse an XML element that represents a logger. + + + + + + Parses the root logger element. + + The root element. + + + Parse an XML element that represents the root logger. + + + + + + Parses the children of a logger element. + + The category element. + The logger instance. + Flag to indicate if the logger is the root logger. + + + Parse the child elements of a <logger> element. + + + + + + Parses an object renderer. + + The renderer element. + + + Parse an XML element that represents a renderer. + + + + + + Parses a level element. + + The level element. + The logger object to set the level on. + Flag to indicate if the logger is the root logger. + + + Parse an XML element that represents a level. + + + + + + Sets a parameter on an object. + + The parameter element. + The object to set the parameter on. + + The parameter name must correspond to a writable property + on the object. The value of the parameter is a string, + therefore this function will attempt to set a string + property first. If unable to set a string property it + will inspect the property and its argument type. It will + attempt to call a static method called Parse on the + type of the property. This method will take a single + string argument and return a value that can be used to + set the property. + + + + + Test if an element has no attributes or child elements + + the element to inspect + true if the element has any attributes or child elements, false otherwise + + + + Test if a is constructible with Activator.CreateInstance. + + the type to inspect + true if the type is creatable using a default constructor, false otherwise + + + + Look for a method on the that matches the supplied + + the type that has the method + the name of the method + the method info found + + + The method must be a public instance method on the . + The method must be named or "Add" followed by . + The method must take a single parameter. + + + + + + Converts a string value to a target type. + + The type of object to convert the string to. + The string value to use as the value of the object. + + + An object of type with value or + null when the conversion could not be performed. + + + + + + Creates an object as specified in XML. + + The XML element that contains the definition of the object. + The object type to use if not explicitly specified. + The type that the returned object must be or must inherit from. + The object or null + + + Parse an XML element and create an object instance based on the configuration + data. + + + The type of the instance may be specified in the XML. If not + specified then the is used + as the type. However the type is specified it must support the + type. + + + + + + key: appenderName, value: appender. + + + + + The Hierarchy being configured. + + + + + Delegate used to handle logger repository shutdown event notifications + + The that is shutting down. + Empty event args + + + Delegate used to handle logger repository shutdown event notifications. + + + + + + Delegate used to handle logger repository configuration reset event notifications + + The that has had its configuration reset. + Empty event args + + + Delegate used to handle logger repository configuration reset event notifications. + + + + + + Delegate used to handle event notifications for logger repository configuration changes. + + The that has had its configuration changed. + Empty event arguments. + + + Delegate used to handle event notifications for logger repository configuration changes. + + + + + + Write the name of the current AppDomain to the output + + + + Write the name of the current AppDomain to the output writer + + + Nicko Cadell + + + + Write the name of the current AppDomain to the output + + the writer to write to + null, state is not set + + + Writes name of the current AppDomain to the output . + + + + + + Write the current date to the output + + + + Date pattern converter, uses a to format + the current date and time to the writer as a string. + + + The value of the determines + the formatting of the date. The following values are allowed: + + + Option value + Output + + + ISO8601 + + Uses the formatter. + Formats using the "yyyy-MM-dd HH:mm:ss,fff" pattern. + + + + DATE + + Uses the formatter. + Formats using the "dd MMM yyyy HH:mm:ss,fff" for example, "06 Nov 1994 15:49:37,459". + + + + ABSOLUTE + + Uses the formatter. + Formats using the "HH:mm:ss,fff" for example, "15:49:37,459". + + + + other + + Any other pattern string uses the formatter. + This formatter passes the pattern string to the + method. + For details on valid patterns see + DateTimeFormatInfo Class. + + + + + + The date and time is in the local time zone and is rendered in that zone. + To output the time in Universal time see . + + + Nicko Cadell + + + + The used to render the date to a string + + + + The used to render the date to a string + + + + + + Initialize the converter options + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Write the current date to the output + + that will receive the formatted result. + null, state is not set + + + Pass the current date and time to the + for it to render it to the writer. + + + The date and time passed is in the local time zone. + + + + + + Write an environment variable to the output + + + + Write an environment variable to the output writer. + The value of the determines + the name of the variable to output. + + + Nicko Cadell + + + + Write an environment variable to the output + + the writer to write to + null, state is not set + + + Writes the environment variable to the output . + The name of the environment variable to output must be set + using the + property. + + + + + + Write the current thread identity to the output + + + + Write the current thread identity to the output writer + + + Nicko Cadell + + + + Write the current thread identity to the output + + the writer to write to + null, state is not set + + + Writes the current thread identity to the output . + + + + + + Pattern converter for literal string instances in the pattern + + + + Writes the literal string value specified in the + property to + the output. + + + Nicko Cadell + + + + Set the next converter in the chain + + The next pattern converter in the chain + The next pattern converter + + + Special case the building of the pattern converter chain + for instances. Two adjacent + literals in the pattern can be represented by a single combined + pattern converter. This implementation detects when a + is added to the chain + after this converter and combines its value with this converter's + literal value. + + + + + + Write the literal to the output + + the writer to write to + null, not set + + + Override the formatting behavior to ignore the FormattingInfo + because we have a literal instead. + + + Writes the value of + to the output . + + + + + + Convert this pattern into the rendered message + + that will receive the formatted result. + null, not set + + + This method is not used. + + + + + + Writes a newline to the output + + + + Writes the system dependent line terminator to the output. + This behavior can be overridden by setting the : + + + + Option Value + Output + + + DOS + DOS or Windows line terminator "\r\n" + + + UNIX + UNIX line terminator "\n" + + + + Nicko Cadell + + + + Initialize the converter + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Write the current process ID to the output + + + + Write the current process ID to the output writer + + + Nicko Cadell + + + + Write the current process ID to the output + + the writer to write to + null, state is not set + + + Write the current process ID to the output . + + + + + + Property pattern converter + + + + This pattern converter reads the thread and global properties. + The thread properties take priority over global properties. + See for details of the + thread properties. See for + details of the global properties. + + + If the is specified then that will be used to + lookup a single property. If no is specified + then all properties will be dumped as a list of key value pairs. + + + Nicko Cadell + + + + Write the property value to the output + + that will receive the formatted result. + null, state is not set + + + Writes out the value of a named property. The property name + should be set in the + property. + + + If the is set to null + then all the properties are written as key value pairs. + + + + + + A Pattern converter that generates a string of random characters + + + + The converter generates a string of random characters. By default + the string is length 4. This can be changed by setting the + to the string value of the length required. + + + The random characters in the string are limited to uppercase letters + and numbers only. + + + The random number generator used by this class is not cryptographically secure. + + + Nicko Cadell + + + + Shared random number generator + + + + + Length of random string to generate. Default length 4. + + + + + Initialize the converter options + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Write a randoim string to the output + + the writer to write to + null, state is not set + + + Write a randoim string to the output . + + + + + + Write the current threads username to the output + + + + Write the current threads username to the output writer + + + Nicko Cadell + + + + Write the current threads username to the output + + the writer to write to + null, state is not set + + + Write the current threads username to the output . + + + + + + Write the UTC date time to the output + + + + Date pattern converter, uses a to format + the current date and time in Universal time. + + + See the for details on the date pattern syntax. + + + + Nicko Cadell + + + + Write the current date and time to the output + + that will receive the formatted result. + null, state is not set + + + Pass the current date and time to the + for it to render it to the writer. + + + The date is in Universal time when it is rendered. + + + + + + + Type converter for Boolean. + + + + Supports conversion from string to bool type. + + + + + + Nicko Cadell + Gert Driesen + + + + Can the source type be converted to the type supported by this object + + the type to convert + true if the conversion is possible + + + Returns true if the is + the type. + + + + + + Convert the source object to the type supported by this object + + the object to convert + the converted object + + + Uses the method to convert the + argument to a . + + + + The object cannot be converted to the + target type. To check for this condition use the + method. + + + + + Exception base type for conversion errors. + + + + This type extends . It + does not add any new functionality but does differentiate the + type of exception being thrown. + + + Nicko Cadell + Gert Driesen + + + + Constructor + + + + Initializes a new instance of the class. + + + + + + Constructor + + A message to include with the exception. + + + Initializes a new instance of the class + with the specified message. + + + + + + Constructor + + A message to include with the exception. + A nested exception to include. + + + Initializes a new instance of the class + with the specified message and inner exception. + + + + + + Serialization constructor + + The that holds the serialized object data about the exception being thrown. + The that contains contextual information about the source or destination. + + + Initializes a new instance of the class + with serialized data. + + + + + + Creates a new instance of the class. + + The conversion destination type. + The value to convert. + An instance of the . + + + Creates a new instance of the class. + + + + + + Creates a new instance of the class. + + The conversion destination type. + The value to convert. + A nested exception to include. + An instance of the . + + + Creates a new instance of the class. + + + + + + Register of type converters for specific types. + + + + Maintains a registry of type converters used to convert between + types. + + + Use the and + methods to register new converters. + The and methods + lookup appropriate converters to use. + + + + + Nicko Cadell + Gert Driesen + + + + Private constructor + + + Initializes a new instance of the class. + + + + + Static constructor. + + + + This constructor defines the intrinsic type converters. + + + + + + Adds a converter for a specific type. + + The type being converted to. + The type converter to use to convert to the destination type. + + + Adds a converter instance for a specific type. + + + + + + Adds a converter for a specific type. + + The type being converted to. + The type of the type converter to use to convert to the destination type. + + + Adds a converter for a specific type. + + + + + + Gets the type converter to use to convert values to the destination type. + + The type being converted from. + The type being converted to. + + The type converter instance to use for type conversions or null + if no type converter is found. + + + + Gets the type converter to use to convert values to the destination type. + + + + + + Gets the type converter to use to convert values to the destination type. + + The type being converted to. + + The type converter instance to use for type conversions or null + if no type converter is found. + + + + Gets the type converter to use to convert values to the destination type. + + + + + + Lookups the type converter to use as specified by the attributes on the + destination type. + + The type being converted to. + + The type converter instance to use for type conversions or null + if no type converter is found. + + + + + Creates the instance of the type converter. + + The type of the type converter. + + The type converter instance to use for type conversions or null + if no type converter is found. + + + + The type specified for the type converter must implement + the or interfaces + and must have a public default (no argument) constructor. + + + + + + Mapping from to type converter. + + + + + Supports conversion from string to type. + + + + Supports conversion from string to type. + + + + + + Nicko Cadell + Gert Driesen + + + + Can the source type be converted to the type supported by this object + + the type to convert + true if the conversion is possible + + + Returns true if the is + the type. + + + + + + Overrides the ConvertFrom method of IConvertFrom. + + the object to convert to an encoding + the encoding + + + Uses the method to + convert the argument to an . + + + + The object cannot be converted to the + target type. To check for this condition use the + method. + + + + + Interface supported by type converters + + + + This interface supports conversion from a single type to arbitrary types. + See . + + + Nicko Cadell + + + + Returns whether this converter can convert the object to the specified type + + A Type that represents the type you want to convert to + true if the conversion is possible + + + Test if the type supported by this converter can be converted to the + . + + + + + + Converts the given value object to the specified type, using the arguments + + the object to convert + The Type to convert the value parameter to + the converted object + + + Converts the (which must be of the type supported + by this converter) to the specified.. + + + + + + Supports conversion from string to type. + + + + Supports conversion from string to type. + + + + + Nicko Cadell + + + + Can the source type be converted to the type supported by this object + + the type to convert + true if the conversion is possible + + + Returns true if the is + the type. + + + + + + Overrides the ConvertFrom method of IConvertFrom. + + the object to convert to an IPAddress + the IPAddress + + + Uses the method to convert the + argument to an . + If that fails then the string is resolved as a DNS hostname. + + + + The object cannot be converted to the + target type. To check for this condition use the + method. + + + + + Valid characters in an IPv4 or IPv6 address string. (Does not support subnets) + + + + + Supports conversion from string to type. + + + + Supports conversion from string to type. + + + The string is used as the + of the . + + + + + + Nicko Cadell + + + + Can the source type be converted to the type supported by this object + + the type to convert + true if the conversion is possible + + + Returns true if the is + the type. + + + + + + Overrides the ConvertFrom method of IConvertFrom. + + the object to convert to a PatternLayout + the PatternLayout + + + Creates and returns a new using + the as the + . + + + + The object cannot be converted to the + target type. To check for this condition use the + method. + + + + + Convert between string and + + + + Supports conversion from string to type, + and from a type to a string. + + + The string is used as the + of the . + + + + + + Nicko Cadell + + + + Can the target type be converted to the type supported by this object + + A that represents the type you want to convert to + true if the conversion is possible + + + Returns true if the is + assignable from a type. + + + + + + Converts the given value object to the specified type, using the arguments + + the object to convert + The Type to convert the value parameter to + the converted object + + + Uses the method to convert the + argument to a . + + + + The object cannot be converted to the + . To check for this condition use the + method. + + + + + Can the source type be converted to the type supported by this object + + the type to convert + true if the conversion is possible + + + Returns true if the is + the type. + + + + + + Overrides the ConvertFrom method of IConvertFrom. + + the object to convert to a PatternString + the PatternString + + + Creates and returns a new using + the as the + . + + + + The object cannot be converted to the + target type. To check for this condition use the + method. + + + + + Supports conversion from string to type. + + + + Supports conversion from string to type. + + + + + + Nicko Cadell + + + + Can the source type be converted to the type supported by this object + + the type to convert + true if the conversion is possible + + + Returns true if the is + the type. + + + + + + Overrides the ConvertFrom method of IConvertFrom. + + the object to convert to a Type + the Type + + + Uses the method to convert the + argument to a . + Additional effort is made to locate partially specified types + by searching the loaded assemblies. + + + + The object cannot be converted to the + target type. To check for this condition use the + method. + + + + + Attribute used to associate a type converter + + + + Class and Interface level attribute that specifies a type converter + to use with the associated type. + + + To associate a type converter with a target type apply a + TypeConverterAttribute to the target type. Specify the + type of the type converter on the attribute. + + + Nicko Cadell + Gert Driesen + + + + The string type name of the type converter + + + + + Default constructor + + + + Default constructor + + + + + + Create a new type converter attribute for the specified type name + + The string type name of the type converter + + + The type specified must implement the + or the interfaces. + + + + + + Create a new type converter attribute for the specified type + + The type of the type converter + + + The type specified must implement the + or the interfaces. + + + + + + The string type name of the type converter + + + The string type name of the type converter + + + + The type specified must implement the + or the interfaces. + + + + + + A straightforward implementation of the interface. + + + + This is the default implementation of the + interface. Implementors of the interface + should aggregate an instance of this type. + + + Nicko Cadell + Gert Driesen + + + + Constructor + + + + Initializes a new instance of the class. + + + + + + Append on on all attached appenders. + + The event being logged. + The number of appenders called. + + + Calls the method on all + attached appenders. + + + + + + Append on on all attached appenders. + + The array of events being logged. + The number of appenders called. + + + Calls the method on all + attached appenders. + + + + + + Calls the DoAppende method on the with + the objects supplied. + + The appender + The events + + + If the supports the + interface then the will be passed + through using that interface. Otherwise the + objects in the array will be passed one at a time. + + + + + + Attaches an appender. + + The appender to add. + + + If the appender is already in the list it won't be added again. + + + + + + Gets an attached appender with the specified name. + + The name of the appender to get. + + The appender with the name specified, or null if no appender with the + specified name is found. + + + + Lookup an attached appender by name. + + + + + + Removes all attached appenders. + + + + Removes and closes all attached appenders + + + + + + Removes the specified appender from the list of attached appenders. + + The appender to remove. + The appender removed from the list + + + The appender removed is not closed. + If you are discarding the appender you must call + on the appender removed. + + + + + + Removes the appender with the specified name from the list of appenders. + + The name of the appender to remove. + The appender removed from the list + + + The appender removed is not closed. + If you are discarding the appender you must call + on the appender removed. + + + + + + List of appenders + + + + + Array of appenders, used to cache the m_appenderList + + + + + Gets all attached appenders. + + + A collection of attached appenders, or null if there + are no attached appenders. + + + + The read only collection of all currently attached appenders. + + + + + + This class aggregates several PropertiesDictionary collections together. + + + + Provides a dictionary style lookup over an ordered list of + collections. + + + Nicko Cadell + + + + Constructor + + + + Initializes a new instance of the class. + + + + + + Add a Properties Dictionary to this composite collection + + the properties to add + + + Properties dictionaries added first take precedence over dictionaries added + later. + + + + + + Flatten this composite collection into a single properties dictionary + + the flattened dictionary + + + Reduces the collection of ordered dictionaries to a single dictionary + containing the resultant values for the keys. + + + + + + Gets the value of a property + + + The value for the property with the specified key + + + + Looks up the value for the specified. + The collections are searched + in the order in which they were added to this collection. The value + returned is the value held by the first collection that contains + the specified key. + + + If none of the collections contain the specified key then + null is returned. + + + + + + Base class for Context Properties implementations + + + + This class defines a basic property get set accessor + + + Nicko Cadell + + + + Gets or sets the value of a property + + + The value for the property with the specified key + + + + Gets or sets the value of a property + + + + + + Subclass of that maintains a count of + the number of bytes written. + + + + This writer counts the number of bytes written. + + + Nicko Cadell + Gert Driesen + + + + that does not leak exceptions + + + + does not throw exceptions when things go wrong. + Instead, it delegates error handling to its . + + + Nicko Cadell + Gert Driesen + + + + Adapter that extends and forwards all + messages to an instance of . + + + + Adapter that extends and forwards all + messages to an instance of . + + + Nicko Cadell + + + + The writer to forward messages to + + + + + Create an instance of that forwards all + messages to a . + + The to forward to + + + Create an instance of that forwards all + messages to a . + + + + + + Closes the writer and releases any system resources associated with the writer + + + + + + + + + Dispose this writer + + flag indicating if we are being disposed + + + Dispose this writer + + + + + + Flushes any buffered output + + + + Clears all buffers for the writer and causes any buffered data to be written + to the underlying device + + + + + + Writes a character to the wrapped TextWriter + + the value to write to the TextWriter + + + Writes a character to the wrapped TextWriter + + + + + + Writes a character buffer to the wrapped TextWriter + + the data buffer + the start index + the number of characters to write + + + Writes a character buffer to the wrapped TextWriter + + + + + + Writes a string to the wrapped TextWriter + + the value to write to the TextWriter + + + Writes a string to the wrapped TextWriter + + + + + + Gets or sets the underlying . + + + The underlying . + + + + Gets or sets the underlying . + + + + + + The Encoding in which the output is written + + + The + + + + The Encoding in which the output is written + + + + + + Gets an object that controls formatting + + + The format provider + + + + Gets an object that controls formatting + + + + + + Gets or sets the line terminator string used by the TextWriter + + + The line terminator to use + + + + Gets or sets the line terminator string used by the TextWriter + + + + + + Constructor + + the writer to actually write to + the error handler to report error to + + + Create a new QuietTextWriter using a writer and error handler + + + + + + Writes a character to the underlying writer + + the char to write + + + Writes a character to the underlying writer + + + + + + Writes a buffer to the underlying writer + + the buffer to write + the start index to write from + the number of characters to write + + + Writes a buffer to the underlying writer + + + + + + Writes a string to the output. + + The string data to write to the output. + + + Writes a string to the output. + + + + + + Closes the underlying output writer. + + + + Closes the underlying output writer. + + + + + + The error handler instance to pass all errors to + + + + + Flag to indicate if this writer is closed + + + + + Gets or sets the error handler that all errors are passed to. + + + The error handler that all errors are passed to. + + + + Gets or sets the error handler that all errors are passed to. + + + + + + Gets a value indicating whether this writer is closed. + + + true if this writer is closed, otherwise false. + + + + Gets a value indicating whether this writer is closed. + + + + + + Constructor + + The to actually write to. + The to report errors to. + + + Creates a new instance of the class + with the specified and . + + + + + + Writes a character to the underlying writer and counts the number of bytes written. + + the char to write + + + Overrides implementation of . Counts + the number of bytes written. + + + + + + Writes a buffer to the underlying writer and counts the number of bytes written. + + the buffer to write + the start index to write from + the number of characters to write + + + Overrides implementation of . Counts + the number of bytes written. + + + + + + Writes a string to the output and counts the number of bytes written. + + The string data to write to the output. + + + Overrides implementation of . Counts + the number of bytes written. + + + + + + Total number of bytes written. + + + + + Gets or sets the total number of bytes written. + + + The total number of bytes written. + + + + Gets or sets the total number of bytes written. + + + + + + A fixed size rolling buffer of logging events. + + + + An array backed fixed size leaky bucket. + + + Nicko Cadell + Gert Driesen + + + + Constructor + + The maximum number of logging events in the buffer. + + + Initializes a new instance of the class with + the specified maximum number of buffered logging events. + + + The argument is not a positive integer. + + + + Appends a to the buffer. + + The event to append to the buffer. + The event discarded from the buffer, if the buffer is full, otherwise null. + + + Append an event to the buffer. If the buffer still contains free space then + null is returned. If the buffer is full then an event will be dropped + to make space for the new event, the event dropped is returned. + + + + + + Get and remove the oldest event in the buffer. + + The oldest logging event in the buffer + + + Gets the oldest (first) logging event in the buffer and removes it + from the buffer. + + + + + + Pops all the logging events from the buffer into an array. + + An array of all the logging events in the buffer. + + + Get all the events in the buffer and clear the buffer. + + + + + + Clear the buffer + + + + Clear the buffer of all events. The events in the buffer are lost. + + + + + + Gets the th oldest event currently in the buffer. + + The th oldest event currently in the buffer. + + + If is outside the range 0 to the number of events + currently in the buffer, then null is returned. + + + + + + Gets the maximum size of the buffer. + + The maximum size of the buffer. + + + Gets the maximum size of the buffer + + + + + + Gets the number of logging events in the buffer. + + The number of logging events in the buffer. + + + This number is guaranteed to be in the range 0 to + (inclusive). + + + + + + An always empty . + + + + A singleton implementation of the + interface that always represents an empty collection. + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + + Uses a private access modifier to enforce the singleton pattern. + + + + + + Copies the elements of the to an + , starting at a particular Array index. + + The one-dimensional + that is the destination of the elements copied from + . The Array must have zero-based + indexing. + The zero-based index in array at which + copying begins. + + + As the collection is empty no values are copied into the array. + + + + + + Returns an enumerator that can iterate through a collection. + + + An that can be used to + iterate through the collection. + + + + As the collection is empty a is returned. + + + + + + The singleton instance of the empty collection. + + + + + Gets the singleton instance of the empty collection. + + The singleton instance of the empty collection. + + + Gets the singleton instance of the empty collection. + + + + + + Gets a value indicating if access to the is synchronized (thread-safe). + + + true if access to the is synchronized (thread-safe); otherwise, false. + + + + For the this property is always true. + + + + + + Gets the number of elements contained in the . + + + The number of elements contained in the . + + + + As the collection is empty the is always 0. + + + + + + Gets an object that can be used to synchronize access to the . + + + An object that can be used to synchronize access to the . + + + + As the collection is empty and thread safe and synchronized this instance is also + the object. + + + + + + An always empty . + + + + A singleton implementation of the + interface that always represents an empty collection. + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + + Uses a private access modifier to enforce the singleton pattern. + + + + + + Copies the elements of the to an + , starting at a particular Array index. + + The one-dimensional + that is the destination of the elements copied from + . The Array must have zero-based + indexing. + The zero-based index in array at which + copying begins. + + + As the collection is empty no values are copied into the array. + + + + + + Returns an enumerator that can iterate through a collection. + + + An that can be used to + iterate through the collection. + + + + As the collection is empty a is returned. + + + + + + Adds an element with the provided key and value to the + . + + The to use as the key of the element to add. + The to use as the value of the element to add. + + + As the collection is empty no new values can be added. A + is thrown if this method is called. + + + This dictionary is always empty and cannot be modified. + + + + Removes all elements from the . + + + + As the collection is empty no values can be removed. A + is thrown if this method is called. + + + This dictionary is always empty and cannot be modified. + + + + Determines whether the contains an element + with the specified key. + + The key to locate in the . + false + + + As the collection is empty the method always returns false. + + + + + + Returns an enumerator that can iterate through a collection. + + + An that can be used to + iterate through the collection. + + + + As the collection is empty a is returned. + + + + + + Removes the element with the specified key from the . + + The key of the element to remove. + + + As the collection is empty no values can be removed. A + is thrown if this method is called. + + + This dictionary is always empty and cannot be modified. + + + + The singleton instance of the empty dictionary. + + + + + Gets the singleton instance of the . + + The singleton instance of the . + + + Gets the singleton instance of the . + + + + + + Gets a value indicating if access to the is synchronized (thread-safe). + + + true if access to the is synchronized (thread-safe); otherwise, false. + + + + For the this property is always true. + + + + + + Gets the number of elements contained in the + + + The number of elements contained in the . + + + + As the collection is empty the is always 0. + + + + + + Gets an object that can be used to synchronize access to the . + + + An object that can be used to synchronize access to the . + + + + As the collection is empty and thread safe and synchronized this instance is also + the object. + + + + + + Gets a value indicating whether the has a fixed size. + + true + + + As the collection is empty always returns true. + + + + + + Gets a value indicating whether the is read-only. + + true + + + As the collection is empty always returns true. + + + + + + Gets an containing the keys of the . + + An containing the keys of the . + + + As the collection is empty a is returned. + + + + + + Gets an containing the values of the . + + An containing the values of the . + + + As the collection is empty a is returned. + + + + + + Gets or sets the element with the specified key. + + The key of the element to get or set. + null + + + As the collection is empty no values can be looked up or stored. + If the index getter is called then null is returned. + A is thrown if the setter is called. + + + This dictionary is always empty and cannot be modified. + + + + Contain the information obtained when parsing formatting modifiers + in conversion modifiers. + + + + Holds the formatting information extracted from the format string by + the . This is used by the + objects when rendering the output. + + + Nicko Cadell + Gert Driesen + + + + Defaut Constructor + + + + Initializes a new instance of the class. + + + + + + Constructor + + + + Initializes a new instance of the class + with the specified parameters. + + + + + + Gets or sets the minimum value. + + + The minimum value. + + + + Gets or sets the minimum value. + + + + + + Gets or sets the maximum value. + + + The maximum value. + + + + Gets or sets the maximum value. + + + + + + Gets or sets a flag indicating whether left align is enabled + or not. + + + A flag indicating whether left align is enabled or not. + + + + Gets or sets a flag indicating whether left align is enabled or not. + + + + + + Implementation of Properties collection for the + + + + This class implements a properties collection that is thread safe and supports both + storing properties and capturing a read only copy of the current propertied. + + + This class is optimized to the scenario where the properties are read frequently + and are modified infrequently. + + + Nicko Cadell + + + + The read only copy of the properties. + + + + This variable is declared volatile to prevent the compiler and JIT from + reordering reads and writes of this thread performed on different threads. + + + + + + Lock object used to synchronize updates within this instance + + + + + Constructor + + + + Initializes a new instance of the class. + + + + + + Remove a property from the global context + + the key for the entry to remove + + + Removing an entry from the global context properties is relatively expensive compared + with reading a value. + + + + + + Clear the global context properties + + + + + Get a readonly immutable copy of the properties + + the current global context properties + + + This implementation is fast because the GlobalContextProperties class + stores a readonly copy of the properties. + + + + + + Gets or sets the value of a property + + + The value for the property with the specified key + + + + Reading the value for a key is faster than setting the value. + When the value is written a new read only copy of + the properties is created. + + + + + + Manages a mapping from levels to + + + + Manages an ordered mapping from instances + to subclasses. + + + Nicko Cadell + + + + Default constructor + + + + Initialise a new instance of . + + + + + + Add a to this mapping + + the entry to add + + + If a has previously been added + for the same then that entry will be + overwritten. + + + + + + Lookup the mapping for the specified level + + the level to lookup + the for the level or null if no mapping found + + + Lookup the value for the specified level. Finds the nearest + mapping value for the level that is equal to or less than the + specified. + + + If no mapping could be found then null is returned. + + + + + + Initialize options + + + + Caches the sorted list of in an array + + + + + + Implementation of Properties collection for the + + + + Class implements a collection of properties that is specific to each thread. + The class is not synchronized as each thread has its own . + + + Nicko Cadell + + + + Constructor + + + + Initializes a new instance of the class. + + + + + + Remove a property + + the key for the entry to remove + + + Remove the value for the specified from the context. + + + + + + Clear all the context properties + + + + Clear all the context properties + + + + + + Get the PropertiesDictionary stored in the LocalDataStoreSlot for this thread. + + create the dictionary if it does not exist, otherwise return null if is does not exist + the properties for this thread + + + The collection returned is only to be used on the calling thread. If the + caller needs to share the collection between different threads then the + caller must clone the collection before doings so. + + + + + + Gets or sets the value of a property + + + The value for the property with the specified key + + + + Get or set the property value for the specified. + + + + + + Outputs log statements from within the log4net assembly. + + + + Log4net components cannot make log4net logging calls. However, it is + sometimes useful for the user to learn about what log4net is + doing. + + + All log4net internal debug calls go to the standard output stream + whereas internal error messages are sent to the standard error output + stream. + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + + Uses a private access modifier to prevent instantiation of this class. + + + + + + Static constructor that initializes logging by reading + settings from the application configuration file. + + + + The log4net.Internal.Debug application setting + controls internal debugging. This setting should be set + to true to enable debugging. + + + The log4net.Internal.Quiet application setting + suppresses all internal logging including error messages. + This setting should be set to true to enable message + suppression. + + + + + + Writes log4net internal debug messages to the + standard output stream. + + The message to log. + + + All internal debug messages are prepended with + the string "log4net: ". + + + + + + Writes log4net internal debug messages to the + standard output stream. + + The message to log. + An exception to log. + + + All internal debug messages are prepended with + the string "log4net: ". + + + + + + Writes log4net internal warning messages to the + standard error stream. + + The message to log. + + + All internal warning messages are prepended with + the string "log4net:WARN ". + + + + + + Writes log4net internal warning messages to the + standard error stream. + + The message to log. + An exception to log. + + + All internal warning messages are prepended with + the string "log4net:WARN ". + + + + + + Writes log4net internal error messages to the + standard error stream. + + The message to log. + + + All internal error messages are prepended with + the string "log4net:ERROR ". + + + + + + Writes log4net internal error messages to the + standard error stream. + + The message to log. + An exception to log. + + + All internal debug messages are prepended with + the string "log4net:ERROR ". + + + + + + Writes output to the standard output stream. + + The message to log. + + + Writes to both Console.Out and System.Diagnostics.Trace. + Note that the System.Diagnostics.Trace is not supported + on the Compact Framework. + + + If the AppDomain is not configured with a config file then + the call to System.Diagnostics.Trace may fail. This is only + an issue if you are programmatically creating your own AppDomains. + + + + + + Writes output to the standard error stream. + + The message to log. + + + Writes to both Console.Error and System.Diagnostics.Trace. + Note that the System.Diagnostics.Trace is not supported + on the Compact Framework. + + + If the AppDomain is not configured with a config file then + the call to System.Diagnostics.Trace may fail. This is only + an issue if you are programmatically creating your own AppDomains. + + + + + + Default debug level + + + + + In quietMode not even errors generate any output. + + + + + Gets or sets a value indicating whether log4net internal logging + is enabled or disabled. + + + true if log4net internal logging is enabled, otherwise + false. + + + + When set to true, internal debug level logging will be + displayed. + + + This value can be set by setting the application setting + log4net.Internal.Debug in the application configuration + file. + + + The default value is false, i.e. debugging is + disabled. + + + + + The following example enables internal debugging using the + application configuration file : + + + + + + + + + + + + + Gets or sets a value indicating whether log4net should generate no output + from internal logging, not even for errors. + + + true if log4net should generate no output at all from internal + logging, otherwise false. + + + + When set to true will cause internal logging at all levels to be + suppressed. This means that no warning or error reports will be logged. + This option overrides the setting and + disables all debug also. + + This value can be set by setting the application setting + log4net.Internal.Quiet in the application configuration file. + + + The default value is false, i.e. internal logging is not + disabled. + + + + The following example disables internal logging using the + application configuration file : + + + + + + + + + + + + Test if LogLog.Debug is enabled for output. + + + true if Debug is enabled + + + + Test if LogLog.Debug is enabled for output. + + + + + + Test if LogLog.Warn is enabled for output. + + + true if Warn is enabled + + + + Test if LogLog.Warn is enabled for output. + + + + + + Test if LogLog.Error is enabled for output. + + + true if Error is enabled + + + + Test if LogLog.Error is enabled for output. + + + + + + Represents a native error code and message. + + + + Represents a Win32 platform native error. + + + Nicko Cadell + Gert Driesen + + + + Create an instance of the class with the specified + error number and message. + + The number of the native error. + The message of the native error. + + + Create an instance of the class with the specified + error number and message. + + + + + + Create a new instance of the class for the last Windows error. + + + An instance of the class for the last windows error. + + + + The message for the error number is lookup up using the + native Win32 FormatMessage function. + + + + + + Create a new instance of the class. + + the error number for the native error + + An instance of the class for the specified + error number. + + + + The message for the specified error number is lookup up using the + native Win32 FormatMessage function. + + + + + + Retrieves the message corresponding with a Win32 message identifier. + + Message identifier for the requested message. + + The message corresponding with the specified message identifier. + + + + The message will be searched for in system message-table resource(s) + using the native FormatMessage function. + + + + + + Return error information string + + error information string + + + Return error information string + + + + + + Formats a message string. + + Formatting options, and how to interpret the parameter. + Location of the message definition. + Message identifier for the requested message. + Language identifier for the requested message. + If includes FORMAT_MESSAGE_ALLOCATE_BUFFER, the function allocates a buffer using the LocalAlloc function, and places the pointer to the buffer at the address specified in . + If the FORMAT_MESSAGE_ALLOCATE_BUFFER flag is not set, this parameter specifies the maximum number of TCHARs that can be stored in the output buffer. If FORMAT_MESSAGE_ALLOCATE_BUFFER is set, this parameter specifies the minimum number of TCHARs to allocate for an output buffer. + Pointer to an array of values that are used as insert values in the formatted message. + + + The function requires a message definition as input. The message definition can come from a + buffer passed into the function. It can come from a message table resource in an + already-loaded module. Or the caller can ask the function to search the system's message + table resource(s) for the message definition. The function finds the message definition + in a message table resource based on a message identifier and a language identifier. + The function copies the formatted message text to an output buffer, processing any embedded + insert sequences if requested. + + + To prevent the usage of unsafe code, this stub does not support inserting values in the formatted message. + + + + + If the function succeeds, the return value is the number of TCHARs stored in the output + buffer, excluding the terminating null character. + + + If the function fails, the return value is zero. To get extended error information, + call . + + + + + + Gets the number of the native error. + + + The number of the native error. + + + + Gets the number of the native error. + + + + + + Gets the message of the native error. + + + The message of the native error. + + + + + Gets the message of the native error. + + + + + An always empty . + + + + A singleton implementation of the over a collection + that is empty and not modifiable. + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + + Uses a private access modifier to enforce the singleton pattern. + + + + + + Test if the enumerator can advance, if so advance. + + false as the cannot advance. + + + As the enumerator is over an empty collection its + value cannot be moved over a valid position, therefore + will always return false. + + + + + + Resets the enumerator back to the start. + + + + As the enumerator is over an empty collection does nothing. + + + + + + The singleton instance of the . + + + + + Gets the singleton instance of the . + + The singleton instance of the . + + + Gets the singleton instance of the . + + + + + + Gets the current object from the enumerator. + + + Throws an because the + never has a current value. + + + + As the enumerator is over an empty collection its + value cannot be moved over a valid position, therefore + will throw an . + + + The collection is empty and + cannot be positioned over a valid location. + + + + Gets the current key from the enumerator. + + + Throws an exception because the + never has a current value. + + + + As the enumerator is over an empty collection its + value cannot be moved over a valid position, therefore + will throw an . + + + The collection is empty and + cannot be positioned over a valid location. + + + + Gets the current value from the enumerator. + + The current value from the enumerator. + + Throws an because the + never has a current value. + + + + As the enumerator is over an empty collection its + value cannot be moved over a valid position, therefore + will throw an . + + + The collection is empty and + cannot be positioned over a valid location. + + + + Gets the current entry from the enumerator. + + + Throws an because the + never has a current entry. + + + + As the enumerator is over an empty collection its + value cannot be moved over a valid position, therefore + will throw an . + + + The collection is empty and + cannot be positioned over a valid location. + + + + An always empty . + + + + A singleton implementation of the over a collection + that is empty and not modifiable. + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + + Uses a private access modifier to enforce the singleton pattern. + + + + + + Test if the enumerator can advance, if so advance + + false as the cannot advance. + + + As the enumerator is over an empty collection its + value cannot be moved over a valid position, therefore + will always return false. + + + + + + Resets the enumerator back to the start. + + + + As the enumerator is over an empty collection does nothing. + + + + + + The singleton instance of the . + + + + + Get the singleton instance of the . + + The singleton instance of the . + + + Gets the singleton instance of the . + + + + + + Gets the current object from the enumerator. + + + Throws an because the + never has a current value. + + + + As the enumerator is over an empty collection its + value cannot be moved over a valid position, therefore + will throw an . + + + The collection is empty and + cannot be positioned over a valid location. + + + + A SecurityContext used when a SecurityContext is not required + + + + The is a no-op implementation of the + base class. It is used where a + is required but one has not been provided. + + + Nicko Cadell + + + + Singleton instance of + + + + Singleton instance of + + + + + + Private constructor + + + + Private constructor for singleton pattern. + + + + + + Impersonate this SecurityContext + + State supplied by the caller + null + + + No impersonation is done and null is always returned. + + + + + + Implements log4net's default error handling policy which consists + of emitting a message for the first error in an appender and + ignoring all subsequent errors. + + + + The error message is printed on the standard error output stream. + + + This policy aims at protecting an otherwise working application + from being flooded with error messages when logging fails. + + + Nicko Cadell + Gert Driesen + + + + Default Constructor + + + + Initializes a new instance of the class. + + + + + + Constructor + + The prefix to use for each message. + + + Initializes a new instance of the class + with the specified prefix. + + + + + + Log an Error + + The error message. + The exception. + The internal error code. + + + Prints the message and the stack trace of the exception on the standard + error output stream. + + + + + + Log an Error + + The error message. + The exception. + + + Prints the message and the stack trace of the exception on the standard + error output stream. + + + + + + Log an error + + The error message. + + + Print a the error message passed as parameter on the standard + error output stream. + + + + + + Flag to indicate if it is the first error + + + + + String to prefix each message with + + + + + Is error logging enabled + + + + Is error logging enabled. Logging is only enabled for the + first error delivered to the . + + + + + + A convenience class to convert property values to specific types. + + + + Utility functions for converting types and parsing values. + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + + Uses a private access modifier to prevent instantiation of this class. + + + + + + Converts a string to a value. + + String to convert. + The default value. + The value of . + + + If is "true", then true is returned. + If is "false", then false is returned. + Otherwise, is returned. + + + + + + Parses a file size into a number. + + String to parse. + The default value. + The value of . + + + Parses a file size of the form: number[KB|MB|GB] into a + long value. It is scaled with the appropriate multiplier. + + + is returned when + cannot be converted to a value. + + + + + + Converts a string to an object. + + The target type to convert to. + The string to convert to an object. + + The object converted from a string or null when the + conversion failed. + + + + Converts a string to an object. Uses the converter registry to try + to convert the string value into the specified target type. + + + + + + Checks if there is an appropriate type conversion from the source type to the target type. + + The type to convert from. + The type to convert to. + true if there is a conversion from the source type to the target type. + + Checks if there is an appropriate type conversion from the source type to the target type. + + + + + + + Converts an object to the target type. + + The object to convert to the target type. + The type to convert to. + The converted object. + + + Converts an object to the target type. + + + + + + Instantiates an object given a class name. + + The fully qualified class name of the object to instantiate. + The class to which the new object should belong. + The object to return in case of non-fulfillment. + + An instance of the or + if the object could not be instantiated. + + + + Checks that the is a subclass of + . If that test fails or the object could + not be instantiated, then is returned. + + + + + + Performs variable substitution in string from the + values of keys found in . + + The string on which variable substitution is performed. + The dictionary to use to lookup variables. + The result of the substitutions. + + + The variable substitution delimiters are ${ and }. + + + For example, if props contains key=value, then the call + + + + string s = OptionConverter.SubstituteVariables("Value of key is ${key}."); + + + + will set the variable s to "Value of key is value.". + + + If no value could be found for the specified key, then substitution + defaults to an empty string. + + + For example, if system properties contains no value for the key + "nonExistentKey", then the call + + + + string s = OptionConverter.SubstituteVariables("Value of nonExistentKey is [${nonExistentKey}]"); + + + + will set s to "Value of nonExistentKey is []". + + + An Exception is thrown if contains a start + delimiter "${" which is not balanced by a stop delimiter "}". + + + + + + Converts the string representation of the name or numeric value of one or + more enumerated constants to an equivalent enumerated object. + + The type to convert to. + The enum string value. + If true, ignore case; otherwise, regard case. + An object of type whose value is represented by . + + + + Most of the work of the class + is delegated to the PatternParser class. + + + + The PatternParser processes a pattern string and + returns a chain of objects. + + + Nicko Cadell + Gert Driesen + + + + Constructor + + The pattern to parse. + + + Initializes a new instance of the class + with the specified pattern string. + + + + + + Parses the pattern into a chain of pattern converters. + + The head of a chain of pattern converters. + + + Parses the pattern into a chain of pattern converters. + + + + + + Build the unified cache of converters from the static and instance maps + + the list of all the converter names + + + Build the unified cache of converters from the static and instance maps + + + + + + Internal method to parse the specified pattern to find specified matches + + the pattern to parse + the converter names to match in the pattern + + + The matches param must be sorted such that longer strings come before shorter ones. + + + + + + Process a parsed literal + + the literal text + + + + Process a parsed converter pattern + + the name of the converter + the optional option for the converter + the formatting info for the converter + + + + Resets the internal state of the parser and adds the specified pattern converter + to the chain. + + The pattern converter to add. + + + + The first pattern converter in the chain + + + + + the last pattern converter in the chain + + + + + The pattern + + + + + Internal map of converter identifiers to converter types + + + + This map overrides the static s_globalRulesRegistry map. + + + + + + Get the converter registry used by this parser + + + The converter registry used by this parser + + + + Get the converter registry used by this parser + + + + + + Sort strings by length + + + + that orders strings by string length. + The longest strings are placed first + + + + + + This class implements a patterned string. + + + + This string has embedded patterns that are resolved and expanded + when the string is formatted. + + + This class functions similarly to the + in that it accepts a pattern and renders it to a string. Unlike the + however the PatternString + does not render the properties of a specific but + of the process in general. + + + The recognized conversion pattern names are: + + + + Conversion Pattern Name + Effect + + + appdomain + + + Used to output the friendly name of the current AppDomain. + + + + + date + + + Used to output the date of the logging event in the local time zone. + To output the date in universal time use the %utcdate pattern. + The date conversion + specifier may be followed by a date format specifier enclosed + between braces. For example, %date{HH:mm:ss,fff} or + %date{dd MMM yyyy HH:mm:ss,fff}. If no date format specifier is + given then ISO8601 format is + assumed (). + + + The date format specifier admits the same syntax as the + time pattern string of the . + + + For better results it is recommended to use the log4net date + formatters. These can be specified using one of the strings + "ABSOLUTE", "DATE" and "ISO8601" for specifying + , + and respectively + . For example, + %date{ISO8601} or %date{ABSOLUTE}. + + + These dedicated date formatters perform significantly + better than . + + + + + env + + + Used to output the a specific environment variable. The key to + lookup must be specified within braces and directly following the + pattern specifier, e.g. %env{COMPUTERNAME} would include the value + of the COMPUTERNAME environment variable. + + + The env pattern is not supported on the .NET Compact Framework. + + + + + identity + + + Used to output the user name for the currently active user + (Principal.Identity.Name). + + + + + newline + + + Outputs the platform dependent line separator character or + characters. + + + This conversion pattern name offers the same performance as using + non-portable line separator strings such as "\n", or "\r\n". + Thus, it is the preferred way of specifying a line separator. + + + + + processid + + + Used to output the system process ID for the current process. + + + + + property + + + Used to output a specific context property. The key to + lookup must be specified within braces and directly following the + pattern specifier, e.g. %property{user} would include the value + from the property that is keyed by the string 'user'. Each property value + that is to be included in the log must be specified separately. + Properties are stored in logging contexts. By default + the log4net:HostName property is set to the name of machine on + which the event was originally logged. + + + If no key is specified, e.g. %property then all the keys and their + values are printed in a comma separated list. + + + The properties of an event are combined from a number of different + contexts. These are listed below in the order in which they are searched. + + + + the thread properties + + The that are set on the current + thread. These properties are shared by all events logged on this thread. + + + + the global properties + + The that are set globally. These + properties are shared by all the threads in the AppDomain. + + + + + + + random + + + Used to output a random string of characters. The string is made up of + uppercase letters and numbers. By default the string is 4 characters long. + The length of the string can be specified within braces directly following the + pattern specifier, e.g. %random{8} would output an 8 character string. + + + + + username + + + Used to output the WindowsIdentity for the currently + active user. + + + + + utcdate + + + Used to output the date of the logging event in universal time. + The date conversion + specifier may be followed by a date format specifier enclosed + between braces. For example, %utcdate{HH:mm:ss,fff} or + %utcdate{dd MMM yyyy HH:mm:ss,fff}. If no date format specifier is + given then ISO8601 format is + assumed (). + + + The date format specifier admits the same syntax as the + time pattern string of the . + + + For better results it is recommended to use the log4net date + formatters. These can be specified using one of the strings + "ABSOLUTE", "DATE" and "ISO8601" for specifying + , + and respectively + . For example, + %utcdate{ISO8601} or %utcdate{ABSOLUTE}. + + + These dedicated date formatters perform significantly + better than . + + + + + % + + + The sequence %% outputs a single percent sign. + + + + + + Additional pattern converters may be registered with a specific + instance using or + . + + + See the for details on the + format modifiers supported by the patterns. + + + Nicko Cadell + + + + Internal map of converter identifiers to converter types. + + + + + the pattern + + + + + the head of the pattern converter chain + + + + + patterns defined on this PatternString only + + + + + Initialize the global registry + + + + + Default constructor + + + + Initialize a new instance of + + + + + + Constructs a PatternString + + The pattern to use with this PatternString + + + Initialize a new instance of with the pattern specified. + + + + + + Initialize object options + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Create the used to parse the pattern + + the pattern to parse + The + + + Returns PatternParser used to parse the conversion string. Subclasses + may override this to return a subclass of PatternParser which recognize + custom conversion pattern name. + + + + + + Produces a formatted string as specified by the conversion pattern. + + The TextWriter to write the formatted event to + + + Format the pattern to the . + + + + + + Format the pattern as a string + + the pattern formatted as a string + + + Format the pattern to a string. + + + + + + Add a converter to this PatternString + + the converter info + + + This version of the method is used by the configurator. + Programmatic users should use the alternative method. + + + + + + Add a converter to this PatternString + + the name of the conversion pattern for this converter + the type of the converter + + + Add a converter to this PatternString + + + + + + Gets or sets the pattern formatting string + + + The pattern formatting string + + + + The ConversionPattern option. This is the string which + controls formatting and consists of a mix of literal content and + conversion specifiers. + + + + + + Wrapper class used to map converter names to converter types + + + + Wrapper class used to map converter names to converter types + + + + + + default constructor + + + + + Gets or sets the name of the conversion pattern + + + The name of the conversion pattern + + + + Gets or sets the name of the conversion pattern + + + + + + Gets or sets the type of the converter + + + The type of the converter + + + + Gets or sets the type of the converter + + + + + + String keyed object map. + + + + While this collection is serializable only member + objects that are serializable will + be serialized along with this collection. + + + Nicko Cadell + Gert Driesen + + + + String keyed object map that is read only. + + + + This collection is readonly and cannot be modified. + + + While this collection is serializable only member + objects that are serializable will + be serialized along with this collection. + + + Nicko Cadell + Gert Driesen + + + + The Hashtable used to store the properties data + + + + + Constructor + + + + Initializes a new instance of the class. + + + + + + Copy Constructor + + properties to copy + + + Initializes a new instance of the class. + + + + + + Deserialization constructor + + The that holds the serialized object data. + The that contains contextual information about the source or destination. + + + Initializes a new instance of the class + with serialized data. + + + + + + Gets the key names. + + An array of all the keys. + + + Gets the key names. + + + + + + Test if the dictionary contains a specified key + + the key to look for + true if the dictionary contains the specified key + + + Test if the dictionary contains a specified key + + + + + + Serializes this object into the provided. + + The to populate with data. + The destination for this serialization. + + + Serializes this object into the provided. + + + + + + See + + + + + See + + + + + + See + + + + + + + Remove all properties from the properties collection + + + + + See + + + + + + + See + + + + + + + See + + + + + Gets or sets the value of the property with the specified key. + + + The value of the property with the specified key. + + The key of the property to get or set. + + + The property value will only be serialized if it is serializable. + If it cannot be serialized it will be silently ignored if + a serialization operation is performed. + + + + + + The hashtable used to store the properties + + + The internal collection used to store the properties + + + + The hashtable used to store the properties + + + + + + See + + + + + See + + + + + See + + + + + See + + + + + See + + + + + See + + + + + The number of properties in this collection + + + + + See + + + + + Constructor + + + + Initializes a new instance of the class. + + + + + + Constructor + + properties to copy + + + Initializes a new instance of the class. + + + + + + Initializes a new instance of the class + with serialized data. + + The that holds the serialized object data. + The that contains contextual information about the source or destination. + + + Because this class is sealed the serialization constructor is private. + + + + + + Remove the entry with the specified key from this dictionary + + the key for the entry to remove + + + Remove the entry with the specified key from this dictionary + + + + + + See + + an enumerator + + + Returns a over the contest of this collection. + + + + + + See + + the key to remove + + + Remove the entry with the specified key from this dictionary + + + + + + See + + the key to lookup in the collection + true if the collection contains the specified key + + + Test if this collection contains a specified key. + + + + + + Remove all properties from the properties collection + + + + Remove all properties from the properties collection + + + + + + See + + the key + the value to store for the key + + + Store a value for the specified . + + + Thrown if the is not a string + + + + See + + + + + + + See + + + + + Gets or sets the value of the property with the specified key. + + + The value of the property with the specified key. + + The key of the property to get or set. + + + The property value will only be serialized if it is serializable. + If it cannot be serialized it will be silently ignored if + a serialization operation is performed. + + + + + + See + + + false + + + + This collection is modifiable. This property always + returns false. + + + + + + See + + + The value for the key specified. + + + + Get or set a value for the specified . + + + Thrown if the is not a string + + + + See + + + + + See + + + + + See + + + + + See + + + + + See + + + + + A that ignores the message + + + + This writer is used in special cases where it is necessary + to protect a writer from being closed by a client. + + + Nicko Cadell + + + + Constructor + + the writer to actually write to + + + Create a new ProtectCloseTextWriter using a writer + + + + + + Attach this instance to a different underlying + + the writer to attach to + + + Attach this instance to a different underlying + + + + + + Does not close the underlying output writer. + + + + Does not close the underlying output writer. + This method does nothing. + + + + + + Defines a lock that supports single writers and multiple readers + + + + ReaderWriterLock is used to synchronize access to a resource. + At any given time, it allows either concurrent read access for + multiple threads, or write access for a single thread. In a + situation where a resource is changed infrequently, a + ReaderWriterLock provides better throughput than a simple + one-at-a-time lock, such as . + + + If a platform does not support a System.Threading.ReaderWriterLock + implementation then all readers and writers are serialized. Therefore + the caller must not rely on multiple simultaneous readers. + + + Nicko Cadell + + + + Constructor + + + + Initializes a new instance of the class. + + + + + + Acquires a reader lock + + + + blocks if a different thread has the writer + lock, or if at least one thread is waiting for the writer lock. + + + + + + Decrements the lock count + + + + decrements the lock count. When the count + reaches zero, the lock is released. + + + + + + Acquires the writer lock + + + + This method blocks if another thread has a reader lock or writer lock. + + + + + + Decrements the lock count on the writer lock + + + + ReleaseWriterLock decrements the writer lock count. + When the count reaches zero, the writer lock is released. + + + + + + A that can be and reused + + + + A that can be and reused. + This uses a single buffer for string operations. + + + Nicko Cadell + + + + Create an instance of + + the format provider to use + + + Create an instance of + + + + + + Override Dispose to prevent closing of writer + + flag + + + Override Dispose to prevent closing of writer + + + + + + Reset this string writer so that it can be reused. + + the maximum buffer capacity before it is trimmed + the default size to make the buffer + + + Reset this string writer so that it can be reused. + The internal buffers are cleared and reset. + + + + + + Utility class for system specific information. + + + + Utility class of static methods for system specific information. + + + Nicko Cadell + Gert Driesen + Alexey Solofnenko + + + + Private constructor to prevent instances. + + + + Only static methods are exposed from this type. + + + + + + Initialize default values for private static fields. + + + + Only static methods are exposed from this type. + + + + + + Gets the assembly location path for the specified assembly. + + The assembly to get the location for. + The location of the assembly. + + + This method does not guarantee to return the correct path + to the assembly. If only tries to give an indication as to + where the assembly was loaded from. + + + + + + Gets the fully qualified name of the , including + the name of the assembly from which the was + loaded. + + The to get the fully qualified name for. + The fully qualified name for the . + + + This is equivalent to the Type.AssemblyQualifiedName property, + but this method works on the .NET Compact Framework 1.0 as well as + the full .NET runtime. + + + + + + Gets the short name of the . + + The to get the name for. + The short name of the . + + + The short name of the assembly is the + without the version, culture, or public key. i.e. it is just the + assembly's file name without the extension. + + + Use this rather than Assembly.GetName().Name because that + is not available on the Compact Framework. + + + Because of a FileIOPermission security demand we cannot do + the obvious Assembly.GetName().Name. We are allowed to get + the of the assembly so we + start from there and strip out just the assembly name. + + + + + + Gets the file name portion of the , including the extension. + + The to get the file name for. + The file name of the assembly. + + + Gets the file name portion of the , including the extension. + + + + + + Loads the type specified in the type string. + + A sibling type to use to load the type. + The name of the type to load. + Flag set to true to throw an exception if the type cannot be loaded. + true to ignore the case of the type name; otherwise, false + The type loaded or null if it could not be loaded. + + + If the type name is fully qualified, i.e. if contains an assembly name in + the type name, the type will be loaded from the system using + . + + + If the type name is not fully qualified, it will be loaded from the assembly + containing the specified relative type. If the type is not found in the assembly + then all the loaded assemblies will be searched for the type. + + + + + + Loads the type specified in the type string. + + The name of the type to load. + Flag set to true to throw an exception if the type cannot be loaded. + true to ignore the case of the type name; otherwise, false + The type loaded or null if it could not be loaded. + + + If the type name is fully qualified, i.e. if contains an assembly name in + the type name, the type will be loaded from the system using + . + + + If the type name is not fully qualified it will be loaded from the + assembly that is directly calling this method. If the type is not found + in the assembly then all the loaded assemblies will be searched for the type. + + + + + + Loads the type specified in the type string. + + An assembly to load the type from. + The name of the type to load. + Flag set to true to throw an exception if the type cannot be loaded. + true to ignore the case of the type name; otherwise, false + The type loaded or null if it could not be loaded. + + + If the type name is fully qualified, i.e. if contains an assembly name in + the type name, the type will be loaded from the system using + . + + + If the type name is not fully qualified it will be loaded from the specified + assembly. If the type is not found in the assembly then all the loaded assemblies + will be searched for the type. + + + + + + Generate a new guid + + A new Guid + + + Generate a new guid + + + + + + Create an + + The name of the parameter that caused the exception + The value of the argument that causes this exception + The message that describes the error + the ArgumentOutOfRangeException object + + + Create a new instance of the class + with a specified error message, the parameter name, and the value + of the argument. + + + The Compact Framework does not support the 3 parameter constructor for the + type. This method provides an + implementation that works for all platforms. + + + + + + Parse a string into an value + + the string to parse + out param where the parsed value is placed + true if the string was able to be parsed into an integer + + + Attempts to parse the string into an integer. If the string cannot + be parsed then this method returns false. The method does not throw an exception. + + + + + + Parse a string into an value + + the string to parse + out param where the parsed value is placed + true if the string was able to be parsed into an integer + + + Attempts to parse the string into an integer. If the string cannot + be parsed then this method returns false. The method does not throw an exception. + + + + + + Lookup an application setting + + the application settings key to lookup + the value for the key, or null + + + Configuration APIs are not supported under the Compact Framework + + + + + + Convert a path into a fully qualified local file path. + + The path to convert. + The fully qualified path. + + + Converts the path specified to a fully + qualified path. If the path is relative it is + taken as relative from the application base + directory. + + + The path specified must be a local file path, a URI is not supported. + + + + + + Creates a new case-insensitive instance of the class with the default initial capacity. + + A new case-insensitive instance of the class with the default initial capacity + + + The new Hashtable instance uses the default load factor, the CaseInsensitiveHashCodeProvider, and the CaseInsensitiveComparer. + + + + + + Gets an empty array of types. + + + + The Type.EmptyTypes field is not available on + the .NET Compact Framework 1.0. + + + + + + Cache the host name for the current machine + + + + + Cache the application friendly name + + + + + Text to output when a null is encountered. + + + + + Text to output when an unsupported feature is requested. + + + + + Start time for the current process. + + + + + Gets the system dependent line terminator. + + + The system dependent line terminator. + + + + Gets the system dependent line terminator. + + + + + + Gets the base directory for this . + + The base directory path for the current . + + + Gets the base directory for this . + + + The value returned may be either a local file path or a URI. + + + + + + Gets the path to the configuration file for the current . + + The path to the configuration file for the current . + + + The .NET Compact Framework 1.0 does not have a concept of a configuration + file. For this runtime, we use the entry assembly location as the root for + the configuration file name. + + + The value returned may be either a local file path or a URI. + + + + + + Gets the path to the file that first executed in the current . + + The path to the entry assembly. + + + Gets the path to the file that first executed in the current . + + + + + + Gets the ID of the current thread. + + The ID of the current thread. + + + On the .NET framework, the AppDomain.GetCurrentThreadId method + is used to obtain the thread ID for the current thread. This is the + operating system ID for the thread. + + + On the .NET Compact Framework 1.0 it is not possible to get the + operating system thread ID for the current thread. The native method + GetCurrentThreadId is implemented inline in a header file + and cannot be called. + + + On the .NET Framework 2.0 the Thread.ManagedThreadId is used as this + gives a stable id unrelated to the operating system thread ID which may + change if the runtime is using fibers. + + + + + + Get the host name or machine name for the current machine + + + The hostname or machine name + + + + Get the host name or machine name for the current machine + + + The host name () or + the machine name (Environment.MachineName) for + the current machine, or if neither of these are available + then NOT AVAILABLE is returned. + + + + + + Get this application's friendly name + + + The friendly name of this application as a string + + + + If available the name of the application is retrieved from + the AppDomain using AppDomain.CurrentDomain.FriendlyName. + + + Otherwise the file name of the entry assembly is used. + + + + + + Get the start time for the current process. + + + + This is the time at which the log4net library was loaded into the + AppDomain. Due to reports of a hang in the call to System.Diagnostics.Process.StartTime + this is not the start time for the current process. + + + The log4net library should be loaded by an application early during its + startup, therefore this start time should be a good approximation for + the actual start time. + + + Note that AppDomains may be loaded and unloaded within the + same process without the process terminating, however this start time + will be set per AppDomain. + + + + + + Text to output when a null is encountered. + + + + Use this value to indicate a null has been encountered while + outputting a string representation of an item. + + + The default value is (null). This value can be overridden by specifying + a value for the log4net.NullText appSetting in the application's + .config file. + + + + + + Text to output when an unsupported feature is requested. + + + + Use this value when an unsupported feature is requested. + + + The default value is NOT AVAILABLE. This value can be overridden by specifying + a value for the log4net.NotAvailableText appSetting in the application's + .config file. + + + + + + Utility class that represents a format string. + + + + Utility class that represents a format string. + + + Nicko Cadell + + + + Initialise the + + An that supplies culture-specific formatting information. + A containing zero or more format items. + An array containing zero or more objects to format. + + + + Format the string and arguments + + the formatted string + + + + Replaces the format item in a specified with the text equivalent + of the value of a corresponding instance in a specified array. + A specified parameter supplies culture-specific formatting information. + + An that supplies culture-specific formatting information. + A containing zero or more format items. + An array containing zero or more objects to format. + + A copy of format in which the format items have been replaced by the + equivalent of the corresponding instances of in args. + + + + This method does not throw exceptions. If an exception thrown while formatting the result the + exception and arguments are returned in the result string. + + + + + + Process an error during StringFormat + + + + + Dump the contents of an array into a string builder + + + + + Dump an object to a string + + + + + Implementation of Properties collection for the + + + + Class implements a collection of properties that is specific to each thread. + The class is not synchronized as each thread has its own . + + + Nicko Cadell + + + + The thread local data slot to use to store a PropertiesDictionary. + + + + + Internal constructor + + + + Initializes a new instance of the class. + + + + + + Remove a property + + the key for the entry to remove + + + Remove a property + + + + + + Clear all properties + + + + Clear all properties + + + + + + Get the PropertiesDictionary for this thread. + + create the dictionary if it does not exist, otherwise return null if is does not exist + the properties for this thread + + + The collection returned is only to be used on the calling thread. If the + caller needs to share the collection between different threads then the + caller must clone the collection before doing so. + + + + + + Gets or sets the value of a property + + + The value for the property with the specified key + + + + Gets or sets the value of a property + + + + + + Implementation of Stack for the + + + + Implementation of Stack for the + + + Nicko Cadell + + + + The stack store. + + + + + Internal constructor + + + + Initializes a new instance of the class. + + + + + + Clears all the contextual information held in this stack. + + + + Clears all the contextual information held in this stack. + Only call this if you think that this tread is being reused after + a previous call execution which may not have completed correctly. + You do not need to use this method if you always guarantee to call + the method of the + returned from even in exceptional circumstances, + for example by using the using(log4net.ThreadContext.Stacks["NDC"].Push("Stack_Message")) + syntax. + + + + + + Removes the top context from this stack. + + The message in the context that was removed from the top of this stack. + + + Remove the top context from this stack, and return + it to the caller. If this stack is empty then an + empty string (not ) is returned. + + + + + + Pushes a new context message into this stack. + + The new context message. + + An that can be used to clean up the context stack. + + + + Pushes a new context onto this stack. An + is returned that can be used to clean up this stack. This + can be easily combined with the using keyword to scope the + context. + + + Simple example of using the Push method with the using keyword. + + using(log4net.ThreadContext.Stacks["NDC"].Push("Stack_Message")) + { + log.Warn("This should have an ThreadContext Stack message"); + } + + + + + + Gets the current context information for this stack. + + The current context information. + + + + Gets the current context information for this stack. + + Gets the current context information + + + Gets the current context information for this stack. + + + + + + Get a portable version of this object + + the portable instance of this object + + + Get a cross thread portable version of this object + + + + + + The number of messages in the stack + + + The current number of messages in the stack + + + + The current number of messages in the stack. That is + the number of times has been called + minus the number of times has been called. + + + + + + Gets and sets the internal stack used by this + + The internal storage stack + + + This property is provided only to support backward compatability + of the . Tytpically the internal stack should not + be modified. + + + + + + Inner class used to represent a single context frame in the stack. + + + + Inner class used to represent a single context frame in the stack. + + + + + + Constructor + + The message for this context. + The parent context in the chain. + + + Initializes a new instance of the class + with the specified message and parent context. + + + + + + Get the message. + + The message. + + + Get the message. + + + + + + Gets the full text of the context down to the root level. + + + The full text of the context down to the root level. + + + + Gets the full text of the context down to the root level. + + + + + + Struct returned from the method. + + + + This struct implements the and is designed to be used + with the pattern to remove the stack frame at the end of the scope. + + + + + + The ThreadContextStack internal stack + + + + + The depth to trim the stack to when this instance is disposed + + + + + Constructor + + The internal stack used by the ThreadContextStack. + The depth to return the stack to when this object is disposed. + + + Initializes a new instance of the class with + the specified stack and return depth. + + + + + + Returns the stack to the correct depth. + + + + Returns the stack to the correct depth. + + + + + + Implementation of Stacks collection for the + + + + Implementation of Stacks collection for the + + + Nicko Cadell + + + + Internal constructor + + + + Initializes a new instance of the class. + + + + + + Gets the named thread context stack + + + The named stack + + + + Gets the named thread context stack + + + + + + Utility class for transforming strings. + + + + Utility class for transforming strings. + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + + Uses a private access modifier to prevent instantiation of this class. + + + + + + Write a string to an + + the writer to write to + the string to write + The string to replace non XML compliant chars with + + + The test is escaped either using XML escape entities + or using CDATA sections. + + + + + + Replace invalid XML characters in text string + + the XML text input string + the string to use in place of invalid characters + A string that does not contain invalid XML characters. + + + Certain Unicode code points are not allowed in the XML InfoSet, for + details see: http://www.w3.org/TR/REC-xml/#charsets. + + + This method replaces any illegal characters in the input string + with the mask string specified. + + + + + + Count the number of times that the substring occurs in the text + + the text to search + the substring to find + the number of times the substring occurs in the text + + + The substring is assumed to be non repeating within itself. + + + + + + Impersonate a Windows Account + + + + This impersonates a Windows account. + + + How the impersonation is done depends on the value of . + This allows the context to either impersonate a set of user credentials specified + using username, domain name and password or to revert to the process credentials. + + + + + + Default constructor + + + + Default constructor + + + + + + Initialize the SecurityContext based on the options set. + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + The security context will try to Logon the specified user account and + capture a primary token for impersonation. + + + The required , + or properties were not specified. + + + + Impersonate the Windows account specified by the and properties. + + caller provided state + + An instance that will revoke the impersonation of this SecurityContext + + + + Depending on the property either + impersonate a user using credentials supplied or revert + to the process credentials. + + + + + + Create a given the userName, domainName and password. + + the user name + the domain name + the password + the for the account specified + + + Uses the Windows API call LogonUser to get a principal token for the account. This + token is used to initialize the WindowsIdentity. + + + + + + Gets or sets the impersonation mode for this security context + + + The impersonation mode for this security context + + + + Impersonate either a user with user credentials or + revert this thread to the credentials of the process. + The value is one of the + enum. + + + The default value is + + + When the mode is set to + the user's credentials are established using the + , and + values. + + + When the mode is set to + no other properties need to be set. If the calling thread is + impersonating then it will be reverted back to the process credentials. + + + + + + Gets or sets the Windows username for this security context + + + The Windows username for this security context + + + + This property must be set if + is set to (the default setting). + + + + + + Gets or sets the Windows domain name for this security context + + + The Windows domain name for this security context + + + + The default value for is the local machine name + taken from the property. + + + This property must be set if + is set to (the default setting). + + + + + + Sets the password for the Windows account specified by the and properties. + + + The password for the Windows account specified by the and properties. + + + + This property must be set if + is set to (the default setting). + + + + + + The impersonation modes for the + + + + See the property for + details. + + + + + + Impersonate a user using the credentials supplied + + + + + Revert this the thread to the credentials of the process + + + + + Adds to + + + + Helper class to expose the + through the interface. + + + + + + Constructor + + the impersonation context being wrapped + + + Constructor + + + + + + Revert the impersonation + + + + Revert the impersonation + + + + + + The log4net Global Context. + + + + The GlobalContext provides a location for global debugging + information to be stored. + + + The global context has a properties map and these properties can + be included in the output of log messages. The + supports selecting and outputing these properties. + + + By default the log4net:HostName property is set to the name of + the current machine. + + + + + GlobalContext.Properties["hostname"] = Environment.MachineName; + + + + Nicko Cadell + + + + Private Constructor. + + + Uses a private access modifier to prevent instantiation of this class. + + + + + The global context properties instance + + + + + The global properties map. + + + The global properties map. + + + + The global properties map. + + + + + + The log4net Logical Thread Context. + + + + The LogicalThreadContext provides a location for specific debugging + information to be stored. + The LogicalThreadContext properties override any or + properties with the same name. + + + The Logical Thread Context has a properties map and a stack. + The properties and stack can + be included in the output of log messages. The + supports selecting and outputting these properties. + + + The Logical Thread Context provides a diagnostic context for the current call context. + This is an instrument for distinguishing interleaved log + output from different sources. Log output is typically interleaved + when a server handles multiple clients near-simultaneously. + + + The Logical Thread Context is managed on a per basis. + + + Example of using the thread context properties to store a username. + + LogicalThreadContext.Properties["user"] = userName; + log.Info("This log message has a LogicalThreadContext Property called 'user'"); + + + Example of how to push a message into the context stack + + using(LogicalThreadContext.Stacks["LDC"].Push("my context message")) + { + log.Info("This log message has a LogicalThreadContext Stack message that includes 'my context message'"); + + } // at the end of the using block the message is automatically popped + + + + Nicko Cadell + + + + Private Constructor. + + + + Uses a private access modifier to prevent instantiation of this class. + + + + + + The thread context properties instance + + + + + The thread context stacks instance + + + + + The thread properties map + + + The thread properties map + + + + The LogicalThreadContext properties override any + or properties with the same name. + + + + + + The thread stacks + + + stack map + + + + The logical thread stacks. + + + + + + This class is used by client applications to request logger instances. + + + + This class has static methods that are used by a client to request + a logger instance. The method is + used to retrieve a logger. + + + See the interface for more details. + + + Simple example of logging messages + + ILog log = LogManager.GetLogger("application-log"); + + log.Info("Application Start"); + log.Debug("This is a debug message"); + + if (log.IsDebugEnabled) + { + log.Debug("This is another debug message"); + } + + + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + Uses a private access modifier to prevent instantiation of this class. + + + + Returns the named logger if it exists. + + Returns the named logger if it exists. + + + + If the named logger exists (in the default repository) then it + returns a reference to the logger, otherwise it returns null. + + + The fully qualified logger name to look for. + The logger found, or null if no logger could be found. + + + + Returns the named logger if it exists. + + + + If the named logger exists (in the specified repository) then it + returns a reference to the logger, otherwise it returns + null. + + + The repository to lookup in. + The fully qualified logger name to look for. + + The logger found, or null if the logger doesn't exist in the specified + repository. + + + + + Returns the named logger if it exists. + + + + If the named logger exists (in the repository for the specified assembly) then it + returns a reference to the logger, otherwise it returns + null. + + + The assembly to use to lookup the repository. + The fully qualified logger name to look for. + + The logger, or null if the logger doesn't exist in the specified + assembly's repository. + + + + Get the currently defined loggers. + + Returns all the currently defined loggers in the default repository. + + + The root logger is not included in the returned array. + + All the defined loggers. + + + + Returns all the currently defined loggers in the specified repository. + + The repository to lookup in. + + The root logger is not included in the returned array. + + All the defined loggers. + + + + Returns all the currently defined loggers in the specified assembly's repository. + + The assembly to use to lookup the repository. + + The root logger is not included in the returned array. + + All the defined loggers. + + + Get or create a logger. + + Retrieves or creates a named logger. + + + + Retrieves a logger named as the + parameter. If the named logger already exists, then the + existing instance will be returned. Otherwise, a new instance is + created. + + By default, loggers do not have a set level but inherit + it from the hierarchy. This is one of the central features of + log4net. + + + The name of the logger to retrieve. + The logger with the name specified. + + + + Retrieves or creates a named logger. + + + + Retrieve a logger named as the + parameter. If the named logger already exists, then the + existing instance will be returned. Otherwise, a new instance is + created. + + + By default, loggers do not have a set level but inherit + it from the hierarchy. This is one of the central features of + log4net. + + + The repository to lookup in. + The name of the logger to retrieve. + The logger with the name specified. + + + + Retrieves or creates a named logger. + + + + Retrieve a logger named as the + parameter. If the named logger already exists, then the + existing instance will be returned. Otherwise, a new instance is + created. + + + By default, loggers do not have a set level but inherit + it from the hierarchy. This is one of the central features of + log4net. + + + The assembly to use to lookup the repository. + The name of the logger to retrieve. + The logger with the name specified. + + + + Shorthand for . + + + Get the logger for the fully qualified name of the type specified. + + The full name of will be used as the name of the logger to retrieve. + The logger with the name specified. + + + + Shorthand for . + + + Gets the logger for the fully qualified name of the type specified. + + The repository to lookup in. + The full name of will be used as the name of the logger to retrieve. + The logger with the name specified. + + + + Shorthand for . + + + Gets the logger for the fully qualified name of the type specified. + + The assembly to use to lookup the repository. + The full name of will be used as the name of the logger to retrieve. + The logger with the name specified. + + + + Shuts down the log4net system. + + + + Calling this method will safely close and remove all + appenders in all the loggers including root contained in all the + default repositories. + + + Some appenders need to be closed before the application exists. + Otherwise, pending logging events might be lost. + + The shutdown method is careful to close nested + appenders before closing regular appenders. This is allows + configurations where a regular appender is attached to a logger + and again to a nested appender. + + + + + Shutdown a logger repository. + + Shuts down the default repository. + + + + Calling this method will safely close and remove all + appenders in all the loggers including root contained in the + default repository. + + Some appenders need to be closed before the application exists. + Otherwise, pending logging events might be lost. + + The shutdown method is careful to close nested + appenders before closing regular appenders. This is allows + configurations where a regular appender is attached to a logger + and again to a nested appender. + + + + + + Shuts down the repository for the repository specified. + + + + Calling this method will safely close and remove all + appenders in all the loggers including root contained in the + specified. + + + Some appenders need to be closed before the application exists. + Otherwise, pending logging events might be lost. + + The shutdown method is careful to close nested + appenders before closing regular appenders. This is allows + configurations where a regular appender is attached to a logger + and again to a nested appender. + + + The repository to shutdown. + + + + Shuts down the repository specified. + + + + Calling this method will safely close and remove all + appenders in all the loggers including root contained in the + repository. The repository is looked up using + the specified. + + + Some appenders need to be closed before the application exists. + Otherwise, pending logging events might be lost. + + + The shutdown method is careful to close nested + appenders before closing regular appenders. This is allows + configurations where a regular appender is attached to a logger + and again to a nested appender. + + + The assembly to use to lookup the repository. + + + Reset the configuration of a repository + + Resets all values contained in this repository instance to their defaults. + + + + Resets all values contained in the repository instance to their + defaults. This removes all appenders from all loggers, sets + the level of all non-root loggers to null, + sets their additivity flag to true and sets the level + of the root logger to . Moreover, + message disabling is set to its default "off" value. + + + + + + Resets all values contained in this repository instance to their defaults. + + + + Reset all values contained in the repository instance to their + defaults. This removes all appenders from all loggers, sets + the level of all non-root loggers to null, + sets their additivity flag to true and sets the level + of the root logger to . Moreover, + message disabling is set to its default "off" value. + + + The repository to reset. + + + + Resets all values contained in this repository instance to their defaults. + + + + Reset all values contained in the repository instance to their + defaults. This removes all appenders from all loggers, sets + the level of all non-root loggers to null, + sets their additivity flag to true and sets the level + of the root logger to . Moreover, + message disabling is set to its default "off" value. + + + The assembly to use to lookup the repository to reset. + + + Get the logger repository. + + Returns the default instance. + + + + Gets the for the repository specified + by the callers assembly (). + + + The instance for the default repository. + + + + Returns the default instance. + + The default instance. + + + Gets the for the repository specified + by the argument. + + + The repository to lookup in. + + + + Returns the default instance. + + The default instance. + + + Gets the for the repository specified + by the argument. + + + The assembly to use to lookup the repository. + + + Get a logger repository. + + Returns the default instance. + + + + Gets the for the repository specified + by the callers assembly (). + + + The instance for the default repository. + + + + Returns the default instance. + + The default instance. + + + Gets the for the repository specified + by the argument. + + + The repository to lookup in. + + + + Returns the default instance. + + The default instance. + + + Gets the for the repository specified + by the argument. + + + The assembly to use to lookup the repository. + + + Create a domain + + Creates a repository with the specified repository type. + + + + CreateDomain is obsolete. Use CreateRepository instead of CreateDomain. + + + The created will be associated with the repository + specified such that a call to will return + the same repository instance. + + + A that implements + and has a no arg constructor. An instance of this type will be created to act + as the for the repository specified. + The created for the repository. + + + Create a logger repository. + + Creates a repository with the specified repository type. + + A that implements + and has a no arg constructor. An instance of this type will be created to act + as the for the repository specified. + The created for the repository. + + + The created will be associated with the repository + specified such that a call to will return + the same repository instance. + + + + + + Creates a repository with the specified name. + + + + CreateDomain is obsolete. Use CreateRepository instead of CreateDomain. + + + Creates the default type of which is a + object. + + + The name must be unique. Repositories cannot be redefined. + An will be thrown if the repository already exists. + + + The name of the repository, this must be unique amongst repositories. + The created for the repository. + The specified repository already exists. + + + + Creates a repository with the specified name. + + + + Creates the default type of which is a + object. + + + The name must be unique. Repositories cannot be redefined. + An will be thrown if the repository already exists. + + + The name of the repository, this must be unique amongst repositories. + The created for the repository. + The specified repository already exists. + + + + Creates a repository with the specified name and repository type. + + + + CreateDomain is obsolete. Use CreateRepository instead of CreateDomain. + + + The name must be unique. Repositories cannot be redefined. + An will be thrown if the repository already exists. + + + The name of the repository, this must be unique to the repository. + A that implements + and has a no arg constructor. An instance of this type will be created to act + as the for the repository specified. + The created for the repository. + The specified repository already exists. + + + + Creates a repository with the specified name and repository type. + + + + The name must be unique. Repositories cannot be redefined. + An will be thrown if the repository already exists. + + + The name of the repository, this must be unique to the repository. + A that implements + and has a no arg constructor. An instance of this type will be created to act + as the for the repository specified. + The created for the repository. + The specified repository already exists. + + + + Creates a repository for the specified assembly and repository type. + + + + CreateDomain is obsolete. Use CreateRepository instead of CreateDomain. + + + The created will be associated with the repository + specified such that a call to with the + same assembly specified will return the same repository instance. + + + The assembly to use to get the name of the repository. + A that implements + and has a no arg constructor. An instance of this type will be created to act + as the for the repository specified. + The created for the repository. + + + + Creates a repository for the specified assembly and repository type. + + + + The created will be associated with the repository + specified such that a call to with the + same assembly specified will return the same repository instance. + + + The assembly to use to get the name of the repository. + A that implements + and has a no arg constructor. An instance of this type will be created to act + as the for the repository specified. + The created for the repository. + + + + Gets the list of currently defined repositories. + + + + Get an array of all the objects that have been created. + + + An array of all the known objects. + + + + Looks up the wrapper object for the logger specified. + + The logger to get the wrapper for. + The wrapper for the logger specified. + + + + Looks up the wrapper objects for the loggers specified. + + The loggers to get the wrappers for. + The wrapper objects for the loggers specified. + + + + Create the objects used by + this manager. + + The logger to wrap. + The wrapper for the logger specified. + + + + The wrapper map to use to hold the objects. + + + + + Implementation of Mapped Diagnostic Contexts. + + + + + The MDC is deprecated and has been replaced by the . + The current MDC implementation forwards to the ThreadContext.Properties. + + + + The MDC class is similar to the class except that it is + based on a map instead of a stack. It provides mapped + diagnostic contexts. A Mapped Diagnostic Context, or + MDC in short, is an instrument for distinguishing interleaved log + output from different sources. Log output is typically interleaved + when a server handles multiple clients near-simultaneously. + + + The MDC is managed on a per thread basis. + + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + Uses a private access modifier to prevent instantiation of this class. + + + + + Gets the context value identified by the parameter. + + The key to lookup in the MDC. + The string value held for the key, or a null reference if no corresponding value is found. + + + + The MDC is deprecated and has been replaced by the . + The current MDC implementation forwards to the ThreadContext.Properties. + + + + If the parameter does not look up to a + previously defined context then null will be returned. + + + + + + Add an entry to the MDC + + The key to store the value under. + The value to store. + + + + The MDC is deprecated and has been replaced by the . + The current MDC implementation forwards to the ThreadContext.Properties. + + + + Puts a context value (the parameter) as identified + with the parameter into the current thread's + context map. + + + If a value is already defined for the + specified then the value will be replaced. If the + is specified as null then the key value mapping will be removed. + + + + + + Removes the key value mapping for the key specified. + + The key to remove. + + + + The MDC is deprecated and has been replaced by the . + The current MDC implementation forwards to the ThreadContext.Properties. + + + + Remove the specified entry from this thread's MDC + + + + + + Clear all entries in the MDC + + + + + The MDC is deprecated and has been replaced by the . + The current MDC implementation forwards to the ThreadContext.Properties. + + + + Remove all the entries from this thread's MDC + + + + + + Implementation of Nested Diagnostic Contexts. + + + + + The NDC is deprecated and has been replaced by the . + The current NDC implementation forwards to the ThreadContext.Stacks["NDC"]. + + + + A Nested Diagnostic Context, or NDC in short, is an instrument + to distinguish interleaved log output from different sources. Log + output is typically interleaved when a server handles multiple + clients near-simultaneously. + + + Interleaved log output can still be meaningful if each log entry + from different contexts had a distinctive stamp. This is where NDCs + come into play. + + + Note that NDCs are managed on a per thread basis. The NDC class + is made up of static methods that operate on the context of the + calling thread. + + + How to push a message into the context + + using(NDC.Push("my context message")) + { + ... all log calls will have 'my context message' included ... + + } // at the end of the using block the message is automatically removed + + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + Uses a private access modifier to prevent instantiation of this class. + + + + + Clears all the contextual information held on the current thread. + + + + + The NDC is deprecated and has been replaced by the . + The current NDC implementation forwards to the ThreadContext.Stacks["NDC"]. + + + + Clears the stack of NDC data held on the current thread. + + + + + + Creates a clone of the stack of context information. + + A clone of the context info for this thread. + + + + The NDC is deprecated and has been replaced by the . + The current NDC implementation forwards to the ThreadContext.Stacks["NDC"]. + + + + The results of this method can be passed to the + method to allow child threads to inherit the context of their + parent thread. + + + + + + Inherits the contextual information from another thread. + + The context stack to inherit. + + + + The NDC is deprecated and has been replaced by the . + The current NDC implementation forwards to the ThreadContext.Stacks["NDC"]. + + + + This thread will use the context information from the stack + supplied. This can be used to initialize child threads with + the same contextual information as their parent threads. These + contexts will NOT be shared. Any further contexts that + are pushed onto the stack will not be visible to the other. + Call to obtain a stack to pass to + this method. + + + + + + Removes the top context from the stack. + + + The message in the context that was removed from the top + of the stack. + + + + + The NDC is deprecated and has been replaced by the . + The current NDC implementation forwards to the ThreadContext.Stacks["NDC"]. + + + + Remove the top context from the stack, and return + it to the caller. If the stack is empty then an + empty string (not null) is returned. + + + + + + Pushes a new context message. + + The new context message. + + An that can be used to clean up + the context stack. + + + + + The NDC is deprecated and has been replaced by the . + The current NDC implementation forwards to the ThreadContext.Stacks["NDC"]. + + + + Pushes a new context onto the context stack. An + is returned that can be used to clean up the context stack. This + can be easily combined with the using keyword to scope the + context. + + + Simple example of using the Push method with the using keyword. + + using(log4net.NDC.Push("NDC_Message")) + { + log.Warn("This should have an NDC message"); + } + + + + + + Removes the context information for this thread. It is + not required to call this method. + + + + + The NDC is deprecated and has been replaced by the . + The current NDC implementation forwards to the ThreadContext.Stacks["NDC"]. + + + + This method is not implemented. + + + + + + Forces the stack depth to be at most . + + The maximum depth of the stack + + + + The NDC is deprecated and has been replaced by the . + The current NDC implementation forwards to the ThreadContext.Stacks["NDC"]. + + + + Forces the stack depth to be at most . + This may truncate the head of the stack. This only affects the + stack in the current thread. Also it does not prevent it from + growing, it only sets the maximum depth at the time of the + call. This can be used to return to a known context depth. + + + + + + Gets the current context depth. + + The current context depth. + + + + The NDC is deprecated and has been replaced by the . + The current NDC implementation forwards to the ThreadContext.Stacks["NDC"]. + + + + The number of context values pushed onto the context stack. + + + Used to record the current depth of the context. This can then + be restored using the method. + + + + + + + The log4net Thread Context. + + + + The ThreadContext provides a location for thread specific debugging + information to be stored. + The ThreadContext properties override any + properties with the same name. + + + The thread context has a properties map and a stack. + The properties and stack can + be included in the output of log messages. The + supports selecting and outputting these properties. + + + The Thread Context provides a diagnostic context for the current thread. + This is an instrument for distinguishing interleaved log + output from different sources. Log output is typically interleaved + when a server handles multiple clients near-simultaneously. + + + The Thread Context is managed on a per thread basis. + + + Example of using the thread context properties to store a username. + + ThreadContext.Properties["user"] = userName; + log.Info("This log message has a ThreadContext Property called 'user'"); + + + Example of how to push a message into the context stack + + using(ThreadContext.Stacks["NDC"].Push("my context message")) + { + log.Info("This log message has a ThreadContext Stack message that includes 'my context message'"); + + } // at the end of the using block the message is automatically popped + + + + Nicko Cadell + + + + Private Constructor. + + + + Uses a private access modifier to prevent instantiation of this class. + + + + + + The thread context properties instance + + + + + The thread context stacks instance + + + + + The thread properties map + + + The thread properties map + + + + The ThreadContext properties override any + properties with the same name. + + + + + + The thread stacks + + + stack map + + + + The thread local stacks. + + + + + diff --git a/README.md b/README.md new file mode 100644 index 0000000..3c544ee --- /dev/null +++ b/README.md @@ -0,0 +1,22 @@ +# SERemoteControl + +## 介绍 +梅特勒pH 调试工具 + +## 功能 +- Attach +- Detach +- GetStatus +- getListOfMethods +- getListOfSensors +- getListOfModules +- startMethod +- terminateMethod +- getSettings + + + + + + + diff --git a/SEClient/Commands.cs b/SEClient/Commands.cs new file mode 100644 index 0000000..2840f8e --- /dev/null +++ b/SEClient/Commands.cs @@ -0,0 +1,711 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Net; +using System.Net.Sockets; +using System.Reflection; +using System.Text; +using System.Threading; +using System.Threading.Tasks; +using System.Xml; +using System.Xml.Linq; +using System.Xml.Serialization; +using log4net; + +namespace SERemoteConnection +{ + + public class CommandSimpleRequest : AbstractCommand + { + public MT.pHLab.SE.V1.Response_SimpleResultRecord m_record; + string m_simpleRequest; + + public CommandSimpleRequest(string simpleRequest) + { + m_simpleRequest = simpleRequest; + } + + public override bool Submit(SEConnection connection) + { + MT.pHLab.SE.V1.SESimpleRequest request = new MT.pHLab.SE.V1.SESimpleRequest(GetRequestId(), m_simpleRequest); + connection.Write(request.CreateTelegram()); + + return true; + } + + public override bool OnResponse(XmlReader reader) + { + bool success = false; + + MT.pHLab.SE.V1.SEResponse response = MT.pHLab.SE.V1.SEResponse.CreateFromXml(reader); + + if (response.GetRecordType() == typeof(MT.pHLab.SE.V1.Response_SimpleResultRecord)) + { + m_record = new MT.pHLab.SE.V1.Response_SimpleResultRecord(); + m_record.ReadXml(reader); + + success = true; + + } + + setResponse(); + + return success; + } + } + + public class CommandGetState : AbstractCommand + { + public MT.pHLab.SE.V1.Response_StatusRecord m_record; + + public CommandGetState() + { + + } + + public override bool Submit(SEConnection connection) + { + MT.pHLab.SE.V1.SESimpleRequest request = new MT.pHLab.SE.V1.SESimpleRequest(GetRequestId(), "connection.getStatus"); + connection.Write(request.CreateTelegram()); + + return true; + } + + public override bool OnResponse(XmlReader reader) + { + bool success = false; + + MT.pHLab.SE.V1.SEResponse response = MT.pHLab.SE.V1.SEResponse.CreateFromXml(reader); + + if (response.GetRecordType() == typeof(MT.pHLab.SE.V1.Response_StatusRecord)) + { + m_record = (MT.pHLab.SE.V1.Response_StatusRecord)response.CreateInstance(); + + success = true; + } + + setResponse(); + + return success; + } + } + + public class CommandGetListOfModules : AbstractCommand + { + public MT.pHLab.SE.V1.moduleConfigParamRecord[] m_list; + + public CommandGetListOfModules() + { + + } + + public override bool Submit(SEConnection connection) + { + MT.pHLab.SE.V1.SESimpleRequest request = new MT.pHLab.SE.V1.SESimpleRequest(GetRequestId(), "module.get"); + connection.Write(request.CreateTelegram()); + return true; + } + + public override bool OnResponse(XmlReader reader) + { + bool success = false; + + MT.pHLab.SE.V1.SEResponse response = MT.pHLab.SE.V1.SEResponse.CreateFromXml(reader); + + if (response.GetRecordType() == typeof(MT.pHLab.SE.V1.Response_moduleGetRecord)) + { + MT.pHLab.SE.V1.Response_moduleGetRecord record = new MT.pHLab.SE.V1.Response_moduleGetRecord(); + record.ReadXml(reader); + m_list = record.m_moduleConfigs; + success = true; + } + + setResponse(); + + return success; + } + } + + public class CommandSetModule : AbstractCommand + { + + /* + + + + + + A + MTPHSensor + + + + + */ + public MT.pHLab.SE.V1.Request_moduleSetRecord m_request; + public MT.pHLab.SE.V1.Response_SimpleResultRecord m_response; + + public CommandSetModule() + { + m_request = new MT.pHLab.SE.V1.Request_moduleSetRecord(); + } + + public override bool Submit(SEConnection connection) + { + MT.pHLab.SE.V1.SEParamRequest request = new MT.pHLab.SE.V1.SEParamRequest(GetRequestId()); + var record = m_request; + connection.Write(request.CreateTelegram(record)); + return true; + } + + public override bool OnResponse(XmlReader reader) + { + bool success = false; + + MT.pHLab.SE.V1.SEResponse response = MT.pHLab.SE.V1.SEResponse.CreateFromXml(reader); + + if (response.GetRecordType() == typeof(MT.pHLab.SE.V1.Response_SimpleResultRecord)) + { + m_response = new MT.pHLab.SE.V1.Response_SimpleResultRecord(); + m_response.ReadXml(reader); + + success = m_response.m_bSuccess; + + setResponse(); + } + + return success; + } + } + + public class CommandTerminateMethod : AbstractCommand + { + public MT.pHLab.SE.V1.Request_terminateMethodRecord m_request; + public MT.pHLab.SE.V1.Response_SimpleResultRecord m_response; + + public short JobId { set; get; } + + public CommandTerminateMethod() + { + m_request = new MT.pHLab.SE.V1.Request_terminateMethodRecord(); + } + + public override bool Submit(SEConnection connection) + { + MT.pHLab.SE.V1.SEParamRequest request = new MT.pHLab.SE.V1.SEParamRequest(GetRequestId()); + m_request.m_jobId = JobId; + var record = m_request; + connection.Write(request.CreateTelegram(record)); + return true; + } + + public override bool OnResponse(XmlReader reader) + { + bool success = false; + + MT.pHLab.SE.V1.SEResponse response = MT.pHLab.SE.V1.SEResponse.CreateFromXml(reader); + + if (response.GetRecordType() == typeof(MT.pHLab.SE.V1.Response_SimpleResultRecord)) + { + m_response = new MT.pHLab.SE.V1.Response_SimpleResultRecord(); + m_response.ReadXml(reader); + + success = m_response.m_bSuccess; + + setResponse(); + } + + return success; + } + } + + public class CommandGetListOfMethods : AbstractCommand + { + public string[] m_list; + + public CommandGetListOfMethods() + { + + } + + public override bool Submit(SEConnection connection) + { + MT.pHLab.SE.V1.SEParamRequest request = new MT.pHLab.SE.V1.SEParamRequest(GetRequestId()); + var record = new MT.pHLab.SE.V1.Request_setupGetItemListRecord(); + record.m_itemType = "Methods"; + connection.Write(request.CreateTelegram(record)); + return true; + } + + public override bool OnResponse(XmlReader reader) + { + bool success = false; + + MT.pHLab.SE.V1.SEResponse response = MT.pHLab.SE.V1.SEResponse.CreateFromXml(reader); + + if (response.GetRecordType() == typeof(MT.pHLab.SE.V1.Response_setupGetItemListRecord)) + { + var record = new MT.pHLab.SE.V1.Response_setupGetItemListRecord(); + record.ReadXml(reader); + m_list = record.m_itemList; + } + + setResponse(); + + return success; + } + } + + public class CommandGetListOfSensors : AbstractCommand + { + public string[] m_list; + + public CommandGetListOfSensors() + { + + } + + public override bool Submit(SEConnection connection) + { + MT.pHLab.SE.V1.SEParamRequest request = new MT.pHLab.SE.V1.SEParamRequest(GetRequestId()); + var record = new MT.pHLab.SE.V1.Request_setupGetItemListRecord(); + record.m_itemType = "Sensors"; + connection.Write(request.CreateTelegram(record)); + return true; + } + + public override bool OnResponse(XmlReader reader) + { + bool success = false; + + MT.pHLab.SE.V1.SEResponse response = MT.pHLab.SE.V1.SEResponse.CreateFromXml(reader); + + if (response.GetRecordType() == typeof(MT.pHLab.SE.V1.Response_setupGetItemListRecord)) + { + var record = new MT.pHLab.SE.V1.Response_setupGetItemListRecord(); + record.ReadXml(reader); + m_list = record.m_itemList; + } + + setResponse(); + + return success; + } + } + + public class CommandStartMethod : AbstractCommand + { + public string MethodId { set; get; } + public string SampleId { set; get; } + public string Comment { set; get; } + + public bool success = false; + public short m_JobId; + + public CommandStartMethod() + { + + } + + public override bool Submit(SEConnection connection) + { + MT.pHLab.SE.V1.SEParamRequest request = new MT.pHLab.SE.V1.SEParamRequest(GetRequestId()); + var record = new MT.pHLab.SE.V1.Request_methodParamsRecord(); + record.m_methodId = MethodId; + record.m_sampleId = SampleId; + record.m_comment = Comment; + connection.Write(request.CreateTelegram(record)); + return true; + } + + public override bool OnResponse(XmlReader reader) + { + + MT.pHLab.SE.V1.SEResponse response = MT.pHLab.SE.V1.SEResponse.CreateFromXml(reader); + + if (response.GetRecordType() == typeof(MT.pHLab.SE.V1.Response_startMethodRecord)) + { + var record = new MT.pHLab.SE.V1.Response_startMethodRecord(); + record.ReadXml(reader); + success = record.m_methodId == MethodId; + m_JobId = record.m_jobId; + } else + if (response.GetRecordType() == typeof(MT.pHLab.SE.V1.Response_SimpleResultRecord)) + { + var record = new MT.pHLab.SE.V1.Response_SimpleResultRecord(); + record.ReadXml(reader); + + success = record.m_bSuccess; + } + + setResponse(); + + return success; + } + } + + public enum EItemType + { + Sensors, + Tables, + Users, + BufStd, + Methods + }; + + /// + /// Modified XML writer that writes (almost) no namespaces out with pretty formatting + /// + /// + public class XmlNoNamespaceWriter : XmlTextWriter + { + private bool _SkipAttribute = false; + //private int _EncounteredNamespaceCount = 0; + + public XmlNoNamespaceWriter( TextWriter writer) + : base(writer) + { + this.Formatting = System.Xml.Formatting.Indented; + } + + public override void WriteStartDocument() + { + // Do nothing (omit the declaration) + } + + public override void WriteStartElement(string prefix, string localName, string ns) + { + base.WriteStartElement(null, localName, null); + } + + public override void WriteStartAttribute(string prefix, string localName, string ns) + { + //If the prefix or localname are "xmlns", don't write it. + //HOWEVER... if the 1st element (root?) has a namespace we will write it. + if ((prefix.CompareTo("xmlns") == 0 || + localName.CompareTo("xmlns") == 0)) + { + _SkipAttribute = true; + } + else + { + base.WriteStartAttribute(null, localName, null); + } + } + + public override void WriteString(string text) + { + //If we are writing an attribute, the text for the xmlns + //or xmlns:prefix declaration would occur here. Skip + //it if this is the case. + if (!_SkipAttribute) + { + base.WriteString(text); + } + } + + public override void WriteEndAttribute() + { + //If we skipped the WriteStartAttribute call, we have to + //skip the WriteEndAttribute call as well or else the XmlWriter + //will have an invalid state. + if (!_SkipAttribute) + { + base.WriteEndAttribute(); + } + //reset the boolean for the next attribute. + _SkipAttribute = false; + } + + public override void WriteQualifiedName(string localName, string ns) + { + //Always write the qualified name using only the + //localname. + base.WriteQualifiedName(localName, null); + } + } + + public class CommandExportTable : AbstractCommand + { + + public bool success = false; + protected EItemType m_eItemType; + MT.pHLab.SE.V1.Response_SimpleResultRecord m_response; + public byte[] Table { set; get; } + + public CommandExportTable(EItemType eItemType) + { + m_eItemType = eItemType; + } + + public override bool Submit(SEConnection connection) + { + MT.pHLab.SE.V1.SEParamRequest request = new MT.pHLab.SE.V1.SEParamRequest(GetRequestId()); + var record = new MT.pHLab.SE.V1.Request_setupExportRecord(); + record.m_itemGroup = m_eItemType.ToString(); + record.m_itemName = ""; + connection.Write(request.CreateTelegram(record)); + return true; + } + + public override bool OnResponse(XmlReader reader) + { + reader.Read(); + if (reader.Name.Equals("pdk-db") && (reader.NodeType == XmlNodeType.Element)) + { + XmlReader _reader = reader.ReadSubtree(); + XmlDocument doc = new XmlDocument(); + doc.Load(_reader); + + StringWriter textWriter = new StringWriter(); + using (var xmlWriter = new XmlNoNamespaceWriter(textWriter)) + { + doc.Save(xmlWriter); + Console.WriteLine(textWriter.ToString() ); + Table = System.Text.Encoding.UTF8.GetBytes(textWriter.ToString()); + } + success = true; + } + else + if (reader.Name.Equals("record") && (reader.NodeType == XmlNodeType.Element)) + { + MT.pHLab.SE.V1.SEResponse response = MT.pHLab.SE.V1.SEResponse.CreateFromXml(reader); + + if (response.GetRecordType() == typeof(MT.pHLab.SE.V1.Response_SimpleResultRecord)) + { + m_response = new MT.pHLab.SE.V1.Response_SimpleResultRecord(); + m_response.ReadXml(reader); + + success = m_response.m_bSuccess; + } + } + + setResponse(); + + return success; + } + } + + public class CommandImportTable : AbstractCommand + { + + public bool success = false; + protected EItemType m_eItemType; + MT.pHLab.SE.V1.Response_SimpleResultRecord m_response; + + public Byte[] Table { set; get; } + + public CommandImportTable() + { + } + + public override bool Submit(SEConnection connection) + { + XmlWriterSettings settings = new XmlWriterSettings(); + settings.Indent = false; + settings.Encoding = new UTF8Encoding(false); + using (MemoryStream output = new MemoryStream()) + { + using (var writer = XmlWriter.Create(output, settings )) + { + writer.WriteStartDocument(); + writer.WriteStartElement("Telegram"); + writer.WriteAttributeString("xmlns", "xsd", null, "http://www.w3.org/2001/XMLSchema"); + writer.WriteAttributeString("xmlns", "xsi", null, "http://www.w3.org/2001/XMLSchema-instance"); + writer.WriteStartElement("Request"); + writer.WriteAttributeString("requestType", "setup.import"); + writer.WriteAttributeString("requestId", GetRequestId().ToString()); + { + string content = Encoding.UTF8.GetString(Table); + string unformated = XElement.Parse(content).ToString(SaveOptions.DisableFormatting); + Console.WriteLine(unformated); + + writer.WriteRaw(unformated); + } + writer.WriteEndElement(); + writer.WriteEndDocument(); + } + connection.Write(output.ToArray()); + } + return true; + } + +// +// +// +// +// +// true +// +// +// +// +// + public override bool OnResponse(XmlReader reader) + { + //reader.Read(); + //if (reader.Name.Equals("record") && (reader.NodeType == XmlNodeType.Element)) + { + MT.pHLab.SE.V1.SEResponse response = MT.pHLab.SE.V1.SEResponse.CreateFromXml(reader); + + if (response.GetRecordType() == typeof(MT.pHLab.SE.V1.Response_SimpleResultRecord)) + { + m_response = new MT.pHLab.SE.V1.Response_SimpleResultRecord(); + m_response.ReadXml(reader); + + success = m_response.m_bSuccess; + } + } + + setResponse(); + + return success; + } + } + + public class CommandSettingGet : AbstractCommand + { + public string Setting { set; get; } + public string Value { set; get; } + + public CommandSettingGet() + { + + } + + public override bool Submit(SEConnection connection) + { + MT.pHLab.SE.V1.SEParamRequest request = new MT.pHLab.SE.V1.SEParamRequest(GetRequestId()); + var record = new MT.pHLab.SE.V1.Request_getSettingRecord(); + record.m_settingName = Setting; + connection.Write(request.CreateTelegram(record)); + return true; + } + + public override bool OnResponse(XmlReader reader) + { + bool success = false; + + MT.pHLab.SE.V1.SEResponse response = MT.pHLab.SE.V1.SEResponse.CreateFromXml(reader); + + if (response.GetRecordType() == typeof(MT.pHLab.SE.V1.Response_getSettingRecord)) + { + var record = new MT.pHLab.SE.V1.Response_getSettingRecord(); + record.ReadXml(reader); + Value = record.m_settingValue; + } + + setResponse(); + + return success; + } + } + + public class CommandSettingSet : AbstractCommand + { + public string Setting { set; get; } + public string Value { set; get; } + + public CommandSettingSet() + { + + } + + public override bool Submit(SEConnection connection) + { + MT.pHLab.SE.V1.SEParamRequest request = new MT.pHLab.SE.V1.SEParamRequest(GetRequestId()); + var record = new MT.pHLab.SE.V1.Request_setSettingRecord(); + record.m_settingName = Setting; + record.m_settingValue = Value; + connection.Write(request.CreateTelegram(record)); + return true; + } + + public override bool OnResponse(XmlReader reader) + { + bool success = false; + + MT.pHLab.SE.V1.SEResponse response = MT.pHLab.SE.V1.SEResponse.CreateFromXml(reader); + + if (response.GetRecordType() == typeof(MT.pHLab.SE.V1.Response_SimpleResultRecord)) + { + var record = new MT.pHLab.SE.V1.Response_SimpleResultRecord(); + record.ReadXml(reader); + success = record.m_bSuccess; + } + + setResponse(); + + return success; + } + } + + + + public class CommandScreenLogin : AbstractCommand + { + public string[] Usererlist{ set; get; } + public string Username{ set; get; } + public string Password{ set; get; } + + public CommandScreenLogin() + { + + } + + /* + * + + + + + + Tom + Jerry + Alex + + + + + + * */ + + public override bool Submit(SEConnection connection) + { + MT.pHLab.SE.V1.SEParamRequest request = new MT.pHLab.SE.V1.SEParamRequest(GetRequestId()); + var record = new MT.pHLab.SE.V1.Request_loginRecord(); + if (Usererlist != null) + { + record.m_usernames = Usererlist; + } + else + { + record.m_usernames = new string[] { }; + + } + connection.Write(request.CreateTelegram(record)); + return true; + } + + public override bool OnResponse(XmlReader reader) + { + bool success = false; + + MT.pHLab.SE.V1.SEResponse response = MT.pHLab.SE.V1.SEResponse.CreateFromXml(reader); + + if (response.GetRecordType() == typeof(MT.pHLab.SE.V1.Response_loginRecord)) + { + var record = new MT.pHLab.SE.V1.Response_loginRecord(); + record.ReadXml(reader); + Username = record.m_username; + Password = record.m_password; + } + + setResponse(); + + return success; + } + } + +} diff --git a/SEClient/Contract/SevenExcellence-Home.png b/SEClient/Contract/SevenExcellence-Home.png new file mode 100644 index 0000000000000000000000000000000000000000..186efefe62486e0f0a96d0a514840a9ff4f7b5b6 GIT binary patch literal 36404 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 literal 0 HcmV?d00001 diff --git a/SEClient/Contract/SevenExcellence.png b/SEClient/Contract/SevenExcellence.png new file mode 100644 index 0000000000000000000000000000000000000000..566b56cf8055a55d41838e23d3466d86e31a15cc GIT binary patch literal 93409 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�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

2#0kF$MfoNYtnR7w@b7$z%}YtNpU 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 AP5=M^ literal 0 HcmV?d00001 diff --git a/SEClient/Contract/generateServices.bat b/SEClient/Contract/generateServices.bat new file mode 100644 index 0000000..20ceeba --- /dev/null +++ b/SEClient/Contract/generateServices.bat @@ -0,0 +1,14 @@ +call "%VS110COMNTOOLS%vsvars32.bat" + +@pushd %cd% + +@rem %~dp0 will give you the full path to the batch file (fixed) +cd %~dp0 + +rem xsd.exe results_labx.xsd /classes /language:cs /n:MT.pHLab.SE.V1 +xsd.exe results_labxdirect.xsd /classes /n:MT.pHLab.SE.V1 + + +@popd + +:Exit \ No newline at end of file diff --git a/SEClient/Contract/importer.xsd b/SEClient/Contract/importer.xsd new file mode 100644 index 0000000..6e2d414 --- /dev/null +++ b/SEClient/Contract/importer.xsd @@ -0,0 +1,72 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/SEClient/Contract/result_types_platform.xsd b/SEClient/Contract/result_types_platform.xsd new file mode 100644 index 0000000..b5a436e --- /dev/null +++ b/SEClient/Contract/result_types_platform.xsd @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/SEClient/Contract/results_labx_2.cs b/SEClient/Contract/results_labx_2.cs new file mode 100644 index 0000000..581d63c --- /dev/null +++ b/SEClient/Contract/results_labx_2.cs @@ -0,0 +1,19069 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:4.0.30319.42000 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +// +// This source code was auto-generated by xsd, Version=4.0.30319.17929. +// +namespace MT.pHLab.SE.V1 { + using System.Xml.Serialization; + + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + public partial class TreasureFleetAnyResult { + + private object itemField; + + /// + [System.Xml.Serialization.XmlElementAttribute("DecimalResult", typeof(DecimalResult))] + [System.Xml.Serialization.XmlElementAttribute("IntegerResult", typeof(IntegerResult))] + [System.Xml.Serialization.XmlElementAttribute("ResultAdjustmentParameters", typeof(ResultAdjustmentParameters))] + [System.Xml.Serialization.XmlElementAttribute("ResultBODSample", typeof(ResultBODSample))] + [System.Xml.Serialization.XmlElementAttribute("ResultBcvBlank", typeof(ResultBcvBlank))] + [System.Xml.Serialization.XmlElementAttribute("ResultBcvSeed", typeof(ResultBcvSeed))] + [System.Xml.Serialization.XmlElementAttribute("ResultBcvStandard", typeof(ResultBcvStandard))] + [System.Xml.Serialization.XmlElementAttribute("ResultCnd", typeof(ResultCnd))] + [System.Xml.Serialization.XmlElementAttribute("ResultDO", typeof(ResultDO))] + [System.Xml.Serialization.XmlElementAttribute("ResultISMStatisticsCommon", typeof(ResultISMStatisticsCommon))] + [System.Xml.Serialization.XmlElementAttribute("ResultISMStatisticsPhDigital", typeof(ResultISMStatisticsPhDigital))] + [System.Xml.Serialization.XmlElementAttribute("ResultMFCalibrationCND", typeof(ResultMFCalibrationCND))] + [System.Xml.Serialization.XmlElementAttribute("ResultMFCalibrationDO", typeof(ResultMFCalibrationDO))] + [System.Xml.Serialization.XmlElementAttribute("ResultMFCalibrationISE", typeof(ResultMFCalibrationISE))] + [System.Xml.Serialization.XmlElementAttribute("ResultMFCalibrationPHISFET", typeof(ResultMFCalibrationPHISFET))] + [System.Xml.Serialization.XmlElementAttribute("ResultPh", typeof(ResultPh))] + [System.Xml.Serialization.XmlElementAttribute("StringResult", typeof(StringResult))] + public object Item { + get { + return this.itemField; + } + set { + this.itemField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + public partial class DecimalResult { + + private System.DateTime timestampField; + + private EDecimalResultState stateField; + + private decfloat valueField; + + /// + public System.DateTime timestamp { + get { + return this.timestampField; + } + set { + this.timestampField = value; + } + } + + /// + public EDecimalResultState state { + get { + return this.stateField; + } + set { + this.stateField = value; + } + } + + /// + public decfloat value { + get { + return this.valueField; + } + set { + this.valueField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + public enum EDecimalResultState { + [XmlEnum("0")] + /// + eDecimalResultState_Valid, + [XmlEnum("1")] + + /// + eDecimalResultState_NaN, + [XmlEnum("2")] + /// + eDecimalResultState_INF, + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + public partial class decfloat { + + private string valueField; + + /// + [System.Xml.Serialization.XmlTextAttribute()] + public string Value { + get { + return this.valueField; + } + set { + this.valueField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + public partial class IntegerResult { + + private System.DateTime timestampField; + + private long valueField; + + /// + public System.DateTime timestamp { + get { + return this.timestampField; + } + set { + this.timestampField = value; + } + } + + /// + public long value { + get { + return this.valueField; + } + set { + this.valueField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + public partial class ResultAdjustmentParameters { + + private SensorAdjustParameter[] adjustParametersField; + + /// + [System.Xml.Serialization.XmlArrayAttribute(IsNullable=true)] + [System.Xml.Serialization.XmlArrayItemAttribute("ArrayOfSensorAdjustParameter")] + public SensorAdjustParameter[] adjustParameters { + get { + return this.adjustParametersField; + } + set { + this.adjustParametersField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class SensorAdjustParameter { + + private MTValue m_slopeField; + + private MTValue m_slopePercentField; + + private MTValue m_offsetField; + + private MTValue m_rawValueZoneMinField; + + private MTValue m_rawValuezoneMaxField; + + /// + public MTValue m_slope { + get { + return this.m_slopeField; + } + set { + this.m_slopeField = value; + } + } + + /// + public MTValue m_slopePercent { + get { + return this.m_slopePercentField; + } + set { + this.m_slopePercentField = value; + } + } + + /// + public MTValue m_offset { + get { + return this.m_offsetField; + } + set { + this.m_offsetField = value; + } + } + + /// + public MTValue m_rawValueZoneMin { + get { + return this.m_rawValueZoneMinField; + } + set { + this.m_rawValueZoneMinField = value; + } + } + + /// + public MTValue m_rawValuezoneMax { + get { + return this.m_rawValuezoneMaxField; + } + set { + this.m_rawValuezoneMaxField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class MTValue { + + private decfloat valueField; + + private ECommonUnit unitField; + + /// + public decfloat value { + get { + return this.valueField; + } + set { + this.valueField = value; + } + } + + /// + public ECommonUnit unit { + get { + return this.unitField; + } + set { + this.unitField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + public enum ECommonUnit { + [XmlEnum("0")] + eCommonUnitid_CommonUnit_None, + + [XmlEnum("1")] + eCommonUnitid_CommonUnit_PSU, + + [XmlEnum("2")] + eCommonUnitid_CommonUnit_PPT, + + [XmlEnum("3")] + eCommonUnitid_CommonUnit_MMOLL, + + [XmlEnum("3")] + eCommonUnitid_CommonUnit_MOLL, + + [XmlEnum("3")] + eCommonUnitid_CommonUnit_TDSPPT, + + [XmlEnum("3")] + eCommonUnitid_CommonUnit_MgL, + + [XmlEnum("3")] + eCommonUnitid_CommonUnit_PPM, + + [XmlEnum("3")] + eCommonUnitid_CommonUnit_Percent, + + [XmlEnum("9")] + eCommonUnitid_CommonUnit_PX, + + [XmlEnum("10")] + eCommonUnitid_CommonUnit_PH, + + [XmlEnum("3")] + eCommonUnitid_CommonUnit_MV, + + [XmlEnum("3")] + eCommonUnitid_CommonUnit_RelMV, + + [XmlEnum("3")] + eCommonUnitid_CommonUnit_USCM, + + [XmlEnum("3")] + eCommonUnitid_CommonUnit_MSCM, + + [XmlEnum("3")] + eCommonUnitid_CommonUnit_SPerM, + + [XmlEnum("3")] + eCommonUnitid_CommonUnit_USPerM, + + [XmlEnum("3")] + eCommonUnitid_CommonUnit_MSPerM, + + [XmlEnum("3")] + eCommonUnitid_CommonUnit_GPerL, + + [XmlEnum("3")] + eCommonUnitid_CommonUnit_mBar, + + [XmlEnum("3")] + eCommonUnitid_CommonUnit_hPa, + + [XmlEnum("3")] + eCommonUnitid_CommonUnit_mmHg, + + /// + eCommonUnitid_CommonUnit_Atm, + + /// + eCommonUnitid_CommonUnit_KOCM, + + /// + eCommonUnitid_CommonUnit_MOCM, + + /// + eCommonUnitid_CommonUnit_OCM, + + /// + eCommonUnitid_CommonUnit_GPerMOL, + + /// + eCommonUnitid_CommonUnit_CellConstant, + + /// + eCommonUnitid_CommonUnit_MVPerPH, + + /// + eCommonUnitid_CommonUnit_MVPerPX, + + /// + eCommonUnitid_CommonUnit_ML, + + [XmlEnum("31")] + eCommonUnitid_CommonUnit_Celsius, + + /// + eCommonUnitid_CommonUnit_Fahrenheit, + + /// + eCommonUnitid_CommonUnit_Ohm, + + /// + eCommonUnitid_CommonUnit_Seconds, + + /// + eCommonUnitid_CommonUnit_V, + + /// + eCommonUnitid_CommonUnit_PercentPerCenti, + + /// + eCommonUnitid_CommonUnit_KOhm, + + /// + eCommonUnitid_CommonUnit_MOhm, + + /// + eCommonUnitid_CommonUnit_nA, + + /// + eCommonUnitid_CommonUnit_kPa, + + /// + eCommonUnitid_CommonUnit_mLmin, + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + public partial class ResultBODSample { + + private ResultBcv bCVSampleResultField; + + private decfloat[] seedCorrectFactorField; + + private decfloat[] blankCorrectFactorField; + + /// + public ResultBcv BCVSampleResult { + get { + return this.bCVSampleResultField; + } + set { + this.bCVSampleResultField = value; + } + } + + /// + [System.Xml.Serialization.XmlArrayItemAttribute("ArrayOfDecfloat")] + public decfloat[] seedCorrectFactor { + get { + return this.seedCorrectFactorField; + } + set { + this.seedCorrectFactorField = value; + } + } + + /// + [System.Xml.Serialization.XmlArrayItemAttribute("ArrayOfDecfloat")] + public decfloat[] blankCorrectFactor { + get { + return this.blankCorrectFactorField; + } + set { + this.blankCorrectFactorField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + public partial class ResultBcv { + + private OUPData[] baseField; + + private OUPData[] followField; + + private BODResult[] resultField; + + private decfloat standardDeviationField; + + private decfloat finalResultField; + + private ECommonUnit doUnitField; + + private ECommonUnit tempUnitField; + + private ECommonUnit pressureUnitField; + + private decfloat doResolutionField; + + private decfloat bodResolutionField; + + private System.DateTime timestampField; + + /// + [System.Xml.Serialization.XmlArrayItemAttribute("ArrayOfOUPData")] + public OUPData[] @base { + get { + return this.baseField; + } + set { + this.baseField = value; + } + } + + /// + [System.Xml.Serialization.XmlArrayItemAttribute("ArrayOfOUPData")] + public OUPData[] follow { + get { + return this.followField; + } + set { + this.followField = value; + } + } + + /// + [System.Xml.Serialization.XmlArrayItemAttribute("ArrayOfBODResult")] + public BODResult[] result { + get { + return this.resultField; + } + set { + this.resultField = value; + } + } + + /// + public decfloat standardDeviation { + get { + return this.standardDeviationField; + } + set { + this.standardDeviationField = value; + } + } + + /// + public decfloat finalResult { + get { + return this.finalResultField; + } + set { + this.finalResultField = value; + } + } + + /// + public ECommonUnit doUnit { + get { + return this.doUnitField; + } + set { + this.doUnitField = value; + } + } + + /// + public ECommonUnit tempUnit { + get { + return this.tempUnitField; + } + set { + this.tempUnitField = value; + } + } + + /// + public ECommonUnit pressureUnit { + get { + return this.pressureUnitField; + } + set { + this.pressureUnitField = value; + } + } + + /// + public decfloat doResolution { + get { + return this.doResolutionField; + } + set { + this.doResolutionField = value; + } + } + + /// + public decfloat bodResolution { + get { + return this.bodResolutionField; + } + set { + this.bodResolutionField = value; + } + } + + /// + public System.DateTime timestamp { + get { + return this.timestampField; + } + set { + this.timestampField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + public partial class OUPData { + + private decfloat doMglField; + + private decfloat oxygenSaturationField; + + private decfloat rawTemperatureField; + + private decfloat rawPressureField; + + private decfloat saliField; + + private System.DateTime datetimeField; + + private EResultQuality resultQualityField; + + private EMFAnalysisAction analysisActionField; + + private EAnalysisStatus analysisStatusField; + + /// + public decfloat doMgl { + get { + return this.doMglField; + } + set { + this.doMglField = value; + } + } + + /// + public decfloat OxygenSaturation { + get { + return this.oxygenSaturationField; + } + set { + this.oxygenSaturationField = value; + } + } + + /// + public decfloat rawTemperature { + get { + return this.rawTemperatureField; + } + set { + this.rawTemperatureField = value; + } + } + + /// + public decfloat rawPressure { + get { + return this.rawPressureField; + } + set { + this.rawPressureField = value; + } + } + + /// + public decfloat sali { + get { + return this.saliField; + } + set { + this.saliField = value; + } + } + + /// + public System.DateTime datetime { + get { + return this.datetimeField; + } + set { + this.datetimeField = value; + } + } + + /// + public EResultQuality resultQuality { + get { + return this.resultQualityField; + } + set { + this.resultQualityField = value; + } + } + + /// + public EMFAnalysisAction analysisAction { + get { + return this.analysisActionField; + } + set { + this.analysisActionField = value; + } + } + + /// + public EAnalysisStatus analysisStatus { + get { + return this.analysisStatusField; + } + set { + this.analysisStatusField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + public enum EResultQuality { + [XmlEnum("0")] + + /// + eDraftValue, + + /// + [XmlEnum("1")] + eDraftValue_Stable, + + /// + [XmlEnum("2")] + eManualEndpoint, + + /// + [XmlEnum("3")] + eAutoEndpoint_Strict, + + /// + [XmlEnum("4")] + eAutoEndpoint_Normal, + + /// + [XmlEnum("5")] + eAutoEndpoint_Fast, + + /// + eAutoEndpoint_UserDef, + + /// + eTimedEndpoint, + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + public enum EMFAnalysisAction { + + /// + [XmlEnum("0")] + /// + eMFAnalysisActionid_MFAnalysisAction_SaveAndReport, + + /// + [XmlEnum("1")] + eMFAnalysisActionid_MFAnalysisAction_Repeat, + + /// + [XmlEnum("2")] + eMFAnalysisActionid_MFAnalysisAction_SkipBottle, + + /// + [XmlEnum("3")] + eMFAnalysisActionid_MFAnalysisAction_Interrupt, + + /// + [XmlEnum("4")] + eMFAnalysisActionid_MFAnalysisAction_PreventStart, + + /// + [XmlEnum("5")] + eMFAnalysisActionid_MFAnalysisAction_SaveAndWarn, + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + public enum EAnalysisStatus { + + /// + eAnalysisStatusid_AnalysisStatus_OK, + + /// + eAnalysisStatusid_AnalysisStatus_OKStar, + + /// + eAnalysisStatusid_AnalysisStatus_Failed, + + /// + eAnalysisStatusid_AnalysisStatus_Error, + + /// + eAnalysisStatusid_AnalysisStatus_CriticalError, + + /// + eAnalysisStatusid_AnalysisStatus_Terminate, + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + public partial class BODResult { + + private decfloat bottleBODField; + + private decfloat bottleO2DepletionField; + + private decfloat elapsedSecondsField; + + private EMFAnalysisAction analysisActionField; + + /// + public decfloat bottleBOD { + get { + return this.bottleBODField; + } + set { + this.bottleBODField = value; + } + } + + /// + public decfloat bottleO2Depletion { + get { + return this.bottleO2DepletionField; + } + set { + this.bottleO2DepletionField = value; + } + } + + /// + public decfloat elapsedSeconds { + get { + return this.elapsedSecondsField; + } + set { + this.elapsedSecondsField = value; + } + } + + /// + public EMFAnalysisAction analysisAction { + get { + return this.analysisActionField; + } + set { + this.analysisActionField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + public partial class ResultBcvBlank { + + private ResultBcv bCVBlankResultField; + + /// + public ResultBcv BCVBlankResult { + get { + return this.bCVBlankResultField; + } + set { + this.bCVBlankResultField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + public partial class ResultBcvSeed { + + private ResultBcv bCVSeedResultField; + + private decfloat[] o2DepletionPercentField; + + /// + public ResultBcv BCVSeedResult { + get { + return this.bCVSeedResultField; + } + set { + this.bCVSeedResultField = value; + } + } + + /// + [System.Xml.Serialization.XmlArrayItemAttribute("ArrayOfDecfloat")] + public decfloat[] O2DepletionPercent { + get { + return this.o2DepletionPercentField; + } + set { + this.o2DepletionPercentField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + public partial class ResultBcvStandard { + + private ResultBcv bCVStandardResultField; + + private decfloat[] seedCorrectFactorField; + + private decfloat[] blankCorrectFactorField; + + /// + public ResultBcv BCVStandardResult { + get { + return this.bCVStandardResultField; + } + set { + this.bCVStandardResultField = value; + } + } + + /// + [System.Xml.Serialization.XmlArrayItemAttribute("ArrayOfDecfloat")] + public decfloat[] seedCorrectFactor { + get { + return this.seedCorrectFactorField; + } + set { + this.seedCorrectFactorField = value; + } + } + + /// + [System.Xml.Serialization.XmlArrayItemAttribute("ArrayOfDecfloat")] + public decfloat[] blankCorrectFactor { + get { + return this.blankCorrectFactorField; + } + set { + this.blankCorrectFactorField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + public partial class ResultCnd { + + private decfloat rawValueField; + + private ECommonUnit rawValueUnitField; + + private decfloat temperatureField; + + private ECommonUnit temperatureUnitField; + + private decfloat usedCCField; + + private ECondMode cndModeField; + + private decfloat resultValueField; + + private ECommonUnit resultUnitField; + + private EResultQuality resultQualityField; + + private EResultLimitState resultLimitStateField; + + private ulong durationField; + + private System.DateTime timestampField; + + /// + public decfloat rawValue { + get { + return this.rawValueField; + } + set { + this.rawValueField = value; + } + } + + /// + public ECommonUnit rawValueUnit { + get { + return this.rawValueUnitField; + } + set { + this.rawValueUnitField = value; + } + } + + /// + public decfloat temperature { + get { + return this.temperatureField; + } + set { + this.temperatureField = value; + } + } + + /// + public ECommonUnit temperatureUnit { + get { + return this.temperatureUnitField; + } + set { + this.temperatureUnitField = value; + } + } + + /// + public decfloat usedCC { + get { + return this.usedCCField; + } + set { + this.usedCCField = value; + } + } + + /// + public ECondMode cndMode { + get { + return this.cndModeField; + } + set { + this.cndModeField = value; + } + } + + /// + public decfloat resultValue { + get { + return this.resultValueField; + } + set { + this.resultValueField = value; + } + } + + /// + public ECommonUnit resultUnit { + get { + return this.resultUnitField; + } + set { + this.resultUnitField = value; + } + } + + /// + public EResultQuality resultQuality { + get { + return this.resultQualityField; + } + set { + this.resultQualityField = value; + } + } + + /// + public EResultLimitState resultLimitState { + get { + return this.resultLimitStateField; + } + set { + this.resultLimitStateField = value; + } + } + + /// + public ulong duration { + get { + return this.durationField; + } + set { + this.durationField = value; + } + } + + /// + public System.DateTime timestamp { + get { + return this.timestampField; + } + set { + this.timestampField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + public enum ECondMode { + [XmlEnum("0")] + /// + eCondModeid_CondMode_Cond, + [XmlEnum("1")] + /// + eCondModeid_CondMode_TDS, + [XmlEnum("2")] + /// + eCondModeid_CondMode_Sal, + [XmlEnum("3")] + /// + eCondModeid_CondMode_Res, + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + public enum EResultLimitState { + [XmlEnum("0")] + + /// + eResultLimit_NotChecked, + + [XmlEnum("1")] + /// + eResultLimit_InRange, + + [XmlEnum("2")] + /// + eResultLimit_OutUpper, + + /// + [XmlEnum("3")] + eResultLimit_OutLower, + + /// + [XmlEnum("4")] + eResultLimit_min, + + /// + [XmlEnum("5")] + eResultLimit_max, + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + public partial class ResultDO { + + private decfloat rawValueField; + + private ECommonUnit rawValueUnitField; + + private decfloat temperatureField; + + private ECommonUnit temperatureUnitField; + + private decfloat pressureField; + + private ECommonUnit pressureUnitField; + + private decfloat resultValueField; + + private ECommonUnit resultUnitField; + + private EResultQuality resultQualityField; + + private EResultLimitState resultLimitStateField; + + private ulong durationField; + + private System.DateTime timestampField; + + /// + public decfloat rawValue { + get { + return this.rawValueField; + } + set { + this.rawValueField = value; + } + } + + /// + public ECommonUnit rawValueUnit { + get { + return this.rawValueUnitField; + } + set { + this.rawValueUnitField = value; + } + } + + /// + public decfloat temperature { + get { + return this.temperatureField; + } + set { + this.temperatureField = value; + } + } + + /// + public ECommonUnit temperatureUnit { + get { + return this.temperatureUnitField; + } + set { + this.temperatureUnitField = value; + } + } + + /// + public decfloat pressure { + get { + return this.pressureField; + } + set { + this.pressureField = value; + } + } + + /// + public ECommonUnit pressureUnit { + get { + return this.pressureUnitField; + } + set { + this.pressureUnitField = value; + } + } + + /// + public decfloat resultValue { + get { + return this.resultValueField; + } + set { + this.resultValueField = value; + } + } + + /// + public ECommonUnit resultUnit { + get { + return this.resultUnitField; + } + set { + this.resultUnitField = value; + } + } + + /// + public EResultQuality resultQuality { + get { + return this.resultQualityField; + } + set { + this.resultQualityField = value; + } + } + + /// + public EResultLimitState resultLimitState { + get { + return this.resultLimitStateField; + } + set { + this.resultLimitStateField = value; + } + } + + /// + public ulong duration { + get { + return this.durationField; + } + set { + this.durationField = value; + } + } + + /// + public System.DateTime timestamp { + get { + return this.timestampField; + } + set { + this.timestampField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + public partial class ResultISMStatisticsCommon { + + private string sensorSerialNumberField; + + private ECommonUnit temperatureUnitField; + + private decfloat maxTemperatureValueField; + + private System.DateTime maxTemperatureDateField; + + /// + public string sensorSerialNumber { + get { + return this.sensorSerialNumberField; + } + set { + this.sensorSerialNumberField = value; + } + } + + /// + public ECommonUnit temperatureUnit { + get { + return this.temperatureUnitField; + } + set { + this.temperatureUnitField = value; + } + } + + /// + public decfloat maxTemperatureValue { + get { + return this.maxTemperatureValueField; + } + set { + this.maxTemperatureValueField = value; + } + } + + /// + public System.DateTime maxTemperatureDate { + get { + return this.maxTemperatureDateField; + } + set { + this.maxTemperatureDateField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + public partial class ResultISMStatisticsPhDigital { + + private string sensorSerialNumberField; + + private ECommonUnit temperatureUnitField; + + private decfloat maxTemperatureValueField; + + private System.DateTime maxTemperatureDateField; + + private decfloat averageTemperatureValueField; + + private ECommonUnit measurementTimeUnitField; + + private decfloat measurementTimeField; + + private ECommonUnit pHUnitField; + + private decfloat averagePhValueField; + + private decfloat maxPhValueField; + + private System.DateTime maxPhDateField; + + private decfloat minPhValueField; + + private System.DateTime minPhDateField; + + /// + public string sensorSerialNumber { + get { + return this.sensorSerialNumberField; + } + set { + this.sensorSerialNumberField = value; + } + } + + /// + public ECommonUnit temperatureUnit { + get { + return this.temperatureUnitField; + } + set { + this.temperatureUnitField = value; + } + } + + /// + public decfloat maxTemperatureValue { + get { + return this.maxTemperatureValueField; + } + set { + this.maxTemperatureValueField = value; + } + } + + /// + public System.DateTime maxTemperatureDate { + get { + return this.maxTemperatureDateField; + } + set { + this.maxTemperatureDateField = value; + } + } + + /// + public decfloat averageTemperatureValue { + get { + return this.averageTemperatureValueField; + } + set { + this.averageTemperatureValueField = value; + } + } + + /// + public ECommonUnit measurementTimeUnit { + get { + return this.measurementTimeUnitField; + } + set { + this.measurementTimeUnitField = value; + } + } + + /// + public decfloat measurementTime { + get { + return this.measurementTimeField; + } + set { + this.measurementTimeField = value; + } + } + + /// + public ECommonUnit pHUnit { + get { + return this.pHUnitField; + } + set { + this.pHUnitField = value; + } + } + + /// + public decfloat averagePhValue { + get { + return this.averagePhValueField; + } + set { + this.averagePhValueField = value; + } + } + + /// + public decfloat maxPhValue { + get { + return this.maxPhValueField; + } + set { + this.maxPhValueField = value; + } + } + + /// + public System.DateTime maxPhDate { + get { + return this.maxPhDateField; + } + set { + this.maxPhDateField = value; + } + } + + /// + public decfloat minPhValue { + get { + return this.minPhValueField; + } + set { + this.minPhValueField = value; + } + } + + /// + public System.DateTime minPhDate { + get { + return this.minPhDateField; + } + set { + this.minPhDateField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + public partial class ResultMFCalibrationCND { + + private short cellConstantLimitStateField; + + private CondCalPointData[] sensorCalPointsField; + + /// + public short cellConstantLimitState { + get { + return this.cellConstantLimitStateField; + } + set { + this.cellConstantLimitStateField = value; + } + } + + /// + [System.Xml.Serialization.XmlArrayItemAttribute("ArrayOfCondCalPointData")] + public CondCalPointData[] sensorCalPoints { + get { + return this.sensorCalPointsField; + } + set { + this.sensorCalPointsField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class CondCalPointData { + + private decfloat m_refStdField; + + private ECommonUnit m_stdUnitField; + + private decfloat m_rawValueField; + + private decfloat m_cellConstantField; + + private decfloat m_tempField; + + /// + public decfloat m_refStd { + get { + return this.m_refStdField; + } + set { + this.m_refStdField = value; + } + } + + /// + public ECommonUnit m_stdUnit { + get { + return this.m_stdUnitField; + } + set { + this.m_stdUnitField = value; + } + } + + /// + public decfloat m_rawValue { + get { + return this.m_rawValueField; + } + set { + this.m_rawValueField = value; + } + } + + /// + public decfloat m_cellConstant { + get { + return this.m_cellConstantField; + } + set { + this.m_cellConstantField = value; + } + } + + /// + public decfloat m_temp { + get { + return this.m_tempField; + } + set { + this.m_tempField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + public partial class ResultMFCalibrationDO { + + private decfloat defaultSlopeField; + + private DOCalPointData[] sensorCalPointsField; + + /// + public decfloat defaultSlope { + get { + return this.defaultSlopeField; + } + set { + this.defaultSlopeField = value; + } + } + + /// + [System.Xml.Serialization.XmlArrayItemAttribute("ArrayOfDOCalPointData")] + public DOCalPointData[] sensorCalPoints { + get { + return this.sensorCalPointsField; + } + set { + this.sensorCalPointsField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class DOCalPointData { + + private decfloat m_stdField; + + private ECommonUnit m_stdUnitField; + + private decfloat m_valueForCalcuField; + + private decfloat m_rawValueField; + + private int m_barPressureField; + + private decfloat m_tempField; + + /// + public decfloat m_std { + get { + return this.m_stdField; + } + set { + this.m_stdField = value; + } + } + + /// + public ECommonUnit m_stdUnit { + get { + return this.m_stdUnitField; + } + set { + this.m_stdUnitField = value; + } + } + + /// + public decfloat m_valueForCalcu { + get { + return this.m_valueForCalcuField; + } + set { + this.m_valueForCalcuField = value; + } + } + + /// + public decfloat m_rawValue { + get { + return this.m_rawValueField; + } + set { + this.m_rawValueField = value; + } + } + + /// + public int m_barPressure { + get { + return this.m_barPressureField; + } + set { + this.m_barPressureField = value; + } + } + + /// + public decfloat m_temp { + get { + return this.m_tempField; + } + set { + this.m_tempField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + public partial class ResultMFCalibrationISE { + + private decfloat defaultSlopeField; + + private ECalMode calibrationModeField; + + private ECommonUnit calibrationUnitField; + + private EIonType ionTypeField; + + private EIonCharge ionChargeField; + + private decfloat ionMolMassField; + + private System.Nullable[] offsetLimitStatesField; + + private System.Nullable[] slopeLimitStatesField; + + private ISECalPointData[] sensorCalPointsField; + + /// + public decfloat defaultSlope { + get { + return this.defaultSlopeField; + } + set { + this.defaultSlopeField = value; + } + } + + /// + public ECalMode calibrationMode { + get { + return this.calibrationModeField; + } + set { + this.calibrationModeField = value; + } + } + + /// + public ECommonUnit calibrationUnit { + get { + return this.calibrationUnitField; + } + set { + this.calibrationUnitField = value; + } + } + + /// + public EIonType ionType { + get { + return this.ionTypeField; + } + set { + this.ionTypeField = value; + } + } + + /// + public EIonCharge ionCharge { + get { + return this.ionChargeField; + } + set { + this.ionChargeField = value; + } + } + + /// + public decfloat ionMolMass { + get { + return this.ionMolMassField; + } + set { + this.ionMolMassField = value; + } + } + + /// + [System.Xml.Serialization.XmlArrayItemAttribute("ArrayOfShort")] + public System.Nullable[] offsetLimitStates { + get { + return this.offsetLimitStatesField; + } + set { + this.offsetLimitStatesField = value; + } + } + + /// + [System.Xml.Serialization.XmlArrayItemAttribute("ArrayOfShort")] + public System.Nullable[] slopeLimitStates { + get { + return this.slopeLimitStatesField; + } + set { + this.slopeLimitStatesField = value; + } + } + + /// + [System.Xml.Serialization.XmlArrayItemAttribute("ArrayOfISECalPointData")] + public ISECalPointData[] sensorCalPoints { + get { + return this.sensorCalPointsField; + } + set { + this.sensorCalPointsField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + public enum ECalMode { + [XmlEnum("0")] + /// + eCalModeid_CalMode_Linear, + [XmlEnum("1")] + /// + eCalModeid_CalMode_Segment, + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + public enum EIonType { + [XmlEnum("0")] + /// + eIonTypeid_IonType_Ag, + [XmlEnum("1")] + /// + eIonTypeid_IonType_Ca, + [XmlEnum("2")] + /// + eIonTypeid_IonType_Cl, + [XmlEnum("3")] + /// + eIonTypeid_IonType_CN, + [XmlEnum("4")] + /// + eIonTypeid_IonType_Cu, + [XmlEnum("5")] + /// + eIonTypeid_IonType_F, + [XmlEnum("6")] + /// + eIonTypeid_IonType_I, + [XmlEnum("7")] + /// + eIonTypeid_IonType_K, + [XmlEnum("8")] + /// + eIonTypeid_IonType_Na, + [XmlEnum("9")] + /// + eIonTypeid_IonType_NO, + [XmlEnum("10")] + /// + eIonTypeid_IonType_Pb, + [XmlEnum("11")] + /// + eIonTypeid_IonType_S, + [XmlEnum("12")] + /// + eIonTypeid_IonType_Other, + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + public enum EIonCharge { + [XmlEnum("0")] + /// + eIonChargeid_IonCharge_Minus3, + [XmlEnum("1")] + /// + eIonChargeid_IonCharge_Minus2, + [XmlEnum("2")] + /// + eIonChargeid_IonCharge_Minus1, + [XmlEnum("3")] + /// + eIonChargeid_IonCharge_Plus1, + [XmlEnum("4")] + /// + eIonChargeid_IonCharge_Plus2, + [XmlEnum("5")] + /// + eIonChargeid_IonCharge_Plus3, + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class ISECalPointData { + + private decfloat m_refStdField; + + private decfloat m_realStdField; + + private decfloat m_actualValueField; + + private decfloat m_rawValueField; + + private decfloat m_tempField; + + /// + public decfloat m_refStd { + get { + return this.m_refStdField; + } + set { + this.m_refStdField = value; + } + } + + /// + public decfloat m_realStd { + get { + return this.m_realStdField; + } + set { + this.m_realStdField = value; + } + } + + /// + public decfloat m_actualValue { + get { + return this.m_actualValueField; + } + set { + this.m_actualValueField = value; + } + } + + /// + public decfloat m_rawValue { + get { + return this.m_rawValueField; + } + set { + this.m_rawValueField = value; + } + } + + /// + public decfloat m_temp { + get { + return this.m_tempField; + } + set { + this.m_tempField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + public partial class ResultMFCalibrationPHISFET { + + private decfloat defaultSlopeField; + + private ECalMode calModeField; + + private System.Nullable[] offsetLimitStatesField; + + private System.Nullable[] slopeLimitStatesField; + + private PHISFETCalPointData[] sensorCalPointsField; + + /// + public decfloat defaultSlope { + get { + return this.defaultSlopeField; + } + set { + this.defaultSlopeField = value; + } + } + + /// + public ECalMode calMode { + get { + return this.calModeField; + } + set { + this.calModeField = value; + } + } + + /// + [System.Xml.Serialization.XmlArrayItemAttribute("ArrayOfShort")] + public System.Nullable[] offsetLimitStates { + get { + return this.offsetLimitStatesField; + } + set { + this.offsetLimitStatesField = value; + } + } + + /// + [System.Xml.Serialization.XmlArrayItemAttribute("ArrayOfShort")] + public System.Nullable[] slopeLimitStates { + get { + return this.slopeLimitStatesField; + } + set { + this.slopeLimitStatesField = value; + } + } + + /// + [System.Xml.Serialization.XmlArrayItemAttribute("ArrayOfPHISFETCalPointData")] + public PHISFETCalPointData[] sensorCalPoints { + get { + return this.sensorCalPointsField; + } + set { + this.sensorCalPointsField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class PHISFETCalPointData { + + private decfloat m_refBufField; + + private decfloat m_realBufField; + + private decfloat m_actualValueField; + + private decfloat m_rawValueField; + + private decfloat m_tempField; + + /// + public decfloat m_refBuf { + get { + return this.m_refBufField; + } + set { + this.m_refBufField = value; + } + } + + /// + public decfloat m_realBuf { + get { + return this.m_realBufField; + } + set { + this.m_realBufField = value; + } + } + + /// + public decfloat m_actualValue { + get { + return this.m_actualValueField; + } + set { + this.m_actualValueField = value; + } + } + + /// + public decfloat m_rawValue { + get { + return this.m_rawValueField; + } + set { + this.m_rawValueField = value; + } + } + + /// + public decfloat m_temp { + get { + return this.m_tempField; + } + set { + this.m_tempField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + public partial class ResultPh { + + private decfloat rawValueField; + + private ECommonUnit rawValueUnitField; + + private decfloat temperatureField; + + private ECommonUnit temperatureUnitField; + + private decfloat resultValueField; + + private ECommonUnit resultUnitField; + + private EResultQuality resultQualityField; + + private EResultLimitState resultLimitStateField; + + private ulong durationField; + + private System.DateTime timestampField; + + /// + public decfloat rawValue { + get { + return this.rawValueField; + } + set { + this.rawValueField = value; + } + } + + /// + public ECommonUnit rawValueUnit { + get { + return this.rawValueUnitField; + } + set { + this.rawValueUnitField = value; + } + } + + /// + public decfloat temperature { + get { + return this.temperatureField; + } + set { + this.temperatureField = value; + } + } + + /// + public ECommonUnit temperatureUnit { + get { + return this.temperatureUnitField; + } + set { + this.temperatureUnitField = value; + } + } + + /// + public decfloat resultValue { + get { + return this.resultValueField; + } + set { + this.resultValueField = value; + } + } + + /// + public ECommonUnit resultUnit { + get { + return this.resultUnitField; + } + set { + this.resultUnitField = value; + } + } + + /// + public EResultQuality resultQuality { + get { + return this.resultQualityField; + } + set { + this.resultQualityField = value; + } + } + + /// + public EResultLimitState resultLimitState { + get { + return this.resultLimitStateField; + } + set { + this.resultLimitStateField = value; + } + } + + /// + public ulong duration { + get { + return this.durationField; + } + set { + this.durationField = value; + } + } + + /// + public System.DateTime timestamp { + get { + return this.timestampField; + } + set { + this.timestampField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + public partial class StringResult { + + private System.DateTime timestampField; + + private string valueField; + + /// + public System.DateTime timestamp { + get { + return this.timestampField; + } + set { + this.timestampField = value; + } + } + + /// + public string value { + get { + return this.valueField; + } + set { + this.valueField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + public partial class EndOfMethod { + + private System.DateTime m_timestampField; + + private EAnalysisStatus m_eAnalysisStatusField; + + private short m_uiJobIdField; + + private string m_userField; + + /// + public System.DateTime m_timestamp { + get { + return this.m_timestampField; + } + set { + this.m_timestampField = value; + } + } + + /// + public EAnalysisStatus m_eAnalysisStatus { + get { + return this.m_eAnalysisStatusField; + } + set { + this.m_eAnalysisStatusField = value; + } + } + + /// + public short m_uiJobId { + get { + return this.m_uiJobIdField; + } + set { + this.m_uiJobIdField = value; + } + } + + /// + public string m_user { + get { + return this.m_userField; + } + set { + this.m_userField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class method { + + private record[] mfField; + + /// + [System.Xml.Serialization.XmlElementAttribute("mf")] + public record[] mf { + get { + return this.mfField; + } + set { + this.mfField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class record { + + private param[] paramlistField; + + private record[] sflistField; + + private string typeField; + + /// + [System.Xml.Serialization.XmlArrayAttribute("param-list")] + [System.Xml.Serialization.XmlArrayItemAttribute(IsNullable=false)] + public param[] paramlist { + get { + return this.paramlistField; + } + set { + this.paramlistField = value; + } + } + + /// + [System.Xml.Serialization.XmlArrayAttribute("sf-list")] + [System.Xml.Serialization.XmlArrayItemAttribute("sf", IsNullable=false)] + public record[] sflist { + get { + return this.sflistField; + } + set { + this.sflistField = value; + } + } + + /// + [System.Xml.Serialization.XmlAttributeAttribute()] + public string type { + get { + return this.typeField; + } + set { + this.typeField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + public partial class param { + + private object[] itemsField; + + private string[] textField; + + private string nameField; + + private pdk_datatypes typeField; + + private pdk_datatypes sequenceTypeField; + + private bool sequenceTypeFieldSpecified; + + private string recordTypeField; + + /// + [System.Xml.Serialization.XmlElementAttribute("item", typeof(item))] + [System.Xml.Serialization.XmlElementAttribute("record", typeof(record))] + public object[] Items { + get { + return this.itemsField; + } + set { + this.itemsField = value; + } + } + + /// + [System.Xml.Serialization.XmlTextAttribute()] + public string[] Text { + get { + return this.textField; + } + set { + this.textField = value; + } + } + + /// + [System.Xml.Serialization.XmlAttributeAttribute()] + public string name { + get { + return this.nameField; + } + set { + this.nameField = value; + } + } + + /// + [System.Xml.Serialization.XmlAttributeAttribute()] + public pdk_datatypes type { + get { + return this.typeField; + } + set { + this.typeField = value; + } + } + + /// + [System.Xml.Serialization.XmlAttributeAttribute()] + public pdk_datatypes sequenceType { + get { + return this.sequenceTypeField; + } + set { + this.sequenceTypeField = value; + } + } + + /// + [System.Xml.Serialization.XmlIgnoreAttribute()] + public bool sequenceTypeSpecified { + get { + return this.sequenceTypeFieldSpecified; + } + set { + this.sequenceTypeFieldSpecified = value; + } + } + + /// + [System.Xml.Serialization.XmlAttributeAttribute()] + public string recordType { + get { + return this.recordTypeField; + } + set { + this.recordTypeField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + public partial class item { + + private record itemField; + + private string[] textField; + + /// + [System.Xml.Serialization.XmlElementAttribute("record")] + public record Item { + get { + return this.itemField; + } + set { + this.itemField = value; + } + } + + /// + [System.Xml.Serialization.XmlTextAttribute()] + public string[] Text { + get { + return this.textField; + } + set { + this.textField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + public enum pdk_datatypes { + + /// + boolean, + + /// + @short, + + /// + wstring, + + /// + decfloat, + + /// + @long, + + /// + datetime, + + /// + sequence, + + /// + record, + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class DateTimeRecord { + + private short m_dayField; + + private short m_monthField; + + private int m_yearField; + + private short m_hourField; + + private short m_minuteField; + + /// + public short m_day { + get { + return this.m_dayField; + } + set { + this.m_dayField = value; + } + } + + /// + public short m_month { + get { + return this.m_monthField; + } + set { + this.m_monthField = value; + } + } + + /// + public int m_year { + get { + return this.m_yearField; + } + set { + this.m_yearField = value; + } + } + + /// + public short m_hour { + get { + return this.m_hourField; + } + set { + this.m_hourField = value; + } + } + + /// + public short m_minute { + get { + return this.m_minuteField; + } + set { + this.m_minuteField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class ResultSummaryRecord { + + private string m_resultIDField; + + private string m_methodTypeStrField; + + private string m_methodIDField; + + private string m_sampleIDField; + + private short m_eAnalysisStatusField; + + private string m_resultReportField; + + private System.DateTime m_dateTimeField; + + private bool m_isOUPBaseField; + + /// + public string m_resultID { + get { + return this.m_resultIDField; + } + set { + this.m_resultIDField = value; + } + } + + /// + public string m_methodTypeStr { + get { + return this.m_methodTypeStrField; + } + set { + this.m_methodTypeStrField = value; + } + } + + /// + public string m_methodID { + get { + return this.m_methodIDField; + } + set { + this.m_methodIDField = value; + } + } + + /// + public string m_sampleID { + get { + return this.m_sampleIDField; + } + set { + this.m_sampleIDField = value; + } + } + + /// + public short m_eAnalysisStatus { + get { + return this.m_eAnalysisStatusField; + } + set { + this.m_eAnalysisStatusField = value; + } + } + + /// + public string m_resultReport { + get { + return this.m_resultReportField; + } + set { + this.m_resultReportField = value; + } + } + + /// + public System.DateTime m_dateTime { + get { + return this.m_dateTimeField; + } + set { + this.m_dateTimeField = value; + } + } + + /// + public bool m_isOUPBase { + get { + return this.m_isOUPBaseField; + } + set { + this.m_isOUPBaseField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class DateTimeFormatRecord { + + private EHmiDateFormat m_dateFormatField; + + private EHmiTimeFormat m_timeFormatField; + + /// + public EHmiDateFormat m_dateFormat { + get { + return this.m_dateFormatField; + } + set { + this.m_dateFormatField = value; + } + } + + /// + public EHmiTimeFormat m_timeFormat { + get { + return this.m_timeFormatField; + } + set { + this.m_timeFormatField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + public enum EHmiDateFormat { + + /// + eHmiDateFormatid_HmiDateFormat_mmddyyyy, + + /// + eHmiDateFormatid_HmiDateFormat_ddmmyyyy, + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + public enum EHmiTimeFormat { + + /// + eHmiTimeFormatid_HmiTimeFormat_24h, + + /// + eHmiTimeFormatid_HmiTimeFormat_AmPm, + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class FingerprintReaderRecord { + + private string m_nameField; + + private bool m_utilizeFingerprintReaderField; + + private EPeripheralsConnection m_connectionIDField; + + /// + public string m_name { + get { + return this.m_nameField; + } + set { + this.m_nameField = value; + } + } + + /// + public bool m_utilizeFingerprintReader { + get { + return this.m_utilizeFingerprintReaderField; + } + set { + this.m_utilizeFingerprintReaderField = value; + } + } + + /// + public EPeripheralsConnection m_connectionID { + get { + return this.m_connectionIDField; + } + set { + this.m_connectionIDField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + public enum EPeripheralsConnection { + + /// + ePeripheralsConnectionid_PeripheralsConnection_PnP, + + /// + ePeripheralsConnectionid_PeripheralsConnection_USB, + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class InMotionSettingRecord { + + private string m_nameField; + + private EBaseType m_baseTypeField; + + private EStatus m_statusField; + + private short m_stirrerOutputField; + + private short m_powershowerOutputField; + + private decfloat m_rateField; + + private ERack m_rackTypeField; + + private short m_rackSizeField; + + private short m_beakerHeightField; + + /// + public string m_name { + get { + return this.m_nameField; + } + set { + this.m_nameField = value; + } + } + + /// + public EBaseType m_baseType { + get { + return this.m_baseTypeField; + } + set { + this.m_baseTypeField = value; + } + } + + /// + public EStatus m_status { + get { + return this.m_statusField; + } + set { + this.m_statusField = value; + } + } + + /// + public short m_stirrerOutput { + get { + return this.m_stirrerOutputField; + } + set { + this.m_stirrerOutputField = value; + } + } + + /// + public short m_powershowerOutput { + get { + return this.m_powershowerOutputField; + } + set { + this.m_powershowerOutputField = value; + } + } + + /// + public decfloat m_rate { + get { + return this.m_rateField; + } + set { + this.m_rateField = value; + } + } + + /// + public ERack m_rackType { + get { + return this.m_rackTypeField; + } + set { + this.m_rackTypeField = value; + } + } + + /// + public short m_rackSize { + get { + return this.m_rackSizeField; + } + set { + this.m_rackSizeField = value; + } + } + + /// + public short m_beakerHeight { + get { + return this.m_beakerHeightField; + } + set { + this.m_beakerHeightField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + public enum EBaseType { + + /// + eBaseTypeid_BaseType_Flex, + + /// + eBaseTypeid_BaseType_Pro, + + /// + eBaseTypeid_BaseType_Max, + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + public enum EStatus { + + /// + eStatusid_Status_Installed, + + /// + eStatusid_Status_NotInstalled, + + /// + eStatusid_Status_InstalledNotSupported, + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + public enum ERack { + + /// + eRackid_Rack_Standard, + + /// + eRackid_Rack_WaterBath, + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class PHSensorRecord { + + private string m_uuidField; + + private string m_sensorSerialNumberField; + + private string m_sensorIDField; + + private ESensorClass m_sensorClassField; + + private System.DateTime m_initialOperationDateField; + + private decfloat m_def_slopeField; + + private decfloat m_def_offsetField; + + private bool m_isObservedField; + + private int numberOfEntriesField; + + private bool m_monitorLifeSpanField; + + private short m_lifeSpanField; + + private System.DateTime m_expiryDateLifeSpanField; + + private bool m_monitorUsableLifeField; + + private System.DateTime m_expiryDateUsableLifeField; + + private ETimeUnit m_usableLifeTimePeriodField; + + private int m_usableLifeField; + + private PHISFETSensorCalRecord[] m_sensorCalHistoryField; + + /// + public string m_uuid { + get { + return this.m_uuidField; + } + set { + this.m_uuidField = value; + } + } + + /// + public string m_sensorSerialNumber { + get { + return this.m_sensorSerialNumberField; + } + set { + this.m_sensorSerialNumberField = value; + } + } + + /// + public string m_sensorID { + get { + return this.m_sensorIDField; + } + set { + this.m_sensorIDField = value; + } + } + + /// + public ESensorClass m_sensorClass { + get { + return this.m_sensorClassField; + } + set { + this.m_sensorClassField = value; + } + } + + /// + public System.DateTime m_initialOperationDate { + get { + return this.m_initialOperationDateField; + } + set { + this.m_initialOperationDateField = value; + } + } + + /// + public decfloat m_def_slope { + get { + return this.m_def_slopeField; + } + set { + this.m_def_slopeField = value; + } + } + + /// + public decfloat m_def_offset { + get { + return this.m_def_offsetField; + } + set { + this.m_def_offsetField = value; + } + } + + /// + public bool m_isObserved { + get { + return this.m_isObservedField; + } + set { + this.m_isObservedField = value; + } + } + + /// + public int numberOfEntries { + get { + return this.numberOfEntriesField; + } + set { + this.numberOfEntriesField = value; + } + } + + /// + public bool m_monitorLifeSpan { + get { + return this.m_monitorLifeSpanField; + } + set { + this.m_monitorLifeSpanField = value; + } + } + + /// + public short m_lifeSpan { + get { + return this.m_lifeSpanField; + } + set { + this.m_lifeSpanField = value; + } + } + + /// + public System.DateTime m_expiryDateLifeSpan { + get { + return this.m_expiryDateLifeSpanField; + } + set { + this.m_expiryDateLifeSpanField = value; + } + } + + /// + public bool m_monitorUsableLife { + get { + return this.m_monitorUsableLifeField; + } + set { + this.m_monitorUsableLifeField = value; + } + } + + /// + public System.DateTime m_expiryDateUsableLife { + get { + return this.m_expiryDateUsableLifeField; + } + set { + this.m_expiryDateUsableLifeField = value; + } + } + + /// + public ETimeUnit m_usableLifeTimePeriod { + get { + return this.m_usableLifeTimePeriodField; + } + set { + this.m_usableLifeTimePeriodField = value; + } + } + + /// + public int m_usableLife { + get { + return this.m_usableLifeField; + } + set { + this.m_usableLifeField = value; + } + } + + /// + [System.Xml.Serialization.XmlArrayItemAttribute("ArrayOfPHISFETSensorCalRecord")] + public PHISFETSensorCalRecord[] m_sensorCalHistory { + get { + return this.m_sensorCalHistoryField; + } + set { + this.m_sensorCalHistoryField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + public enum ESensorClass { + + /// + eSensorClassid_SensorClass_Normal, + + /// + eSensorClassid_SensorClass_AnalogOneWiredISM, + + /// + eSensorClassid_SensorClass_DigitalOneWiredISM, + + /// + eSensorClassid_SensorClass_DigitalRS485ISM, + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + public enum ETimeUnit { + + /// + eTimeUnitid_TimeUnit_Days, + + /// + eTimeUnitid_TimeUnit_Hours, + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class PHISFETSensorCalRecord { + + private string m_moduleSerialNumberField; + + private ETemperatureCapture m_tempCaptureField; + + private string m_tempSensorIDField; + + private ECalMode m_calModeField; + + private bool m_isAutoBufField; + + private short m_phBufGrpClassField; + + private decfloat m_defaultSlopeField; + + private decfloat m_bufstdRefTempField; + + private EEndpointType m_endpointTypeField; + + private EEndpointCriteria m_endpointCriteriaField; + + private int m_timedEndpointValueField; + + private string m_calProcedureField; + + private System.DateTime m_calDateField; + + private string m_calCreatorField; + + private PHISFETCalPointData[] m_sensorCalPointsField; + + /// + public string m_moduleSerialNumber { + get { + return this.m_moduleSerialNumberField; + } + set { + this.m_moduleSerialNumberField = value; + } + } + + /// + public ETemperatureCapture m_tempCapture { + get { + return this.m_tempCaptureField; + } + set { + this.m_tempCaptureField = value; + } + } + + /// + public string m_tempSensorID { + get { + return this.m_tempSensorIDField; + } + set { + this.m_tempSensorIDField = value; + } + } + + /// + public ECalMode m_calMode { + get { + return this.m_calModeField; + } + set { + this.m_calModeField = value; + } + } + + /// + public bool m_isAutoBuf { + get { + return this.m_isAutoBufField; + } + set { + this.m_isAutoBufField = value; + } + } + + /// + public short m_phBufGrpClass { + get { + return this.m_phBufGrpClassField; + } + set { + this.m_phBufGrpClassField = value; + } + } + + /// + public decfloat m_defaultSlope { + get { + return this.m_defaultSlopeField; + } + set { + this.m_defaultSlopeField = value; + } + } + + /// + public decfloat m_bufstdRefTemp { + get { + return this.m_bufstdRefTempField; + } + set { + this.m_bufstdRefTempField = value; + } + } + + /// + public EEndpointType m_endpointType { + get { + return this.m_endpointTypeField; + } + set { + this.m_endpointTypeField = value; + } + } + + /// + public EEndpointCriteria m_endpointCriteria { + get { + return this.m_endpointCriteriaField; + } + set { + this.m_endpointCriteriaField = value; + } + } + + /// + public int m_timedEndpointValue { + get { + return this.m_timedEndpointValueField; + } + set { + this.m_timedEndpointValueField = value; + } + } + + /// + public string m_calProcedure { + get { + return this.m_calProcedureField; + } + set { + this.m_calProcedureField = value; + } + } + + /// + public System.DateTime m_calDate { + get { + return this.m_calDateField; + } + set { + this.m_calDateField = value; + } + } + + /// + public string m_calCreator { + get { + return this.m_calCreatorField; + } + set { + this.m_calCreatorField = value; + } + } + + /// + [System.Xml.Serialization.XmlArrayItemAttribute("ArrayOfPHISFETCalPointData")] + public PHISFETCalPointData[] m_sensorCalPoints { + get { + return this.m_sensorCalPointsField; + } + set { + this.m_sensorCalPointsField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + public enum ETemperatureCapture { + + /// + eTemperatureCaptureid_TemperatureCapture_Internal, + + /// + eTemperatureCaptureid_TemperatureCapture_External, + + /// + eTemperatureCaptureid_TemperatureCapture_Manual, + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + public enum EEndpointType { + + /// + eEndpointTypeid_EndpointType_Auto, + + /// + eEndpointTypeid_EndpointType_Manual, + + /// + eEndpointTypeid_EndpointType_Timed, + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + public enum EEndpointCriteria { + + /// + eEndpointCriteriaid_EndpointCriteria_Strict, + + /// + eEndpointCriteriaid_EndpointCriteria_Standard, + + /// + eEndpointCriteriaid_EndpointCriteria_Fast, + + /// + eEndpointCriteriaid_EndpointCriteria_UserDefined, + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class ArrayOfPHISFETCalPointData { + + private PHISFETCalPointData[] arrayOfPHISFETCalPointData1Field; + + /// + [System.Xml.Serialization.XmlElementAttribute("ArrayOfPHISFETCalPointData", IsNullable=true)] + public PHISFETCalPointData[] ArrayOfPHISFETCalPointData1 { + get { + return this.arrayOfPHISFETCalPointData1Field; + } + set { + this.arrayOfPHISFETCalPointData1Field = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class ArrayOfPHISFETSensorCalRecord { + + private PHISFETSensorCalRecord[] arrayOfPHISFETSensorCalRecord1Field; + + /// + [System.Xml.Serialization.XmlElementAttribute("ArrayOfPHISFETSensorCalRecord", IsNullable=true)] + public PHISFETSensorCalRecord[] ArrayOfPHISFETSensorCalRecord1 { + get { + return this.arrayOfPHISFETSensorCalRecord1Field; + } + set { + this.arrayOfPHISFETSensorCalRecord1Field = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class ISFETSensorRecord { + + private string m_uuidField; + + private string m_sensorSerialNumberField; + + private string m_sensorIDField; + + private ESensorClass m_sensorClassField; + + private System.DateTime m_initialOperationDateField; + + private bool m_isObservedField; + + private int numberOfEntriesField; + + private bool m_monitorLifeSpanField; + + private short m_lifeSpanField; + + private System.DateTime m_expiryDateLifeSpanField; + + private bool m_monitorUsableLifeField; + + private System.DateTime m_expiryDateUsableLifeField; + + private ETimeUnit m_usableLifeTimePeriodField; + + private int m_usableLifeField; + + private PHISFETSensorCalRecord[] m_sensorCalHistoryField; + + /// + public string m_uuid { + get { + return this.m_uuidField; + } + set { + this.m_uuidField = value; + } + } + + /// + public string m_sensorSerialNumber { + get { + return this.m_sensorSerialNumberField; + } + set { + this.m_sensorSerialNumberField = value; + } + } + + /// + public string m_sensorID { + get { + return this.m_sensorIDField; + } + set { + this.m_sensorIDField = value; + } + } + + /// + public ESensorClass m_sensorClass { + get { + return this.m_sensorClassField; + } + set { + this.m_sensorClassField = value; + } + } + + /// + public System.DateTime m_initialOperationDate { + get { + return this.m_initialOperationDateField; + } + set { + this.m_initialOperationDateField = value; + } + } + + /// + public bool m_isObserved { + get { + return this.m_isObservedField; + } + set { + this.m_isObservedField = value; + } + } + + /// + public int numberOfEntries { + get { + return this.numberOfEntriesField; + } + set { + this.numberOfEntriesField = value; + } + } + + /// + public bool m_monitorLifeSpan { + get { + return this.m_monitorLifeSpanField; + } + set { + this.m_monitorLifeSpanField = value; + } + } + + /// + public short m_lifeSpan { + get { + return this.m_lifeSpanField; + } + set { + this.m_lifeSpanField = value; + } + } + + /// + public System.DateTime m_expiryDateLifeSpan { + get { + return this.m_expiryDateLifeSpanField; + } + set { + this.m_expiryDateLifeSpanField = value; + } + } + + /// + public bool m_monitorUsableLife { + get { + return this.m_monitorUsableLifeField; + } + set { + this.m_monitorUsableLifeField = value; + } + } + + /// + public System.DateTime m_expiryDateUsableLife { + get { + return this.m_expiryDateUsableLifeField; + } + set { + this.m_expiryDateUsableLifeField = value; + } + } + + /// + public ETimeUnit m_usableLifeTimePeriod { + get { + return this.m_usableLifeTimePeriodField; + } + set { + this.m_usableLifeTimePeriodField = value; + } + } + + /// + public int m_usableLife { + get { + return this.m_usableLifeField; + } + set { + this.m_usableLifeField = value; + } + } + + /// + [System.Xml.Serialization.XmlArrayItemAttribute("ArrayOfPHISFETSensorCalRecord")] + public PHISFETSensorCalRecord[] m_sensorCalHistory { + get { + return this.m_sensorCalHistoryField; + } + set { + this.m_sensorCalHistoryField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class ISESensorRecord { + + private string m_uuidField; + + private string m_sensorSerialNumberField; + + private string m_sensorIDField; + + private ESensorClass m_sensorClassField; + + private System.DateTime m_initialOperationDateField; + + private bool m_isObservedField; + + private int numberOfEntriesField; + + private bool m_monitorLifeSpanField; + + private short m_lifeSpanField; + + private System.DateTime m_expiryDateLifeSpanField; + + private bool m_monitorUsableLifeField; + + private System.DateTime m_expiryDateUsableLifeField; + + private ETimeUnit m_usableLifeTimePeriodField; + + private int m_usableLifeField; + + private EIonType m_ionTypeField; + + private decfloat m_molarMassField; + + private EIonCharge m_ionChargeField; + + private ISESensorCalRecord[] m_sensorCalHistoryField; + + /// + public string m_uuid { + get { + return this.m_uuidField; + } + set { + this.m_uuidField = value; + } + } + + /// + public string m_sensorSerialNumber { + get { + return this.m_sensorSerialNumberField; + } + set { + this.m_sensorSerialNumberField = value; + } + } + + /// + public string m_sensorID { + get { + return this.m_sensorIDField; + } + set { + this.m_sensorIDField = value; + } + } + + /// + public ESensorClass m_sensorClass { + get { + return this.m_sensorClassField; + } + set { + this.m_sensorClassField = value; + } + } + + /// + public System.DateTime m_initialOperationDate { + get { + return this.m_initialOperationDateField; + } + set { + this.m_initialOperationDateField = value; + } + } + + /// + public bool m_isObserved { + get { + return this.m_isObservedField; + } + set { + this.m_isObservedField = value; + } + } + + /// + public int numberOfEntries { + get { + return this.numberOfEntriesField; + } + set { + this.numberOfEntriesField = value; + } + } + + /// + public bool m_monitorLifeSpan { + get { + return this.m_monitorLifeSpanField; + } + set { + this.m_monitorLifeSpanField = value; + } + } + + /// + public short m_lifeSpan { + get { + return this.m_lifeSpanField; + } + set { + this.m_lifeSpanField = value; + } + } + + /// + public System.DateTime m_expiryDateLifeSpan { + get { + return this.m_expiryDateLifeSpanField; + } + set { + this.m_expiryDateLifeSpanField = value; + } + } + + /// + public bool m_monitorUsableLife { + get { + return this.m_monitorUsableLifeField; + } + set { + this.m_monitorUsableLifeField = value; + } + } + + /// + public System.DateTime m_expiryDateUsableLife { + get { + return this.m_expiryDateUsableLifeField; + } + set { + this.m_expiryDateUsableLifeField = value; + } + } + + /// + public ETimeUnit m_usableLifeTimePeriod { + get { + return this.m_usableLifeTimePeriodField; + } + set { + this.m_usableLifeTimePeriodField = value; + } + } + + /// + public int m_usableLife { + get { + return this.m_usableLifeField; + } + set { + this.m_usableLifeField = value; + } + } + + /// + public EIonType m_ionType { + get { + return this.m_ionTypeField; + } + set { + this.m_ionTypeField = value; + } + } + + /// + public decfloat m_molarMass { + get { + return this.m_molarMassField; + } + set { + this.m_molarMassField = value; + } + } + + /// + public EIonCharge m_ionCharge { + get { + return this.m_ionChargeField; + } + set { + this.m_ionChargeField = value; + } + } + + /// + [System.Xml.Serialization.XmlArrayItemAttribute("ArrayOfISESensorCalRecord")] + public ISESensorCalRecord[] m_sensorCalHistory { + get { + return this.m_sensorCalHistoryField; + } + set { + this.m_sensorCalHistoryField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class ISESensorCalRecord { + + private ECommonUnit m_calUnitField; + + private string m_moduleSerialNumberField; + + private ETemperatureCapture m_tempCaptureField; + + private string m_tempSensorIDField; + + private ECalMode m_calModeField; + + private decfloat m_defaultSlopeField; + + private decfloat m_bufstdRefTempField; + + private EEndpointType m_endpointTypeField; + + private EEndpointCriteria m_endpointCriteriaField; + + private int m_timedEndpointValueField; + + private string m_calProcedureField; + + private System.DateTime m_calDateField; + + private string m_calCreatorField; + + private ISECalPointData[] m_sensorCalPointsField; + + /// + public ECommonUnit m_calUnit { + get { + return this.m_calUnitField; + } + set { + this.m_calUnitField = value; + } + } + + /// + public string m_moduleSerialNumber { + get { + return this.m_moduleSerialNumberField; + } + set { + this.m_moduleSerialNumberField = value; + } + } + + /// + public ETemperatureCapture m_tempCapture { + get { + return this.m_tempCaptureField; + } + set { + this.m_tempCaptureField = value; + } + } + + /// + public string m_tempSensorID { + get { + return this.m_tempSensorIDField; + } + set { + this.m_tempSensorIDField = value; + } + } + + /// + public ECalMode m_calMode { + get { + return this.m_calModeField; + } + set { + this.m_calModeField = value; + } + } + + /// + public decfloat m_defaultSlope { + get { + return this.m_defaultSlopeField; + } + set { + this.m_defaultSlopeField = value; + } + } + + /// + public decfloat m_bufstdRefTemp { + get { + return this.m_bufstdRefTempField; + } + set { + this.m_bufstdRefTempField = value; + } + } + + /// + public EEndpointType m_endpointType { + get { + return this.m_endpointTypeField; + } + set { + this.m_endpointTypeField = value; + } + } + + /// + public EEndpointCriteria m_endpointCriteria { + get { + return this.m_endpointCriteriaField; + } + set { + this.m_endpointCriteriaField = value; + } + } + + /// + public int m_timedEndpointValue { + get { + return this.m_timedEndpointValueField; + } + set { + this.m_timedEndpointValueField = value; + } + } + + /// + public string m_calProcedure { + get { + return this.m_calProcedureField; + } + set { + this.m_calProcedureField = value; + } + } + + /// + public System.DateTime m_calDate { + get { + return this.m_calDateField; + } + set { + this.m_calDateField = value; + } + } + + /// + public string m_calCreator { + get { + return this.m_calCreatorField; + } + set { + this.m_calCreatorField = value; + } + } + + /// + [System.Xml.Serialization.XmlArrayItemAttribute("ArrayOfISECalPointData")] + public ISECalPointData[] m_sensorCalPoints { + get { + return this.m_sensorCalPointsField; + } + set { + this.m_sensorCalPointsField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class ArrayOfISECalPointData { + + private ISECalPointData[] arrayOfISECalPointData1Field; + + /// + [System.Xml.Serialization.XmlElementAttribute("ArrayOfISECalPointData", IsNullable=true)] + public ISECalPointData[] ArrayOfISECalPointData1 { + get { + return this.arrayOfISECalPointData1Field; + } + set { + this.arrayOfISECalPointData1Field = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class ArrayOfISESensorCalRecord { + + private ISESensorCalRecord[] arrayOfISESensorCalRecord1Field; + + /// + [System.Xml.Serialization.XmlElementAttribute("ArrayOfISESensorCalRecord", IsNullable=true)] + public ISESensorCalRecord[] ArrayOfISESensorCalRecord1 { + get { + return this.arrayOfISESensorCalRecord1Field; + } + set { + this.arrayOfISESensorCalRecord1Field = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class CondSensorRecord { + + private string m_uuidField; + + private string m_sensorSerialNumberField; + + private string m_sensorIDField; + + private ESensorClass m_sensorClassField; + + private System.DateTime m_initialOperationDateField; + + private bool m_isObservedField; + + private decfloat m_def_cellconstantField; + + private int numberOfEntriesField; + + private bool m_monitorLifeSpanField; + + private short m_lifeSpanField; + + private System.DateTime m_expiryDateLifeSpanField; + + private bool m_monitorUsableLifeField; + + private System.DateTime m_expiryDateUsableLifeField; + + private ETimeUnit m_usableLifeTimePeriodField; + + private int m_usableLifeField; + + private CondSensorCalRecord[] m_sensorCalHistoryField; + + /// + public string m_uuid { + get { + return this.m_uuidField; + } + set { + this.m_uuidField = value; + } + } + + /// + public string m_sensorSerialNumber { + get { + return this.m_sensorSerialNumberField; + } + set { + this.m_sensorSerialNumberField = value; + } + } + + /// + public string m_sensorID { + get { + return this.m_sensorIDField; + } + set { + this.m_sensorIDField = value; + } + } + + /// + public ESensorClass m_sensorClass { + get { + return this.m_sensorClassField; + } + set { + this.m_sensorClassField = value; + } + } + + /// + public System.DateTime m_initialOperationDate { + get { + return this.m_initialOperationDateField; + } + set { + this.m_initialOperationDateField = value; + } + } + + /// + public bool m_isObserved { + get { + return this.m_isObservedField; + } + set { + this.m_isObservedField = value; + } + } + + /// + public decfloat m_def_cellconstant { + get { + return this.m_def_cellconstantField; + } + set { + this.m_def_cellconstantField = value; + } + } + + /// + public int numberOfEntries { + get { + return this.numberOfEntriesField; + } + set { + this.numberOfEntriesField = value; + } + } + + /// + public bool m_monitorLifeSpan { + get { + return this.m_monitorLifeSpanField; + } + set { + this.m_monitorLifeSpanField = value; + } + } + + /// + public short m_lifeSpan { + get { + return this.m_lifeSpanField; + } + set { + this.m_lifeSpanField = value; + } + } + + /// + public System.DateTime m_expiryDateLifeSpan { + get { + return this.m_expiryDateLifeSpanField; + } + set { + this.m_expiryDateLifeSpanField = value; + } + } + + /// + public bool m_monitorUsableLife { + get { + return this.m_monitorUsableLifeField; + } + set { + this.m_monitorUsableLifeField = value; + } + } + + /// + public System.DateTime m_expiryDateUsableLife { + get { + return this.m_expiryDateUsableLifeField; + } + set { + this.m_expiryDateUsableLifeField = value; + } + } + + /// + public ETimeUnit m_usableLifeTimePeriod { + get { + return this.m_usableLifeTimePeriodField; + } + set { + this.m_usableLifeTimePeriodField = value; + } + } + + /// + public int m_usableLife { + get { + return this.m_usableLifeField; + } + set { + this.m_usableLifeField = value; + } + } + + /// + [System.Xml.Serialization.XmlArrayItemAttribute("ArrayOfCondSensorCalRecord")] + public CondSensorCalRecord[] m_sensorCalHistory { + get { + return this.m_sensorCalHistoryField; + } + set { + this.m_sensorCalHistoryField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class CondSensorCalRecord { + + private string m_moduleSerialNumberField; + + private ETemperatureCapture m_tempCaptureField; + + private string m_tempSensorIDField; + + private EEndpointType m_endpointTypeField; + + private EEndpointCriteria m_endpointCriteriaField; + + private int m_timedEndpointValueField; + + private decfloat m_bufstdRefTempField; + + private short m_cndStdClassField; + + private string m_calProcedureField; + + private System.DateTime m_calDateField; + + private string m_calCreatorField; + + private CondCalPointData[] m_sensorCalPointsField; + + /// + public string m_moduleSerialNumber { + get { + return this.m_moduleSerialNumberField; + } + set { + this.m_moduleSerialNumberField = value; + } + } + + /// + public ETemperatureCapture m_tempCapture { + get { + return this.m_tempCaptureField; + } + set { + this.m_tempCaptureField = value; + } + } + + /// + public string m_tempSensorID { + get { + return this.m_tempSensorIDField; + } + set { + this.m_tempSensorIDField = value; + } + } + + /// + public EEndpointType m_endpointType { + get { + return this.m_endpointTypeField; + } + set { + this.m_endpointTypeField = value; + } + } + + /// + public EEndpointCriteria m_endpointCriteria { + get { + return this.m_endpointCriteriaField; + } + set { + this.m_endpointCriteriaField = value; + } + } + + /// + public int m_timedEndpointValue { + get { + return this.m_timedEndpointValueField; + } + set { + this.m_timedEndpointValueField = value; + } + } + + /// + public decfloat m_bufstdRefTemp { + get { + return this.m_bufstdRefTempField; + } + set { + this.m_bufstdRefTempField = value; + } + } + + /// + public short m_cndStdClass { + get { + return this.m_cndStdClassField; + } + set { + this.m_cndStdClassField = value; + } + } + + /// + public string m_calProcedure { + get { + return this.m_calProcedureField; + } + set { + this.m_calProcedureField = value; + } + } + + /// + public System.DateTime m_calDate { + get { + return this.m_calDateField; + } + set { + this.m_calDateField = value; + } + } + + /// + public string m_calCreator { + get { + return this.m_calCreatorField; + } + set { + this.m_calCreatorField = value; + } + } + + /// + [System.Xml.Serialization.XmlArrayItemAttribute("ArrayOfCondCalPointData")] + public CondCalPointData[] m_sensorCalPoints { + get { + return this.m_sensorCalPointsField; + } + set { + this.m_sensorCalPointsField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class ArrayOfCondCalPointData { + + private CondCalPointData[] arrayOfCondCalPointData1Field; + + /// + [System.Xml.Serialization.XmlElementAttribute("ArrayOfCondCalPointData", IsNullable=true)] + public CondCalPointData[] ArrayOfCondCalPointData1 { + get { + return this.arrayOfCondCalPointData1Field; + } + set { + this.arrayOfCondCalPointData1Field = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class ArrayOfCondSensorCalRecord { + + private CondSensorCalRecord[] arrayOfCondSensorCalRecord1Field; + + /// + [System.Xml.Serialization.XmlElementAttribute("ArrayOfCondSensorCalRecord", IsNullable=true)] + public CondSensorCalRecord[] ArrayOfCondSensorCalRecord1 { + get { + return this.arrayOfCondSensorCalRecord1Field; + } + set { + this.arrayOfCondSensorCalRecord1Field = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class DOSensorRecord { + + private string m_uuidField; + + private string m_sensorSerialNumberField; + + private string m_sensorIDField; + + private ESensorClass m_sensorClassField; + + private bool m_monitorLifeSpanField; + + private System.DateTime m_initialOperationDateField; + + private decfloat m_def_slopePercentField; + + private decfloat m_def_offsetField; + + private bool m_isObservedField; + + private int numberOfEntriesField; + + private short m_lifeSpanField; + + private System.DateTime m_expiryDateLifeSpanField; + + private bool m_monitorUsableLifeField; + + private System.DateTime m_expiryDateUsableLifeField; + + private ETimeUnit m_usableLifeTimePeriodField; + + private int m_usableLifeField; + + private int m_capLeftDaysField; + + private DOSensorCalRecord[] m_sensorCalHistoryField; + + /// + public string m_uuid { + get { + return this.m_uuidField; + } + set { + this.m_uuidField = value; + } + } + + /// + public string m_sensorSerialNumber { + get { + return this.m_sensorSerialNumberField; + } + set { + this.m_sensorSerialNumberField = value; + } + } + + /// + public string m_sensorID { + get { + return this.m_sensorIDField; + } + set { + this.m_sensorIDField = value; + } + } + + /// + public ESensorClass m_sensorClass { + get { + return this.m_sensorClassField; + } + set { + this.m_sensorClassField = value; + } + } + + /// + public bool m_monitorLifeSpan { + get { + return this.m_monitorLifeSpanField; + } + set { + this.m_monitorLifeSpanField = value; + } + } + + /// + public System.DateTime m_initialOperationDate { + get { + return this.m_initialOperationDateField; + } + set { + this.m_initialOperationDateField = value; + } + } + + /// + public decfloat m_def_slopePercent { + get { + return this.m_def_slopePercentField; + } + set { + this.m_def_slopePercentField = value; + } + } + + /// + public decfloat m_def_offset { + get { + return this.m_def_offsetField; + } + set { + this.m_def_offsetField = value; + } + } + + /// + public bool m_isObserved { + get { + return this.m_isObservedField; + } + set { + this.m_isObservedField = value; + } + } + + /// + public int numberOfEntries { + get { + return this.numberOfEntriesField; + } + set { + this.numberOfEntriesField = value; + } + } + + /// + public short m_lifeSpan { + get { + return this.m_lifeSpanField; + } + set { + this.m_lifeSpanField = value; + } + } + + /// + public System.DateTime m_expiryDateLifeSpan { + get { + return this.m_expiryDateLifeSpanField; + } + set { + this.m_expiryDateLifeSpanField = value; + } + } + + /// + public bool m_monitorUsableLife { + get { + return this.m_monitorUsableLifeField; + } + set { + this.m_monitorUsableLifeField = value; + } + } + + /// + public System.DateTime m_expiryDateUsableLife { + get { + return this.m_expiryDateUsableLifeField; + } + set { + this.m_expiryDateUsableLifeField = value; + } + } + + /// + public ETimeUnit m_usableLifeTimePeriod { + get { + return this.m_usableLifeTimePeriodField; + } + set { + this.m_usableLifeTimePeriodField = value; + } + } + + /// + public int m_usableLife { + get { + return this.m_usableLifeField; + } + set { + this.m_usableLifeField = value; + } + } + + /// + public int m_capLeftDays { + get { + return this.m_capLeftDaysField; + } + set { + this.m_capLeftDaysField = value; + } + } + + /// + [System.Xml.Serialization.XmlArrayItemAttribute("ArrayOfDOSensorCalRecord")] + public DOSensorCalRecord[] m_sensorCalHistory { + get { + return this.m_sensorCalHistoryField; + } + set { + this.m_sensorCalHistoryField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class DOSensorCalRecord { + + private string m_moduleSerialNumberField; + + private ETemperatureCapture m_tempCaptureField; + + private string m_tempSensorIDField; + + private EBarometricCapture m_barCaptureField; + + private decfloat m_salCorrectionFactorField; + + private decfloat m_slopePercentField; + + private decfloat m_offsetField; + + private EEndpointType m_endpointTypeField; + + private EEndpointCriteria m_endpointCriteriaField; + + private int m_timedEndpointValueField; + + private string m_calProcedureField; + + private System.DateTime m_calDateField; + + private string m_calCreatorField; + + private DOCalPointData[] m_sensorCalPointsField; + + /// + public string m_moduleSerialNumber { + get { + return this.m_moduleSerialNumberField; + } + set { + this.m_moduleSerialNumberField = value; + } + } + + /// + public ETemperatureCapture m_tempCapture { + get { + return this.m_tempCaptureField; + } + set { + this.m_tempCaptureField = value; + } + } + + /// + public string m_tempSensorID { + get { + return this.m_tempSensorIDField; + } + set { + this.m_tempSensorIDField = value; + } + } + + /// + public EBarometricCapture m_barCapture { + get { + return this.m_barCaptureField; + } + set { + this.m_barCaptureField = value; + } + } + + /// + public decfloat m_salCorrectionFactor { + get { + return this.m_salCorrectionFactorField; + } + set { + this.m_salCorrectionFactorField = value; + } + } + + /// + public decfloat m_slopePercent { + get { + return this.m_slopePercentField; + } + set { + this.m_slopePercentField = value; + } + } + + /// + public decfloat m_offset { + get { + return this.m_offsetField; + } + set { + this.m_offsetField = value; + } + } + + /// + public EEndpointType m_endpointType { + get { + return this.m_endpointTypeField; + } + set { + this.m_endpointTypeField = value; + } + } + + /// + public EEndpointCriteria m_endpointCriteria { + get { + return this.m_endpointCriteriaField; + } + set { + this.m_endpointCriteriaField = value; + } + } + + /// + public int m_timedEndpointValue { + get { + return this.m_timedEndpointValueField; + } + set { + this.m_timedEndpointValueField = value; + } + } + + /// + public string m_calProcedure { + get { + return this.m_calProcedureField; + } + set { + this.m_calProcedureField = value; + } + } + + /// + public System.DateTime m_calDate { + get { + return this.m_calDateField; + } + set { + this.m_calDateField = value; + } + } + + /// + public string m_calCreator { + get { + return this.m_calCreatorField; + } + set { + this.m_calCreatorField = value; + } + } + + /// + [System.Xml.Serialization.XmlArrayItemAttribute("ArrayOfDOCalPointData")] + public DOCalPointData[] m_sensorCalPoints { + get { + return this.m_sensorCalPointsField; + } + set { + this.m_sensorCalPointsField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + public enum EBarometricCapture { + + /// + eBarometricCaptureid_BarometricCapture_Auto, + + /// + eBarometricCaptureid_BarometricCapture_Manual, + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class ArrayOfDOCalPointData { + + private DOCalPointData[] arrayOfDOCalPointData1Field; + + /// + [System.Xml.Serialization.XmlElementAttribute("ArrayOfDOCalPointData", IsNullable=true)] + public DOCalPointData[] ArrayOfDOCalPointData1 { + get { + return this.arrayOfDOCalPointData1Field; + } + set { + this.arrayOfDOCalPointData1Field = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class ArrayOfDOSensorCalRecord { + + private DOSensorCalRecord[] arrayOfDOSensorCalRecord1Field; + + /// + [System.Xml.Serialization.XmlElementAttribute("ArrayOfDOSensorCalRecord", IsNullable=true)] + public DOSensorCalRecord[] ArrayOfDOSensorCalRecord1 { + get { + return this.arrayOfDOSensorCalRecord1Field; + } + set { + this.arrayOfDOSensorCalRecord1Field = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class TempSensorRecord { + + private string m_uuidField; + + private string m_sensorSerialNumberField; + + private string m_sensorIDField; + + private ETempSignalType m_tempSignalField; + + private ESensorClass m_sensorClassField; + + private System.DateTime m_initialOperationDateField; + + private bool m_isObservedField; + + private int numberOfEntriesField; + + private bool m_monitorLifeSpanField; + + private short m_lifeSpanField; + + private System.DateTime m_expiryDateLifeSpanField; + + private bool m_monitorUsableLifeField; + + private System.DateTime m_expiryDateUsableLifeField; + + private ETimeUnit m_usableLifeTimePeriodField; + + private int m_usableLifeField; + + private TempSensorCalRecord[] m_sensorCalHistoryField; + + /// + public string m_uuid { + get { + return this.m_uuidField; + } + set { + this.m_uuidField = value; + } + } + + /// + public string m_sensorSerialNumber { + get { + return this.m_sensorSerialNumberField; + } + set { + this.m_sensorSerialNumberField = value; + } + } + + /// + public string m_sensorID { + get { + return this.m_sensorIDField; + } + set { + this.m_sensorIDField = value; + } + } + + /// + public ETempSignalType m_tempSignal { + get { + return this.m_tempSignalField; + } + set { + this.m_tempSignalField = value; + } + } + + /// + public ESensorClass m_sensorClass { + get { + return this.m_sensorClassField; + } + set { + this.m_sensorClassField = value; + } + } + + /// + public System.DateTime m_initialOperationDate { + get { + return this.m_initialOperationDateField; + } + set { + this.m_initialOperationDateField = value; + } + } + + /// + public bool m_isObserved { + get { + return this.m_isObservedField; + } + set { + this.m_isObservedField = value; + } + } + + /// + public int numberOfEntries { + get { + return this.numberOfEntriesField; + } + set { + this.numberOfEntriesField = value; + } + } + + /// + public bool m_monitorLifeSpan { + get { + return this.m_monitorLifeSpanField; + } + set { + this.m_monitorLifeSpanField = value; + } + } + + /// + public short m_lifeSpan { + get { + return this.m_lifeSpanField; + } + set { + this.m_lifeSpanField = value; + } + } + + /// + public System.DateTime m_expiryDateLifeSpan { + get { + return this.m_expiryDateLifeSpanField; + } + set { + this.m_expiryDateLifeSpanField = value; + } + } + + /// + public bool m_monitorUsableLife { + get { + return this.m_monitorUsableLifeField; + } + set { + this.m_monitorUsableLifeField = value; + } + } + + /// + public System.DateTime m_expiryDateUsableLife { + get { + return this.m_expiryDateUsableLifeField; + } + set { + this.m_expiryDateUsableLifeField = value; + } + } + + /// + public ETimeUnit m_usableLifeTimePeriod { + get { + return this.m_usableLifeTimePeriodField; + } + set { + this.m_usableLifeTimePeriodField = value; + } + } + + /// + public int m_usableLife { + get { + return this.m_usableLifeField; + } + set { + this.m_usableLifeField = value; + } + } + + /// + [System.Xml.Serialization.XmlArrayItemAttribute("ArrayOfTempSensorCalRecord")] + public TempSensorCalRecord[] m_sensorCalHistory { + get { + return this.m_sensorCalHistoryField; + } + set { + this.m_sensorCalHistoryField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + public enum ETempSignalType { + + /// + eTempSignalTypeid_TempSignalType_NTC30KOM, + + /// + eTempSignalTypeid_TempSignalType_PT1000, + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class TempSensorCalRecord { + + private string m_calProcedureField; + + private System.DateTime m_calDateField; + + private string m_calCreatorField; + + private TempCalPointData[] m_sensorCalPointsField; + + /// + public string m_calProcedure { + get { + return this.m_calProcedureField; + } + set { + this.m_calProcedureField = value; + } + } + + /// + public System.DateTime m_calDate { + get { + return this.m_calDateField; + } + set { + this.m_calDateField = value; + } + } + + /// + public string m_calCreator { + get { + return this.m_calCreatorField; + } + set { + this.m_calCreatorField = value; + } + } + + /// + [System.Xml.Serialization.XmlArrayItemAttribute("ArrayOfTempCalPointData")] + public TempCalPointData[] m_sensorCalPoints { + get { + return this.m_sensorCalPointsField; + } + set { + this.m_sensorCalPointsField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class TempCalPointData { + + private decfloat m_measuredValueField; + + private decfloat m_adjustedValueField; + + /// + public decfloat m_measuredValue { + get { + return this.m_measuredValueField; + } + set { + this.m_measuredValueField = value; + } + } + + /// + public decfloat m_adjustedValue { + get { + return this.m_adjustedValueField; + } + set { + this.m_adjustedValueField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class ArrayOfTempCalPointData { + + private TempCalPointData[] arrayOfTempCalPointData1Field; + + /// + [System.Xml.Serialization.XmlElementAttribute("ArrayOfTempCalPointData", IsNullable=true)] + public TempCalPointData[] ArrayOfTempCalPointData1 { + get { + return this.arrayOfTempCalPointData1Field; + } + set { + this.arrayOfTempCalPointData1Field = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class ArrayOfTempSensorCalRecord { + + private TempSensorCalRecord[] arrayOfTempSensorCalRecord1Field; + + /// + [System.Xml.Serialization.XmlElementAttribute("ArrayOfTempSensorCalRecord", IsNullable=true)] + public TempSensorCalRecord[] ArrayOfTempSensorCalRecord1 { + get { + return this.arrayOfTempSensorCalRecord1Field; + } + set { + this.arrayOfTempSensorCalRecord1Field = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class RedoxSensorRecord { + + private string m_uuidField; + + private string m_sensorSerialNumberField; + + private string m_sensorIDField; + + private ESensorClass m_sensorClassField; + + private System.DateTime m_initialOperationDateField; + + private bool m_isObservedField; + + private int numberOfEntriesField; + + private string resource_name_1Field; + + private bool m_monitorLifeSpanField; + + private short m_lifeSpanField; + + private System.DateTime m_expiryDateLifeSpanField; + + private string resource_name_2Field; + + private bool m_monitorUsableLifeField; + + private System.DateTime m_expiryDateUsableLifeField; + + private ETimeUnit m_usableLifeTimePeriodField; + + private int m_usableLifeField; + + /// + public string m_uuid { + get { + return this.m_uuidField; + } + set { + this.m_uuidField = value; + } + } + + /// + public string m_sensorSerialNumber { + get { + return this.m_sensorSerialNumberField; + } + set { + this.m_sensorSerialNumberField = value; + } + } + + /// + public string m_sensorID { + get { + return this.m_sensorIDField; + } + set { + this.m_sensorIDField = value; + } + } + + /// + public ESensorClass m_sensorClass { + get { + return this.m_sensorClassField; + } + set { + this.m_sensorClassField = value; + } + } + + /// + public System.DateTime m_initialOperationDate { + get { + return this.m_initialOperationDateField; + } + set { + this.m_initialOperationDateField = value; + } + } + + /// + public bool m_isObserved { + get { + return this.m_isObservedField; + } + set { + this.m_isObservedField = value; + } + } + + /// + public int numberOfEntries { + get { + return this.numberOfEntriesField; + } + set { + this.numberOfEntriesField = value; + } + } + + /// + public string resource_name_1 { + get { + return this.resource_name_1Field; + } + set { + this.resource_name_1Field = value; + } + } + + /// + public bool m_monitorLifeSpan { + get { + return this.m_monitorLifeSpanField; + } + set { + this.m_monitorLifeSpanField = value; + } + } + + /// + public short m_lifeSpan { + get { + return this.m_lifeSpanField; + } + set { + this.m_lifeSpanField = value; + } + } + + /// + public System.DateTime m_expiryDateLifeSpan { + get { + return this.m_expiryDateLifeSpanField; + } + set { + this.m_expiryDateLifeSpanField = value; + } + } + + /// + public string resource_name_2 { + get { + return this.resource_name_2Field; + } + set { + this.resource_name_2Field = value; + } + } + + /// + public bool m_monitorUsableLife { + get { + return this.m_monitorUsableLifeField; + } + set { + this.m_monitorUsableLifeField = value; + } + } + + /// + public System.DateTime m_expiryDateUsableLife { + get { + return this.m_expiryDateUsableLifeField; + } + set { + this.m_expiryDateUsableLifeField = value; + } + } + + /// + public ETimeUnit m_usableLifeTimePeriod { + get { + return this.m_usableLifeTimePeriodField; + } + set { + this.m_usableLifeTimePeriodField = value; + } + } + + /// + public int m_usableLife { + get { + return this.m_usableLifeField; + } + set { + this.m_usableLifeField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class SensorAdjustParaHistory { + + private SensorAdjustParameters[] adjustParaHistoryField; + + /// + [System.Xml.Serialization.XmlArrayItemAttribute("ArrayOfSensorAdjustParameters")] + public SensorAdjustParameters[] adjustParaHistory { + get { + return this.adjustParaHistoryField; + } + set { + this.adjustParaHistoryField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class SensorAdjustParameters { + + private SensorAdjustParameter[] adjustParametersField; + + /// + [System.Xml.Serialization.XmlArrayItemAttribute("ArrayOfSensorAdjustParameter")] + public SensorAdjustParameter[] adjustParameters { + get { + return this.adjustParametersField; + } + set { + this.adjustParametersField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class ArrayOfSensorAdjustParameter { + + private SensorAdjustParameter[] arrayOfSensorAdjustParameter1Field; + + /// + [System.Xml.Serialization.XmlElementAttribute("ArrayOfSensorAdjustParameter", IsNullable=true)] + public SensorAdjustParameter[] ArrayOfSensorAdjustParameter1 { + get { + return this.arrayOfSensorAdjustParameter1Field; + } + set { + this.arrayOfSensorAdjustParameter1Field = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class ArrayOfSensorAdjustParameters { + + private SensorAdjustParameters[] arrayOfSensorAdjustParameters1Field; + + /// + [System.Xml.Serialization.XmlElementAttribute("ArrayOfSensorAdjustParameters", IsNullable=true)] + public SensorAdjustParameters[] ArrayOfSensorAdjustParameters1 { + get { + return this.arrayOfSensorAdjustParameters1Field; + } + set { + this.arrayOfSensorAdjustParameters1Field = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class BasicSensorInfoForMeasure { + + private ESensorType sensorTypeField; + + private string sensorUuidField; + + private string sensorIDField; + + private ESensorClass sensorClassField; + + private System.DateTime calDateField; + + private string calCreatorField; + + /// + public ESensorType sensorType { + get { + return this.sensorTypeField; + } + set { + this.sensorTypeField = value; + } + } + + /// + public string sensorUuid { + get { + return this.sensorUuidField; + } + set { + this.sensorUuidField = value; + } + } + + /// + public string sensorID { + get { + return this.sensorIDField; + } + set { + this.sensorIDField = value; + } + } + + /// + public ESensorClass sensorClass { + get { + return this.sensorClassField; + } + set { + this.sensorClassField = value; + } + } + + /// + public System.DateTime calDate { + get { + return this.calDateField; + } + set { + this.calDateField = value; + } + } + + /// + public string calCreator { + get { + return this.calCreatorField; + } + set { + this.calCreatorField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + public enum ESensorType { + + /// + eSensorTypeid_SensorType_PH, + + /// + eSensorTypeid_SensorType_Redox, + + /// + eSensorTypeid_SensorType_ISFET, + + /// + eSensorTypeid_SensorType_Cond, + + /// + eSensorTypeid_SensorType_ISE, + + /// + eSensorTypeid_SensorType_DO, + + /// + eSensorTypeid_SensorType_Temp, + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class PHSensorRecordUnits { + + private ECommonUnit slopeUnitField; + + private ECommonUnit slopePercentUnitField; + + private ECommonUnit offsetUnitField; + + private ECommonUnit bufRefTempUnitField; + + private ECommonUnit timedEndpointValueUnitField; + + private ECommonUnit bufferUnitField; + + private ECommonUnit actualValueUnitField; + + private ECommonUnit rawValueUnitField; + + private ECommonUnit temperatureUnitField; + + /// + public ECommonUnit slopeUnit { + get { + return this.slopeUnitField; + } + set { + this.slopeUnitField = value; + } + } + + /// + public ECommonUnit slopePercentUnit { + get { + return this.slopePercentUnitField; + } + set { + this.slopePercentUnitField = value; + } + } + + /// + public ECommonUnit offsetUnit { + get { + return this.offsetUnitField; + } + set { + this.offsetUnitField = value; + } + } + + /// + public ECommonUnit bufRefTempUnit { + get { + return this.bufRefTempUnitField; + } + set { + this.bufRefTempUnitField = value; + } + } + + /// + public ECommonUnit timedEndpointValueUnit { + get { + return this.timedEndpointValueUnitField; + } + set { + this.timedEndpointValueUnitField = value; + } + } + + /// + public ECommonUnit bufferUnit { + get { + return this.bufferUnitField; + } + set { + this.bufferUnitField = value; + } + } + + /// + public ECommonUnit actualValueUnit { + get { + return this.actualValueUnitField; + } + set { + this.actualValueUnitField = value; + } + } + + /// + public ECommonUnit rawValueUnit { + get { + return this.rawValueUnitField; + } + set { + this.rawValueUnitField = value; + } + } + + /// + public ECommonUnit temperatureUnit { + get { + return this.temperatureUnitField; + } + set { + this.temperatureUnitField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class PHAnalogISMDataRecord { + + private PHSensorRecord sensorRecordField; + + private PHSensorRecordUnits sensorRecordUnitsField; + + private SensorAdjustParameters[] sensorAdjustParaHistoriesField; + + private string sensorDescriptionField; + + private string sensorPartNumField; + + private MTValue productSlopeField; + + private MTValue zeroPointField; + + private MTValue membraneResField; + + private MTValue responseTimeField; + + private MTValue tempToleranceField; + + private CommonISMStatistics commonStatisticsField; + + private EModuleID moduleIDField; + + /// + public PHSensorRecord sensorRecord { + get { + return this.sensorRecordField; + } + set { + this.sensorRecordField = value; + } + } + + /// + public PHSensorRecordUnits sensorRecordUnits { + get { + return this.sensorRecordUnitsField; + } + set { + this.sensorRecordUnitsField = value; + } + } + + /// + [System.Xml.Serialization.XmlArrayItemAttribute("ArrayOfSensorAdjustParameters")] + public SensorAdjustParameters[] sensorAdjustParaHistories { + get { + return this.sensorAdjustParaHistoriesField; + } + set { + this.sensorAdjustParaHistoriesField = value; + } + } + + /// + public string sensorDescription { + get { + return this.sensorDescriptionField; + } + set { + this.sensorDescriptionField = value; + } + } + + /// + public string sensorPartNum { + get { + return this.sensorPartNumField; + } + set { + this.sensorPartNumField = value; + } + } + + /// + public MTValue productSlope { + get { + return this.productSlopeField; + } + set { + this.productSlopeField = value; + } + } + + /// + public MTValue zeroPoint { + get { + return this.zeroPointField; + } + set { + this.zeroPointField = value; + } + } + + /// + public MTValue membraneRes { + get { + return this.membraneResField; + } + set { + this.membraneResField = value; + } + } + + /// + public MTValue responseTime { + get { + return this.responseTimeField; + } + set { + this.responseTimeField = value; + } + } + + /// + public MTValue tempTolerance { + get { + return this.tempToleranceField; + } + set { + this.tempToleranceField = value; + } + } + + /// + public CommonISMStatistics commonStatistics { + get { + return this.commonStatisticsField; + } + set { + this.commonStatisticsField = value; + } + } + + /// + public EModuleID moduleID { + get { + return this.moduleIDField; + } + set { + this.moduleIDField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class CommonISMStatistics { + + private MTValue maxTempValueField; + + private System.DateTime maxTempDateField; + + /// + public MTValue maxTempValue { + get { + return this.maxTempValueField; + } + set { + this.maxTempValueField = value; + } + } + + /// + public System.DateTime maxTempDate { + get { + return this.maxTempDateField; + } + set { + this.maxTempDateField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + public enum EModuleID { + + /// + eModuleIDid_ModuleID_ModuleA, + + /// + eModuleIDid_ModuleID_ModuleB, + + /// + eModuleIDid_ModuleID_ModuleC, + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class PHDigitalISMDataRecord { + + private PHSensorRecord sensorRecordField; + + private PHSensorRecordUnits sensorRecordUnitsField; + + private SensorAdjustParameters[] sensorAdjustParaHistoriesField; + + private PHDigitalISMStatistics statisticsField; + + private MTValue membraneResField; + + private MTValue diaphragmResField; + + private EModuleID moduleIDField; + + /// + public PHSensorRecord sensorRecord { + get { + return this.sensorRecordField; + } + set { + this.sensorRecordField = value; + } + } + + /// + public PHSensorRecordUnits sensorRecordUnits { + get { + return this.sensorRecordUnitsField; + } + set { + this.sensorRecordUnitsField = value; + } + } + + /// + [System.Xml.Serialization.XmlArrayItemAttribute("ArrayOfSensorAdjustParameters")] + public SensorAdjustParameters[] sensorAdjustParaHistories { + get { + return this.sensorAdjustParaHistoriesField; + } + set { + this.sensorAdjustParaHistoriesField = value; + } + } + + /// + public PHDigitalISMStatistics statistics { + get { + return this.statisticsField; + } + set { + this.statisticsField = value; + } + } + + /// + public MTValue membraneRes { + get { + return this.membraneResField; + } + set { + this.membraneResField = value; + } + } + + /// + public MTValue diaphragmRes { + get { + return this.diaphragmResField; + } + set { + this.diaphragmResField = value; + } + } + + /// + public EModuleID moduleID { + get { + return this.moduleIDField; + } + set { + this.moduleIDField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class PHDigitalISMStatistics { + + private CommonISMStatistics commonStatisticsField; + + private MTValue measurementTimeField; + + private MTValue averageTempField; + + private MTValue averagePHField; + + private MTValue maxPHValueField; + + private System.DateTime maxPHDateField; + + private MTValue minPHValueField; + + private System.DateTime minPHDateField; + + /// + public CommonISMStatistics commonStatistics { + get { + return this.commonStatisticsField; + } + set { + this.commonStatisticsField = value; + } + } + + /// + public MTValue measurementTime { + get { + return this.measurementTimeField; + } + set { + this.measurementTimeField = value; + } + } + + /// + public MTValue averageTemp { + get { + return this.averageTempField; + } + set { + this.averageTempField = value; + } + } + + /// + public MTValue averagePH { + get { + return this.averagePHField; + } + set { + this.averagePHField = value; + } + } + + /// + public MTValue maxPHValue { + get { + return this.maxPHValueField; + } + set { + this.maxPHValueField = value; + } + } + + /// + public System.DateTime maxPHDate { + get { + return this.maxPHDateField; + } + set { + this.maxPHDateField = value; + } + } + + /// + public MTValue minPHValue { + get { + return this.minPHValueField; + } + set { + this.minPHValueField = value; + } + } + + /// + public System.DateTime minPHDate { + get { + return this.minPHDateField; + } + set { + this.minPHDateField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class CondSensorRecordUnits { + + private ECommonUnit cellConstantUnitField; + + private ECommonUnit bufRefTempUnitField; + + private ECommonUnit timedEndpointValueUnitField; + + private ECommonUnit rawValueUnitField; + + private ECommonUnit temperatureUnitField; + + /// + public ECommonUnit cellConstantUnit { + get { + return this.cellConstantUnitField; + } + set { + this.cellConstantUnitField = value; + } + } + + /// + public ECommonUnit bufRefTempUnit { + get { + return this.bufRefTempUnitField; + } + set { + this.bufRefTempUnitField = value; + } + } + + /// + public ECommonUnit timedEndpointValueUnit { + get { + return this.timedEndpointValueUnitField; + } + set { + this.timedEndpointValueUnitField = value; + } + } + + /// + public ECommonUnit rawValueUnit { + get { + return this.rawValueUnitField; + } + set { + this.rawValueUnitField = value; + } + } + + /// + public ECommonUnit temperatureUnit { + get { + return this.temperatureUnitField; + } + set { + this.temperatureUnitField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class CondAnalogISMDataRecord { + + private CondSensorRecord sensorRecordField; + + private CondSensorRecordUnits sensorRecordUnitsField; + + private string sensorDescriptionField; + + private string sensorPartNumField; + + private MTValue cellConstantField; + + private MTValue ccToleranceField; + + private MTValue responseTimeField; + + private MTValue tempToleranceField; + + private CommonISMStatistics commonStatisticsField; + + private EModuleID moduleIDField; + + /// + public CondSensorRecord sensorRecord { + get { + return this.sensorRecordField; + } + set { + this.sensorRecordField = value; + } + } + + /// + public CondSensorRecordUnits sensorRecordUnits { + get { + return this.sensorRecordUnitsField; + } + set { + this.sensorRecordUnitsField = value; + } + } + + /// + public string sensorDescription { + get { + return this.sensorDescriptionField; + } + set { + this.sensorDescriptionField = value; + } + } + + /// + public string sensorPartNum { + get { + return this.sensorPartNumField; + } + set { + this.sensorPartNumField = value; + } + } + + /// + public MTValue cellConstant { + get { + return this.cellConstantField; + } + set { + this.cellConstantField = value; + } + } + + /// + public MTValue ccTolerance { + get { + return this.ccToleranceField; + } + set { + this.ccToleranceField = value; + } + } + + /// + public MTValue responseTime { + get { + return this.responseTimeField; + } + set { + this.responseTimeField = value; + } + } + + /// + public MTValue tempTolerance { + get { + return this.tempToleranceField; + } + set { + this.tempToleranceField = value; + } + } + + /// + public CommonISMStatistics commonStatistics { + get { + return this.commonStatisticsField; + } + set { + this.commonStatisticsField = value; + } + } + + /// + public EModuleID moduleID { + get { + return this.moduleIDField; + } + set { + this.moduleIDField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class CondDigitalISMDataRecord { + + private CondSensorRecord sensorRecordField; + + private CondSensorRecordUnits sensorRecordUnitsField; + + private CommonISMStatistics commonStatisticsField; + + private EModuleID moduleIDField; + + /// + public CondSensorRecord sensorRecord { + get { + return this.sensorRecordField; + } + set { + this.sensorRecordField = value; + } + } + + /// + public CondSensorRecordUnits sensorRecordUnits { + get { + return this.sensorRecordUnitsField; + } + set { + this.sensorRecordUnitsField = value; + } + } + + /// + public CommonISMStatistics commonStatistics { + get { + return this.commonStatisticsField; + } + set { + this.commonStatisticsField = value; + } + } + + /// + public EModuleID moduleID { + get { + return this.moduleIDField; + } + set { + this.moduleIDField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class DOSensorRecordUnits { + + private ECommonUnit slopeUnitField; + + private ECommonUnit slopePercentUnitField; + + private ECommonUnit offsetUnitField; + + private ECommonUnit bufRefTempUnitField; + + private ECommonUnit timedEndpointValueUnitField; + + private ECommonUnit rawValueUnitField; + + private ECommonUnit temperatureUnitField; + + private ECommonUnit pressureUnitField; + + /// + public ECommonUnit slopeUnit { + get { + return this.slopeUnitField; + } + set { + this.slopeUnitField = value; + } + } + + /// + public ECommonUnit slopePercentUnit { + get { + return this.slopePercentUnitField; + } + set { + this.slopePercentUnitField = value; + } + } + + /// + public ECommonUnit offsetUnit { + get { + return this.offsetUnitField; + } + set { + this.offsetUnitField = value; + } + } + + /// + public ECommonUnit bufRefTempUnit { + get { + return this.bufRefTempUnitField; + } + set { + this.bufRefTempUnitField = value; + } + } + + /// + public ECommonUnit timedEndpointValueUnit { + get { + return this.timedEndpointValueUnitField; + } + set { + this.timedEndpointValueUnitField = value; + } + } + + /// + public ECommonUnit rawValueUnit { + get { + return this.rawValueUnitField; + } + set { + this.rawValueUnitField = value; + } + } + + /// + public ECommonUnit temperatureUnit { + get { + return this.temperatureUnitField; + } + set { + this.temperatureUnitField = value; + } + } + + /// + public ECommonUnit pressureUnit { + get { + return this.pressureUnitField; + } + set { + this.pressureUnitField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class DOAnalogISMDataRecord { + + private DOSensorRecord sensorRecordField; + + private DOSensorRecordUnits sensorRecordUnitsField; + + private SensorAdjustParameters[] sensorAdjustParaHistoriesField; + + private string sensorDescriptionField; + + private string sensorPartNumField; + + private MTValue airCurrentField; + + private MTValue zeroCurrentField; + + private MTValue responseTimeField; + + private CommonISMStatistics commonStatisticsField; + + private System.DateTime oxygenMembraneDateField; + + private EModuleID moduleIDField; + + /// + public DOSensorRecord sensorRecord { + get { + return this.sensorRecordField; + } + set { + this.sensorRecordField = value; + } + } + + /// + public DOSensorRecordUnits sensorRecordUnits { + get { + return this.sensorRecordUnitsField; + } + set { + this.sensorRecordUnitsField = value; + } + } + + /// + [System.Xml.Serialization.XmlArrayItemAttribute("ArrayOfSensorAdjustParameters")] + public SensorAdjustParameters[] sensorAdjustParaHistories { + get { + return this.sensorAdjustParaHistoriesField; + } + set { + this.sensorAdjustParaHistoriesField = value; + } + } + + /// + public string sensorDescription { + get { + return this.sensorDescriptionField; + } + set { + this.sensorDescriptionField = value; + } + } + + /// + public string sensorPartNum { + get { + return this.sensorPartNumField; + } + set { + this.sensorPartNumField = value; + } + } + + /// + public MTValue airCurrent { + get { + return this.airCurrentField; + } + set { + this.airCurrentField = value; + } + } + + /// + public MTValue zeroCurrent { + get { + return this.zeroCurrentField; + } + set { + this.zeroCurrentField = value; + } + } + + /// + public MTValue responseTime { + get { + return this.responseTimeField; + } + set { + this.responseTimeField = value; + } + } + + /// + public CommonISMStatistics commonStatistics { + get { + return this.commonStatisticsField; + } + set { + this.commonStatisticsField = value; + } + } + + /// + public System.DateTime oxygenMembraneDate { + get { + return this.oxygenMembraneDateField; + } + set { + this.oxygenMembraneDateField = value; + } + } + + /// + public EModuleID moduleID { + get { + return this.moduleIDField; + } + set { + this.moduleIDField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class DODigitalISMDataRecord { + + private DOSensorRecord sensorRecordField; + + private DOSensorRecordUnits sensorRecordUnitsField; + + private SensorAdjustParameters[] sensorAdjustParaHistoriesField; + + private CommonISMStatistics commonStatisticsField; + + private System.DateTime sensorCapFirstUsedDateField; + + private System.DateTime sensorCapExpiryDateField; + + private EModuleID moduleIDField; + + /// + public DOSensorRecord sensorRecord { + get { + return this.sensorRecordField; + } + set { + this.sensorRecordField = value; + } + } + + /// + public DOSensorRecordUnits sensorRecordUnits { + get { + return this.sensorRecordUnitsField; + } + set { + this.sensorRecordUnitsField = value; + } + } + + /// + [System.Xml.Serialization.XmlArrayItemAttribute("ArrayOfSensorAdjustParameters")] + public SensorAdjustParameters[] sensorAdjustParaHistories { + get { + return this.sensorAdjustParaHistoriesField; + } + set { + this.sensorAdjustParaHistoriesField = value; + } + } + + /// + public CommonISMStatistics commonStatistics { + get { + return this.commonStatisticsField; + } + set { + this.commonStatisticsField = value; + } + } + + /// + public System.DateTime sensorCapFirstUsedDate { + get { + return this.sensorCapFirstUsedDateField; + } + set { + this.sensorCapFirstUsedDateField = value; + } + } + + /// + public System.DateTime sensorCapExpiryDate { + get { + return this.sensorCapExpiryDateField; + } + set { + this.sensorCapExpiryDateField = value; + } + } + + /// + public EModuleID moduleID { + get { + return this.moduleIDField; + } + set { + this.moduleIDField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class CommonISMEditableParameters { + + private string m_sensorIDField; + + private bool m_monitorLifeSpanField; + + private int m_lifeSpanField; + + private bool m_monitorUsableLifeField; + + private short m_usableLifeTimePeriodField; + + private int m_usableLifeField; + + private System.DateTime m_initialOperationDateField; + + /// + public string m_sensorID { + get { + return this.m_sensorIDField; + } + set { + this.m_sensorIDField = value; + } + } + + /// + public bool m_monitorLifeSpan { + get { + return this.m_monitorLifeSpanField; + } + set { + this.m_monitorLifeSpanField = value; + } + } + + /// + public int m_lifeSpan { + get { + return this.m_lifeSpanField; + } + set { + this.m_lifeSpanField = value; + } + } + + /// + public bool m_monitorUsableLife { + get { + return this.m_monitorUsableLifeField; + } + set { + this.m_monitorUsableLifeField = value; + } + } + + /// + public short m_usableLifeTimePeriod { + get { + return this.m_usableLifeTimePeriodField; + } + set { + this.m_usableLifeTimePeriodField = value; + } + } + + /// + public int m_usableLife { + get { + return this.m_usableLifeField; + } + set { + this.m_usableLifeField = value; + } + } + + /// + public System.DateTime m_initialOperationDate { + get { + return this.m_initialOperationDateField; + } + set { + this.m_initialOperationDateField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class CommonISMUpdateRecord { + + private string m_sensorUUIDField; + + private EModuleID m_moduleIDField; + + private CommonISMEditableParameters m_editedParametersField; + + /// + public string m_sensorUUID { + get { + return this.m_sensorUUIDField; + } + set { + this.m_sensorUUIDField = value; + } + } + + /// + public EModuleID m_moduleID { + get { + return this.m_moduleIDField; + } + set { + this.m_moduleIDField = value; + } + } + + /// + public CommonISMEditableParameters m_editedParameters { + get { + return this.m_editedParametersField; + } + set { + this.m_editedParametersField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class DOAnalogUpdateRecord { + + private CommonISMUpdateRecord m_commonParametersField; + + private System.DateTime oxygenMembraneDateField; + + /// + public CommonISMUpdateRecord m_commonParameters { + get { + return this.m_commonParametersField; + } + set { + this.m_commonParametersField = value; + } + } + + /// + public System.DateTime oxygenMembraneDate { + get { + return this.oxygenMembraneDateField; + } + set { + this.oxygenMembraneDateField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class PHSensorCalUpdateRecord { + + private string m_sensorUUIDField; + + private EModuleID moduleIDField; + + private PHISFETSensorCalRecord m_sensorCalRecordField; + + /// + public string m_sensorUUID { + get { + return this.m_sensorUUIDField; + } + set { + this.m_sensorUUIDField = value; + } + } + + /// + public EModuleID moduleID { + get { + return this.moduleIDField; + } + set { + this.moduleIDField = value; + } + } + + /// + public PHISFETSensorCalRecord m_sensorCalRecord { + get { + return this.m_sensorCalRecordField; + } + set { + this.m_sensorCalRecordField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class CondSensorCalUpdateRecord { + + private string m_sensorUUIDField; + + private EModuleID moduleIDField; + + private CondSensorCalRecord m_sensorCalRecordField; + + /// + public string m_sensorUUID { + get { + return this.m_sensorUUIDField; + } + set { + this.m_sensorUUIDField = value; + } + } + + /// + public EModuleID moduleID { + get { + return this.moduleIDField; + } + set { + this.moduleIDField = value; + } + } + + /// + public CondSensorCalRecord m_sensorCalRecord { + get { + return this.m_sensorCalRecordField; + } + set { + this.m_sensorCalRecordField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class DOSensorCalUpdateRecord { + + private string m_sensorUUIDField; + + private EModuleID moduleIDField; + + private DOSensorCalRecord m_sensorCalRecordField; + + /// + public string m_sensorUUID { + get { + return this.m_sensorUUIDField; + } + set { + this.m_sensorUUIDField = value; + } + } + + /// + public EModuleID moduleID { + get { + return this.moduleIDField; + } + set { + this.moduleIDField = value; + } + } + + /// + public DOSensorCalRecord m_sensorCalRecord { + get { + return this.m_sensorCalRecordField; + } + set { + this.m_sensorCalRecordField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class BufStdGrpRecord { + + private string m_uuidField; + + private bool m_predefinedField; + + private EBufStdType m_typeField; + + private short m_phBufGrpClassField; + + private string m_nameField; + + private decfloat m_refTempField; + + private ECommonUnit m_iseUnitField; + + private bool m_usePredefinedStdField; + + private BufStdRecord[] m_buffersField; + + /// + public string m_uuid { + get { + return this.m_uuidField; + } + set { + this.m_uuidField = value; + } + } + + /// + public bool m_predefined { + get { + return this.m_predefinedField; + } + set { + this.m_predefinedField = value; + } + } + + /// + public EBufStdType m_type { + get { + return this.m_typeField; + } + set { + this.m_typeField = value; + } + } + + /// + public short m_phBufGrpClass { + get { + return this.m_phBufGrpClassField; + } + set { + this.m_phBufGrpClassField = value; + } + } + + /// + public string m_name { + get { + return this.m_nameField; + } + set { + this.m_nameField = value; + } + } + + /// + public decfloat m_refTemp { + get { + return this.m_refTempField; + } + set { + this.m_refTempField = value; + } + } + + /// + public ECommonUnit m_iseUnit { + get { + return this.m_iseUnitField; + } + set { + this.m_iseUnitField = value; + } + } + + /// + public bool m_usePredefinedStd { + get { + return this.m_usePredefinedStdField; + } + set { + this.m_usePredefinedStdField = value; + } + } + + /// + [System.Xml.Serialization.XmlArrayItemAttribute("ArrayOfBufStdRecord")] + public BufStdRecord[] m_buffers { + get { + return this.m_buffersField; + } + set { + this.m_buffersField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + public enum EBufStdType { + + /// + eBufStdTypeid_BufStdType_PH, + + /// + eBufStdTypeid_BufStdType_ISE, + + /// + eBufStdTypeid_BufStdType_Cond, + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class BufStdRecord { + + private decfloat m_valueAtRefTempField; + + private ECommonUnit m_condUnitField; + + private short m_cndStdClassField; + + private BufStdTempRelatedValue[] m_bufStdTempRelatedValuesField; + + /// + public decfloat m_valueAtRefTemp { + get { + return this.m_valueAtRefTempField; + } + set { + this.m_valueAtRefTempField = value; + } + } + + /// + public ECommonUnit m_condUnit { + get { + return this.m_condUnitField; + } + set { + this.m_condUnitField = value; + } + } + + /// + public short m_cndStdClass { + get { + return this.m_cndStdClassField; + } + set { + this.m_cndStdClassField = value; + } + } + + /// + [System.Xml.Serialization.XmlArrayItemAttribute("ArrayOfBufStdTempRelatedValue")] + public BufStdTempRelatedValue[] m_bufStdTempRelatedValues { + get { + return this.m_bufStdTempRelatedValuesField; + } + set { + this.m_bufStdTempRelatedValuesField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class BufStdTempRelatedValue { + + private decfloat m_tempField; + + private decfloat m_valueField; + + /// + public decfloat m_temp { + get { + return this.m_tempField; + } + set { + this.m_tempField = value; + } + } + + /// + public decfloat m_value { + get { + return this.m_valueField; + } + set { + this.m_valueField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class ArrayOfBufStdTempRelatedValue { + + private BufStdTempRelatedValue[] arrayOfBufStdTempRelatedValue1Field; + + /// + [System.Xml.Serialization.XmlElementAttribute("ArrayOfBufStdTempRelatedValue", IsNullable=true)] + public BufStdTempRelatedValue[] ArrayOfBufStdTempRelatedValue1 { + get { + return this.arrayOfBufStdTempRelatedValue1Field; + } + set { + this.arrayOfBufStdTempRelatedValue1Field = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class ArrayOfBufStdRecord { + + private BufStdRecord[] arrayOfBufStdRecord1Field; + + /// + [System.Xml.Serialization.XmlElementAttribute("ArrayOfBufStdRecord", IsNullable=true)] + public BufStdRecord[] ArrayOfBufStdRecord1 { + get { + return this.arrayOfBufStdRecord1Field; + } + set { + this.arrayOfBufStdRecord1Field = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class TableRecord { + + private string m_uuidField; + + private bool m_predefinedField; + + private string m_tableNameField; + + private string m_inputField; + + private string m_outputField; + + private EFitType m_fitTypeField; + + private string m_commentField; + + private TableValueRecord[] m_tableValuesField; + + /// + public string m_uuid { + get { + return this.m_uuidField; + } + set { + this.m_uuidField = value; + } + } + + /// + public bool m_predefined { + get { + return this.m_predefinedField; + } + set { + this.m_predefinedField = value; + } + } + + /// + public string m_tableName { + get { + return this.m_tableNameField; + } + set { + this.m_tableNameField = value; + } + } + + /// + public string m_input { + get { + return this.m_inputField; + } + set { + this.m_inputField = value; + } + } + + /// + public string m_output { + get { + return this.m_outputField; + } + set { + this.m_outputField = value; + } + } + + /// + public EFitType m_fitType { + get { + return this.m_fitTypeField; + } + set { + this.m_fitTypeField = value; + } + } + + /// + public string m_comment { + get { + return this.m_commentField; + } + set { + this.m_commentField = value; + } + } + + /// + [System.Xml.Serialization.XmlArrayItemAttribute("ArrayOfTableValueRecord")] + public TableValueRecord[] m_tableValues { + get { + return this.m_tableValuesField; + } + set { + this.m_tableValuesField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + public enum EFitType { + + /// + eFitTypeid_FitType_LinearInterpolation, + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class TableValueRecord { + + private decfloat m_inputValueField; + + private decfloat m_outputValueField; + + /// + public decfloat m_inputValue { + get { + return this.m_inputValueField; + } + set { + this.m_inputValueField = value; + } + } + + /// + public decfloat m_outputValue { + get { + return this.m_outputValueField; + } + set { + this.m_outputValueField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class ArrayOfTableValueRecord { + + private TableValueRecord[] arrayOfTableValueRecord1Field; + + /// + [System.Xml.Serialization.XmlElementAttribute("ArrayOfTableValueRecord", IsNullable=true)] + public TableValueRecord[] ArrayOfTableValueRecord1 { + get { + return this.arrayOfTableValueRecord1Field; + } + set { + this.arrayOfTableValueRecord1Field = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class StirrerConfigurationRecord { + + private string m_nameField; + + private EStirrerType m_typeField; + + private decfloat m_minVoltageField; + + private decfloat m_maxVoltageField; + + /// + public string m_name { + get { + return this.m_nameField; + } + set { + this.m_nameField = value; + } + } + + /// + public EStirrerType m_type { + get { + return this.m_typeField; + } + set { + this.m_typeField = value; + } + } + + /// + public decfloat m_minVoltage { + get { + return this.m_minVoltageField; + } + set { + this.m_minVoltageField = value; + } + } + + /// + public decfloat m_maxVoltage { + get { + return this.m_maxVoltageField; + } + set { + this.m_maxVoltageField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + public enum EStirrerType { + + /// + eStirrerTypeid_StirrerType_MagneticStirrer, + + /// + eStirrerTypeid_StirrerType_OverheadStirrer, + + /// + eStirrerTypeid_StirrerType_UserDefinedStirrer, + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class BrowsableScreenColor { + + private EBrowsableScreenColorType typeField; + + private byte rField; + + private byte gField; + + private byte bField; + + /// + public EBrowsableScreenColorType Type { + get { + return this.typeField; + } + set { + this.typeField = value; + } + } + + /// + public byte R { + get { + return this.rField; + } + set { + this.rField = value; + } + } + + /// + public byte G { + get { + return this.gField; + } + set { + this.gField = value; + } + } + + /// + public byte B { + get { + return this.bField; + } + set { + this.bField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + public enum EBrowsableScreenColorType { + + /// + eBrowsableScreenColorTypeDefault, + + /// + eBrowsableScreenColorTypeRGB, + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class BrowsableScreenButton { + + private string textField; + + private EBrowsableScreenButtonState stateField; + + private BrowsableScreenColor buttonColorField; + + /// + public string Text { + get { + return this.textField; + } + set { + this.textField = value; + } + } + + /// + public EBrowsableScreenButtonState State { + get { + return this.stateField; + } + set { + this.stateField = value; + } + } + + /// + public BrowsableScreenColor ButtonColor { + get { + return this.buttonColorField; + } + set { + this.buttonColorField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + public enum EBrowsableScreenButtonState { + + /// + eButtonStateEnabled, + + /// + eButtonStateDisabled, + + /// + eButtonStateInvisible, + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class BrowsableScreenTaskButton { + + private EBrowsableScreenTaskButtonState stateField; + + /// + public EBrowsableScreenTaskButtonState State { + get { + return this.stateField; + } + set { + this.stateField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + public enum EBrowsableScreenTaskButtonState { + + /// + eTaskButtonStateDisabled, + + /// + eTaskButtonStateActive, + + /// + eTaskButtonStateActiveWaiting, + + /// + eTaskButtonStateAttention, + + /// + eTaskButtonStateInterrupted, + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class BrowsableScreenMessage { + + private string titleField; + + private BrowsableScreenColor titleBackgroundColorField; + + private string navigationField; + + private bool isTaskButtonVisibleField; + + private string messageField; + + private EBrowsableScreenMessageViewState titleIconField; + + private BrowsableScreenColor textColorField; + + private BrowsableScreenColor backgroundColorField; + + private BrowsableScreenButton[] buttonsField; + + /// + public string Title { + get { + return this.titleField; + } + set { + this.titleField = value; + } + } + + /// + public BrowsableScreenColor TitleBackgroundColor { + get { + return this.titleBackgroundColorField; + } + set { + this.titleBackgroundColorField = value; + } + } + + /// + public string Navigation { + get { + return this.navigationField; + } + set { + this.navigationField = value; + } + } + + /// + public bool IsTaskButtonVisible { + get { + return this.isTaskButtonVisibleField; + } + set { + this.isTaskButtonVisibleField = value; + } + } + + /// + public string Message { + get { + return this.messageField; + } + set { + this.messageField = value; + } + } + + /// + public EBrowsableScreenMessageViewState TitleIcon { + get { + return this.titleIconField; + } + set { + this.titleIconField = value; + } + } + + /// + public BrowsableScreenColor TextColor { + get { + return this.textColorField; + } + set { + this.textColorField = value; + } + } + + /// + public BrowsableScreenColor BackgroundColor { + get { + return this.backgroundColorField; + } + set { + this.backgroundColorField = value; + } + } + + /// + [System.Xml.Serialization.XmlArrayItemAttribute("ArrayOfBrowsableScreenButton")] + public BrowsableScreenButton[] Buttons { + get { + return this.buttonsField; + } + set { + this.buttonsField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + public enum EBrowsableScreenMessageViewState { + + /// + eMessageViewState_None, + + /// + eMessageViewState_LabX, + + /// + eMessageViewState_InfoBubble, + + /// + eMessageViewState_Attention, + + /// + eMessageViewState_Stop, + + /// + eMessageViewState_QuestionMark, + + /// + eMessageViewState_InfoGrey, + + /// + eMessageViewState_Result, + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class ArrayOfBrowsableScreenButton { + + private BrowsableScreenButton[] arrayOfBrowsableScreenButton1Field; + + /// + [System.Xml.Serialization.XmlElementAttribute("ArrayOfBrowsableScreenButton", IsNullable=true)] + public BrowsableScreenButton[] ArrayOfBrowsableScreenButton1 { + get { + return this.arrayOfBrowsableScreenButton1Field; + } + set { + this.arrayOfBrowsableScreenButton1Field = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class BrowsableScreenRequestNumber { + + private string titleField; + + private BrowsableScreenColor titleBackgroundColorField; + + private decfloat defaultValueField; + + private decfloat minimalValueField; + + private decfloat maximalValueField; + + private short digitsField; + + private BrowsableScreenButton[] buttonsField; + + /// + public string Title { + get { + return this.titleField; + } + set { + this.titleField = value; + } + } + + /// + public BrowsableScreenColor TitleBackgroundColor { + get { + return this.titleBackgroundColorField; + } + set { + this.titleBackgroundColorField = value; + } + } + + /// + public decfloat DefaultValue { + get { + return this.defaultValueField; + } + set { + this.defaultValueField = value; + } + } + + /// + public decfloat MinimalValue { + get { + return this.minimalValueField; + } + set { + this.minimalValueField = value; + } + } + + /// + public decfloat MaximalValue { + get { + return this.maximalValueField; + } + set { + this.maximalValueField = value; + } + } + + /// + public short Digits { + get { + return this.digitsField; + } + set { + this.digitsField = value; + } + } + + /// + [System.Xml.Serialization.XmlArrayItemAttribute("ArrayOfBrowsableScreenButton")] + public BrowsableScreenButton[] Buttons { + get { + return this.buttonsField; + } + set { + this.buttonsField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class BrowsableScreenRequestText { + + private string titleField; + + private BrowsableScreenColor titleBackgroundColorField; + + private string defaultValueField; + + private short minTextLengthField; + + private short maxTextLengthField; + + private BrowsableScreenButton[] buttonsField; + + /// + public string Title { + get { + return this.titleField; + } + set { + this.titleField = value; + } + } + + /// + public BrowsableScreenColor TitleBackgroundColor { + get { + return this.titleBackgroundColorField; + } + set { + this.titleBackgroundColorField = value; + } + } + + /// + public string DefaultValue { + get { + return this.defaultValueField; + } + set { + this.defaultValueField = value; + } + } + + /// + public short MinTextLength { + get { + return this.minTextLengthField; + } + set { + this.minTextLengthField = value; + } + } + + /// + public short MaxTextLength { + get { + return this.maxTextLengthField; + } + set { + this.maxTextLengthField = value; + } + } + + /// + [System.Xml.Serialization.XmlArrayItemAttribute("ArrayOfBrowsableScreenButton")] + public BrowsableScreenButton[] Buttons { + get { + return this.buttonsField; + } + set { + this.buttonsField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class BrowsableScreenRequestTextEx { + + private string titleField; + + private BrowsableScreenColor titleBackgroundColorField; + + private string defaultValueField; + + private short minTextLengthField; + + private short maxTextLengthField; + + private BrowsableScreenButton[] buttonsField; + + /// + public string Title { + get { + return this.titleField; + } + set { + this.titleField = value; + } + } + + /// + public BrowsableScreenColor TitleBackgroundColor { + get { + return this.titleBackgroundColorField; + } + set { + this.titleBackgroundColorField = value; + } + } + + /// + public string DefaultValue { + get { + return this.defaultValueField; + } + set { + this.defaultValueField = value; + } + } + + /// + public short MinTextLength { + get { + return this.minTextLengthField; + } + set { + this.minTextLengthField = value; + } + } + + /// + public short MaxTextLength { + get { + return this.maxTextLengthField; + } + set { + this.maxTextLengthField = value; + } + } + + /// + [System.Xml.Serialization.XmlArrayItemAttribute("ArrayOfBrowsableScreenButton")] + public BrowsableScreenButton[] Buttons { + get { + return this.buttonsField; + } + set { + this.buttonsField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class BrowsableScreenRequestSelectionColumn { + + private string headerField; + + private byte widthField; + + private EBrowsableScreenTableColumnType typeField; + + /// + public string Header { + get { + return this.headerField; + } + set { + this.headerField = value; + } + } + + /// + public byte Width { + get { + return this.widthField; + } + set { + this.widthField = value; + } + } + + /// + public EBrowsableScreenTableColumnType Type { + get { + return this.typeField; + } + set { + this.typeField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + public enum EBrowsableScreenTableColumnType { + + /// + eBrowsableScreenTableType_StringList, + + /// + eBrowsableScreenTableType_IconList, + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class DummyEBrowsableScreenRequestSelectionRowIcon { + + private EBrowsableScreenRequestSelectionRowIcon dummyEnumField; + + /// + public EBrowsableScreenRequestSelectionRowIcon dummyEnum { + get { + return this.dummyEnumField; + } + set { + this.dummyEnumField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + public enum EBrowsableScreenRequestSelectionRowIcon { + + /// + eLabX_Number, + + /// + eLabX_Text, + + /// + eLabX_Info, + + /// + eLabX_Bool, + + /// + eLabX_DropDown, + + /// + eLabX_Folder, + + /// + eLabX_FolderUp, + + /// + eLabX_Method, + + /// + eLabX_MethodLocked, + + /// + eLabX_Product, + + /// + eLabX_ProductLocked, + + /// + eLabX_Series, + + /// + eLabX_SeriesLocked, + + /// + eLabX_TaskAborted, + + /// + eLabX_TaskAbortedPrio, + + /// + eLabX_TaskCreated, + + /// + eLabX_TaskCreatedPrio, + + /// + eLabX_TaskError, + + /// + eLabX_TaskErrorPrio, + + /// + eLabX_TaskHold, + + /// + eLabX_TaskHoldPrio, + + /// + eLabX_TaskPaused, + + /// + eLabX_TaskPausedPrio, + + /// + eLabX_TaskRunning, + + /// + eLabX_TaskRunningPrio, + + /// + eLabX_TaskWaiting, + + /// + eLabX_TaskWaitingPrio, + + /// + eLabX_TaskWarning, + + /// + eLabX_TaskWarningPrio, + + /// + eLabX_ShowReleased, + + /// + eLabX_ShowProposed, + + /// + eLabX_None, + + /// + eLabX_Tag, + + /// + eLabX_NextPage, + + /// + eLabX_PrevPage, + + /// + eLabX_RowColor1, + + /// + eLabX_RowColor2, + + /// + eLabX_RowColor3, + + /// + eLabX_RowColor4, + + /// + eLabX_RowColor5, + + /// + eLabX_RowColor6, + + /// + eLabX_RowColor7, + + /// + eLabX_RowColor8, + + /// + eLabX_RowColor9, + + /// + eLabX_RowColor10, + + /// + eLabX_RowColor11, + + /// + eLabX_RowColor12, + + /// + eLabX_RowColor13, + + /// + eLabX_RowColor14, + + /// + eLabX_RowColor15, + + /// + eLabX_RowColor16, + + /// + eLabX_RowColor17, + + /// + eLabX_RowColor18, + + /// + eLabX_RowColorRGB, + + /// + eLabX_FolderTask, + + /// + eLabX_FolderSample, + + /// + eLabX_ManualOp, + + /// + eLabX_ManualOpLocked, + + /// + eLabX_StatusLightGreen, + + /// + eLabX_StatusLightOrange, + + /// + eLabX_StatusLightRed, + + /// + eLabX_StatusLightGreenFlashing, + + /// + eLabX_StatusLightOrangeFlashing, + + /// + eLabX_StatusLightRedFlashing, + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class BrowsableScreenRequestSelectionRow { + + private EBrowsableScreenRequestSelectionRowState rowStateField; + + private BrowsableScreenColor rowColorField; + + private bool isHighlightedField; + + private string columnText1Field; + + private string columnText2Field; + + private string columnText3Field; + + private string columnText4Field; + + /// + public EBrowsableScreenRequestSelectionRowState RowState { + get { + return this.rowStateField; + } + set { + this.rowStateField = value; + } + } + + /// + public BrowsableScreenColor RowColor { + get { + return this.rowColorField; + } + set { + this.rowColorField = value; + } + } + + /// + public bool IsHighlighted { + get { + return this.isHighlightedField; + } + set { + this.isHighlightedField = value; + } + } + + /// + public string ColumnText1 { + get { + return this.columnText1Field; + } + set { + this.columnText1Field = value; + } + } + + /// + public string ColumnText2 { + get { + return this.columnText2Field; + } + set { + this.columnText2Field = value; + } + } + + /// + public string ColumnText3 { + get { + return this.columnText3Field; + } + set { + this.columnText3Field = value; + } + } + + /// + public string ColumnText4 { + get { + return this.columnText4Field; + } + set { + this.columnText4Field = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + public enum EBrowsableScreenRequestSelectionRowState { + + /// + eRowEnabled, + + /// + eRowDisabled, + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class BrowsableScreenRequestSelection { + + private string titleField; + + private BrowsableScreenColor titleBackgroundColorField; + + private string navigationField; + + private bool showHeaderField; + + private bool readOnlyField; + + private BrowsableScreenRequestSelectionColumn[] columnsField; + + private byte rowsVisibleField; + + private short scrollPositionField; + + private BrowsableScreenRequestSelectionRow[] rowsField; + + private BrowsableScreenColor highlightedRowsTextColorField; + + private BrowsableScreenColor highlightedRowsBGColorField; + + private BrowsableScreenButton[] buttonsField; + + /// + public string Title { + get { + return this.titleField; + } + set { + this.titleField = value; + } + } + + /// + public BrowsableScreenColor TitleBackgroundColor { + get { + return this.titleBackgroundColorField; + } + set { + this.titleBackgroundColorField = value; + } + } + + /// + public string Navigation { + get { + return this.navigationField; + } + set { + this.navigationField = value; + } + } + + /// + public bool ShowHeader { + get { + return this.showHeaderField; + } + set { + this.showHeaderField = value; + } + } + + /// + public bool ReadOnly { + get { + return this.readOnlyField; + } + set { + this.readOnlyField = value; + } + } + + /// + [System.Xml.Serialization.XmlArrayItemAttribute("ArrayOfBrowsableScreenRequestSelectionColumn")] + public BrowsableScreenRequestSelectionColumn[] Columns { + get { + return this.columnsField; + } + set { + this.columnsField = value; + } + } + + /// + public byte RowsVisible { + get { + return this.rowsVisibleField; + } + set { + this.rowsVisibleField = value; + } + } + + /// + public short ScrollPosition { + get { + return this.scrollPositionField; + } + set { + this.scrollPositionField = value; + } + } + + /// + [System.Xml.Serialization.XmlArrayItemAttribute("ArrayOfBrowsableScreenRequestSelectionRow")] + public BrowsableScreenRequestSelectionRow[] Rows { + get { + return this.rowsField; + } + set { + this.rowsField = value; + } + } + + /// + public BrowsableScreenColor HighlightedRowsTextColor { + get { + return this.highlightedRowsTextColorField; + } + set { + this.highlightedRowsTextColorField = value; + } + } + + /// + public BrowsableScreenColor HighlightedRowsBGColor { + get { + return this.highlightedRowsBGColorField; + } + set { + this.highlightedRowsBGColorField = value; + } + } + + /// + [System.Xml.Serialization.XmlArrayItemAttribute("ArrayOfBrowsableScreenButton")] + public BrowsableScreenButton[] Buttons { + get { + return this.buttonsField; + } + set { + this.buttonsField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class ArrayOfBrowsableScreenRequestSelectionColumn { + + private BrowsableScreenRequestSelectionColumn[] arrayOfBrowsableScreenRequestSelectionColumn1Field; + + /// + [System.Xml.Serialization.XmlElementAttribute("ArrayOfBrowsableScreenRequestSelectionColumn", IsNullable=true)] + public BrowsableScreenRequestSelectionColumn[] ArrayOfBrowsableScreenRequestSelectionColumn1 { + get { + return this.arrayOfBrowsableScreenRequestSelectionColumn1Field; + } + set { + this.arrayOfBrowsableScreenRequestSelectionColumn1Field = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class ArrayOfBrowsableScreenRequestSelectionRow { + + private BrowsableScreenRequestSelectionRow[] arrayOfBrowsableScreenRequestSelectionRow1Field; + + /// + [System.Xml.Serialization.XmlElementAttribute("ArrayOfBrowsableScreenRequestSelectionRow", IsNullable=true)] + public BrowsableScreenRequestSelectionRow[] ArrayOfBrowsableScreenRequestSelectionRow1 { + get { + return this.arrayOfBrowsableScreenRequestSelectionRow1Field; + } + set { + this.arrayOfBrowsableScreenRequestSelectionRow1Field = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class BrowsableScreenLogin { + + private string titleField; + + private string navigationField; + + private BrowsableScreenColor backgroundColorField; + + private BrowsableScreenButton[] buttonsField; + + private EBrowsableScreenLoginViewState titleIconField; + + private string extendedTextField; + + private string errorTextField; + + private string defaultNameField; + + private short nameMinField; + + private short nameMaxField; + + private bool passwordFieldField; + + private short passwordMinField; + + private short passwordMaxField; + + private string[] usersField; + + private short indexButtonUserListField; + + private short indexButtonSendLoginDataField; + + /// + public string Title { + get { + return this.titleField; + } + set { + this.titleField = value; + } + } + + /// + public string Navigation { + get { + return this.navigationField; + } + set { + this.navigationField = value; + } + } + + /// + public BrowsableScreenColor BackgroundColor { + get { + return this.backgroundColorField; + } + set { + this.backgroundColorField = value; + } + } + + /// + [System.Xml.Serialization.XmlArrayItemAttribute("ArrayOfBrowsableScreenButton")] + public BrowsableScreenButton[] Buttons { + get { + return this.buttonsField; + } + set { + this.buttonsField = value; + } + } + + /// + public EBrowsableScreenLoginViewState TitleIcon { + get { + return this.titleIconField; + } + set { + this.titleIconField = value; + } + } + + /// + public string ExtendedText { + get { + return this.extendedTextField; + } + set { + this.extendedTextField = value; + } + } + + /// + public string ErrorText { + get { + return this.errorTextField; + } + set { + this.errorTextField = value; + } + } + + /// + public string DefaultName { + get { + return this.defaultNameField; + } + set { + this.defaultNameField = value; + } + } + + /// + public short NameMin { + get { + return this.nameMinField; + } + set { + this.nameMinField = value; + } + } + + /// + public short NameMax { + get { + return this.nameMaxField; + } + set { + this.nameMaxField = value; + } + } + + /// + public bool PasswordField { + get { + return this.passwordFieldField; + } + set { + this.passwordFieldField = value; + } + } + + /// + public short PasswordMin { + get { + return this.passwordMinField; + } + set { + this.passwordMinField = value; + } + } + + /// + public short PasswordMax { + get { + return this.passwordMaxField; + } + set { + this.passwordMaxField = value; + } + } + + /// + [System.Xml.Serialization.XmlArrayItemAttribute("ArrayOfString")] + public string[] Users { + get { + return this.usersField; + } + set { + this.usersField = value; + } + } + + /// + public short IndexButtonUserList { + get { + return this.indexButtonUserListField; + } + set { + this.indexButtonUserListField = value; + } + } + + /// + public short IndexButtonSendLoginData { + get { + return this.indexButtonSendLoginDataField; + } + set { + this.indexButtonSendLoginDataField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + public enum EBrowsableScreenLoginViewState { + + /// + eLoginViewState_Login, + + /// + eLoginViewState_Lock, + + /// + eLoginViewState_Sign, + + /// + eLoginViewState_Fingerprint, + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class ArrayOfString { + + private string[] arrayOfString1Field; + + /// + [System.Xml.Serialization.XmlElementAttribute("ArrayOfString", IsNullable=true)] + public string[] ArrayOfString1 { + get { + return this.arrayOfString1Field; + } + set { + this.arrayOfString1Field = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class BrowsableScreenRequestParameterListItem { + + private string labelField; + + private string valueField; + + private EFieldType fieldtypeField; + + private bool checkboxEnabledField; + + /// + public string Label { + get { + return this.labelField; + } + set { + this.labelField = value; + } + } + + /// + public string Value { + get { + return this.valueField; + } + set { + this.valueField = value; + } + } + + /// + public EFieldType Fieldtype { + get { + return this.fieldtypeField; + } + set { + this.fieldtypeField = value; + } + } + + /// + public bool CheckboxEnabled { + get { + return this.checkboxEnabledField; + } + set { + this.checkboxEnabledField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + public enum EFieldType { + + /// + eFieldType_Info, + + /// + eFieldType_List, + + /// + eFieldType_Parameter, + + /// + eFieldType_String, + + /// + eFieldType_Number, + + /// + eFieldType_Checkbox, + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class BrowsableScreenRequestParameterListSelection { + + private string titleField; + + private BrowsableScreenColor titleBackgroundColorField; + + private string navigationField; + + private BrowsableScreenRequestParameterListItem[] rowsField; + + private short scrollPositionField; + + private BrowsableScreenButton[] buttonsField; + + /// + public string Title { + get { + return this.titleField; + } + set { + this.titleField = value; + } + } + + /// + public BrowsableScreenColor TitleBackgroundColor { + get { + return this.titleBackgroundColorField; + } + set { + this.titleBackgroundColorField = value; + } + } + + /// + public string Navigation { + get { + return this.navigationField; + } + set { + this.navigationField = value; + } + } + + /// + [System.Xml.Serialization.XmlArrayItemAttribute("ArrayOfBrowsableScreenRequestParameterListItem")] + public BrowsableScreenRequestParameterListItem[] Rows { + get { + return this.rowsField; + } + set { + this.rowsField = value; + } + } + + /// + public short ScrollPosition { + get { + return this.scrollPositionField; + } + set { + this.scrollPositionField = value; + } + } + + /// + [System.Xml.Serialization.XmlArrayItemAttribute("ArrayOfBrowsableScreenButton")] + public BrowsableScreenButton[] Buttons { + get { + return this.buttonsField; + } + set { + this.buttonsField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class ArrayOfBrowsableScreenRequestParameterListItem { + + private BrowsableScreenRequestParameterListItem[] arrayOfBrowsableScreenRequestParameterListItem1Field; + + /// + [System.Xml.Serialization.XmlElementAttribute("ArrayOfBrowsableScreenRequestParameterListItem", IsNullable=true)] + public BrowsableScreenRequestParameterListItem[] ArrayOfBrowsableScreenRequestParameterListItem1 { + get { + return this.arrayOfBrowsableScreenRequestParameterListItem1Field; + } + set { + this.arrayOfBrowsableScreenRequestParameterListItem1Field = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class BrowsableScreenRequestButtonListItem { + + private string titleField; + + /// + public string Title { + get { + return this.titleField; + } + set { + this.titleField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class BrowsableScreenRequestButtonListSelection { + + private string titleField; + + private BrowsableScreenColor titleBackgroundColorField; + + private string navigationField; + + private BrowsableScreenRequestButtonListItem[] rowsField; + + private short scrollPositionField; + + private BrowsableScreenButton[] buttonsField; + + /// + public string Title { + get { + return this.titleField; + } + set { + this.titleField = value; + } + } + + /// + public BrowsableScreenColor TitleBackgroundColor { + get { + return this.titleBackgroundColorField; + } + set { + this.titleBackgroundColorField = value; + } + } + + /// + public string Navigation { + get { + return this.navigationField; + } + set { + this.navigationField = value; + } + } + + /// + [System.Xml.Serialization.XmlArrayItemAttribute("ArrayOfBrowsableScreenRequestButtonListItem")] + public BrowsableScreenRequestButtonListItem[] Rows { + get { + return this.rowsField; + } + set { + this.rowsField = value; + } + } + + /// + public short ScrollPosition { + get { + return this.scrollPositionField; + } + set { + this.scrollPositionField = value; + } + } + + /// + [System.Xml.Serialization.XmlArrayItemAttribute("ArrayOfBrowsableScreenButton")] + public BrowsableScreenButton[] Buttons { + get { + return this.buttonsField; + } + set { + this.buttonsField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class ArrayOfBrowsableScreenRequestButtonListItem { + + private BrowsableScreenRequestButtonListItem[] arrayOfBrowsableScreenRequestButtonListItem1Field; + + /// + [System.Xml.Serialization.XmlElementAttribute("ArrayOfBrowsableScreenRequestButtonListItem", IsNullable=true)] + public BrowsableScreenRequestButtonListItem[] ArrayOfBrowsableScreenRequestButtonListItem1 { + get { + return this.arrayOfBrowsableScreenRequestButtonListItem1Field; + } + set { + this.arrayOfBrowsableScreenRequestButtonListItem1Field = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class BrowsableScreenIconButton { + + private BrowsableScreenButton buttonField; + + private EInstrumentButtonIcon iconField; + + /// + public BrowsableScreenButton Button { + get { + return this.buttonField; + } + set { + this.buttonField = value; + } + } + + /// + public EInstrumentButtonIcon Icon { + get { + return this.iconField; + } + set { + this.iconField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + public enum EInstrumentButtonIcon { + + /// + eInstrumentIcon_None, + + /// + eInstrumentIcon_Method, + + /// + eInstrumentIcon_MethodProduct, + + /// + eInstrumentIcon_Series, + + /// + eInstrumentIcon_Result, + + /// + eInstrumentIcon_Setup, + + /// + eInstrumentIcon_Sensor, + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class BrowsableScreenOnlineTF { + + private string titleField; + + private string navigationField; + + private string statusField; + + private BrowsableScreenButton buttonControlField; + + private string buttonSwitchViewTextField; + + private string buttonOKTextField; + + private string buttonTakeManualEndpointTextField; + + private string buttonGraphTextField; + + private string buttonTableTextField; + + private string buttonActualTextField; + + private string buttonCalTextField; + + /// + public string Title { + get { + return this.titleField; + } + set { + this.titleField = value; + } + } + + /// + public string Navigation { + get { + return this.navigationField; + } + set { + this.navigationField = value; + } + } + + /// + public string Status { + get { + return this.statusField; + } + set { + this.statusField = value; + } + } + + /// + public BrowsableScreenButton ButtonControl { + get { + return this.buttonControlField; + } + set { + this.buttonControlField = value; + } + } + + /// + public string ButtonSwitchViewText { + get { + return this.buttonSwitchViewTextField; + } + set { + this.buttonSwitchViewTextField = value; + } + } + + /// + public string ButtonOKText { + get { + return this.buttonOKTextField; + } + set { + this.buttonOKTextField = value; + } + } + + /// + public string ButtonTakeManualEndpointText { + get { + return this.buttonTakeManualEndpointTextField; + } + set { + this.buttonTakeManualEndpointTextField = value; + } + } + + /// + public string ButtonGraphText { + get { + return this.buttonGraphTextField; + } + set { + this.buttonGraphTextField = value; + } + } + + /// + public string ButtonTableText { + get { + return this.buttonTableTextField; + } + set { + this.buttonTableTextField = value; + } + } + + /// + public string ButtonActualText { + get { + return this.buttonActualTextField; + } + set { + this.buttonActualTextField = value; + } + } + + /// + public string ButtonCalText { + get { + return this.buttonCalTextField; + } + set { + this.buttonCalTextField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class BrowsableScreenHomeTF { + + private ELabXHomeViewState titleIconField; + + private string titleField; + + private BrowsableScreenColor titleBackgroundColorField; + + private BrowsableScreenShortcutButtonTF[] shortcutButtonsField; + + private BrowsableScreenIconButton[] leftButtonsField; + + private BrowsableScreenButton[] bottomButtonsField; + + private string[] sensorsField; + + private string userNameField; + + /// + public ELabXHomeViewState TitleIcon { + get { + return this.titleIconField; + } + set { + this.titleIconField = value; + } + } + + /// + public string Title { + get { + return this.titleField; + } + set { + this.titleField = value; + } + } + + /// + public BrowsableScreenColor TitleBackgroundColor { + get { + return this.titleBackgroundColorField; + } + set { + this.titleBackgroundColorField = value; + } + } + + /// + [System.Xml.Serialization.XmlArrayItemAttribute("ArrayOfBrowsableScreenShortcutButtonTF")] + public BrowsableScreenShortcutButtonTF[] ShortcutButtons { + get { + return this.shortcutButtonsField; + } + set { + this.shortcutButtonsField = value; + } + } + + /// + [System.Xml.Serialization.XmlArrayItemAttribute("ArrayOfBrowsableScreenIconButton")] + public BrowsableScreenIconButton[] LeftButtons { + get { + return this.leftButtonsField; + } + set { + this.leftButtonsField = value; + } + } + + /// + [System.Xml.Serialization.XmlArrayItemAttribute("ArrayOfBrowsableScreenButton")] + public BrowsableScreenButton[] BottomButtons { + get { + return this.bottomButtonsField; + } + set { + this.bottomButtonsField = value; + } + } + + /// + [System.Xml.Serialization.XmlArrayItemAttribute("ArrayOfString")] + public string[] Sensors { + get { + return this.sensorsField; + } + set { + this.sensorsField = value; + } + } + + /// + public string UserName { + get { + return this.userNameField; + } + set { + this.userNameField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + public enum ELabXHomeViewState { + + /// + eLabXHomeViewStateid_LabXHomeViewState_LabX, + + /// + eLabXHomeViewStateid_LabXHomeViewState_BlockedHeader, + + /// + eLabXHomeViewStateid_LabXHomeViewState_EmergencyHeader, + + /// + eLabXHomeViewStateid_LabXHomeViewState_UnavailableHeader, + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class BrowsableScreenShortcutButtonTF { + + private short positionField; + + private bool immediateStartField; + + private string textField; + + private EHomeShortcutIconTF iconField; + + private BrowsableScreenColor rGBField; + + /// + public short Position { + get { + return this.positionField; + } + set { + this.positionField = value; + } + } + + /// + public bool ImmediateStart { + get { + return this.immediateStartField; + } + set { + this.immediateStartField = value; + } + } + + /// + public string Text { + get { + return this.textField; + } + set { + this.textField = value; + } + } + + /// + public EHomeShortcutIconTF Icon { + get { + return this.iconField; + } + set { + this.iconField = value; + } + } + + /// + public BrowsableScreenColor RGB { + get { + return this.rGBField; + } + set { + this.rGBField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + public enum EHomeShortcutIconTF { + + /// + eHomeShortcutIconTF_Previous, + + /// + eHomeShortcutIconTF_Method, + + /// + eHomeShortcutIconTF_Serie, + + /// + eHomeShortcutIconTF_SerieSequence, + + /// + eHomeShortcutIconTF_Product, + + /// + eHomeShortcutIconTF_Next, + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class ArrayOfBrowsableScreenShortcutButtonTF { + + private BrowsableScreenShortcutButtonTF[] arrayOfBrowsableScreenShortcutButtonTF1Field; + + /// + [System.Xml.Serialization.XmlElementAttribute("ArrayOfBrowsableScreenShortcutButtonTF", IsNullable=true)] + public BrowsableScreenShortcutButtonTF[] ArrayOfBrowsableScreenShortcutButtonTF1 { + get { + return this.arrayOfBrowsableScreenShortcutButtonTF1Field; + } + set { + this.arrayOfBrowsableScreenShortcutButtonTF1Field = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class ArrayOfBrowsableScreenIconButton { + + private BrowsableScreenIconButton[] arrayOfBrowsableScreenIconButton1Field; + + /// + [System.Xml.Serialization.XmlElementAttribute("ArrayOfBrowsableScreenIconButton", IsNullable=true)] + public BrowsableScreenIconButton[] ArrayOfBrowsableScreenIconButton1 { + get { + return this.arrayOfBrowsableScreenIconButton1Field; + } + set { + this.arrayOfBrowsableScreenIconButton1Field = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class BrowsableScreenMethodProductTF { + + private string titleField; + + private string navigationField; + + private BrowsableScreenColor titleBackgroundColorField; + + private BrowsableScreenButton[] centerButtonsField; + + private BrowsableScreenButton[] bottomButtonsField; + + /// + public string Title { + get { + return this.titleField; + } + set { + this.titleField = value; + } + } + + /// + public string Navigation { + get { + return this.navigationField; + } + set { + this.navigationField = value; + } + } + + /// + public BrowsableScreenColor TitleBackgroundColor { + get { + return this.titleBackgroundColorField; + } + set { + this.titleBackgroundColorField = value; + } + } + + /// + [System.Xml.Serialization.XmlArrayItemAttribute("ArrayOfBrowsableScreenButton")] + public BrowsableScreenButton[] CenterButtons { + get { + return this.centerButtonsField; + } + set { + this.centerButtonsField = value; + } + } + + /// + [System.Xml.Serialization.XmlArrayItemAttribute("ArrayOfBrowsableScreenButton")] + public BrowsableScreenButton[] BottomButtons { + get { + return this.bottomButtonsField; + } + set { + this.bottomButtonsField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class BrowsableScreenTFResultsSample { + + private string titleField; + + private string navigationField; + + private BrowsableScreenColor titleBackgroundColorField; + + private BrowsableScreenButton[] centerButtonsField; + + private BrowsableScreenButton[] bottomButtonsField; + + /// + public string Title { + get { + return this.titleField; + } + set { + this.titleField = value; + } + } + + /// + public string Navigation { + get { + return this.navigationField; + } + set { + this.navigationField = value; + } + } + + /// + public BrowsableScreenColor TitleBackgroundColor { + get { + return this.titleBackgroundColorField; + } + set { + this.titleBackgroundColorField = value; + } + } + + /// + [System.Xml.Serialization.XmlArrayItemAttribute("ArrayOfBrowsableScreenButton")] + public BrowsableScreenButton[] CenterButtons { + get { + return this.centerButtonsField; + } + set { + this.centerButtonsField = value; + } + } + + /// + [System.Xml.Serialization.XmlArrayItemAttribute("ArrayOfBrowsableScreenButton")] + public BrowsableScreenButton[] BottomButtons { + get { + return this.bottomButtonsField; + } + set { + this.bottomButtonsField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class BrowsableScreenTFResultsTask { + + private string titleField; + + private string navigationField; + + private BrowsableScreenColor titleBackgroundColorField; + + private BrowsableScreenButton[] centerButtonsField; + + private BrowsableScreenButton[] bottomButtonsField; + + /// + public string Title { + get { + return this.titleField; + } + set { + this.titleField = value; + } + } + + /// + public string Navigation { + get { + return this.navigationField; + } + set { + this.navigationField = value; + } + } + + /// + public BrowsableScreenColor TitleBackgroundColor { + get { + return this.titleBackgroundColorField; + } + set { + this.titleBackgroundColorField = value; + } + } + + /// + [System.Xml.Serialization.XmlArrayItemAttribute("ArrayOfBrowsableScreenButton")] + public BrowsableScreenButton[] CenterButtons { + get { + return this.centerButtonsField; + } + set { + this.centerButtonsField = value; + } + } + + /// + [System.Xml.Serialization.XmlArrayItemAttribute("ArrayOfBrowsableScreenButton")] + public BrowsableScreenButton[] BottomButtons { + get { + return this.bottomButtonsField; + } + set { + this.bottomButtonsField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class BrowsableScreenNewsButton { + + private EBrowsableScreenNewsButtonState stateField; + + /// + public EBrowsableScreenNewsButtonState State { + get { + return this.stateField; + } + set { + this.stateField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + public enum EBrowsableScreenNewsButtonState { + + /// + eNewButtonStateDisabled, + + /// + eNewButtonStateEnable, + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class BrowsableScreenSetup { + + private ESepcialScreenSetup specialScreenField; + + private bool readOnlyFlagField; + + private string titleField; + + private BrowsableScreenColor titleBackgroundColorField; + + private string navigationField; + + private string buttonBackTextField; + + private string buttonCancelTextField; + + private string buttonSaveTextField; + + /// + public ESepcialScreenSetup SpecialScreen { + get { + return this.specialScreenField; + } + set { + this.specialScreenField = value; + } + } + + /// + public bool ReadOnlyFlag { + get { + return this.readOnlyFlagField; + } + set { + this.readOnlyFlagField = value; + } + } + + /// + public string Title { + get { + return this.titleField; + } + set { + this.titleField = value; + } + } + + /// + public BrowsableScreenColor TitleBackgroundColor { + get { + return this.titleBackgroundColorField; + } + set { + this.titleBackgroundColorField = value; + } + } + + /// + public string Navigation { + get { + return this.navigationField; + } + set { + this.navigationField = value; + } + } + + /// + public string ButtonBackText { + get { + return this.buttonBackTextField; + } + set { + this.buttonBackTextField = value; + } + } + + /// + public string ButtonCancelText { + get { + return this.buttonCancelTextField; + } + set { + this.buttonCancelTextField = value; + } + } + + /// + public string ButtonSaveText { + get { + return this.buttonSaveTextField; + } + set { + this.buttonSaveTextField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + public enum ESepcialScreenSetup { + + /// + eSetupScreen, + + /// + eSetupBeep, + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class TemporaryUselessRecord { + + private EInstrumentModuleType moduleTypeField; + + /// + public EInstrumentModuleType ModuleType { + get { + return this.moduleTypeField; + } + set { + this.moduleTypeField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + public enum EInstrumentModuleType { + + /// + eModuleInstrument, + + /// + eModulePHISFET, + + /// + eModulePHION, + + /// + eModuleCND, + + /// + eModuleDO, + + /// + eModuleNone, + + /// + eModuleBaseBoard, + + /// + eModuleUNDEFINED, + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class RequiredResource { + + private string resourceTypeField; + + private string nameField; + + private string statusField; + + /// + public string resourceType { + get { + return this.resourceTypeField; + } + set { + this.resourceTypeField = value; + } + } + + /// + public string name { + get { + return this.nameField; + } + set { + this.nameField = value; + } + } + + /// + public string status { + get { + return this.statusField; + } + set { + this.statusField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class RemoteValidationResult { + + private string[] validationErrorsField; + + private RequiredResource[] requiredResourcesField; + + /// + [System.Xml.Serialization.XmlArrayItemAttribute("ArrayOfString")] + public string[] validationErrors { + get { + return this.validationErrorsField; + } + set { + this.validationErrorsField = value; + } + } + + /// + [System.Xml.Serialization.XmlArrayItemAttribute("ArrayOfRequiredResource")] + public RequiredResource[] requiredResources { + get { + return this.requiredResourcesField; + } + set { + this.requiredResourcesField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class ArrayOfRequiredResource { + + private RequiredResource[] arrayOfRequiredResource1Field; + + /// + [System.Xml.Serialization.XmlElementAttribute("ArrayOfRequiredResource", IsNullable=true)] + public RequiredResource[] ArrayOfRequiredResource1 { + get { + return this.arrayOfRequiredResource1Field; + } + set { + this.arrayOfRequiredResource1Field = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class CmdTriggerDeviceNotification { + + private EAttachedDeviceType deviceTypeField; + + /// + public EAttachedDeviceType deviceType { + get { + return this.deviceTypeField; + } + set { + this.deviceTypeField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + public enum EAttachedDeviceType { + + /// + eDeviceType_Module, + + /// + eDeviceType_ISMSensor, + + /// + eDeviceType_ISMSensor_pHAnalog, + + /// + eDeviceType_ISMSensor_pHDigital, + + /// + eDeviceType_ISMSensor_CondAnalog, + + /// + eDeviceType_ISMSensor_CondDigital, + + /// + eDeviceType_ISMSensor_DOAnalog, + + /// + eDeviceType_ISMSensor_DODigital, + + /// + eDeviceType_FingerprintReader, + + /// + eDeviceType_SampleChanger, + + /// + eDeviceType_BarcodeReader, + + /// + eDeviceType_USBStick, + + /// + eDeviceType_Stirrer, + + /// + eDeviceType_USBLinePrinter, + + /// + eDeviceType_RS232Printer, + + /// + eDeviceType_PC, + + /// + eDeviceType_Rondolino, + + /// + eDeviceType_InMotion, + + /// + eDeviceType_InMotionRack, + + /// + eDeviceType_InMotionChannel, + + /// + eDeviceType_None, + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class CmdTriggerStirrer { + + private bool switchOnField; + + private EStirSpeed speedField; + + /// + public bool switchOn { + get { + return this.switchOnField; + } + set { + this.switchOnField = value; + } + } + + /// + public EStirSpeed speed { + get { + return this.speedField; + } + set { + this.speedField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + public enum EStirSpeed { + + /// + eStirSpeedid_StirSpeed_10Percent, + + /// + eStirSpeedid_StirSpeed_20Percent, + + /// + eStirSpeedid_StirSpeed_30Percent, + + /// + eStirSpeedid_StirSpeed_40Percent, + + /// + eStirSpeedid_StirSpeed_50Percent, + + /// + eStirSpeedid_StirSpeed_60Percent, + + /// + eStirSpeedid_StirSpeed_70Percent, + + /// + eStirSpeedid_StirSpeed_80Percent, + + /// + eStirSpeedid_StirSpeed_90Percent, + + /// + eStirSpeedid_StirSpeed_100Percent, + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class CmdTriggerBeep { + + private BeepConfig beepConfigField; + + /// + public BeepConfig beepConfig { + get { + return this.beepConfigField; + } + set { + this.beepConfigField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class BeepConfig { + + private int beepMillisecondsField; + + private int silentMillisecondsField; + + private short repeatTimesField; + + /// + public int beepMilliseconds { + get { + return this.beepMillisecondsField; + } + set { + this.beepMillisecondsField = value; + } + } + + /// + public int silentMilliseconds { + get { + return this.silentMillisecondsField; + } + set { + this.silentMillisecondsField = value; + } + } + + /// + public short repeatTimes { + get { + return this.repeatTimesField; + } + set { + this.repeatTimesField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class CmdInteractionResponse { + + private int interactionIDField; + + private EInteractionResponse responseTypeField; + + /// + public int interactionID { + get { + return this.interactionIDField; + } + set { + this.interactionIDField = value; + } + } + + /// + public EInteractionResponse responseType { + get { + return this.responseTypeField; + } + set { + this.responseTypeField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + public enum EInteractionResponse { + + /// + eYes, + + /// + eNo, + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class CmdSamplerMoveRackRecord { + + private EAutosamplerGoto rackGotoField; + + private EAutosamplerDirection directionField; + + private short beakerPositionOrStepField; + + private ELiftPosition liftPositionField; + + /// + public EAutosamplerGoto rackGoto { + get { + return this.rackGotoField; + } + set { + this.rackGotoField = value; + } + } + + /// + public EAutosamplerDirection direction { + get { + return this.directionField; + } + set { + this.directionField = value; + } + } + + /// + public short beakerPositionOrStep { + get { + return this.beakerPositionOrStepField; + } + set { + this.beakerPositionOrStepField = value; + } + } + + /// + public ELiftPosition liftPosition { + get { + return this.liftPositionField; + } + set { + this.liftPositionField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + public enum EAutosamplerGoto { + + /// + eAutosamplerGoto_Home, + + /// + eAutosamplerGoto_RelativePosition, + + /// + eAutosamplerGoto_AbsolutePosition, + + /// + eAutosamplerGoto_NextBeaker, + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + public enum EAutosamplerDirection { + + /// + eSamplerDirection_Forward, + + /// + eSamplerDirection_Backward, + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + public enum ELiftPosition { + + /// + eLiftPosition_Undefined, + + /// + eLiftPosition_Sample, + + /// + eLiftPosition_CondMeas, + + /// + eLiftPosition_Rotate, + + /// + eLiftPosition_Rinse, + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class ResponseSamplerCmdRecord { + + private ECmdResultTF cmdResultField; + + private EErrorReasonTF errorReasonField; + + private EErrorSourceTF errorSourceField; + + private EErrorDetailTF errorDetailField; + + /// + public ECmdResultTF cmdResult { + get { + return this.cmdResultField; + } + set { + this.cmdResultField = value; + } + } + + /// + public EErrorReasonTF errorReason { + get { + return this.errorReasonField; + } + set { + this.errorReasonField = value; + } + } + + /// + public EErrorSourceTF errorSource { + get { + return this.errorSourceField; + } + set { + this.errorSourceField = value; + } + } + + /// + public EErrorDetailTF errorDetail { + get { + return this.errorDetailField; + } + set { + this.errorDetailField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + public enum ECmdResultTF { + + /// + eCmdAccepted, + + /// + eCmdAcceptedAndExecuted, + + /// + eCmdRejectionUnknownCmd, + + /// + eCmdRejectionNotImplemented, + + /// + eCmdRejectionInternalError, + + /// + eCmdRejectionParameterRange, + + /// + eCmdRejectionWrongCmd, + + /// + eCmdRejectionDeviceNotPresent, + + /// + eCmdRejectionWrongConfig, + + /// + eCmdRejectionWrongState, + + /// + eCmdRejectionInvalidFwImage, + + /// + eCmdRejectionCrcError, + + /// + eCmdRejectionInternalFlashError, + + /// + eCmdRejectionExternalFlashError, + + /// + eCmdRejectionRackNotReady, + + /// + eCmdRejectionLiftNotReady, + + /// + eCmdRejectionXYZNotReady, + + /// + eCmdRejectionLiftInWrongPosition, + + /// + eCmdRejectionRackInWrongPosition, + + /// + eCmdRejectionCalcTargetLiftFailed, + + /// + eCmdRejectionCalcTargetRackFailed, + + /// + eCmdRejectionWrongMotorState, + + /// + eCmdRejectionGetPresentCallDenied, + + /// + eCmdRejectionOneWireNotPresent, + + /// + eCmdRejectionOneWireAccessError, + + /// + eCmdRejectionOneWireReadError, + + /// + eCmdRejectionOneWireWriteError, + + /// + eCmdRejectionOneWireTypeWrong, + + /// + eCmdRejectionChannelNotPresent, + + /// + eCmdRejectionChannelInUse, + + /// + eCmdRejectionChannelLocked, + + /// + eCmdRejectionAliquotationDenied, + + /// + eCmdRejectionRackAtAliquotation, + + /// + eCmdRejectionRfidUnknownReader, + + /// + eCmdRejectionRfidBadBlockAlign, + + /// + eCmdRejectionRfidReaderError, + + /// + eCmdRejectionRfidNoContactlessDevice, + + /// + eCmdRejectionRfidReaderComm, + + /// + eCmdRejectionRfidTooManyContactlessDev, + + /// + eCmdRejectionRfidNoRespFromContactlessDev, + + /// + eCmdRejectionRfidBadRespFromContactlessDev, + + /// + eCmdRejectionRfidViccCommandError, + + /// + eCmdRejectionRfidViccBlockOutOfRange, + + /// + eCmdRejectionRfidViccGeneralError, + + /// + eCmdRejectionRfidWriteError, + + /// + eCmdRejectionSampleReaderDeviceBusy, + + /// + eCmdRejectionSampleReaderIsReadOnly, + + /// + eCmdRejectionRackTypeNotValid, + + /// + eCmdRejectionRackTypeHasNoCoverUp, + + /// + eCmdRejectionRackTypeHasNoHandlingStation, + + /// + eCmdRejectionLiftBlockedByBeaker, + + /// + eCmdRejectionNoDataAvailable, + + /// + eCmdRejectionArmNotAtAliquotation, + + /// + eCmdRejectionWrongDirection, + + /// + eCmdRejectionWrongRate, + + /// + eCmdRejectionWrongRowForSampleData, + + /// + eCmdRejectionCOD_Denied, + + /// + eCmdRejectionMoveToAliquotationBeakerDenied, + + /// + eCmdTimeout, + + /// + eCmdSendError, + + /// + eCmdCanceled, + + /// + eCmdSuccess, + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + public enum EErrorReasonTF { + + /// + eErrorInternalError, + + /// + eErrorMotorControlFailure, + + /// + eErrorMotorHardwareFailure, + + /// + eErrorMotorTimeoutFailure, + + /// + eErrorRackBlocked, + + /// + eErrorRackMovedInStopped, + + /// + eErrorMotorLostHomePosition, + + /// + eErrorMotorLostRotationPosition, + + /// + eErrorMotorMissedRotationPosition, + + /// + eErrorHomingFailed, + + /// + eErrorConnectionLost, + + /// + eErrorIOExpander, + + /// + eErrorStopInHoming, + + /// + eErrorI2CEepromFailure, + + /// + eErrorRackParameterFailure, + + /// + eErrorOverCurrent, + + /// + eErrorRfidReaderFailure, + + /// + eErrorLongTermTestFailure, + + /// + eErrorLowVoltage, + + /// + eErrorConfigurationError, + + /// + eErrorBarcodeReaderError, + + /// + eErrorWrongPnPDevice, + + /// + eErrorWrongOneWireDevice, + + /// + eErrorTooManyOneWireDevices, + + /// + eErrorNotTypification, + + /// + eErrorCalibrationData, + + /// + eErrorMotorDriverBoardDefect, + + /// + eErrorMotorMoveFailed, + + /// + eErrorTooManyOptionBoards, + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + public enum EErrorSourceTF { + + /// + eErrorSourceMainBoard, + + /// + eErrorSourceRack, + + /// + eErrorSourceTowerA, + + /// + eErrorSourceTowerB, + + /// + eErrorSourceXYZLogic, + + /// + eErrorSourceFunctionOptionBoard, + + /// + eErrorSourceDataOptionBoard, + + /// + eErrorSourceKFBoard, + + /// + eErrorSourcePressureBoard, + + /// + eErrorSourceUSB, + + /// + eErrorSourceMotorX, + + /// + eErrorSourceMotorY1, + + /// + eErrorSourceMotorZ1, + + /// + eErrorSourceMotorY2, + + /// + eErrorSourceMotorZ2, + + /// + eErrorSourcePump1b, + + /// + eErrorSourcePump2a, + + /// + eErrorSourcePump2b, + + /// + eErrorSourcePump3a, + + /// + eErrorSourcePump3b, + + /// + eErrorSourcePump4a, + + /// + eErrorSourcePump4b, + + /// + eErrorSourcePump5a, + + /// + eErrorSourcePump5b, + + /// + eErrorSourcePump6a, + + /// + eErrorSourcePump6b, + + /// + eErrorSourceStirrer1, + + /// + eErrorSourceStirrer2, + + /// + eErrorSourceStirrer3, + + /// + eErrorSourceStirrer4, + + /// + eErrorSourceStirrer5, + + /// + eErrorSourceStirrer6, + + /// + eErrorSourceLedGreenTowerA, + + /// + eErrorSourceLedRedTowerA, + + /// + eErrorSourceLedGreenTowerB, + + /// + eErrorSourceLedRedTowerB, + + /// + eErrorSourceBuzzerTowerA, + + /// + eErrorSourceBuzzerTowerB, + + /// + eErrorSourceCoverUp, + + /// + eErrorSourceCoverUp1, + + /// + eErrorSourceCoverUp2, + + /// + eErrorSourceCoverUp3, + + /// + eErrorSourceCoverUp4, + + /// + eErrorSourceCoverUp5, + + /// + eErrorSourceRFID1, + + /// + eErrorSourceRFID2, + + /// + eErrorSourceBarcode1, + + /// + eErrorSourceBarcode2, + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + public enum EErrorDetailTF { + + /// + eErrorDetailNone, + + /// + eErrorDetailSteppermotor, + + /// + eErrorDetailGoUntil, + + /// + eErrorDetailGetParameter, + + /// + eErrorDetailGetPosition, + + /// + eErrorDetailRun, + + /// + eErrorDetailSetParameter, + + /// + eErrorDetailQeiAtStart, + + /// + eErrorDetailQeiAtStopped, + + /// + eErrorDetailQeiAtMoving, + + /// + eErrorDetailGoto, + + /// + eErrorDetailStop, + + /// + eErrorDetailReleaseSW, + + /// + eErrorDetailHomeSensorIntrDuringReleaseSW, + + /// + eErrorDetailHomeSensorIntrGoto, + + /// + eErrorDetailHomingMove, + + /// + eErrorDetailStopRack, + + /// + eErrorDetailStopLift, + + /// + eErrorDetailUserManipulation, + + /// + eErrorDetailBeakerDetectionTooEarly, + + /// + eErrorDetailFlash, + + /// + eErrorDetailOneWire, + + /// + eErrorDetailIOExpanderError, + + /// + eErrorDetailIOExpanderParam, + + /// + eErrorDetailIOExpanderNotPresent, + + /// + eErrorDetailIOExpanderPlausibilityFailure, + + /// + eErrorDetailIOExpanderNotSupported, + + /// + eErrorDetailPWMExpanderError, + + /// + eErrorDetailMoveLiftUp, + + /// + eErrorDetailMoveRack, + + /// + eErrorDetailMoveLiftDown, + + /// + eErrorDetailYwithoutZ, + + /// + eErrorDetailYwithoutX, + + /// + eErrorDetailNoMotorDetected, + + /// + eErrorDetailNoI2CEepromDetected, + + /// + eErrorDetailRackPlatformWrong, + + /// + eErrorDetailRfidInventaryFailure, + + /// + eErrorDetailRfidPollingFailure, + + /// + eErrorDetailRfidReadFailure, + + /// + eErrorDetailRfidWriteFailure, + + /// + eErrorDetailRfidComFailure, + + /// + eErrorDetailRfidIntFailure, + + /// + eErrorDetailLifeSignMissing, + + /// + eErrorDetailUSBConnectionLost, + + /// + eErrorDetailUserFailure, + + /// + eErrorDetailTypificationChecksum, + + /// + eErrorDetailTypificationDeviceType, + + /// + eErrorDetailTypificationHWRevision, + + /// + eErrorDetailTypificationPlatform, + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class ResponseSamplerMoveRackRecord { + + private ECmdResultTF cmdResultField; + + private short beakerPositionField; + + private bool isBeakerAvailableField; + + /// + public ECmdResultTF cmdResult { + get { + return this.cmdResultField; + } + set { + this.cmdResultField = value; + } + } + + /// + public short beakerPosition { + get { + return this.beakerPositionField; + } + set { + this.beakerPositionField = value; + } + } + + /// + public bool isBeakerAvailable { + get { + return this.isBeakerAvailableField; + } + set { + this.isBeakerAvailableField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class CmdSamplerMoveLiftRecord { + + private ELiftPosition liftPositionField; + + /// + public ELiftPosition liftPosition { + get { + return this.liftPositionField; + } + set { + this.liftPositionField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class CmdSamplerPowerShowerRecord { + + private short rinseCyclesField; + + private short volumePerCycleField; + + /// + public short rinseCycles { + get { + return this.rinseCyclesField; + } + set { + this.rinseCyclesField = value; + } + } + + /// + public short volumePerCycle { + get { + return this.volumePerCycleField; + } + set { + this.volumePerCycleField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class CmdSamplerStopRecord { + + private ESamplerStop stopModeField; + + /// + public ESamplerStop stopMode { + get { + return this.stopModeField; + } + set { + this.stopModeField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + public enum ESamplerStop { + + /// + eSamplerStop_Rack, + + /// + eSamplerStop_Lift, + + /// + eSamplerStop_All, + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class CmdResetRecord { + + private EResetOption resetOptionField; + + /// + public EResetOption resetOption { + get { + return this.resetOptionField; + } + set { + this.resetOptionField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + public enum EResetOption { + + /// + eResetOption_Device, + + /// + eResetOption_Protocol, + + /// + eResetOption_All, + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class RemoteUserSettings { + + private EColor m_settingsColorField; + + private EScreenBrightness m_settingsBrightnessField; + + private EButtonShape m_buttonShapeField; + + private bool m_screenSaverField; + + private short m_screenSaverWaitingTimeField; + + private EAlphanumericKeyboard m_alphanumericKeyboardField; + + private ENumericKeyboard m_numericKeyboardField; + + /// + public EColor m_settingsColor { + get { + return this.m_settingsColorField; + } + set { + this.m_settingsColorField = value; + } + } + + /// + public EScreenBrightness m_settingsBrightness { + get { + return this.m_settingsBrightnessField; + } + set { + this.m_settingsBrightnessField = value; + } + } + + /// + public EButtonShape m_buttonShape { + get { + return this.m_buttonShapeField; + } + set { + this.m_buttonShapeField = value; + } + } + + /// + public bool m_screenSaver { + get { + return this.m_screenSaverField; + } + set { + this.m_screenSaverField = value; + } + } + + /// + public short m_screenSaverWaitingTime { + get { + return this.m_screenSaverWaitingTimeField; + } + set { + this.m_screenSaverWaitingTimeField = value; + } + } + + /// + public EAlphanumericKeyboard m_alphanumericKeyboard { + get { + return this.m_alphanumericKeyboardField; + } + set { + this.m_alphanumericKeyboardField = value; + } + } + + /// + public ENumericKeyboard m_numericKeyboard { + get { + return this.m_numericKeyboardField; + } + set { + this.m_numericKeyboardField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + public enum EColor { + + /// + eColorid_Color_Grey, + + /// + eColorid_Color_Blue, + + /// + eColorid_Color_Green, + + /// + eColorid_Color_Red, + + /// + eColorid_Color_GreyLight, + + /// + eColorid_Color_BlueLight, + + /// + eColorid_Color_GreenLight, + + /// + eColorid_Color_RedLight, + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + public enum EScreenBrightness { + + /// + eScreenBrightnessid_ScreenBrightness_50, + + /// + eScreenBrightnessid_ScreenBrightness_60, + + /// + eScreenBrightnessid_ScreenBrightness_70, + + /// + eScreenBrightnessid_ScreenBrightness_80, + + /// + eScreenBrightnessid_ScreenBrightness_90, + + /// + eScreenBrightnessid_ScreenBrightness_100, + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + public enum EButtonShape { + + /// + eButtonShapeid_ButtonShape_Roundly, + + /// + eButtonShapeid_ButtonShape_Angularly, + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + public enum EAlphanumericKeyboard { + + /// + eAlphanumericKeyboardid_AlphanumericKeyboard_English, + + /// + eAlphanumericKeyboardid_AlphanumericKeyboard_French, + + /// + eAlphanumericKeyboardid_AlphanumericKeyboard_German, + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + public enum ENumericKeyboard { + + /// + eNumericKeyboardid_NumericKeyboard_Calculator, + + /// + eNumericKeyboardid_NumericKeyboard_Handy, + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class RemoteLanguageInfo { + + private ELanguage m_languageField; + + /// + public ELanguage m_language { + get { + return this.m_languageField; + } + set { + this.m_languageField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + public enum ELanguage { + + /// + eLanguageid_Language_German, + + /// + eLanguageid_Language_English, + + /// + eLanguageid_Language_French, + + /// + eLanguageid_Language_Italian, + + /// + eLanguageid_Language_Spanish, + + /// + eLanguageid_Language_Chinese, + + /// + eLanguageid_Language_Russian, + + /// + eLanguageid_Language_Japanese, + + /// + eLanguageid_Language_Korean, + + /// + eLanguageid_Language_Portuguese, + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class Remote_MTServiceRecord { + + private System.DateTime m_startupDateField; + + private System.DateTime m_lastServiceField; + + private System.DateTime m_nextServiceField; + + /// + public System.DateTime m_startupDate { + get { + return this.m_startupDateField; + } + set { + this.m_startupDateField = value; + } + } + + /// + public System.DateTime m_lastService { + get { + return this.m_lastServiceField; + } + set { + this.m_lastServiceField = value; + } + } + + /// + public System.DateTime m_nextService { + get { + return this.m_nextServiceField; + } + set { + this.m_nextServiceField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class PnPStatus { + + private EPnPStatus m_status_HandBCRField; + + private EPnPStatus m_status_BuildInBCRField; + + private EPnPStatus m_status_LinePrinterField; + + private EPnPStatus m_status_FingerprintReaderField; + + private EPnPStatus m_status_USBStickField; + + /// + public EPnPStatus m_status_HandBCR { + get { + return this.m_status_HandBCRField; + } + set { + this.m_status_HandBCRField = value; + } + } + + /// + public EPnPStatus m_status_BuildInBCR { + get { + return this.m_status_BuildInBCRField; + } + set { + this.m_status_BuildInBCRField = value; + } + } + + /// + public EPnPStatus m_status_LinePrinter { + get { + return this.m_status_LinePrinterField; + } + set { + this.m_status_LinePrinterField = value; + } + } + + /// + public EPnPStatus m_status_FingerprintReader { + get { + return this.m_status_FingerprintReaderField; + } + set { + this.m_status_FingerprintReaderField = value; + } + } + + /// + public EPnPStatus m_status_USBStick { + get { + return this.m_status_USBStickField; + } + set { + this.m_status_USBStickField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + public enum EPnPStatus { + + /// + ePnPStatusid_PnPStatus_Installed, + + /// + ePnPStatusid_PnPStatus_NotInstalled, + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class GeneralheaderRecord { + + private string m_requestTypeNameField; + + private ulong m_requestIDField; + + /// + public string m_requestTypeName { + get { + return this.m_requestTypeNameField; + } + set { + this.m_requestTypeNameField = value; + } + } + + /// + public ulong m_requestID { + get { + return this.m_requestIDField; + } + set { + this.m_requestIDField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class Response_SimpleResultRecord { + + private bool m_bSuccessField; + + private string m_errorReasonField; + + /// + public bool m_bSuccess { + get { + return this.m_bSuccessField; + } + set { + this.m_bSuccessField = value; + } + } + + /// + public string m_errorReason { + get { + return this.m_errorReasonField; + } + set { + this.m_errorReasonField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class Response_StatusRecord { + + private string m_statusField; + + /// + public string m_status { + get { + return this.m_statusField; + } + set { + this.m_statusField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class Request_moduleSetRecord { + + private string m_moduleIdField; + + private string m_sensorIdField; + + /// + public string m_moduleId { + get { + return this.m_moduleIdField; + } + set { + this.m_moduleIdField = value; + } + } + + /// + public string m_sensorId { + get { + return this.m_sensorIdField; + } + set { + this.m_sensorIdField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class moduleConfigParamRecord { + + private string m_moduleIdField; + + private string m_sensorIdField; + + private string m_tempSensorIdField; + + /// + public string m_moduleId { + get { + return this.m_moduleIdField; + } + set { + this.m_moduleIdField = value; + } + } + + /// + public string m_sensorId { + get { + return this.m_sensorIdField; + } + set { + this.m_sensorIdField = value; + } + } + + /// + public string m_tempSensorId { + get { + return this.m_tempSensorIdField; + } + set { + this.m_tempSensorIdField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class Response_moduleGetRecord { + + private moduleConfigParamRecord[] m_moduleConfigsField; + + /// + [System.Xml.Serialization.XmlArrayItemAttribute("ArrayOfModuleConfigParamRecord")] + public moduleConfigParamRecord[] m_moduleConfigs { + get { + return this.m_moduleConfigsField; + } + set { + this.m_moduleConfigsField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class ArrayOfModuleConfigParamRecord { + + private moduleConfigParamRecord[] arrayOfModuleConfigParamRecord1Field; + + /// + [System.Xml.Serialization.XmlElementAttribute("ArrayOfModuleConfigParamRecord", IsNullable=true)] + public moduleConfigParamRecord[] ArrayOfModuleConfigParamRecord1 { + get { + return this.arrayOfModuleConfigParamRecord1Field; + } + set { + this.arrayOfModuleConfigParamRecord1Field = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class Request_methodParamsRecord { + + private string m_methodIdField; + + private string[] m_sensorIDsField; + + private string m_sampleIdField; + + private string m_userIdField; + + private string m_commentField; + + private bool m_bLocalStoreField; + + /// + public string m_methodId { + get { + return this.m_methodIdField; + } + set { + this.m_methodIdField = value; + } + } + + /// + [System.Xml.Serialization.XmlArrayItemAttribute("ArrayOfString")] + public string[] m_sensorIDs { + get { + return this.m_sensorIDsField; + } + set { + this.m_sensorIDsField = value; + } + } + + /// + public string m_sampleId { + get { + return this.m_sampleIdField; + } + set { + this.m_sampleIdField = value; + } + } + + /// + public string m_userId { + get { + return this.m_userIdField; + } + set { + this.m_userIdField = value; + } + } + + /// + public string m_comment { + get { + return this.m_commentField; + } + set { + this.m_commentField = value; + } + } + + /// + public bool m_bLocalStore { + get { + return this.m_bLocalStoreField; + } + set { + this.m_bLocalStoreField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class Response_startMethodRecord { + + private string m_methodIdField; + + private short m_jobIdField; + + /// + public string m_methodId { + get { + return this.m_methodIdField; + } + set { + this.m_methodIdField = value; + } + } + + /// + public short m_jobId { + get { + return this.m_jobIdField; + } + set { + this.m_jobIdField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class Request_terminateMethodRecord { + + private short m_jobIdField; + + /// + public short m_jobId { + get { + return this.m_jobIdField; + } + set { + this.m_jobIdField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class Request_loginRecord { + + private string[] m_usernamesField; + + /// + [System.Xml.Serialization.XmlArrayItemAttribute("ArrayOfString")] + public string[] m_usernames { + get { + return this.m_usernamesField; + } + set { + this.m_usernamesField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class Response_loginRecord { + + private string m_usernameField; + + private string m_passwordField; + + /// + public string m_username { + get { + return this.m_usernameField; + } + set { + this.m_usernameField = value; + } + } + + /// + public string m_password { + get { + return this.m_passwordField; + } + set { + this.m_passwordField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class Request_setupGetItemListRecord { + + private string m_itemTypeField; + + /// + public string m_itemType { + get { + return this.m_itemTypeField; + } + set { + this.m_itemTypeField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class Response_setupGetItemListRecord { + + private string[] m_itemListField; + + /// + [System.Xml.Serialization.XmlArrayItemAttribute("ArrayOfString")] + public string[] m_itemList { + get { + return this.m_itemListField; + } + set { + this.m_itemListField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class SettingItemRecord { + + private string m_itemNameField; + + private string m_itemValueField; + + /// + public string m_itemName { + get { + return this.m_itemNameField; + } + set { + this.m_itemNameField = value; + } + } + + /// + public string m_itemValue { + get { + return this.m_itemValueField; + } + set { + this.m_itemValueField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class Request_getSettingRecord { + + private string m_settingNameField; + + /// + public string m_settingName { + get { + return this.m_settingNameField; + } + set { + this.m_settingNameField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class Response_getSettingRecord { + + private string m_settingNameField; + + private string m_settingValueField; + + /// + public string m_settingName { + get { + return this.m_settingNameField; + } + set { + this.m_settingNameField = value; + } + } + + /// + public string m_settingValue { + get { + return this.m_settingValueField; + } + set { + this.m_settingValueField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class Request_setSettingRecord { + + private string m_settingNameField; + + private string m_settingValueField; + + /// + public string m_settingName { + get { + return this.m_settingNameField; + } + set { + this.m_settingNameField = value; + } + } + + /// + public string m_settingValue { + get { + return this.m_settingValueField; + } + set { + this.m_settingValueField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class Request_setupExportRecord { + + private string m_itemGroupField; + + private string m_itemNameField; + + /// + public string m_itemGroup { + get { + return this.m_itemGroupField; + } + set { + this.m_itemGroupField = value; + } + } + + /// + public string m_itemName { + get { + return this.m_itemNameField; + } + set { + this.m_itemNameField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class Notification_ISMChangeRecord { + + private string m_deviceTypeField; + + private string m_sensorNameField; + + private bool m_bPluginField; + + private short m_moduleIdField; + + /// + public string m_deviceType { + get { + return this.m_deviceTypeField; + } + set { + this.m_deviceTypeField = value; + } + } + + /// + public string m_sensorName { + get { + return this.m_sensorNameField; + } + set { + this.m_sensorNameField = value; + } + } + + /// + public bool m_bPlugin { + get { + return this.m_bPluginField; + } + set { + this.m_bPluginField = value; + } + } + + /// + public short m_moduleId { + get { + return this.m_moduleIdField; + } + set { + this.m_moduleIdField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class ModuleRecord { + + private string m_moduleNameField; + + private EModuleID m_moduleIDField; + + private EGModuleType m_moduleTypeField; + + private string m_serialNumberField; + + private string m_softwareVersionField; + + private bool m_isActivedField; + + private string m_sensorIDField; + + private string m_sensorUUIDField; + + private ESensorType m_sensorTypeField; + + private ESensorClass m_sensorClassField; + + private System.DateTime m_calDateField; + + private string m_calCreatorField; + + private string m_temperatureSensorIDField; + + private string m_temperatureSensorUUIDField; + + private bool m_printField; + + private EReportFormat m_printFormatField; + + private bool m_stirFlagField; + + private short m_stirSpeedField; + + private bool m_reportValueCalculationField; + + private bool m_reportDataField; + + private bool m_reportInfoField; + + /// + public string m_moduleName { + get { + return this.m_moduleNameField; + } + set { + this.m_moduleNameField = value; + } + } + + /// + public EModuleID m_moduleID { + get { + return this.m_moduleIDField; + } + set { + this.m_moduleIDField = value; + } + } + + /// + public EGModuleType m_moduleType { + get { + return this.m_moduleTypeField; + } + set { + this.m_moduleTypeField = value; + } + } + + /// + public string m_serialNumber { + get { + return this.m_serialNumberField; + } + set { + this.m_serialNumberField = value; + } + } + + /// + public string m_softwareVersion { + get { + return this.m_softwareVersionField; + } + set { + this.m_softwareVersionField = value; + } + } + + /// + public bool m_isActived { + get { + return this.m_isActivedField; + } + set { + this.m_isActivedField = value; + } + } + + /// + public string m_sensorID { + get { + return this.m_sensorIDField; + } + set { + this.m_sensorIDField = value; + } + } + + /// + public string m_sensorUUID { + get { + return this.m_sensorUUIDField; + } + set { + this.m_sensorUUIDField = value; + } + } + + /// + public ESensorType m_sensorType { + get { + return this.m_sensorTypeField; + } + set { + this.m_sensorTypeField = value; + } + } + + /// + public ESensorClass m_sensorClass { + get { + return this.m_sensorClassField; + } + set { + this.m_sensorClassField = value; + } + } + + /// + public System.DateTime m_calDate { + get { + return this.m_calDateField; + } + set { + this.m_calDateField = value; + } + } + + /// + public string m_calCreator { + get { + return this.m_calCreatorField; + } + set { + this.m_calCreatorField = value; + } + } + + /// + public string m_temperatureSensorID { + get { + return this.m_temperatureSensorIDField; + } + set { + this.m_temperatureSensorIDField = value; + } + } + + /// + public string m_temperatureSensorUUID { + get { + return this.m_temperatureSensorUUIDField; + } + set { + this.m_temperatureSensorUUIDField = value; + } + } + + /// + public bool m_print { + get { + return this.m_printField; + } + set { + this.m_printField = value; + } + } + + /// + public EReportFormat m_printFormat { + get { + return this.m_printFormatField; + } + set { + this.m_printFormatField = value; + } + } + + /// + public bool m_stirFlag { + get { + return this.m_stirFlagField; + } + set { + this.m_stirFlagField = value; + } + } + + /// + public short m_stirSpeed { + get { + return this.m_stirSpeedField; + } + set { + this.m_stirSpeedField = value; + } + } + + /// + public bool m_reportValueCalculation { + get { + return this.m_reportValueCalculationField; + } + set { + this.m_reportValueCalculationField = value; + } + } + + /// + public bool m_reportData { + get { + return this.m_reportDataField; + } + set { + this.m_reportDataField = value; + } + } + + /// + public bool m_reportInfo { + get { + return this.m_reportInfoField; + } + set { + this.m_reportInfoField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + public enum EGModuleType { + + /// + eGModuleTypeid_GModuleType_None, + + /// + eGModuleTypeid_GModuleType_PHIsfet, + + /// + eGModuleTypeid_GModuleType_PHIon, + + /// + eGModuleTypeid_GModuleType_Cond, + + /// + eGModuleTypeid_GModuleType_DO, + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + public enum EReportFormat { + + /// + eReportFormatid_ReportFormat_Summary, + + /// + eReportFormatid_ReportFormat_UserDefined, + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class MFTitleRecord { + + private EMethodType m_methodTypeIDField; + + private string m_methodIDField; + + private string m_methodTitleField; + + private string m_methodCreatedUserField; + + private System.DateTime m_methodCreatedTimeField; + + private string m_methodModifiedUserField; + + private System.DateTime m_methodModifiedTimeField; + + private bool m_methodProtectedField; + + private bool m_methodSOPFlagField; + + private string m_methodSOPTextField; + + /// + public EMethodType m_methodTypeID { + get { + return this.m_methodTypeIDField; + } + set { + this.m_methodTypeIDField = value; + } + } + + /// + public string m_methodID { + get { + return this.m_methodIDField; + } + set { + this.m_methodIDField = value; + } + } + + /// + public string m_methodTitle { + get { + return this.m_methodTitleField; + } + set { + this.m_methodTitleField = value; + } + } + + /// + public string m_methodCreatedUser { + get { + return this.m_methodCreatedUserField; + } + set { + this.m_methodCreatedUserField = value; + } + } + + /// + public System.DateTime m_methodCreatedTime { + get { + return this.m_methodCreatedTimeField; + } + set { + this.m_methodCreatedTimeField = value; + } + } + + /// + public string m_methodModifiedUser { + get { + return this.m_methodModifiedUserField; + } + set { + this.m_methodModifiedUserField = value; + } + } + + /// + public System.DateTime m_methodModifiedTime { + get { + return this.m_methodModifiedTimeField; + } + set { + this.m_methodModifiedTimeField = value; + } + } + + /// + public bool m_methodProtected { + get { + return this.m_methodProtectedField; + } + set { + this.m_methodProtectedField = value; + } + } + + /// + public bool m_methodSOPFlag { + get { + return this.m_methodSOPFlagField; + } + set { + this.m_methodSOPFlagField = value; + } + } + + /// + public string m_methodSOPText { + get { + return this.m_methodSOPTextField; + } + set { + this.m_methodSOPTextField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + public enum EMethodType { + + /// + eMethodTypeid_MethodType_Measure, + + /// + eMethodTypeid_MethodType_Calibration, + + /// + eMethodTypeid_MethodType_SensorTest, + + /// + eMethodTypeid_MethodType_Interval, + + /// + eMethodTypeid_MethodType_Incremental, + + /// + eMethodTypeid_MethodType_OUR, + + /// + eMethodTypeid_MethodType_SOUR, + + /// + eMethodTypeid_MethodType_BOD, + + /// + eMethodTypeid_MethodType_BCV, + + /// + eMethodTypeid_MethodType_DirectMeasure, + + /// + eMethodTypeid_MethodType_DirectCalibration, + + /// + eMethodTypeid_MethodType_Service, + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class ResultInfoRecord { + + private short m_moduleTypeField; + + private string m_moduleSNField; + + private short m_sensorTypeField; + + private short m_sensorClassField; + + private string m_sensorNameField; + + private string m_sensorSerialNumberField; + + private short m_eIonTypeField; + + private short m_eIonChargeField; + + private decfloat m_ionMolarMassField; + + private System.DateTime m_calDateField; + + private string m_calCreatorField; + + private short m_eTemperatureCaptureField; + + private string m_tempSensorField; + + private string m_tempSensorSNField; + + /// + public short m_moduleType { + get { + return this.m_moduleTypeField; + } + set { + this.m_moduleTypeField = value; + } + } + + /// + public string m_moduleSN { + get { + return this.m_moduleSNField; + } + set { + this.m_moduleSNField = value; + } + } + + /// + public short m_sensorType { + get { + return this.m_sensorTypeField; + } + set { + this.m_sensorTypeField = value; + } + } + + /// + public short m_sensorClass { + get { + return this.m_sensorClassField; + } + set { + this.m_sensorClassField = value; + } + } + + /// + public string m_sensorName { + get { + return this.m_sensorNameField; + } + set { + this.m_sensorNameField = value; + } + } + + /// + public string m_sensorSerialNumber { + get { + return this.m_sensorSerialNumberField; + } + set { + this.m_sensorSerialNumberField = value; + } + } + + /// + public short m_eIonType { + get { + return this.m_eIonTypeField; + } + set { + this.m_eIonTypeField = value; + } + } + + /// + public short m_eIonCharge { + get { + return this.m_eIonChargeField; + } + set { + this.m_eIonChargeField = value; + } + } + + /// + public decfloat m_ionMolarMass { + get { + return this.m_ionMolarMassField; + } + set { + this.m_ionMolarMassField = value; + } + } + + /// + public System.DateTime m_calDate { + get { + return this.m_calDateField; + } + set { + this.m_calDateField = value; + } + } + + /// + public string m_calCreator { + get { + return this.m_calCreatorField; + } + set { + this.m_calCreatorField = value; + } + } + + /// + public short m_eTemperatureCapture { + get { + return this.m_eTemperatureCaptureField; + } + set { + this.m_eTemperatureCaptureField = value; + } + } + + /// + public string m_tempSensor { + get { + return this.m_tempSensorField; + } + set { + this.m_tempSensorField = value; + } + } + + /// + public string m_tempSensorSN { + get { + return this.m_tempSensorSNField; + } + set { + this.m_tempSensorSNField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class MFConfigurationRecord { + + private EMeasurementType m_measType1Field; + + private string m_sensor1Field; + + private ETemperatureCapture m_tempCapture1Field; + + private string m_tempSensor1Field; + + private EBarometricCapture m_barometricCapture1Field; + + private EMeasurementType m_measType2Field; + + private string m_sensor2Field; + + private ETemperatureCapture m_tempCapture2Field; + + private string m_tempSensor2Field; + + private EBarometricCapture m_barometricCapture2Field; + + private EMeasurementType m_measType3Field; + + private string m_sensor3Field; + + private ETemperatureCapture m_tempCapture3Field; + + private string m_tempSensor3Field; + + private EBarometricCapture m_barometricCapture3Field; + + private bool m_overlapTempCaptureFlagField; + + private EMeasIndex m_measIDForUsedTemperatureField; + + private bool m_isAutomationField; + + private bool m_isRadioClockTimeField; + + private ResultInfoRecord[] m_resultInfosField; + + /// + public EMeasurementType m_measType1 { + get { + return this.m_measType1Field; + } + set { + this.m_measType1Field = value; + } + } + + /// + public string m_sensor1 { + get { + return this.m_sensor1Field; + } + set { + this.m_sensor1Field = value; + } + } + + /// + public ETemperatureCapture m_tempCapture1 { + get { + return this.m_tempCapture1Field; + } + set { + this.m_tempCapture1Field = value; + } + } + + /// + public string m_tempSensor1 { + get { + return this.m_tempSensor1Field; + } + set { + this.m_tempSensor1Field = value; + } + } + + /// + public EBarometricCapture m_barometricCapture1 { + get { + return this.m_barometricCapture1Field; + } + set { + this.m_barometricCapture1Field = value; + } + } + + /// + public EMeasurementType m_measType2 { + get { + return this.m_measType2Field; + } + set { + this.m_measType2Field = value; + } + } + + /// + public string m_sensor2 { + get { + return this.m_sensor2Field; + } + set { + this.m_sensor2Field = value; + } + } + + /// + public ETemperatureCapture m_tempCapture2 { + get { + return this.m_tempCapture2Field; + } + set { + this.m_tempCapture2Field = value; + } + } + + /// + public string m_tempSensor2 { + get { + return this.m_tempSensor2Field; + } + set { + this.m_tempSensor2Field = value; + } + } + + /// + public EBarometricCapture m_barometricCapture2 { + get { + return this.m_barometricCapture2Field; + } + set { + this.m_barometricCapture2Field = value; + } + } + + /// + public EMeasurementType m_measType3 { + get { + return this.m_measType3Field; + } + set { + this.m_measType3Field = value; + } + } + + /// + public string m_sensor3 { + get { + return this.m_sensor3Field; + } + set { + this.m_sensor3Field = value; + } + } + + /// + public ETemperatureCapture m_tempCapture3 { + get { + return this.m_tempCapture3Field; + } + set { + this.m_tempCapture3Field = value; + } + } + + /// + public string m_tempSensor3 { + get { + return this.m_tempSensor3Field; + } + set { + this.m_tempSensor3Field = value; + } + } + + /// + public EBarometricCapture m_barometricCapture3 { + get { + return this.m_barometricCapture3Field; + } + set { + this.m_barometricCapture3Field = value; + } + } + + /// + public bool m_overlapTempCaptureFlag { + get { + return this.m_overlapTempCaptureFlagField; + } + set { + this.m_overlapTempCaptureFlagField = value; + } + } + + /// + public EMeasIndex m_measIDForUsedTemperature { + get { + return this.m_measIDForUsedTemperatureField; + } + set { + this.m_measIDForUsedTemperatureField = value; + } + } + + /// + public bool m_isAutomation { + get { + return this.m_isAutomationField; + } + set { + this.m_isAutomationField = value; + } + } + + /// + public bool m_isRadioClockTime { + get { + return this.m_isRadioClockTimeField; + } + set { + this.m_isRadioClockTimeField = value; + } + } + + /// + [System.Xml.Serialization.XmlArrayItemAttribute("ArrayOfResultInfoRecord")] + public ResultInfoRecord[] m_resultInfos { + get { + return this.m_resultInfosField; + } + set { + this.m_resultInfosField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + public enum EMeasurementType { + + /// + eMeasurementTypeid_MeasurementType_PH, + + /// + eMeasurementTypeid_MeasurementType_Ion, + + /// + eMeasurementTypeid_MeasurementType_Cond, + + /// + eMeasurementTypeid_MeasurementType_DO, + + /// + eMeasurementTypeid_MeasurementType_Redox, + + /// + eMeasurementTypeid_MeasurementType_None, + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + public enum EMeasIndex { + + /// + eMeasIndexid_MeasIndex_MeasType1, + + /// + eMeasIndexid_MeasIndex_MeasType2, + + /// + eMeasIndexid_MeasIndex_MeasType3, + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class ArrayOfResultInfoRecord { + + private ResultInfoRecord[] arrayOfResultInfoRecord1Field; + + /// + [System.Xml.Serialization.XmlElementAttribute("ArrayOfResultInfoRecord", IsNullable=true)] + public ResultInfoRecord[] ArrayOfResultInfoRecord1 { + get { + return this.arrayOfResultInfoRecord1Field; + } + set { + this.arrayOfResultInfoRecord1Field = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class MFSampleMeasureIntervalRecord { + + private string m_sampleIDField; + + private decfloat m_manualTemperatureCField; + + private decfloat m_manualTemperatureFField; + + private decfloat m_salCorrectionFactorField; + + private decfloat m_manualBarometric_mBarField; + + private decfloat m_manualBarometric_hPaField; + + private decfloat m_manualBarometric_mmHgField; + + private decfloat m_manualBarometric_AtmField; + + private string m_commentField; + + /// + public string m_sampleID { + get { + return this.m_sampleIDField; + } + set { + this.m_sampleIDField = value; + } + } + + /// + public decfloat m_manualTemperatureC { + get { + return this.m_manualTemperatureCField; + } + set { + this.m_manualTemperatureCField = value; + } + } + + /// + public decfloat m_manualTemperatureF { + get { + return this.m_manualTemperatureFField; + } + set { + this.m_manualTemperatureFField = value; + } + } + + /// + public decfloat m_salCorrectionFactor { + get { + return this.m_salCorrectionFactorField; + } + set { + this.m_salCorrectionFactorField = value; + } + } + + /// + public decfloat m_manualBarometric_mBar { + get { + return this.m_manualBarometric_mBarField; + } + set { + this.m_manualBarometric_mBarField = value; + } + } + + /// + public decfloat m_manualBarometric_hPa { + get { + return this.m_manualBarometric_hPaField; + } + set { + this.m_manualBarometric_hPaField = value; + } + } + + /// + public decfloat m_manualBarometric_mmHg { + get { + return this.m_manualBarometric_mmHgField; + } + set { + this.m_manualBarometric_mmHgField = value; + } + } + + /// + public decfloat m_manualBarometric_Atm { + get { + return this.m_manualBarometric_AtmField; + } + set { + this.m_manualBarometric_AtmField = value; + } + } + + /// + public string m_comment { + get { + return this.m_commentField; + } + set { + this.m_commentField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class MFSampleCalibrationRecord { + + private string m_bufStdGrpUuidField; + + private string m_bufStdGrpField; + + private decfloat m_bufRefTemperatureField; + + private ECalMode m_calModeField; + + private bool m_autoBufRecogField; + + private ECalPointNum m_bufStdNumField; + + private MTValue[] m_bufStdSeqField; + + private ECalPointNum m_doCalPointField; + + private EDOCalStd1Type m_doCalStd1TypeField; + + private decfloat m_doConcentractionField; + + private decfloat m_salCorrectionFactorField; + + private decfloat m_manualTemperatureCField; + + private decfloat m_manualTemperatureFField; + + private decfloat m_manualBarometric_mBarField; + + private decfloat m_manualBarometric_hPaField; + + private decfloat m_manualBarometric_mmHgField; + + private decfloat m_manualBarometric_AtmField; + + private string m_commentField; + + /// + public string m_bufStdGrpUuid { + get { + return this.m_bufStdGrpUuidField; + } + set { + this.m_bufStdGrpUuidField = value; + } + } + + /// + public string m_bufStdGrp { + get { + return this.m_bufStdGrpField; + } + set { + this.m_bufStdGrpField = value; + } + } + + /// + public decfloat m_bufRefTemperature { + get { + return this.m_bufRefTemperatureField; + } + set { + this.m_bufRefTemperatureField = value; + } + } + + /// + public ECalMode m_calMode { + get { + return this.m_calModeField; + } + set { + this.m_calModeField = value; + } + } + + /// + public bool m_autoBufRecog { + get { + return this.m_autoBufRecogField; + } + set { + this.m_autoBufRecogField = value; + } + } + + /// + public ECalPointNum m_bufStdNum { + get { + return this.m_bufStdNumField; + } + set { + this.m_bufStdNumField = value; + } + } + + /// + [System.Xml.Serialization.XmlArrayItemAttribute("ArrayOfMTValue")] + public MTValue[] m_bufStdSeq { + get { + return this.m_bufStdSeqField; + } + set { + this.m_bufStdSeqField = value; + } + } + + /// + public ECalPointNum m_doCalPoint { + get { + return this.m_doCalPointField; + } + set { + this.m_doCalPointField = value; + } + } + + /// + public EDOCalStd1Type m_doCalStd1Type { + get { + return this.m_doCalStd1TypeField; + } + set { + this.m_doCalStd1TypeField = value; + } + } + + /// + public decfloat m_doConcentraction { + get { + return this.m_doConcentractionField; + } + set { + this.m_doConcentractionField = value; + } + } + + /// + public decfloat m_salCorrectionFactor { + get { + return this.m_salCorrectionFactorField; + } + set { + this.m_salCorrectionFactorField = value; + } + } + + /// + public decfloat m_manualTemperatureC { + get { + return this.m_manualTemperatureCField; + } + set { + this.m_manualTemperatureCField = value; + } + } + + /// + public decfloat m_manualTemperatureF { + get { + return this.m_manualTemperatureFField; + } + set { + this.m_manualTemperatureFField = value; + } + } + + /// + public decfloat m_manualBarometric_mBar { + get { + return this.m_manualBarometric_mBarField; + } + set { + this.m_manualBarometric_mBarField = value; + } + } + + /// + public decfloat m_manualBarometric_hPa { + get { + return this.m_manualBarometric_hPaField; + } + set { + this.m_manualBarometric_hPaField = value; + } + } + + /// + public decfloat m_manualBarometric_mmHg { + get { + return this.m_manualBarometric_mmHgField; + } + set { + this.m_manualBarometric_mmHgField = value; + } + } + + /// + public decfloat m_manualBarometric_Atm { + get { + return this.m_manualBarometric_AtmField; + } + set { + this.m_manualBarometric_AtmField = value; + } + } + + /// + public string m_comment { + get { + return this.m_commentField; + } + set { + this.m_commentField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + public enum ECalPointNum { + + /// + eCalPointNumid_CalPointNum_0, + + /// + eCalPointNumid_CalPointNum_1, + + /// + eCalPointNumid_CalPointNum_2, + + /// + eCalPointNumid_CalPointNum_3, + + /// + eCalPointNumid_CalPointNum_4, + + /// + eCalPointNumid_CalPointNum_5, + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + public enum EDOCalStd1Type { + + /// + eDOCalStd1Typeid_DOCalStd1Type_SaturatedAir, + + /// + eDOCalStd1Typeid_DOCalStd1Type_ManualEntry, + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class ArrayOfMTValue { + + private MTValue[] arrayOfMTValue1Field; + + /// + [System.Xml.Serialization.XmlElementAttribute("ArrayOfMTValue", IsNullable=true)] + public MTValue[] ArrayOfMTValue1 { + get { + return this.arrayOfMTValue1Field; + } + set { + this.arrayOfMTValue1Field = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class MFSampleSensorTestRecord { + + private bool m_calibrationFlagField; + + private string m_bufStdGrpUuidField; + + private string m_bufStdGrpField; + + private decfloat m_bufRefTemperatureField; + + private ECalMode m_calModeField; + + private bool m_autoBufRecogField; + + private ECalPointNum m_bufStdNumField; + + private ECommonUnit m_bufStddUnitField; + + private MTValue[] m_bufStdSeqField; + + private bool m_driftTestField; + + private bool m_testMeasurementsFlagField; + + private ECalPointNum m_testMeasurementsNumField; + + private MTValue[] m_testBufSeqField; + + private decfloat m_manualTemperatureCField; + + private decfloat m_manualTemperatureFField; + + private string m_commentField; + + /// + public bool m_calibrationFlag { + get { + return this.m_calibrationFlagField; + } + set { + this.m_calibrationFlagField = value; + } + } + + /// + public string m_bufStdGrpUuid { + get { + return this.m_bufStdGrpUuidField; + } + set { + this.m_bufStdGrpUuidField = value; + } + } + + /// + public string m_bufStdGrp { + get { + return this.m_bufStdGrpField; + } + set { + this.m_bufStdGrpField = value; + } + } + + /// + public decfloat m_bufRefTemperature { + get { + return this.m_bufRefTemperatureField; + } + set { + this.m_bufRefTemperatureField = value; + } + } + + /// + public ECalMode m_calMode { + get { + return this.m_calModeField; + } + set { + this.m_calModeField = value; + } + } + + /// + public bool m_autoBufRecog { + get { + return this.m_autoBufRecogField; + } + set { + this.m_autoBufRecogField = value; + } + } + + /// + public ECalPointNum m_bufStdNum { + get { + return this.m_bufStdNumField; + } + set { + this.m_bufStdNumField = value; + } + } + + /// + public ECommonUnit m_bufStddUnit { + get { + return this.m_bufStddUnitField; + } + set { + this.m_bufStddUnitField = value; + } + } + + /// + [System.Xml.Serialization.XmlArrayItemAttribute("ArrayOfMTValue")] + public MTValue[] m_bufStdSeq { + get { + return this.m_bufStdSeqField; + } + set { + this.m_bufStdSeqField = value; + } + } + + /// + public bool m_driftTest { + get { + return this.m_driftTestField; + } + set { + this.m_driftTestField = value; + } + } + + /// + public bool m_testMeasurementsFlag { + get { + return this.m_testMeasurementsFlagField; + } + set { + this.m_testMeasurementsFlagField = value; + } + } + + /// + public ECalPointNum m_testMeasurementsNum { + get { + return this.m_testMeasurementsNumField; + } + set { + this.m_testMeasurementsNumField = value; + } + } + + /// + [System.Xml.Serialization.XmlArrayItemAttribute("ArrayOfMTValue")] + public MTValue[] m_testBufSeq { + get { + return this.m_testBufSeqField; + } + set { + this.m_testBufSeqField = value; + } + } + + /// + public decfloat m_manualTemperatureC { + get { + return this.m_manualTemperatureCField; + } + set { + this.m_manualTemperatureCField = value; + } + } + + /// + public decfloat m_manualTemperatureF { + get { + return this.m_manualTemperatureFField; + } + set { + this.m_manualTemperatureFField = value; + } + } + + /// + public string m_comment { + get { + return this.m_commentField; + } + set { + this.m_commentField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class MFSampleIncrementalRecord { + + private string m_sampleIDField; + + private EIncrementalType m_incrementalTypeField; + + private decfloat m_sampleVolumeField; + + private EIonRatio m_ionRatioField; + + private decfloat m_standardVolumeField; + + private ECommonUnit m_bufStdUnitField; + + private decfloat m_stdConcentrationField; + + private ECalPointNum m_stdAdditionsNumField; + + private decfloat m_addedVolumePerAddField; + + private EUsedSlope m_usedSlopeField; + + private decfloat m_knownSlopeField; + + private decfloat m_manualTemperatureCField; + + private decfloat m_manualTemperatureFField; + + private string m_commentField; + + /// + public string m_sampleID { + get { + return this.m_sampleIDField; + } + set { + this.m_sampleIDField = value; + } + } + + /// + public EIncrementalType m_incrementalType { + get { + return this.m_incrementalTypeField; + } + set { + this.m_incrementalTypeField = value; + } + } + + /// + public decfloat m_sampleVolume { + get { + return this.m_sampleVolumeField; + } + set { + this.m_sampleVolumeField = value; + } + } + + /// + public EIonRatio m_ionRatio { + get { + return this.m_ionRatioField; + } + set { + this.m_ionRatioField = value; + } + } + + /// + public decfloat m_standardVolume { + get { + return this.m_standardVolumeField; + } + set { + this.m_standardVolumeField = value; + } + } + + /// + public ECommonUnit m_bufStdUnit { + get { + return this.m_bufStdUnitField; + } + set { + this.m_bufStdUnitField = value; + } + } + + /// + public decfloat m_stdConcentration { + get { + return this.m_stdConcentrationField; + } + set { + this.m_stdConcentrationField = value; + } + } + + /// + public ECalPointNum m_stdAdditionsNum { + get { + return this.m_stdAdditionsNumField; + } + set { + this.m_stdAdditionsNumField = value; + } + } + + /// + public decfloat m_addedVolumePerAdd { + get { + return this.m_addedVolumePerAddField; + } + set { + this.m_addedVolumePerAddField = value; + } + } + + /// + public EUsedSlope m_usedSlope { + get { + return this.m_usedSlopeField; + } + set { + this.m_usedSlopeField = value; + } + } + + /// + public decfloat m_knownSlope { + get { + return this.m_knownSlopeField; + } + set { + this.m_knownSlopeField = value; + } + } + + /// + public decfloat m_manualTemperatureC { + get { + return this.m_manualTemperatureCField; + } + set { + this.m_manualTemperatureCField = value; + } + } + + /// + public decfloat m_manualTemperatureF { + get { + return this.m_manualTemperatureFField; + } + set { + this.m_manualTemperatureFField = value; + } + } + + /// + public string m_comment { + get { + return this.m_commentField; + } + set { + this.m_commentField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + public enum EIncrementalType { + + /// + eIncrementalTypeid_IncrementalType_StandardAddition, + + /// + eIncrementalTypeid_IncrementalType_StandardSubtraction, + + /// + eIncrementalTypeid_IncrementalType_SampleAddition, + + /// + eIncrementalTypeid_IncrementalType_SampleSubtraction, + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + public enum EIonRatio { + + /// + eIonRatioid_IonRatio_1v1, + + /// + eIonRatioid_IonRatio_1v2, + + /// + eIonRatioid_IonRatio_1v3, + + /// + eIonRatioid_IonRatio_2v1, + + /// + eIonRatioid_IonRatio_2v3, + + /// + eIonRatioid_IonRatio_3v1, + + /// + eIonRatioid_IonRatio_3v2, + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + public enum EUsedSlope { + + /// + eUsedSlopeid_UsedSlope_FromCalibration, + + /// + eUsedSlopeid_UsedSlope_Theoretical, + + /// + eUsedSlopeid_UsedSlope_EnterKnownSlope, + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class MFSensorCheckRecord { + + private bool m_checkCalDateFlagField; + + private ETimeUnit m_unitOfMonitoringPeriodField; + + private int m_maxElapsedPeriodField; + + private bool m_interruptionFlagField; + + private ModuleType[] m_moduleField; + + /// + public bool m_checkCalDateFlag { + get { + return this.m_checkCalDateFlagField; + } + set { + this.m_checkCalDateFlagField = value; + } + } + + /// + public ETimeUnit m_unitOfMonitoringPeriod { + get { + return this.m_unitOfMonitoringPeriodField; + } + set { + this.m_unitOfMonitoringPeriodField = value; + } + } + + /// + public int m_maxElapsedPeriod { + get { + return this.m_maxElapsedPeriodField; + } + set { + this.m_maxElapsedPeriodField = value; + } + } + + /// + public bool m_interruptionFlag { + get { + return this.m_interruptionFlagField; + } + set { + this.m_interruptionFlagField = value; + } + } + + /// + [System.Xml.Serialization.XmlArrayItemAttribute("ArrayOfModuleType")] + public ModuleType[] m_module { + get { + return this.m_moduleField; + } + set { + this.m_moduleField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class ModuleType { + + private EModuleID m_moduleIDField; + + /// + public EModuleID m_moduleID { + get { + return this.m_moduleIDField; + } + set { + this.m_moduleIDField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class ArrayOfModuleType { + + private ModuleType[] arrayOfModuleType1Field; + + /// + [System.Xml.Serialization.XmlElementAttribute("ArrayOfModuleType", IsNullable=true)] + public ModuleType[] ArrayOfModuleType1 { + get { + return this.arrayOfModuleType1Field; + } + set { + this.arrayOfModuleType1Field = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class MFSubSensorCheckRecord { + + private bool m_checkFlagField; + + private decfloat m_phionMinSlopeField; + + private decfloat m_phionMaxSlopeField; + + private decfloat m_phionMinOffsetField; + + private decfloat m_phionMaxOffsetField; + + private decfloat m_condMinCCField; + + private decfloat m_condMaxCCField; + + private decfloat m_doMinSlopeField; + + private decfloat m_doMaxSlopeField; + + private int m_minCalPointsField; + + private decfloat m_LowerLimitCalRangeField; + + private decfloat m_UpperLimitCalRangeField; + + private int m_UnitLimitCalRangeField; + + private bool m_AcceptCalPointOutField; + + private bool m_CheckCalRangeField; + + /// + public bool m_checkFlag { + get { + return this.m_checkFlagField; + } + set { + this.m_checkFlagField = value; + } + } + + /// + public decfloat m_phionMinSlope { + get { + return this.m_phionMinSlopeField; + } + set { + this.m_phionMinSlopeField = value; + } + } + + /// + public decfloat m_phionMaxSlope { + get { + return this.m_phionMaxSlopeField; + } + set { + this.m_phionMaxSlopeField = value; + } + } + + /// + public decfloat m_phionMinOffset { + get { + return this.m_phionMinOffsetField; + } + set { + this.m_phionMinOffsetField = value; + } + } + + /// + public decfloat m_phionMaxOffset { + get { + return this.m_phionMaxOffsetField; + } + set { + this.m_phionMaxOffsetField = value; + } + } + + /// + public decfloat m_condMinCC { + get { + return this.m_condMinCCField; + } + set { + this.m_condMinCCField = value; + } + } + + /// + public decfloat m_condMaxCC { + get { + return this.m_condMaxCCField; + } + set { + this.m_condMaxCCField = value; + } + } + + /// + public decfloat m_doMinSlope { + get { + return this.m_doMinSlopeField; + } + set { + this.m_doMinSlopeField = value; + } + } + + /// + public decfloat m_doMaxSlope { + get { + return this.m_doMaxSlopeField; + } + set { + this.m_doMaxSlopeField = value; + } + } + + /// + public int m_minCalPoints { + get { + return this.m_minCalPointsField; + } + set { + this.m_minCalPointsField = value; + } + } + + /// + public decfloat m_LowerLimitCalRange { + get { + return this.m_LowerLimitCalRangeField; + } + set { + this.m_LowerLimitCalRangeField = value; + } + } + + /// + public decfloat m_UpperLimitCalRange { + get { + return this.m_UpperLimitCalRangeField; + } + set { + this.m_UpperLimitCalRangeField = value; + } + } + + /// + public int m_UnitLimitCalRange { + get { + return this.m_UnitLimitCalRangeField; + } + set { + this.m_UnitLimitCalRangeField = value; + } + } + + /// + public bool m_AcceptCalPointOut { + get { + return this.m_AcceptCalPointOutField; + } + set { + this.m_AcceptCalPointOutField = value; + } + } + + /// + public bool m_CheckCalRange { + get { + return this.m_CheckCalRangeField; + } + set { + this.m_CheckCalRangeField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class MFMeasureRecord { + + private bool m_stirFlagField; + + private EStirSpeed m_stirSpeedField; + + private bool m_conditionField; + + private string m_conditionFormulaField; + + /// + public bool m_stirFlag { + get { + return this.m_stirFlagField; + } + set { + this.m_stirFlagField = value; + } + } + + /// + public EStirSpeed m_stirSpeed { + get { + return this.m_stirSpeedField; + } + set { + this.m_stirSpeedField = value; + } + } + + /// + public bool m_condition { + get { + return this.m_conditionField; + } + set { + this.m_conditionField = value; + } + } + + /// + public string m_conditionFormula { + get { + return this.m_conditionFormulaField; + } + set { + this.m_conditionFormulaField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class MFSubMeasureRecord { + + private ECondMode m_condModeField; + + private ECommonUnit m_unitField; + + private decfloat m_relMVOffsetField; + + private ETemperatureCorrection m_tempCorrectionField; + + private decfloat m_alphaCoefficientField; + + private ERefTemperatureC m_refTempField; + + private decfloat m_tdsFactorField; + + private EResolution m_numberOfDecimalDigitsField; + + private EEndpointType m_endPointTypeField; + + private EEndpointCriteria m_endPointCriteriaField; + + private int m_endPointTimeField; + + private decfloat m_mVdEField; + + private decfloat m_condUSCMdEField; + + private decfloat m_doMgLdEField; + + private int m_dtField; + + private int m_tminField; + + private int m_tmaxField; + + private bool m_thresholdFlagField; + + private decfloat m_lowerThresholdField; + + private decfloat m_upperThresholdField; + + private bool m_endpointOutThresholdField; + + /// + public ECondMode m_condMode { + get { + return this.m_condModeField; + } + set { + this.m_condModeField = value; + } + } + + /// + public ECommonUnit m_unit { + get { + return this.m_unitField; + } + set { + this.m_unitField = value; + } + } + + /// + public decfloat m_relMVOffset { + get { + return this.m_relMVOffsetField; + } + set { + this.m_relMVOffsetField = value; + } + } + + /// + public ETemperatureCorrection m_tempCorrection { + get { + return this.m_tempCorrectionField; + } + set { + this.m_tempCorrectionField = value; + } + } + + /// + public decfloat m_alphaCoefficient { + get { + return this.m_alphaCoefficientField; + } + set { + this.m_alphaCoefficientField = value; + } + } + + /// + public ERefTemperatureC m_refTemp { + get { + return this.m_refTempField; + } + set { + this.m_refTempField = value; + } + } + + /// + public decfloat m_tdsFactor { + get { + return this.m_tdsFactorField; + } + set { + this.m_tdsFactorField = value; + } + } + + /// + public EResolution m_numberOfDecimalDigits { + get { + return this.m_numberOfDecimalDigitsField; + } + set { + this.m_numberOfDecimalDigitsField = value; + } + } + + /// + public EEndpointType m_endPointType { + get { + return this.m_endPointTypeField; + } + set { + this.m_endPointTypeField = value; + } + } + + /// + public EEndpointCriteria m_endPointCriteria { + get { + return this.m_endPointCriteriaField; + } + set { + this.m_endPointCriteriaField = value; + } + } + + /// + public int m_endPointTime { + get { + return this.m_endPointTimeField; + } + set { + this.m_endPointTimeField = value; + } + } + + /// + public decfloat m_mVdE { + get { + return this.m_mVdEField; + } + set { + this.m_mVdEField = value; + } + } + + /// + public decfloat m_condUSCMdE { + get { + return this.m_condUSCMdEField; + } + set { + this.m_condUSCMdEField = value; + } + } + + /// + public decfloat m_doMgLdE { + get { + return this.m_doMgLdEField; + } + set { + this.m_doMgLdEField = value; + } + } + + /// + public int m_dt { + get { + return this.m_dtField; + } + set { + this.m_dtField = value; + } + } + + /// + public int m_tmin { + get { + return this.m_tminField; + } + set { + this.m_tminField = value; + } + } + + /// + public int m_tmax { + get { + return this.m_tmaxField; + } + set { + this.m_tmaxField = value; + } + } + + /// + public bool m_thresholdFlag { + get { + return this.m_thresholdFlagField; + } + set { + this.m_thresholdFlagField = value; + } + } + + /// + public decfloat m_lowerThreshold { + get { + return this.m_lowerThresholdField; + } + set { + this.m_lowerThresholdField = value; + } + } + + /// + public decfloat m_upperThreshold { + get { + return this.m_upperThresholdField; + } + set { + this.m_upperThresholdField = value; + } + } + + /// + public bool m_endpointOutThreshold { + get { + return this.m_endpointOutThresholdField; + } + set { + this.m_endpointOutThresholdField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + public enum ETemperatureCorrection { + + /// + eTemperatureCorrectionid_TemperatureCorrection_Linear, + + /// + eTemperatureCorrectionid_TemperatureCorrection_NonLinear, + + /// + eTemperatureCorrectionid_TemperatureCorrection_Off, + + /// + eTemperatureCorrectionid_TemperatureCorrection_PureWater, + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + public enum ERefTemperatureC { + + /// + eRefTemperatureCid_RefTemperatureC_25, + + /// + eRefTemperatureCid_RefTemperatureC_20, + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + public enum EResolution { + + /// + eResolutionid_Resolution_0, + + /// + eResolutionid_Resolution_1, + + /// + eResolutionid_Resolution_2, + + /// + eResolutionid_Resolution_3, + + /// + eResolutionid_Resolution_4, + + /// + eResolutionid_Resolution_5, + + /// + eResolutionid_Resolution_6, + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class MFCalibrationRecord { + + private bool m_stirFlagField; + + private EStirSpeed m_stirSpeedField; + + private ModuleType[] m_moduleField; + + /// + public bool m_stirFlag { + get { + return this.m_stirFlagField; + } + set { + this.m_stirFlagField = value; + } + } + + /// + public EStirSpeed m_stirSpeed { + get { + return this.m_stirSpeedField; + } + set { + this.m_stirSpeedField = value; + } + } + + /// + [System.Xml.Serialization.XmlArrayItemAttribute("ArrayOfModuleType")] + public ModuleType[] m_module { + get { + return this.m_moduleField; + } + set { + this.m_moduleField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class MFSensorTestRecord { + + private bool m_stirFlagField; + + private EStirSpeed m_stirSpeedField; + + private ModuleType[] m_moduleField; + + /// + public bool m_stirFlag { + get { + return this.m_stirFlagField; + } + set { + this.m_stirFlagField = value; + } + } + + /// + public EStirSpeed m_stirSpeed { + get { + return this.m_stirSpeedField; + } + set { + this.m_stirSpeedField = value; + } + } + + /// + [System.Xml.Serialization.XmlArrayItemAttribute("ArrayOfModuleType")] + public ModuleType[] m_module { + get { + return this.m_moduleField; + } + set { + this.m_moduleField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class MFIncrementalRecord { + + private bool m_stirFlagField; + + private EStirSpeed m_stirSpeedField; + + private ModuleType[] m_moduleField; + + /// + public bool m_stirFlag { + get { + return this.m_stirFlagField; + } + set { + this.m_stirFlagField = value; + } + } + + /// + public EStirSpeed m_stirSpeed { + get { + return this.m_stirSpeedField; + } + set { + this.m_stirSpeedField = value; + } + } + + /// + [System.Xml.Serialization.XmlArrayItemAttribute("ArrayOfModuleType")] + public ModuleType[] m_module { + get { + return this.m_moduleField; + } + set { + this.m_moduleField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class MFIntervalRecord { + + private bool m_stirFlagField; + + private EStirSpeed m_stirSpeedField; + + private int m_intervalTimeField; + + private bool m_intervalPrintField; + + private bool m_conditionField; + + private string m_conditionFormulaField; + + /// + public bool m_stirFlag { + get { + return this.m_stirFlagField; + } + set { + this.m_stirFlagField = value; + } + } + + /// + public EStirSpeed m_stirSpeed { + get { + return this.m_stirSpeedField; + } + set { + this.m_stirSpeedField = value; + } + } + + /// + public int m_intervalTime { + get { + return this.m_intervalTimeField; + } + set { + this.m_intervalTimeField = value; + } + } + + /// + public bool m_intervalPrint { + get { + return this.m_intervalPrintField; + } + set { + this.m_intervalPrintField = value; + } + } + + /// + public bool m_condition { + get { + return this.m_conditionField; + } + set { + this.m_conditionField = value; + } + } + + /// + public string m_conditionFormula { + get { + return this.m_conditionFormulaField; + } + set { + this.m_conditionFormulaField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class MFCalibrationAnalysisRecord { + + private decfloat m_phionMinSlopeField; + + private decfloat m_phionMaxSlopeField; + + private decfloat m_phionMinOffsetField; + + private decfloat m_phionMaxOffsetField; + + private decfloat m_condMinCCField; + + private decfloat m_condMaxCCField; + + private decfloat m_doMinSlopeField; + + private decfloat m_doMaxSlopeField; + + private bool m_interruptionFlagField; + + private bool m_showActualPHFlagField; + + /// + public decfloat m_phionMinSlope { + get { + return this.m_phionMinSlopeField; + } + set { + this.m_phionMinSlopeField = value; + } + } + + /// + public decfloat m_phionMaxSlope { + get { + return this.m_phionMaxSlopeField; + } + set { + this.m_phionMaxSlopeField = value; + } + } + + /// + public decfloat m_phionMinOffset { + get { + return this.m_phionMinOffsetField; + } + set { + this.m_phionMinOffsetField = value; + } + } + + /// + public decfloat m_phionMaxOffset { + get { + return this.m_phionMaxOffsetField; + } + set { + this.m_phionMaxOffsetField = value; + } + } + + /// + public decfloat m_condMinCC { + get { + return this.m_condMinCCField; + } + set { + this.m_condMinCCField = value; + } + } + + /// + public decfloat m_condMaxCC { + get { + return this.m_condMaxCCField; + } + set { + this.m_condMaxCCField = value; + } + } + + /// + public decfloat m_doMinSlope { + get { + return this.m_doMinSlopeField; + } + set { + this.m_doMinSlopeField = value; + } + } + + /// + public decfloat m_doMaxSlope { + get { + return this.m_doMaxSlopeField; + } + set { + this.m_doMaxSlopeField = value; + } + } + + /// + public bool m_interruptionFlag { + get { + return this.m_interruptionFlagField; + } + set { + this.m_interruptionFlagField = value; + } + } + + /// + public bool m_showActualPHFlag { + get { + return this.m_showActualPHFlagField; + } + set { + this.m_showActualPHFlagField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class MFSensorEvaluationRecord { + + private bool m_testCalibrationLimitField; + + private decfloat m_minSlopeField; + + private decfloat m_maxSlopeField; + + private decfloat m_minOffsetField; + + private decfloat m_maxOffsetField; + + private decfloat m_maxDriftField; + + private bool m_testMeasureLimitField; + + private decfloat m_toleranceField; + + /// + public bool m_testCalibrationLimit { + get { + return this.m_testCalibrationLimitField; + } + set { + this.m_testCalibrationLimitField = value; + } + } + + /// + public decfloat m_minSlope { + get { + return this.m_minSlopeField; + } + set { + this.m_minSlopeField = value; + } + } + + /// + public decfloat m_maxSlope { + get { + return this.m_maxSlopeField; + } + set { + this.m_maxSlopeField = value; + } + } + + /// + public decfloat m_minOffset { + get { + return this.m_minOffsetField; + } + set { + this.m_minOffsetField = value; + } + } + + /// + public decfloat m_maxOffset { + get { + return this.m_maxOffsetField; + } + set { + this.m_maxOffsetField = value; + } + } + + /// + public decfloat m_maxDrift { + get { + return this.m_maxDriftField; + } + set { + this.m_maxDriftField = value; + } + } + + /// + public bool m_testMeasureLimit { + get { + return this.m_testMeasureLimitField; + } + set { + this.m_testMeasureLimitField = value; + } + } + + /// + public decfloat m_tolerance { + get { + return this.m_toleranceField; + } + set { + this.m_toleranceField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class MFCalculationRecord { + + private string m_IDField; + + private string m_nameField; + + private string m_unitField; + + private string m_formulaField; + + private short m_decimalPlacesField; + + private bool m_resultLimitsField; + + private decfloat m_lowerLimitField; + + private decfloat m_upperLimitField; + + private bool m_interruptionFlagField; + + /// + public string m_ID { + get { + return this.m_IDField; + } + set { + this.m_IDField = value; + } + } + + /// + public string m_name { + get { + return this.m_nameField; + } + set { + this.m_nameField = value; + } + } + + /// + public string m_unit { + get { + return this.m_unitField; + } + set { + this.m_unitField = value; + } + } + + /// + public string m_formula { + get { + return this.m_formulaField; + } + set { + this.m_formulaField = value; + } + } + + /// + public short m_decimalPlaces { + get { + return this.m_decimalPlacesField; + } + set { + this.m_decimalPlacesField = value; + } + } + + /// + public bool m_resultLimits { + get { + return this.m_resultLimitsField; + } + set { + this.m_resultLimitsField = value; + } + } + + /// + public decfloat m_lowerLimit { + get { + return this.m_lowerLimitField; + } + set { + this.m_lowerLimitField = value; + } + } + + /// + public decfloat m_upperLimit { + get { + return this.m_upperLimitField; + } + set { + this.m_upperLimitField = value; + } + } + + /// + public bool m_interruptionFlag { + get { + return this.m_interruptionFlagField; + } + set { + this.m_interruptionFlagField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class MFReportRecord { + + private bool m_printField; + + private EReportFormat m_reportFormatField; + + private bool m_reportValueCalculationField; + + private bool m_reportDataField; + + private bool m_reportInfoField; + + /// + public bool m_print { + get { + return this.m_printField; + } + set { + this.m_printField = value; + } + } + + /// + public EReportFormat m_reportFormat { + get { + return this.m_reportFormatField; + } + set { + this.m_reportFormatField = value; + } + } + + /// + public bool m_reportValueCalculation { + get { + return this.m_reportValueCalculationField; + } + set { + this.m_reportValueCalculationField = value; + } + } + + /// + public bool m_reportData { + get { + return this.m_reportDataField; + } + set { + this.m_reportDataField = value; + } + } + + /// + public bool m_reportInfo { + get { + return this.m_reportInfoField; + } + set { + this.m_reportInfoField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class MFInstructionRecord { + + private EContinueAfter m_continueAfterField; + + private string m_instructionField; + + private int m_timeIntervalField; + + private bool m_conditionField; + + private string m_conditionFormulaField; + + /// + public EContinueAfter m_continueAfter { + get { + return this.m_continueAfterField; + } + set { + this.m_continueAfterField = value; + } + } + + /// + public string m_instruction { + get { + return this.m_instructionField; + } + set { + this.m_instructionField = value; + } + } + + /// + public int m_timeInterval { + get { + return this.m_timeIntervalField; + } + set { + this.m_timeIntervalField = value; + } + } + + /// + public bool m_condition { + get { + return this.m_conditionField; + } + set { + this.m_conditionField = value; + } + } + + /// + public string m_conditionFormula { + get { + return this.m_conditionFormulaField; + } + set { + this.m_conditionFormulaField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + public enum EContinueAfter { + + /// + eContinueAfterid_ContinueAfter_Confirmation, + + /// + eContinueAfterid_ContinueAfter_TimeInterval, + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class MFWaitRecord { + + private int m_waitTimeField; + + private bool m_stirFlagField; + + private EStirSpeed m_stirSpeedField; + + private bool m_instructionFlagField; + + private string m_instructionTextField; + + private bool m_conditionField; + + private string m_conditionFormulaField; + + /// + public int m_waitTime { + get { + return this.m_waitTimeField; + } + set { + this.m_waitTimeField = value; + } + } + + /// + public bool m_stirFlag { + get { + return this.m_stirFlagField; + } + set { + this.m_stirFlagField = value; + } + } + + /// + public EStirSpeed m_stirSpeed { + get { + return this.m_stirSpeedField; + } + set { + this.m_stirSpeedField = value; + } + } + + /// + public bool m_instructionFlag { + get { + return this.m_instructionFlagField; + } + set { + this.m_instructionFlagField = value; + } + } + + /// + public string m_instructionText { + get { + return this.m_instructionTextField; + } + set { + this.m_instructionTextField = value; + } + } + + /// + public bool m_condition { + get { + return this.m_conditionField; + } + set { + this.m_conditionField = value; + } + } + + /// + public string m_conditionFormula { + get { + return this.m_conditionFormulaField; + } + set { + this.m_conditionFormulaField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class MFMeasureDirectRecord { + + private ModuleType[] m_moduleField; + + /// + [System.Xml.Serialization.XmlArrayItemAttribute("ArrayOfModuleType")] + public ModuleType[] m_module { + get { + return this.m_moduleField; + } + set { + this.m_moduleField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class MFCalibrationDirectRecord { + + private ModuleType[] m_moduleField; + + /// + [System.Xml.Serialization.XmlArrayItemAttribute("ArrayOfModuleType")] + public ModuleType[] m_module { + get { + return this.m_moduleField; + } + set { + this.m_moduleField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class MFModuleAdjustmentRecord { + + private short m_moduleTypeField; + + private short m_moduleIdField; + + private string m_moduleSNField; + + private string m_operatorField; + + private bool m_bAdjustMVInputField; + + private bool m_bAdjustCondResInputField; + + private bool m_bAdjustISFETTempInputField; + + private bool m_bAdjustISFETInputField; + + private bool m_bAdjustIntTempInputField; + + private bool m_bAdjustExtTempInputField; + + private bool m_bAdjustCurrentInputField; + + private string m_equipmentName1Field; + + private string m_equipmentSN1Field; + + private string m_equipmentCertificationDate1Field; + + private string m_equipmentName2Field; + + private string m_equipmentSN2Field; + + private string m_equipmentCertificationDate2Field; + + private string m_equipmentName3Field; + + private string m_equipmentSN3Field; + + private string m_equipmentCertificationDate3Field; + + /// + public short m_moduleType { + get { + return this.m_moduleTypeField; + } + set { + this.m_moduleTypeField = value; + } + } + + /// + public short m_moduleId { + get { + return this.m_moduleIdField; + } + set { + this.m_moduleIdField = value; + } + } + + /// + public string m_moduleSN { + get { + return this.m_moduleSNField; + } + set { + this.m_moduleSNField = value; + } + } + + /// + public string m_operator { + get { + return this.m_operatorField; + } + set { + this.m_operatorField = value; + } + } + + /// + public bool m_bAdjustMVInput { + get { + return this.m_bAdjustMVInputField; + } + set { + this.m_bAdjustMVInputField = value; + } + } + + /// + public bool m_bAdjustCondResInput { + get { + return this.m_bAdjustCondResInputField; + } + set { + this.m_bAdjustCondResInputField = value; + } + } + + /// + public bool m_bAdjustISFETTempInput { + get { + return this.m_bAdjustISFETTempInputField; + } + set { + this.m_bAdjustISFETTempInputField = value; + } + } + + /// + public bool m_bAdjustISFETInput { + get { + return this.m_bAdjustISFETInputField; + } + set { + this.m_bAdjustISFETInputField = value; + } + } + + /// + public bool m_bAdjustIntTempInput { + get { + return this.m_bAdjustIntTempInputField; + } + set { + this.m_bAdjustIntTempInputField = value; + } + } + + /// + public bool m_bAdjustExtTempInput { + get { + return this.m_bAdjustExtTempInputField; + } + set { + this.m_bAdjustExtTempInputField = value; + } + } + + /// + public bool m_bAdjustCurrentInput { + get { + return this.m_bAdjustCurrentInputField; + } + set { + this.m_bAdjustCurrentInputField = value; + } + } + + /// + public string m_equipmentName1 { + get { + return this.m_equipmentName1Field; + } + set { + this.m_equipmentName1Field = value; + } + } + + /// + public string m_equipmentSN1 { + get { + return this.m_equipmentSN1Field; + } + set { + this.m_equipmentSN1Field = value; + } + } + + /// + public string m_equipmentCertificationDate1 { + get { + return this.m_equipmentCertificationDate1Field; + } + set { + this.m_equipmentCertificationDate1Field = value; + } + } + + /// + public string m_equipmentName2 { + get { + return this.m_equipmentName2Field; + } + set { + this.m_equipmentName2Field = value; + } + } + + /// + public string m_equipmentSN2 { + get { + return this.m_equipmentSN2Field; + } + set { + this.m_equipmentSN2Field = value; + } + } + + /// + public string m_equipmentCertificationDate2 { + get { + return this.m_equipmentCertificationDate2Field; + } + set { + this.m_equipmentCertificationDate2Field = value; + } + } + + /// + public string m_equipmentName3 { + get { + return this.m_equipmentName3Field; + } + set { + this.m_equipmentName3Field = value; + } + } + + /// + public string m_equipmentSN3 { + get { + return this.m_equipmentSN3Field; + } + set { + this.m_equipmentSN3Field = value; + } + } + + /// + public string m_equipmentCertificationDate3 { + get { + return this.m_equipmentCertificationDate3Field; + } + set { + this.m_equipmentCertificationDate3Field = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class MFModuleInputTestRecord { + + private short m_moduleTypeField; + + private short m_moduleIdField; + + private string m_moduleSNField; + + private string m_operatorField; + + private string m_equipmentName1Field; + + private string m_equipmentSN1Field; + + private string m_equipmentCertificationDate1Field; + + private string m_equipmentName2Field; + + private string m_equipmentSN2Field; + + private string m_equipmentCertificationDate2Field; + + private string m_equipmentName3Field; + + private string m_equipmentSN3Field; + + private string m_equipmentCertificationDate3Field; + + private bool m_digitalISMInputField; + + private bool m_pressureInputField; + + private System.Nullable[] m_mvInputsField; + + private System.Nullable[] m_impedanceTestsField; + + private System.Nullable[] m_condResInputsField; + + private System.Nullable[] m_isfetInputsField; + + private System.Nullable[] m_isfetNTC30KInputsField; + + private System.Nullable[] m_intNTC22KInputsField; + + private System.Nullable[] m_intNTC30KInputsField; + + private System.Nullable[] m_extNTC30KInputsField; + + private System.Nullable[] m_extPT1000InputsField; + + private System.Nullable[] m_currentInputsField; + + /// + public short m_moduleType { + get { + return this.m_moduleTypeField; + } + set { + this.m_moduleTypeField = value; + } + } + + /// + public short m_moduleId { + get { + return this.m_moduleIdField; + } + set { + this.m_moduleIdField = value; + } + } + + /// + public string m_moduleSN { + get { + return this.m_moduleSNField; + } + set { + this.m_moduleSNField = value; + } + } + + /// + public string m_operator { + get { + return this.m_operatorField; + } + set { + this.m_operatorField = value; + } + } + + /// + public string m_equipmentName1 { + get { + return this.m_equipmentName1Field; + } + set { + this.m_equipmentName1Field = value; + } + } + + /// + public string m_equipmentSN1 { + get { + return this.m_equipmentSN1Field; + } + set { + this.m_equipmentSN1Field = value; + } + } + + /// + public string m_equipmentCertificationDate1 { + get { + return this.m_equipmentCertificationDate1Field; + } + set { + this.m_equipmentCertificationDate1Field = value; + } + } + + /// + public string m_equipmentName2 { + get { + return this.m_equipmentName2Field; + } + set { + this.m_equipmentName2Field = value; + } + } + + /// + public string m_equipmentSN2 { + get { + return this.m_equipmentSN2Field; + } + set { + this.m_equipmentSN2Field = value; + } + } + + /// + public string m_equipmentCertificationDate2 { + get { + return this.m_equipmentCertificationDate2Field; + } + set { + this.m_equipmentCertificationDate2Field = value; + } + } + + /// + public string m_equipmentName3 { + get { + return this.m_equipmentName3Field; + } + set { + this.m_equipmentName3Field = value; + } + } + + /// + public string m_equipmentSN3 { + get { + return this.m_equipmentSN3Field; + } + set { + this.m_equipmentSN3Field = value; + } + } + + /// + public string m_equipmentCertificationDate3 { + get { + return this.m_equipmentCertificationDate3Field; + } + set { + this.m_equipmentCertificationDate3Field = value; + } + } + + /// + public bool m_digitalISMInput { + get { + return this.m_digitalISMInputField; + } + set { + this.m_digitalISMInputField = value; + } + } + + /// + public bool m_pressureInput { + get { + return this.m_pressureInputField; + } + set { + this.m_pressureInputField = value; + } + } + + /// + [System.Xml.Serialization.XmlArrayItemAttribute("ArrayOfFloat")] + public System.Nullable[] m_mvInputs { + get { + return this.m_mvInputsField; + } + set { + this.m_mvInputsField = value; + } + } + + /// + [System.Xml.Serialization.XmlArrayItemAttribute("ArrayOfFloat")] + public System.Nullable[] m_impedanceTests { + get { + return this.m_impedanceTestsField; + } + set { + this.m_impedanceTestsField = value; + } + } + + /// + [System.Xml.Serialization.XmlArrayItemAttribute("ArrayOfFloat")] + public System.Nullable[] m_condResInputs { + get { + return this.m_condResInputsField; + } + set { + this.m_condResInputsField = value; + } + } + + /// + [System.Xml.Serialization.XmlArrayItemAttribute("ArrayOfFloat")] + public System.Nullable[] m_isfetInputs { + get { + return this.m_isfetInputsField; + } + set { + this.m_isfetInputsField = value; + } + } + + /// + [System.Xml.Serialization.XmlArrayItemAttribute("ArrayOfFloat")] + public System.Nullable[] m_isfetNTC30KInputs { + get { + return this.m_isfetNTC30KInputsField; + } + set { + this.m_isfetNTC30KInputsField = value; + } + } + + /// + [System.Xml.Serialization.XmlArrayItemAttribute("ArrayOfFloat")] + public System.Nullable[] m_intNTC22KInputs { + get { + return this.m_intNTC22KInputsField; + } + set { + this.m_intNTC22KInputsField = value; + } + } + + /// + [System.Xml.Serialization.XmlArrayItemAttribute("ArrayOfFloat")] + public System.Nullable[] m_intNTC30KInputs { + get { + return this.m_intNTC30KInputsField; + } + set { + this.m_intNTC30KInputsField = value; + } + } + + /// + [System.Xml.Serialization.XmlArrayItemAttribute("ArrayOfFloat")] + public System.Nullable[] m_extNTC30KInputs { + get { + return this.m_extNTC30KInputsField; + } + set { + this.m_extNTC30KInputsField = value; + } + } + + /// + [System.Xml.Serialization.XmlArrayItemAttribute("ArrayOfFloat")] + public System.Nullable[] m_extPT1000Inputs { + get { + return this.m_extPT1000InputsField; + } + set { + this.m_extPT1000InputsField = value; + } + } + + /// + [System.Xml.Serialization.XmlArrayItemAttribute("ArrayOfFloat")] + public System.Nullable[] m_currentInputs { + get { + return this.m_currentInputsField; + } + set { + this.m_currentInputsField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class ArrayOfFloat { + + private System.Nullable[] arrayOfFloat1Field; + + /// + [System.Xml.Serialization.XmlElementAttribute("ArrayOfFloat", IsNullable=true)] + public System.Nullable[] ArrayOfFloat1 { + get { + return this.arrayOfFloat1Field; + } + set { + this.arrayOfFloat1Field = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class MFExtTemperatureCalRecord { + + private short m_moduleTypeField; + + private short m_moduleIdField; + + private string m_temperatureSensorUUIDField; + + private short m_temperatureUnitField; + + private decfloat m_adjustedValueField; + + /// + public short m_moduleType { + get { + return this.m_moduleTypeField; + } + set { + this.m_moduleTypeField = value; + } + } + + /// + public short m_moduleId { + get { + return this.m_moduleIdField; + } + set { + this.m_moduleIdField = value; + } + } + + /// + public string m_temperatureSensorUUID { + get { + return this.m_temperatureSensorUUIDField; + } + set { + this.m_temperatureSensorUUIDField = value; + } + } + + /// + public short m_temperatureUnit { + get { + return this.m_temperatureUnitField; + } + set { + this.m_temperatureUnitField = value; + } + } + + /// + public decfloat m_adjustedValue { + get { + return this.m_adjustedValueField; + } + set { + this.m_adjustedValueField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class MFEndOfMethodRecord { + + private short m_lastPositionField; + + /// + public short m_lastPosition { + get { + return this.m_lastPositionField; + } + set { + this.m_lastPositionField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class MFSampleVerificationRecord { + + private string m_instructionField; + + private bool m_bInterruptAfterTimeoutField; + + private short m_timeoutSetField; + + /// + public string m_instruction { + get { + return this.m_instructionField; + } + set { + this.m_instructionField = value; + } + } + + /// + public bool m_bInterruptAfterTimeout { + get { + return this.m_bInterruptAfterTimeoutField; + } + set { + this.m_bInterruptAfterTimeoutField = value; + } + } + + /// + public short m_timeoutSet { + get { + return this.m_timeoutSetField; + } + set { + this.m_timeoutSetField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class MFConfigurationBCVRecord { + + private MFConfigurationRecord m_baseRecordField; + + private string m_checkValueIDField; + + private bool m_bBlankField; + + private bool m_bSeededBlankField; + + private bool m_bStandardField; + + private bool m_bSalinityCorrectionField; + + private decfloat m_dilutedWaterSalinityField; + + private decfloat m_seedSolutionSalinityField; + + private decfloat m_stdSolutionSalinityField; + + private short m_bSeedAddedToField; + + private decfloat m_seedDilutionFactorField; + + private bool m_bBlankCorrectionField; + + private decfloat m_bottleVolumeField; + + /// + public MFConfigurationRecord m_baseRecord { + get { + return this.m_baseRecordField; + } + set { + this.m_baseRecordField = value; + } + } + + /// + public string m_checkValueID { + get { + return this.m_checkValueIDField; + } + set { + this.m_checkValueIDField = value; + } + } + + /// + public bool m_bBlank { + get { + return this.m_bBlankField; + } + set { + this.m_bBlankField = value; + } + } + + /// + public bool m_bSeededBlank { + get { + return this.m_bSeededBlankField; + } + set { + this.m_bSeededBlankField = value; + } + } + + /// + public bool m_bStandard { + get { + return this.m_bStandardField; + } + set { + this.m_bStandardField = value; + } + } + + /// + public bool m_bSalinityCorrection { + get { + return this.m_bSalinityCorrectionField; + } + set { + this.m_bSalinityCorrectionField = value; + } + } + + /// + public decfloat m_dilutedWaterSalinity { + get { + return this.m_dilutedWaterSalinityField; + } + set { + this.m_dilutedWaterSalinityField = value; + } + } + + /// + public decfloat m_seedSolutionSalinity { + get { + return this.m_seedSolutionSalinityField; + } + set { + this.m_seedSolutionSalinityField = value; + } + } + + /// + public decfloat m_stdSolutionSalinity { + get { + return this.m_stdSolutionSalinityField; + } + set { + this.m_stdSolutionSalinityField = value; + } + } + + /// + public short m_bSeedAddedTo { + get { + return this.m_bSeedAddedToField; + } + set { + this.m_bSeedAddedToField = value; + } + } + + /// + public decfloat m_seedDilutionFactor { + get { + return this.m_seedDilutionFactorField; + } + set { + this.m_seedDilutionFactorField = value; + } + } + + /// + public bool m_bBlankCorrection { + get { + return this.m_bBlankCorrectionField; + } + set { + this.m_bBlankCorrectionField = value; + } + } + + /// + public decfloat m_bottleVolume { + get { + return this.m_bottleVolumeField; + } + set { + this.m_bottleVolumeField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class SampleCommonBOD { + + private MFSampleMeasureIntervalRecord m_sampleMeasureField; + + private string m_sampleIDField; + + private string m_commentField; + + private short m_sampleTypeField; + + private bool m_bSameBottleForBaseFollowField; + + private short m_bottleNumBaseField; + + private short m_bottleNumFollowField; + + private decfloat m_manualTemperatureCField; + + private decfloat m_manualTemperatureFField; + + private decfloat m_manualBarometric_mBarField; + + private decfloat m_manualBarometric_hPaField; + + private decfloat m_manualBarometric_mmHgField; + + private decfloat m_manualBarometric_AtmField; + + /// + public MFSampleMeasureIntervalRecord m_sampleMeasure { + get { + return this.m_sampleMeasureField; + } + set { + this.m_sampleMeasureField = value; + } + } + + /// + public string m_sampleID { + get { + return this.m_sampleIDField; + } + set { + this.m_sampleIDField = value; + } + } + + /// + public string m_comment { + get { + return this.m_commentField; + } + set { + this.m_commentField = value; + } + } + + /// + public short m_sampleType { + get { + return this.m_sampleTypeField; + } + set { + this.m_sampleTypeField = value; + } + } + + /// + public bool m_bSameBottleForBaseFollow { + get { + return this.m_bSameBottleForBaseFollowField; + } + set { + this.m_bSameBottleForBaseFollowField = value; + } + } + + /// + public short m_bottleNumBase { + get { + return this.m_bottleNumBaseField; + } + set { + this.m_bottleNumBaseField = value; + } + } + + /// + public short m_bottleNumFollow { + get { + return this.m_bottleNumFollowField; + } + set { + this.m_bottleNumFollowField = value; + } + } + + /// + public decfloat m_manualTemperatureC { + get { + return this.m_manualTemperatureCField; + } + set { + this.m_manualTemperatureCField = value; + } + } + + /// + public decfloat m_manualTemperatureF { + get { + return this.m_manualTemperatureFField; + } + set { + this.m_manualTemperatureFField = value; + } + } + + /// + public decfloat m_manualBarometric_mBar { + get { + return this.m_manualBarometric_mBarField; + } + set { + this.m_manualBarometric_mBarField = value; + } + } + + /// + public decfloat m_manualBarometric_hPa { + get { + return this.m_manualBarometric_hPaField; + } + set { + this.m_manualBarometric_hPaField = value; + } + } + + /// + public decfloat m_manualBarometric_mmHg { + get { + return this.m_manualBarometric_mmHgField; + } + set { + this.m_manualBarometric_mmHgField = value; + } + } + + /// + public decfloat m_manualBarometric_Atm { + get { + return this.m_manualBarometric_AtmField; + } + set { + this.m_manualBarometric_AtmField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class BottleInfo { + + private string m_bottleIDField; + + private decfloat m_sampleVolumeField; + + private decfloat m_seedVolumeField; + + private decfloat m_dilutionVolumeField; + + private string m_commentField; + + /// + public string m_bottleID { + get { + return this.m_bottleIDField; + } + set { + this.m_bottleIDField = value; + } + } + + /// + public decfloat m_sampleVolume { + get { + return this.m_sampleVolumeField; + } + set { + this.m_sampleVolumeField = value; + } + } + + /// + public decfloat m_seedVolume { + get { + return this.m_seedVolumeField; + } + set { + this.m_seedVolumeField = value; + } + } + + /// + public decfloat m_dilutionVolume { + get { + return this.m_dilutionVolumeField; + } + set { + this.m_dilutionVolumeField = value; + } + } + + /// + public string m_comment { + get { + return this.m_commentField; + } + set { + this.m_commentField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class MFSampleBODRecord { + + private SampleCommonBOD m_sampleCommonField; + + private BottleInfo[] m_baseBottlesField; + + private BottleInfo[] m_followBottlesField; + + /// + public SampleCommonBOD m_sampleCommon { + get { + return this.m_sampleCommonField; + } + set { + this.m_sampleCommonField = value; + } + } + + /// + [System.Xml.Serialization.XmlArrayItemAttribute("ArrayOfBottleInfo")] + public BottleInfo[] m_baseBottles { + get { + return this.m_baseBottlesField; + } + set { + this.m_baseBottlesField = value; + } + } + + /// + [System.Xml.Serialization.XmlArrayItemAttribute("ArrayOfBottleInfo")] + public BottleInfo[] m_followBottles { + get { + return this.m_followBottlesField; + } + set { + this.m_followBottlesField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class ArrayOfBottleInfo { + + private BottleInfo[] arrayOfBottleInfo1Field; + + /// + [System.Xml.Serialization.XmlElementAttribute("ArrayOfBottleInfo", IsNullable=true)] + public BottleInfo[] ArrayOfBottleInfo1 { + get { + return this.arrayOfBottleInfo1Field; + } + set { + this.arrayOfBottleInfo1Field = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class DOMeasureAnalysisRecord { + + private LimitAnalysisRecord m_tempLimitField; + + private LimitAnalysisRecord m_DOLimitField; + + /// + public LimitAnalysisRecord m_tempLimit { + get { + return this.m_tempLimitField; + } + set { + this.m_tempLimitField = value; + } + } + + /// + public LimitAnalysisRecord m_DOLimit { + get { + return this.m_DOLimitField; + } + set { + this.m_DOLimitField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class LimitAnalysisRecord { + + private short m_limitMaskField; + + private MTValue m_maxValueField; + + private MTValue m_minValueField; + + private System.Nullable[] m_actionOutLimitField; + + private System.Nullable[] m_bInstructionField; + + /// + public short m_limitMask { + get { + return this.m_limitMaskField; + } + set { + this.m_limitMaskField = value; + } + } + + /// + public MTValue m_maxValue { + get { + return this.m_maxValueField; + } + set { + this.m_maxValueField = value; + } + } + + /// + public MTValue m_minValue { + get { + return this.m_minValueField; + } + set { + this.m_minValueField = value; + } + } + + /// + [System.Xml.Serialization.XmlArrayItemAttribute("ArrayOfShort")] + public System.Nullable[] m_actionOutLimit { + get { + return this.m_actionOutLimitField; + } + set { + this.m_actionOutLimitField = value; + } + } + + /// + [System.Xml.Serialization.XmlArrayItemAttribute("ArrayOfBoolean")] + public System.Nullable[] m_bInstruction { + get { + return this.m_bInstructionField; + } + set { + this.m_bInstructionField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class ArrayOfShort { + + private System.Nullable[] arrayOfShort1Field; + + /// + [System.Xml.Serialization.XmlElementAttribute("ArrayOfShort", IsNullable=true)] + public System.Nullable[] ArrayOfShort1 { + get { + return this.arrayOfShort1Field; + } + set { + this.arrayOfShort1Field = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class ArrayOfBoolean { + + private System.Nullable[] arrayOfBoolean1Field; + + /// + [System.Xml.Serialization.XmlElementAttribute("ArrayOfBoolean", IsNullable=true)] + public System.Nullable[] ArrayOfBoolean1 { + get { + return this.arrayOfBoolean1Field; + } + set { + this.arrayOfBoolean1Field = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class TimeToleranceRecord { + + private bool m_bLimitField; + + private decfloat m_toleranceField; + + private EMFAnalysisAction m_actionOutLimitField; + + private bool m_bInstructionField; + + /// + public bool m_bLimit { + get { + return this.m_bLimitField; + } + set { + this.m_bLimitField = value; + } + } + + /// + public decfloat m_tolerance { + get { + return this.m_toleranceField; + } + set { + this.m_toleranceField = value; + } + } + + /// + public EMFAnalysisAction m_actionOutLimit { + get { + return this.m_actionOutLimitField; + } + set { + this.m_actionOutLimitField = value; + } + } + + /// + public bool m_bInstruction { + get { + return this.m_bInstructionField; + } + set { + this.m_bInstructionField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class BODAnalysisRecord { + + private DOMeasureAnalysisRecord m_baseField; + + private DOMeasureAnalysisRecord m_followField; + + private TimeToleranceRecord m_timeToleranceField; + + private LimitAnalysisRecord m_bodField; + + /// + public DOMeasureAnalysisRecord m_base { + get { + return this.m_baseField; + } + set { + this.m_baseField = value; + } + } + + /// + public DOMeasureAnalysisRecord m_follow { + get { + return this.m_followField; + } + set { + this.m_followField = value; + } + } + + /// + public TimeToleranceRecord m_timeTolerance { + get { + return this.m_timeToleranceField; + } + set { + this.m_timeToleranceField = value; + } + } + + /// + public LimitAnalysisRecord m_bod { + get { + return this.m_bodField; + } + set { + this.m_bodField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class MFAnalysisBCVSeedRecord { + + private BODAnalysisRecord m_bottleBODField; + + private LimitAnalysisRecord m_depletionField; + + /// + public BODAnalysisRecord m_bottleBOD { + get { + return this.m_bottleBODField; + } + set { + this.m_bottleBODField = value; + } + } + + /// + public LimitAnalysisRecord m_depletion { + get { + return this.m_depletionField; + } + set { + this.m_depletionField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class MFAnalysisBCVStandardRecord { + + private short m_limitAppliedToField; + + private BODAnalysisRecord m_bottleBODField; + + private LimitAnalysisRecord m_seedCorrectionField; + + private LimitAnalysisRecord m_finalBODField; + + /// + public short m_limitAppliedTo { + get { + return this.m_limitAppliedToField; + } + set { + this.m_limitAppliedToField = value; + } + } + + /// + public BODAnalysisRecord m_bottleBOD { + get { + return this.m_bottleBODField; + } + set { + this.m_bottleBODField = value; + } + } + + /// + public LimitAnalysisRecord m_seedCorrection { + get { + return this.m_seedCorrectionField; + } + set { + this.m_seedCorrectionField = value; + } + } + + /// + public LimitAnalysisRecord m_finalBOD { + get { + return this.m_finalBODField; + } + set { + this.m_finalBODField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class MFConfigurationBODRecord { + + private MFConfigurationRecord m_baseRecordField; + + private bool m_bSalinityCorrectionField; + + private decfloat m_seedSalinityField; + + private decfloat m_dilutionSalinityField; + + private decfloat m_undilutedSampleSalinityField; + + private short m_bSeedAddedToField; + + private decfloat m_seedDilutionFactorField; + + private bool m_bBlankCorrectionField; + + private decfloat m_bottleVolumeField; + + private string m_bcvSampleIDField; + + /// + public MFConfigurationRecord m_baseRecord { + get { + return this.m_baseRecordField; + } + set { + this.m_baseRecordField = value; + } + } + + /// + public bool m_bSalinityCorrection { + get { + return this.m_bSalinityCorrectionField; + } + set { + this.m_bSalinityCorrectionField = value; + } + } + + /// + public decfloat m_seedSalinity { + get { + return this.m_seedSalinityField; + } + set { + this.m_seedSalinityField = value; + } + } + + /// + public decfloat m_dilutionSalinity { + get { + return this.m_dilutionSalinityField; + } + set { + this.m_dilutionSalinityField = value; + } + } + + /// + public decfloat m_undilutedSampleSalinity { + get { + return this.m_undilutedSampleSalinityField; + } + set { + this.m_undilutedSampleSalinityField = value; + } + } + + /// + public short m_bSeedAddedTo { + get { + return this.m_bSeedAddedToField; + } + set { + this.m_bSeedAddedToField = value; + } + } + + /// + public decfloat m_seedDilutionFactor { + get { + return this.m_seedDilutionFactorField; + } + set { + this.m_seedDilutionFactorField = value; + } + } + + /// + public bool m_bBlankCorrection { + get { + return this.m_bBlankCorrectionField; + } + set { + this.m_bBlankCorrectionField = value; + } + } + + /// + public decfloat m_bottleVolume { + get { + return this.m_bottleVolumeField; + } + set { + this.m_bottleVolumeField = value; + } + } + + /// + public string m_bcvSampleID { + get { + return this.m_bcvSampleIDField; + } + set { + this.m_bcvSampleIDField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class MFAnalysisBODRecord { + + private short m_limitAppliedToField; + + private BODAnalysisRecord m_bottleBODField; + + private LimitAnalysisRecord m_seedCorrectionField; + + private LimitAnalysisRecord m_finalBODField; + + /// + public short m_limitAppliedTo { + get { + return this.m_limitAppliedToField; + } + set { + this.m_limitAppliedToField = value; + } + } + + /// + public BODAnalysisRecord m_bottleBOD { + get { + return this.m_bottleBODField; + } + set { + this.m_bottleBODField = value; + } + } + + /// + public LimitAnalysisRecord m_seedCorrection { + get { + return this.m_seedCorrectionField; + } + set { + this.m_seedCorrectionField = value; + } + } + + /// + public LimitAnalysisRecord m_finalBOD { + get { + return this.m_finalBODField; + } + set { + this.m_finalBODField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class MeasureBODRecord { + + private short m_doUnitField; + + private short m_bodUnitField; + + private short m_doResolutionField; + + private short m_bodResolutionField; + + private bool m_stirFlagField; + + private EStirSpeed m_stirSpeedField; + + private EBODTempBarCorrection m_pressureCorrectionField; + + private EBODTempBarCorrection m_tempCorrectionField; + + /// + public short m_doUnit { + get { + return this.m_doUnitField; + } + set { + this.m_doUnitField = value; + } + } + + /// + public short m_bodUnit { + get { + return this.m_bodUnitField; + } + set { + this.m_bodUnitField = value; + } + } + + /// + public short m_doResolution { + get { + return this.m_doResolutionField; + } + set { + this.m_doResolutionField = value; + } + } + + /// + public short m_bodResolution { + get { + return this.m_bodResolutionField; + } + set { + this.m_bodResolutionField = value; + } + } + + /// + public bool m_stirFlag { + get { + return this.m_stirFlagField; + } + set { + this.m_stirFlagField = value; + } + } + + /// + public EStirSpeed m_stirSpeed { + get { + return this.m_stirSpeedField; + } + set { + this.m_stirSpeedField = value; + } + } + + /// + public EBODTempBarCorrection m_pressureCorrection { + get { + return this.m_pressureCorrectionField; + } + set { + this.m_pressureCorrectionField = value; + } + } + + /// + public EBODTempBarCorrection m_tempCorrection { + get { + return this.m_tempCorrectionField; + } + set { + this.m_tempCorrectionField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + public enum EBODTempBarCorrection { + + /// + eBODTempBarCorrectionid_BODTempBarCorrection_APHA, + + /// + eBODTempBarCorrectionid_BODTempBarCorrection_UNESCO, + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class MFMeasureBODRecord { + + private MeasureBODRecord m_bodRecordField; + + /// + public MeasureBODRecord m_bodRecord { + get { + return this.m_bodRecordField; + } + set { + this.m_bodRecordField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class MFMeasureBCVBlankRecord { + + private MeasureBODRecord m_bodRecordField; + + /// + public MeasureBODRecord m_bodRecord { + get { + return this.m_bodRecordField; + } + set { + this.m_bodRecordField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class MFMeasureBCVSeedRecord { + + private MeasureBODRecord m_bodRecordField; + + /// + public MeasureBODRecord m_bodRecord { + get { + return this.m_bodRecordField; + } + set { + this.m_bodRecordField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class MFMeasureBCVStandardRecord { + + private MeasureBODRecord m_bodRecordField; + + /// + public MeasureBODRecord m_bodRecord { + get { + return this.m_bodRecordField; + } + set { + this.m_bodRecordField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class MFAuxiliaryInstrumentRecord { + + private short m_controlTypeSelectedIDField; + + private string m_auxiliaryInstrumentNameField; + + private bool m_sendOutputSequenceFlagField; + + private string m_outputSequenceField; + + private bool m_waitforInputSequenceFlagField; + + private short m_maximumTimeField; + + private string m_inputSequenceField; + + private bool m_inputSequenceWithResultsFlagField; + + private string m_startSequenceField; + + private short m_totalLengthField; + + private short m_numberOfResultsField; + + private short m_startPostion1Field; + + private short m_maxLength1Field; + + private bool m_conditionFlagField; + + private string m_formulaField; + + /// + public short m_controlTypeSelectedID { + get { + return this.m_controlTypeSelectedIDField; + } + set { + this.m_controlTypeSelectedIDField = value; + } + } + + /// + public string m_auxiliaryInstrumentName { + get { + return this.m_auxiliaryInstrumentNameField; + } + set { + this.m_auxiliaryInstrumentNameField = value; + } + } + + /// + public bool m_sendOutputSequenceFlag { + get { + return this.m_sendOutputSequenceFlagField; + } + set { + this.m_sendOutputSequenceFlagField = value; + } + } + + /// + public string m_outputSequence { + get { + return this.m_outputSequenceField; + } + set { + this.m_outputSequenceField = value; + } + } + + /// + public bool m_waitforInputSequenceFlag { + get { + return this.m_waitforInputSequenceFlagField; + } + set { + this.m_waitforInputSequenceFlagField = value; + } + } + + /// + public short m_maximumTime { + get { + return this.m_maximumTimeField; + } + set { + this.m_maximumTimeField = value; + } + } + + /// + public string m_inputSequence { + get { + return this.m_inputSequenceField; + } + set { + this.m_inputSequenceField = value; + } + } + + /// + public bool m_inputSequenceWithResultsFlag { + get { + return this.m_inputSequenceWithResultsFlagField; + } + set { + this.m_inputSequenceWithResultsFlagField = value; + } + } + + /// + public string m_startSequence { + get { + return this.m_startSequenceField; + } + set { + this.m_startSequenceField = value; + } + } + + /// + public short m_totalLength { + get { + return this.m_totalLengthField; + } + set { + this.m_totalLengthField = value; + } + } + + /// + public short m_numberOfResults { + get { + return this.m_numberOfResultsField; + } + set { + this.m_numberOfResultsField = value; + } + } + + /// + public short m_startPostion1 { + get { + return this.m_startPostion1Field; + } + set { + this.m_startPostion1Field = value; + } + } + + /// + public short m_maxLength1 { + get { + return this.m_maxLength1Field; + } + set { + this.m_maxLength1Field = value; + } + } + + /// + public bool m_conditionFlag { + get { + return this.m_conditionFlagField; + } + set { + this.m_conditionFlagField = value; + } + } + + /// + public string m_formula { + get { + return this.m_formulaField; + } + set { + this.m_formulaField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class MFLabxMethodSetting { + + private ECommonUnit temperatureUnitField; + + private ECommonUnit barometricUnitField; + + private bool isConfirmEndpointField; + + private bool displayActualAndTempValuesField; + + /// + public ECommonUnit temperatureUnit { + get { + return this.temperatureUnitField; + } + set { + this.temperatureUnitField = value; + } + } + + /// + public ECommonUnit barometricUnit { + get { + return this.barometricUnitField; + } + set { + this.barometricUnitField = value; + } + } + + /// + public bool isConfirmEndpoint { + get { + return this.isConfirmEndpointField; + } + set { + this.isConfirmEndpointField = value; + } + } + + /// + public bool displayActualAndTempValues { + get { + return this.displayActualAndTempValuesField; + } + set { + this.displayActualAndTempValuesField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class MFPHSensorConfigRecord { + + private BasicSensorInfoForMeasure sensorInfoField; + + private SensorAdjustParameters sensorAdjustParametersField; + + private BasicSensorInfoForMeasure tempSensorInfoField; + + private TempCalPointData tempSensorCalDataField; + + private EModuleID moduleIDField; + + /// + public BasicSensorInfoForMeasure sensorInfo { + get { + return this.sensorInfoField; + } + set { + this.sensorInfoField = value; + } + } + + /// + public SensorAdjustParameters sensorAdjustParameters { + get { + return this.sensorAdjustParametersField; + } + set { + this.sensorAdjustParametersField = value; + } + } + + /// + public BasicSensorInfoForMeasure tempSensorInfo { + get { + return this.tempSensorInfoField; + } + set { + this.tempSensorInfoField = value; + } + } + + /// + public TempCalPointData tempSensorCalData { + get { + return this.tempSensorCalDataField; + } + set { + this.tempSensorCalDataField = value; + } + } + + /// + public EModuleID moduleID { + get { + return this.moduleIDField; + } + set { + this.moduleIDField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class MFIonSensorConfigRecord { + + private BasicSensorInfoForMeasure sensorInfoField; + + private EIonType ionTypeField; + + private EIonCharge ionChargeField; + + private decfloat ionMolarMassField; + + private SensorAdjustParameters sensorAdjustParametersField; + + private BasicSensorInfoForMeasure tempSensorInfoField; + + private TempCalPointData tempSensorCalDataField; + + private EModuleID moduleIDField; + + /// + public BasicSensorInfoForMeasure sensorInfo { + get { + return this.sensorInfoField; + } + set { + this.sensorInfoField = value; + } + } + + /// + public EIonType ionType { + get { + return this.ionTypeField; + } + set { + this.ionTypeField = value; + } + } + + /// + public EIonCharge ionCharge { + get { + return this.ionChargeField; + } + set { + this.ionChargeField = value; + } + } + + /// + public decfloat ionMolarMass { + get { + return this.ionMolarMassField; + } + set { + this.ionMolarMassField = value; + } + } + + /// + public SensorAdjustParameters sensorAdjustParameters { + get { + return this.sensorAdjustParametersField; + } + set { + this.sensorAdjustParametersField = value; + } + } + + /// + public BasicSensorInfoForMeasure tempSensorInfo { + get { + return this.tempSensorInfoField; + } + set { + this.tempSensorInfoField = value; + } + } + + /// + public TempCalPointData tempSensorCalData { + get { + return this.tempSensorCalDataField; + } + set { + this.tempSensorCalDataField = value; + } + } + + /// + public EModuleID moduleID { + get { + return this.moduleIDField; + } + set { + this.moduleIDField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class MFRedoxSensorConfigRecord { + + private BasicSensorInfoForMeasure sensorInfoField; + + private BasicSensorInfoForMeasure tempSensorInfoField; + + private TempCalPointData tempSensorCalDataField; + + private EModuleID moduleIDField; + + /// + public BasicSensorInfoForMeasure sensorInfo { + get { + return this.sensorInfoField; + } + set { + this.sensorInfoField = value; + } + } + + /// + public BasicSensorInfoForMeasure tempSensorInfo { + get { + return this.tempSensorInfoField; + } + set { + this.tempSensorInfoField = value; + } + } + + /// + public TempCalPointData tempSensorCalData { + get { + return this.tempSensorCalDataField; + } + set { + this.tempSensorCalDataField = value; + } + } + + /// + public EModuleID moduleID { + get { + return this.moduleIDField; + } + set { + this.moduleIDField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class MFCondSensorConfigRecord { + + private BasicSensorInfoForMeasure sensorInfoField; + + private CondCalPointData[] sensorAdjustParametersField; + + private BasicSensorInfoForMeasure tempSensorInfoField; + + private TempCalPointData tempSensorCalDataField; + + private EModuleID moduleIDField; + + /// + public BasicSensorInfoForMeasure sensorInfo { + get { + return this.sensorInfoField; + } + set { + this.sensorInfoField = value; + } + } + + /// + [System.Xml.Serialization.XmlArrayItemAttribute("ArrayOfCondCalPointData")] + public CondCalPointData[] sensorAdjustParameters { + get { + return this.sensorAdjustParametersField; + } + set { + this.sensorAdjustParametersField = value; + } + } + + /// + public BasicSensorInfoForMeasure tempSensorInfo { + get { + return this.tempSensorInfoField; + } + set { + this.tempSensorInfoField = value; + } + } + + /// + public TempCalPointData tempSensorCalData { + get { + return this.tempSensorCalDataField; + } + set { + this.tempSensorCalDataField = value; + } + } + + /// + public EModuleID moduleID { + get { + return this.moduleIDField; + } + set { + this.moduleIDField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class MFDOSensorConfigRecord { + + private BasicSensorInfoForMeasure sensorInfoField; + + private SensorAdjustParameter sensorAdjustParameterField; + + private BasicSensorInfoForMeasure tempSensorInfoField; + + private TempCalPointData tempSensorCalDataField; + + private EModuleID moduleIDField; + + /// + public BasicSensorInfoForMeasure sensorInfo { + get { + return this.sensorInfoField; + } + set { + this.sensorInfoField = value; + } + } + + /// + public SensorAdjustParameter sensorAdjustParameter { + get { + return this.sensorAdjustParameterField; + } + set { + this.sensorAdjustParameterField = value; + } + } + + /// + public BasicSensorInfoForMeasure tempSensorInfo { + get { + return this.tempSensorInfoField; + } + set { + this.tempSensorInfoField = value; + } + } + + /// + public TempCalPointData tempSensorCalData { + get { + return this.tempSensorCalDataField; + } + set { + this.tempSensorCalDataField = value; + } + } + + /// + public EModuleID moduleID { + get { + return this.moduleIDField; + } + set { + this.moduleIDField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class ArrayOfOUPData { + + private OUPData[] arrayOfOUPData1Field; + + /// + [System.Xml.Serialization.XmlElementAttribute("ArrayOfOUPData", IsNullable=true)] + public OUPData[] ArrayOfOUPData1 { + get { + return this.arrayOfOUPData1Field; + } + set { + this.arrayOfOUPData1Field = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class ArrayOfBODResult { + + private BODResult[] arrayOfBODResult1Field; + + /// + [System.Xml.Serialization.XmlElementAttribute("ArrayOfBODResult", IsNullable=true)] + public BODResult[] ArrayOfBODResult1 { + get { + return this.arrayOfBODResult1Field; + } + set { + this.arrayOfBODResult1Field = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class ArrayOfDecfloat { + + private decfloat[] arrayOfDecfloat1Field; + + /// + [System.Xml.Serialization.XmlElementAttribute("ArrayOfDecfloat", IsNullable=true)] + public decfloat[] ArrayOfDecfloat1 { + get { + return this.arrayOfDecfloat1Field; + } + set { + this.arrayOfDecfloat1Field = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class ResultMessage { + + private string rackidField; + + private string slotidField; + + private string groupidField; + + private int unitField; + + private string unitstringField; + + private int precisionField; + + private TreasureFleetAnyResult resultField; + + /// + public string rackid { + get { + return this.rackidField; + } + set { + this.rackidField = value; + } + } + + /// + public string slotid { + get { + return this.slotidField; + } + set { + this.slotidField = value; + } + } + + /// + public string groupid { + get { + return this.groupidField; + } + set { + this.groupidField = value; + } + } + + /// + public int unit { + get { + return this.unitField; + } + set { + this.unitField = value; + } + } + + /// + public string unitstring { + get { + return this.unitstringField; + } + set { + this.unitstringField = value; + } + } + + /// + public int precision { + get { + return this.precisionField; + } + set { + this.precisionField = value; + } + } + + /// + public TreasureFleetAnyResult result { + get { + return this.resultField; + } + set { + this.resultField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class Telegram { + + private object itemField; + + /// + [System.Xml.Serialization.XmlElementAttribute("EndOfMethod", typeof(EndOfMethod))] + [System.Xml.Serialization.XmlElementAttribute("ResultMessage", typeof(ResultMessage))] + [System.Xml.Serialization.XmlElementAttribute("method", typeof(method))] + public object Item { + get { + return this.itemField; + } + set { + this.itemField = value; + } + } + } +} diff --git a/SEClient/Contract/results_labxdirect.cs b/SEClient/Contract/results_labxdirect.cs new file mode 100644 index 0000000..0057ddd --- /dev/null +++ b/SEClient/Contract/results_labxdirect.cs @@ -0,0 +1,19067 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:4.0.30319.42000 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +// +// This source code was auto-generated by xsd, Version=4.0.30319.17929. +// +namespace MT.pHLab.SE.V1 { + using System.Xml.Serialization; + + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + public partial class TreasureFleetAnyResult { + + private object itemField; + + /// + [System.Xml.Serialization.XmlElementAttribute("DecimalResult", typeof(DecimalResult))] + [System.Xml.Serialization.XmlElementAttribute("IntegerResult", typeof(IntegerResult))] + [System.Xml.Serialization.XmlElementAttribute("ResultAdjustmentParameters", typeof(ResultAdjustmentParameters))] + [System.Xml.Serialization.XmlElementAttribute("ResultBODSample", typeof(ResultBODSample))] + [System.Xml.Serialization.XmlElementAttribute("ResultBcvBlank", typeof(ResultBcvBlank))] + [System.Xml.Serialization.XmlElementAttribute("ResultBcvSeed", typeof(ResultBcvSeed))] + [System.Xml.Serialization.XmlElementAttribute("ResultBcvStandard", typeof(ResultBcvStandard))] + [System.Xml.Serialization.XmlElementAttribute("ResultCnd", typeof(ResultCnd))] + [System.Xml.Serialization.XmlElementAttribute("ResultDO", typeof(ResultDO))] + [System.Xml.Serialization.XmlElementAttribute("ResultISMStatisticsCommon", typeof(ResultISMStatisticsCommon))] + [System.Xml.Serialization.XmlElementAttribute("ResultISMStatisticsPhDigital", typeof(ResultISMStatisticsPhDigital))] + [System.Xml.Serialization.XmlElementAttribute("ResultMFCalibrationCND", typeof(ResultMFCalibrationCND))] + [System.Xml.Serialization.XmlElementAttribute("ResultMFCalibrationDO", typeof(ResultMFCalibrationDO))] + [System.Xml.Serialization.XmlElementAttribute("ResultMFCalibrationISE", typeof(ResultMFCalibrationISE))] + [System.Xml.Serialization.XmlElementAttribute("ResultMFCalibrationPHISFET", typeof(ResultMFCalibrationPHISFET))] + [System.Xml.Serialization.XmlElementAttribute("ResultPh", typeof(ResultPh))] + [System.Xml.Serialization.XmlElementAttribute("StringResult", typeof(StringResult))] + public object Item { + get { + return this.itemField; + } + set { + this.itemField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + public partial class DecimalResult { + + private System.DateTime timestampField; + + private EDecimalResultState stateField; + + private decfloat valueField; + + /// + public System.DateTime timestamp { + get { + return this.timestampField; + } + set { + this.timestampField = value; + } + } + + /// + public EDecimalResultState state { + get { + return this.stateField; + } + set { + this.stateField = value; + } + } + + /// + public decfloat value { + get { + return this.valueField; + } + set { + this.valueField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + public enum EDecimalResultState { + [XmlEnum("0")] + /// + eDecimalResultState_Valid, + [XmlEnum("1")] + /// + eDecimalResultState_NaN, + [XmlEnum("2")] + /// + eDecimalResultState_INF, + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + public partial class decfloat { + + private string valueField; + + /// + [System.Xml.Serialization.XmlTextAttribute()] + public string Value { + get { + return this.valueField; + } + set { + this.valueField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + public partial class IntegerResult { + + private System.DateTime timestampField; + + private long valueField; + + /// + public System.DateTime timestamp { + get { + return this.timestampField; + } + set { + this.timestampField = value; + } + } + + /// + public long value { + get { + return this.valueField; + } + set { + this.valueField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + public partial class ResultAdjustmentParameters { + + private SensorAdjustParameter[] adjustParametersField; + + /// + [System.Xml.Serialization.XmlArrayAttribute(IsNullable=true)] + [System.Xml.Serialization.XmlArrayItemAttribute("ArrayOfSensorAdjustParameter")] + public SensorAdjustParameter[] adjustParameters { + get { + return this.adjustParametersField; + } + set { + this.adjustParametersField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class SensorAdjustParameter { + + private MTValue m_slopeField; + + private MTValue m_slopePercentField; + + private MTValue m_offsetField; + + private MTValue m_rawValueZoneMinField; + + private MTValue m_rawValuezoneMaxField; + + /// + public MTValue m_slope { + get { + return this.m_slopeField; + } + set { + this.m_slopeField = value; + } + } + + /// + public MTValue m_slopePercent { + get { + return this.m_slopePercentField; + } + set { + this.m_slopePercentField = value; + } + } + + /// + public MTValue m_offset { + get { + return this.m_offsetField; + } + set { + this.m_offsetField = value; + } + } + + /// + public MTValue m_rawValueZoneMin { + get { + return this.m_rawValueZoneMinField; + } + set { + this.m_rawValueZoneMinField = value; + } + } + + /// + public MTValue m_rawValuezoneMax { + get { + return this.m_rawValuezoneMaxField; + } + set { + this.m_rawValuezoneMaxField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class MTValue { + + private decfloat valueField; + + private ECommonUnit unitField; + + /// + public decfloat value { + get { + return this.valueField; + } + set { + this.valueField = value; + } + } + + /// + public ECommonUnit unit { + get { + return this.unitField; + } + set { + this.unitField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + public enum ECommonUnit { + [XmlEnum("0")] + eCommonUnitid_CommonUnit_None, + + [XmlEnum("1")] + eCommonUnitid_CommonUnit_PSU, + + [XmlEnum("2")] + eCommonUnitid_CommonUnit_PPT, + + [XmlEnum("3")] + eCommonUnitid_CommonUnit_MMOLL, + + [XmlEnum("4")] + eCommonUnitid_CommonUnit_MOLL, + + [XmlEnum("5")] + eCommonUnitid_CommonUnit_TDSPPT, + + [XmlEnum("6")] + eCommonUnitid_CommonUnit_MgL, + + [XmlEnum("7")] + eCommonUnitid_CommonUnit_PPM, + + [XmlEnum("8")] + eCommonUnitid_CommonUnit_Percent, + + [XmlEnum("9")] + eCommonUnitid_CommonUnit_PX, + + [XmlEnum("10")] + eCommonUnitid_CommonUnit_PH, + + /// + eCommonUnitid_CommonUnit_MV, + + /// + eCommonUnitid_CommonUnit_RelMV, + + /// + eCommonUnitid_CommonUnit_USCM, + + /// + eCommonUnitid_CommonUnit_MSCM, + + /// + eCommonUnitid_CommonUnit_SPerM, + + /// + eCommonUnitid_CommonUnit_USPerM, + + /// + eCommonUnitid_CommonUnit_MSPerM, + + /// + eCommonUnitid_CommonUnit_GPerL, + + /// + eCommonUnitid_CommonUnit_mBar, + + /// + eCommonUnitid_CommonUnit_hPa, + + /// + eCommonUnitid_CommonUnit_mmHg, + + /// + eCommonUnitid_CommonUnit_Atm, + + /// + eCommonUnitid_CommonUnit_KOCM, + + /// + eCommonUnitid_CommonUnit_MOCM, + + /// + eCommonUnitid_CommonUnit_OCM, + + /// + eCommonUnitid_CommonUnit_GPerMOL, + + /// + eCommonUnitid_CommonUnit_CellConstant, + + /// + eCommonUnitid_CommonUnit_MVPerPH, + + /// + eCommonUnitid_CommonUnit_MVPerPX, + + /// + eCommonUnitid_CommonUnit_ML, + + [XmlEnum("31")] + eCommonUnitid_CommonUnit_Celsius, + + /// + eCommonUnitid_CommonUnit_Fahrenheit, + + /// + eCommonUnitid_CommonUnit_Ohm, + + /// + eCommonUnitid_CommonUnit_Seconds, + + /// + eCommonUnitid_CommonUnit_V, + + /// + eCommonUnitid_CommonUnit_PercentPerCenti, + + /// + eCommonUnitid_CommonUnit_KOhm, + + /// + eCommonUnitid_CommonUnit_MOhm, + + /// + eCommonUnitid_CommonUnit_nA, + + /// + eCommonUnitid_CommonUnit_kPa, + + /// + eCommonUnitid_CommonUnit_mLmin, + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + public partial class ResultBODSample { + + private ResultBcv bCVSampleResultField; + + private decfloat[] seedCorrectFactorField; + + private decfloat[] blankCorrectFactorField; + + /// + public ResultBcv BCVSampleResult { + get { + return this.bCVSampleResultField; + } + set { + this.bCVSampleResultField = value; + } + } + + /// + [System.Xml.Serialization.XmlArrayItemAttribute("ArrayOfDecfloat")] + public decfloat[] seedCorrectFactor { + get { + return this.seedCorrectFactorField; + } + set { + this.seedCorrectFactorField = value; + } + } + + /// + [System.Xml.Serialization.XmlArrayItemAttribute("ArrayOfDecfloat")] + public decfloat[] blankCorrectFactor { + get { + return this.blankCorrectFactorField; + } + set { + this.blankCorrectFactorField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + public partial class ResultBcv { + + private OUPData[] baseField; + + private OUPData[] followField; + + private BODResult[] resultField; + + private decfloat standardDeviationField; + + private decfloat finalResultField; + + private ECommonUnit doUnitField; + + private ECommonUnit tempUnitField; + + private ECommonUnit pressureUnitField; + + private decfloat doResolutionField; + + private decfloat bodResolutionField; + + private System.DateTime timestampField; + + /// + [System.Xml.Serialization.XmlArrayItemAttribute("ArrayOfOUPData")] + public OUPData[] @base { + get { + return this.baseField; + } + set { + this.baseField = value; + } + } + + /// + [System.Xml.Serialization.XmlArrayItemAttribute("ArrayOfOUPData")] + public OUPData[] follow { + get { + return this.followField; + } + set { + this.followField = value; + } + } + + /// + [System.Xml.Serialization.XmlArrayItemAttribute("ArrayOfBODResult")] + public BODResult[] result { + get { + return this.resultField; + } + set { + this.resultField = value; + } + } + + /// + public decfloat standardDeviation { + get { + return this.standardDeviationField; + } + set { + this.standardDeviationField = value; + } + } + + /// + public decfloat finalResult { + get { + return this.finalResultField; + } + set { + this.finalResultField = value; + } + } + + /// + public ECommonUnit doUnit { + get { + return this.doUnitField; + } + set { + this.doUnitField = value; + } + } + + /// + public ECommonUnit tempUnit { + get { + return this.tempUnitField; + } + set { + this.tempUnitField = value; + } + } + + /// + public ECommonUnit pressureUnit { + get { + return this.pressureUnitField; + } + set { + this.pressureUnitField = value; + } + } + + /// + public decfloat doResolution { + get { + return this.doResolutionField; + } + set { + this.doResolutionField = value; + } + } + + /// + public decfloat bodResolution { + get { + return this.bodResolutionField; + } + set { + this.bodResolutionField = value; + } + } + + /// + public System.DateTime timestamp { + get { + return this.timestampField; + } + set { + this.timestampField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + public partial class OUPData { + + private decfloat doMglField; + + private decfloat oxygenSaturationField; + + private decfloat rawTemperatureField; + + private decfloat rawPressureField; + + private decfloat saliField; + + private System.DateTime datetimeField; + + private EResultQuality resultQualityField; + + private EMFAnalysisAction analysisActionField; + + private EAnalysisStatus analysisStatusField; + + /// + public decfloat doMgl { + get { + return this.doMglField; + } + set { + this.doMglField = value; + } + } + + /// + public decfloat OxygenSaturation { + get { + return this.oxygenSaturationField; + } + set { + this.oxygenSaturationField = value; + } + } + + /// + public decfloat rawTemperature { + get { + return this.rawTemperatureField; + } + set { + this.rawTemperatureField = value; + } + } + + /// + public decfloat rawPressure { + get { + return this.rawPressureField; + } + set { + this.rawPressureField = value; + } + } + + /// + public decfloat sali { + get { + return this.saliField; + } + set { + this.saliField = value; + } + } + + /// + public System.DateTime datetime { + get { + return this.datetimeField; + } + set { + this.datetimeField = value; + } + } + + /// + public EResultQuality resultQuality { + get { + return this.resultQualityField; + } + set { + this.resultQualityField = value; + } + } + + /// + public EMFAnalysisAction analysisAction { + get { + return this.analysisActionField; + } + set { + this.analysisActionField = value; + } + } + + /// + public EAnalysisStatus analysisStatus { + get { + return this.analysisStatusField; + } + set { + this.analysisStatusField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + public enum EResultQuality { + [XmlEnum("0")] + + /// + eDraftValue, + + /// + [XmlEnum("1")] + eDraftValue_Stable, + + /// + [XmlEnum("2")] + eManualEndpoint, + + /// + [XmlEnum("3")] + eAutoEndpoint_Strict, + + /// + [XmlEnum("4")] + eAutoEndpoint_Normal, + + /// + [XmlEnum("5")] + eAutoEndpoint_Fast, + + /// + eAutoEndpoint_UserDef, + + /// + eTimedEndpoint, + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + public enum EMFAnalysisAction { + + /// + [XmlEnum("0")] + eMFAnalysisActionid_MFAnalysisAction_SaveAndReport, + + /// + [XmlEnum("1")] + eMFAnalysisActionid_MFAnalysisAction_Repeat, + + /// + [XmlEnum("2")] + eMFAnalysisActionid_MFAnalysisAction_SkipBottle, + + /// + [XmlEnum("3")] + eMFAnalysisActionid_MFAnalysisAction_Interrupt, + + /// + [XmlEnum("4")] + eMFAnalysisActionid_MFAnalysisAction_PreventStart, + + /// + [XmlEnum("5")] + eMFAnalysisActionid_MFAnalysisAction_SaveAndWarn, + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + public enum EAnalysisStatus { + + /// + eAnalysisStatusid_AnalysisStatus_OK, + + /// + eAnalysisStatusid_AnalysisStatus_OKStar, + + /// + eAnalysisStatusid_AnalysisStatus_Failed, + + /// + eAnalysisStatusid_AnalysisStatus_Error, + + /// + eAnalysisStatusid_AnalysisStatus_CriticalError, + + /// + eAnalysisStatusid_AnalysisStatus_Terminate, + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + public partial class BODResult { + + private decfloat bottleBODField; + + private decfloat bottleO2DepletionField; + + private decfloat elapsedSecondsField; + + private EMFAnalysisAction analysisActionField; + + /// + public decfloat bottleBOD { + get { + return this.bottleBODField; + } + set { + this.bottleBODField = value; + } + } + + /// + public decfloat bottleO2Depletion { + get { + return this.bottleO2DepletionField; + } + set { + this.bottleO2DepletionField = value; + } + } + + /// + public decfloat elapsedSeconds { + get { + return this.elapsedSecondsField; + } + set { + this.elapsedSecondsField = value; + } + } + + /// + public EMFAnalysisAction analysisAction { + get { + return this.analysisActionField; + } + set { + this.analysisActionField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + public partial class ResultBcvBlank { + + private ResultBcv bCVBlankResultField; + + /// + public ResultBcv BCVBlankResult { + get { + return this.bCVBlankResultField; + } + set { + this.bCVBlankResultField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + public partial class ResultBcvSeed { + + private ResultBcv bCVSeedResultField; + + private decfloat[] o2DepletionPercentField; + + /// + public ResultBcv BCVSeedResult { + get { + return this.bCVSeedResultField; + } + set { + this.bCVSeedResultField = value; + } + } + + /// + [System.Xml.Serialization.XmlArrayItemAttribute("ArrayOfDecfloat")] + public decfloat[] O2DepletionPercent { + get { + return this.o2DepletionPercentField; + } + set { + this.o2DepletionPercentField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + public partial class ResultBcvStandard { + + private ResultBcv bCVStandardResultField; + + private decfloat[] seedCorrectFactorField; + + private decfloat[] blankCorrectFactorField; + + /// + public ResultBcv BCVStandardResult { + get { + return this.bCVStandardResultField; + } + set { + this.bCVStandardResultField = value; + } + } + + /// + [System.Xml.Serialization.XmlArrayItemAttribute("ArrayOfDecfloat")] + public decfloat[] seedCorrectFactor { + get { + return this.seedCorrectFactorField; + } + set { + this.seedCorrectFactorField = value; + } + } + + /// + [System.Xml.Serialization.XmlArrayItemAttribute("ArrayOfDecfloat")] + public decfloat[] blankCorrectFactor { + get { + return this.blankCorrectFactorField; + } + set { + this.blankCorrectFactorField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + public partial class ResultCnd { + + private decfloat rawValueField; + + private ECommonUnit rawValueUnitField; + + private decfloat rawTemperatureField; + + private ECommonUnit temperatureUnitField; + + private decfloat usedCCField; + + private ECondMode cndModeField; + + private decfloat resultValueField; + + private ECommonUnit resultUnitField; + + private EResultQuality resultQualityField; + + private EResultLimitState resultLimitStateField; + + private System.DateTime timestampField; + + /// + public decfloat rawValue { + get { + return this.rawValueField; + } + set { + this.rawValueField = value; + } + } + + /// + public ECommonUnit rawValueUnit { + get { + return this.rawValueUnitField; + } + set { + this.rawValueUnitField = value; + } + } + + /// + public decfloat rawTemperature { + get { + return this.rawTemperatureField; + } + set { + this.rawTemperatureField = value; + } + } + + /// + public ECommonUnit temperatureUnit { + get { + return this.temperatureUnitField; + } + set { + this.temperatureUnitField = value; + } + } + + /// + public decfloat usedCC { + get { + return this.usedCCField; + } + set { + this.usedCCField = value; + } + } + + /// + public ECondMode cndMode { + get { + return this.cndModeField; + } + set { + this.cndModeField = value; + } + } + + /// + public decfloat resultValue { + get { + return this.resultValueField; + } + set { + this.resultValueField = value; + } + } + + /// + public ECommonUnit resultUnit { + get { + return this.resultUnitField; + } + set { + this.resultUnitField = value; + } + } + + /// + public EResultQuality resultQuality { + get { + return this.resultQualityField; + } + set { + this.resultQualityField = value; + } + } + + /// + public EResultLimitState resultLimitState { + get { + return this.resultLimitStateField; + } + set { + this.resultLimitStateField = value; + } + } + + /// + public System.DateTime timestamp { + get { + return this.timestampField; + } + set { + this.timestampField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + public enum ECondMode { + + /// + eCondModeid_CondMode_Cond, + + /// + eCondModeid_CondMode_TDS, + + /// + eCondModeid_CondMode_Sal, + + /// + eCondModeid_CondMode_Res, + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + public enum EResultLimitState { + [XmlEnum("0")] + + /// + eResultLimit_NotChecked, + + [XmlEnum("1")] + /// + eResultLimit_InRange, + + [XmlEnum("2")] + /// + eResultLimit_OutUpper, + + /// + [XmlEnum("3")] + eResultLimit_OutLower, + + /// + [XmlEnum("4")] + eResultLimit_min, + + /// + [XmlEnum("5")] + eResultLimit_max, + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + public partial class ResultDO { + + private decfloat rawValueField; + + private ECommonUnit rawValueUnitField; + + private decfloat rawTemperatureField; + + private ECommonUnit temperatureUnitField; + + private decfloat rawPressureField; + + private ECommonUnit pressureUnitField; + + private decfloat resultValueField; + + private ECommonUnit resultUnitField; + + private EResultQuality resultQualityField; + + private EResultLimitState resultLimitStateField; + + private System.DateTime timestampField; + + /// + public decfloat rawValue { + get { + return this.rawValueField; + } + set { + this.rawValueField = value; + } + } + + /// + public ECommonUnit rawValueUnit { + get { + return this.rawValueUnitField; + } + set { + this.rawValueUnitField = value; + } + } + + /// + public decfloat rawTemperature { + get { + return this.rawTemperatureField; + } + set { + this.rawTemperatureField = value; + } + } + + /// + public ECommonUnit temperatureUnit { + get { + return this.temperatureUnitField; + } + set { + this.temperatureUnitField = value; + } + } + + /// + public decfloat rawPressure { + get { + return this.rawPressureField; + } + set { + this.rawPressureField = value; + } + } + + /// + public ECommonUnit pressureUnit { + get { + return this.pressureUnitField; + } + set { + this.pressureUnitField = value; + } + } + + /// + public decfloat resultValue { + get { + return this.resultValueField; + } + set { + this.resultValueField = value; + } + } + + /// + public ECommonUnit resultUnit { + get { + return this.resultUnitField; + } + set { + this.resultUnitField = value; + } + } + + /// + public EResultQuality resultQuality { + get { + return this.resultQualityField; + } + set { + this.resultQualityField = value; + } + } + + /// + public EResultLimitState resultLimitState { + get { + return this.resultLimitStateField; + } + set { + this.resultLimitStateField = value; + } + } + + /// + public System.DateTime timestamp { + get { + return this.timestampField; + } + set { + this.timestampField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + public partial class ResultISMStatisticsCommon { + + private string sensorSerialNumberField; + + private ECommonUnit temperatureUnitField; + + private decfloat maxTemperatureValueField; + + private System.DateTime maxTemperatureDateField; + + /// + public string sensorSerialNumber { + get { + return this.sensorSerialNumberField; + } + set { + this.sensorSerialNumberField = value; + } + } + + /// + public ECommonUnit temperatureUnit { + get { + return this.temperatureUnitField; + } + set { + this.temperatureUnitField = value; + } + } + + /// + public decfloat maxTemperatureValue { + get { + return this.maxTemperatureValueField; + } + set { + this.maxTemperatureValueField = value; + } + } + + /// + public System.DateTime maxTemperatureDate { + get { + return this.maxTemperatureDateField; + } + set { + this.maxTemperatureDateField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + public partial class ResultISMStatisticsPhDigital { + + private string sensorSerialNumberField; + + private ECommonUnit temperatureUnitField; + + private decfloat maxTemperatureValueField; + + private System.DateTime maxTemperatureDateField; + + private decfloat averageTemperatureValueField; + + private ECommonUnit measurementTimeUnitField; + + private decfloat measurementTimeField; + + private ECommonUnit pHUnitField; + + private decfloat averagePhValueField; + + private decfloat maxPhValueField; + + private System.DateTime maxPhDateField; + + private decfloat minPhValueField; + + private System.DateTime minPhDateField; + + /// + public string sensorSerialNumber { + get { + return this.sensorSerialNumberField; + } + set { + this.sensorSerialNumberField = value; + } + } + + /// + public ECommonUnit temperatureUnit { + get { + return this.temperatureUnitField; + } + set { + this.temperatureUnitField = value; + } + } + + /// + public decfloat maxTemperatureValue { + get { + return this.maxTemperatureValueField; + } + set { + this.maxTemperatureValueField = value; + } + } + + /// + public System.DateTime maxTemperatureDate { + get { + return this.maxTemperatureDateField; + } + set { + this.maxTemperatureDateField = value; + } + } + + /// + public decfloat averageTemperatureValue { + get { + return this.averageTemperatureValueField; + } + set { + this.averageTemperatureValueField = value; + } + } + + /// + public ECommonUnit measurementTimeUnit { + get { + return this.measurementTimeUnitField; + } + set { + this.measurementTimeUnitField = value; + } + } + + /// + public decfloat measurementTime { + get { + return this.measurementTimeField; + } + set { + this.measurementTimeField = value; + } + } + + /// + public ECommonUnit pHUnit { + get { + return this.pHUnitField; + } + set { + this.pHUnitField = value; + } + } + + /// + public decfloat averagePhValue { + get { + return this.averagePhValueField; + } + set { + this.averagePhValueField = value; + } + } + + /// + public decfloat maxPhValue { + get { + return this.maxPhValueField; + } + set { + this.maxPhValueField = value; + } + } + + /// + public System.DateTime maxPhDate { + get { + return this.maxPhDateField; + } + set { + this.maxPhDateField = value; + } + } + + /// + public decfloat minPhValue { + get { + return this.minPhValueField; + } + set { + this.minPhValueField = value; + } + } + + /// + public System.DateTime minPhDate { + get { + return this.minPhDateField; + } + set { + this.minPhDateField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + public partial class ResultMFCalibrationCND { + + private System.Nullable[] cellConstantLimitStateField; + + private CondCalPointData sensorCalPointsField; + + /// + [System.Xml.Serialization.XmlArrayItemAttribute("ArrayOfShort")] + public System.Nullable[] cellConstantLimitState { + get { + return this.cellConstantLimitStateField; + } + set { + this.cellConstantLimitStateField = value; + } + } + + /// + public CondCalPointData sensorCalPoints { + get { + return this.sensorCalPointsField; + } + set { + this.sensorCalPointsField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class CondCalPointData { + + private decfloat m_refStdField; + + private ECommonUnit m_stdUnitField; + + private decfloat m_rawValueField; + + private decfloat m_cellConstantField; + + private decfloat m_tempField; + + /// + public decfloat m_refStd { + get { + return this.m_refStdField; + } + set { + this.m_refStdField = value; + } + } + + /// + public ECommonUnit m_stdUnit { + get { + return this.m_stdUnitField; + } + set { + this.m_stdUnitField = value; + } + } + + /// + public decfloat m_rawValue { + get { + return this.m_rawValueField; + } + set { + this.m_rawValueField = value; + } + } + + /// + public decfloat m_cellConstant { + get { + return this.m_cellConstantField; + } + set { + this.m_cellConstantField = value; + } + } + + /// + public decfloat m_temp { + get { + return this.m_tempField; + } + set { + this.m_tempField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + public partial class ResultMFCalibrationDO { + + private decfloat defaultSlopeField; + + private short slopeLimitStateField; + + private short doSensorTypeField; + + private decfloat salinityCorrectionFactorField; + + private DOCalPointData[] sensorCalPointsField; + + /// + public decfloat defaultSlope { + get { + return this.defaultSlopeField; + } + set { + this.defaultSlopeField = value; + } + } + + /// + public short slopeLimitState { + get { + return this.slopeLimitStateField; + } + set { + this.slopeLimitStateField = value; + } + } + + /// + public short doSensorType { + get { + return this.doSensorTypeField; + } + set { + this.doSensorTypeField = value; + } + } + + /// + public decfloat salinityCorrectionFactor { + get { + return this.salinityCorrectionFactorField; + } + set { + this.salinityCorrectionFactorField = value; + } + } + + /// + [System.Xml.Serialization.XmlArrayItemAttribute("ArrayOfDOCalPointData")] + public DOCalPointData[] sensorCalPoints { + get { + return this.sensorCalPointsField; + } + set { + this.sensorCalPointsField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class DOCalPointData { + + private decfloat m_stdField; + + private ECommonUnit m_stdUnitField; + + private decfloat m_valueForCalcuField; + + private decfloat m_rawValueField; + + private int m_barPressureField; + + private decfloat m_tempField; + + /// + public decfloat m_std { + get { + return this.m_stdField; + } + set { + this.m_stdField = value; + } + } + + /// + public ECommonUnit m_stdUnit { + get { + return this.m_stdUnitField; + } + set { + this.m_stdUnitField = value; + } + } + + /// + public decfloat m_valueForCalcu { + get { + return this.m_valueForCalcuField; + } + set { + this.m_valueForCalcuField = value; + } + } + + /// + public decfloat m_rawValue { + get { + return this.m_rawValueField; + } + set { + this.m_rawValueField = value; + } + } + + /// + public int m_barPressure { + get { + return this.m_barPressureField; + } + set { + this.m_barPressureField = value; + } + } + + /// + public decfloat m_temp { + get { + return this.m_tempField; + } + set { + this.m_tempField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + public partial class ResultMFCalibrationISE { + + private decfloat defaultSlopeField; + + private short calibrationModeField; + + private short calibrationUnitField; + + private short ionTypeField; + + private sbyte ionChargeField; + + private decfloat ionMolMassField; + + private System.Nullable[] offsetLimitStatesField; + + private System.Nullable[] slopeLimitStatesField; + + private ISECalPointData[] sensorCalPointsField; + + /// + public decfloat defaultSlope { + get { + return this.defaultSlopeField; + } + set { + this.defaultSlopeField = value; + } + } + + /// + public short calibrationMode { + get { + return this.calibrationModeField; + } + set { + this.calibrationModeField = value; + } + } + + /// + public short calibrationUnit { + get { + return this.calibrationUnitField; + } + set { + this.calibrationUnitField = value; + } + } + + /// + public short ionType { + get { + return this.ionTypeField; + } + set { + this.ionTypeField = value; + } + } + + /// + public sbyte ionCharge { + get { + return this.ionChargeField; + } + set { + this.ionChargeField = value; + } + } + + /// + public decfloat ionMolMass { + get { + return this.ionMolMassField; + } + set { + this.ionMolMassField = value; + } + } + + /// + [System.Xml.Serialization.XmlArrayItemAttribute("ArrayOfShort")] + public System.Nullable[] offsetLimitStates { + get { + return this.offsetLimitStatesField; + } + set { + this.offsetLimitStatesField = value; + } + } + + /// + [System.Xml.Serialization.XmlArrayItemAttribute("ArrayOfShort")] + public System.Nullable[] slopeLimitStates { + get { + return this.slopeLimitStatesField; + } + set { + this.slopeLimitStatesField = value; + } + } + + /// + [System.Xml.Serialization.XmlArrayItemAttribute("ArrayOfISECalPointData")] + public ISECalPointData[] sensorCalPoints { + get { + return this.sensorCalPointsField; + } + set { + this.sensorCalPointsField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class ISECalPointData { + + private decfloat m_refStdField; + + private decfloat m_realStdField; + + private decfloat m_actualValueField; + + private decfloat m_rawValueField; + + private decfloat m_tempField; + + /// + public decfloat m_refStd { + get { + return this.m_refStdField; + } + set { + this.m_refStdField = value; + } + } + + /// + public decfloat m_realStd { + get { + return this.m_realStdField; + } + set { + this.m_realStdField = value; + } + } + + /// + public decfloat m_actualValue { + get { + return this.m_actualValueField; + } + set { + this.m_actualValueField = value; + } + } + + /// + public decfloat m_rawValue { + get { + return this.m_rawValueField; + } + set { + this.m_rawValueField = value; + } + } + + /// + public decfloat m_temp { + get { + return this.m_tempField; + } + set { + this.m_tempField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + public partial class ResultMFCalibrationPHISFET { + + private decfloat defaultSlopeField; + + private short calModeField; + + private System.Nullable[] offsetLimitStatesField; + + private System.Nullable[] slopeLimitStatesField; + + private PHISFETCalPointData[] sensorCalPointsField; + + /// + public decfloat defaultSlope { + get { + return this.defaultSlopeField; + } + set { + this.defaultSlopeField = value; + } + } + + /// + public short calMode { + get { + return this.calModeField; + } + set { + this.calModeField = value; + } + } + + /// + [System.Xml.Serialization.XmlArrayItemAttribute("ArrayOfShort")] + public System.Nullable[] offsetLimitStates { + get { + return this.offsetLimitStatesField; + } + set { + this.offsetLimitStatesField = value; + } + } + + /// + [System.Xml.Serialization.XmlArrayItemAttribute("ArrayOfShort")] + public System.Nullable[] slopeLimitStates { + get { + return this.slopeLimitStatesField; + } + set { + this.slopeLimitStatesField = value; + } + } + + /// + [System.Xml.Serialization.XmlArrayItemAttribute("ArrayOfPHISFETCalPointData")] + public PHISFETCalPointData[] sensorCalPoints { + get { + return this.sensorCalPointsField; + } + set { + this.sensorCalPointsField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class PHISFETCalPointData { + + private decfloat m_refBufField; + + private decfloat m_realBufField; + + private decfloat m_actualValueField; + + private decfloat m_rawValueField; + + private decfloat m_tempField; + + /// + public decfloat m_refBuf { + get { + return this.m_refBufField; + } + set { + this.m_refBufField = value; + } + } + + /// + public decfloat m_realBuf { + get { + return this.m_realBufField; + } + set { + this.m_realBufField = value; + } + } + + /// + public decfloat m_actualValue { + get { + return this.m_actualValueField; + } + set { + this.m_actualValueField = value; + } + } + + /// + public decfloat m_rawValue { + get { + return this.m_rawValueField; + } + set { + this.m_rawValueField = value; + } + } + + /// + public decfloat m_temp { + get { + return this.m_tempField; + } + set { + this.m_tempField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + public partial class ResultPh { + + private decfloat rawValueField; + + private ECommonUnit rawValueUnitField; + + private decfloat rawTemperatureField; + + private ECommonUnit temperatureUnitField; + + private decfloat resultValueField; + + private ECommonUnit resultUnitField; + + private EResultQuality resultQualityField; + + private EResultLimitState resultLimitStateField; + + private System.DateTime timestampField; + + /// + public decfloat rawValue { + get { + return this.rawValueField; + } + set { + this.rawValueField = value; + } + } + + /// + public ECommonUnit rawValueUnit { + get { + return this.rawValueUnitField; + } + set { + this.rawValueUnitField = value; + } + } + + /// + public decfloat rawTemperature { + get { + return this.rawTemperatureField; + } + set { + this.rawTemperatureField = value; + } + } + + /// + public ECommonUnit temperatureUnit { + get { + return this.temperatureUnitField; + } + set { + this.temperatureUnitField = value; + } + } + + /// + public decfloat resultValue { + get { + return this.resultValueField; + } + set { + this.resultValueField = value; + } + } + + /// + public ECommonUnit resultUnit { + get { + return this.resultUnitField; + } + set { + this.resultUnitField = value; + } + } + + /// + public EResultQuality resultQuality { + get { + return this.resultQualityField; + } + set { + this.resultQualityField = value; + } + } + + /// + public EResultLimitState resultLimitState { + get { + return this.resultLimitStateField; + } + set { + this.resultLimitStateField = value; + } + } + + /// + public System.DateTime timestamp { + get { + return this.timestampField; + } + set { + this.timestampField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + public partial class StringResult { + + private System.DateTime timestampField; + + private string valueField; + + /// + public System.DateTime timestamp { + get { + return this.timestampField; + } + set { + this.timestampField = value; + } + } + + /// + public string value { + get { + return this.valueField; + } + set { + this.valueField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + public partial class EndOfMethod { + + private System.DateTime m_timestampField; + + private EAnalysisStatus m_eAnalysisStatusField; + + private short m_uiJobIdField; + + private string m_userField; + + /// + public System.DateTime m_timestamp { + get { + return this.m_timestampField; + } + set { + this.m_timestampField = value; + } + } + + /// + public EAnalysisStatus m_eAnalysisStatus { + get { + return this.m_eAnalysisStatusField; + } + set { + this.m_eAnalysisStatusField = value; + } + } + + /// + public short m_uiJobId { + get { + return this.m_uiJobIdField; + } + set { + this.m_uiJobIdField = value; + } + } + + /// + public string m_user { + get { + return this.m_userField; + } + set { + this.m_userField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class method { + + private record[] mfField; + + /// + [System.Xml.Serialization.XmlElementAttribute("mf")] + public record[] mf { + get { + return this.mfField; + } + set { + this.mfField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class record { + + private param[] paramlistField; + + private record[] sflistField; + + private string typeField; + + /// + [System.Xml.Serialization.XmlArrayAttribute("param-list")] + [System.Xml.Serialization.XmlArrayItemAttribute(IsNullable=false)] + public param[] paramlist { + get { + return this.paramlistField; + } + set { + this.paramlistField = value; + } + } + + /// + [System.Xml.Serialization.XmlArrayAttribute("sf-list")] + [System.Xml.Serialization.XmlArrayItemAttribute("sf", IsNullable=false)] + public record[] sflist { + get { + return this.sflistField; + } + set { + this.sflistField = value; + } + } + + /// + [System.Xml.Serialization.XmlAttributeAttribute()] + public string type { + get { + return this.typeField; + } + set { + this.typeField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + public partial class param { + + private object[] itemsField; + + private string[] textField; + + private string nameField; + + private pdk_datatypes typeField; + + private pdk_datatypes sequenceTypeField; + + private bool sequenceTypeFieldSpecified; + + private string recordTypeField; + + /// + [System.Xml.Serialization.XmlElementAttribute("item", typeof(item))] + [System.Xml.Serialization.XmlElementAttribute("record", typeof(record))] + public object[] Items { + get { + return this.itemsField; + } + set { + this.itemsField = value; + } + } + + /// + [System.Xml.Serialization.XmlTextAttribute()] + public string[] Text { + get { + return this.textField; + } + set { + this.textField = value; + } + } + + /// + [System.Xml.Serialization.XmlAttributeAttribute()] + public string name { + get { + return this.nameField; + } + set { + this.nameField = value; + } + } + + /// + [System.Xml.Serialization.XmlAttributeAttribute()] + public pdk_datatypes type { + get { + return this.typeField; + } + set { + this.typeField = value; + } + } + + /// + [System.Xml.Serialization.XmlAttributeAttribute()] + public pdk_datatypes sequenceType { + get { + return this.sequenceTypeField; + } + set { + this.sequenceTypeField = value; + } + } + + /// + [System.Xml.Serialization.XmlIgnoreAttribute()] + public bool sequenceTypeSpecified { + get { + return this.sequenceTypeFieldSpecified; + } + set { + this.sequenceTypeFieldSpecified = value; + } + } + + /// + [System.Xml.Serialization.XmlAttributeAttribute()] + public string recordType { + get { + return this.recordTypeField; + } + set { + this.recordTypeField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + public partial class item { + + private record itemField; + + private string[] textField; + + /// + [System.Xml.Serialization.XmlElementAttribute("record")] + public record Item { + get { + return this.itemField; + } + set { + this.itemField = value; + } + } + + /// + [System.Xml.Serialization.XmlTextAttribute()] + public string[] Text { + get { + return this.textField; + } + set { + this.textField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + public enum pdk_datatypes { + + /// + boolean, + + /// + @short, + + /// + wstring, + + /// + decfloat, + + /// + @long, + + /// + datetime, + + /// + sequence, + + /// + record, + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class DateTimeRecord { + + private short m_dayField; + + private short m_monthField; + + private int m_yearField; + + private short m_hourField; + + private short m_minuteField; + + /// + public short m_day { + get { + return this.m_dayField; + } + set { + this.m_dayField = value; + } + } + + /// + public short m_month { + get { + return this.m_monthField; + } + set { + this.m_monthField = value; + } + } + + /// + public int m_year { + get { + return this.m_yearField; + } + set { + this.m_yearField = value; + } + } + + /// + public short m_hour { + get { + return this.m_hourField; + } + set { + this.m_hourField = value; + } + } + + /// + public short m_minute { + get { + return this.m_minuteField; + } + set { + this.m_minuteField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class ResultSummaryRecord { + + private string m_resultIDField; + + private string m_methodTypeStrField; + + private string m_methodIDField; + + private string m_sampleIDField; + + private short m_eAnalysisStatusField; + + private string m_resultReportField; + + private System.DateTime m_dateTimeField; + + private bool m_isOUPBaseField; + + /// + public string m_resultID { + get { + return this.m_resultIDField; + } + set { + this.m_resultIDField = value; + } + } + + /// + public string m_methodTypeStr { + get { + return this.m_methodTypeStrField; + } + set { + this.m_methodTypeStrField = value; + } + } + + /// + public string m_methodID { + get { + return this.m_methodIDField; + } + set { + this.m_methodIDField = value; + } + } + + /// + public string m_sampleID { + get { + return this.m_sampleIDField; + } + set { + this.m_sampleIDField = value; + } + } + + /// + public short m_eAnalysisStatus { + get { + return this.m_eAnalysisStatusField; + } + set { + this.m_eAnalysisStatusField = value; + } + } + + /// + public string m_resultReport { + get { + return this.m_resultReportField; + } + set { + this.m_resultReportField = value; + } + } + + /// + public System.DateTime m_dateTime { + get { + return this.m_dateTimeField; + } + set { + this.m_dateTimeField = value; + } + } + + /// + public bool m_isOUPBase { + get { + return this.m_isOUPBaseField; + } + set { + this.m_isOUPBaseField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class DateTimeFormatRecord { + + private EHmiDateFormat m_dateFormatField; + + private EHmiTimeFormat m_timeFormatField; + + /// + public EHmiDateFormat m_dateFormat { + get { + return this.m_dateFormatField; + } + set { + this.m_dateFormatField = value; + } + } + + /// + public EHmiTimeFormat m_timeFormat { + get { + return this.m_timeFormatField; + } + set { + this.m_timeFormatField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + public enum EHmiDateFormat { + + /// + eHmiDateFormatid_HmiDateFormat_mmddyyyy, + + /// + eHmiDateFormatid_HmiDateFormat_ddmmyyyy, + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + public enum EHmiTimeFormat { + + /// + eHmiTimeFormatid_HmiTimeFormat_24h, + + /// + eHmiTimeFormatid_HmiTimeFormat_AmPm, + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class FingerprintReaderRecord { + + private string m_nameField; + + private bool m_utilizeFingerprintReaderField; + + private EPeripheralsConnection m_connectionIDField; + + /// + public string m_name { + get { + return this.m_nameField; + } + set { + this.m_nameField = value; + } + } + + /// + public bool m_utilizeFingerprintReader { + get { + return this.m_utilizeFingerprintReaderField; + } + set { + this.m_utilizeFingerprintReaderField = value; + } + } + + /// + public EPeripheralsConnection m_connectionID { + get { + return this.m_connectionIDField; + } + set { + this.m_connectionIDField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + public enum EPeripheralsConnection { + + /// + ePeripheralsConnectionid_PeripheralsConnection_PnP, + + /// + ePeripheralsConnectionid_PeripheralsConnection_USB, + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class InMotionSettingRecord { + + private string m_nameField; + + private EBaseType m_baseTypeField; + + private EStatus m_statusField; + + private short m_stirrerOutputField; + + private short m_powershowerOutputField; + + private decfloat m_rateField; + + private ERack m_rackTypeField; + + private short m_rackSizeField; + + private short m_beakerHeightField; + + /// + public string m_name { + get { + return this.m_nameField; + } + set { + this.m_nameField = value; + } + } + + /// + public EBaseType m_baseType { + get { + return this.m_baseTypeField; + } + set { + this.m_baseTypeField = value; + } + } + + /// + public EStatus m_status { + get { + return this.m_statusField; + } + set { + this.m_statusField = value; + } + } + + /// + public short m_stirrerOutput { + get { + return this.m_stirrerOutputField; + } + set { + this.m_stirrerOutputField = value; + } + } + + /// + public short m_powershowerOutput { + get { + return this.m_powershowerOutputField; + } + set { + this.m_powershowerOutputField = value; + } + } + + /// + public decfloat m_rate { + get { + return this.m_rateField; + } + set { + this.m_rateField = value; + } + } + + /// + public ERack m_rackType { + get { + return this.m_rackTypeField; + } + set { + this.m_rackTypeField = value; + } + } + + /// + public short m_rackSize { + get { + return this.m_rackSizeField; + } + set { + this.m_rackSizeField = value; + } + } + + /// + public short m_beakerHeight { + get { + return this.m_beakerHeightField; + } + set { + this.m_beakerHeightField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + public enum EBaseType { + + /// + eBaseTypeid_BaseType_Flex, + + /// + eBaseTypeid_BaseType_Pro, + + /// + eBaseTypeid_BaseType_Max, + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + public enum EStatus { + + /// + eStatusid_Status_Installed, + + /// + eStatusid_Status_NotInstalled, + + /// + eStatusid_Status_InstalledNotSupported, + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + public enum ERack { + + /// + eRackid_Rack_Standard, + + /// + eRackid_Rack_WaterBath, + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class PHSensorRecord { + + private string m_uuidField; + + private string m_sensorSerialNumberField; + + private string m_sensorIDField; + + private ESensorClass m_sensorClassField; + + private System.DateTime m_initialOperationDateField; + + private decfloat m_def_slopeField; + + private decfloat m_def_offsetField; + + private bool m_isObservedField; + + private int numberOfEntriesField; + + private bool m_monitorLifeSpanField; + + private short m_lifeSpanField; + + private System.DateTime m_expiryDateLifeSpanField; + + private bool m_monitorUsableLifeField; + + private System.DateTime m_expiryDateUsableLifeField; + + private ETimeUnit m_usableLifeTimePeriodField; + + private int m_usableLifeField; + + private PHISFETSensorCalRecord[] m_sensorCalHistoryField; + + /// + public string m_uuid { + get { + return this.m_uuidField; + } + set { + this.m_uuidField = value; + } + } + + /// + public string m_sensorSerialNumber { + get { + return this.m_sensorSerialNumberField; + } + set { + this.m_sensorSerialNumberField = value; + } + } + + /// + public string m_sensorID { + get { + return this.m_sensorIDField; + } + set { + this.m_sensorIDField = value; + } + } + + /// + public ESensorClass m_sensorClass { + get { + return this.m_sensorClassField; + } + set { + this.m_sensorClassField = value; + } + } + + /// + public System.DateTime m_initialOperationDate { + get { + return this.m_initialOperationDateField; + } + set { + this.m_initialOperationDateField = value; + } + } + + /// + public decfloat m_def_slope { + get { + return this.m_def_slopeField; + } + set { + this.m_def_slopeField = value; + } + } + + /// + public decfloat m_def_offset { + get { + return this.m_def_offsetField; + } + set { + this.m_def_offsetField = value; + } + } + + /// + public bool m_isObserved { + get { + return this.m_isObservedField; + } + set { + this.m_isObservedField = value; + } + } + + /// + public int numberOfEntries { + get { + return this.numberOfEntriesField; + } + set { + this.numberOfEntriesField = value; + } + } + + /// + public bool m_monitorLifeSpan { + get { + return this.m_monitorLifeSpanField; + } + set { + this.m_monitorLifeSpanField = value; + } + } + + /// + public short m_lifeSpan { + get { + return this.m_lifeSpanField; + } + set { + this.m_lifeSpanField = value; + } + } + + /// + public System.DateTime m_expiryDateLifeSpan { + get { + return this.m_expiryDateLifeSpanField; + } + set { + this.m_expiryDateLifeSpanField = value; + } + } + + /// + public bool m_monitorUsableLife { + get { + return this.m_monitorUsableLifeField; + } + set { + this.m_monitorUsableLifeField = value; + } + } + + /// + public System.DateTime m_expiryDateUsableLife { + get { + return this.m_expiryDateUsableLifeField; + } + set { + this.m_expiryDateUsableLifeField = value; + } + } + + /// + public ETimeUnit m_usableLifeTimePeriod { + get { + return this.m_usableLifeTimePeriodField; + } + set { + this.m_usableLifeTimePeriodField = value; + } + } + + /// + public int m_usableLife { + get { + return this.m_usableLifeField; + } + set { + this.m_usableLifeField = value; + } + } + + /// + [System.Xml.Serialization.XmlArrayItemAttribute("ArrayOfPHISFETSensorCalRecord")] + public PHISFETSensorCalRecord[] m_sensorCalHistory { + get { + return this.m_sensorCalHistoryField; + } + set { + this.m_sensorCalHistoryField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + public enum ESensorClass { + + /// + eSensorClassid_SensorClass_Normal, + + /// + eSensorClassid_SensorClass_AnalogOneWiredISM, + + /// + eSensorClassid_SensorClass_DigitalOneWiredISM, + + /// + eSensorClassid_SensorClass_DigitalRS485ISM, + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + public enum ETimeUnit { + + /// + eTimeUnitid_TimeUnit_Days, + + /// + eTimeUnitid_TimeUnit_Hours, + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class PHISFETSensorCalRecord { + + private string m_moduleSerialNumberField; + + private ETemperatureCapture m_tempCaptureField; + + private string m_tempSensorIDField; + + private ECalMode m_calModeField; + + private bool m_isAutoBufField; + + private short m_phBufGrpClassField; + + private decfloat m_defaultSlopeField; + + private decfloat m_bufstdRefTempField; + + private EEndpointType m_endpointTypeField; + + private EEndpointCriteria m_endpointCriteriaField; + + private int m_timedEndpointValueField; + + private string m_calProcedureField; + + private System.DateTime m_calDateField; + + private string m_calCreatorField; + + private PHISFETCalPointData[] m_sensorCalPointsField; + + /// + public string m_moduleSerialNumber { + get { + return this.m_moduleSerialNumberField; + } + set { + this.m_moduleSerialNumberField = value; + } + } + + /// + public ETemperatureCapture m_tempCapture { + get { + return this.m_tempCaptureField; + } + set { + this.m_tempCaptureField = value; + } + } + + /// + public string m_tempSensorID { + get { + return this.m_tempSensorIDField; + } + set { + this.m_tempSensorIDField = value; + } + } + + /// + public ECalMode m_calMode { + get { + return this.m_calModeField; + } + set { + this.m_calModeField = value; + } + } + + /// + public bool m_isAutoBuf { + get { + return this.m_isAutoBufField; + } + set { + this.m_isAutoBufField = value; + } + } + + /// + public short m_phBufGrpClass { + get { + return this.m_phBufGrpClassField; + } + set { + this.m_phBufGrpClassField = value; + } + } + + /// + public decfloat m_defaultSlope { + get { + return this.m_defaultSlopeField; + } + set { + this.m_defaultSlopeField = value; + } + } + + /// + public decfloat m_bufstdRefTemp { + get { + return this.m_bufstdRefTempField; + } + set { + this.m_bufstdRefTempField = value; + } + } + + /// + public EEndpointType m_endpointType { + get { + return this.m_endpointTypeField; + } + set { + this.m_endpointTypeField = value; + } + } + + /// + public EEndpointCriteria m_endpointCriteria { + get { + return this.m_endpointCriteriaField; + } + set { + this.m_endpointCriteriaField = value; + } + } + + /// + public int m_timedEndpointValue { + get { + return this.m_timedEndpointValueField; + } + set { + this.m_timedEndpointValueField = value; + } + } + + /// + public string m_calProcedure { + get { + return this.m_calProcedureField; + } + set { + this.m_calProcedureField = value; + } + } + + /// + public System.DateTime m_calDate { + get { + return this.m_calDateField; + } + set { + this.m_calDateField = value; + } + } + + /// + public string m_calCreator { + get { + return this.m_calCreatorField; + } + set { + this.m_calCreatorField = value; + } + } + + /// + [System.Xml.Serialization.XmlArrayItemAttribute("ArrayOfPHISFETCalPointData")] + public PHISFETCalPointData[] m_sensorCalPoints { + get { + return this.m_sensorCalPointsField; + } + set { + this.m_sensorCalPointsField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + public enum ETemperatureCapture { + + /// + eTemperatureCaptureid_TemperatureCapture_Internal, + + /// + eTemperatureCaptureid_TemperatureCapture_External, + + /// + eTemperatureCaptureid_TemperatureCapture_Manual, + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + public enum ECalMode { + + /// + eCalModeid_CalMode_Linear, + + /// + eCalModeid_CalMode_Segment, + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + public enum EEndpointType { + + /// + eEndpointTypeid_EndpointType_Auto, + + /// + eEndpointTypeid_EndpointType_Manual, + + /// + eEndpointTypeid_EndpointType_Timed, + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + public enum EEndpointCriteria { + + /// + eEndpointCriteriaid_EndpointCriteria_Strict, + + /// + eEndpointCriteriaid_EndpointCriteria_Standard, + + /// + eEndpointCriteriaid_EndpointCriteria_Fast, + + /// + eEndpointCriteriaid_EndpointCriteria_UserDefined, + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class ArrayOfPHISFETCalPointData { + + private PHISFETCalPointData[] arrayOfPHISFETCalPointData1Field; + + /// + [System.Xml.Serialization.XmlElementAttribute("ArrayOfPHISFETCalPointData", IsNullable=true)] + public PHISFETCalPointData[] ArrayOfPHISFETCalPointData1 { + get { + return this.arrayOfPHISFETCalPointData1Field; + } + set { + this.arrayOfPHISFETCalPointData1Field = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class ArrayOfPHISFETSensorCalRecord { + + private PHISFETSensorCalRecord[] arrayOfPHISFETSensorCalRecord1Field; + + /// + [System.Xml.Serialization.XmlElementAttribute("ArrayOfPHISFETSensorCalRecord", IsNullable=true)] + public PHISFETSensorCalRecord[] ArrayOfPHISFETSensorCalRecord1 { + get { + return this.arrayOfPHISFETSensorCalRecord1Field; + } + set { + this.arrayOfPHISFETSensorCalRecord1Field = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class ISFETSensorRecord { + + private string m_uuidField; + + private string m_sensorSerialNumberField; + + private string m_sensorIDField; + + private ESensorClass m_sensorClassField; + + private System.DateTime m_initialOperationDateField; + + private bool m_isObservedField; + + private int numberOfEntriesField; + + private bool m_monitorLifeSpanField; + + private short m_lifeSpanField; + + private System.DateTime m_expiryDateLifeSpanField; + + private bool m_monitorUsableLifeField; + + private System.DateTime m_expiryDateUsableLifeField; + + private ETimeUnit m_usableLifeTimePeriodField; + + private int m_usableLifeField; + + private PHISFETSensorCalRecord[] m_sensorCalHistoryField; + + /// + public string m_uuid { + get { + return this.m_uuidField; + } + set { + this.m_uuidField = value; + } + } + + /// + public string m_sensorSerialNumber { + get { + return this.m_sensorSerialNumberField; + } + set { + this.m_sensorSerialNumberField = value; + } + } + + /// + public string m_sensorID { + get { + return this.m_sensorIDField; + } + set { + this.m_sensorIDField = value; + } + } + + /// + public ESensorClass m_sensorClass { + get { + return this.m_sensorClassField; + } + set { + this.m_sensorClassField = value; + } + } + + /// + public System.DateTime m_initialOperationDate { + get { + return this.m_initialOperationDateField; + } + set { + this.m_initialOperationDateField = value; + } + } + + /// + public bool m_isObserved { + get { + return this.m_isObservedField; + } + set { + this.m_isObservedField = value; + } + } + + /// + public int numberOfEntries { + get { + return this.numberOfEntriesField; + } + set { + this.numberOfEntriesField = value; + } + } + + /// + public bool m_monitorLifeSpan { + get { + return this.m_monitorLifeSpanField; + } + set { + this.m_monitorLifeSpanField = value; + } + } + + /// + public short m_lifeSpan { + get { + return this.m_lifeSpanField; + } + set { + this.m_lifeSpanField = value; + } + } + + /// + public System.DateTime m_expiryDateLifeSpan { + get { + return this.m_expiryDateLifeSpanField; + } + set { + this.m_expiryDateLifeSpanField = value; + } + } + + /// + public bool m_monitorUsableLife { + get { + return this.m_monitorUsableLifeField; + } + set { + this.m_monitorUsableLifeField = value; + } + } + + /// + public System.DateTime m_expiryDateUsableLife { + get { + return this.m_expiryDateUsableLifeField; + } + set { + this.m_expiryDateUsableLifeField = value; + } + } + + /// + public ETimeUnit m_usableLifeTimePeriod { + get { + return this.m_usableLifeTimePeriodField; + } + set { + this.m_usableLifeTimePeriodField = value; + } + } + + /// + public int m_usableLife { + get { + return this.m_usableLifeField; + } + set { + this.m_usableLifeField = value; + } + } + + /// + [System.Xml.Serialization.XmlArrayItemAttribute("ArrayOfPHISFETSensorCalRecord")] + public PHISFETSensorCalRecord[] m_sensorCalHistory { + get { + return this.m_sensorCalHistoryField; + } + set { + this.m_sensorCalHistoryField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class ISESensorRecord { + + private string m_uuidField; + + private string m_sensorSerialNumberField; + + private string m_sensorIDField; + + private ESensorClass m_sensorClassField; + + private System.DateTime m_initialOperationDateField; + + private bool m_isObservedField; + + private int numberOfEntriesField; + + private bool m_monitorLifeSpanField; + + private short m_lifeSpanField; + + private System.DateTime m_expiryDateLifeSpanField; + + private bool m_monitorUsableLifeField; + + private System.DateTime m_expiryDateUsableLifeField; + + private ETimeUnit m_usableLifeTimePeriodField; + + private int m_usableLifeField; + + private EIonType m_ionTypeField; + + private decfloat m_molarMassField; + + private EIonCharge m_ionChargeField; + + private ISESensorCalRecord[] m_sensorCalHistoryField; + + /// + public string m_uuid { + get { + return this.m_uuidField; + } + set { + this.m_uuidField = value; + } + } + + /// + public string m_sensorSerialNumber { + get { + return this.m_sensorSerialNumberField; + } + set { + this.m_sensorSerialNumberField = value; + } + } + + /// + public string m_sensorID { + get { + return this.m_sensorIDField; + } + set { + this.m_sensorIDField = value; + } + } + + /// + public ESensorClass m_sensorClass { + get { + return this.m_sensorClassField; + } + set { + this.m_sensorClassField = value; + } + } + + /// + public System.DateTime m_initialOperationDate { + get { + return this.m_initialOperationDateField; + } + set { + this.m_initialOperationDateField = value; + } + } + + /// + public bool m_isObserved { + get { + return this.m_isObservedField; + } + set { + this.m_isObservedField = value; + } + } + + /// + public int numberOfEntries { + get { + return this.numberOfEntriesField; + } + set { + this.numberOfEntriesField = value; + } + } + + /// + public bool m_monitorLifeSpan { + get { + return this.m_monitorLifeSpanField; + } + set { + this.m_monitorLifeSpanField = value; + } + } + + /// + public short m_lifeSpan { + get { + return this.m_lifeSpanField; + } + set { + this.m_lifeSpanField = value; + } + } + + /// + public System.DateTime m_expiryDateLifeSpan { + get { + return this.m_expiryDateLifeSpanField; + } + set { + this.m_expiryDateLifeSpanField = value; + } + } + + /// + public bool m_monitorUsableLife { + get { + return this.m_monitorUsableLifeField; + } + set { + this.m_monitorUsableLifeField = value; + } + } + + /// + public System.DateTime m_expiryDateUsableLife { + get { + return this.m_expiryDateUsableLifeField; + } + set { + this.m_expiryDateUsableLifeField = value; + } + } + + /// + public ETimeUnit m_usableLifeTimePeriod { + get { + return this.m_usableLifeTimePeriodField; + } + set { + this.m_usableLifeTimePeriodField = value; + } + } + + /// + public int m_usableLife { + get { + return this.m_usableLifeField; + } + set { + this.m_usableLifeField = value; + } + } + + /// + public EIonType m_ionType { + get { + return this.m_ionTypeField; + } + set { + this.m_ionTypeField = value; + } + } + + /// + public decfloat m_molarMass { + get { + return this.m_molarMassField; + } + set { + this.m_molarMassField = value; + } + } + + /// + public EIonCharge m_ionCharge { + get { + return this.m_ionChargeField; + } + set { + this.m_ionChargeField = value; + } + } + + /// + [System.Xml.Serialization.XmlArrayItemAttribute("ArrayOfISESensorCalRecord")] + public ISESensorCalRecord[] m_sensorCalHistory { + get { + return this.m_sensorCalHistoryField; + } + set { + this.m_sensorCalHistoryField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + public enum EIonType { + + /// + eIonTypeid_IonType_Ag, + + /// + eIonTypeid_IonType_Ca, + + /// + eIonTypeid_IonType_Cl, + + /// + eIonTypeid_IonType_CN, + + /// + eIonTypeid_IonType_Cu, + + /// + eIonTypeid_IonType_F, + + /// + eIonTypeid_IonType_I, + + /// + eIonTypeid_IonType_K, + + /// + eIonTypeid_IonType_Na, + + /// + eIonTypeid_IonType_NO, + + /// + eIonTypeid_IonType_Pb, + + /// + eIonTypeid_IonType_S, + + /// + eIonTypeid_IonType_Other, + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + public enum EIonCharge { + + /// + eIonChargeid_IonCharge_Minus3, + + /// + eIonChargeid_IonCharge_Minus2, + + /// + eIonChargeid_IonCharge_Minus1, + + /// + eIonChargeid_IonCharge_Plus1, + + /// + eIonChargeid_IonCharge_Plus2, + + /// + eIonChargeid_IonCharge_Plus3, + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class ISESensorCalRecord { + + private ECommonUnit m_calUnitField; + + private string m_moduleSerialNumberField; + + private ETemperatureCapture m_tempCaptureField; + + private string m_tempSensorIDField; + + private ECalMode m_calModeField; + + private decfloat m_defaultSlopeField; + + private decfloat m_bufstdRefTempField; + + private EEndpointType m_endpointTypeField; + + private EEndpointCriteria m_endpointCriteriaField; + + private int m_timedEndpointValueField; + + private string m_calProcedureField; + + private System.DateTime m_calDateField; + + private string m_calCreatorField; + + private ISECalPointData[] m_sensorCalPointsField; + + /// + public ECommonUnit m_calUnit { + get { + return this.m_calUnitField; + } + set { + this.m_calUnitField = value; + } + } + + /// + public string m_moduleSerialNumber { + get { + return this.m_moduleSerialNumberField; + } + set { + this.m_moduleSerialNumberField = value; + } + } + + /// + public ETemperatureCapture m_tempCapture { + get { + return this.m_tempCaptureField; + } + set { + this.m_tempCaptureField = value; + } + } + + /// + public string m_tempSensorID { + get { + return this.m_tempSensorIDField; + } + set { + this.m_tempSensorIDField = value; + } + } + + /// + public ECalMode m_calMode { + get { + return this.m_calModeField; + } + set { + this.m_calModeField = value; + } + } + + /// + public decfloat m_defaultSlope { + get { + return this.m_defaultSlopeField; + } + set { + this.m_defaultSlopeField = value; + } + } + + /// + public decfloat m_bufstdRefTemp { + get { + return this.m_bufstdRefTempField; + } + set { + this.m_bufstdRefTempField = value; + } + } + + /// + public EEndpointType m_endpointType { + get { + return this.m_endpointTypeField; + } + set { + this.m_endpointTypeField = value; + } + } + + /// + public EEndpointCriteria m_endpointCriteria { + get { + return this.m_endpointCriteriaField; + } + set { + this.m_endpointCriteriaField = value; + } + } + + /// + public int m_timedEndpointValue { + get { + return this.m_timedEndpointValueField; + } + set { + this.m_timedEndpointValueField = value; + } + } + + /// + public string m_calProcedure { + get { + return this.m_calProcedureField; + } + set { + this.m_calProcedureField = value; + } + } + + /// + public System.DateTime m_calDate { + get { + return this.m_calDateField; + } + set { + this.m_calDateField = value; + } + } + + /// + public string m_calCreator { + get { + return this.m_calCreatorField; + } + set { + this.m_calCreatorField = value; + } + } + + /// + [System.Xml.Serialization.XmlArrayItemAttribute("ArrayOfISECalPointData")] + public ISECalPointData[] m_sensorCalPoints { + get { + return this.m_sensorCalPointsField; + } + set { + this.m_sensorCalPointsField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class ArrayOfISECalPointData { + + private ISECalPointData[] arrayOfISECalPointData1Field; + + /// + [System.Xml.Serialization.XmlElementAttribute("ArrayOfISECalPointData", IsNullable=true)] + public ISECalPointData[] ArrayOfISECalPointData1 { + get { + return this.arrayOfISECalPointData1Field; + } + set { + this.arrayOfISECalPointData1Field = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class ArrayOfISESensorCalRecord { + + private ISESensorCalRecord[] arrayOfISESensorCalRecord1Field; + + /// + [System.Xml.Serialization.XmlElementAttribute("ArrayOfISESensorCalRecord", IsNullable=true)] + public ISESensorCalRecord[] ArrayOfISESensorCalRecord1 { + get { + return this.arrayOfISESensorCalRecord1Field; + } + set { + this.arrayOfISESensorCalRecord1Field = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class CondSensorRecord { + + private string m_uuidField; + + private string m_sensorSerialNumberField; + + private string m_sensorIDField; + + private ESensorClass m_sensorClassField; + + private System.DateTime m_initialOperationDateField; + + private bool m_isObservedField; + + private decfloat m_def_cellconstantField; + + private int numberOfEntriesField; + + private bool m_monitorLifeSpanField; + + private short m_lifeSpanField; + + private System.DateTime m_expiryDateLifeSpanField; + + private bool m_monitorUsableLifeField; + + private System.DateTime m_expiryDateUsableLifeField; + + private ETimeUnit m_usableLifeTimePeriodField; + + private int m_usableLifeField; + + private CondSensorCalRecord[] m_sensorCalHistoryField; + + /// + public string m_uuid { + get { + return this.m_uuidField; + } + set { + this.m_uuidField = value; + } + } + + /// + public string m_sensorSerialNumber { + get { + return this.m_sensorSerialNumberField; + } + set { + this.m_sensorSerialNumberField = value; + } + } + + /// + public string m_sensorID { + get { + return this.m_sensorIDField; + } + set { + this.m_sensorIDField = value; + } + } + + /// + public ESensorClass m_sensorClass { + get { + return this.m_sensorClassField; + } + set { + this.m_sensorClassField = value; + } + } + + /// + public System.DateTime m_initialOperationDate { + get { + return this.m_initialOperationDateField; + } + set { + this.m_initialOperationDateField = value; + } + } + + /// + public bool m_isObserved { + get { + return this.m_isObservedField; + } + set { + this.m_isObservedField = value; + } + } + + /// + public decfloat m_def_cellconstant { + get { + return this.m_def_cellconstantField; + } + set { + this.m_def_cellconstantField = value; + } + } + + /// + public int numberOfEntries { + get { + return this.numberOfEntriesField; + } + set { + this.numberOfEntriesField = value; + } + } + + /// + public bool m_monitorLifeSpan { + get { + return this.m_monitorLifeSpanField; + } + set { + this.m_monitorLifeSpanField = value; + } + } + + /// + public short m_lifeSpan { + get { + return this.m_lifeSpanField; + } + set { + this.m_lifeSpanField = value; + } + } + + /// + public System.DateTime m_expiryDateLifeSpan { + get { + return this.m_expiryDateLifeSpanField; + } + set { + this.m_expiryDateLifeSpanField = value; + } + } + + /// + public bool m_monitorUsableLife { + get { + return this.m_monitorUsableLifeField; + } + set { + this.m_monitorUsableLifeField = value; + } + } + + /// + public System.DateTime m_expiryDateUsableLife { + get { + return this.m_expiryDateUsableLifeField; + } + set { + this.m_expiryDateUsableLifeField = value; + } + } + + /// + public ETimeUnit m_usableLifeTimePeriod { + get { + return this.m_usableLifeTimePeriodField; + } + set { + this.m_usableLifeTimePeriodField = value; + } + } + + /// + public int m_usableLife { + get { + return this.m_usableLifeField; + } + set { + this.m_usableLifeField = value; + } + } + + /// + [System.Xml.Serialization.XmlArrayItemAttribute("ArrayOfCondSensorCalRecord")] + public CondSensorCalRecord[] m_sensorCalHistory { + get { + return this.m_sensorCalHistoryField; + } + set { + this.m_sensorCalHistoryField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class CondSensorCalRecord { + + private string m_moduleSerialNumberField; + + private ETemperatureCapture m_tempCaptureField; + + private string m_tempSensorIDField; + + private EEndpointType m_endpointTypeField; + + private EEndpointCriteria m_endpointCriteriaField; + + private int m_timedEndpointValueField; + + private decfloat m_bufstdRefTempField; + + private short m_cndStdClassField; + + private string m_calProcedureField; + + private System.DateTime m_calDateField; + + private string m_calCreatorField; + + private CondCalPointData[] m_sensorCalPointsField; + + /// + public string m_moduleSerialNumber { + get { + return this.m_moduleSerialNumberField; + } + set { + this.m_moduleSerialNumberField = value; + } + } + + /// + public ETemperatureCapture m_tempCapture { + get { + return this.m_tempCaptureField; + } + set { + this.m_tempCaptureField = value; + } + } + + /// + public string m_tempSensorID { + get { + return this.m_tempSensorIDField; + } + set { + this.m_tempSensorIDField = value; + } + } + + /// + public EEndpointType m_endpointType { + get { + return this.m_endpointTypeField; + } + set { + this.m_endpointTypeField = value; + } + } + + /// + public EEndpointCriteria m_endpointCriteria { + get { + return this.m_endpointCriteriaField; + } + set { + this.m_endpointCriteriaField = value; + } + } + + /// + public int m_timedEndpointValue { + get { + return this.m_timedEndpointValueField; + } + set { + this.m_timedEndpointValueField = value; + } + } + + /// + public decfloat m_bufstdRefTemp { + get { + return this.m_bufstdRefTempField; + } + set { + this.m_bufstdRefTempField = value; + } + } + + /// + public short m_cndStdClass { + get { + return this.m_cndStdClassField; + } + set { + this.m_cndStdClassField = value; + } + } + + /// + public string m_calProcedure { + get { + return this.m_calProcedureField; + } + set { + this.m_calProcedureField = value; + } + } + + /// + public System.DateTime m_calDate { + get { + return this.m_calDateField; + } + set { + this.m_calDateField = value; + } + } + + /// + public string m_calCreator { + get { + return this.m_calCreatorField; + } + set { + this.m_calCreatorField = value; + } + } + + /// + [System.Xml.Serialization.XmlArrayItemAttribute("ArrayOfCondCalPointData")] + public CondCalPointData[] m_sensorCalPoints { + get { + return this.m_sensorCalPointsField; + } + set { + this.m_sensorCalPointsField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class ArrayOfCondCalPointData { + + private CondCalPointData[] arrayOfCondCalPointData1Field; + + /// + [System.Xml.Serialization.XmlElementAttribute("ArrayOfCondCalPointData", IsNullable=true)] + public CondCalPointData[] ArrayOfCondCalPointData1 { + get { + return this.arrayOfCondCalPointData1Field; + } + set { + this.arrayOfCondCalPointData1Field = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class ArrayOfCondSensorCalRecord { + + private CondSensorCalRecord[] arrayOfCondSensorCalRecord1Field; + + /// + [System.Xml.Serialization.XmlElementAttribute("ArrayOfCondSensorCalRecord", IsNullable=true)] + public CondSensorCalRecord[] ArrayOfCondSensorCalRecord1 { + get { + return this.arrayOfCondSensorCalRecord1Field; + } + set { + this.arrayOfCondSensorCalRecord1Field = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class DOSensorRecord { + + private string m_uuidField; + + private string m_sensorSerialNumberField; + + private string m_sensorIDField; + + private ESensorClass m_sensorClassField; + + private bool m_monitorLifeSpanField; + + private System.DateTime m_initialOperationDateField; + + private decfloat m_def_slopePercentField; + + private decfloat m_def_offsetField; + + private bool m_isObservedField; + + private int numberOfEntriesField; + + private short m_lifeSpanField; + + private System.DateTime m_expiryDateLifeSpanField; + + private bool m_monitorUsableLifeField; + + private System.DateTime m_expiryDateUsableLifeField; + + private ETimeUnit m_usableLifeTimePeriodField; + + private int m_usableLifeField; + + private int m_capLeftDaysField; + + private DOSensorCalRecord[] m_sensorCalHistoryField; + + /// + public string m_uuid { + get { + return this.m_uuidField; + } + set { + this.m_uuidField = value; + } + } + + /// + public string m_sensorSerialNumber { + get { + return this.m_sensorSerialNumberField; + } + set { + this.m_sensorSerialNumberField = value; + } + } + + /// + public string m_sensorID { + get { + return this.m_sensorIDField; + } + set { + this.m_sensorIDField = value; + } + } + + /// + public ESensorClass m_sensorClass { + get { + return this.m_sensorClassField; + } + set { + this.m_sensorClassField = value; + } + } + + /// + public bool m_monitorLifeSpan { + get { + return this.m_monitorLifeSpanField; + } + set { + this.m_monitorLifeSpanField = value; + } + } + + /// + public System.DateTime m_initialOperationDate { + get { + return this.m_initialOperationDateField; + } + set { + this.m_initialOperationDateField = value; + } + } + + /// + public decfloat m_def_slopePercent { + get { + return this.m_def_slopePercentField; + } + set { + this.m_def_slopePercentField = value; + } + } + + /// + public decfloat m_def_offset { + get { + return this.m_def_offsetField; + } + set { + this.m_def_offsetField = value; + } + } + + /// + public bool m_isObserved { + get { + return this.m_isObservedField; + } + set { + this.m_isObservedField = value; + } + } + + /// + public int numberOfEntries { + get { + return this.numberOfEntriesField; + } + set { + this.numberOfEntriesField = value; + } + } + + /// + public short m_lifeSpan { + get { + return this.m_lifeSpanField; + } + set { + this.m_lifeSpanField = value; + } + } + + /// + public System.DateTime m_expiryDateLifeSpan { + get { + return this.m_expiryDateLifeSpanField; + } + set { + this.m_expiryDateLifeSpanField = value; + } + } + + /// + public bool m_monitorUsableLife { + get { + return this.m_monitorUsableLifeField; + } + set { + this.m_monitorUsableLifeField = value; + } + } + + /// + public System.DateTime m_expiryDateUsableLife { + get { + return this.m_expiryDateUsableLifeField; + } + set { + this.m_expiryDateUsableLifeField = value; + } + } + + /// + public ETimeUnit m_usableLifeTimePeriod { + get { + return this.m_usableLifeTimePeriodField; + } + set { + this.m_usableLifeTimePeriodField = value; + } + } + + /// + public int m_usableLife { + get { + return this.m_usableLifeField; + } + set { + this.m_usableLifeField = value; + } + } + + /// + public int m_capLeftDays { + get { + return this.m_capLeftDaysField; + } + set { + this.m_capLeftDaysField = value; + } + } + + /// + [System.Xml.Serialization.XmlArrayItemAttribute("ArrayOfDOSensorCalRecord")] + public DOSensorCalRecord[] m_sensorCalHistory { + get { + return this.m_sensorCalHistoryField; + } + set { + this.m_sensorCalHistoryField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class DOSensorCalRecord { + + private string m_moduleSerialNumberField; + + private ETemperatureCapture m_tempCaptureField; + + private string m_tempSensorIDField; + + private EBarometricCapture m_barCaptureField; + + private decfloat m_salCorrectionFactorField; + + private decfloat m_slopePercentField; + + private decfloat m_offsetField; + + private EEndpointType m_endpointTypeField; + + private EEndpointCriteria m_endpointCriteriaField; + + private int m_timedEndpointValueField; + + private string m_calProcedureField; + + private System.DateTime m_calDateField; + + private string m_calCreatorField; + + private DOCalPointData[] m_sensorCalPointsField; + + /// + public string m_moduleSerialNumber { + get { + return this.m_moduleSerialNumberField; + } + set { + this.m_moduleSerialNumberField = value; + } + } + + /// + public ETemperatureCapture m_tempCapture { + get { + return this.m_tempCaptureField; + } + set { + this.m_tempCaptureField = value; + } + } + + /// + public string m_tempSensorID { + get { + return this.m_tempSensorIDField; + } + set { + this.m_tempSensorIDField = value; + } + } + + /// + public EBarometricCapture m_barCapture { + get { + return this.m_barCaptureField; + } + set { + this.m_barCaptureField = value; + } + } + + /// + public decfloat m_salCorrectionFactor { + get { + return this.m_salCorrectionFactorField; + } + set { + this.m_salCorrectionFactorField = value; + } + } + + /// + public decfloat m_slopePercent { + get { + return this.m_slopePercentField; + } + set { + this.m_slopePercentField = value; + } + } + + /// + public decfloat m_offset { + get { + return this.m_offsetField; + } + set { + this.m_offsetField = value; + } + } + + /// + public EEndpointType m_endpointType { + get { + return this.m_endpointTypeField; + } + set { + this.m_endpointTypeField = value; + } + } + + /// + public EEndpointCriteria m_endpointCriteria { + get { + return this.m_endpointCriteriaField; + } + set { + this.m_endpointCriteriaField = value; + } + } + + /// + public int m_timedEndpointValue { + get { + return this.m_timedEndpointValueField; + } + set { + this.m_timedEndpointValueField = value; + } + } + + /// + public string m_calProcedure { + get { + return this.m_calProcedureField; + } + set { + this.m_calProcedureField = value; + } + } + + /// + public System.DateTime m_calDate { + get { + return this.m_calDateField; + } + set { + this.m_calDateField = value; + } + } + + /// + public string m_calCreator { + get { + return this.m_calCreatorField; + } + set { + this.m_calCreatorField = value; + } + } + + /// + [System.Xml.Serialization.XmlArrayItemAttribute("ArrayOfDOCalPointData")] + public DOCalPointData[] m_sensorCalPoints { + get { + return this.m_sensorCalPointsField; + } + set { + this.m_sensorCalPointsField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + public enum EBarometricCapture { + + /// + eBarometricCaptureid_BarometricCapture_Auto, + + /// + eBarometricCaptureid_BarometricCapture_Manual, + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class ArrayOfDOCalPointData { + + private DOCalPointData[] arrayOfDOCalPointData1Field; + + /// + [System.Xml.Serialization.XmlElementAttribute("ArrayOfDOCalPointData", IsNullable=true)] + public DOCalPointData[] ArrayOfDOCalPointData1 { + get { + return this.arrayOfDOCalPointData1Field; + } + set { + this.arrayOfDOCalPointData1Field = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class ArrayOfDOSensorCalRecord { + + private DOSensorCalRecord[] arrayOfDOSensorCalRecord1Field; + + /// + [System.Xml.Serialization.XmlElementAttribute("ArrayOfDOSensorCalRecord", IsNullable=true)] + public DOSensorCalRecord[] ArrayOfDOSensorCalRecord1 { + get { + return this.arrayOfDOSensorCalRecord1Field; + } + set { + this.arrayOfDOSensorCalRecord1Field = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class TempSensorRecord { + + private string m_uuidField; + + private string m_sensorSerialNumberField; + + private string m_sensorIDField; + + private ETempSignalType m_tempSignalField; + + private ESensorClass m_sensorClassField; + + private System.DateTime m_initialOperationDateField; + + private bool m_isObservedField; + + private int numberOfEntriesField; + + private bool m_monitorLifeSpanField; + + private short m_lifeSpanField; + + private System.DateTime m_expiryDateLifeSpanField; + + private bool m_monitorUsableLifeField; + + private System.DateTime m_expiryDateUsableLifeField; + + private ETimeUnit m_usableLifeTimePeriodField; + + private int m_usableLifeField; + + private TempSensorCalRecord[] m_sensorCalHistoryField; + + /// + public string m_uuid { + get { + return this.m_uuidField; + } + set { + this.m_uuidField = value; + } + } + + /// + public string m_sensorSerialNumber { + get { + return this.m_sensorSerialNumberField; + } + set { + this.m_sensorSerialNumberField = value; + } + } + + /// + public string m_sensorID { + get { + return this.m_sensorIDField; + } + set { + this.m_sensorIDField = value; + } + } + + /// + public ETempSignalType m_tempSignal { + get { + return this.m_tempSignalField; + } + set { + this.m_tempSignalField = value; + } + } + + /// + public ESensorClass m_sensorClass { + get { + return this.m_sensorClassField; + } + set { + this.m_sensorClassField = value; + } + } + + /// + public System.DateTime m_initialOperationDate { + get { + return this.m_initialOperationDateField; + } + set { + this.m_initialOperationDateField = value; + } + } + + /// + public bool m_isObserved { + get { + return this.m_isObservedField; + } + set { + this.m_isObservedField = value; + } + } + + /// + public int numberOfEntries { + get { + return this.numberOfEntriesField; + } + set { + this.numberOfEntriesField = value; + } + } + + /// + public bool m_monitorLifeSpan { + get { + return this.m_monitorLifeSpanField; + } + set { + this.m_monitorLifeSpanField = value; + } + } + + /// + public short m_lifeSpan { + get { + return this.m_lifeSpanField; + } + set { + this.m_lifeSpanField = value; + } + } + + /// + public System.DateTime m_expiryDateLifeSpan { + get { + return this.m_expiryDateLifeSpanField; + } + set { + this.m_expiryDateLifeSpanField = value; + } + } + + /// + public bool m_monitorUsableLife { + get { + return this.m_monitorUsableLifeField; + } + set { + this.m_monitorUsableLifeField = value; + } + } + + /// + public System.DateTime m_expiryDateUsableLife { + get { + return this.m_expiryDateUsableLifeField; + } + set { + this.m_expiryDateUsableLifeField = value; + } + } + + /// + public ETimeUnit m_usableLifeTimePeriod { + get { + return this.m_usableLifeTimePeriodField; + } + set { + this.m_usableLifeTimePeriodField = value; + } + } + + /// + public int m_usableLife { + get { + return this.m_usableLifeField; + } + set { + this.m_usableLifeField = value; + } + } + + /// + [System.Xml.Serialization.XmlArrayItemAttribute("ArrayOfTempSensorCalRecord")] + public TempSensorCalRecord[] m_sensorCalHistory { + get { + return this.m_sensorCalHistoryField; + } + set { + this.m_sensorCalHistoryField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + public enum ETempSignalType { + + /// + eTempSignalTypeid_TempSignalType_NTC30KOM, + + /// + eTempSignalTypeid_TempSignalType_PT1000, + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class TempSensorCalRecord { + + private string m_calProcedureField; + + private System.DateTime m_calDateField; + + private string m_calCreatorField; + + private TempCalPointData[] m_sensorCalPointsField; + + /// + public string m_calProcedure { + get { + return this.m_calProcedureField; + } + set { + this.m_calProcedureField = value; + } + } + + /// + public System.DateTime m_calDate { + get { + return this.m_calDateField; + } + set { + this.m_calDateField = value; + } + } + + /// + public string m_calCreator { + get { + return this.m_calCreatorField; + } + set { + this.m_calCreatorField = value; + } + } + + /// + [System.Xml.Serialization.XmlArrayItemAttribute("ArrayOfTempCalPointData")] + public TempCalPointData[] m_sensorCalPoints { + get { + return this.m_sensorCalPointsField; + } + set { + this.m_sensorCalPointsField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class TempCalPointData { + + private decfloat m_measuredValueField; + + private decfloat m_adjustedValueField; + + /// + public decfloat m_measuredValue { + get { + return this.m_measuredValueField; + } + set { + this.m_measuredValueField = value; + } + } + + /// + public decfloat m_adjustedValue { + get { + return this.m_adjustedValueField; + } + set { + this.m_adjustedValueField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class ArrayOfTempCalPointData { + + private TempCalPointData[] arrayOfTempCalPointData1Field; + + /// + [System.Xml.Serialization.XmlElementAttribute("ArrayOfTempCalPointData", IsNullable=true)] + public TempCalPointData[] ArrayOfTempCalPointData1 { + get { + return this.arrayOfTempCalPointData1Field; + } + set { + this.arrayOfTempCalPointData1Field = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class ArrayOfTempSensorCalRecord { + + private TempSensorCalRecord[] arrayOfTempSensorCalRecord1Field; + + /// + [System.Xml.Serialization.XmlElementAttribute("ArrayOfTempSensorCalRecord", IsNullable=true)] + public TempSensorCalRecord[] ArrayOfTempSensorCalRecord1 { + get { + return this.arrayOfTempSensorCalRecord1Field; + } + set { + this.arrayOfTempSensorCalRecord1Field = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class RedoxSensorRecord { + + private string m_uuidField; + + private string m_sensorSerialNumberField; + + private string m_sensorIDField; + + private ESensorClass m_sensorClassField; + + private System.DateTime m_initialOperationDateField; + + private bool m_isObservedField; + + private int numberOfEntriesField; + + private string resource_name_1Field; + + private bool m_monitorLifeSpanField; + + private short m_lifeSpanField; + + private System.DateTime m_expiryDateLifeSpanField; + + private string resource_name_2Field; + + private bool m_monitorUsableLifeField; + + private System.DateTime m_expiryDateUsableLifeField; + + private ETimeUnit m_usableLifeTimePeriodField; + + private int m_usableLifeField; + + /// + public string m_uuid { + get { + return this.m_uuidField; + } + set { + this.m_uuidField = value; + } + } + + /// + public string m_sensorSerialNumber { + get { + return this.m_sensorSerialNumberField; + } + set { + this.m_sensorSerialNumberField = value; + } + } + + /// + public string m_sensorID { + get { + return this.m_sensorIDField; + } + set { + this.m_sensorIDField = value; + } + } + + /// + public ESensorClass m_sensorClass { + get { + return this.m_sensorClassField; + } + set { + this.m_sensorClassField = value; + } + } + + /// + public System.DateTime m_initialOperationDate { + get { + return this.m_initialOperationDateField; + } + set { + this.m_initialOperationDateField = value; + } + } + + /// + public bool m_isObserved { + get { + return this.m_isObservedField; + } + set { + this.m_isObservedField = value; + } + } + + /// + public int numberOfEntries { + get { + return this.numberOfEntriesField; + } + set { + this.numberOfEntriesField = value; + } + } + + /// + public string resource_name_1 { + get { + return this.resource_name_1Field; + } + set { + this.resource_name_1Field = value; + } + } + + /// + public bool m_monitorLifeSpan { + get { + return this.m_monitorLifeSpanField; + } + set { + this.m_monitorLifeSpanField = value; + } + } + + /// + public short m_lifeSpan { + get { + return this.m_lifeSpanField; + } + set { + this.m_lifeSpanField = value; + } + } + + /// + public System.DateTime m_expiryDateLifeSpan { + get { + return this.m_expiryDateLifeSpanField; + } + set { + this.m_expiryDateLifeSpanField = value; + } + } + + /// + public string resource_name_2 { + get { + return this.resource_name_2Field; + } + set { + this.resource_name_2Field = value; + } + } + + /// + public bool m_monitorUsableLife { + get { + return this.m_monitorUsableLifeField; + } + set { + this.m_monitorUsableLifeField = value; + } + } + + /// + public System.DateTime m_expiryDateUsableLife { + get { + return this.m_expiryDateUsableLifeField; + } + set { + this.m_expiryDateUsableLifeField = value; + } + } + + /// + public ETimeUnit m_usableLifeTimePeriod { + get { + return this.m_usableLifeTimePeriodField; + } + set { + this.m_usableLifeTimePeriodField = value; + } + } + + /// + public int m_usableLife { + get { + return this.m_usableLifeField; + } + set { + this.m_usableLifeField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class SensorAdjustParaHistory { + + private SensorAdjustParameters[] adjustParaHistoryField; + + /// + [System.Xml.Serialization.XmlArrayItemAttribute("ArrayOfSensorAdjustParameters")] + public SensorAdjustParameters[] adjustParaHistory { + get { + return this.adjustParaHistoryField; + } + set { + this.adjustParaHistoryField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class SensorAdjustParameters { + + private SensorAdjustParameter[] adjustParametersField; + + /// + [System.Xml.Serialization.XmlArrayItemAttribute("ArrayOfSensorAdjustParameter")] + public SensorAdjustParameter[] adjustParameters { + get { + return this.adjustParametersField; + } + set { + this.adjustParametersField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class ArrayOfSensorAdjustParameter { + + private SensorAdjustParameter[] arrayOfSensorAdjustParameter1Field; + + /// + [System.Xml.Serialization.XmlElementAttribute("ArrayOfSensorAdjustParameter", IsNullable=true)] + public SensorAdjustParameter[] ArrayOfSensorAdjustParameter1 { + get { + return this.arrayOfSensorAdjustParameter1Field; + } + set { + this.arrayOfSensorAdjustParameter1Field = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class ArrayOfSensorAdjustParameters { + + private SensorAdjustParameters[] arrayOfSensorAdjustParameters1Field; + + /// + [System.Xml.Serialization.XmlElementAttribute("ArrayOfSensorAdjustParameters", IsNullable=true)] + public SensorAdjustParameters[] ArrayOfSensorAdjustParameters1 { + get { + return this.arrayOfSensorAdjustParameters1Field; + } + set { + this.arrayOfSensorAdjustParameters1Field = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class BasicSensorInfoForMeasure { + + private ESensorType sensorTypeField; + + private string sensorUuidField; + + private string sensorIDField; + + private ESensorClass sensorClassField; + + private System.DateTime calDateField; + + private string calCreatorField; + + /// + public ESensorType sensorType { + get { + return this.sensorTypeField; + } + set { + this.sensorTypeField = value; + } + } + + /// + public string sensorUuid { + get { + return this.sensorUuidField; + } + set { + this.sensorUuidField = value; + } + } + + /// + public string sensorID { + get { + return this.sensorIDField; + } + set { + this.sensorIDField = value; + } + } + + /// + public ESensorClass sensorClass { + get { + return this.sensorClassField; + } + set { + this.sensorClassField = value; + } + } + + /// + public System.DateTime calDate { + get { + return this.calDateField; + } + set { + this.calDateField = value; + } + } + + /// + public string calCreator { + get { + return this.calCreatorField; + } + set { + this.calCreatorField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + public enum ESensorType { + + /// + eSensorTypeid_SensorType_PH, + + /// + eSensorTypeid_SensorType_Redox, + + /// + eSensorTypeid_SensorType_ISFET, + + /// + eSensorTypeid_SensorType_Cond, + + /// + eSensorTypeid_SensorType_ISE, + + /// + eSensorTypeid_SensorType_DO, + + /// + eSensorTypeid_SensorType_Temp, + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class PHSensorRecordUnits { + + private ECommonUnit slopeUnitField; + + private ECommonUnit slopePercentUnitField; + + private ECommonUnit offsetUnitField; + + private ECommonUnit bufRefTempUnitField; + + private ECommonUnit timedEndpointValueUnitField; + + private ECommonUnit bufferUnitField; + + private ECommonUnit actualValueUnitField; + + private ECommonUnit rawValueUnitField; + + private ECommonUnit temperatureUnitField; + + /// + public ECommonUnit slopeUnit { + get { + return this.slopeUnitField; + } + set { + this.slopeUnitField = value; + } + } + + /// + public ECommonUnit slopePercentUnit { + get { + return this.slopePercentUnitField; + } + set { + this.slopePercentUnitField = value; + } + } + + /// + public ECommonUnit offsetUnit { + get { + return this.offsetUnitField; + } + set { + this.offsetUnitField = value; + } + } + + /// + public ECommonUnit bufRefTempUnit { + get { + return this.bufRefTempUnitField; + } + set { + this.bufRefTempUnitField = value; + } + } + + /// + public ECommonUnit timedEndpointValueUnit { + get { + return this.timedEndpointValueUnitField; + } + set { + this.timedEndpointValueUnitField = value; + } + } + + /// + public ECommonUnit bufferUnit { + get { + return this.bufferUnitField; + } + set { + this.bufferUnitField = value; + } + } + + /// + public ECommonUnit actualValueUnit { + get { + return this.actualValueUnitField; + } + set { + this.actualValueUnitField = value; + } + } + + /// + public ECommonUnit rawValueUnit { + get { + return this.rawValueUnitField; + } + set { + this.rawValueUnitField = value; + } + } + + /// + public ECommonUnit temperatureUnit { + get { + return this.temperatureUnitField; + } + set { + this.temperatureUnitField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class PHAnalogISMDataRecord { + + private PHSensorRecord sensorRecordField; + + private PHSensorRecordUnits sensorRecordUnitsField; + + private SensorAdjustParameters[] sensorAdjustParaHistoriesField; + + private string sensorDescriptionField; + + private string sensorPartNumField; + + private MTValue productSlopeField; + + private MTValue zeroPointField; + + private MTValue membraneResField; + + private MTValue responseTimeField; + + private MTValue tempToleranceField; + + private CommonISMStatistics commonStatisticsField; + + private EModuleID moduleIDField; + + /// + public PHSensorRecord sensorRecord { + get { + return this.sensorRecordField; + } + set { + this.sensorRecordField = value; + } + } + + /// + public PHSensorRecordUnits sensorRecordUnits { + get { + return this.sensorRecordUnitsField; + } + set { + this.sensorRecordUnitsField = value; + } + } + + /// + [System.Xml.Serialization.XmlArrayItemAttribute("ArrayOfSensorAdjustParameters")] + public SensorAdjustParameters[] sensorAdjustParaHistories { + get { + return this.sensorAdjustParaHistoriesField; + } + set { + this.sensorAdjustParaHistoriesField = value; + } + } + + /// + public string sensorDescription { + get { + return this.sensorDescriptionField; + } + set { + this.sensorDescriptionField = value; + } + } + + /// + public string sensorPartNum { + get { + return this.sensorPartNumField; + } + set { + this.sensorPartNumField = value; + } + } + + /// + public MTValue productSlope { + get { + return this.productSlopeField; + } + set { + this.productSlopeField = value; + } + } + + /// + public MTValue zeroPoint { + get { + return this.zeroPointField; + } + set { + this.zeroPointField = value; + } + } + + /// + public MTValue membraneRes { + get { + return this.membraneResField; + } + set { + this.membraneResField = value; + } + } + + /// + public MTValue responseTime { + get { + return this.responseTimeField; + } + set { + this.responseTimeField = value; + } + } + + /// + public MTValue tempTolerance { + get { + return this.tempToleranceField; + } + set { + this.tempToleranceField = value; + } + } + + /// + public CommonISMStatistics commonStatistics { + get { + return this.commonStatisticsField; + } + set { + this.commonStatisticsField = value; + } + } + + /// + public EModuleID moduleID { + get { + return this.moduleIDField; + } + set { + this.moduleIDField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class CommonISMStatistics { + + private MTValue maxTempValueField; + + private System.DateTime maxTempDateField; + + /// + public MTValue maxTempValue { + get { + return this.maxTempValueField; + } + set { + this.maxTempValueField = value; + } + } + + /// + public System.DateTime maxTempDate { + get { + return this.maxTempDateField; + } + set { + this.maxTempDateField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + public enum EModuleID { + + /// + eModuleIDid_ModuleID_ModuleA, + + /// + eModuleIDid_ModuleID_ModuleB, + + /// + eModuleIDid_ModuleID_ModuleC, + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class PHDigitalISMDataRecord { + + private PHSensorRecord sensorRecordField; + + private PHSensorRecordUnits sensorRecordUnitsField; + + private SensorAdjustParameters[] sensorAdjustParaHistoriesField; + + private PHDigitalISMStatistics statisticsField; + + private MTValue membraneResField; + + private MTValue diaphragmResField; + + private EModuleID moduleIDField; + + /// + public PHSensorRecord sensorRecord { + get { + return this.sensorRecordField; + } + set { + this.sensorRecordField = value; + } + } + + /// + public PHSensorRecordUnits sensorRecordUnits { + get { + return this.sensorRecordUnitsField; + } + set { + this.sensorRecordUnitsField = value; + } + } + + /// + [System.Xml.Serialization.XmlArrayItemAttribute("ArrayOfSensorAdjustParameters")] + public SensorAdjustParameters[] sensorAdjustParaHistories { + get { + return this.sensorAdjustParaHistoriesField; + } + set { + this.sensorAdjustParaHistoriesField = value; + } + } + + /// + public PHDigitalISMStatistics statistics { + get { + return this.statisticsField; + } + set { + this.statisticsField = value; + } + } + + /// + public MTValue membraneRes { + get { + return this.membraneResField; + } + set { + this.membraneResField = value; + } + } + + /// + public MTValue diaphragmRes { + get { + return this.diaphragmResField; + } + set { + this.diaphragmResField = value; + } + } + + /// + public EModuleID moduleID { + get { + return this.moduleIDField; + } + set { + this.moduleIDField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class PHDigitalISMStatistics { + + private CommonISMStatistics commonStatisticsField; + + private MTValue measurementTimeField; + + private MTValue averageTempField; + + private MTValue averagePHField; + + private MTValue maxPHValueField; + + private System.DateTime maxPHDateField; + + private MTValue minPHValueField; + + private System.DateTime minPHDateField; + + /// + public CommonISMStatistics commonStatistics { + get { + return this.commonStatisticsField; + } + set { + this.commonStatisticsField = value; + } + } + + /// + public MTValue measurementTime { + get { + return this.measurementTimeField; + } + set { + this.measurementTimeField = value; + } + } + + /// + public MTValue averageTemp { + get { + return this.averageTempField; + } + set { + this.averageTempField = value; + } + } + + /// + public MTValue averagePH { + get { + return this.averagePHField; + } + set { + this.averagePHField = value; + } + } + + /// + public MTValue maxPHValue { + get { + return this.maxPHValueField; + } + set { + this.maxPHValueField = value; + } + } + + /// + public System.DateTime maxPHDate { + get { + return this.maxPHDateField; + } + set { + this.maxPHDateField = value; + } + } + + /// + public MTValue minPHValue { + get { + return this.minPHValueField; + } + set { + this.minPHValueField = value; + } + } + + /// + public System.DateTime minPHDate { + get { + return this.minPHDateField; + } + set { + this.minPHDateField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class CondSensorRecordUnits { + + private ECommonUnit cellConstantUnitField; + + private ECommonUnit bufRefTempUnitField; + + private ECommonUnit timedEndpointValueUnitField; + + private ECommonUnit rawValueUnitField; + + private ECommonUnit temperatureUnitField; + + /// + public ECommonUnit cellConstantUnit { + get { + return this.cellConstantUnitField; + } + set { + this.cellConstantUnitField = value; + } + } + + /// + public ECommonUnit bufRefTempUnit { + get { + return this.bufRefTempUnitField; + } + set { + this.bufRefTempUnitField = value; + } + } + + /// + public ECommonUnit timedEndpointValueUnit { + get { + return this.timedEndpointValueUnitField; + } + set { + this.timedEndpointValueUnitField = value; + } + } + + /// + public ECommonUnit rawValueUnit { + get { + return this.rawValueUnitField; + } + set { + this.rawValueUnitField = value; + } + } + + /// + public ECommonUnit temperatureUnit { + get { + return this.temperatureUnitField; + } + set { + this.temperatureUnitField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class CondAnalogISMDataRecord { + + private CondSensorRecord sensorRecordField; + + private CondSensorRecordUnits sensorRecordUnitsField; + + private string sensorDescriptionField; + + private string sensorPartNumField; + + private MTValue cellConstantField; + + private MTValue ccToleranceField; + + private MTValue responseTimeField; + + private MTValue tempToleranceField; + + private CommonISMStatistics commonStatisticsField; + + private EModuleID moduleIDField; + + /// + public CondSensorRecord sensorRecord { + get { + return this.sensorRecordField; + } + set { + this.sensorRecordField = value; + } + } + + /// + public CondSensorRecordUnits sensorRecordUnits { + get { + return this.sensorRecordUnitsField; + } + set { + this.sensorRecordUnitsField = value; + } + } + + /// + public string sensorDescription { + get { + return this.sensorDescriptionField; + } + set { + this.sensorDescriptionField = value; + } + } + + /// + public string sensorPartNum { + get { + return this.sensorPartNumField; + } + set { + this.sensorPartNumField = value; + } + } + + /// + public MTValue cellConstant { + get { + return this.cellConstantField; + } + set { + this.cellConstantField = value; + } + } + + /// + public MTValue ccTolerance { + get { + return this.ccToleranceField; + } + set { + this.ccToleranceField = value; + } + } + + /// + public MTValue responseTime { + get { + return this.responseTimeField; + } + set { + this.responseTimeField = value; + } + } + + /// + public MTValue tempTolerance { + get { + return this.tempToleranceField; + } + set { + this.tempToleranceField = value; + } + } + + /// + public CommonISMStatistics commonStatistics { + get { + return this.commonStatisticsField; + } + set { + this.commonStatisticsField = value; + } + } + + /// + public EModuleID moduleID { + get { + return this.moduleIDField; + } + set { + this.moduleIDField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class CondDigitalISMDataRecord { + + private CondSensorRecord sensorRecordField; + + private CondSensorRecordUnits sensorRecordUnitsField; + + private CommonISMStatistics commonStatisticsField; + + private EModuleID moduleIDField; + + /// + public CondSensorRecord sensorRecord { + get { + return this.sensorRecordField; + } + set { + this.sensorRecordField = value; + } + } + + /// + public CondSensorRecordUnits sensorRecordUnits { + get { + return this.sensorRecordUnitsField; + } + set { + this.sensorRecordUnitsField = value; + } + } + + /// + public CommonISMStatistics commonStatistics { + get { + return this.commonStatisticsField; + } + set { + this.commonStatisticsField = value; + } + } + + /// + public EModuleID moduleID { + get { + return this.moduleIDField; + } + set { + this.moduleIDField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class DOSensorRecordUnits { + + private ECommonUnit slopeUnitField; + + private ECommonUnit slopePercentUnitField; + + private ECommonUnit offsetUnitField; + + private ECommonUnit bufRefTempUnitField; + + private ECommonUnit timedEndpointValueUnitField; + + private ECommonUnit rawValueUnitField; + + private ECommonUnit temperatureUnitField; + + private ECommonUnit pressureUnitField; + + /// + public ECommonUnit slopeUnit { + get { + return this.slopeUnitField; + } + set { + this.slopeUnitField = value; + } + } + + /// + public ECommonUnit slopePercentUnit { + get { + return this.slopePercentUnitField; + } + set { + this.slopePercentUnitField = value; + } + } + + /// + public ECommonUnit offsetUnit { + get { + return this.offsetUnitField; + } + set { + this.offsetUnitField = value; + } + } + + /// + public ECommonUnit bufRefTempUnit { + get { + return this.bufRefTempUnitField; + } + set { + this.bufRefTempUnitField = value; + } + } + + /// + public ECommonUnit timedEndpointValueUnit { + get { + return this.timedEndpointValueUnitField; + } + set { + this.timedEndpointValueUnitField = value; + } + } + + /// + public ECommonUnit rawValueUnit { + get { + return this.rawValueUnitField; + } + set { + this.rawValueUnitField = value; + } + } + + /// + public ECommonUnit temperatureUnit { + get { + return this.temperatureUnitField; + } + set { + this.temperatureUnitField = value; + } + } + + /// + public ECommonUnit pressureUnit { + get { + return this.pressureUnitField; + } + set { + this.pressureUnitField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class DOAnalogISMDataRecord { + + private DOSensorRecord sensorRecordField; + + private DOSensorRecordUnits sensorRecordUnitsField; + + private SensorAdjustParameters[] sensorAdjustParaHistoriesField; + + private string sensorDescriptionField; + + private string sensorPartNumField; + + private MTValue airCurrentField; + + private MTValue zeroCurrentField; + + private MTValue responseTimeField; + + private CommonISMStatistics commonStatisticsField; + + private System.DateTime oxygenMembraneDateField; + + private EModuleID moduleIDField; + + /// + public DOSensorRecord sensorRecord { + get { + return this.sensorRecordField; + } + set { + this.sensorRecordField = value; + } + } + + /// + public DOSensorRecordUnits sensorRecordUnits { + get { + return this.sensorRecordUnitsField; + } + set { + this.sensorRecordUnitsField = value; + } + } + + /// + [System.Xml.Serialization.XmlArrayItemAttribute("ArrayOfSensorAdjustParameters")] + public SensorAdjustParameters[] sensorAdjustParaHistories { + get { + return this.sensorAdjustParaHistoriesField; + } + set { + this.sensorAdjustParaHistoriesField = value; + } + } + + /// + public string sensorDescription { + get { + return this.sensorDescriptionField; + } + set { + this.sensorDescriptionField = value; + } + } + + /// + public string sensorPartNum { + get { + return this.sensorPartNumField; + } + set { + this.sensorPartNumField = value; + } + } + + /// + public MTValue airCurrent { + get { + return this.airCurrentField; + } + set { + this.airCurrentField = value; + } + } + + /// + public MTValue zeroCurrent { + get { + return this.zeroCurrentField; + } + set { + this.zeroCurrentField = value; + } + } + + /// + public MTValue responseTime { + get { + return this.responseTimeField; + } + set { + this.responseTimeField = value; + } + } + + /// + public CommonISMStatistics commonStatistics { + get { + return this.commonStatisticsField; + } + set { + this.commonStatisticsField = value; + } + } + + /// + public System.DateTime oxygenMembraneDate { + get { + return this.oxygenMembraneDateField; + } + set { + this.oxygenMembraneDateField = value; + } + } + + /// + public EModuleID moduleID { + get { + return this.moduleIDField; + } + set { + this.moduleIDField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class DODigitalISMDataRecord { + + private DOSensorRecord sensorRecordField; + + private DOSensorRecordUnits sensorRecordUnitsField; + + private SensorAdjustParameters[] sensorAdjustParaHistoriesField; + + private CommonISMStatistics commonStatisticsField; + + private System.DateTime sensorCapFirstUsedDateField; + + private System.DateTime sensorCapExpiryDateField; + + private EModuleID moduleIDField; + + /// + public DOSensorRecord sensorRecord { + get { + return this.sensorRecordField; + } + set { + this.sensorRecordField = value; + } + } + + /// + public DOSensorRecordUnits sensorRecordUnits { + get { + return this.sensorRecordUnitsField; + } + set { + this.sensorRecordUnitsField = value; + } + } + + /// + [System.Xml.Serialization.XmlArrayItemAttribute("ArrayOfSensorAdjustParameters")] + public SensorAdjustParameters[] sensorAdjustParaHistories { + get { + return this.sensorAdjustParaHistoriesField; + } + set { + this.sensorAdjustParaHistoriesField = value; + } + } + + /// + public CommonISMStatistics commonStatistics { + get { + return this.commonStatisticsField; + } + set { + this.commonStatisticsField = value; + } + } + + /// + public System.DateTime sensorCapFirstUsedDate { + get { + return this.sensorCapFirstUsedDateField; + } + set { + this.sensorCapFirstUsedDateField = value; + } + } + + /// + public System.DateTime sensorCapExpiryDate { + get { + return this.sensorCapExpiryDateField; + } + set { + this.sensorCapExpiryDateField = value; + } + } + + /// + public EModuleID moduleID { + get { + return this.moduleIDField; + } + set { + this.moduleIDField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class CommonISMEditableParameters { + + private string m_sensorIDField; + + private bool m_monitorLifeSpanField; + + private int m_lifeSpanField; + + private bool m_monitorUsableLifeField; + + private short m_usableLifeTimePeriodField; + + private int m_usableLifeField; + + private System.DateTime m_initialOperationDateField; + + /// + public string m_sensorID { + get { + return this.m_sensorIDField; + } + set { + this.m_sensorIDField = value; + } + } + + /// + public bool m_monitorLifeSpan { + get { + return this.m_monitorLifeSpanField; + } + set { + this.m_monitorLifeSpanField = value; + } + } + + /// + public int m_lifeSpan { + get { + return this.m_lifeSpanField; + } + set { + this.m_lifeSpanField = value; + } + } + + /// + public bool m_monitorUsableLife { + get { + return this.m_monitorUsableLifeField; + } + set { + this.m_monitorUsableLifeField = value; + } + } + + /// + public short m_usableLifeTimePeriod { + get { + return this.m_usableLifeTimePeriodField; + } + set { + this.m_usableLifeTimePeriodField = value; + } + } + + /// + public int m_usableLife { + get { + return this.m_usableLifeField; + } + set { + this.m_usableLifeField = value; + } + } + + /// + public System.DateTime m_initialOperationDate { + get { + return this.m_initialOperationDateField; + } + set { + this.m_initialOperationDateField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class CommonISMUpdateRecord { + + private string m_sensorUUIDField; + + private EModuleID m_moduleIDField; + + private CommonISMEditableParameters m_editedParametersField; + + /// + public string m_sensorUUID { + get { + return this.m_sensorUUIDField; + } + set { + this.m_sensorUUIDField = value; + } + } + + /// + public EModuleID m_moduleID { + get { + return this.m_moduleIDField; + } + set { + this.m_moduleIDField = value; + } + } + + /// + public CommonISMEditableParameters m_editedParameters { + get { + return this.m_editedParametersField; + } + set { + this.m_editedParametersField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class DOAnalogUpdateRecord { + + private CommonISMUpdateRecord m_commonParametersField; + + private System.DateTime oxygenMembraneDateField; + + /// + public CommonISMUpdateRecord m_commonParameters { + get { + return this.m_commonParametersField; + } + set { + this.m_commonParametersField = value; + } + } + + /// + public System.DateTime oxygenMembraneDate { + get { + return this.oxygenMembraneDateField; + } + set { + this.oxygenMembraneDateField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class PHSensorCalUpdateRecord { + + private string m_sensorUUIDField; + + private EModuleID moduleIDField; + + private PHISFETSensorCalRecord m_sensorCalRecordField; + + /// + public string m_sensorUUID { + get { + return this.m_sensorUUIDField; + } + set { + this.m_sensorUUIDField = value; + } + } + + /// + public EModuleID moduleID { + get { + return this.moduleIDField; + } + set { + this.moduleIDField = value; + } + } + + /// + public PHISFETSensorCalRecord m_sensorCalRecord { + get { + return this.m_sensorCalRecordField; + } + set { + this.m_sensorCalRecordField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class CondSensorCalUpdateRecord { + + private string m_sensorUUIDField; + + private EModuleID moduleIDField; + + private CondSensorCalRecord m_sensorCalRecordField; + + /// + public string m_sensorUUID { + get { + return this.m_sensorUUIDField; + } + set { + this.m_sensorUUIDField = value; + } + } + + /// + public EModuleID moduleID { + get { + return this.moduleIDField; + } + set { + this.moduleIDField = value; + } + } + + /// + public CondSensorCalRecord m_sensorCalRecord { + get { + return this.m_sensorCalRecordField; + } + set { + this.m_sensorCalRecordField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class DOSensorCalUpdateRecord { + + private string m_sensorUUIDField; + + private EModuleID moduleIDField; + + private DOSensorCalRecord m_sensorCalRecordField; + + /// + public string m_sensorUUID { + get { + return this.m_sensorUUIDField; + } + set { + this.m_sensorUUIDField = value; + } + } + + /// + public EModuleID moduleID { + get { + return this.moduleIDField; + } + set { + this.moduleIDField = value; + } + } + + /// + public DOSensorCalRecord m_sensorCalRecord { + get { + return this.m_sensorCalRecordField; + } + set { + this.m_sensorCalRecordField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class BufStdGrpRecord { + + private string m_uuidField; + + private bool m_predefinedField; + + private EBufStdType m_typeField; + + private short m_phBufGrpClassField; + + private string m_nameField; + + private decfloat m_refTempField; + + private ECommonUnit m_iseUnitField; + + private bool m_usePredefinedStdField; + + private BufStdRecord[] m_buffersField; + + /// + public string m_uuid { + get { + return this.m_uuidField; + } + set { + this.m_uuidField = value; + } + } + + /// + public bool m_predefined { + get { + return this.m_predefinedField; + } + set { + this.m_predefinedField = value; + } + } + + /// + public EBufStdType m_type { + get { + return this.m_typeField; + } + set { + this.m_typeField = value; + } + } + + /// + public short m_phBufGrpClass { + get { + return this.m_phBufGrpClassField; + } + set { + this.m_phBufGrpClassField = value; + } + } + + /// + public string m_name { + get { + return this.m_nameField; + } + set { + this.m_nameField = value; + } + } + + /// + public decfloat m_refTemp { + get { + return this.m_refTempField; + } + set { + this.m_refTempField = value; + } + } + + /// + public ECommonUnit m_iseUnit { + get { + return this.m_iseUnitField; + } + set { + this.m_iseUnitField = value; + } + } + + /// + public bool m_usePredefinedStd { + get { + return this.m_usePredefinedStdField; + } + set { + this.m_usePredefinedStdField = value; + } + } + + /// + [System.Xml.Serialization.XmlArrayItemAttribute("ArrayOfBufStdRecord")] + public BufStdRecord[] m_buffers { + get { + return this.m_buffersField; + } + set { + this.m_buffersField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + public enum EBufStdType { + + /// + eBufStdTypeid_BufStdType_PH, + + /// + eBufStdTypeid_BufStdType_ISE, + + /// + eBufStdTypeid_BufStdType_Cond, + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class BufStdRecord { + + private decfloat m_valueAtRefTempField; + + private ECommonUnit m_condUnitField; + + private short m_cndStdClassField; + + private BufStdTempRelatedValue[] m_bufStdTempRelatedValuesField; + + /// + public decfloat m_valueAtRefTemp { + get { + return this.m_valueAtRefTempField; + } + set { + this.m_valueAtRefTempField = value; + } + } + + /// + public ECommonUnit m_condUnit { + get { + return this.m_condUnitField; + } + set { + this.m_condUnitField = value; + } + } + + /// + public short m_cndStdClass { + get { + return this.m_cndStdClassField; + } + set { + this.m_cndStdClassField = value; + } + } + + /// + [System.Xml.Serialization.XmlArrayItemAttribute("ArrayOfBufStdTempRelatedValue")] + public BufStdTempRelatedValue[] m_bufStdTempRelatedValues { + get { + return this.m_bufStdTempRelatedValuesField; + } + set { + this.m_bufStdTempRelatedValuesField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class BufStdTempRelatedValue { + + private decfloat m_tempField; + + private decfloat m_valueField; + + /// + public decfloat m_temp { + get { + return this.m_tempField; + } + set { + this.m_tempField = value; + } + } + + /// + public decfloat m_value { + get { + return this.m_valueField; + } + set { + this.m_valueField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class ArrayOfBufStdTempRelatedValue { + + private BufStdTempRelatedValue[] arrayOfBufStdTempRelatedValue1Field; + + /// + [System.Xml.Serialization.XmlElementAttribute("ArrayOfBufStdTempRelatedValue", IsNullable=true)] + public BufStdTempRelatedValue[] ArrayOfBufStdTempRelatedValue1 { + get { + return this.arrayOfBufStdTempRelatedValue1Field; + } + set { + this.arrayOfBufStdTempRelatedValue1Field = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class ArrayOfBufStdRecord { + + private BufStdRecord[] arrayOfBufStdRecord1Field; + + /// + [System.Xml.Serialization.XmlElementAttribute("ArrayOfBufStdRecord", IsNullable=true)] + public BufStdRecord[] ArrayOfBufStdRecord1 { + get { + return this.arrayOfBufStdRecord1Field; + } + set { + this.arrayOfBufStdRecord1Field = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class TableRecord { + + private string m_uuidField; + + private bool m_predefinedField; + + private string m_tableNameField; + + private string m_inputField; + + private string m_outputField; + + private EFitType m_fitTypeField; + + private string m_commentField; + + private TableValueRecord[] m_tableValuesField; + + /// + public string m_uuid { + get { + return this.m_uuidField; + } + set { + this.m_uuidField = value; + } + } + + /// + public bool m_predefined { + get { + return this.m_predefinedField; + } + set { + this.m_predefinedField = value; + } + } + + /// + public string m_tableName { + get { + return this.m_tableNameField; + } + set { + this.m_tableNameField = value; + } + } + + /// + public string m_input { + get { + return this.m_inputField; + } + set { + this.m_inputField = value; + } + } + + /// + public string m_output { + get { + return this.m_outputField; + } + set { + this.m_outputField = value; + } + } + + /// + public EFitType m_fitType { + get { + return this.m_fitTypeField; + } + set { + this.m_fitTypeField = value; + } + } + + /// + public string m_comment { + get { + return this.m_commentField; + } + set { + this.m_commentField = value; + } + } + + /// + [System.Xml.Serialization.XmlArrayItemAttribute("ArrayOfTableValueRecord")] + public TableValueRecord[] m_tableValues { + get { + return this.m_tableValuesField; + } + set { + this.m_tableValuesField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + public enum EFitType { + + /// + eFitTypeid_FitType_LinearInterpolation, + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class TableValueRecord { + + private decfloat m_inputValueField; + + private decfloat m_outputValueField; + + /// + public decfloat m_inputValue { + get { + return this.m_inputValueField; + } + set { + this.m_inputValueField = value; + } + } + + /// + public decfloat m_outputValue { + get { + return this.m_outputValueField; + } + set { + this.m_outputValueField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class ArrayOfTableValueRecord { + + private TableValueRecord[] arrayOfTableValueRecord1Field; + + /// + [System.Xml.Serialization.XmlElementAttribute("ArrayOfTableValueRecord", IsNullable=true)] + public TableValueRecord[] ArrayOfTableValueRecord1 { + get { + return this.arrayOfTableValueRecord1Field; + } + set { + this.arrayOfTableValueRecord1Field = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class StirrerConfigurationRecord { + + private string m_nameField; + + private EStirrerType m_typeField; + + private decfloat m_minVoltageField; + + private decfloat m_maxVoltageField; + + /// + public string m_name { + get { + return this.m_nameField; + } + set { + this.m_nameField = value; + } + } + + /// + public EStirrerType m_type { + get { + return this.m_typeField; + } + set { + this.m_typeField = value; + } + } + + /// + public decfloat m_minVoltage { + get { + return this.m_minVoltageField; + } + set { + this.m_minVoltageField = value; + } + } + + /// + public decfloat m_maxVoltage { + get { + return this.m_maxVoltageField; + } + set { + this.m_maxVoltageField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + public enum EStirrerType { + + /// + eStirrerTypeid_StirrerType_MagneticStirrer, + + /// + eStirrerTypeid_StirrerType_OverheadStirrer, + + /// + eStirrerTypeid_StirrerType_UserDefinedStirrer, + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class BrowsableScreenColor { + + private EBrowsableScreenColorType typeField; + + private byte rField; + + private byte gField; + + private byte bField; + + /// + public EBrowsableScreenColorType Type { + get { + return this.typeField; + } + set { + this.typeField = value; + } + } + + /// + public byte R { + get { + return this.rField; + } + set { + this.rField = value; + } + } + + /// + public byte G { + get { + return this.gField; + } + set { + this.gField = value; + } + } + + /// + public byte B { + get { + return this.bField; + } + set { + this.bField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + public enum EBrowsableScreenColorType { + + /// + eBrowsableScreenColorTypeDefault, + + /// + eBrowsableScreenColorTypeRGB, + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class BrowsableScreenButton { + + private string textField; + + private EBrowsableScreenButtonState stateField; + + private BrowsableScreenColor buttonColorField; + + /// + public string Text { + get { + return this.textField; + } + set { + this.textField = value; + } + } + + /// + public EBrowsableScreenButtonState State { + get { + return this.stateField; + } + set { + this.stateField = value; + } + } + + /// + public BrowsableScreenColor ButtonColor { + get { + return this.buttonColorField; + } + set { + this.buttonColorField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + public enum EBrowsableScreenButtonState { + + /// + eButtonStateEnabled, + + /// + eButtonStateDisabled, + + /// + eButtonStateInvisible, + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class BrowsableScreenTaskButton { + + private EBrowsableScreenTaskButtonState stateField; + + /// + public EBrowsableScreenTaskButtonState State { + get { + return this.stateField; + } + set { + this.stateField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + public enum EBrowsableScreenTaskButtonState { + + /// + eTaskButtonStateDisabled, + + /// + eTaskButtonStateActive, + + /// + eTaskButtonStateActiveWaiting, + + /// + eTaskButtonStateAttention, + + /// + eTaskButtonStateInterrupted, + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class BrowsableScreenMessage { + + private string titleField; + + private BrowsableScreenColor titleBackgroundColorField; + + private string navigationField; + + private bool isTaskButtonVisibleField; + + private string messageField; + + private EBrowsableScreenMessageViewState titleIconField; + + private BrowsableScreenColor textColorField; + + private BrowsableScreenColor backgroundColorField; + + private BrowsableScreenButton[] buttonsField; + + /// + public string Title { + get { + return this.titleField; + } + set { + this.titleField = value; + } + } + + /// + public BrowsableScreenColor TitleBackgroundColor { + get { + return this.titleBackgroundColorField; + } + set { + this.titleBackgroundColorField = value; + } + } + + /// + public string Navigation { + get { + return this.navigationField; + } + set { + this.navigationField = value; + } + } + + /// + public bool IsTaskButtonVisible { + get { + return this.isTaskButtonVisibleField; + } + set { + this.isTaskButtonVisibleField = value; + } + } + + /// + public string Message { + get { + return this.messageField; + } + set { + this.messageField = value; + } + } + + /// + public EBrowsableScreenMessageViewState TitleIcon { + get { + return this.titleIconField; + } + set { + this.titleIconField = value; + } + } + + /// + public BrowsableScreenColor TextColor { + get { + return this.textColorField; + } + set { + this.textColorField = value; + } + } + + /// + public BrowsableScreenColor BackgroundColor { + get { + return this.backgroundColorField; + } + set { + this.backgroundColorField = value; + } + } + + /// + [System.Xml.Serialization.XmlArrayItemAttribute("ArrayOfBrowsableScreenButton")] + public BrowsableScreenButton[] Buttons { + get { + return this.buttonsField; + } + set { + this.buttonsField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + public enum EBrowsableScreenMessageViewState { + + /// + eMessageViewState_None, + + /// + eMessageViewState_LabX, + + /// + eMessageViewState_InfoBubble, + + /// + eMessageViewState_Attention, + + /// + eMessageViewState_Stop, + + /// + eMessageViewState_QuestionMark, + + /// + eMessageViewState_InfoGrey, + + /// + eMessageViewState_Result, + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class ArrayOfBrowsableScreenButton { + + private BrowsableScreenButton[] arrayOfBrowsableScreenButton1Field; + + /// + [System.Xml.Serialization.XmlElementAttribute("ArrayOfBrowsableScreenButton", IsNullable=true)] + public BrowsableScreenButton[] ArrayOfBrowsableScreenButton1 { + get { + return this.arrayOfBrowsableScreenButton1Field; + } + set { + this.arrayOfBrowsableScreenButton1Field = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class BrowsableScreenRequestNumber { + + private string titleField; + + private BrowsableScreenColor titleBackgroundColorField; + + private decfloat defaultValueField; + + private decfloat minimalValueField; + + private decfloat maximalValueField; + + private short digitsField; + + private BrowsableScreenButton[] buttonsField; + + /// + public string Title { + get { + return this.titleField; + } + set { + this.titleField = value; + } + } + + /// + public BrowsableScreenColor TitleBackgroundColor { + get { + return this.titleBackgroundColorField; + } + set { + this.titleBackgroundColorField = value; + } + } + + /// + public decfloat DefaultValue { + get { + return this.defaultValueField; + } + set { + this.defaultValueField = value; + } + } + + /// + public decfloat MinimalValue { + get { + return this.minimalValueField; + } + set { + this.minimalValueField = value; + } + } + + /// + public decfloat MaximalValue { + get { + return this.maximalValueField; + } + set { + this.maximalValueField = value; + } + } + + /// + public short Digits { + get { + return this.digitsField; + } + set { + this.digitsField = value; + } + } + + /// + [System.Xml.Serialization.XmlArrayItemAttribute("ArrayOfBrowsableScreenButton")] + public BrowsableScreenButton[] Buttons { + get { + return this.buttonsField; + } + set { + this.buttonsField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class BrowsableScreenRequestText { + + private string titleField; + + private BrowsableScreenColor titleBackgroundColorField; + + private string defaultValueField; + + private short minTextLengthField; + + private short maxTextLengthField; + + private BrowsableScreenButton[] buttonsField; + + /// + public string Title { + get { + return this.titleField; + } + set { + this.titleField = value; + } + } + + /// + public BrowsableScreenColor TitleBackgroundColor { + get { + return this.titleBackgroundColorField; + } + set { + this.titleBackgroundColorField = value; + } + } + + /// + public string DefaultValue { + get { + return this.defaultValueField; + } + set { + this.defaultValueField = value; + } + } + + /// + public short MinTextLength { + get { + return this.minTextLengthField; + } + set { + this.minTextLengthField = value; + } + } + + /// + public short MaxTextLength { + get { + return this.maxTextLengthField; + } + set { + this.maxTextLengthField = value; + } + } + + /// + [System.Xml.Serialization.XmlArrayItemAttribute("ArrayOfBrowsableScreenButton")] + public BrowsableScreenButton[] Buttons { + get { + return this.buttonsField; + } + set { + this.buttonsField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class BrowsableScreenRequestTextEx { + + private string titleField; + + private BrowsableScreenColor titleBackgroundColorField; + + private string defaultValueField; + + private short minTextLengthField; + + private short maxTextLengthField; + + private BrowsableScreenButton[] buttonsField; + + /// + public string Title { + get { + return this.titleField; + } + set { + this.titleField = value; + } + } + + /// + public BrowsableScreenColor TitleBackgroundColor { + get { + return this.titleBackgroundColorField; + } + set { + this.titleBackgroundColorField = value; + } + } + + /// + public string DefaultValue { + get { + return this.defaultValueField; + } + set { + this.defaultValueField = value; + } + } + + /// + public short MinTextLength { + get { + return this.minTextLengthField; + } + set { + this.minTextLengthField = value; + } + } + + /// + public short MaxTextLength { + get { + return this.maxTextLengthField; + } + set { + this.maxTextLengthField = value; + } + } + + /// + [System.Xml.Serialization.XmlArrayItemAttribute("ArrayOfBrowsableScreenButton")] + public BrowsableScreenButton[] Buttons { + get { + return this.buttonsField; + } + set { + this.buttonsField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class BrowsableScreenRequestSelectionColumn { + + private string headerField; + + private byte widthField; + + private EBrowsableScreenTableColumnType typeField; + + /// + public string Header { + get { + return this.headerField; + } + set { + this.headerField = value; + } + } + + /// + public byte Width { + get { + return this.widthField; + } + set { + this.widthField = value; + } + } + + /// + public EBrowsableScreenTableColumnType Type { + get { + return this.typeField; + } + set { + this.typeField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + public enum EBrowsableScreenTableColumnType { + + /// + eBrowsableScreenTableType_StringList, + + /// + eBrowsableScreenTableType_IconList, + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class DummyEBrowsableScreenRequestSelectionRowIcon { + + private EBrowsableScreenRequestSelectionRowIcon dummyEnumField; + + /// + public EBrowsableScreenRequestSelectionRowIcon dummyEnum { + get { + return this.dummyEnumField; + } + set { + this.dummyEnumField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + public enum EBrowsableScreenRequestSelectionRowIcon { + + /// + eLabX_Number, + + /// + eLabX_Text, + + /// + eLabX_Info, + + /// + eLabX_Bool, + + /// + eLabX_DropDown, + + /// + eLabX_Folder, + + /// + eLabX_FolderUp, + + /// + eLabX_Method, + + /// + eLabX_MethodLocked, + + /// + eLabX_Product, + + /// + eLabX_ProductLocked, + + /// + eLabX_Series, + + /// + eLabX_SeriesLocked, + + /// + eLabX_TaskAborted, + + /// + eLabX_TaskAbortedPrio, + + /// + eLabX_TaskCreated, + + /// + eLabX_TaskCreatedPrio, + + /// + eLabX_TaskError, + + /// + eLabX_TaskErrorPrio, + + /// + eLabX_TaskHold, + + /// + eLabX_TaskHoldPrio, + + /// + eLabX_TaskPaused, + + /// + eLabX_TaskPausedPrio, + + /// + eLabX_TaskRunning, + + /// + eLabX_TaskRunningPrio, + + /// + eLabX_TaskWaiting, + + /// + eLabX_TaskWaitingPrio, + + /// + eLabX_TaskWarning, + + /// + eLabX_TaskWarningPrio, + + /// + eLabX_ShowReleased, + + /// + eLabX_ShowProposed, + + /// + eLabX_None, + + /// + eLabX_Tag, + + /// + eLabX_NextPage, + + /// + eLabX_PrevPage, + + /// + eLabX_RowColor1, + + /// + eLabX_RowColor2, + + /// + eLabX_RowColor3, + + /// + eLabX_RowColor4, + + /// + eLabX_RowColor5, + + /// + eLabX_RowColor6, + + /// + eLabX_RowColor7, + + /// + eLabX_RowColor8, + + /// + eLabX_RowColor9, + + /// + eLabX_RowColor10, + + /// + eLabX_RowColor11, + + /// + eLabX_RowColor12, + + /// + eLabX_RowColor13, + + /// + eLabX_RowColor14, + + /// + eLabX_RowColor15, + + /// + eLabX_RowColor16, + + /// + eLabX_RowColor17, + + /// + eLabX_RowColor18, + + /// + eLabX_RowColorRGB, + + /// + eLabX_FolderTask, + + /// + eLabX_FolderSample, + + /// + eLabX_ManualOp, + + /// + eLabX_ManualOpLocked, + + /// + eLabX_StatusLightGreen, + + /// + eLabX_StatusLightOrange, + + /// + eLabX_StatusLightRed, + + /// + eLabX_StatusLightGreenFlashing, + + /// + eLabX_StatusLightOrangeFlashing, + + /// + eLabX_StatusLightRedFlashing, + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class BrowsableScreenRequestSelectionRow { + + private EBrowsableScreenRequestSelectionRowState rowStateField; + + private BrowsableScreenColor rowColorField; + + private bool isHighlightedField; + + private string columnText1Field; + + private string columnText2Field; + + private string columnText3Field; + + private string columnText4Field; + + /// + public EBrowsableScreenRequestSelectionRowState RowState { + get { + return this.rowStateField; + } + set { + this.rowStateField = value; + } + } + + /// + public BrowsableScreenColor RowColor { + get { + return this.rowColorField; + } + set { + this.rowColorField = value; + } + } + + /// + public bool IsHighlighted { + get { + return this.isHighlightedField; + } + set { + this.isHighlightedField = value; + } + } + + /// + public string ColumnText1 { + get { + return this.columnText1Field; + } + set { + this.columnText1Field = value; + } + } + + /// + public string ColumnText2 { + get { + return this.columnText2Field; + } + set { + this.columnText2Field = value; + } + } + + /// + public string ColumnText3 { + get { + return this.columnText3Field; + } + set { + this.columnText3Field = value; + } + } + + /// + public string ColumnText4 { + get { + return this.columnText4Field; + } + set { + this.columnText4Field = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + public enum EBrowsableScreenRequestSelectionRowState { + + /// + eRowEnabled, + + /// + eRowDisabled, + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class BrowsableScreenRequestSelection { + + private string titleField; + + private BrowsableScreenColor titleBackgroundColorField; + + private string navigationField; + + private bool showHeaderField; + + private bool readOnlyField; + + private BrowsableScreenRequestSelectionColumn[] columnsField; + + private byte rowsVisibleField; + + private short scrollPositionField; + + private BrowsableScreenRequestSelectionRow[] rowsField; + + private BrowsableScreenColor highlightedRowsTextColorField; + + private BrowsableScreenColor highlightedRowsBGColorField; + + private BrowsableScreenButton[] buttonsField; + + /// + public string Title { + get { + return this.titleField; + } + set { + this.titleField = value; + } + } + + /// + public BrowsableScreenColor TitleBackgroundColor { + get { + return this.titleBackgroundColorField; + } + set { + this.titleBackgroundColorField = value; + } + } + + /// + public string Navigation { + get { + return this.navigationField; + } + set { + this.navigationField = value; + } + } + + /// + public bool ShowHeader { + get { + return this.showHeaderField; + } + set { + this.showHeaderField = value; + } + } + + /// + public bool ReadOnly { + get { + return this.readOnlyField; + } + set { + this.readOnlyField = value; + } + } + + /// + [System.Xml.Serialization.XmlArrayItemAttribute("ArrayOfBrowsableScreenRequestSelectionColumn")] + public BrowsableScreenRequestSelectionColumn[] Columns { + get { + return this.columnsField; + } + set { + this.columnsField = value; + } + } + + /// + public byte RowsVisible { + get { + return this.rowsVisibleField; + } + set { + this.rowsVisibleField = value; + } + } + + /// + public short ScrollPosition { + get { + return this.scrollPositionField; + } + set { + this.scrollPositionField = value; + } + } + + /// + [System.Xml.Serialization.XmlArrayItemAttribute("ArrayOfBrowsableScreenRequestSelectionRow")] + public BrowsableScreenRequestSelectionRow[] Rows { + get { + return this.rowsField; + } + set { + this.rowsField = value; + } + } + + /// + public BrowsableScreenColor HighlightedRowsTextColor { + get { + return this.highlightedRowsTextColorField; + } + set { + this.highlightedRowsTextColorField = value; + } + } + + /// + public BrowsableScreenColor HighlightedRowsBGColor { + get { + return this.highlightedRowsBGColorField; + } + set { + this.highlightedRowsBGColorField = value; + } + } + + /// + [System.Xml.Serialization.XmlArrayItemAttribute("ArrayOfBrowsableScreenButton")] + public BrowsableScreenButton[] Buttons { + get { + return this.buttonsField; + } + set { + this.buttonsField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class ArrayOfBrowsableScreenRequestSelectionColumn { + + private BrowsableScreenRequestSelectionColumn[] arrayOfBrowsableScreenRequestSelectionColumn1Field; + + /// + [System.Xml.Serialization.XmlElementAttribute("ArrayOfBrowsableScreenRequestSelectionColumn", IsNullable=true)] + public BrowsableScreenRequestSelectionColumn[] ArrayOfBrowsableScreenRequestSelectionColumn1 { + get { + return this.arrayOfBrowsableScreenRequestSelectionColumn1Field; + } + set { + this.arrayOfBrowsableScreenRequestSelectionColumn1Field = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class ArrayOfBrowsableScreenRequestSelectionRow { + + private BrowsableScreenRequestSelectionRow[] arrayOfBrowsableScreenRequestSelectionRow1Field; + + /// + [System.Xml.Serialization.XmlElementAttribute("ArrayOfBrowsableScreenRequestSelectionRow", IsNullable=true)] + public BrowsableScreenRequestSelectionRow[] ArrayOfBrowsableScreenRequestSelectionRow1 { + get { + return this.arrayOfBrowsableScreenRequestSelectionRow1Field; + } + set { + this.arrayOfBrowsableScreenRequestSelectionRow1Field = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class BrowsableScreenLogin { + + private string titleField; + + private string navigationField; + + private BrowsableScreenColor backgroundColorField; + + private BrowsableScreenButton[] buttonsField; + + private EBrowsableScreenLoginViewState titleIconField; + + private string extendedTextField; + + private string errorTextField; + + private string defaultNameField; + + private short nameMinField; + + private short nameMaxField; + + private bool passwordFieldField; + + private short passwordMinField; + + private short passwordMaxField; + + private string[] usersField; + + private short indexButtonUserListField; + + private short indexButtonSendLoginDataField; + + /// + public string Title { + get { + return this.titleField; + } + set { + this.titleField = value; + } + } + + /// + public string Navigation { + get { + return this.navigationField; + } + set { + this.navigationField = value; + } + } + + /// + public BrowsableScreenColor BackgroundColor { + get { + return this.backgroundColorField; + } + set { + this.backgroundColorField = value; + } + } + + /// + [System.Xml.Serialization.XmlArrayItemAttribute("ArrayOfBrowsableScreenButton")] + public BrowsableScreenButton[] Buttons { + get { + return this.buttonsField; + } + set { + this.buttonsField = value; + } + } + + /// + public EBrowsableScreenLoginViewState TitleIcon { + get { + return this.titleIconField; + } + set { + this.titleIconField = value; + } + } + + /// + public string ExtendedText { + get { + return this.extendedTextField; + } + set { + this.extendedTextField = value; + } + } + + /// + public string ErrorText { + get { + return this.errorTextField; + } + set { + this.errorTextField = value; + } + } + + /// + public string DefaultName { + get { + return this.defaultNameField; + } + set { + this.defaultNameField = value; + } + } + + /// + public short NameMin { + get { + return this.nameMinField; + } + set { + this.nameMinField = value; + } + } + + /// + public short NameMax { + get { + return this.nameMaxField; + } + set { + this.nameMaxField = value; + } + } + + /// + public bool PasswordField { + get { + return this.passwordFieldField; + } + set { + this.passwordFieldField = value; + } + } + + /// + public short PasswordMin { + get { + return this.passwordMinField; + } + set { + this.passwordMinField = value; + } + } + + /// + public short PasswordMax { + get { + return this.passwordMaxField; + } + set { + this.passwordMaxField = value; + } + } + + /// + [System.Xml.Serialization.XmlArrayItemAttribute("ArrayOfString")] + public string[] Users { + get { + return this.usersField; + } + set { + this.usersField = value; + } + } + + /// + public short IndexButtonUserList { + get { + return this.indexButtonUserListField; + } + set { + this.indexButtonUserListField = value; + } + } + + /// + public short IndexButtonSendLoginData { + get { + return this.indexButtonSendLoginDataField; + } + set { + this.indexButtonSendLoginDataField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + public enum EBrowsableScreenLoginViewState { + + /// + eLoginViewState_Login, + + /// + eLoginViewState_Lock, + + /// + eLoginViewState_Sign, + + /// + eLoginViewState_Fingerprint, + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class ArrayOfString { + + private string[] arrayOfString1Field; + + /// + [System.Xml.Serialization.XmlElementAttribute("ArrayOfString", IsNullable=true)] + public string[] ArrayOfString1 { + get { + return this.arrayOfString1Field; + } + set { + this.arrayOfString1Field = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class BrowsableScreenRequestParameterListItem { + + private string labelField; + + private string valueField; + + private EFieldType fieldtypeField; + + private bool checkboxEnabledField; + + /// + public string Label { + get { + return this.labelField; + } + set { + this.labelField = value; + } + } + + /// + public string Value { + get { + return this.valueField; + } + set { + this.valueField = value; + } + } + + /// + public EFieldType Fieldtype { + get { + return this.fieldtypeField; + } + set { + this.fieldtypeField = value; + } + } + + /// + public bool CheckboxEnabled { + get { + return this.checkboxEnabledField; + } + set { + this.checkboxEnabledField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + public enum EFieldType { + + /// + eFieldType_Info, + + /// + eFieldType_List, + + /// + eFieldType_Parameter, + + /// + eFieldType_String, + + /// + eFieldType_Number, + + /// + eFieldType_Checkbox, + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class BrowsableScreenRequestParameterListSelection { + + private string titleField; + + private BrowsableScreenColor titleBackgroundColorField; + + private string navigationField; + + private BrowsableScreenRequestParameterListItem[] rowsField; + + private short scrollPositionField; + + private BrowsableScreenButton[] buttonsField; + + /// + public string Title { + get { + return this.titleField; + } + set { + this.titleField = value; + } + } + + /// + public BrowsableScreenColor TitleBackgroundColor { + get { + return this.titleBackgroundColorField; + } + set { + this.titleBackgroundColorField = value; + } + } + + /// + public string Navigation { + get { + return this.navigationField; + } + set { + this.navigationField = value; + } + } + + /// + [System.Xml.Serialization.XmlArrayItemAttribute("ArrayOfBrowsableScreenRequestParameterListItem")] + public BrowsableScreenRequestParameterListItem[] Rows { + get { + return this.rowsField; + } + set { + this.rowsField = value; + } + } + + /// + public short ScrollPosition { + get { + return this.scrollPositionField; + } + set { + this.scrollPositionField = value; + } + } + + /// + [System.Xml.Serialization.XmlArrayItemAttribute("ArrayOfBrowsableScreenButton")] + public BrowsableScreenButton[] Buttons { + get { + return this.buttonsField; + } + set { + this.buttonsField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class ArrayOfBrowsableScreenRequestParameterListItem { + + private BrowsableScreenRequestParameterListItem[] arrayOfBrowsableScreenRequestParameterListItem1Field; + + /// + [System.Xml.Serialization.XmlElementAttribute("ArrayOfBrowsableScreenRequestParameterListItem", IsNullable=true)] + public BrowsableScreenRequestParameterListItem[] ArrayOfBrowsableScreenRequestParameterListItem1 { + get { + return this.arrayOfBrowsableScreenRequestParameterListItem1Field; + } + set { + this.arrayOfBrowsableScreenRequestParameterListItem1Field = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class BrowsableScreenRequestButtonListItem { + + private string titleField; + + /// + public string Title { + get { + return this.titleField; + } + set { + this.titleField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class BrowsableScreenRequestButtonListSelection { + + private string titleField; + + private BrowsableScreenColor titleBackgroundColorField; + + private string navigationField; + + private BrowsableScreenRequestButtonListItem[] rowsField; + + private short scrollPositionField; + + private BrowsableScreenButton[] buttonsField; + + /// + public string Title { + get { + return this.titleField; + } + set { + this.titleField = value; + } + } + + /// + public BrowsableScreenColor TitleBackgroundColor { + get { + return this.titleBackgroundColorField; + } + set { + this.titleBackgroundColorField = value; + } + } + + /// + public string Navigation { + get { + return this.navigationField; + } + set { + this.navigationField = value; + } + } + + /// + [System.Xml.Serialization.XmlArrayItemAttribute("ArrayOfBrowsableScreenRequestButtonListItem")] + public BrowsableScreenRequestButtonListItem[] Rows { + get { + return this.rowsField; + } + set { + this.rowsField = value; + } + } + + /// + public short ScrollPosition { + get { + return this.scrollPositionField; + } + set { + this.scrollPositionField = value; + } + } + + /// + [System.Xml.Serialization.XmlArrayItemAttribute("ArrayOfBrowsableScreenButton")] + public BrowsableScreenButton[] Buttons { + get { + return this.buttonsField; + } + set { + this.buttonsField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class ArrayOfBrowsableScreenRequestButtonListItem { + + private BrowsableScreenRequestButtonListItem[] arrayOfBrowsableScreenRequestButtonListItem1Field; + + /// + [System.Xml.Serialization.XmlElementAttribute("ArrayOfBrowsableScreenRequestButtonListItem", IsNullable=true)] + public BrowsableScreenRequestButtonListItem[] ArrayOfBrowsableScreenRequestButtonListItem1 { + get { + return this.arrayOfBrowsableScreenRequestButtonListItem1Field; + } + set { + this.arrayOfBrowsableScreenRequestButtonListItem1Field = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class BrowsableScreenIconButton { + + private BrowsableScreenButton buttonField; + + private EInstrumentButtonIcon iconField; + + /// + public BrowsableScreenButton Button { + get { + return this.buttonField; + } + set { + this.buttonField = value; + } + } + + /// + public EInstrumentButtonIcon Icon { + get { + return this.iconField; + } + set { + this.iconField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + public enum EInstrumentButtonIcon { + + /// + eInstrumentIcon_None, + + /// + eInstrumentIcon_Method, + + /// + eInstrumentIcon_MethodProduct, + + /// + eInstrumentIcon_Series, + + /// + eInstrumentIcon_Result, + + /// + eInstrumentIcon_Setup, + + /// + eInstrumentIcon_Sensor, + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class BrowsableScreenOnlineTF { + + private string titleField; + + private string navigationField; + + private string statusField; + + private BrowsableScreenButton buttonControlField; + + private string buttonSwitchViewTextField; + + private string buttonOKTextField; + + private string buttonTakeManualEndpointTextField; + + private string buttonGraphTextField; + + private string buttonTableTextField; + + private string buttonActualTextField; + + private string buttonCalTextField; + + /// + public string Title { + get { + return this.titleField; + } + set { + this.titleField = value; + } + } + + /// + public string Navigation { + get { + return this.navigationField; + } + set { + this.navigationField = value; + } + } + + /// + public string Status { + get { + return this.statusField; + } + set { + this.statusField = value; + } + } + + /// + public BrowsableScreenButton ButtonControl { + get { + return this.buttonControlField; + } + set { + this.buttonControlField = value; + } + } + + /// + public string ButtonSwitchViewText { + get { + return this.buttonSwitchViewTextField; + } + set { + this.buttonSwitchViewTextField = value; + } + } + + /// + public string ButtonOKText { + get { + return this.buttonOKTextField; + } + set { + this.buttonOKTextField = value; + } + } + + /// + public string ButtonTakeManualEndpointText { + get { + return this.buttonTakeManualEndpointTextField; + } + set { + this.buttonTakeManualEndpointTextField = value; + } + } + + /// + public string ButtonGraphText { + get { + return this.buttonGraphTextField; + } + set { + this.buttonGraphTextField = value; + } + } + + /// + public string ButtonTableText { + get { + return this.buttonTableTextField; + } + set { + this.buttonTableTextField = value; + } + } + + /// + public string ButtonActualText { + get { + return this.buttonActualTextField; + } + set { + this.buttonActualTextField = value; + } + } + + /// + public string ButtonCalText { + get { + return this.buttonCalTextField; + } + set { + this.buttonCalTextField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class BrowsableScreenHomeTF { + + private ELabXHomeViewState titleIconField; + + private string titleField; + + private BrowsableScreenColor titleBackgroundColorField; + + private BrowsableScreenShortcutButtonTF[] shortcutButtonsField; + + private BrowsableScreenIconButton[] leftButtonsField; + + private BrowsableScreenButton[] bottomButtonsField; + + private string[] sensorsField; + + private string userNameField; + + /// + public ELabXHomeViewState TitleIcon { + get { + return this.titleIconField; + } + set { + this.titleIconField = value; + } + } + + /// + public string Title { + get { + return this.titleField; + } + set { + this.titleField = value; + } + } + + /// + public BrowsableScreenColor TitleBackgroundColor { + get { + return this.titleBackgroundColorField; + } + set { + this.titleBackgroundColorField = value; + } + } + + /// + [System.Xml.Serialization.XmlArrayItemAttribute("ArrayOfBrowsableScreenShortcutButtonTF")] + public BrowsableScreenShortcutButtonTF[] ShortcutButtons { + get { + return this.shortcutButtonsField; + } + set { + this.shortcutButtonsField = value; + } + } + + /// + [System.Xml.Serialization.XmlArrayItemAttribute("ArrayOfBrowsableScreenIconButton")] + public BrowsableScreenIconButton[] LeftButtons { + get { + return this.leftButtonsField; + } + set { + this.leftButtonsField = value; + } + } + + /// + [System.Xml.Serialization.XmlArrayItemAttribute("ArrayOfBrowsableScreenButton")] + public BrowsableScreenButton[] BottomButtons { + get { + return this.bottomButtonsField; + } + set { + this.bottomButtonsField = value; + } + } + + /// + [System.Xml.Serialization.XmlArrayItemAttribute("ArrayOfString")] + public string[] Sensors { + get { + return this.sensorsField; + } + set { + this.sensorsField = value; + } + } + + /// + public string UserName { + get { + return this.userNameField; + } + set { + this.userNameField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + public enum ELabXHomeViewState { + + /// + eLabXHomeViewStateid_LabXHomeViewState_LabX, + + /// + eLabXHomeViewStateid_LabXHomeViewState_BlockedHeader, + + /// + eLabXHomeViewStateid_LabXHomeViewState_EmergencyHeader, + + /// + eLabXHomeViewStateid_LabXHomeViewState_UnavailableHeader, + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class BrowsableScreenShortcutButtonTF { + + private short positionField; + + private bool immediateStartField; + + private string textField; + + private EHomeShortcutIconTF iconField; + + private BrowsableScreenColor rGBField; + + /// + public short Position { + get { + return this.positionField; + } + set { + this.positionField = value; + } + } + + /// + public bool ImmediateStart { + get { + return this.immediateStartField; + } + set { + this.immediateStartField = value; + } + } + + /// + public string Text { + get { + return this.textField; + } + set { + this.textField = value; + } + } + + /// + public EHomeShortcutIconTF Icon { + get { + return this.iconField; + } + set { + this.iconField = value; + } + } + + /// + public BrowsableScreenColor RGB { + get { + return this.rGBField; + } + set { + this.rGBField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + public enum EHomeShortcutIconTF { + + /// + eHomeShortcutIconTF_Previous, + + /// + eHomeShortcutIconTF_Method, + + /// + eHomeShortcutIconTF_Serie, + + /// + eHomeShortcutIconTF_SerieSequence, + + /// + eHomeShortcutIconTF_Product, + + /// + eHomeShortcutIconTF_Next, + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class ArrayOfBrowsableScreenShortcutButtonTF { + + private BrowsableScreenShortcutButtonTF[] arrayOfBrowsableScreenShortcutButtonTF1Field; + + /// + [System.Xml.Serialization.XmlElementAttribute("ArrayOfBrowsableScreenShortcutButtonTF", IsNullable=true)] + public BrowsableScreenShortcutButtonTF[] ArrayOfBrowsableScreenShortcutButtonTF1 { + get { + return this.arrayOfBrowsableScreenShortcutButtonTF1Field; + } + set { + this.arrayOfBrowsableScreenShortcutButtonTF1Field = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class ArrayOfBrowsableScreenIconButton { + + private BrowsableScreenIconButton[] arrayOfBrowsableScreenIconButton1Field; + + /// + [System.Xml.Serialization.XmlElementAttribute("ArrayOfBrowsableScreenIconButton", IsNullable=true)] + public BrowsableScreenIconButton[] ArrayOfBrowsableScreenIconButton1 { + get { + return this.arrayOfBrowsableScreenIconButton1Field; + } + set { + this.arrayOfBrowsableScreenIconButton1Field = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class BrowsableScreenMethodProductTF { + + private string titleField; + + private string navigationField; + + private BrowsableScreenColor titleBackgroundColorField; + + private BrowsableScreenButton[] centerButtonsField; + + private BrowsableScreenButton[] bottomButtonsField; + + /// + public string Title { + get { + return this.titleField; + } + set { + this.titleField = value; + } + } + + /// + public string Navigation { + get { + return this.navigationField; + } + set { + this.navigationField = value; + } + } + + /// + public BrowsableScreenColor TitleBackgroundColor { + get { + return this.titleBackgroundColorField; + } + set { + this.titleBackgroundColorField = value; + } + } + + /// + [System.Xml.Serialization.XmlArrayItemAttribute("ArrayOfBrowsableScreenButton")] + public BrowsableScreenButton[] CenterButtons { + get { + return this.centerButtonsField; + } + set { + this.centerButtonsField = value; + } + } + + /// + [System.Xml.Serialization.XmlArrayItemAttribute("ArrayOfBrowsableScreenButton")] + public BrowsableScreenButton[] BottomButtons { + get { + return this.bottomButtonsField; + } + set { + this.bottomButtonsField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class BrowsableScreenTFResultsSample { + + private string titleField; + + private string navigationField; + + private BrowsableScreenColor titleBackgroundColorField; + + private BrowsableScreenButton[] centerButtonsField; + + private BrowsableScreenButton[] bottomButtonsField; + + /// + public string Title { + get { + return this.titleField; + } + set { + this.titleField = value; + } + } + + /// + public string Navigation { + get { + return this.navigationField; + } + set { + this.navigationField = value; + } + } + + /// + public BrowsableScreenColor TitleBackgroundColor { + get { + return this.titleBackgroundColorField; + } + set { + this.titleBackgroundColorField = value; + } + } + + /// + [System.Xml.Serialization.XmlArrayItemAttribute("ArrayOfBrowsableScreenButton")] + public BrowsableScreenButton[] CenterButtons { + get { + return this.centerButtonsField; + } + set { + this.centerButtonsField = value; + } + } + + /// + [System.Xml.Serialization.XmlArrayItemAttribute("ArrayOfBrowsableScreenButton")] + public BrowsableScreenButton[] BottomButtons { + get { + return this.bottomButtonsField; + } + set { + this.bottomButtonsField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class BrowsableScreenTFResultsTask { + + private string titleField; + + private string navigationField; + + private BrowsableScreenColor titleBackgroundColorField; + + private BrowsableScreenButton[] centerButtonsField; + + private BrowsableScreenButton[] bottomButtonsField; + + /// + public string Title { + get { + return this.titleField; + } + set { + this.titleField = value; + } + } + + /// + public string Navigation { + get { + return this.navigationField; + } + set { + this.navigationField = value; + } + } + + /// + public BrowsableScreenColor TitleBackgroundColor { + get { + return this.titleBackgroundColorField; + } + set { + this.titleBackgroundColorField = value; + } + } + + /// + [System.Xml.Serialization.XmlArrayItemAttribute("ArrayOfBrowsableScreenButton")] + public BrowsableScreenButton[] CenterButtons { + get { + return this.centerButtonsField; + } + set { + this.centerButtonsField = value; + } + } + + /// + [System.Xml.Serialization.XmlArrayItemAttribute("ArrayOfBrowsableScreenButton")] + public BrowsableScreenButton[] BottomButtons { + get { + return this.bottomButtonsField; + } + set { + this.bottomButtonsField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class BrowsableScreenNewsButton { + + private EBrowsableScreenNewsButtonState stateField; + + /// + public EBrowsableScreenNewsButtonState State { + get { + return this.stateField; + } + set { + this.stateField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + public enum EBrowsableScreenNewsButtonState { + + /// + eNewButtonStateDisabled, + + /// + eNewButtonStateEnable, + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class BrowsableScreenSetup { + + private ESepcialScreenSetup specialScreenField; + + private bool readOnlyFlagField; + + private string titleField; + + private BrowsableScreenColor titleBackgroundColorField; + + private string navigationField; + + private string buttonBackTextField; + + private string buttonCancelTextField; + + private string buttonSaveTextField; + + /// + public ESepcialScreenSetup SpecialScreen { + get { + return this.specialScreenField; + } + set { + this.specialScreenField = value; + } + } + + /// + public bool ReadOnlyFlag { + get { + return this.readOnlyFlagField; + } + set { + this.readOnlyFlagField = value; + } + } + + /// + public string Title { + get { + return this.titleField; + } + set { + this.titleField = value; + } + } + + /// + public BrowsableScreenColor TitleBackgroundColor { + get { + return this.titleBackgroundColorField; + } + set { + this.titleBackgroundColorField = value; + } + } + + /// + public string Navigation { + get { + return this.navigationField; + } + set { + this.navigationField = value; + } + } + + /// + public string ButtonBackText { + get { + return this.buttonBackTextField; + } + set { + this.buttonBackTextField = value; + } + } + + /// + public string ButtonCancelText { + get { + return this.buttonCancelTextField; + } + set { + this.buttonCancelTextField = value; + } + } + + /// + public string ButtonSaveText { + get { + return this.buttonSaveTextField; + } + set { + this.buttonSaveTextField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + public enum ESepcialScreenSetup { + + /// + eSetupScreen, + + /// + eSetupBeep, + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class TemporaryUselessRecord { + + private EInstrumentModuleType moduleTypeField; + + /// + public EInstrumentModuleType ModuleType { + get { + return this.moduleTypeField; + } + set { + this.moduleTypeField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + public enum EInstrumentModuleType { + + /// + eModuleInstrument, + + /// + eModulePHISFET, + + /// + eModulePHION, + + /// + eModuleCND, + + /// + eModuleDO, + + /// + eModuleNone, + + /// + eModuleBaseBoard, + + /// + eModuleUNDEFINED, + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class RequiredResource { + + private string resourceTypeField; + + private string nameField; + + private string statusField; + + /// + public string resourceType { + get { + return this.resourceTypeField; + } + set { + this.resourceTypeField = value; + } + } + + /// + public string name { + get { + return this.nameField; + } + set { + this.nameField = value; + } + } + + /// + public string status { + get { + return this.statusField; + } + set { + this.statusField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class RemoteValidationResult { + + private string[] validationErrorsField; + + private RequiredResource[] requiredResourcesField; + + /// + [System.Xml.Serialization.XmlArrayItemAttribute("ArrayOfString")] + public string[] validationErrors { + get { + return this.validationErrorsField; + } + set { + this.validationErrorsField = value; + } + } + + /// + [System.Xml.Serialization.XmlArrayItemAttribute("ArrayOfRequiredResource")] + public RequiredResource[] requiredResources { + get { + return this.requiredResourcesField; + } + set { + this.requiredResourcesField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class ArrayOfRequiredResource { + + private RequiredResource[] arrayOfRequiredResource1Field; + + /// + [System.Xml.Serialization.XmlElementAttribute("ArrayOfRequiredResource", IsNullable=true)] + public RequiredResource[] ArrayOfRequiredResource1 { + get { + return this.arrayOfRequiredResource1Field; + } + set { + this.arrayOfRequiredResource1Field = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class CmdTriggerDeviceNotification { + + private EAttachedDeviceType deviceTypeField; + + /// + public EAttachedDeviceType deviceType { + get { + return this.deviceTypeField; + } + set { + this.deviceTypeField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + public enum EAttachedDeviceType { + + /// + eDeviceType_Module, + + /// + eDeviceType_ISMSensor, + + /// + eDeviceType_ISMSensor_pHAnalog, + + /// + eDeviceType_ISMSensor_pHDigital, + + /// + eDeviceType_ISMSensor_CondAnalog, + + /// + eDeviceType_ISMSensor_CondDigital, + + /// + eDeviceType_ISMSensor_DOAnalog, + + /// + eDeviceType_ISMSensor_DODigital, + + /// + eDeviceType_FingerprintReader, + + /// + eDeviceType_SampleChanger, + + /// + eDeviceType_BarcodeReader, + + /// + eDeviceType_USBStick, + + /// + eDeviceType_Stirrer, + + /// + eDeviceType_USBLinePrinter, + + /// + eDeviceType_RS232Printer, + + /// + eDeviceType_PC, + + /// + eDeviceType_Rondolino, + + /// + eDeviceType_InMotion, + + /// + eDeviceType_InMotionRack, + + /// + eDeviceType_InMotionChannel, + + /// + eDeviceType_None, + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class CmdTriggerStirrer { + + private bool switchOnField; + + private EStirSpeed speedField; + + /// + public bool switchOn { + get { + return this.switchOnField; + } + set { + this.switchOnField = value; + } + } + + /// + public EStirSpeed speed { + get { + return this.speedField; + } + set { + this.speedField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + public enum EStirSpeed { + + /// + eStirSpeedid_StirSpeed_10Percent, + + /// + eStirSpeedid_StirSpeed_20Percent, + + /// + eStirSpeedid_StirSpeed_30Percent, + + /// + eStirSpeedid_StirSpeed_40Percent, + + /// + eStirSpeedid_StirSpeed_50Percent, + + /// + eStirSpeedid_StirSpeed_60Percent, + + /// + eStirSpeedid_StirSpeed_70Percent, + + /// + eStirSpeedid_StirSpeed_80Percent, + + /// + eStirSpeedid_StirSpeed_90Percent, + + /// + eStirSpeedid_StirSpeed_100Percent, + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class CmdTriggerBeep { + + private BeepConfig beepConfigField; + + /// + public BeepConfig beepConfig { + get { + return this.beepConfigField; + } + set { + this.beepConfigField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class BeepConfig { + + private int beepMillisecondsField; + + private int silentMillisecondsField; + + private short repeatTimesField; + + /// + public int beepMilliseconds { + get { + return this.beepMillisecondsField; + } + set { + this.beepMillisecondsField = value; + } + } + + /// + public int silentMilliseconds { + get { + return this.silentMillisecondsField; + } + set { + this.silentMillisecondsField = value; + } + } + + /// + public short repeatTimes { + get { + return this.repeatTimesField; + } + set { + this.repeatTimesField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class CmdInteractionResponse { + + private int interactionIDField; + + private EInteractionResponse responseTypeField; + + /// + public int interactionID { + get { + return this.interactionIDField; + } + set { + this.interactionIDField = value; + } + } + + /// + public EInteractionResponse responseType { + get { + return this.responseTypeField; + } + set { + this.responseTypeField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + public enum EInteractionResponse { + + /// + eYes, + + /// + eNo, + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class CmdSamplerMoveRackRecord { + + private EAutosamplerGoto rackGotoField; + + private EAutosamplerDirection directionField; + + private short beakerPositionOrStepField; + + private ELiftPosition liftPositionField; + + /// + public EAutosamplerGoto rackGoto { + get { + return this.rackGotoField; + } + set { + this.rackGotoField = value; + } + } + + /// + public EAutosamplerDirection direction { + get { + return this.directionField; + } + set { + this.directionField = value; + } + } + + /// + public short beakerPositionOrStep { + get { + return this.beakerPositionOrStepField; + } + set { + this.beakerPositionOrStepField = value; + } + } + + /// + public ELiftPosition liftPosition { + get { + return this.liftPositionField; + } + set { + this.liftPositionField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + public enum EAutosamplerGoto { + + /// + eAutosamplerGoto_Home, + + /// + eAutosamplerGoto_RelativePosition, + + /// + eAutosamplerGoto_AbsolutePosition, + + /// + eAutosamplerGoto_NextBeaker, + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + public enum EAutosamplerDirection { + + /// + eSamplerDirection_Forward, + + /// + eSamplerDirection_Backward, + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + public enum ELiftPosition { + + /// + eLiftPosition_Undefined, + + /// + eLiftPosition_Sample, + + /// + eLiftPosition_CondMeas, + + /// + eLiftPosition_Rotate, + + /// + eLiftPosition_Rinse, + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class ResponseSamplerCmdRecord { + + private ECmdResultTF cmdResultField; + + private EErrorReasonTF errorReasonField; + + private EErrorSourceTF errorSourceField; + + private EErrorDetailTF errorDetailField; + + /// + public ECmdResultTF cmdResult { + get { + return this.cmdResultField; + } + set { + this.cmdResultField = value; + } + } + + /// + public EErrorReasonTF errorReason { + get { + return this.errorReasonField; + } + set { + this.errorReasonField = value; + } + } + + /// + public EErrorSourceTF errorSource { + get { + return this.errorSourceField; + } + set { + this.errorSourceField = value; + } + } + + /// + public EErrorDetailTF errorDetail { + get { + return this.errorDetailField; + } + set { + this.errorDetailField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + public enum ECmdResultTF { + + /// + eCmdAccepted, + + /// + eCmdAcceptedAndExecuted, + + /// + eCmdRejectionUnknownCmd, + + /// + eCmdRejectionNotImplemented, + + /// + eCmdRejectionInternalError, + + /// + eCmdRejectionParameterRange, + + /// + eCmdRejectionWrongCmd, + + /// + eCmdRejectionDeviceNotPresent, + + /// + eCmdRejectionWrongConfig, + + /// + eCmdRejectionWrongState, + + /// + eCmdRejectionInvalidFwImage, + + /// + eCmdRejectionCrcError, + + /// + eCmdRejectionInternalFlashError, + + /// + eCmdRejectionExternalFlashError, + + /// + eCmdRejectionRackNotReady, + + /// + eCmdRejectionLiftNotReady, + + /// + eCmdRejectionXYZNotReady, + + /// + eCmdRejectionLiftInWrongPosition, + + /// + eCmdRejectionRackInWrongPosition, + + /// + eCmdRejectionCalcTargetLiftFailed, + + /// + eCmdRejectionCalcTargetRackFailed, + + /// + eCmdRejectionWrongMotorState, + + /// + eCmdRejectionGetPresentCallDenied, + + /// + eCmdRejectionOneWireNotPresent, + + /// + eCmdRejectionOneWireAccessError, + + /// + eCmdRejectionOneWireReadError, + + /// + eCmdRejectionOneWireWriteError, + + /// + eCmdRejectionOneWireTypeWrong, + + /// + eCmdRejectionChannelNotPresent, + + /// + eCmdRejectionChannelInUse, + + /// + eCmdRejectionChannelLocked, + + /// + eCmdRejectionAliquotationDenied, + + /// + eCmdRejectionRackAtAliquotation, + + /// + eCmdRejectionRfidUnknownReader, + + /// + eCmdRejectionRfidBadBlockAlign, + + /// + eCmdRejectionRfidReaderError, + + /// + eCmdRejectionRfidNoContactlessDevice, + + /// + eCmdRejectionRfidReaderComm, + + /// + eCmdRejectionRfidTooManyContactlessDev, + + /// + eCmdRejectionRfidNoRespFromContactlessDev, + + /// + eCmdRejectionRfidBadRespFromContactlessDev, + + /// + eCmdRejectionRfidViccCommandError, + + /// + eCmdRejectionRfidViccBlockOutOfRange, + + /// + eCmdRejectionRfidViccGeneralError, + + /// + eCmdRejectionRfidWriteError, + + /// + eCmdRejectionSampleReaderDeviceBusy, + + /// + eCmdRejectionSampleReaderIsReadOnly, + + /// + eCmdRejectionRackTypeNotValid, + + /// + eCmdRejectionRackTypeHasNoCoverUp, + + /// + eCmdRejectionRackTypeHasNoHandlingStation, + + /// + eCmdRejectionLiftBlockedByBeaker, + + /// + eCmdRejectionNoDataAvailable, + + /// + eCmdRejectionArmNotAtAliquotation, + + /// + eCmdRejectionWrongDirection, + + /// + eCmdRejectionWrongRate, + + /// + eCmdRejectionWrongRowForSampleData, + + /// + eCmdRejectionCOD_Denied, + + /// + eCmdRejectionMoveToAliquotationBeakerDenied, + + /// + eCmdTimeout, + + /// + eCmdSendError, + + /// + eCmdCanceled, + + /// + eCmdSuccess, + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + public enum EErrorReasonTF { + + /// + eErrorInternalError, + + /// + eErrorMotorControlFailure, + + /// + eErrorMotorHardwareFailure, + + /// + eErrorMotorTimeoutFailure, + + /// + eErrorRackBlocked, + + /// + eErrorRackMovedInStopped, + + /// + eErrorMotorLostHomePosition, + + /// + eErrorMotorLostRotationPosition, + + /// + eErrorMotorMissedRotationPosition, + + /// + eErrorHomingFailed, + + /// + eErrorConnectionLost, + + /// + eErrorIOExpander, + + /// + eErrorStopInHoming, + + /// + eErrorI2CEepromFailure, + + /// + eErrorRackParameterFailure, + + /// + eErrorOverCurrent, + + /// + eErrorRfidReaderFailure, + + /// + eErrorLongTermTestFailure, + + /// + eErrorLowVoltage, + + /// + eErrorConfigurationError, + + /// + eErrorBarcodeReaderError, + + /// + eErrorWrongPnPDevice, + + /// + eErrorWrongOneWireDevice, + + /// + eErrorTooManyOneWireDevices, + + /// + eErrorNotTypification, + + /// + eErrorCalibrationData, + + /// + eErrorMotorDriverBoardDefect, + + /// + eErrorMotorMoveFailed, + + /// + eErrorTooManyOptionBoards, + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + public enum EErrorSourceTF { + + /// + eErrorSourceMainBoard, + + /// + eErrorSourceRack, + + /// + eErrorSourceTowerA, + + /// + eErrorSourceTowerB, + + /// + eErrorSourceXYZLogic, + + /// + eErrorSourceFunctionOptionBoard, + + /// + eErrorSourceDataOptionBoard, + + /// + eErrorSourceKFBoard, + + /// + eErrorSourcePressureBoard, + + /// + eErrorSourceUSB, + + /// + eErrorSourceMotorX, + + /// + eErrorSourceMotorY1, + + /// + eErrorSourceMotorZ1, + + /// + eErrorSourceMotorY2, + + /// + eErrorSourceMotorZ2, + + /// + eErrorSourcePump1b, + + /// + eErrorSourcePump2a, + + /// + eErrorSourcePump2b, + + /// + eErrorSourcePump3a, + + /// + eErrorSourcePump3b, + + /// + eErrorSourcePump4a, + + /// + eErrorSourcePump4b, + + /// + eErrorSourcePump5a, + + /// + eErrorSourcePump5b, + + /// + eErrorSourcePump6a, + + /// + eErrorSourcePump6b, + + /// + eErrorSourceStirrer1, + + /// + eErrorSourceStirrer2, + + /// + eErrorSourceStirrer3, + + /// + eErrorSourceStirrer4, + + /// + eErrorSourceStirrer5, + + /// + eErrorSourceStirrer6, + + /// + eErrorSourceLedGreenTowerA, + + /// + eErrorSourceLedRedTowerA, + + /// + eErrorSourceLedGreenTowerB, + + /// + eErrorSourceLedRedTowerB, + + /// + eErrorSourceBuzzerTowerA, + + /// + eErrorSourceBuzzerTowerB, + + /// + eErrorSourceCoverUp, + + /// + eErrorSourceCoverUp1, + + /// + eErrorSourceCoverUp2, + + /// + eErrorSourceCoverUp3, + + /// + eErrorSourceCoverUp4, + + /// + eErrorSourceCoverUp5, + + /// + eErrorSourceRFID1, + + /// + eErrorSourceRFID2, + + /// + eErrorSourceBarcode1, + + /// + eErrorSourceBarcode2, + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + public enum EErrorDetailTF { + + /// + eErrorDetailNone, + + /// + eErrorDetailSteppermotor, + + /// + eErrorDetailGoUntil, + + /// + eErrorDetailGetParameter, + + /// + eErrorDetailGetPosition, + + /// + eErrorDetailRun, + + /// + eErrorDetailSetParameter, + + /// + eErrorDetailQeiAtStart, + + /// + eErrorDetailQeiAtStopped, + + /// + eErrorDetailQeiAtMoving, + + /// + eErrorDetailGoto, + + /// + eErrorDetailStop, + + /// + eErrorDetailReleaseSW, + + /// + eErrorDetailHomeSensorIntrDuringReleaseSW, + + /// + eErrorDetailHomeSensorIntrGoto, + + /// + eErrorDetailHomingMove, + + /// + eErrorDetailStopRack, + + /// + eErrorDetailStopLift, + + /// + eErrorDetailUserManipulation, + + /// + eErrorDetailBeakerDetectionTooEarly, + + /// + eErrorDetailFlash, + + /// + eErrorDetailOneWire, + + /// + eErrorDetailIOExpanderError, + + /// + eErrorDetailIOExpanderParam, + + /// + eErrorDetailIOExpanderNotPresent, + + /// + eErrorDetailIOExpanderPlausibilityFailure, + + /// + eErrorDetailIOExpanderNotSupported, + + /// + eErrorDetailPWMExpanderError, + + /// + eErrorDetailMoveLiftUp, + + /// + eErrorDetailMoveRack, + + /// + eErrorDetailMoveLiftDown, + + /// + eErrorDetailYwithoutZ, + + /// + eErrorDetailYwithoutX, + + /// + eErrorDetailNoMotorDetected, + + /// + eErrorDetailNoI2CEepromDetected, + + /// + eErrorDetailRackPlatformWrong, + + /// + eErrorDetailRfidInventaryFailure, + + /// + eErrorDetailRfidPollingFailure, + + /// + eErrorDetailRfidReadFailure, + + /// + eErrorDetailRfidWriteFailure, + + /// + eErrorDetailRfidComFailure, + + /// + eErrorDetailRfidIntFailure, + + /// + eErrorDetailLifeSignMissing, + + /// + eErrorDetailUSBConnectionLost, + + /// + eErrorDetailUserFailure, + + /// + eErrorDetailTypificationChecksum, + + /// + eErrorDetailTypificationDeviceType, + + /// + eErrorDetailTypificationHWRevision, + + /// + eErrorDetailTypificationPlatform, + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class ResponseSamplerMoveRackRecord { + + private ECmdResultTF cmdResultField; + + private short beakerPositionField; + + private bool isBeakerAvailableField; + + /// + public ECmdResultTF cmdResult { + get { + return this.cmdResultField; + } + set { + this.cmdResultField = value; + } + } + + /// + public short beakerPosition { + get { + return this.beakerPositionField; + } + set { + this.beakerPositionField = value; + } + } + + /// + public bool isBeakerAvailable { + get { + return this.isBeakerAvailableField; + } + set { + this.isBeakerAvailableField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class CmdSamplerMoveLiftRecord { + + private ELiftPosition liftPositionField; + + /// + public ELiftPosition liftPosition { + get { + return this.liftPositionField; + } + set { + this.liftPositionField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class CmdSamplerPowerShowerRecord { + + private short rinseCyclesField; + + private short volumePerCycleField; + + /// + public short rinseCycles { + get { + return this.rinseCyclesField; + } + set { + this.rinseCyclesField = value; + } + } + + /// + public short volumePerCycle { + get { + return this.volumePerCycleField; + } + set { + this.volumePerCycleField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class CmdSamplerStopRecord { + + private ESamplerStop stopModeField; + + /// + public ESamplerStop stopMode { + get { + return this.stopModeField; + } + set { + this.stopModeField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + public enum ESamplerStop { + + /// + eSamplerStop_Rack, + + /// + eSamplerStop_Lift, + + /// + eSamplerStop_All, + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class CmdResetRecord { + + private EResetOption resetOptionField; + + /// + public EResetOption resetOption { + get { + return this.resetOptionField; + } + set { + this.resetOptionField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + public enum EResetOption { + + /// + eResetOption_Device, + + /// + eResetOption_Protocol, + + /// + eResetOption_All, + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class RemoteUserSettings { + + private EColor m_settingsColorField; + + private EScreenBrightness m_settingsBrightnessField; + + private EButtonShape m_buttonShapeField; + + private bool m_screenSaverField; + + private short m_screenSaverWaitingTimeField; + + private EAlphanumericKeyboard m_alphanumericKeyboardField; + + private ENumericKeyboard m_numericKeyboardField; + + /// + public EColor m_settingsColor { + get { + return this.m_settingsColorField; + } + set { + this.m_settingsColorField = value; + } + } + + /// + public EScreenBrightness m_settingsBrightness { + get { + return this.m_settingsBrightnessField; + } + set { + this.m_settingsBrightnessField = value; + } + } + + /// + public EButtonShape m_buttonShape { + get { + return this.m_buttonShapeField; + } + set { + this.m_buttonShapeField = value; + } + } + + /// + public bool m_screenSaver { + get { + return this.m_screenSaverField; + } + set { + this.m_screenSaverField = value; + } + } + + /// + public short m_screenSaverWaitingTime { + get { + return this.m_screenSaverWaitingTimeField; + } + set { + this.m_screenSaverWaitingTimeField = value; + } + } + + /// + public EAlphanumericKeyboard m_alphanumericKeyboard { + get { + return this.m_alphanumericKeyboardField; + } + set { + this.m_alphanumericKeyboardField = value; + } + } + + /// + public ENumericKeyboard m_numericKeyboard { + get { + return this.m_numericKeyboardField; + } + set { + this.m_numericKeyboardField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + public enum EColor { + + /// + eColorid_Color_Grey, + + /// + eColorid_Color_Blue, + + /// + eColorid_Color_Green, + + /// + eColorid_Color_Red, + + /// + eColorid_Color_GreyLight, + + /// + eColorid_Color_BlueLight, + + /// + eColorid_Color_GreenLight, + + /// + eColorid_Color_RedLight, + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + public enum EScreenBrightness { + + /// + eScreenBrightnessid_ScreenBrightness_50, + + /// + eScreenBrightnessid_ScreenBrightness_60, + + /// + eScreenBrightnessid_ScreenBrightness_70, + + /// + eScreenBrightnessid_ScreenBrightness_80, + + /// + eScreenBrightnessid_ScreenBrightness_90, + + /// + eScreenBrightnessid_ScreenBrightness_100, + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + public enum EButtonShape { + + /// + eButtonShapeid_ButtonShape_Roundly, + + /// + eButtonShapeid_ButtonShape_Angularly, + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + public enum EAlphanumericKeyboard { + + /// + eAlphanumericKeyboardid_AlphanumericKeyboard_English, + + /// + eAlphanumericKeyboardid_AlphanumericKeyboard_French, + + /// + eAlphanumericKeyboardid_AlphanumericKeyboard_German, + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + public enum ENumericKeyboard { + + /// + eNumericKeyboardid_NumericKeyboard_Calculator, + + /// + eNumericKeyboardid_NumericKeyboard_Handy, + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class RemoteLanguageInfo { + + private ELanguage m_languageField; + + /// + public ELanguage m_language { + get { + return this.m_languageField; + } + set { + this.m_languageField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + public enum ELanguage { + + /// + eLanguageid_Language_German, + + /// + eLanguageid_Language_English, + + /// + eLanguageid_Language_French, + + /// + eLanguageid_Language_Italian, + + /// + eLanguageid_Language_Spanish, + + /// + eLanguageid_Language_Chinese, + + /// + eLanguageid_Language_Russian, + + /// + eLanguageid_Language_Japanese, + + /// + eLanguageid_Language_Korean, + + /// + eLanguageid_Language_Portuguese, + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class Remote_MTServiceRecord { + + private System.DateTime m_startupDateField; + + private System.DateTime m_lastServiceField; + + private System.DateTime m_nextServiceField; + + /// + public System.DateTime m_startupDate { + get { + return this.m_startupDateField; + } + set { + this.m_startupDateField = value; + } + } + + /// + public System.DateTime m_lastService { + get { + return this.m_lastServiceField; + } + set { + this.m_lastServiceField = value; + } + } + + /// + public System.DateTime m_nextService { + get { + return this.m_nextServiceField; + } + set { + this.m_nextServiceField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class PnPStatus { + + private EPnPStatus m_status_HandBCRField; + + private EPnPStatus m_status_BuildInBCRField; + + private EPnPStatus m_status_LinePrinterField; + + private EPnPStatus m_status_FingerprintReaderField; + + private EPnPStatus m_status_USBStickField; + + /// + public EPnPStatus m_status_HandBCR { + get { + return this.m_status_HandBCRField; + } + set { + this.m_status_HandBCRField = value; + } + } + + /// + public EPnPStatus m_status_BuildInBCR { + get { + return this.m_status_BuildInBCRField; + } + set { + this.m_status_BuildInBCRField = value; + } + } + + /// + public EPnPStatus m_status_LinePrinter { + get { + return this.m_status_LinePrinterField; + } + set { + this.m_status_LinePrinterField = value; + } + } + + /// + public EPnPStatus m_status_FingerprintReader { + get { + return this.m_status_FingerprintReaderField; + } + set { + this.m_status_FingerprintReaderField = value; + } + } + + /// + public EPnPStatus m_status_USBStick { + get { + return this.m_status_USBStickField; + } + set { + this.m_status_USBStickField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + public enum EPnPStatus { + + /// + ePnPStatusid_PnPStatus_Installed, + + /// + ePnPStatusid_PnPStatus_NotInstalled, + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class GeneralheaderRecord { + + private string m_requestTypeNameField; + + private ulong m_requestIDField; + + /// + public string m_requestTypeName { + get { + return this.m_requestTypeNameField; + } + set { + this.m_requestTypeNameField = value; + } + } + + /// + public ulong m_requestID { + get { + return this.m_requestIDField; + } + set { + this.m_requestIDField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class Response_SimpleResultRecord { + + private bool m_bSuccessField; + + private string m_errorReasonField; + + /// + public bool m_bSuccess { + get { + return this.m_bSuccessField; + } + set { + this.m_bSuccessField = value; + } + } + + /// + public string m_errorReason { + get { + return this.m_errorReasonField; + } + set { + this.m_errorReasonField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class Response_StatusRecord { + + private string m_statusField; + + /// + public string m_status { + get { + return this.m_statusField; + } + set { + this.m_statusField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class Request_moduleSetRecord { + + private string m_moduleIdField; + + private string m_sensorIdField; + + /// + public string m_moduleId { + get { + return this.m_moduleIdField; + } + set { + this.m_moduleIdField = value; + } + } + + /// + public string m_sensorId { + get { + return this.m_sensorIdField; + } + set { + this.m_sensorIdField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class moduleConfigParamRecord { + + private string m_moduleIdField; + + private string m_sensorIdField; + + private string m_tempSensorIdField; + + /// + public string m_moduleId { + get { + return this.m_moduleIdField; + } + set { + this.m_moduleIdField = value; + } + } + + /// + public string m_sensorId { + get { + return this.m_sensorIdField; + } + set { + this.m_sensorIdField = value; + } + } + + /// + public string m_tempSensorId { + get { + return this.m_tempSensorIdField; + } + set { + this.m_tempSensorIdField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class Response_moduleGetRecord { + + private moduleConfigParamRecord[] m_moduleConfigsField; + + /// + [System.Xml.Serialization.XmlArrayItemAttribute("ArrayOfModuleConfigParamRecord")] + public moduleConfigParamRecord[] m_moduleConfigs { + get { + return this.m_moduleConfigsField; + } + set { + this.m_moduleConfigsField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class ArrayOfModuleConfigParamRecord { + + private moduleConfigParamRecord[] arrayOfModuleConfigParamRecord1Field; + + /// + [System.Xml.Serialization.XmlElementAttribute("ArrayOfModuleConfigParamRecord", IsNullable=true)] + public moduleConfigParamRecord[] ArrayOfModuleConfigParamRecord1 { + get { + return this.arrayOfModuleConfigParamRecord1Field; + } + set { + this.arrayOfModuleConfigParamRecord1Field = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class Request_methodParamsRecord { + + private string m_methodIdField; + + private string[] m_sensorIDsField; + + private string m_sampleIdField; + + private string m_userIdField; + + private string m_commentField; + + private bool m_bLocalStoreField; + + /// + public string m_methodId { + get { + return this.m_methodIdField; + } + set { + this.m_methodIdField = value; + } + } + + /// + [System.Xml.Serialization.XmlArrayItemAttribute("ArrayOfString")] + public string[] m_sensorIDs { + get { + return this.m_sensorIDsField; + } + set { + this.m_sensorIDsField = value; + } + } + + /// + public string m_sampleId { + get { + return this.m_sampleIdField; + } + set { + this.m_sampleIdField = value; + } + } + + /// + public string m_userId { + get { + return this.m_userIdField; + } + set { + this.m_userIdField = value; + } + } + + /// + public string m_comment { + get { + return this.m_commentField; + } + set { + this.m_commentField = value; + } + } + + /// + public bool m_bLocalStore { + get { + return this.m_bLocalStoreField; + } + set { + this.m_bLocalStoreField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class Response_startMethodRecord { + + private string m_methodIdField; + + private short m_jobIdField; + + /// + public string m_methodId { + get { + return this.m_methodIdField; + } + set { + this.m_methodIdField = value; + } + } + + /// + public short m_jobId { + get { + return this.m_jobIdField; + } + set { + this.m_jobIdField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class Request_terminateMethodRecord { + + private short m_jobIdField; + + /// + public short m_jobId { + get { + return this.m_jobIdField; + } + set { + this.m_jobIdField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class Request_loginRecord { + + private string[] m_usernamesField; + + /// + [System.Xml.Serialization.XmlArrayItemAttribute("ArrayOfString")] + public string[] m_usernames { + get { + return this.m_usernamesField; + } + set { + this.m_usernamesField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class Response_loginRecord { + + private string m_usernameField; + + private string m_passwordField; + + /// + public string m_username { + get { + return this.m_usernameField; + } + set { + this.m_usernameField = value; + } + } + + /// + public string m_password { + get { + return this.m_passwordField; + } + set { + this.m_passwordField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class Request_setupGetItemListRecord { + + private string m_itemTypeField; + + /// + public string m_itemType { + get { + return this.m_itemTypeField; + } + set { + this.m_itemTypeField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class Response_setupGetItemListRecord { + + private string[] m_itemListField; + + /// + [System.Xml.Serialization.XmlArrayItemAttribute("ArrayOfString")] + public string[] m_itemList { + get { + return this.m_itemListField; + } + set { + this.m_itemListField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class SettingItemRecord { + + private string m_itemNameField; + + private string m_itemValueField; + + /// + public string m_itemName { + get { + return this.m_itemNameField; + } + set { + this.m_itemNameField = value; + } + } + + /// + public string m_itemValue { + get { + return this.m_itemValueField; + } + set { + this.m_itemValueField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class Request_getSettingRecord { + + private string m_settingNameField; + + /// + public string m_settingName { + get { + return this.m_settingNameField; + } + set { + this.m_settingNameField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class Response_getSettingRecord { + + private string m_settingNameField; + + private string m_settingValueField; + + /// + public string m_settingName { + get { + return this.m_settingNameField; + } + set { + this.m_settingNameField = value; + } + } + + /// + public string m_settingValue { + get { + return this.m_settingValueField; + } + set { + this.m_settingValueField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class Request_setSettingRecord { + + private string m_settingNameField; + + private string m_settingValueField; + + /// + public string m_settingName { + get { + return this.m_settingNameField; + } + set { + this.m_settingNameField = value; + } + } + + /// + public string m_settingValue { + get { + return this.m_settingValueField; + } + set { + this.m_settingValueField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class Request_setupExportRecord { + + private string m_itemGroupField; + + private string m_itemNameField; + + /// + public string m_itemGroup { + get { + return this.m_itemGroupField; + } + set { + this.m_itemGroupField = value; + } + } + + /// + public string m_itemName { + get { + return this.m_itemNameField; + } + set { + this.m_itemNameField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class Notification_ISMChangeRecord { + + private string m_deviceTypeField; + + private string m_sensorNameField; + + private bool m_bPluginField; + + private short m_moduleIdField; + + /// + public string m_deviceType { + get { + return this.m_deviceTypeField; + } + set { + this.m_deviceTypeField = value; + } + } + + /// + public string m_sensorName { + get { + return this.m_sensorNameField; + } + set { + this.m_sensorNameField = value; + } + } + + /// + public bool m_bPlugin { + get { + return this.m_bPluginField; + } + set { + this.m_bPluginField = value; + } + } + + /// + public short m_moduleId { + get { + return this.m_moduleIdField; + } + set { + this.m_moduleIdField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class ModuleRecord { + + private string m_moduleNameField; + + private EModuleID m_moduleIDField; + + private EGModuleType m_moduleTypeField; + + private string m_serialNumberField; + + private string m_softwareVersionField; + + private bool m_isActivedField; + + private string m_sensorIDField; + + private string m_sensorUUIDField; + + private ESensorType m_sensorTypeField; + + private ESensorClass m_sensorClassField; + + private System.DateTime m_calDateField; + + private string m_calCreatorField; + + private string m_temperatureSensorIDField; + + private string m_temperatureSensorUUIDField; + + private bool m_printField; + + private EReportFormat m_printFormatField; + + private bool m_stirFlagField; + + private short m_stirSpeedField; + + private bool m_reportValueCalculationField; + + private bool m_reportDataField; + + private bool m_reportInfoField; + + /// + public string m_moduleName { + get { + return this.m_moduleNameField; + } + set { + this.m_moduleNameField = value; + } + } + + /// + public EModuleID m_moduleID { + get { + return this.m_moduleIDField; + } + set { + this.m_moduleIDField = value; + } + } + + /// + public EGModuleType m_moduleType { + get { + return this.m_moduleTypeField; + } + set { + this.m_moduleTypeField = value; + } + } + + /// + public string m_serialNumber { + get { + return this.m_serialNumberField; + } + set { + this.m_serialNumberField = value; + } + } + + /// + public string m_softwareVersion { + get { + return this.m_softwareVersionField; + } + set { + this.m_softwareVersionField = value; + } + } + + /// + public bool m_isActived { + get { + return this.m_isActivedField; + } + set { + this.m_isActivedField = value; + } + } + + /// + public string m_sensorID { + get { + return this.m_sensorIDField; + } + set { + this.m_sensorIDField = value; + } + } + + /// + public string m_sensorUUID { + get { + return this.m_sensorUUIDField; + } + set { + this.m_sensorUUIDField = value; + } + } + + /// + public ESensorType m_sensorType { + get { + return this.m_sensorTypeField; + } + set { + this.m_sensorTypeField = value; + } + } + + /// + public ESensorClass m_sensorClass { + get { + return this.m_sensorClassField; + } + set { + this.m_sensorClassField = value; + } + } + + /// + public System.DateTime m_calDate { + get { + return this.m_calDateField; + } + set { + this.m_calDateField = value; + } + } + + /// + public string m_calCreator { + get { + return this.m_calCreatorField; + } + set { + this.m_calCreatorField = value; + } + } + + /// + public string m_temperatureSensorID { + get { + return this.m_temperatureSensorIDField; + } + set { + this.m_temperatureSensorIDField = value; + } + } + + /// + public string m_temperatureSensorUUID { + get { + return this.m_temperatureSensorUUIDField; + } + set { + this.m_temperatureSensorUUIDField = value; + } + } + + /// + public bool m_print { + get { + return this.m_printField; + } + set { + this.m_printField = value; + } + } + + /// + public EReportFormat m_printFormat { + get { + return this.m_printFormatField; + } + set { + this.m_printFormatField = value; + } + } + + /// + public bool m_stirFlag { + get { + return this.m_stirFlagField; + } + set { + this.m_stirFlagField = value; + } + } + + /// + public short m_stirSpeed { + get { + return this.m_stirSpeedField; + } + set { + this.m_stirSpeedField = value; + } + } + + /// + public bool m_reportValueCalculation { + get { + return this.m_reportValueCalculationField; + } + set { + this.m_reportValueCalculationField = value; + } + } + + /// + public bool m_reportData { + get { + return this.m_reportDataField; + } + set { + this.m_reportDataField = value; + } + } + + /// + public bool m_reportInfo { + get { + return this.m_reportInfoField; + } + set { + this.m_reportInfoField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + public enum EGModuleType { + + /// + eGModuleTypeid_GModuleType_None, + + /// + eGModuleTypeid_GModuleType_PHIsfet, + + /// + eGModuleTypeid_GModuleType_PHIon, + + /// + eGModuleTypeid_GModuleType_Cond, + + /// + eGModuleTypeid_GModuleType_DO, + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + public enum EReportFormat { + + /// + eReportFormatid_ReportFormat_Summary, + + /// + eReportFormatid_ReportFormat_UserDefined, + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class MFTitleRecord { + + private EMethodType m_methodTypeIDField; + + private string m_methodIDField; + + private string m_methodTitleField; + + private string m_methodCreatedUserField; + + private System.DateTime m_methodCreatedTimeField; + + private string m_methodModifiedUserField; + + private System.DateTime m_methodModifiedTimeField; + + private bool m_methodProtectedField; + + private bool m_methodSOPFlagField; + + private string m_methodSOPTextField; + + /// + public EMethodType m_methodTypeID { + get { + return this.m_methodTypeIDField; + } + set { + this.m_methodTypeIDField = value; + } + } + + /// + public string m_methodID { + get { + return this.m_methodIDField; + } + set { + this.m_methodIDField = value; + } + } + + /// + public string m_methodTitle { + get { + return this.m_methodTitleField; + } + set { + this.m_methodTitleField = value; + } + } + + /// + public string m_methodCreatedUser { + get { + return this.m_methodCreatedUserField; + } + set { + this.m_methodCreatedUserField = value; + } + } + + /// + public System.DateTime m_methodCreatedTime { + get { + return this.m_methodCreatedTimeField; + } + set { + this.m_methodCreatedTimeField = value; + } + } + + /// + public string m_methodModifiedUser { + get { + return this.m_methodModifiedUserField; + } + set { + this.m_methodModifiedUserField = value; + } + } + + /// + public System.DateTime m_methodModifiedTime { + get { + return this.m_methodModifiedTimeField; + } + set { + this.m_methodModifiedTimeField = value; + } + } + + /// + public bool m_methodProtected { + get { + return this.m_methodProtectedField; + } + set { + this.m_methodProtectedField = value; + } + } + + /// + public bool m_methodSOPFlag { + get { + return this.m_methodSOPFlagField; + } + set { + this.m_methodSOPFlagField = value; + } + } + + /// + public string m_methodSOPText { + get { + return this.m_methodSOPTextField; + } + set { + this.m_methodSOPTextField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + public enum EMethodType { + + /// + eMethodTypeid_MethodType_Measure, + + /// + eMethodTypeid_MethodType_Calibration, + + /// + eMethodTypeid_MethodType_SensorTest, + + /// + eMethodTypeid_MethodType_Interval, + + /// + eMethodTypeid_MethodType_Incremental, + + /// + eMethodTypeid_MethodType_OUR, + + /// + eMethodTypeid_MethodType_SOUR, + + /// + eMethodTypeid_MethodType_BOD, + + /// + eMethodTypeid_MethodType_BCV, + + /// + eMethodTypeid_MethodType_DirectMeasure, + + /// + eMethodTypeid_MethodType_DirectCalibration, + + /// + eMethodTypeid_MethodType_Service, + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class ResultInfoRecord { + + private short m_moduleTypeField; + + private string m_moduleSNField; + + private short m_sensorTypeField; + + private short m_sensorClassField; + + private string m_sensorNameField; + + private string m_sensorSerialNumberField; + + private short m_eIonTypeField; + + private short m_eIonChargeField; + + private decfloat m_ionMolarMassField; + + private System.DateTime m_calDateField; + + private string m_calCreatorField; + + private short m_eTemperatureCaptureField; + + private string m_tempSensorField; + + private string m_tempSensorSNField; + + /// + public short m_moduleType { + get { + return this.m_moduleTypeField; + } + set { + this.m_moduleTypeField = value; + } + } + + /// + public string m_moduleSN { + get { + return this.m_moduleSNField; + } + set { + this.m_moduleSNField = value; + } + } + + /// + public short m_sensorType { + get { + return this.m_sensorTypeField; + } + set { + this.m_sensorTypeField = value; + } + } + + /// + public short m_sensorClass { + get { + return this.m_sensorClassField; + } + set { + this.m_sensorClassField = value; + } + } + + /// + public string m_sensorName { + get { + return this.m_sensorNameField; + } + set { + this.m_sensorNameField = value; + } + } + + /// + public string m_sensorSerialNumber { + get { + return this.m_sensorSerialNumberField; + } + set { + this.m_sensorSerialNumberField = value; + } + } + + /// + public short m_eIonType { + get { + return this.m_eIonTypeField; + } + set { + this.m_eIonTypeField = value; + } + } + + /// + public short m_eIonCharge { + get { + return this.m_eIonChargeField; + } + set { + this.m_eIonChargeField = value; + } + } + + /// + public decfloat m_ionMolarMass { + get { + return this.m_ionMolarMassField; + } + set { + this.m_ionMolarMassField = value; + } + } + + /// + public System.DateTime m_calDate { + get { + return this.m_calDateField; + } + set { + this.m_calDateField = value; + } + } + + /// + public string m_calCreator { + get { + return this.m_calCreatorField; + } + set { + this.m_calCreatorField = value; + } + } + + /// + public short m_eTemperatureCapture { + get { + return this.m_eTemperatureCaptureField; + } + set { + this.m_eTemperatureCaptureField = value; + } + } + + /// + public string m_tempSensor { + get { + return this.m_tempSensorField; + } + set { + this.m_tempSensorField = value; + } + } + + /// + public string m_tempSensorSN { + get { + return this.m_tempSensorSNField; + } + set { + this.m_tempSensorSNField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class MFConfigurationRecord { + + private EMeasurementType m_measType1Field; + + private string m_sensor1Field; + + private ETemperatureCapture m_tempCapture1Field; + + private string m_tempSensor1Field; + + private EBarometricCapture m_barometricCapture1Field; + + private EMeasurementType m_measType2Field; + + private string m_sensor2Field; + + private ETemperatureCapture m_tempCapture2Field; + + private string m_tempSensor2Field; + + private EBarometricCapture m_barometricCapture2Field; + + private EMeasurementType m_measType3Field; + + private string m_sensor3Field; + + private ETemperatureCapture m_tempCapture3Field; + + private string m_tempSensor3Field; + + private EBarometricCapture m_barometricCapture3Field; + + private bool m_overlapTempCaptureFlagField; + + private EMeasIndex m_measIDForUsedTemperatureField; + + private bool m_isAutomationField; + + private bool m_isRadioClockTimeField; + + private ResultInfoRecord[] m_resultInfosField; + + /// + public EMeasurementType m_measType1 { + get { + return this.m_measType1Field; + } + set { + this.m_measType1Field = value; + } + } + + /// + public string m_sensor1 { + get { + return this.m_sensor1Field; + } + set { + this.m_sensor1Field = value; + } + } + + /// + public ETemperatureCapture m_tempCapture1 { + get { + return this.m_tempCapture1Field; + } + set { + this.m_tempCapture1Field = value; + } + } + + /// + public string m_tempSensor1 { + get { + return this.m_tempSensor1Field; + } + set { + this.m_tempSensor1Field = value; + } + } + + /// + public EBarometricCapture m_barometricCapture1 { + get { + return this.m_barometricCapture1Field; + } + set { + this.m_barometricCapture1Field = value; + } + } + + /// + public EMeasurementType m_measType2 { + get { + return this.m_measType2Field; + } + set { + this.m_measType2Field = value; + } + } + + /// + public string m_sensor2 { + get { + return this.m_sensor2Field; + } + set { + this.m_sensor2Field = value; + } + } + + /// + public ETemperatureCapture m_tempCapture2 { + get { + return this.m_tempCapture2Field; + } + set { + this.m_tempCapture2Field = value; + } + } + + /// + public string m_tempSensor2 { + get { + return this.m_tempSensor2Field; + } + set { + this.m_tempSensor2Field = value; + } + } + + /// + public EBarometricCapture m_barometricCapture2 { + get { + return this.m_barometricCapture2Field; + } + set { + this.m_barometricCapture2Field = value; + } + } + + /// + public EMeasurementType m_measType3 { + get { + return this.m_measType3Field; + } + set { + this.m_measType3Field = value; + } + } + + /// + public string m_sensor3 { + get { + return this.m_sensor3Field; + } + set { + this.m_sensor3Field = value; + } + } + + /// + public ETemperatureCapture m_tempCapture3 { + get { + return this.m_tempCapture3Field; + } + set { + this.m_tempCapture3Field = value; + } + } + + /// + public string m_tempSensor3 { + get { + return this.m_tempSensor3Field; + } + set { + this.m_tempSensor3Field = value; + } + } + + /// + public EBarometricCapture m_barometricCapture3 { + get { + return this.m_barometricCapture3Field; + } + set { + this.m_barometricCapture3Field = value; + } + } + + /// + public bool m_overlapTempCaptureFlag { + get { + return this.m_overlapTempCaptureFlagField; + } + set { + this.m_overlapTempCaptureFlagField = value; + } + } + + /// + public EMeasIndex m_measIDForUsedTemperature { + get { + return this.m_measIDForUsedTemperatureField; + } + set { + this.m_measIDForUsedTemperatureField = value; + } + } + + /// + public bool m_isAutomation { + get { + return this.m_isAutomationField; + } + set { + this.m_isAutomationField = value; + } + } + + /// + public bool m_isRadioClockTime { + get { + return this.m_isRadioClockTimeField; + } + set { + this.m_isRadioClockTimeField = value; + } + } + + /// + [System.Xml.Serialization.XmlArrayItemAttribute("ArrayOfResultInfoRecord")] + public ResultInfoRecord[] m_resultInfos { + get { + return this.m_resultInfosField; + } + set { + this.m_resultInfosField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + public enum EMeasurementType { + + /// + eMeasurementTypeid_MeasurementType_PH, + + /// + eMeasurementTypeid_MeasurementType_Ion, + + /// + eMeasurementTypeid_MeasurementType_Cond, + + /// + eMeasurementTypeid_MeasurementType_DO, + + /// + eMeasurementTypeid_MeasurementType_Redox, + + /// + eMeasurementTypeid_MeasurementType_None, + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + public enum EMeasIndex { + + /// + eMeasIndexid_MeasIndex_MeasType1, + + /// + eMeasIndexid_MeasIndex_MeasType2, + + /// + eMeasIndexid_MeasIndex_MeasType3, + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class ArrayOfResultInfoRecord { + + private ResultInfoRecord[] arrayOfResultInfoRecord1Field; + + /// + [System.Xml.Serialization.XmlElementAttribute("ArrayOfResultInfoRecord", IsNullable=true)] + public ResultInfoRecord[] ArrayOfResultInfoRecord1 { + get { + return this.arrayOfResultInfoRecord1Field; + } + set { + this.arrayOfResultInfoRecord1Field = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class MFSampleMeasureIntervalRecord { + + private string m_sampleIDField; + + private decfloat m_manualTemperatureCField; + + private decfloat m_manualTemperatureFField; + + private decfloat m_salCorrectionFactorField; + + private decfloat m_manualBarometric_mBarField; + + private decfloat m_manualBarometric_hPaField; + + private decfloat m_manualBarometric_mmHgField; + + private decfloat m_manualBarometric_AtmField; + + private string m_commentField; + + /// + public string m_sampleID { + get { + return this.m_sampleIDField; + } + set { + this.m_sampleIDField = value; + } + } + + /// + public decfloat m_manualTemperatureC { + get { + return this.m_manualTemperatureCField; + } + set { + this.m_manualTemperatureCField = value; + } + } + + /// + public decfloat m_manualTemperatureF { + get { + return this.m_manualTemperatureFField; + } + set { + this.m_manualTemperatureFField = value; + } + } + + /// + public decfloat m_salCorrectionFactor { + get { + return this.m_salCorrectionFactorField; + } + set { + this.m_salCorrectionFactorField = value; + } + } + + /// + public decfloat m_manualBarometric_mBar { + get { + return this.m_manualBarometric_mBarField; + } + set { + this.m_manualBarometric_mBarField = value; + } + } + + /// + public decfloat m_manualBarometric_hPa { + get { + return this.m_manualBarometric_hPaField; + } + set { + this.m_manualBarometric_hPaField = value; + } + } + + /// + public decfloat m_manualBarometric_mmHg { + get { + return this.m_manualBarometric_mmHgField; + } + set { + this.m_manualBarometric_mmHgField = value; + } + } + + /// + public decfloat m_manualBarometric_Atm { + get { + return this.m_manualBarometric_AtmField; + } + set { + this.m_manualBarometric_AtmField = value; + } + } + + /// + public string m_comment { + get { + return this.m_commentField; + } + set { + this.m_commentField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class MFSampleCalibrationRecord { + + private string m_bufStdGrpUuidField; + + private string m_bufStdGrpField; + + private decfloat m_bufRefTemperatureField; + + private ECalMode m_calModeField; + + private bool m_autoBufRecogField; + + private ECalPointNum m_bufStdNumField; + + private MTValue[] m_bufStdSeqField; + + private ECalPointNum m_doCalPointField; + + private EDOCalStd1Type m_doCalStd1TypeField; + + private decfloat m_doConcentractionField; + + private decfloat m_salCorrectionFactorField; + + private decfloat m_manualTemperatureCField; + + private decfloat m_manualTemperatureFField; + + private decfloat m_manualBarometric_mBarField; + + private decfloat m_manualBarometric_hPaField; + + private decfloat m_manualBarometric_mmHgField; + + private decfloat m_manualBarometric_AtmField; + + private string m_commentField; + + /// + public string m_bufStdGrpUuid { + get { + return this.m_bufStdGrpUuidField; + } + set { + this.m_bufStdGrpUuidField = value; + } + } + + /// + public string m_bufStdGrp { + get { + return this.m_bufStdGrpField; + } + set { + this.m_bufStdGrpField = value; + } + } + + /// + public decfloat m_bufRefTemperature { + get { + return this.m_bufRefTemperatureField; + } + set { + this.m_bufRefTemperatureField = value; + } + } + + /// + public ECalMode m_calMode { + get { + return this.m_calModeField; + } + set { + this.m_calModeField = value; + } + } + + /// + public bool m_autoBufRecog { + get { + return this.m_autoBufRecogField; + } + set { + this.m_autoBufRecogField = value; + } + } + + /// + public ECalPointNum m_bufStdNum { + get { + return this.m_bufStdNumField; + } + set { + this.m_bufStdNumField = value; + } + } + + /// + [System.Xml.Serialization.XmlArrayItemAttribute("ArrayOfMTValue")] + public MTValue[] m_bufStdSeq { + get { + return this.m_bufStdSeqField; + } + set { + this.m_bufStdSeqField = value; + } + } + + /// + public ECalPointNum m_doCalPoint { + get { + return this.m_doCalPointField; + } + set { + this.m_doCalPointField = value; + } + } + + /// + public EDOCalStd1Type m_doCalStd1Type { + get { + return this.m_doCalStd1TypeField; + } + set { + this.m_doCalStd1TypeField = value; + } + } + + /// + public decfloat m_doConcentraction { + get { + return this.m_doConcentractionField; + } + set { + this.m_doConcentractionField = value; + } + } + + /// + public decfloat m_salCorrectionFactor { + get { + return this.m_salCorrectionFactorField; + } + set { + this.m_salCorrectionFactorField = value; + } + } + + /// + public decfloat m_manualTemperatureC { + get { + return this.m_manualTemperatureCField; + } + set { + this.m_manualTemperatureCField = value; + } + } + + /// + public decfloat m_manualTemperatureF { + get { + return this.m_manualTemperatureFField; + } + set { + this.m_manualTemperatureFField = value; + } + } + + /// + public decfloat m_manualBarometric_mBar { + get { + return this.m_manualBarometric_mBarField; + } + set { + this.m_manualBarometric_mBarField = value; + } + } + + /// + public decfloat m_manualBarometric_hPa { + get { + return this.m_manualBarometric_hPaField; + } + set { + this.m_manualBarometric_hPaField = value; + } + } + + /// + public decfloat m_manualBarometric_mmHg { + get { + return this.m_manualBarometric_mmHgField; + } + set { + this.m_manualBarometric_mmHgField = value; + } + } + + /// + public decfloat m_manualBarometric_Atm { + get { + return this.m_manualBarometric_AtmField; + } + set { + this.m_manualBarometric_AtmField = value; + } + } + + /// + public string m_comment { + get { + return this.m_commentField; + } + set { + this.m_commentField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + public enum ECalPointNum { + + /// + eCalPointNumid_CalPointNum_0, + + /// + eCalPointNumid_CalPointNum_1, + + /// + eCalPointNumid_CalPointNum_2, + + /// + eCalPointNumid_CalPointNum_3, + + /// + eCalPointNumid_CalPointNum_4, + + /// + eCalPointNumid_CalPointNum_5, + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + public enum EDOCalStd1Type { + + /// + eDOCalStd1Typeid_DOCalStd1Type_SaturatedAir, + + /// + eDOCalStd1Typeid_DOCalStd1Type_ManualEntry, + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class ArrayOfMTValue { + + private MTValue[] arrayOfMTValue1Field; + + /// + [System.Xml.Serialization.XmlElementAttribute("ArrayOfMTValue", IsNullable=true)] + public MTValue[] ArrayOfMTValue1 { + get { + return this.arrayOfMTValue1Field; + } + set { + this.arrayOfMTValue1Field = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class MFSampleSensorTestRecord { + + private bool m_calibrationFlagField; + + private string m_bufStdGrpUuidField; + + private string m_bufStdGrpField; + + private decfloat m_bufRefTemperatureField; + + private ECalMode m_calModeField; + + private bool m_autoBufRecogField; + + private ECalPointNum m_bufStdNumField; + + private ECommonUnit m_bufStddUnitField; + + private MTValue[] m_bufStdSeqField; + + private bool m_driftTestField; + + private bool m_testMeasurementsFlagField; + + private ECalPointNum m_testMeasurementsNumField; + + private MTValue[] m_testBufSeqField; + + private decfloat m_manualTemperatureCField; + + private decfloat m_manualTemperatureFField; + + private string m_commentField; + + /// + public bool m_calibrationFlag { + get { + return this.m_calibrationFlagField; + } + set { + this.m_calibrationFlagField = value; + } + } + + /// + public string m_bufStdGrpUuid { + get { + return this.m_bufStdGrpUuidField; + } + set { + this.m_bufStdGrpUuidField = value; + } + } + + /// + public string m_bufStdGrp { + get { + return this.m_bufStdGrpField; + } + set { + this.m_bufStdGrpField = value; + } + } + + /// + public decfloat m_bufRefTemperature { + get { + return this.m_bufRefTemperatureField; + } + set { + this.m_bufRefTemperatureField = value; + } + } + + /// + public ECalMode m_calMode { + get { + return this.m_calModeField; + } + set { + this.m_calModeField = value; + } + } + + /// + public bool m_autoBufRecog { + get { + return this.m_autoBufRecogField; + } + set { + this.m_autoBufRecogField = value; + } + } + + /// + public ECalPointNum m_bufStdNum { + get { + return this.m_bufStdNumField; + } + set { + this.m_bufStdNumField = value; + } + } + + /// + public ECommonUnit m_bufStddUnit { + get { + return this.m_bufStddUnitField; + } + set { + this.m_bufStddUnitField = value; + } + } + + /// + [System.Xml.Serialization.XmlArrayItemAttribute("ArrayOfMTValue")] + public MTValue[] m_bufStdSeq { + get { + return this.m_bufStdSeqField; + } + set { + this.m_bufStdSeqField = value; + } + } + + /// + public bool m_driftTest { + get { + return this.m_driftTestField; + } + set { + this.m_driftTestField = value; + } + } + + /// + public bool m_testMeasurementsFlag { + get { + return this.m_testMeasurementsFlagField; + } + set { + this.m_testMeasurementsFlagField = value; + } + } + + /// + public ECalPointNum m_testMeasurementsNum { + get { + return this.m_testMeasurementsNumField; + } + set { + this.m_testMeasurementsNumField = value; + } + } + + /// + [System.Xml.Serialization.XmlArrayItemAttribute("ArrayOfMTValue")] + public MTValue[] m_testBufSeq { + get { + return this.m_testBufSeqField; + } + set { + this.m_testBufSeqField = value; + } + } + + /// + public decfloat m_manualTemperatureC { + get { + return this.m_manualTemperatureCField; + } + set { + this.m_manualTemperatureCField = value; + } + } + + /// + public decfloat m_manualTemperatureF { + get { + return this.m_manualTemperatureFField; + } + set { + this.m_manualTemperatureFField = value; + } + } + + /// + public string m_comment { + get { + return this.m_commentField; + } + set { + this.m_commentField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class MFSampleIncrementalRecord { + + private string m_sampleIDField; + + private EIncrementalType m_incrementalTypeField; + + private decfloat m_sampleVolumeField; + + private EIonRatio m_ionRatioField; + + private decfloat m_standardVolumeField; + + private ECommonUnit m_bufStdUnitField; + + private decfloat m_stdConcentrationField; + + private ECalPointNum m_stdAdditionsNumField; + + private decfloat m_addedVolumePerAddField; + + private EUsedSlope m_usedSlopeField; + + private decfloat m_knownSlopeField; + + private decfloat m_manualTemperatureCField; + + private decfloat m_manualTemperatureFField; + + private string m_commentField; + + /// + public string m_sampleID { + get { + return this.m_sampleIDField; + } + set { + this.m_sampleIDField = value; + } + } + + /// + public EIncrementalType m_incrementalType { + get { + return this.m_incrementalTypeField; + } + set { + this.m_incrementalTypeField = value; + } + } + + /// + public decfloat m_sampleVolume { + get { + return this.m_sampleVolumeField; + } + set { + this.m_sampleVolumeField = value; + } + } + + /// + public EIonRatio m_ionRatio { + get { + return this.m_ionRatioField; + } + set { + this.m_ionRatioField = value; + } + } + + /// + public decfloat m_standardVolume { + get { + return this.m_standardVolumeField; + } + set { + this.m_standardVolumeField = value; + } + } + + /// + public ECommonUnit m_bufStdUnit { + get { + return this.m_bufStdUnitField; + } + set { + this.m_bufStdUnitField = value; + } + } + + /// + public decfloat m_stdConcentration { + get { + return this.m_stdConcentrationField; + } + set { + this.m_stdConcentrationField = value; + } + } + + /// + public ECalPointNum m_stdAdditionsNum { + get { + return this.m_stdAdditionsNumField; + } + set { + this.m_stdAdditionsNumField = value; + } + } + + /// + public decfloat m_addedVolumePerAdd { + get { + return this.m_addedVolumePerAddField; + } + set { + this.m_addedVolumePerAddField = value; + } + } + + /// + public EUsedSlope m_usedSlope { + get { + return this.m_usedSlopeField; + } + set { + this.m_usedSlopeField = value; + } + } + + /// + public decfloat m_knownSlope { + get { + return this.m_knownSlopeField; + } + set { + this.m_knownSlopeField = value; + } + } + + /// + public decfloat m_manualTemperatureC { + get { + return this.m_manualTemperatureCField; + } + set { + this.m_manualTemperatureCField = value; + } + } + + /// + public decfloat m_manualTemperatureF { + get { + return this.m_manualTemperatureFField; + } + set { + this.m_manualTemperatureFField = value; + } + } + + /// + public string m_comment { + get { + return this.m_commentField; + } + set { + this.m_commentField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + public enum EIncrementalType { + + /// + eIncrementalTypeid_IncrementalType_StandardAddition, + + /// + eIncrementalTypeid_IncrementalType_StandardSubtraction, + + /// + eIncrementalTypeid_IncrementalType_SampleAddition, + + /// + eIncrementalTypeid_IncrementalType_SampleSubtraction, + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + public enum EIonRatio { + + /// + eIonRatioid_IonRatio_1v1, + + /// + eIonRatioid_IonRatio_1v2, + + /// + eIonRatioid_IonRatio_1v3, + + /// + eIonRatioid_IonRatio_2v1, + + /// + eIonRatioid_IonRatio_2v3, + + /// + eIonRatioid_IonRatio_3v1, + + /// + eIonRatioid_IonRatio_3v2, + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + public enum EUsedSlope { + + /// + eUsedSlopeid_UsedSlope_FromCalibration, + + /// + eUsedSlopeid_UsedSlope_Theoretical, + + /// + eUsedSlopeid_UsedSlope_EnterKnownSlope, + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class MFSensorCheckRecord { + + private bool m_checkCalDateFlagField; + + private ETimeUnit m_unitOfMonitoringPeriodField; + + private int m_maxElapsedPeriodField; + + private bool m_interruptionFlagField; + + private ModuleType[] m_moduleField; + + /// + public bool m_checkCalDateFlag { + get { + return this.m_checkCalDateFlagField; + } + set { + this.m_checkCalDateFlagField = value; + } + } + + /// + public ETimeUnit m_unitOfMonitoringPeriod { + get { + return this.m_unitOfMonitoringPeriodField; + } + set { + this.m_unitOfMonitoringPeriodField = value; + } + } + + /// + public int m_maxElapsedPeriod { + get { + return this.m_maxElapsedPeriodField; + } + set { + this.m_maxElapsedPeriodField = value; + } + } + + /// + public bool m_interruptionFlag { + get { + return this.m_interruptionFlagField; + } + set { + this.m_interruptionFlagField = value; + } + } + + /// + [System.Xml.Serialization.XmlArrayItemAttribute("ArrayOfModuleType")] + public ModuleType[] m_module { + get { + return this.m_moduleField; + } + set { + this.m_moduleField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class ModuleType { + + private EModuleID m_moduleIDField; + + /// + public EModuleID m_moduleID { + get { + return this.m_moduleIDField; + } + set { + this.m_moduleIDField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class ArrayOfModuleType { + + private ModuleType[] arrayOfModuleType1Field; + + /// + [System.Xml.Serialization.XmlElementAttribute("ArrayOfModuleType", IsNullable=true)] + public ModuleType[] ArrayOfModuleType1 { + get { + return this.arrayOfModuleType1Field; + } + set { + this.arrayOfModuleType1Field = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class MFSubSensorCheckRecord { + + private bool m_checkFlagField; + + private decfloat m_phionMinSlopeField; + + private decfloat m_phionMaxSlopeField; + + private decfloat m_phionMinOffsetField; + + private decfloat m_phionMaxOffsetField; + + private decfloat m_condMinCCField; + + private decfloat m_condMaxCCField; + + private decfloat m_doMinSlopeField; + + private decfloat m_doMaxSlopeField; + + private int m_minCalPointsField; + + private decfloat m_LowerLimitCalRangeField; + + private decfloat m_UpperLimitCalRangeField; + + private int m_UnitLimitCalRangeField; + + private bool m_AcceptCalPointOutField; + + private bool m_CheckCalRangeField; + + /// + public bool m_checkFlag { + get { + return this.m_checkFlagField; + } + set { + this.m_checkFlagField = value; + } + } + + /// + public decfloat m_phionMinSlope { + get { + return this.m_phionMinSlopeField; + } + set { + this.m_phionMinSlopeField = value; + } + } + + /// + public decfloat m_phionMaxSlope { + get { + return this.m_phionMaxSlopeField; + } + set { + this.m_phionMaxSlopeField = value; + } + } + + /// + public decfloat m_phionMinOffset { + get { + return this.m_phionMinOffsetField; + } + set { + this.m_phionMinOffsetField = value; + } + } + + /// + public decfloat m_phionMaxOffset { + get { + return this.m_phionMaxOffsetField; + } + set { + this.m_phionMaxOffsetField = value; + } + } + + /// + public decfloat m_condMinCC { + get { + return this.m_condMinCCField; + } + set { + this.m_condMinCCField = value; + } + } + + /// + public decfloat m_condMaxCC { + get { + return this.m_condMaxCCField; + } + set { + this.m_condMaxCCField = value; + } + } + + /// + public decfloat m_doMinSlope { + get { + return this.m_doMinSlopeField; + } + set { + this.m_doMinSlopeField = value; + } + } + + /// + public decfloat m_doMaxSlope { + get { + return this.m_doMaxSlopeField; + } + set { + this.m_doMaxSlopeField = value; + } + } + + /// + public int m_minCalPoints { + get { + return this.m_minCalPointsField; + } + set { + this.m_minCalPointsField = value; + } + } + + /// + public decfloat m_LowerLimitCalRange { + get { + return this.m_LowerLimitCalRangeField; + } + set { + this.m_LowerLimitCalRangeField = value; + } + } + + /// + public decfloat m_UpperLimitCalRange { + get { + return this.m_UpperLimitCalRangeField; + } + set { + this.m_UpperLimitCalRangeField = value; + } + } + + /// + public int m_UnitLimitCalRange { + get { + return this.m_UnitLimitCalRangeField; + } + set { + this.m_UnitLimitCalRangeField = value; + } + } + + /// + public bool m_AcceptCalPointOut { + get { + return this.m_AcceptCalPointOutField; + } + set { + this.m_AcceptCalPointOutField = value; + } + } + + /// + public bool m_CheckCalRange { + get { + return this.m_CheckCalRangeField; + } + set { + this.m_CheckCalRangeField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class MFMeasureRecord { + + private bool m_stirFlagField; + + private EStirSpeed m_stirSpeedField; + + private bool m_conditionField; + + private string m_conditionFormulaField; + + /// + public bool m_stirFlag { + get { + return this.m_stirFlagField; + } + set { + this.m_stirFlagField = value; + } + } + + /// + public EStirSpeed m_stirSpeed { + get { + return this.m_stirSpeedField; + } + set { + this.m_stirSpeedField = value; + } + } + + /// + public bool m_condition { + get { + return this.m_conditionField; + } + set { + this.m_conditionField = value; + } + } + + /// + public string m_conditionFormula { + get { + return this.m_conditionFormulaField; + } + set { + this.m_conditionFormulaField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class MFSubMeasureRecord { + + private ECondMode m_condModeField; + + private ECommonUnit m_unitField; + + private decfloat m_relMVOffsetField; + + private ETemperatureCorrection m_tempCorrectionField; + + private decfloat m_alphaCoefficientField; + + private ERefTemperatureC m_refTempField; + + private decfloat m_tdsFactorField; + + private EResolution m_numberOfDecimalDigitsField; + + private EEndpointType m_endPointTypeField; + + private EEndpointCriteria m_endPointCriteriaField; + + private int m_endPointTimeField; + + private decfloat m_mVdEField; + + private decfloat m_condUSCMdEField; + + private decfloat m_doMgLdEField; + + private int m_dtField; + + private int m_tminField; + + private int m_tmaxField; + + private bool m_thresholdFlagField; + + private decfloat m_lowerThresholdField; + + private decfloat m_upperThresholdField; + + private bool m_endpointOutThresholdField; + + /// + public ECondMode m_condMode { + get { + return this.m_condModeField; + } + set { + this.m_condModeField = value; + } + } + + /// + public ECommonUnit m_unit { + get { + return this.m_unitField; + } + set { + this.m_unitField = value; + } + } + + /// + public decfloat m_relMVOffset { + get { + return this.m_relMVOffsetField; + } + set { + this.m_relMVOffsetField = value; + } + } + + /// + public ETemperatureCorrection m_tempCorrection { + get { + return this.m_tempCorrectionField; + } + set { + this.m_tempCorrectionField = value; + } + } + + /// + public decfloat m_alphaCoefficient { + get { + return this.m_alphaCoefficientField; + } + set { + this.m_alphaCoefficientField = value; + } + } + + /// + public ERefTemperatureC m_refTemp { + get { + return this.m_refTempField; + } + set { + this.m_refTempField = value; + } + } + + /// + public decfloat m_tdsFactor { + get { + return this.m_tdsFactorField; + } + set { + this.m_tdsFactorField = value; + } + } + + /// + public EResolution m_numberOfDecimalDigits { + get { + return this.m_numberOfDecimalDigitsField; + } + set { + this.m_numberOfDecimalDigitsField = value; + } + } + + /// + public EEndpointType m_endPointType { + get { + return this.m_endPointTypeField; + } + set { + this.m_endPointTypeField = value; + } + } + + /// + public EEndpointCriteria m_endPointCriteria { + get { + return this.m_endPointCriteriaField; + } + set { + this.m_endPointCriteriaField = value; + } + } + + /// + public int m_endPointTime { + get { + return this.m_endPointTimeField; + } + set { + this.m_endPointTimeField = value; + } + } + + /// + public decfloat m_mVdE { + get { + return this.m_mVdEField; + } + set { + this.m_mVdEField = value; + } + } + + /// + public decfloat m_condUSCMdE { + get { + return this.m_condUSCMdEField; + } + set { + this.m_condUSCMdEField = value; + } + } + + /// + public decfloat m_doMgLdE { + get { + return this.m_doMgLdEField; + } + set { + this.m_doMgLdEField = value; + } + } + + /// + public int m_dt { + get { + return this.m_dtField; + } + set { + this.m_dtField = value; + } + } + + /// + public int m_tmin { + get { + return this.m_tminField; + } + set { + this.m_tminField = value; + } + } + + /// + public int m_tmax { + get { + return this.m_tmaxField; + } + set { + this.m_tmaxField = value; + } + } + + /// + public bool m_thresholdFlag { + get { + return this.m_thresholdFlagField; + } + set { + this.m_thresholdFlagField = value; + } + } + + /// + public decfloat m_lowerThreshold { + get { + return this.m_lowerThresholdField; + } + set { + this.m_lowerThresholdField = value; + } + } + + /// + public decfloat m_upperThreshold { + get { + return this.m_upperThresholdField; + } + set { + this.m_upperThresholdField = value; + } + } + + /// + public bool m_endpointOutThreshold { + get { + return this.m_endpointOutThresholdField; + } + set { + this.m_endpointOutThresholdField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + public enum ETemperatureCorrection { + + /// + eTemperatureCorrectionid_TemperatureCorrection_Linear, + + /// + eTemperatureCorrectionid_TemperatureCorrection_NonLinear, + + /// + eTemperatureCorrectionid_TemperatureCorrection_Off, + + /// + eTemperatureCorrectionid_TemperatureCorrection_PureWater, + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + public enum ERefTemperatureC { + + /// + eRefTemperatureCid_RefTemperatureC_25, + + /// + eRefTemperatureCid_RefTemperatureC_20, + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + public enum EResolution { + + /// + eResolutionid_Resolution_0, + + /// + eResolutionid_Resolution_1, + + /// + eResolutionid_Resolution_2, + + /// + eResolutionid_Resolution_3, + + /// + eResolutionid_Resolution_4, + + /// + eResolutionid_Resolution_5, + + /// + eResolutionid_Resolution_6, + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class MFCalibrationRecord { + + private bool m_stirFlagField; + + private EStirSpeed m_stirSpeedField; + + private ModuleType[] m_moduleField; + + /// + public bool m_stirFlag { + get { + return this.m_stirFlagField; + } + set { + this.m_stirFlagField = value; + } + } + + /// + public EStirSpeed m_stirSpeed { + get { + return this.m_stirSpeedField; + } + set { + this.m_stirSpeedField = value; + } + } + + /// + [System.Xml.Serialization.XmlArrayItemAttribute("ArrayOfModuleType")] + public ModuleType[] m_module { + get { + return this.m_moduleField; + } + set { + this.m_moduleField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class MFSensorTestRecord { + + private bool m_stirFlagField; + + private EStirSpeed m_stirSpeedField; + + private ModuleType[] m_moduleField; + + /// + public bool m_stirFlag { + get { + return this.m_stirFlagField; + } + set { + this.m_stirFlagField = value; + } + } + + /// + public EStirSpeed m_stirSpeed { + get { + return this.m_stirSpeedField; + } + set { + this.m_stirSpeedField = value; + } + } + + /// + [System.Xml.Serialization.XmlArrayItemAttribute("ArrayOfModuleType")] + public ModuleType[] m_module { + get { + return this.m_moduleField; + } + set { + this.m_moduleField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class MFIncrementalRecord { + + private bool m_stirFlagField; + + private EStirSpeed m_stirSpeedField; + + private ModuleType[] m_moduleField; + + /// + public bool m_stirFlag { + get { + return this.m_stirFlagField; + } + set { + this.m_stirFlagField = value; + } + } + + /// + public EStirSpeed m_stirSpeed { + get { + return this.m_stirSpeedField; + } + set { + this.m_stirSpeedField = value; + } + } + + /// + [System.Xml.Serialization.XmlArrayItemAttribute("ArrayOfModuleType")] + public ModuleType[] m_module { + get { + return this.m_moduleField; + } + set { + this.m_moduleField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class MFIntervalRecord { + + private bool m_stirFlagField; + + private EStirSpeed m_stirSpeedField; + + private int m_intervalTimeField; + + private bool m_intervalPrintField; + + private bool m_conditionField; + + private string m_conditionFormulaField; + + /// + public bool m_stirFlag { + get { + return this.m_stirFlagField; + } + set { + this.m_stirFlagField = value; + } + } + + /// + public EStirSpeed m_stirSpeed { + get { + return this.m_stirSpeedField; + } + set { + this.m_stirSpeedField = value; + } + } + + /// + public int m_intervalTime { + get { + return this.m_intervalTimeField; + } + set { + this.m_intervalTimeField = value; + } + } + + /// + public bool m_intervalPrint { + get { + return this.m_intervalPrintField; + } + set { + this.m_intervalPrintField = value; + } + } + + /// + public bool m_condition { + get { + return this.m_conditionField; + } + set { + this.m_conditionField = value; + } + } + + /// + public string m_conditionFormula { + get { + return this.m_conditionFormulaField; + } + set { + this.m_conditionFormulaField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class MFCalibrationAnalysisRecord { + + private decfloat m_phionMinSlopeField; + + private decfloat m_phionMaxSlopeField; + + private decfloat m_phionMinOffsetField; + + private decfloat m_phionMaxOffsetField; + + private decfloat m_condMinCCField; + + private decfloat m_condMaxCCField; + + private decfloat m_doMinSlopeField; + + private decfloat m_doMaxSlopeField; + + private bool m_interruptionFlagField; + + private bool m_showActualPHFlagField; + + /// + public decfloat m_phionMinSlope { + get { + return this.m_phionMinSlopeField; + } + set { + this.m_phionMinSlopeField = value; + } + } + + /// + public decfloat m_phionMaxSlope { + get { + return this.m_phionMaxSlopeField; + } + set { + this.m_phionMaxSlopeField = value; + } + } + + /// + public decfloat m_phionMinOffset { + get { + return this.m_phionMinOffsetField; + } + set { + this.m_phionMinOffsetField = value; + } + } + + /// + public decfloat m_phionMaxOffset { + get { + return this.m_phionMaxOffsetField; + } + set { + this.m_phionMaxOffsetField = value; + } + } + + /// + public decfloat m_condMinCC { + get { + return this.m_condMinCCField; + } + set { + this.m_condMinCCField = value; + } + } + + /// + public decfloat m_condMaxCC { + get { + return this.m_condMaxCCField; + } + set { + this.m_condMaxCCField = value; + } + } + + /// + public decfloat m_doMinSlope { + get { + return this.m_doMinSlopeField; + } + set { + this.m_doMinSlopeField = value; + } + } + + /// + public decfloat m_doMaxSlope { + get { + return this.m_doMaxSlopeField; + } + set { + this.m_doMaxSlopeField = value; + } + } + + /// + public bool m_interruptionFlag { + get { + return this.m_interruptionFlagField; + } + set { + this.m_interruptionFlagField = value; + } + } + + /// + public bool m_showActualPHFlag { + get { + return this.m_showActualPHFlagField; + } + set { + this.m_showActualPHFlagField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class MFSensorEvaluationRecord { + + private bool m_testCalibrationLimitField; + + private decfloat m_minSlopeField; + + private decfloat m_maxSlopeField; + + private decfloat m_minOffsetField; + + private decfloat m_maxOffsetField; + + private decfloat m_maxDriftField; + + private bool m_testMeasureLimitField; + + private decfloat m_toleranceField; + + /// + public bool m_testCalibrationLimit { + get { + return this.m_testCalibrationLimitField; + } + set { + this.m_testCalibrationLimitField = value; + } + } + + /// + public decfloat m_minSlope { + get { + return this.m_minSlopeField; + } + set { + this.m_minSlopeField = value; + } + } + + /// + public decfloat m_maxSlope { + get { + return this.m_maxSlopeField; + } + set { + this.m_maxSlopeField = value; + } + } + + /// + public decfloat m_minOffset { + get { + return this.m_minOffsetField; + } + set { + this.m_minOffsetField = value; + } + } + + /// + public decfloat m_maxOffset { + get { + return this.m_maxOffsetField; + } + set { + this.m_maxOffsetField = value; + } + } + + /// + public decfloat m_maxDrift { + get { + return this.m_maxDriftField; + } + set { + this.m_maxDriftField = value; + } + } + + /// + public bool m_testMeasureLimit { + get { + return this.m_testMeasureLimitField; + } + set { + this.m_testMeasureLimitField = value; + } + } + + /// + public decfloat m_tolerance { + get { + return this.m_toleranceField; + } + set { + this.m_toleranceField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class MFCalculationRecord { + + private string m_IDField; + + private string m_nameField; + + private string m_unitField; + + private string m_formulaField; + + private short m_decimalPlacesField; + + private bool m_resultLimitsField; + + private decfloat m_lowerLimitField; + + private decfloat m_upperLimitField; + + private bool m_interruptionFlagField; + + /// + public string m_ID { + get { + return this.m_IDField; + } + set { + this.m_IDField = value; + } + } + + /// + public string m_name { + get { + return this.m_nameField; + } + set { + this.m_nameField = value; + } + } + + /// + public string m_unit { + get { + return this.m_unitField; + } + set { + this.m_unitField = value; + } + } + + /// + public string m_formula { + get { + return this.m_formulaField; + } + set { + this.m_formulaField = value; + } + } + + /// + public short m_decimalPlaces { + get { + return this.m_decimalPlacesField; + } + set { + this.m_decimalPlacesField = value; + } + } + + /// + public bool m_resultLimits { + get { + return this.m_resultLimitsField; + } + set { + this.m_resultLimitsField = value; + } + } + + /// + public decfloat m_lowerLimit { + get { + return this.m_lowerLimitField; + } + set { + this.m_lowerLimitField = value; + } + } + + /// + public decfloat m_upperLimit { + get { + return this.m_upperLimitField; + } + set { + this.m_upperLimitField = value; + } + } + + /// + public bool m_interruptionFlag { + get { + return this.m_interruptionFlagField; + } + set { + this.m_interruptionFlagField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class MFReportRecord { + + private bool m_printField; + + private EReportFormat m_reportFormatField; + + private bool m_reportValueCalculationField; + + private bool m_reportDataField; + + private bool m_reportInfoField; + + /// + public bool m_print { + get { + return this.m_printField; + } + set { + this.m_printField = value; + } + } + + /// + public EReportFormat m_reportFormat { + get { + return this.m_reportFormatField; + } + set { + this.m_reportFormatField = value; + } + } + + /// + public bool m_reportValueCalculation { + get { + return this.m_reportValueCalculationField; + } + set { + this.m_reportValueCalculationField = value; + } + } + + /// + public bool m_reportData { + get { + return this.m_reportDataField; + } + set { + this.m_reportDataField = value; + } + } + + /// + public bool m_reportInfo { + get { + return this.m_reportInfoField; + } + set { + this.m_reportInfoField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class MFInstructionRecord { + + private EContinueAfter m_continueAfterField; + + private string m_instructionField; + + private int m_timeIntervalField; + + private bool m_conditionField; + + private string m_conditionFormulaField; + + /// + public EContinueAfter m_continueAfter { + get { + return this.m_continueAfterField; + } + set { + this.m_continueAfterField = value; + } + } + + /// + public string m_instruction { + get { + return this.m_instructionField; + } + set { + this.m_instructionField = value; + } + } + + /// + public int m_timeInterval { + get { + return this.m_timeIntervalField; + } + set { + this.m_timeIntervalField = value; + } + } + + /// + public bool m_condition { + get { + return this.m_conditionField; + } + set { + this.m_conditionField = value; + } + } + + /// + public string m_conditionFormula { + get { + return this.m_conditionFormulaField; + } + set { + this.m_conditionFormulaField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + public enum EContinueAfter { + + /// + eContinueAfterid_ContinueAfter_Confirmation, + + /// + eContinueAfterid_ContinueAfter_TimeInterval, + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class MFWaitRecord { + + private int m_waitTimeField; + + private bool m_stirFlagField; + + private EStirSpeed m_stirSpeedField; + + private bool m_instructionFlagField; + + private string m_instructionTextField; + + private bool m_conditionField; + + private string m_conditionFormulaField; + + /// + public int m_waitTime { + get { + return this.m_waitTimeField; + } + set { + this.m_waitTimeField = value; + } + } + + /// + public bool m_stirFlag { + get { + return this.m_stirFlagField; + } + set { + this.m_stirFlagField = value; + } + } + + /// + public EStirSpeed m_stirSpeed { + get { + return this.m_stirSpeedField; + } + set { + this.m_stirSpeedField = value; + } + } + + /// + public bool m_instructionFlag { + get { + return this.m_instructionFlagField; + } + set { + this.m_instructionFlagField = value; + } + } + + /// + public string m_instructionText { + get { + return this.m_instructionTextField; + } + set { + this.m_instructionTextField = value; + } + } + + /// + public bool m_condition { + get { + return this.m_conditionField; + } + set { + this.m_conditionField = value; + } + } + + /// + public string m_conditionFormula { + get { + return this.m_conditionFormulaField; + } + set { + this.m_conditionFormulaField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class MFMeasureDirectRecord { + + private ModuleType[] m_moduleField; + + /// + [System.Xml.Serialization.XmlArrayItemAttribute("ArrayOfModuleType")] + public ModuleType[] m_module { + get { + return this.m_moduleField; + } + set { + this.m_moduleField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class MFCalibrationDirectRecord { + + private ModuleType[] m_moduleField; + + /// + [System.Xml.Serialization.XmlArrayItemAttribute("ArrayOfModuleType")] + public ModuleType[] m_module { + get { + return this.m_moduleField; + } + set { + this.m_moduleField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class MFModuleAdjustmentRecord { + + private short m_moduleTypeField; + + private short m_moduleIdField; + + private string m_moduleSNField; + + private string m_operatorField; + + private bool m_bAdjustMVInputField; + + private bool m_bAdjustCondResInputField; + + private bool m_bAdjustISFETTempInputField; + + private bool m_bAdjustISFETInputField; + + private bool m_bAdjustIntTempInputField; + + private bool m_bAdjustExtTempInputField; + + private bool m_bAdjustCurrentInputField; + + private string m_equipmentName1Field; + + private string m_equipmentSN1Field; + + private string m_equipmentCertificationDate1Field; + + private string m_equipmentName2Field; + + private string m_equipmentSN2Field; + + private string m_equipmentCertificationDate2Field; + + private string m_equipmentName3Field; + + private string m_equipmentSN3Field; + + private string m_equipmentCertificationDate3Field; + + /// + public short m_moduleType { + get { + return this.m_moduleTypeField; + } + set { + this.m_moduleTypeField = value; + } + } + + /// + public short m_moduleId { + get { + return this.m_moduleIdField; + } + set { + this.m_moduleIdField = value; + } + } + + /// + public string m_moduleSN { + get { + return this.m_moduleSNField; + } + set { + this.m_moduleSNField = value; + } + } + + /// + public string m_operator { + get { + return this.m_operatorField; + } + set { + this.m_operatorField = value; + } + } + + /// + public bool m_bAdjustMVInput { + get { + return this.m_bAdjustMVInputField; + } + set { + this.m_bAdjustMVInputField = value; + } + } + + /// + public bool m_bAdjustCondResInput { + get { + return this.m_bAdjustCondResInputField; + } + set { + this.m_bAdjustCondResInputField = value; + } + } + + /// + public bool m_bAdjustISFETTempInput { + get { + return this.m_bAdjustISFETTempInputField; + } + set { + this.m_bAdjustISFETTempInputField = value; + } + } + + /// + public bool m_bAdjustISFETInput { + get { + return this.m_bAdjustISFETInputField; + } + set { + this.m_bAdjustISFETInputField = value; + } + } + + /// + public bool m_bAdjustIntTempInput { + get { + return this.m_bAdjustIntTempInputField; + } + set { + this.m_bAdjustIntTempInputField = value; + } + } + + /// + public bool m_bAdjustExtTempInput { + get { + return this.m_bAdjustExtTempInputField; + } + set { + this.m_bAdjustExtTempInputField = value; + } + } + + /// + public bool m_bAdjustCurrentInput { + get { + return this.m_bAdjustCurrentInputField; + } + set { + this.m_bAdjustCurrentInputField = value; + } + } + + /// + public string m_equipmentName1 { + get { + return this.m_equipmentName1Field; + } + set { + this.m_equipmentName1Field = value; + } + } + + /// + public string m_equipmentSN1 { + get { + return this.m_equipmentSN1Field; + } + set { + this.m_equipmentSN1Field = value; + } + } + + /// + public string m_equipmentCertificationDate1 { + get { + return this.m_equipmentCertificationDate1Field; + } + set { + this.m_equipmentCertificationDate1Field = value; + } + } + + /// + public string m_equipmentName2 { + get { + return this.m_equipmentName2Field; + } + set { + this.m_equipmentName2Field = value; + } + } + + /// + public string m_equipmentSN2 { + get { + return this.m_equipmentSN2Field; + } + set { + this.m_equipmentSN2Field = value; + } + } + + /// + public string m_equipmentCertificationDate2 { + get { + return this.m_equipmentCertificationDate2Field; + } + set { + this.m_equipmentCertificationDate2Field = value; + } + } + + /// + public string m_equipmentName3 { + get { + return this.m_equipmentName3Field; + } + set { + this.m_equipmentName3Field = value; + } + } + + /// + public string m_equipmentSN3 { + get { + return this.m_equipmentSN3Field; + } + set { + this.m_equipmentSN3Field = value; + } + } + + /// + public string m_equipmentCertificationDate3 { + get { + return this.m_equipmentCertificationDate3Field; + } + set { + this.m_equipmentCertificationDate3Field = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class MFModuleInputTestRecord { + + private short m_moduleTypeField; + + private short m_moduleIdField; + + private string m_moduleSNField; + + private string m_operatorField; + + private string m_equipmentName1Field; + + private string m_equipmentSN1Field; + + private string m_equipmentCertificationDate1Field; + + private string m_equipmentName2Field; + + private string m_equipmentSN2Field; + + private string m_equipmentCertificationDate2Field; + + private string m_equipmentName3Field; + + private string m_equipmentSN3Field; + + private string m_equipmentCertificationDate3Field; + + private bool m_digitalISMInputField; + + private bool m_pressureInputField; + + private System.Nullable[] m_mvInputsField; + + private System.Nullable[] m_impedanceTestsField; + + private System.Nullable[] m_condResInputsField; + + private System.Nullable[] m_isfetInputsField; + + private System.Nullable[] m_isfetNTC30KInputsField; + + private System.Nullable[] m_intNTC22KInputsField; + + private System.Nullable[] m_intNTC30KInputsField; + + private System.Nullable[] m_extNTC30KInputsField; + + private System.Nullable[] m_extPT1000InputsField; + + private System.Nullable[] m_currentInputsField; + + /// + public short m_moduleType { + get { + return this.m_moduleTypeField; + } + set { + this.m_moduleTypeField = value; + } + } + + /// + public short m_moduleId { + get { + return this.m_moduleIdField; + } + set { + this.m_moduleIdField = value; + } + } + + /// + public string m_moduleSN { + get { + return this.m_moduleSNField; + } + set { + this.m_moduleSNField = value; + } + } + + /// + public string m_operator { + get { + return this.m_operatorField; + } + set { + this.m_operatorField = value; + } + } + + /// + public string m_equipmentName1 { + get { + return this.m_equipmentName1Field; + } + set { + this.m_equipmentName1Field = value; + } + } + + /// + public string m_equipmentSN1 { + get { + return this.m_equipmentSN1Field; + } + set { + this.m_equipmentSN1Field = value; + } + } + + /// + public string m_equipmentCertificationDate1 { + get { + return this.m_equipmentCertificationDate1Field; + } + set { + this.m_equipmentCertificationDate1Field = value; + } + } + + /// + public string m_equipmentName2 { + get { + return this.m_equipmentName2Field; + } + set { + this.m_equipmentName2Field = value; + } + } + + /// + public string m_equipmentSN2 { + get { + return this.m_equipmentSN2Field; + } + set { + this.m_equipmentSN2Field = value; + } + } + + /// + public string m_equipmentCertificationDate2 { + get { + return this.m_equipmentCertificationDate2Field; + } + set { + this.m_equipmentCertificationDate2Field = value; + } + } + + /// + public string m_equipmentName3 { + get { + return this.m_equipmentName3Field; + } + set { + this.m_equipmentName3Field = value; + } + } + + /// + public string m_equipmentSN3 { + get { + return this.m_equipmentSN3Field; + } + set { + this.m_equipmentSN3Field = value; + } + } + + /// + public string m_equipmentCertificationDate3 { + get { + return this.m_equipmentCertificationDate3Field; + } + set { + this.m_equipmentCertificationDate3Field = value; + } + } + + /// + public bool m_digitalISMInput { + get { + return this.m_digitalISMInputField; + } + set { + this.m_digitalISMInputField = value; + } + } + + /// + public bool m_pressureInput { + get { + return this.m_pressureInputField; + } + set { + this.m_pressureInputField = value; + } + } + + /// + [System.Xml.Serialization.XmlArrayItemAttribute("ArrayOfFloat")] + public System.Nullable[] m_mvInputs { + get { + return this.m_mvInputsField; + } + set { + this.m_mvInputsField = value; + } + } + + /// + [System.Xml.Serialization.XmlArrayItemAttribute("ArrayOfFloat")] + public System.Nullable[] m_impedanceTests { + get { + return this.m_impedanceTestsField; + } + set { + this.m_impedanceTestsField = value; + } + } + + /// + [System.Xml.Serialization.XmlArrayItemAttribute("ArrayOfFloat")] + public System.Nullable[] m_condResInputs { + get { + return this.m_condResInputsField; + } + set { + this.m_condResInputsField = value; + } + } + + /// + [System.Xml.Serialization.XmlArrayItemAttribute("ArrayOfFloat")] + public System.Nullable[] m_isfetInputs { + get { + return this.m_isfetInputsField; + } + set { + this.m_isfetInputsField = value; + } + } + + /// + [System.Xml.Serialization.XmlArrayItemAttribute("ArrayOfFloat")] + public System.Nullable[] m_isfetNTC30KInputs { + get { + return this.m_isfetNTC30KInputsField; + } + set { + this.m_isfetNTC30KInputsField = value; + } + } + + /// + [System.Xml.Serialization.XmlArrayItemAttribute("ArrayOfFloat")] + public System.Nullable[] m_intNTC22KInputs { + get { + return this.m_intNTC22KInputsField; + } + set { + this.m_intNTC22KInputsField = value; + } + } + + /// + [System.Xml.Serialization.XmlArrayItemAttribute("ArrayOfFloat")] + public System.Nullable[] m_intNTC30KInputs { + get { + return this.m_intNTC30KInputsField; + } + set { + this.m_intNTC30KInputsField = value; + } + } + + /// + [System.Xml.Serialization.XmlArrayItemAttribute("ArrayOfFloat")] + public System.Nullable[] m_extNTC30KInputs { + get { + return this.m_extNTC30KInputsField; + } + set { + this.m_extNTC30KInputsField = value; + } + } + + /// + [System.Xml.Serialization.XmlArrayItemAttribute("ArrayOfFloat")] + public System.Nullable[] m_extPT1000Inputs { + get { + return this.m_extPT1000InputsField; + } + set { + this.m_extPT1000InputsField = value; + } + } + + /// + [System.Xml.Serialization.XmlArrayItemAttribute("ArrayOfFloat")] + public System.Nullable[] m_currentInputs { + get { + return this.m_currentInputsField; + } + set { + this.m_currentInputsField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class ArrayOfFloat { + + private System.Nullable[] arrayOfFloat1Field; + + /// + [System.Xml.Serialization.XmlElementAttribute("ArrayOfFloat", IsNullable=true)] + public System.Nullable[] ArrayOfFloat1 { + get { + return this.arrayOfFloat1Field; + } + set { + this.arrayOfFloat1Field = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class MFExtTemperatureCalRecord { + + private short m_moduleTypeField; + + private short m_moduleIdField; + + private string m_temperatureSensorUUIDField; + + private short m_temperatureUnitField; + + private decfloat m_adjustedValueField; + + /// + public short m_moduleType { + get { + return this.m_moduleTypeField; + } + set { + this.m_moduleTypeField = value; + } + } + + /// + public short m_moduleId { + get { + return this.m_moduleIdField; + } + set { + this.m_moduleIdField = value; + } + } + + /// + public string m_temperatureSensorUUID { + get { + return this.m_temperatureSensorUUIDField; + } + set { + this.m_temperatureSensorUUIDField = value; + } + } + + /// + public short m_temperatureUnit { + get { + return this.m_temperatureUnitField; + } + set { + this.m_temperatureUnitField = value; + } + } + + /// + public decfloat m_adjustedValue { + get { + return this.m_adjustedValueField; + } + set { + this.m_adjustedValueField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class MFEndOfMethodRecord { + + private short m_lastPositionField; + + /// + public short m_lastPosition { + get { + return this.m_lastPositionField; + } + set { + this.m_lastPositionField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class MFSampleVerificationRecord { + + private string m_instructionField; + + private bool m_bInterruptAfterTimeoutField; + + private short m_timeoutSetField; + + /// + public string m_instruction { + get { + return this.m_instructionField; + } + set { + this.m_instructionField = value; + } + } + + /// + public bool m_bInterruptAfterTimeout { + get { + return this.m_bInterruptAfterTimeoutField; + } + set { + this.m_bInterruptAfterTimeoutField = value; + } + } + + /// + public short m_timeoutSet { + get { + return this.m_timeoutSetField; + } + set { + this.m_timeoutSetField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class MFConfigurationBCVRecord { + + private MFConfigurationRecord m_baseRecordField; + + private string m_checkValueIDField; + + private bool m_bBlankField; + + private bool m_bSeededBlankField; + + private bool m_bStandardField; + + private bool m_bSalinityCorrectionField; + + private decfloat m_dilutedWaterSalinityField; + + private decfloat m_seedSolutionSalinityField; + + private decfloat m_stdSolutionSalinityField; + + private short m_bSeedAddedToField; + + private decfloat m_seedDilutionFactorField; + + private bool m_bBlankCorrectionField; + + private decfloat m_bottleVolumeField; + + /// + public MFConfigurationRecord m_baseRecord { + get { + return this.m_baseRecordField; + } + set { + this.m_baseRecordField = value; + } + } + + /// + public string m_checkValueID { + get { + return this.m_checkValueIDField; + } + set { + this.m_checkValueIDField = value; + } + } + + /// + public bool m_bBlank { + get { + return this.m_bBlankField; + } + set { + this.m_bBlankField = value; + } + } + + /// + public bool m_bSeededBlank { + get { + return this.m_bSeededBlankField; + } + set { + this.m_bSeededBlankField = value; + } + } + + /// + public bool m_bStandard { + get { + return this.m_bStandardField; + } + set { + this.m_bStandardField = value; + } + } + + /// + public bool m_bSalinityCorrection { + get { + return this.m_bSalinityCorrectionField; + } + set { + this.m_bSalinityCorrectionField = value; + } + } + + /// + public decfloat m_dilutedWaterSalinity { + get { + return this.m_dilutedWaterSalinityField; + } + set { + this.m_dilutedWaterSalinityField = value; + } + } + + /// + public decfloat m_seedSolutionSalinity { + get { + return this.m_seedSolutionSalinityField; + } + set { + this.m_seedSolutionSalinityField = value; + } + } + + /// + public decfloat m_stdSolutionSalinity { + get { + return this.m_stdSolutionSalinityField; + } + set { + this.m_stdSolutionSalinityField = value; + } + } + + /// + public short m_bSeedAddedTo { + get { + return this.m_bSeedAddedToField; + } + set { + this.m_bSeedAddedToField = value; + } + } + + /// + public decfloat m_seedDilutionFactor { + get { + return this.m_seedDilutionFactorField; + } + set { + this.m_seedDilutionFactorField = value; + } + } + + /// + public bool m_bBlankCorrection { + get { + return this.m_bBlankCorrectionField; + } + set { + this.m_bBlankCorrectionField = value; + } + } + + /// + public decfloat m_bottleVolume { + get { + return this.m_bottleVolumeField; + } + set { + this.m_bottleVolumeField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class SampleCommonBOD { + + private MFSampleMeasureIntervalRecord m_sampleMeasureField; + + private string m_sampleIDField; + + private string m_commentField; + + private short m_sampleTypeField; + + private bool m_bSameBottleForBaseFollowField; + + private short m_bottleNumBaseField; + + private short m_bottleNumFollowField; + + private decfloat m_manualTemperatureCField; + + private decfloat m_manualTemperatureFField; + + private decfloat m_manualBarometric_mBarField; + + private decfloat m_manualBarometric_hPaField; + + private decfloat m_manualBarometric_mmHgField; + + private decfloat m_manualBarometric_AtmField; + + /// + public MFSampleMeasureIntervalRecord m_sampleMeasure { + get { + return this.m_sampleMeasureField; + } + set { + this.m_sampleMeasureField = value; + } + } + + /// + public string m_sampleID { + get { + return this.m_sampleIDField; + } + set { + this.m_sampleIDField = value; + } + } + + /// + public string m_comment { + get { + return this.m_commentField; + } + set { + this.m_commentField = value; + } + } + + /// + public short m_sampleType { + get { + return this.m_sampleTypeField; + } + set { + this.m_sampleTypeField = value; + } + } + + /// + public bool m_bSameBottleForBaseFollow { + get { + return this.m_bSameBottleForBaseFollowField; + } + set { + this.m_bSameBottleForBaseFollowField = value; + } + } + + /// + public short m_bottleNumBase { + get { + return this.m_bottleNumBaseField; + } + set { + this.m_bottleNumBaseField = value; + } + } + + /// + public short m_bottleNumFollow { + get { + return this.m_bottleNumFollowField; + } + set { + this.m_bottleNumFollowField = value; + } + } + + /// + public decfloat m_manualTemperatureC { + get { + return this.m_manualTemperatureCField; + } + set { + this.m_manualTemperatureCField = value; + } + } + + /// + public decfloat m_manualTemperatureF { + get { + return this.m_manualTemperatureFField; + } + set { + this.m_manualTemperatureFField = value; + } + } + + /// + public decfloat m_manualBarometric_mBar { + get { + return this.m_manualBarometric_mBarField; + } + set { + this.m_manualBarometric_mBarField = value; + } + } + + /// + public decfloat m_manualBarometric_hPa { + get { + return this.m_manualBarometric_hPaField; + } + set { + this.m_manualBarometric_hPaField = value; + } + } + + /// + public decfloat m_manualBarometric_mmHg { + get { + return this.m_manualBarometric_mmHgField; + } + set { + this.m_manualBarometric_mmHgField = value; + } + } + + /// + public decfloat m_manualBarometric_Atm { + get { + return this.m_manualBarometric_AtmField; + } + set { + this.m_manualBarometric_AtmField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class BottleInfo { + + private string m_bottleIDField; + + private decfloat m_sampleVolumeField; + + private decfloat m_seedVolumeField; + + private decfloat m_dilutionVolumeField; + + private string m_commentField; + + /// + public string m_bottleID { + get { + return this.m_bottleIDField; + } + set { + this.m_bottleIDField = value; + } + } + + /// + public decfloat m_sampleVolume { + get { + return this.m_sampleVolumeField; + } + set { + this.m_sampleVolumeField = value; + } + } + + /// + public decfloat m_seedVolume { + get { + return this.m_seedVolumeField; + } + set { + this.m_seedVolumeField = value; + } + } + + /// + public decfloat m_dilutionVolume { + get { + return this.m_dilutionVolumeField; + } + set { + this.m_dilutionVolumeField = value; + } + } + + /// + public string m_comment { + get { + return this.m_commentField; + } + set { + this.m_commentField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class MFSampleBODRecord { + + private SampleCommonBOD m_sampleCommonField; + + private BottleInfo[] m_baseBottlesField; + + private BottleInfo[] m_followBottlesField; + + /// + public SampleCommonBOD m_sampleCommon { + get { + return this.m_sampleCommonField; + } + set { + this.m_sampleCommonField = value; + } + } + + /// + [System.Xml.Serialization.XmlArrayItemAttribute("ArrayOfBottleInfo")] + public BottleInfo[] m_baseBottles { + get { + return this.m_baseBottlesField; + } + set { + this.m_baseBottlesField = value; + } + } + + /// + [System.Xml.Serialization.XmlArrayItemAttribute("ArrayOfBottleInfo")] + public BottleInfo[] m_followBottles { + get { + return this.m_followBottlesField; + } + set { + this.m_followBottlesField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class ArrayOfBottleInfo { + + private BottleInfo[] arrayOfBottleInfo1Field; + + /// + [System.Xml.Serialization.XmlElementAttribute("ArrayOfBottleInfo", IsNullable=true)] + public BottleInfo[] ArrayOfBottleInfo1 { + get { + return this.arrayOfBottleInfo1Field; + } + set { + this.arrayOfBottleInfo1Field = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class DOMeasureAnalysisRecord { + + private LimitAnalysisRecord m_tempLimitField; + + private LimitAnalysisRecord m_DOLimitField; + + /// + public LimitAnalysisRecord m_tempLimit { + get { + return this.m_tempLimitField; + } + set { + this.m_tempLimitField = value; + } + } + + /// + public LimitAnalysisRecord m_DOLimit { + get { + return this.m_DOLimitField; + } + set { + this.m_DOLimitField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class LimitAnalysisRecord { + + private short m_limitMaskField; + + private MTValue m_maxValueField; + + private MTValue m_minValueField; + + private System.Nullable[] m_actionOutLimitField; + + private System.Nullable[] m_bInstructionField; + + /// + public short m_limitMask { + get { + return this.m_limitMaskField; + } + set { + this.m_limitMaskField = value; + } + } + + /// + public MTValue m_maxValue { + get { + return this.m_maxValueField; + } + set { + this.m_maxValueField = value; + } + } + + /// + public MTValue m_minValue { + get { + return this.m_minValueField; + } + set { + this.m_minValueField = value; + } + } + + /// + [System.Xml.Serialization.XmlArrayItemAttribute("ArrayOfShort")] + public System.Nullable[] m_actionOutLimit { + get { + return this.m_actionOutLimitField; + } + set { + this.m_actionOutLimitField = value; + } + } + + /// + [System.Xml.Serialization.XmlArrayItemAttribute("ArrayOfBoolean")] + public System.Nullable[] m_bInstruction { + get { + return this.m_bInstructionField; + } + set { + this.m_bInstructionField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class ArrayOfShort { + + private System.Nullable[] arrayOfShort1Field; + + /// + [System.Xml.Serialization.XmlElementAttribute("ArrayOfShort", IsNullable=true)] + public System.Nullable[] ArrayOfShort1 { + get { + return this.arrayOfShort1Field; + } + set { + this.arrayOfShort1Field = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class ArrayOfBoolean { + + private System.Nullable[] arrayOfBoolean1Field; + + /// + [System.Xml.Serialization.XmlElementAttribute("ArrayOfBoolean", IsNullable=true)] + public System.Nullable[] ArrayOfBoolean1 { + get { + return this.arrayOfBoolean1Field; + } + set { + this.arrayOfBoolean1Field = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class TimeToleranceRecord { + + private bool m_bLimitField; + + private decfloat m_toleranceField; + + private EMFAnalysisAction m_actionOutLimitField; + + private bool m_bInstructionField; + + /// + public bool m_bLimit { + get { + return this.m_bLimitField; + } + set { + this.m_bLimitField = value; + } + } + + /// + public decfloat m_tolerance { + get { + return this.m_toleranceField; + } + set { + this.m_toleranceField = value; + } + } + + /// + public EMFAnalysisAction m_actionOutLimit { + get { + return this.m_actionOutLimitField; + } + set { + this.m_actionOutLimitField = value; + } + } + + /// + public bool m_bInstruction { + get { + return this.m_bInstructionField; + } + set { + this.m_bInstructionField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class BODAnalysisRecord { + + private DOMeasureAnalysisRecord m_baseField; + + private DOMeasureAnalysisRecord m_followField; + + private TimeToleranceRecord m_timeToleranceField; + + private LimitAnalysisRecord m_bodField; + + /// + public DOMeasureAnalysisRecord m_base { + get { + return this.m_baseField; + } + set { + this.m_baseField = value; + } + } + + /// + public DOMeasureAnalysisRecord m_follow { + get { + return this.m_followField; + } + set { + this.m_followField = value; + } + } + + /// + public TimeToleranceRecord m_timeTolerance { + get { + return this.m_timeToleranceField; + } + set { + this.m_timeToleranceField = value; + } + } + + /// + public LimitAnalysisRecord m_bod { + get { + return this.m_bodField; + } + set { + this.m_bodField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class MFAnalysisBCVSeedRecord { + + private BODAnalysisRecord m_bottleBODField; + + private LimitAnalysisRecord m_depletionField; + + /// + public BODAnalysisRecord m_bottleBOD { + get { + return this.m_bottleBODField; + } + set { + this.m_bottleBODField = value; + } + } + + /// + public LimitAnalysisRecord m_depletion { + get { + return this.m_depletionField; + } + set { + this.m_depletionField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class MFAnalysisBCVStandardRecord { + + private short m_limitAppliedToField; + + private BODAnalysisRecord m_bottleBODField; + + private LimitAnalysisRecord m_seedCorrectionField; + + private LimitAnalysisRecord m_finalBODField; + + /// + public short m_limitAppliedTo { + get { + return this.m_limitAppliedToField; + } + set { + this.m_limitAppliedToField = value; + } + } + + /// + public BODAnalysisRecord m_bottleBOD { + get { + return this.m_bottleBODField; + } + set { + this.m_bottleBODField = value; + } + } + + /// + public LimitAnalysisRecord m_seedCorrection { + get { + return this.m_seedCorrectionField; + } + set { + this.m_seedCorrectionField = value; + } + } + + /// + public LimitAnalysisRecord m_finalBOD { + get { + return this.m_finalBODField; + } + set { + this.m_finalBODField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class MFConfigurationBODRecord { + + private MFConfigurationRecord m_baseRecordField; + + private bool m_bSalinityCorrectionField; + + private decfloat m_seedSalinityField; + + private decfloat m_dilutionSalinityField; + + private decfloat m_undilutedSampleSalinityField; + + private short m_bSeedAddedToField; + + private decfloat m_seedDilutionFactorField; + + private bool m_bBlankCorrectionField; + + private decfloat m_bottleVolumeField; + + private string m_bcvSampleIDField; + + /// + public MFConfigurationRecord m_baseRecord { + get { + return this.m_baseRecordField; + } + set { + this.m_baseRecordField = value; + } + } + + /// + public bool m_bSalinityCorrection { + get { + return this.m_bSalinityCorrectionField; + } + set { + this.m_bSalinityCorrectionField = value; + } + } + + /// + public decfloat m_seedSalinity { + get { + return this.m_seedSalinityField; + } + set { + this.m_seedSalinityField = value; + } + } + + /// + public decfloat m_dilutionSalinity { + get { + return this.m_dilutionSalinityField; + } + set { + this.m_dilutionSalinityField = value; + } + } + + /// + public decfloat m_undilutedSampleSalinity { + get { + return this.m_undilutedSampleSalinityField; + } + set { + this.m_undilutedSampleSalinityField = value; + } + } + + /// + public short m_bSeedAddedTo { + get { + return this.m_bSeedAddedToField; + } + set { + this.m_bSeedAddedToField = value; + } + } + + /// + public decfloat m_seedDilutionFactor { + get { + return this.m_seedDilutionFactorField; + } + set { + this.m_seedDilutionFactorField = value; + } + } + + /// + public bool m_bBlankCorrection { + get { + return this.m_bBlankCorrectionField; + } + set { + this.m_bBlankCorrectionField = value; + } + } + + /// + public decfloat m_bottleVolume { + get { + return this.m_bottleVolumeField; + } + set { + this.m_bottleVolumeField = value; + } + } + + /// + public string m_bcvSampleID { + get { + return this.m_bcvSampleIDField; + } + set { + this.m_bcvSampleIDField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class MFAnalysisBODRecord { + + private short m_limitAppliedToField; + + private BODAnalysisRecord m_bottleBODField; + + private LimitAnalysisRecord m_seedCorrectionField; + + private LimitAnalysisRecord m_finalBODField; + + /// + public short m_limitAppliedTo { + get { + return this.m_limitAppliedToField; + } + set { + this.m_limitAppliedToField = value; + } + } + + /// + public BODAnalysisRecord m_bottleBOD { + get { + return this.m_bottleBODField; + } + set { + this.m_bottleBODField = value; + } + } + + /// + public LimitAnalysisRecord m_seedCorrection { + get { + return this.m_seedCorrectionField; + } + set { + this.m_seedCorrectionField = value; + } + } + + /// + public LimitAnalysisRecord m_finalBOD { + get { + return this.m_finalBODField; + } + set { + this.m_finalBODField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class MeasureBODRecord { + + private short m_doUnitField; + + private short m_bodUnitField; + + private short m_doResolutionField; + + private short m_bodResolutionField; + + private bool m_stirFlagField; + + private EStirSpeed m_stirSpeedField; + + private EBODTempBarCorrection m_pressureCorrectionField; + + private EBODTempBarCorrection m_tempCorrectionField; + + /// + public short m_doUnit { + get { + return this.m_doUnitField; + } + set { + this.m_doUnitField = value; + } + } + + /// + public short m_bodUnit { + get { + return this.m_bodUnitField; + } + set { + this.m_bodUnitField = value; + } + } + + /// + public short m_doResolution { + get { + return this.m_doResolutionField; + } + set { + this.m_doResolutionField = value; + } + } + + /// + public short m_bodResolution { + get { + return this.m_bodResolutionField; + } + set { + this.m_bodResolutionField = value; + } + } + + /// + public bool m_stirFlag { + get { + return this.m_stirFlagField; + } + set { + this.m_stirFlagField = value; + } + } + + /// + public EStirSpeed m_stirSpeed { + get { + return this.m_stirSpeedField; + } + set { + this.m_stirSpeedField = value; + } + } + + /// + public EBODTempBarCorrection m_pressureCorrection { + get { + return this.m_pressureCorrectionField; + } + set { + this.m_pressureCorrectionField = value; + } + } + + /// + public EBODTempBarCorrection m_tempCorrection { + get { + return this.m_tempCorrectionField; + } + set { + this.m_tempCorrectionField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + public enum EBODTempBarCorrection { + + /// + eBODTempBarCorrectionid_BODTempBarCorrection_APHA, + + /// + eBODTempBarCorrectionid_BODTempBarCorrection_UNESCO, + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class MFMeasureBODRecord { + + private MeasureBODRecord m_bodRecordField; + + /// + public MeasureBODRecord m_bodRecord { + get { + return this.m_bodRecordField; + } + set { + this.m_bodRecordField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class MFMeasureBCVBlankRecord { + + private MeasureBODRecord m_bodRecordField; + + /// + public MeasureBODRecord m_bodRecord { + get { + return this.m_bodRecordField; + } + set { + this.m_bodRecordField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class MFMeasureBCVSeedRecord { + + private MeasureBODRecord m_bodRecordField; + + /// + public MeasureBODRecord m_bodRecord { + get { + return this.m_bodRecordField; + } + set { + this.m_bodRecordField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class MFMeasureBCVStandardRecord { + + private MeasureBODRecord m_bodRecordField; + + /// + public MeasureBODRecord m_bodRecord { + get { + return this.m_bodRecordField; + } + set { + this.m_bodRecordField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class MFAuxiliaryInstrumentRecord { + + private short m_controlTypeSelectedIDField; + + private string m_auxiliaryInstrumentNameField; + + private bool m_sendOutputSequenceFlagField; + + private string m_outputSequenceField; + + private bool m_waitforInputSequenceFlagField; + + private short m_maximumTimeField; + + private string m_inputSequenceField; + + private bool m_inputSequenceWithResultsFlagField; + + private string m_startSequenceField; + + private short m_totalLengthField; + + private short m_numberOfResultsField; + + private short m_startPostion1Field; + + private short m_maxLength1Field; + + private bool m_conditionFlagField; + + private string m_formulaField; + + /// + public short m_controlTypeSelectedID { + get { + return this.m_controlTypeSelectedIDField; + } + set { + this.m_controlTypeSelectedIDField = value; + } + } + + /// + public string m_auxiliaryInstrumentName { + get { + return this.m_auxiliaryInstrumentNameField; + } + set { + this.m_auxiliaryInstrumentNameField = value; + } + } + + /// + public bool m_sendOutputSequenceFlag { + get { + return this.m_sendOutputSequenceFlagField; + } + set { + this.m_sendOutputSequenceFlagField = value; + } + } + + /// + public string m_outputSequence { + get { + return this.m_outputSequenceField; + } + set { + this.m_outputSequenceField = value; + } + } + + /// + public bool m_waitforInputSequenceFlag { + get { + return this.m_waitforInputSequenceFlagField; + } + set { + this.m_waitforInputSequenceFlagField = value; + } + } + + /// + public short m_maximumTime { + get { + return this.m_maximumTimeField; + } + set { + this.m_maximumTimeField = value; + } + } + + /// + public string m_inputSequence { + get { + return this.m_inputSequenceField; + } + set { + this.m_inputSequenceField = value; + } + } + + /// + public bool m_inputSequenceWithResultsFlag { + get { + return this.m_inputSequenceWithResultsFlagField; + } + set { + this.m_inputSequenceWithResultsFlagField = value; + } + } + + /// + public string m_startSequence { + get { + return this.m_startSequenceField; + } + set { + this.m_startSequenceField = value; + } + } + + /// + public short m_totalLength { + get { + return this.m_totalLengthField; + } + set { + this.m_totalLengthField = value; + } + } + + /// + public short m_numberOfResults { + get { + return this.m_numberOfResultsField; + } + set { + this.m_numberOfResultsField = value; + } + } + + /// + public short m_startPostion1 { + get { + return this.m_startPostion1Field; + } + set { + this.m_startPostion1Field = value; + } + } + + /// + public short m_maxLength1 { + get { + return this.m_maxLength1Field; + } + set { + this.m_maxLength1Field = value; + } + } + + /// + public bool m_conditionFlag { + get { + return this.m_conditionFlagField; + } + set { + this.m_conditionFlagField = value; + } + } + + /// + public string m_formula { + get { + return this.m_formulaField; + } + set { + this.m_formulaField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class MFLabxMethodSetting { + + private ECommonUnit temperatureUnitField; + + private ECommonUnit barometricUnitField; + + private bool isConfirmEndpointField; + + private bool displayActualAndTempValuesField; + + /// + public ECommonUnit temperatureUnit { + get { + return this.temperatureUnitField; + } + set { + this.temperatureUnitField = value; + } + } + + /// + public ECommonUnit barometricUnit { + get { + return this.barometricUnitField; + } + set { + this.barometricUnitField = value; + } + } + + /// + public bool isConfirmEndpoint { + get { + return this.isConfirmEndpointField; + } + set { + this.isConfirmEndpointField = value; + } + } + + /// + public bool displayActualAndTempValues { + get { + return this.displayActualAndTempValuesField; + } + set { + this.displayActualAndTempValuesField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class MFPHSensorConfigRecord { + + private BasicSensorInfoForMeasure sensorInfoField; + + private SensorAdjustParameters sensorAdjustParametersField; + + private BasicSensorInfoForMeasure tempSensorInfoField; + + private TempCalPointData tempSensorCalDataField; + + private EModuleID moduleIDField; + + /// + public BasicSensorInfoForMeasure sensorInfo { + get { + return this.sensorInfoField; + } + set { + this.sensorInfoField = value; + } + } + + /// + public SensorAdjustParameters sensorAdjustParameters { + get { + return this.sensorAdjustParametersField; + } + set { + this.sensorAdjustParametersField = value; + } + } + + /// + public BasicSensorInfoForMeasure tempSensorInfo { + get { + return this.tempSensorInfoField; + } + set { + this.tempSensorInfoField = value; + } + } + + /// + public TempCalPointData tempSensorCalData { + get { + return this.tempSensorCalDataField; + } + set { + this.tempSensorCalDataField = value; + } + } + + /// + public EModuleID moduleID { + get { + return this.moduleIDField; + } + set { + this.moduleIDField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class MFIonSensorConfigRecord { + + private BasicSensorInfoForMeasure sensorInfoField; + + private EIonType ionTypeField; + + private EIonCharge ionChargeField; + + private decfloat ionMolarMassField; + + private SensorAdjustParameters sensorAdjustParametersField; + + private BasicSensorInfoForMeasure tempSensorInfoField; + + private TempCalPointData tempSensorCalDataField; + + private EModuleID moduleIDField; + + /// + public BasicSensorInfoForMeasure sensorInfo { + get { + return this.sensorInfoField; + } + set { + this.sensorInfoField = value; + } + } + + /// + public EIonType ionType { + get { + return this.ionTypeField; + } + set { + this.ionTypeField = value; + } + } + + /// + public EIonCharge ionCharge { + get { + return this.ionChargeField; + } + set { + this.ionChargeField = value; + } + } + + /// + public decfloat ionMolarMass { + get { + return this.ionMolarMassField; + } + set { + this.ionMolarMassField = value; + } + } + + /// + public SensorAdjustParameters sensorAdjustParameters { + get { + return this.sensorAdjustParametersField; + } + set { + this.sensorAdjustParametersField = value; + } + } + + /// + public BasicSensorInfoForMeasure tempSensorInfo { + get { + return this.tempSensorInfoField; + } + set { + this.tempSensorInfoField = value; + } + } + + /// + public TempCalPointData tempSensorCalData { + get { + return this.tempSensorCalDataField; + } + set { + this.tempSensorCalDataField = value; + } + } + + /// + public EModuleID moduleID { + get { + return this.moduleIDField; + } + set { + this.moduleIDField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class MFRedoxSensorConfigRecord { + + private BasicSensorInfoForMeasure sensorInfoField; + + private BasicSensorInfoForMeasure tempSensorInfoField; + + private TempCalPointData tempSensorCalDataField; + + private EModuleID moduleIDField; + + /// + public BasicSensorInfoForMeasure sensorInfo { + get { + return this.sensorInfoField; + } + set { + this.sensorInfoField = value; + } + } + + /// + public BasicSensorInfoForMeasure tempSensorInfo { + get { + return this.tempSensorInfoField; + } + set { + this.tempSensorInfoField = value; + } + } + + /// + public TempCalPointData tempSensorCalData { + get { + return this.tempSensorCalDataField; + } + set { + this.tempSensorCalDataField = value; + } + } + + /// + public EModuleID moduleID { + get { + return this.moduleIDField; + } + set { + this.moduleIDField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class MFCondSensorConfigRecord { + + private BasicSensorInfoForMeasure sensorInfoField; + + private CondCalPointData[] sensorAdjustParametersField; + + private BasicSensorInfoForMeasure tempSensorInfoField; + + private TempCalPointData tempSensorCalDataField; + + private EModuleID moduleIDField; + + /// + public BasicSensorInfoForMeasure sensorInfo { + get { + return this.sensorInfoField; + } + set { + this.sensorInfoField = value; + } + } + + /// + [System.Xml.Serialization.XmlArrayItemAttribute("ArrayOfCondCalPointData")] + public CondCalPointData[] sensorAdjustParameters { + get { + return this.sensorAdjustParametersField; + } + set { + this.sensorAdjustParametersField = value; + } + } + + /// + public BasicSensorInfoForMeasure tempSensorInfo { + get { + return this.tempSensorInfoField; + } + set { + this.tempSensorInfoField = value; + } + } + + /// + public TempCalPointData tempSensorCalData { + get { + return this.tempSensorCalDataField; + } + set { + this.tempSensorCalDataField = value; + } + } + + /// + public EModuleID moduleID { + get { + return this.moduleIDField; + } + set { + this.moduleIDField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class MFDOSensorConfigRecord { + + private BasicSensorInfoForMeasure sensorInfoField; + + private SensorAdjustParameter sensorAdjustParameterField; + + private BasicSensorInfoForMeasure tempSensorInfoField; + + private TempCalPointData tempSensorCalDataField; + + private EModuleID moduleIDField; + + /// + public BasicSensorInfoForMeasure sensorInfo { + get { + return this.sensorInfoField; + } + set { + this.sensorInfoField = value; + } + } + + /// + public SensorAdjustParameter sensorAdjustParameter { + get { + return this.sensorAdjustParameterField; + } + set { + this.sensorAdjustParameterField = value; + } + } + + /// + public BasicSensorInfoForMeasure tempSensorInfo { + get { + return this.tempSensorInfoField; + } + set { + this.tempSensorInfoField = value; + } + } + + /// + public TempCalPointData tempSensorCalData { + get { + return this.tempSensorCalDataField; + } + set { + this.tempSensorCalDataField = value; + } + } + + /// + public EModuleID moduleID { + get { + return this.moduleIDField; + } + set { + this.moduleIDField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class ArrayOfOUPData { + + private OUPData[] arrayOfOUPData1Field; + + /// + [System.Xml.Serialization.XmlElementAttribute("ArrayOfOUPData", IsNullable=true)] + public OUPData[] ArrayOfOUPData1 { + get { + return this.arrayOfOUPData1Field; + } + set { + this.arrayOfOUPData1Field = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class ArrayOfBODResult { + + private BODResult[] arrayOfBODResult1Field; + + /// + [System.Xml.Serialization.XmlElementAttribute("ArrayOfBODResult", IsNullable=true)] + public BODResult[] ArrayOfBODResult1 { + get { + return this.arrayOfBODResult1Field; + } + set { + this.arrayOfBODResult1Field = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class ArrayOfDecfloat { + + private decfloat[] arrayOfDecfloat1Field; + + /// + [System.Xml.Serialization.XmlElementAttribute("ArrayOfDecfloat", IsNullable=true)] + public decfloat[] ArrayOfDecfloat1 { + get { + return this.arrayOfDecfloat1Field; + } + set { + this.arrayOfDecfloat1Field = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class ResultMessage { + + private string rackidField; + + private string slotidField; + + private string groupidField; + + private int unitField; + + private string unitstringField; + + private int precisionField; + + private TreasureFleetAnyResult resultField; + + /// + public string rackid { + get { + return this.rackidField; + } + set { + this.rackidField = value; + } + } + + /// + public string slotid { + get { + return this.slotidField; + } + set { + this.slotidField = value; + } + } + + /// + public string groupid { + get { + return this.groupidField; + } + set { + this.groupidField = value; + } + } + + /// + public int unit { + get { + return this.unitField; + } + set { + this.unitField = value; + } + } + + /// + public string unitstring { + get { + return this.unitstringField; + } + set { + this.unitstringField = value; + } + } + + /// + public int precision { + get { + return this.precisionField; + } + set { + this.precisionField = value; + } + } + + /// + public TreasureFleetAnyResult result { + get { + return this.resultField; + } + set { + this.resultField = value; + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")] + [System.SerializableAttribute()] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + [System.Xml.Serialization.XmlTypeAttribute(Namespace="tf")] + [System.Xml.Serialization.XmlRootAttribute(Namespace="tf", IsNullable=false)] + public partial class Telegram { + + private object itemField; + + /// + [System.Xml.Serialization.XmlElementAttribute("EndOfMethod", typeof(EndOfMethod))] + [System.Xml.Serialization.XmlElementAttribute("ResultMessage", typeof(ResultMessage))] + [System.Xml.Serialization.XmlElementAttribute("method", typeof(method))] + public object Item { + get { + return this.itemField; + } + set { + this.itemField = value; + } + } + } +} diff --git a/SEClient/Contract/results_labxdirect.xsd b/SEClient/Contract/results_labxdirect.xsd new file mode 100644 index 0000000..79fb4b4 --- /dev/null +++ b/SEClient/Contract/results_labxdirect.xsd @@ -0,0 +1,320 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/SEClient/Contract/service.xsd b/SEClient/Contract/service.xsd new file mode 100644 index 0000000..6e9f7ff --- /dev/null +++ b/SEClient/Contract/service.xsd @@ -0,0 +1,3483 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/SEClient/Contract/service.xsd.backup b/SEClient/Contract/service.xsd.backup new file mode 100644 index 0000000..42758e7 --- /dev/null +++ b/SEClient/Contract/service.xsd.backup @@ -0,0 +1,3146 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/SEClient/LancePdkXML.cs b/SEClient/LancePdkXML.cs new file mode 100644 index 0000000..ab1adf9 --- /dev/null +++ b/SEClient/LancePdkXML.cs @@ -0,0 +1,306 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using log4net; +using System.Xml; +using System.Reflection; + +namespace SERemoteLib +{ + ///

+ /// The serializer to generate an XML document. This class offers some functions to create general xml-elements + /// for the transfer of data over SOAP to a PDK instrument. + /// + public sealed class PdkXmlSerializer + { + private static IDictionary typeMappings; + + /// + /// The XmlElement name of a parameterlist-element. + /// + public static readonly String ParamlistElementname = "param-list"; + /// + /// The XmlElement name of a parameter-element. + /// + public static readonly String ParamElementname = "param"; + /// + /// The XmlElement name of a parameter-element. + /// + public static readonly String ItemElementname = "item"; + /// + /// The XmlAttribute name of a type-attribute. + /// + public static readonly String TypeAttributename = "type"; + /// + /// The XmlAttribute name of a sequence type-attribute. + /// + public static readonly String SequenceTypeAttributename = "sequenceType"; + /// + /// The XmlAttribute name of a name-attribute. + /// + public static readonly String NameAttributename = "name"; + + /// + /// The XmlElement name of a method-element. + /// + public static readonly String MethodElementname = "method"; + /// + /// The XmlElement name of a methodfunction-element. + /// + public static readonly String MethodfunctionElementname = "mf"; + /// + /// The XmlElement name of a record-element. + /// + public static readonly String RecordElementname = "record"; + + private static readonly ILog logger = LogManager.GetLogger(typeof(PdkXmlSerializer)); + + /// + /// Initializes a new instance of the class. + /// + private PdkXmlSerializer() + { } + + + /// + /// Serializes the record into the PDK specific XML. + /// + /// The browsable screen record. + /// + public static string SerializeRecord(object record) + { + XmlDocument doc = new XmlDocument(); + + XmlElement recordElement = CreateRecordElement(record, doc); + doc.AppendChild(recordElement); + + if (logger.IsDebugEnabled) + { + logger.Debug("Serialized " + record.GetType().ToString() + " into " + doc.InnerXml); + } + + return doc.InnerXml.Replace("\r\n", " ").Replace("\n", " ").Replace("\t", " "); + } + + private static XmlElement CreateRecordElement(object recordObject, XmlDocument doc) + { + XmlElement recordElement = doc.CreateElement(RecordElementname); + + XmlAttribute recordTypeAttribute = doc.CreateAttribute(TypeAttributename); + recordTypeAttribute.InnerText = recordObject.GetType().Name; + recordElement.Attributes.Append(recordTypeAttribute); + + XmlElement paramListElement = CreateParameterListElement(recordObject, doc); + recordElement.AppendChild(paramListElement); + + return recordElement; + } + + /// + /// Initializes the type-mapping dictonary. + /// + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Performance", "CA1810:InitializeReferenceTypeStaticFieldsInline", Justification = "add collection members")] + static PdkXmlSerializer() + { + typeMappings = new Dictionary(); + + typeMappings.Add(typeof(string), "wstring"); + typeMappings.Add(typeof(bool), "boolean"); + typeMappings.Add(typeof(short), "short"); + typeMappings.Add(typeof(DateTime), "datetime"); + typeMappings.Add(typeof(decimal), "decfloat"); + typeMappings.Add(typeof(int), "long"); + typeMappings.Add(typeof(byte), "octet"); + //typeMappings.Add(typeof(decfloat), "decfloat"); + typeMappings.Add(typeof(double), "double"); + } + + /// + /// Maps a to the according PDK type. + /// + /// + /// + public static String MapType(Type type) + { + if (typeMappings.ContainsKey(type)) + { + return typeMappings[type]; + } + else if (type.IsEnum) + { + return "short"; + } + else if (type.IsArray) + { + return "sequence"; + } + else + { + return "record"; + } + } + + /// + /// Serializes the value into the according XML representation. + /// + /// The value to serialize. MUST NOT be null + /// XML string representing the value. + public static String SerializeValue(object val) + { + String returnValue = null; + + if (val == null) + { + throw new ArgumentException("The argument val MUST NOT be null."); + } + + if (typeMappings.ContainsKey(val.GetType())) + { + if (val.GetType() == typeof(string)) + { + returnValue = (string)val; + } + else if (val.GetType() == typeof(bool)) + { + returnValue = XmlConvert.ToString((bool)val); + } + else if (val.GetType() == typeof(short)) + { + returnValue = XmlConvert.ToString((short)val); + } + else if (val.GetType() == typeof(DateTime)) + { + returnValue = XmlConvert.ToString((DateTime)val, "yyyy-MM-dd HH:mm:ss"); + } + else if (val.GetType() == typeof(decimal)) + { + returnValue = XmlConvert.ToString((decimal)val); + } + else if (val.GetType() == typeof(int)) + { + returnValue = XmlConvert.ToString((int)val); + } + else if (val.GetType() == typeof(byte)) + { + returnValue = XmlConvert.ToString((byte)val); + } + //else if (val.GetType() == typeof(decfloat)) + //{ + // returnValue = ((decfloat)val).Value; + //} + else if (val.GetType() == typeof(double)) + { + returnValue = XmlConvert.ToString((double)val); + } + } + else if (val.GetType().IsEnum) + { + returnValue = XmlConvert.ToString((int)val); + } + return returnValue; + } + + /// + /// Creates the element param-list element with all its param subelements. Each property of the + /// is added as a param elemment. + /// + /// + /// + /// + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1059:MembersShouldNotExposeCertainConcreteTypes", MessageId = "System.Xml.XmlNode"), System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1720:IdentifiersShouldNotContainTypeNames", MessageId = "object")] + private static XmlElement CreateParameterListElement(object paramObject, XmlDocument doc) + { + XmlElement paramListElement = doc.CreateElement(ParamlistElementname); + + //add parameters + PropertyInfo[] properties = paramObject.GetType().GetProperties(); + foreach (PropertyInfo property in properties) + { + bool ignoreThisProperty = false; + foreach (System.Xml.Serialization.XmlIgnoreAttribute xmlIgnoreAttribute in property.GetCustomAttributes(typeof(System.Xml.Serialization.XmlIgnoreAttribute), false)) + { + ignoreThisProperty = true; + break; + } + + if (!ignoreThisProperty) + { + XmlElement paramElement = CreateParameterElement(property, paramObject, doc); + paramListElement.AppendChild(paramElement); + } + } + + return paramListElement; + } + + /// + /// Creates the param element for the . + /// + /// + /// + /// + /// + private static XmlElement CreateParameterElement(PropertyInfo property, object paramObject, XmlDocument doc) + { + XmlElement paramElement = doc.CreateElement(ParamElementname); + + XmlAttribute nameAttribute = doc.CreateAttribute(NameAttributename); + nameAttribute.InnerText = property.Name; + paramElement.Attributes.Append(nameAttribute); + + XmlAttribute paramTypeAttribute = doc.CreateAttribute(TypeAttributename); + paramTypeAttribute.InnerText = MapType(property.GetGetMethod().ReturnType); + paramElement.Attributes.Append(paramTypeAttribute); + + object val = property.GetValue(paramObject, null); + if (val != null) + { + if (paramTypeAttribute.InnerText == "record") + { + XmlElement recordElement = CreateRecordElement(val, doc); + paramElement.AppendChild(recordElement); + } + else if (paramTypeAttribute.InnerText == "sequence") + { + XmlAttribute seqTypeAttribute = doc.CreateAttribute(SequenceTypeAttributename); + bool isComplexTypeSequence; + if (property.PropertyType == typeof(string[])) + { + seqTypeAttribute.InnerText = MapType(typeof(string)); + isComplexTypeSequence = false; + } + else + { + seqTypeAttribute.InnerText = RecordElementname; + isComplexTypeSequence = true; + } + paramElement.Attributes.Append(seqTypeAttribute); + + Array ar = (Array)val; + for (int i = 0; i < ar.Length; ++i) + { + XmlElement itemElement = doc.CreateElement(ItemElementname); + if (isComplexTypeSequence) + { + XmlElement recordElement = CreateRecordElement(ar.GetValue(i), doc); + itemElement.AppendChild(recordElement); + } + else + { + itemElement.InnerText = ar.GetValue(i).ToString(); + } + paramElement.AppendChild(itemElement); + } + } + else + { + paramElement.InnerText = SerializeValue(val); + } + } + + return paramElement; + } + } +} diff --git a/SEClient/NotificationBroker/LocalSubscription.cs b/SEClient/NotificationBroker/LocalSubscription.cs new file mode 100644 index 0000000..21be9e5 --- /dev/null +++ b/SEClient/NotificationBroker/LocalSubscription.cs @@ -0,0 +1,91 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.Threading; + +namespace MT.Platform.Common +{ + /// + /// Application specific Notification Broker message handler delegate. + /// + /// + /// + public delegate void NotificationHandler(object sender, Notification notification); + + /// + /// Subscriber using in-AppDomain communication via delegates. + /// + public class LocalSubscription : Subscription + { + /// + /// Constructor + /// + /// type of notification this subscriber is interested to receive + /// notification message filter defining rules for filter in or out of messages + /// (Multicast-)Delegate to invoke for notification delivery + public LocalSubscription(Type type, NotificationHandler handler, IList filters) + : base(type, filters) + { + lock (LockObject) + { + this.handler = handler; + } + } + + private NotificationHandler handler; + /// + /// Delegate to invoke when a notification of a desired type arrives. + /// + public NotificationHandler Handler + { + get { lock (LockObject) { return handler; } } + } + + /// + /// Safely invoke delegates to fire notification. Done on a separate thread pool thread. + /// + /// + public override void Send(Notification notification) + { + // Broadcast messages individually + Delegate[] invocationList = null; + lock (LockObject) + { + if (this.Handler == null) return; + invocationList = (Delegate[])this.Handler.GetInvocationList().Clone(); + } + + // If not a multicast delegate, then invoke in this thread, as Subscriptions.Fire already + // scheduled invocation onto a separate thread from the one calling ServiceAccessor.GetService().Fire() + if (invocationList.Length == 1) + { + // singlecast delegate (only 1 handler). Call directly from this thread pool thread. + // For performance reasons do not switch to yet another thread. + invocationList[0].DynamicInvoke(this, notification); + } + else + { + // Invoke every delegate separately to allow for exception handling. + // Otherwise following handlers are not invoked. + foreach (NotificationHandler oneNotiticationHandler in invocationList) + { + try + { + ThreadPool.QueueUserWorkItem(delegate(object state) + { + NotificationHandler handler = state as NotificationHandler; + + // invoke one separate invocation handler on pool thread to decouple. + handler(this, notification); + }, oneNotiticationHandler); + } + catch (Exception ex) + { + throw new NotImplementedException("One of the multicast delegate invocations on " + + "subscription handlers failed. Decide on actions in this catch block!", ex); + } + } + } + } + } +} diff --git a/SEClient/NotificationBroker/NotificationBroker.cs b/SEClient/NotificationBroker/NotificationBroker.cs new file mode 100644 index 0000000..4ae2cea --- /dev/null +++ b/SEClient/NotificationBroker/NotificationBroker.cs @@ -0,0 +1,223 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.Threading; +using System.Diagnostics.CodeAnalysis; +using log4net; +using System.Globalization; + +namespace MT.Platform.Common +{ + /// + /// Notification Broker to broadcast local and/or remote notifications. + /// + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1724:TypeNamesShouldNotMatchNamespaces")] + public static class NotificationBroker + { + #region [auto] Fields + + /// + /// Writes to logging infrastructure. + /// + private static readonly ILog logger = LogManager.GetLogger(typeof(NotificationBroker)); + + /// + /// An identifier to distinguish instances of NB (client, server), + /// so not to sound notifications in circles. To check if process name is sufficient. + /// + private static string id = System.Diagnostics.Process.GetCurrentProcess().ProcessName.Replace(".vshost", ""); + + /// + /// List of subscriptions + /// + private static Subscriptions subscriptions = new Subscriptions(); + + #endregion [auto] Fields + + #region [auto] Properties + + /// + /// NotificationBroker identification used as sender. Do not dispatch notification sent yourself. + /// + public static string Id { get { return id; } } + + #endregion [auto] Properties + + #region [auto] Methods + + /// + /// Remove and disposes all subscriptions. + /// + public static void Clear() + { + // remove all local ones + subscriptions.Clear(); + } + + /// + /// Registers a notification subscription (including type, handlers and filters). + /// + /// The subscription (local, web service, db, etc.) to register. + public static void Register(Subscription subscription) + { + lock (subscriptions) + { + subscriptions.Add(subscription); + } + } + + /// + /// Registers a notification subscription (including type, handlers and filters). + /// + /// The type of the message to register for. + /// The handler to invoke when a message of the given type arrives. + /// The filters that apply for this subscription so not to get certain messages. + public static void Register(Type type, NotificationHandler handler, IList filters) + { + LocalSubscription subscription = new LocalSubscription(type, handler, filters); + lock (subscriptions) + { + subscriptions.Add(subscription); + } + } + + /// + /// Publishes a notification message. + /// + /// The notification message. + /// The scope of the notification (Local or Remote/Local). + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1031:DoNotCatchGeneralExceptionTypes"), SuppressMessage("Microsoft.Design", "CA1030", Justification = "there are no events in a WCF contract")] + public static void Send(Notification notification, NotificationScope scope) + { + // test inputs + //Validate.IsNotNull(notification, "Must pass a valid notification"); + + // adds the sender (current named instance of NB) to the notification + // to find out that a certain notification was sent by yourself! + if (string.IsNullOrEmpty(notification.Sender)) + { + // only the initial sender is important. Do not overwrite by intermediary service callback + // implementations calling this Send() too. + notification.Sender = Id; + } + + // fire locally. Get a copied list of subscription references. + lock (subscriptions) + { + IList copiedSubscriptions = subscriptions.Get(notification.GetType()); + foreach (Subscription subscription in copiedSubscriptions) + { + try + { + // fire when no filter specified + if (subscription.Filters == null) + { + SendAsync(subscription, notification, scope); + continue; + } + if (subscription.Filters.Count == 0) + { + SendAsync(subscription, notification, scope); + continue; + } + + // fire when one of the filters evaluates to true + bool filterIncluded = true; + bool filterExcluded = false; + foreach (ISubscriptionFilter subscriptionFilter in subscription.Filters) + { + // fire when one (and only when; not and/or logic) filter include evaluates true + if (subscriptionFilter.FilterOperation == SubscriptionFilterOperation.Include + && !subscriptionFilter.IsMatch(notification)) + { + filterIncluded = false; // filter out + } + // however, does not fire when one (and only when; not and/or logic) filter exclude evaluates true + if (subscriptionFilter.FilterOperation == SubscriptionFilterOperation.Exclude + && subscriptionFilter.IsMatch(notification)) + { + filterExcluded = true; // filter out + } + + if (filterIncluded && !filterExcluded) + { + SendAsync(subscription, notification, scope); + } + } + } + catch (Exception ex) + { + logger.Warn("One of the subscription handler invocations failed.", ex); + } + } + } + } + + /// + /// Unregisters a notification subscription. + /// + /// The subscription to remove (local, web service, db, etc.). + public static void Unregister(Subscription subscription) + { + lock (subscriptions) + { + subscriptions.Remove(subscription); + } + } + + /// + /// Unregisters a notification subscription. + /// + /// The type of the subscription to remove. + /// The handler that was registered to receive notifications. + public static void Unregister(Type type, NotificationHandler handler) + { + lock (subscriptions) + { + subscriptions.Remove(type, handler); + } + } + + /// + /// Unregisters the specified type. + /// + /// The type of message to unregister. + public static void Unregister(Type type) + { + lock (subscriptions) + { + subscriptions.Remove(type); + } + } + + /// + /// Asynchronously send notification using a thread pool thread. + /// + /// The subscription. + /// The notification. + /// The scope of the notification. + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1031:DoNotCatchGeneralExceptionTypes")] + private static void SendAsync(Subscription subscription, Notification notification, NotificationScope scope) + { + if (subscription.Scope == scope || scope == NotificationScope.Remote) + { + // go to another thread to execute delegate! + ThreadPool.QueueUserWorkItem( + delegate(object state) + { + try + { + // invoke one separate invocation handler on pool thread to decouple. + subscription.Send(notification); + } + catch (Exception ex) + { + logger.Warn(string.Format(CultureInfo.InvariantCulture, "{0} subscription handler {1} invocations failed.", subscription.Scope, subscription.NotificationType.FullName), ex); + } + }, null); + } + } + + #endregion [auto] Methods + } +} diff --git a/SEClient/NotificationBroker/NotificationHelper.cs b/SEClient/NotificationBroker/NotificationHelper.cs new file mode 100644 index 0000000..2c25de3 --- /dev/null +++ b/SEClient/NotificationBroker/NotificationHelper.cs @@ -0,0 +1,53 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.Runtime.Serialization; +using System.Xml.Serialization; +using System.IO; + +namespace MT.Platform.Common +{ + /// + /// Supporting functionality around notifications + /// + public static class NotificationHelper + { + /// + /// Serialize notification object into a string. + /// + /// + /// + public static string Serialize(Notification notification) + { + Validate.IsNotNull(notification, "must pass a notification"); + + XmlSerializer serializer = new XmlSerializer(typeof(Notification)); + + using (MemoryStream ms = new MemoryStream()) + { + serializer.Serialize(ms, notification); + + // convert to string + return Encoding.UTF8.GetString(ms.ToArray()); + } + } + + /// + /// Deserialize string into a notification object. + /// + /// + /// + public static Notification Deserialize(string data) + { + Validate.IsTrue(!string.IsNullOrEmpty(data), "must pass a notification data"); + + // use .NET 3.0 (WCF) serializer + XmlSerializer serializer = new XmlSerializer(typeof(Notification)); + using (MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(data))) + { + Notification notification = (Notification)serializer.Deserialize(ms); + return notification; + } + } + } +} diff --git a/SEClient/NotificationBroker/Notifications/LogWrittenNotification.cs b/SEClient/NotificationBroker/Notifications/LogWrittenNotification.cs new file mode 100644 index 0000000..2c2c567 --- /dev/null +++ b/SEClient/NotificationBroker/Notifications/LogWrittenNotification.cs @@ -0,0 +1,16 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using MT.Platform.Common; + +namespace Services.NotificationBroker.Notifications +{ + /// + /// Notification to be used to send written log texts to interested parties. + /// + public class LogWrittenNotification : Notification + { + public string Text { get; set; } + } +} diff --git a/SEClient/NotificationBroker/Notifications/Notification.cs b/SEClient/NotificationBroker/Notifications/Notification.cs new file mode 100644 index 0000000..fea7ca2 --- /dev/null +++ b/SEClient/NotificationBroker/Notifications/Notification.cs @@ -0,0 +1,53 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.Runtime.Serialization; + +namespace MT.Platform.Common +{ + /// + /// Abstract base class for all NotificationBroker messages. + /// + public class Notification + { + /// + /// Constructor to initialize content values. + /// + public Notification() + { + this.Stamp = DateTime.Now; + this.Id = Guid.NewGuid(); + } + + private Guid id; + /// + /// Notification identier. + /// + public Guid Id + { + get { return id; } + set { id = value; } + } + + private DateTime stamp; + /// + /// Notification creator's time stamp. + /// + public DateTime Stamp + { + get { return stamp; } + set { stamp = value; } + } + + private string sender; + /// + /// Sender identification of notification. Used so not to send back to publisher? + /// + public string Sender + { + get { return sender; } + set { sender = value; } + } + + } +} diff --git a/SEClient/NotificationBroker/Notifications/NotificationScope.cs b/SEClient/NotificationBroker/Notifications/NotificationScope.cs new file mode 100644 index 0000000..36cbaa5 --- /dev/null +++ b/SEClient/NotificationBroker/Notifications/NotificationScope.cs @@ -0,0 +1,21 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace MT.Platform.Common +{ + /// + /// Notifications are sent in-process, cross-process, etc. + /// + public enum NotificationScope + { + /// + /// Subscribers are in the same process and AppDomain + /// + Local, + /// + /// Subscribers can also be in other processes. Needs remote notification strategy attached. + /// + Remote + } +} diff --git a/SEClient/NotificationBroker/Subscription.cs b/SEClient/NotificationBroker/Subscription.cs new file mode 100644 index 0000000..df6f85a --- /dev/null +++ b/SEClient/NotificationBroker/Subscription.cs @@ -0,0 +1,65 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.Threading; +using System.Diagnostics.CodeAnalysis; + +namespace MT.Platform.Common +{ + /// + /// Subscription base class. Contains notification "type" and notification message filters. + /// + public abstract class Subscription + { + private object lockObject = new object(); + /// + /// Lock for ensuring thread safety of subscriptions. + /// + protected object LockObject { get { return lockObject; } } + + /// + /// Constructor + /// + /// type of notification this subscriber is interested to receive + /// notification message filter defining rules for filter in or out of messages + protected Subscription(Type notificationType, IList filters) + { + lock (lockObject) + { + this.notificationType = notificationType; + this.filters = filters; + } + } + + private Type notificationType = null; + /// + /// Notification type. Type.Missing means to subscribe for any type of notification. + /// + public Type NotificationType + { + get { return notificationType; } + } + + private IList filters; + /// + /// List of notification message filters. Depending on the notification's content it is sent or not. + /// Allows for more fine-grained control over notification subscriptions and who gets which notifications. + /// + public IList Filters + { + get { return filters; } + } + + /// + /// Indicates whether subscription is local or remote. + /// + public virtual NotificationScope Scope { get { return NotificationScope.Local; } } + + /// + /// Send notification using this subscriber type. + /// + /// + [SuppressMessage("Microsoft.Design", "CA1030", Justification="there are no events in a WCF contract")] + public abstract void Send(Notification notification); + } +} diff --git a/SEClient/NotificationBroker/SubscriptionFilters/ISubscriptionFilter.cs b/SEClient/NotificationBroker/SubscriptionFilters/ISubscriptionFilter.cs new file mode 100644 index 0000000..16d51e1 --- /dev/null +++ b/SEClient/NotificationBroker/SubscriptionFilters/ISubscriptionFilter.cs @@ -0,0 +1,24 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace MT.Platform.Common +{ + /// + /// NotificationBroker subscription filter interface for custom filter implementations + /// + public interface ISubscriptionFilter + { + /// + /// Return true when filter evaluates true. + /// + /// + /// + bool IsMatch(object notification); + + /// + /// Indicates, when this filter evaluating to true, that the message is explicitely included or excluded. + /// + SubscriptionFilterOperation FilterOperation { get; set; } + } +} diff --git a/SEClient/NotificationBroker/SubscriptionFilters/SubscriptionFilterOperation.cs b/SEClient/NotificationBroker/SubscriptionFilters/SubscriptionFilterOperation.cs new file mode 100644 index 0000000..369c770 --- /dev/null +++ b/SEClient/NotificationBroker/SubscriptionFilters/SubscriptionFilterOperation.cs @@ -0,0 +1,22 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace MT.Platform.Common +{ + /// + /// Subscription filter operation type + /// + public enum SubscriptionFilterOperation + { + /// + /// Include in filter when rule matches true + /// + Include, + + /// + /// Exclude in filter when rule matches true + /// + Exclude + } +} diff --git a/SEClient/NotificationBroker/Subscriptions.cs b/SEClient/NotificationBroker/Subscriptions.cs new file mode 100644 index 0000000..1e89f73 --- /dev/null +++ b/SEClient/NotificationBroker/Subscriptions.cs @@ -0,0 +1,176 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace MT.Platform.Common +{ + /// + /// Manages list of notification subscriptions. Can be of local or remote kind. + /// + public sealed class Subscriptions + { + /// + /// List of subscriptions + /// + private IList subscribers; + + /// + /// Default Constructor + /// + public Subscriptions() + { + subscribers = new List(); + } + + /// + /// Add subscription to list + /// + /// + public void Add(Subscription subscriber) + { + lock (this) + { + subscribers.Add(subscriber); + } + } + + /// + /// Get a list of subscriptions of the specified type. Filters are not taken into account yet. + /// Also return subscriptions for all type of notifications (type = null). + /// + /// Notification type or "null" type for all messages. + /// List of subscriptions + public IList Get(Type type) + { + IList getSubscribers = new List(); + lock (this) + { + foreach (Subscription subscriber in this.subscribers) + { + // send to registered subscriptions + // with all types + if (type == null + || (subscriber.NotificationType != null && subscriber.NotificationType.Equals(type)) + || (type != null && subscriber.NotificationType == null)) + { + getSubscribers.Add(subscriber); + } + } + } + return getSubscribers; + } + + /// + /// Remove a subscription from the list + /// + /// + public void Remove(Subscription subscriber) + { + Remove(subscriber.NotificationType); + } + + /// + /// Remove a delegate from local subscriptions in the list. + /// + /// The type of the notification. + /// The handler for the notification. + public void Remove(Type type, NotificationHandler handler) + { + IList removeList = new List(); + + lock (this) + { + // first the ones to remove + foreach (Subscription subscription in subscribers) + { + LocalSubscription localSubscription = subscription as LocalSubscription; + if (localSubscription != null) + { + if (localSubscription.NotificationType != null + && localSubscription.NotificationType.Equals(type) + && localSubscription.Handler.Equals(handler)) + { + removeList.Add(localSubscription); + } + } + } + } + + // then remove separately + foreach (Subscription subscription in removeList) + { + RemoveOne(subscription); + } + } + + /// + /// Removes and disposes one subscription. + /// + /// + private void RemoveOne(Subscription subscription) + { + lock (this) + { + // remove from list + subscribers.Remove(subscription); + + // and dispose + IDisposable disposableSubscription = subscription as IDisposable; + if (disposableSubscription != null) + { + disposableSubscription.Dispose(); + } + } + } + + /// + /// Remove all subscription for the given type from the list + /// + /// The type of the notification to remove. + public void Remove(Type type) + { + IList removeList = new List(); + + lock (this) + { + // first the ones to remove + foreach (Subscription subscription in subscribers) + { + if (subscription.NotificationType != null && subscription.NotificationType.Equals(type)) + { + removeList.Add(subscription); + } + } + } + + // then remove separately + foreach (Subscription subscription in removeList) + { + RemoveOne(subscription); + } + } + + /// + /// Remove and disposes all subscriptions. + /// + public void Clear() + { + lock (this) + { + IList removeList = new List(); + + // get the ones to remove in separate list. Cannot loop over a list and remove items ...! + foreach (Subscription subscription in subscribers) + { + removeList.Add(subscription); + } + + // then remove separately + foreach (Subscription subscription in removeList) + { + RemoveOne(subscription); + } + } + } + } +} diff --git a/SEClient/NotificationBroker/Validation/Validate.cs b/SEClient/NotificationBroker/Validation/Validate.cs new file mode 100644 index 0000000..fbe6ef5 --- /dev/null +++ b/SEClient/NotificationBroker/Validation/Validate.cs @@ -0,0 +1,95 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Reflection; +using System.ComponentModel; +using System.Globalization; +using System.Diagnostics.CodeAnalysis; + +namespace MT.Platform.Common +{ + /// + /// This is a helper class for validation. + /// + public sealed class Validate + { + private Validate() { } + + /// + /// Determines whether the specified is null. + /// In case of null the specified exception will be thrown. + /// + /// The o. + /// The formated message. + /// The args. + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "o"), System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "formated"), System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1004:GenericMethodsShouldProvideTypeParameter"), SuppressMessage("Microsoft.DesignRules", "CA1004", Justification = "For a better readability.")] + public static void IsNotNull(object o, string formatedMessage, params object[] args) where TExceptionType : System.Exception, new() + { + IsFalse(o == null, formatedMessage, args); + } + + /// + /// Determines whether the specified is true. + /// In case of the condition is false the specified condition is thrown. + /// + /// if set to true [condition]. + /// The formated message. + /// The args. + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "formated"), System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1004:GenericMethodsShouldProvideTypeParameter"), SuppressMessage("Microsoft.DesignRules", "CA1004", Justification = "For a better readability.")] + public static void IsTrue(bool condition, string formatedMessage, params object[] args) where TExceptionType : System.Exception, new() + { + IsFalse < TExceptionType >(!condition, formatedMessage, args); + } + + /// + /// Determines whether the specified is false. + /// In case of the condition is true the specified exception is thrown. + /// + /// if set to true [condition]. + /// The formated message. + /// The args. + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1004:GenericMethodsShouldProvideTypeParameter"), SuppressMessage("Microsoft.DesignRules", "CA1004", Justification = "For a better readability.")] + public static void IsFalse(bool condition, string formatedMessage, params object[] args) where TExceptionType : System.Exception, new() + { + if (condition) + { + TExceptionType exception = new TExceptionType(); + SetProperty(exception, "_message", string.Format(CultureInfo.CurrentCulture, formatedMessage, args), false); + throw exception; + } + } + + /// + /// Sets a field / property of an object. + /// + /// The object of which the field / property should be set + /// The name of the field / property + /// The value of the property + /// True if it shall operate case insensitive + static private void SetProperty(object obj, string propertyName, string propertyValue, bool ignoreCase) + { + BindingFlags bindings = BindingFlags.Public | BindingFlags.Instance; + if (ignoreCase) + { + bindings |= BindingFlags.IgnoreCase; + } + Type type = obj.GetType(); + + // look for a setable property + PropertyInfo property = type.GetProperty(propertyName, bindings); + if (property != null && property.CanWrite) + { + property.SetValue(obj, propertyValue, null); + return; + } + // look for a public field + FieldInfo field = type.GetField(propertyName, BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance); + if (field != null) + { + field.SetValue(obj, propertyValue); + return; + } + } + } +} diff --git a/SEClient/Properties/AssemblyInfo.cs b/SEClient/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..c107616 --- /dev/null +++ b/SEClient/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("ClassLibrary1")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("ClassLibrary1")] +[assembly: AssemblyCopyright("Copyright © 2015")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("e097fca6-5287-4f3b-b841-544ed9e75ffc")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/SEClient/ResultMessageSerializer.cs b/SEClient/ResultMessageSerializer.cs new file mode 100644 index 0000000..4372b3d --- /dev/null +++ b/SEClient/ResultMessageSerializer.cs @@ -0,0 +1,307 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Reflection; +using System.Text; +using System.Threading.Tasks; +using System.Xml; +using System.Xml.Serialization; +using MT.pHLab.SE.V1; +using XMLSerializationCustomization; + +namespace SERemoteLib +{ + public class SEResultMessageSerializer + { + + public static string Serialize(ResultMessage objResultMessage) + { + XmlSerializer xmlSerializer = new XmlSerializer(objResultMessage.GetType()); + StringWriter xmlStream = new StringWriter(); + xmlSerializer.Serialize(xmlStream, objResultMessage); + return xmlStream.ToString(); + } + + public static ResultMessage Deserialize(string xmlResultMessage) + { + StringReader stringReader = new StringReader(xmlResultMessage); + XmlTextReader reader = new XMLSerializationCustomization.PdkXmlTextReader(stringReader); + + ResultMessage objResultMessage = new ResultMessage(); + + XmlRootAttribute xmlRoot = new XmlRootAttribute(); + xmlRoot.Namespace = "tf"; + //xmlRoot.ElementName = ""; + xmlRoot.IsNullable = true; + XmlSerializer xmlser = new XmlSerializer(objResultMessage.GetType(), xmlRoot); + + return (ResultMessage)xmlser.Deserialize(reader); + } + + public static string SerializeString(ResultMessage rm) + { + string sResultMessage = ""; + string sResult = ""; + string sResultType = ""; + string sResultUnit = ""; + + try + { + Object Result = rm.result.Item; + Type ResultType = Result.GetType(); + string[] a = ResultType.ToString().Split('.'); + sResultType = a[a.Length - 1]; + + if (ResultType == typeof(DecimalResult)) + { + sResult = SerializeDecimalResult((DecimalResult)Result); + } + else if (ResultType == typeof(IntegerResult)) + { + sResult = ((IntegerResult)Result).value.ToString(); + } + else if (ResultType == typeof(StringResult)) + { + sResult = ((StringResult)Result).value; + } + else if (ResultType == typeof(ResultPh)) + { + + return GetText((ResultPh)Result); + } + else if (ResultType == typeof(ResultCnd)) + { + return GetText((ResultCnd)Result); + } + //else if (ResultType == typeof(ErrorResult)) + //{ + // sResult = SerializeErrorResult((ErrorResult)Result); + //} + else + { + sResult = string.Format("??? type: {0}", sResultType); + } + + } + catch (Exception) + { + sResult = "ERROR"; + } + + //get result unit + sResultUnit = rm.unitstring; + if (String.IsNullOrEmpty(sResultUnit)) + { + sResultUnit = ((ECommonUnit)rm.unit).ToString(); + } + + sResultMessage = string.Format("{0}.{1}.{2} ({3}) -> {4} [{5}] (Prec: {6})" + , rm.rackid + , rm.slotid + , rm.groupid + , sResultType + , sResult + , sResultUnit + , rm.precision + ); + + return sResultMessage; + } + + private static string SerializeDecimalResult(DecimalResult r) + { + switch (r.state) + { + case EDecimalResultState.eDecimalResultState_Valid: + return r.value.ToString(); + case EDecimalResultState.eDecimalResultState_NaN: + return "NaN"; + case EDecimalResultState.eDecimalResultState_INF: + return "INF"; + default: + throw new ArgumentOutOfRangeException("r.state"); + + } + } + + static public string GetText(EAnalysisStatus enumAnalysisStatus) + { + switch (enumAnalysisStatus) + { + case EAnalysisStatus.eAnalysisStatusid_AnalysisStatus_OK: + return "OK"; + case EAnalysisStatus.eAnalysisStatusid_AnalysisStatus_OKStar: + return "OK*"; + case EAnalysisStatus.eAnalysisStatusid_AnalysisStatus_Failed: + return "Failed"; + case EAnalysisStatus.eAnalysisStatusid_AnalysisStatus_Error: + return "Error"; + case EAnalysisStatus.eAnalysisStatusid_AnalysisStatus_CriticalError: + return "Critical Error"; + case EAnalysisStatus.eAnalysisStatusid_AnalysisStatus_Terminate: + return "Terminate"; + default: + return string.Empty; + } + } + + static public string GetText(EResultLimitState enumResultLimitState) + { + switch (enumResultLimitState) + { + case EResultLimitState.eResultLimit_NotChecked: + return "Not Checked"; + case EResultLimitState.eResultLimit_InRange: + return "In Range"; + case EResultLimitState.eResultLimit_OutUpper: + return "Error (above high limit)"; + case EResultLimitState.eResultLimit_OutLower: + return "Error (below low limit)"; + case EResultLimitState.eResultLimit_min: + return "Minimum"; + case EResultLimitState.eResultLimit_max: + return "Maximum"; + default: + return string.Empty; + } + } + + static public string GetText(ECommonUnit eCommonUnit) + { + switch (eCommonUnit) + { + case ECommonUnit.eCommonUnitid_CommonUnit_None: + return string.Empty; + case ECommonUnit.eCommonUnitid_CommonUnit_PSU: + return "psu"; + case ECommonUnit.eCommonUnitid_CommonUnit_PPT: + return "ppt"; + case ECommonUnit.eCommonUnitid_CommonUnit_MMOLL: + return "mmol/L"; + case ECommonUnit.eCommonUnitid_CommonUnit_MOLL: + return "mol/L"; + case ECommonUnit.eCommonUnitid_CommonUnit_TDSPPT: + return "ppt(‰)"; + case ECommonUnit.eCommonUnitid_CommonUnit_MgL: + return "mg/L"; + case ECommonUnit.eCommonUnitid_CommonUnit_PPM: + return "ppm"; + case ECommonUnit.eCommonUnitid_CommonUnit_Percent: + return "%"; + case ECommonUnit.eCommonUnitid_CommonUnit_PX: + return "pX"; + case ECommonUnit.eCommonUnitid_CommonUnit_PH: + return "pH"; + case ECommonUnit.eCommonUnitid_CommonUnit_MV: + return "mV"; + case ECommonUnit.eCommonUnitid_CommonUnit_RelMV: + return "Rel.mV"; + case ECommonUnit.eCommonUnitid_CommonUnit_USCM: + return "µS/cm"; + case ECommonUnit.eCommonUnitid_CommonUnit_MSCM: + return "mS/cm"; + case ECommonUnit.eCommonUnitid_CommonUnit_SPerM: + return "S/m"; + case ECommonUnit.eCommonUnitid_CommonUnit_USPerM: + return "µS/m"; + case ECommonUnit.eCommonUnitid_CommonUnit_MSPerM: + return "mS/m"; + case ECommonUnit.eCommonUnitid_CommonUnit_GPerL: + return "g/L"; + case ECommonUnit.eCommonUnitid_CommonUnit_mBar: + return "mbar"; + case ECommonUnit.eCommonUnitid_CommonUnit_hPa: + return "hPa"; + case ECommonUnit.eCommonUnitid_CommonUnit_mmHg: + return "mmHg"; + case ECommonUnit.eCommonUnitid_CommonUnit_Atm: + return "Atm"; + case ECommonUnit.eCommonUnitid_CommonUnit_KOCM: + return "KΩ.cm"; + case ECommonUnit.eCommonUnitid_CommonUnit_MOCM: + return "MΩ.cm"; + case ECommonUnit.eCommonUnitid_CommonUnit_OCM: + return "Ω.cm"; + case ECommonUnit.eCommonUnitid_CommonUnit_GPerMOL: + return "g/Mol"; + case ECommonUnit.eCommonUnitid_CommonUnit_CellConstant: + return "CC"; + case ECommonUnit.eCommonUnitid_CommonUnit_MVPerPH: + return "mV/pH"; + case ECommonUnit.eCommonUnitid_CommonUnit_MVPerPX: + return "mV/pX"; + case ECommonUnit.eCommonUnitid_CommonUnit_ML: + return "mL"; + case ECommonUnit.eCommonUnitid_CommonUnit_Celsius: + return "°C"; + case ECommonUnit.eCommonUnitid_CommonUnit_Fahrenheit: + return "°F"; + case ECommonUnit.eCommonUnitid_CommonUnit_Ohm: + return "Ω"; + case ECommonUnit.eCommonUnitid_CommonUnit_Seconds: + return "s"; + case ECommonUnit.eCommonUnitid_CommonUnit_V: + return "V"; + case ECommonUnit.eCommonUnitid_CommonUnit_PercentPerCenti: + return "%"; + case ECommonUnit.eCommonUnitid_CommonUnit_KOhm: + return "K.Ω"; + case ECommonUnit.eCommonUnitid_CommonUnit_MOhm: + return "M.Ω"; + default: + return string.Empty; + } + } + + static public string GetText(EResultQuality enumResultQuality) + { + switch (enumResultQuality) + { + case EResultQuality.eDraftValue: + return "Draft"; + case EResultQuality.eDraftValue_Stable: + return "Draft/Stable"; + case EResultQuality.eManualEndpoint: + return "Manualendpoint"; + case EResultQuality.eAutoEndpoint_Strict: + return "Automatic/Strict"; + case EResultQuality.eAutoEndpoint_Normal: + return "Automatic/Normal"; + case EResultQuality.eAutoEndpoint_Fast: + return "Automatic/Standard"; + case EResultQuality.eAutoEndpoint_UserDef: + return "Automatic/User defined"; + case EResultQuality.eTimedEndpoint: + return "Timed"; + default: + return "Unspecified"; + } + } + + static public string GetText(ResultCnd result) + { + string output = string.Format("Cnd: {0}{1}, {2}{3} ({4} {5})", + result.resultValue.Value, + GetText(result.resultUnit), + result.rawTemperature.Value, + GetText(result.temperatureUnit), + GetText(result.resultQuality), + GetText(result.resultLimitState)); + + return output; + } + static public string GetText(ResultPh result) + { + string output = string.Format("Ph: {0}{1}, {2}{3} ({4} {5})", + result.resultValue.Value, + GetText(result.resultUnit), + result.rawTemperature.Value, + GetText(result.temperatureUnit), + GetText(result.resultQuality), + GetText(result.resultLimitState)); + + return output; + } + } +} diff --git a/SEClient/SEClient.cs b/SEClient/SEClient.cs new file mode 100644 index 0000000..e877be8 --- /dev/null +++ b/SEClient/SEClient.cs @@ -0,0 +1,319 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Net; +using System.Net.Sockets; +using System.Reflection; +using System.Text; +using System.Threading; +using System.Threading.Tasks; +using System.Windows.Forms; +using System.Xml; +using System.Xml.Serialization; +using log4net; +using MT.Platform.Common; +using Services.NotificationBroker.Notifications; + +namespace SERemoteConnection +{ + + public class SEResult: ResultMessageSubscriber + { + private static readonly ILog logger = LogManager.GetLogger(typeof(SEClient)); + + public SEResult() :base("SEResult") + { + } + + public override void Update(uint jobId, string xmlResultMessage) + { + string text= string.Format("[R] jobId({0}) result({1}):", jobId, xmlResultMessage ); + NotificationBroker.Send(new LogWrittenNotification { Text = text, Sender = this.GetType().FullName, Stamp = DateTime.Now }, NotificationScope.Local); + } + } + + + public class SEClient + { + private short m_jobId; + private static readonly ILog logger = LogManager.GetLogger(typeof(SEClient)); + + bool LoggingIsPending { set; get; } + + //private SEConnection m_connection; + private CommandDispatcher m_commandDispatcher; + + private SEResult m_seResult; + + enum Status + { + Attached, + Detached + }; + + private static IDictionary statsuMappings = new Dictionary() + { + { "Attached", Status.Attached }, + { "Detached", Status.Detached } + }; + + public SEClient(SEConnection connection) + { + m_commandDispatcher = new CommandDispatcher(connection); + m_seResult = new SEResult(); + m_commandDispatcher.Subscribe(m_seResult); + m_jobId = -1; + } + + public void Open(string host, int port) + { + + } + + public void Close() + { + + } + + public bool Attach() + { + CommandSimpleRequest command = new CommandSimpleRequest("connect"); + + bool success = false; + m_commandDispatcher.Submit(command); + + if (command.WaitForResponse()) + { + success = command.m_record.m_bSuccess; + } + + return success; + } + + public bool Detach() + { + CommandSimpleRequest command = new CommandSimpleRequest("disconnect"); + + bool success = false; + + m_commandDispatcher.Submit(command); + + if (command.WaitForResponse()) + { + success = command.m_record.m_bSuccess; + } + + return success; + } + + + + public string GetStatus() + { + string stringStatus = "not connected"; + + CommandGetState command = new CommandGetState(); + + MessageBox.Show("GetStatus 1"); + m_commandDispatcher.Submit(command); + MessageBox.Show("GetStatus 2"); + if (command.WaitForResponse()) + { + MessageBox.Show("GetStatus 3"); + stringStatus = command.m_record.m_status; + } + + return stringStatus; + } + + public string[] getListOfMethods() + { + string[] list = new string[0]; + + CommandGetListOfMethods command = new CommandGetListOfMethods(); + + m_commandDispatcher.Submit(command); + + if (command.WaitForResponse()) + { + list = command.m_list; + } + + return list; + + } + + public string[] getListOfSensors() + { + string[] list = new string[0]; + + CommandGetListOfSensors command = new CommandGetListOfSensors(); + + m_commandDispatcher.Submit(command); + + if (command.WaitForResponse()) + { + list = command.m_list; + } + + return list; + + } + + public MT.pHLab.SE.V1.moduleConfigParamRecord[] getListOfModules() + { + MT.pHLab.SE.V1.moduleConfigParamRecord[] list = null; + + CommandGetListOfModules command = new CommandGetListOfModules(); + + m_commandDispatcher.Submit(command); + + if (command.WaitForResponse()) + { + list = command.m_list; + } + + return list; + } + + public bool setModule(string moduleId, string sensorId) + { + bool success = false; + + CommandSetModule command = new CommandSetModule(); + command.m_request.m_moduleId = moduleId; + command.m_request.m_sensorId = sensorId; + + m_commandDispatcher.Submit(command); + + if (command.WaitForResponse()) + { + success = command.m_response.m_bSuccess; + } + return success; + } + + public bool startMethod(string methodId, string sampleId, string comment) + { + bool success = false; + + CommandStartMethod command = new CommandStartMethod(); + command.MethodId = methodId; + command.SampleId = sampleId; + command.Comment = comment; + + m_commandDispatcher.Submit(command); + + if (command.WaitForResponse()) + { + success = command.success; + m_jobId = command.m_JobId; + } + + return success; + } + + public bool terminateMethod() + { + bool success = false; + + CommandTerminateMethod command = new CommandTerminateMethod(); + command.JobId = m_jobId; + + m_commandDispatcher.Submit(command); + + if (command.WaitForResponse()) + { + success = command.m_response.m_bSuccess; + } + return success; + } + + public byte[] exportTable( EItemType eItemType ) + { + CommandExportTable command = new CommandExportTable(eItemType); + m_commandDispatcher.Submit(command); + if (command.WaitForResponse()) + { + return command.Table; + } + return null; + } + + public bool importTable( byte[] table ) + { + CommandImportTable command = new CommandImportTable(); + command.Table= table; + + m_commandDispatcher.Submit(command); + if (command.WaitForResponse()) + { + + } + return true; + } + + public string getSettings( string setting ) + { + CommandSettingGet command = new CommandSettingGet(); + command.Setting = setting; + + m_commandDispatcher.Submit(command); + if (command.WaitForResponse()) + { + + } + return command.Value; + } + + public bool setSettings(string setting, string value ) + { + CommandSettingSet command = new CommandSettingSet(); + command.Setting = setting; + command.Value = value; + + m_commandDispatcher.Submit(command); + if (command.WaitForResponse()) + { + return true; + } + return false; + } + + public bool showScreenLogin( string[] userlist, ref string username, ref string password ) + { + + CommandScreenLogin command = new CommandScreenLogin(); + command.Usererlist = userlist; + + LoggingIsPending = true; + + m_commandDispatcher.Submit(command); + if (command.WaitForResponse()) + { + username= command.Username; + password= command.Password; + } + + LoggingIsPending = false; + return true; + } + + public bool showScreenLoginCancel() + { + CommandSimpleRequest command = new CommandSimpleRequest("login.loginCancel"); + + bool success = false; + m_commandDispatcher.Submit(command); + + if (command.WaitForResponse()) + { + success = command.m_record.m_bSuccess; + } + + return success; + } + } + +} diff --git a/SEClient/SEClient.csproj b/SEClient/SEClient.csproj new file mode 100644 index 0000000..bbec694 --- /dev/null +++ b/SEClient/SEClient.csproj @@ -0,0 +1,104 @@ + + + + + Debug + AnyCPU + {5222F720-4E4F-4932-B01D-E4B8DBD8CC5F} + Library + Properties + SERemoteLib + SERemoteLib + v4.8 + 512 + + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + Off + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + ..\packages\log4net.3.0.3-preview.1\lib\net462\log4net.dll + + + + + + + + + + + + + + + + results_labxdirect.xsd + + + + + + + + + + + + + + + + + + + + + + + + + + + Designer + + + Designer + + + Designer + + + Designer + + + + + + + + + + \ No newline at end of file diff --git a/SEClient/SECommandDispatcher.cs b/SEClient/SECommandDispatcher.cs new file mode 100644 index 0000000..04afc4e --- /dev/null +++ b/SEClient/SECommandDispatcher.cs @@ -0,0 +1,222 @@ +using System; +using System.Collections.Generic; +using System.Globalization; +using System.IO; +using System.Linq; +using System.Net; +using System.Net.Sockets; +using System.Reflection; +using System.Text; +using System.Threading; +using System.Threading.Tasks; +using System.Xml; +using System.Xml.Serialization; +using log4net; +using MT.pHLab.SE.V1; +using MT.Platform.Common; +using SERemoteLib; +using Services.NotificationBroker.Notifications; + +namespace SERemoteConnection +{ + public abstract class AbstractCommand + { + private ManualResetEvent m_eventResponse; + private int m_requestId; + + static int mg_requestId = 300000000; + + public AbstractCommand() + { + m_eventResponse = new ManualResetEvent(false); + m_requestId = mg_requestId++; + } + + public int GetRequestId() + { + return m_requestId; + } + + public abstract bool OnResponse(XmlReader reader); + public abstract bool Submit(SEConnection connection); + + public void setResponse() + { + m_eventResponse.Set(); + } + + public bool WaitForResponse() + { + return m_eventResponse.WaitOne(); + } + } + + public abstract class ResultMessageSubscriber : ISubscriber + { + public string ObserverName { get; private set; } + public ResultMessageSubscriber(string name) + { + this.ObserverName = name; + } + public abstract void Update( uint jobId, string xmlResultMessage ); + } + + interface ISubscriber + { + void Update( uint jobId, string xmlResultMessage ); + } + + public class CommandDispatcher + { + private static readonly ILog logger = LogManager.GetLogger(typeof(CommandDispatcher)); + + private List m_commandList; + + private SEConnection m_connection; + + private List m_observers = new List(); + + public CommandDispatcher(SEConnection connection) + { + m_connection = connection; + m_connection.OnTelegram = new OnTelegramDelegate(this.OnTelegram); + m_commandList = new List(); + } + + ~CommandDispatcher() + { + } + + public void Subscribe(ResultMessageSubscriber observer) + { + m_observers.Add(observer); + } + + public void Unsubscribe(ResultMessageSubscriber observer) + { + m_observers.Remove(observer); + } + + + public bool Submit(AbstractCommand command) + { + bool success = false; + + m_commandList.Add(command); + + if (command.Submit(m_connection)) + { + success = command.WaitForResponse(); + } + + return success; + } + + public bool OnResponse(XmlReader reader) + { + bool success = false; + + int requestId = Int32.Parse(reader.GetAttribute("requestId")); + if (requestId >= 0) + { + foreach (var iCommand in m_commandList) + { + if (iCommand.GetRequestId() == requestId) + { + success= iCommand.OnResponse(reader); + + m_commandList.Remove(iCommand); + + break; + } + } + } + return success; + } + + private void OnResultMessage(uint jobId, XmlReader reader) + { + string xmlResultMessage = reader.ReadOuterXml(); + + m_observers.ForEach(x => x.Update(jobId, xmlResultMessage)); + + try + { + ResultMessage rm = SEResultMessageSerializer.Deserialize(xmlResultMessage); + Log(string.Format(CultureInfo.InvariantCulture, "notifyAnalysisResult: #{0} {1}" + , jobId + , SEResultMessageSerializer.SerializeString(rm) + )); + } + catch (Exception ex) + { + Log(string.Format(CultureInfo.InvariantCulture, "notifyAnalysisResult: #{0} ERROR DESERIALIZING \n{1}\n{2}" + , jobId, ex.ToString(), xmlResultMessage)); + } + + } + + // + // + // + // + // + // + // ... + + private void OnNotification(XmlReader reader) + { + string jobId = reader.GetAttribute("jopId"); + if (reader.Read()) + { + if (reader.Name.Equals("ResultMessage") && (reader.NodeType == XmlNodeType.Element)) + { + uint id = Convert.ToUInt32(jobId, 16); + OnResultMessage(id, reader); + } + else + if (reader.Name.Equals("EndOfMethod") && (reader.NodeType == XmlNodeType.Element)) + { + + } + } + } + + public void OnTelegram(byte[] telegram) + { + UTF8Encoding utf8 = new UTF8Encoding(); + string dump = utf8.GetString(telegram); + logger.DebugFormat("OnTelegram: {0}", dump); + + using (XmlReader reader = XmlReader.Create(new StringReader(dump))) + { + if (reader.ReadToFollowing("Telegram")) + { + if (reader.Read()) + if (reader.Name.Equals("Response") && (reader.NodeType == XmlNodeType.Element)) + { + OnResponse(reader); + } + else + if (reader.Name.Equals("Notification") && (reader.NodeType == XmlNodeType.Element)) + { + OnNotification(reader); + } + } + } + } + + /// + /// Logs the specified text by raising the LogWritten event. + /// + /// The text. + private void Log(string text) + { + text = "[C] " + text; + NotificationBroker.Send(new LogWrittenNotification { Text = text, Sender = this.GetType().FullName, Stamp = DateTime.Now }, NotificationScope.Local); + } + + + } + +} diff --git a/SEClient/SEConnection.cs b/SEClient/SEConnection.cs new file mode 100644 index 0000000..f2818b8 --- /dev/null +++ b/SEClient/SEConnection.cs @@ -0,0 +1,154 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Net; +using System.Net.Sockets; +using System.Threading; +using log4net; + +namespace SERemoteConnection +{ + //public abstract class ISEConnection + //{ + // public abstract void OnTelegram(byte[] telegram); + //} + public delegate void OnTelegramDelegate(byte[] telegram); + + + public class SEConnection : IDisposable + { + private static readonly ILog logger = LogManager.GetLogger(typeof(SEConnection)); + + private Socket m_socket; + private System.Threading.Thread m_thread; + private bool m_isActive; + private System.IO.MemoryStream m_stream; + + public OnTelegramDelegate OnTelegram { set; get; } + + + public SEConnection() + { + } + + ~SEConnection() + { + if (m_socket.Connected) + { + Close(); + } + } + + public void Dispose() + { + // What the f**, call dispose on the context and any of its members here + this.m_socket.Dispose(); + this.m_stream.Dispose(); + } + + public bool Open(string host, int port) + { + IPAddress[] IPs = Dns.GetHostAddresses(host); + + m_socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); + + try + { + m_socket.Connect(IPs[0], port); + + m_isActive = m_socket.Connected; + + if (m_isActive) + { + m_stream = new System.IO.MemoryStream(); + + m_thread = new System.Threading.Thread(Run); + m_thread.Start(); + } + } + catch (Exception) + { + m_isActive = false; + } + return m_isActive; + } + + + public void Close() + { + m_isActive = false; + m_socket.Close(); + m_thread.Join(); + } + + private void Run() + { + // Buffer to read data + var buffer = new byte[m_socket.ReceiveBufferSize]; + + while (m_socket.Connected && m_socket.Poll(-1, SelectMode.SelectRead)) + { + if (m_socket.Connected) + { + // There is data waiting to be read" + int readCount = m_socket.Receive(buffer); + + if (readCount > 0) + { + Process(buffer, readCount); + } + } + else + { + // Something bad has happened, shut down + } + } + } + + + public void Write(Byte[] buffer) + { + UTF8Encoding utf8 = new UTF8Encoding(); + string dump = utf8.GetString(buffer); + logger.DebugFormat("Write: {0}", dump); + + byte[] sendTerminater = Encoding.ASCII.GetBytes("\r\n"); + + m_socket.Send(buffer); + m_socket.Send(sendTerminater); + } + + private bool Process(byte[] buffer, int length) + { + for (var i = 0; i < length; ++i) + { + if (buffer[i] == '\r') + { + ++i; + if (i < length) + { + if (buffer[i] == '\n') + { + if (OnTelegram != null && m_stream.Capacity>0) + { + OnTelegram(m_stream.ToArray()); + } + m_stream = new System.IO.MemoryStream(); + } + else + { + m_stream.WriteByte(buffer[i]); + } + } + } + else + { + m_stream.WriteByte(buffer[i]); + } + } + return true; + } + } +} diff --git a/SEClient/SERecord.cs b/SEClient/SERecord.cs new file mode 100644 index 0000000..b06843c --- /dev/null +++ b/SEClient/SERecord.cs @@ -0,0 +1,745 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Reflection; +using System.Text; +using System.Threading.Tasks; +using System.Xml; +using System.Xml.Serialization; +using XMLSerializationCustomization; +using log4net; +using System.Collections; + +namespace MT.pHLab.SE.V1 +{ + /// + /// The serializer to generate an XML document. This class offers some functions to create general xml-elements + /// for the transfer of data over SOAP to a PDK instrument. + /// + public sealed class PdkXmlSerializer + { + private static IDictionary typeMappings; + + /// + /// The XmlElement name of a parameterlist-element. + /// + public static readonly String ParamlistElementname = "param-list"; + /// + /// The XmlElement name of a parameter-element. + /// + public static readonly String ParamElementname = "param"; + /// + /// The XmlElement name of a parameter-element. + /// + public static readonly String ItemElementname = "item"; + /// + /// The XmlAttribute name of a type-attribute. + /// + public static readonly String TypeAttributename = "type"; + /// + /// The XmlAttribute name of a sequence type-attribute. + /// + public static readonly String SequenceTypeAttributename = "sequenceType"; + /// + /// The XmlAttribute name of a name-attribute. + /// + public static readonly String NameAttributename = "name"; + + /// + /// The XmlElement name of a method-element. + /// + public static readonly String MethodElementname = "method"; + /// + /// The XmlElement name of a methodfunction-element. + /// + public static readonly String MethodfunctionElementname = "mf"; + /// + /// The XmlElement name of a record-element. + /// + public static readonly String RecordElementname = "record"; + + private static readonly ILog logger = LogManager.GetLogger(typeof(PdkXmlSerializer)); + + /// + /// Initializes a new instance of the class. + /// + private PdkXmlSerializer() + { } + + /// + /// Serializes the record into the PDK specific XML. + /// + /// The browsable screen record. + /// + public static string SerializeRecord(object record) + { + XmlDocument doc = new XmlDocument(); + + XmlElement recordElement = CreateRecordElement(record, doc); + doc.AppendChild(recordElement); + + if (logger.IsDebugEnabled) + { + logger.Debug("Serialized " + record.GetType().ToString() + " into " + doc.InnerXml); + } + + return doc.InnerXml.Replace("\r\n", " ").Replace("\n", " ").Replace("\t", " "); + } + + private static XmlElement CreateRecordElement(object recordObject, XmlDocument doc) + { + XmlElement recordElement = doc.CreateElement(RecordElementname); + + XmlAttribute recordTypeAttribute = doc.CreateAttribute(TypeAttributename); + recordTypeAttribute.InnerText = recordObject.GetType().Name; + recordElement.Attributes.Append(recordTypeAttribute); + + XmlElement paramListElement = CreateParameterListElement(recordObject, doc); + recordElement.AppendChild(paramListElement); + + return recordElement; + } + + /// + /// Initializes the type-mapping dictonary. + /// + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Performance", "CA1810:InitializeReferenceTypeStaticFieldsInline", Justification = "add collection members")] + static PdkXmlSerializer() + { + typeMappings = new Dictionary(); + + typeMappings.Add(typeof(string), "wstring"); + typeMappings.Add(typeof(bool), "boolean"); + typeMappings.Add(typeof(short), "short"); + typeMappings.Add(typeof(DateTime), "datetime"); + typeMappings.Add(typeof(decimal), "decfloat"); + typeMappings.Add(typeof(int), "long"); + typeMappings.Add(typeof(byte), "octet"); + typeMappings.Add(typeof(decfloat), "decfloat"); + typeMappings.Add(typeof(double), "double"); + } + + /// + /// Maps a to the according PDK type. + /// + /// + /// + public static String MapType(Type type) + { + if (typeMappings.ContainsKey(type)) + { + return typeMappings[type]; + } + else if (type.IsEnum) + { + return "short"; + } + else if (type.IsArray) + { + return "sequence"; + } + else + { + return "record"; + } + } + + /// + /// Serializes the value into the according XML representation. + /// + /// The value to serialize. MUST NOT be null + /// XML string representing the value. + public static String SerializeValue(object val) + { + String returnValue = null; + + if (val == null) + { + throw new ArgumentException("The argument val MUST NOT be null."); + } + + if (typeMappings.ContainsKey(val.GetType())) + { + if (val.GetType() == typeof(string)) + { + returnValue = (string)val; + } + else if (val.GetType() == typeof(bool)) + { + returnValue = XmlConvert.ToString((bool)val); + } + else if (val.GetType() == typeof(short)) + { + returnValue = XmlConvert.ToString((short)val); + } + else if (val.GetType() == typeof(DateTime)) + { + returnValue = XmlConvert.ToString((DateTime)val, "yyyy-MM-dd HH:mm:ss"); + } + else if (val.GetType() == typeof(decimal)) + { + returnValue = XmlConvert.ToString((decimal)val); + } + else if (val.GetType() == typeof(int)) + { + returnValue = XmlConvert.ToString((int)val); + } + else if (val.GetType() == typeof(byte)) + { + returnValue = XmlConvert.ToString((byte)val); + } + else if (val.GetType() == typeof(decfloat)) + { + returnValue = ((decfloat)val).Value; + } + else if (val.GetType() == typeof(double)) + { + returnValue = XmlConvert.ToString((double)val); + } + } + else if (val.GetType().IsEnum) + { + returnValue = XmlConvert.ToString((int)val); + } + return returnValue; + } + + /// + /// Creates the element param-list element with all its param subelements. Each property of the + /// is added as a param elemment. + /// + /// + /// + /// + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1059:MembersShouldNotExposeCertainConcreteTypes", MessageId = "System.Xml.XmlNode"), System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1720:IdentifiersShouldNotContainTypeNames", MessageId = "object")] + private static XmlElement CreateParameterListElement(object paramObject, XmlDocument doc) + { + XmlElement paramListElement = doc.CreateElement(ParamlistElementname); + + //add parameters + PropertyInfo[] properties = paramObject.GetType().GetProperties(); + foreach (PropertyInfo property in properties) + { + bool ignoreThisProperty = false; + foreach (System.Xml.Serialization.XmlIgnoreAttribute xmlIgnoreAttribute in property.GetCustomAttributes(typeof(System.Xml.Serialization.XmlIgnoreAttribute), false)) + { + ignoreThisProperty = true; + break; + } + + if (!ignoreThisProperty) + { + XmlElement paramElement = CreateParameterElement(property, paramObject, doc); + paramListElement.AppendChild(paramElement); + } + } + + return paramListElement; + } + + /// + /// Creates the param element for the . + /// + /// + /// + /// + /// + private static XmlElement CreateParameterElement(PropertyInfo property, object paramObject, XmlDocument doc) + { + XmlElement paramElement = doc.CreateElement(ParamElementname); + + XmlAttribute nameAttribute = doc.CreateAttribute(NameAttributename); + nameAttribute.InnerText = property.Name; + paramElement.Attributes.Append(nameAttribute); + + XmlAttribute paramTypeAttribute = doc.CreateAttribute(TypeAttributename); + paramTypeAttribute.InnerText = MapType(property.GetGetMethod().ReturnType); + paramElement.Attributes.Append(paramTypeAttribute); + + object val = property.GetValue(paramObject, null); + if (val != null) + { + if (paramTypeAttribute.InnerText == "record") + { + XmlElement recordElement = CreateRecordElement(val, doc); + paramElement.AppendChild(recordElement); + } + else if (paramTypeAttribute.InnerText == "sequence") + { + XmlAttribute seqTypeAttribute = doc.CreateAttribute(SequenceTypeAttributename); + bool isComplexTypeSequence; + if (property.PropertyType == typeof(string[])) + { + seqTypeAttribute.InnerText = MapType(typeof(string)); + isComplexTypeSequence = false; + } + else + { + seqTypeAttribute.InnerText = RecordElementname; + isComplexTypeSequence = true; + } + paramElement.Attributes.Append(seqTypeAttribute); + + Array ar = (Array)val; + for (int i = 0; i < ar.Length; ++i) + { + XmlElement itemElement = doc.CreateElement(ItemElementname); + if (isComplexTypeSequence) + { + XmlElement recordElement = CreateRecordElement(ar.GetValue(i), doc); + itemElement.AppendChild(recordElement); + } + else + { + itemElement.InnerText = ar.GetValue(i).ToString(); + } + paramElement.AppendChild(itemElement); + } + } + else + { + paramElement.InnerText = SerializeValue(val); + } + } + + return paramElement; + } + } + + public sealed class PdkXmlDeserializer + { + private static IDictionary typeMappings = new Dictionary() + { + { "wstring", typeof(string) }, + { "boolean", typeof(bool) }, + { "short", typeof(short) }, + { "datetime", typeof(DateTime) }, + { "decfloat", typeof(decimal) }, + { "long", typeof(int) }, + { "octet", typeof(byte) }, + { "decfloat", typeof(decfloat) }, + { "double", typeof(double) } + }; + + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Performance", "CA1810:InitializeReferenceTypeStaticFieldsInline", Justification = "add collection members")] + static PdkXmlDeserializer() + { + } + + public static Type ResolveType(string stringType) + { + if (typeMappings.ContainsKey(stringType)) + { + return typeMappings[stringType]; + } + return null; + } + } + + public class PDKXmlWriter + { + static private void WriteProperty(object record, PropertyInfo property, System.Xml.XmlWriter write) + { + write.WriteStartElement("param"); + write.WriteAttributeString("name", property.Name); + string parameterType = PdkXmlSerializer.MapType(property.GetGetMethod().ReturnType); + write.WriteAttributeString("type", parameterType); + + object val = property.GetValue(record, null); + if (val != null) + { + if (parameterType == "record") + { + WriteRecord(val, write); + } + else if (parameterType == "sequence") + { + if (property.PropertyType == typeof(string[])) + { + write.WriteAttributeString(PdkXmlSerializer.SequenceTypeAttributename, PdkXmlSerializer.MapType(typeof(string))); + Array ar = (Array)val; + for (int i = 0; i < ar.Length; ++i) + { + write.WriteStartElement(PdkXmlSerializer.ItemElementname); + write.WriteString(ar.GetValue(i).ToString()); + write.WriteEndElement(); + } + } + else + { + write.WriteAttributeString(PdkXmlSerializer.SequenceTypeAttributename, PdkXmlSerializer.RecordElementname); + Array ar = (Array)val; + for (int i = 0; i < ar.Length; ++i) + { + write.WriteStartElement(PdkXmlSerializer.ItemElementname); + WriteRecord(ar.GetValue(i), write); + } + } + } + else + { + write.WriteString(PdkXmlSerializer.SerializeValue(val)); + } + } + write.WriteEndElement(); + } + + + static private void WriteParameterList(object record, PropertyInfo[] properties, System.Xml.XmlWriter writer) + { + foreach (PropertyInfo property in properties) + { + bool ignoreThisProperty = false; + foreach (System.Xml.Serialization.XmlIgnoreAttribute xmlIgnoreAttribute in property.GetCustomAttributes(typeof(System.Xml.Serialization.XmlIgnoreAttribute), false)) + { + ignoreThisProperty = true; + break; + } + + if (!ignoreThisProperty) + { + WriteProperty(record, property, writer); + } + } + } + + static public void WriteRecord(object record, System.Xml.XmlWriter writer) + { + writer.WriteStartElement("record"); + writer.WriteAttributeString("type", record.GetType().Name); + writer.WriteStartElement("param-list"); + PropertyInfo[] properties = record.GetType().GetProperties(); + WriteParameterList(record, properties, writer); + writer.WriteEndElement(); + } + + } + + + public class IGenericRecord : IXmlSerializable + { + /* + * + * + * + * + * + * + * Attached + * + * + * + * + * + */ + Dictionary _propertyTypeDic = new Dictionary(); + Dictionary _propertyInfoDic = new Dictionary(); + + public System.Xml.Schema.XmlSchema GetSchema() + { + return null; + } + + public void WriteXml(System.Xml.XmlWriter writer) + { + PDKXmlWriter.WriteRecord(this, writer); + } + + + // + // + // + // + // + // + // M001 + // M002 + // M021 + // A8000 + // + // + // + // + //; + + // + // + // + // + // + // + // Connected + // + // + // + //; + + protected object CreateFormString(Type type, string value) + { + if (type == typeof(string)) + { + return value; + } + else if (type == typeof(bool)) + { + return Convert.ToBoolean(value); + } + else if (type == typeof(short)) + { + return Convert.ToInt16(value); + } + else if (type == typeof(DateTime)) + { + return Convert.ToDateTime(value); + } + else if (type == typeof(decimal)) + { + return Convert.ToDecimal(value); + } + else if (type == typeof(int)) + { + return Convert.ToInt32(value); + } + else if (type == typeof(byte)) + { + return Convert.ToByte(value); + } + else if (type == typeof(decfloat)) + { + return Convert.ToDecimal(value); + } + else if (type == typeof(double)) + { + return Convert.ToDouble(value); + } + return null; + } + + protected T[] CreatFromXml(System.Xml.XmlReader reader) where T: IGenericRecord + { + List list = new List(); + reader.ReadToFollowing("item"); + while (reader.NodeType != System.Xml.XmlNodeType.EndElement) + { + reader.ReadToFollowing("record"); + // reader stays on "record" + T tempValue = default(T); + //IGenericRecord tempValue = null; + tempValue = CreateFromXml(reader); + if (tempValue != null) + { + list.Add(tempValue); + reader.ReadEndElement(); + } + } + return list.ToArray(); + } + // + // + // + // + // + // + // + // + // + // A + // + // + // + // + // + // + // + // + // + //; + + protected void ReadProperty(System.Xml.XmlReader reader) + { + string nodeName = reader.Name; + if (nodeName.Equals("param") && (reader.NodeType == XmlNodeType.Element)) + { + string valueType = reader.GetAttribute("type"); + string valueName = reader.GetAttribute("name"); + + if (_propertyTypeDic != null && _propertyTypeDic.ContainsKey(valueName)) + { + if (valueType == "sequence") + { + string sequenceType = reader.GetAttribute("sequenceType"); + if (sequenceType == PdkXmlSerializer.RecordElementname) + { + Type arrayType = _propertyTypeDic[valueName]; + Type elementType = arrayType.GetElementType(); + if (elementType == typeof(moduleConfigParamRecord)) + { + moduleConfigParamRecord[] array = CreatFromXml(reader); + _propertyInfoDic[valueName].SetValue(this, array); + } + } + if (sequenceType == PdkXmlSerializer.SequenceTypeAttributename) + { + ; // fill it + } + else + if (sequenceType == "wstring") + { + XmlSerializer stringSerializer = new XmlSerializer(typeof(string)); + + List list = new List(); + reader.Read(); + while (reader.NodeType != System.Xml.XmlNodeType.EndElement) + { + reader.ReadStartElement(PdkXmlSerializer.ItemElementname); + string content = reader.ReadString(); + list.Add(content); + reader.ReadEndElement(); + reader.MoveToContent(); + } + _propertyInfoDic[valueName].SetValue(this, list.ToArray(), null); + } + } + else + if (valueType == "record") + { + + } + else + { + reader.ReadStartElement(nodeName); + object tempValue = null; + tempValue = CreateFormString(_propertyTypeDic[valueName], reader.ReadString()); + reader.Read(); + if (tempValue != null && _propertyInfoDic != null && _propertyInfoDic.ContainsKey(valueName)) + { + _propertyInfoDic[valueName].SetValue(this, tempValue, null); + } + } + } //if "param" + } // if + + } + + public void ReadXml(System.Xml.XmlReader reader) + { + XmlUtilities.GetTypePropertyDic(GetType(), ref _propertyTypeDic, ref _propertyInfoDic); + // reader stays on record + reader.ReadToFollowing("param-list"); + try + { + reader.Read(); + while ( reader.IsStartElement() ) + { + ReadProperty(reader); + } // while + } + catch (Exception ex) + { + throw ex; + } + } + + static public IGenericRecord CreateFromXml(System.Xml.XmlReader reader) + { + // reader stays on "record" + string recordType = reader.GetAttribute("type"); + + IGenericRecord record = null; + + if (recordType == "moduleConfigParamRecord") + { + record = new MT.pHLab.SE.V1.moduleConfigParamRecord(); + record.ReadXml(reader); + } + + return record; + } + + private static T CreateFromXml(System.Xml.XmlReader reader) where T : IGenericRecord + { + // reader stays on "record" + string recordType = reader.GetAttribute("type"); + + IGenericRecord record = null; + + if (recordType == "moduleConfigParamRecord") + { + record = new MT.pHLab.SE.V1.moduleConfigParamRecord(); + record.ReadXml(reader); + } + + if (record is T) + { + return (T)record; + } + else + { + try + { + return (T)Convert.ChangeType(record, typeof(T)); + } + catch (InvalidCastException) + { + return default(T); + } + } + } + + } + + #region Physical properties + public partial class Response_StatusRecord : IGenericRecord + { + } + #endregion + + public partial class Request_methodParamsRecord : IGenericRecord + { + } + + public partial class Request_setupGetItemListRecord : IGenericRecord + { + } + public partial class Response_setupGetItemListRecord : IGenericRecord + { + } + public partial class Response_SimpleResultRecord : IGenericRecord + { + } + public partial class Response_moduleGetRecord : IGenericRecord + { + } + public partial class moduleConfigParamRecord : IGenericRecord + { + } + public partial class Request_moduleSetRecord : IGenericRecord + { + } + public partial class Request_terminateMethodRecord : IGenericRecord + { + } + public partial class Response_startMethodRecord : IGenericRecord + { + } + public partial class Request_setupExportRecord : IGenericRecord + { + } + public partial class Request_getSettingRecord : IGenericRecord + { + } + public partial class Response_getSettingRecord : IGenericRecord + { + } + public partial class Request_setSettingRecord : IGenericRecord + { + } + public partial class Request_loginRecord : IGenericRecord + { + } + public partial class Response_loginRecord : IGenericRecord + { + } + +} \ No newline at end of file diff --git a/SEClient/SETelegram.cs b/SEClient/SETelegram.cs new file mode 100644 index 0000000..20777d7 --- /dev/null +++ b/SEClient/SETelegram.cs @@ -0,0 +1,228 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Reflection; +using System.Text; +using System.Threading.Tasks; +using System.Xml; +using System.Xml.Serialization; +using XMLSerializationCustomization; +using log4net; +using System.Collections; + +namespace MT.pHLab.SE.V1 +{ + + public abstract class SERequest + { + public static IDictionary typeMapping = new Dictionary() + { + { typeof(Response_SimpleResultRecord), "Response_SimpleResultRecord" }, + { typeof(Response_moduleGetRecord), "Response_moduleGetRecord" }, + { typeof(Request_methodParamsRecord), "Request_methodParamsRecord" }, + { typeof(Request_setupGetItemListRecord), "Request_setupGetItemListRecord" }, + { typeof(Request_setupExportRecord), "Request_setupExportRecord" }, + }; + + public static IDictionary requestMapping = new Dictionary() + { + { typeof(Response_SimpleResultRecord), "Response_SimpleResultRecord" }, + { typeof(Response_StatusRecord), "Response_StatusRecord" }, + { typeof(Response_moduleGetRecord), "Response_moduleGetRecord" }, + { typeof(Request_methodParamsRecord), "method.start" }, + { typeof(Request_setupGetItemListRecord), "setup.getItemList" }, + { typeof(Request_moduleSetRecord), "module.set" }, + { typeof(Request_terminateMethodRecord), "method.terminate" }, + { typeof(Request_setupExportRecord), "setup.export" }, + { typeof(Request_setSettingRecord ), "setting.setItem" }, + { typeof(Request_getSettingRecord ), "setting.getItem" }, + { typeof(Request_loginRecord), "login" } + }; + + public int RequestId { get; private set; } + + public SERequest(int requestId) + { + RequestId = requestId; + } + + public static String MapRequest(Type type) + { + if (requestMapping.ContainsKey(type)) + { + return requestMapping[type]; + } + return null; + } + + public void WriteXml( IGenericRecord record, XmlWriter writer ) + { + writer.WriteStartDocument(); + writer.WriteStartElement("Telegram"); + writer.WriteAttributeString("xmlns", "xsd", null, "http://www.w3.org/2001/XMLSchema"); + writer.WriteAttributeString("xmlns", "xsi", null, "http://www.w3.org/2001/XMLSchema-instance"); + writer.WriteStartElement("Request"); + writer.WriteAttributeString("requestType", MapRequest(record.GetType())); + writer.WriteAttributeString("requestId", RequestId.ToString() ); + PDKXmlWriter.WriteRecord(record, writer ); + writer.WriteEndElement(); + writer.WriteEndDocument(); + } + } + + public class SESimpleRequest : SERequest + { + string m_stringSimpleRequest; + + public SESimpleRequest( int requestId, string request) + : base(requestId) + { + m_stringSimpleRequest= request; + } + + public void WriteXml( XmlWriter writer ) + { + writer.WriteStartDocument(); + writer.WriteStartElement("Telegram"); + writer.WriteAttributeString("xmlns", "xsd", null, "http://www.w3.org/2001/XMLSchema"); + writer.WriteAttributeString("xmlns", "xsi", null, "http://www.w3.org/2001/XMLSchema-instance"); + //writer.WriteAttributeString("xmlns", "tm"); + writer.WriteStartElement("Request"); + writer.WriteAttributeString("requestType", m_stringSimpleRequest); + writer.WriteAttributeString("requestId", this.RequestId.ToString()); + writer.WriteEndElement(); + writer.WriteEndElement(); + writer.WriteEndDocument(); + } + + public byte[] CreateTelegram() + { + XmlWriterSettings settings = new XmlWriterSettings(); + settings.Indent = false; + settings.Encoding = new UTF8Encoding(false); + using (MemoryStream output = new MemoryStream()) + { + //using (var xw = XmlTextWriter.Create(output, new UTF8Encoding(false))) + using (var xw = XmlWriter.Create(output, settings )) + { + // Build Xml with xw. + WriteXml(xw); + } + return output.ToArray(); + } + } + } + + public class SEParamRequest : SERequest + { + public SEParamRequest(int requestId) + : base(requestId) + { + } + + public byte[] CreateTelegram(IGenericRecord record ) + { + //Encoding utf8noBOM = new UTF8Encoding(false); + //using (MemoryStream output = new MemoryStream()) + //{ + // using (XmlWriter writer = XmlWriter.Create(output, settings)) + // { + // writer.WriteStartDocument(); + // writer.WriteStartElement("Colors"); + // writer.WriteElementString("Color", "RED"); + // writer.WriteEndDocument(); + // } + // result = Encoding.Default.GetString(output.ToArray()); + //} + XmlWriterSettings settings = new XmlWriterSettings(); + settings.Indent = false; + settings.Encoding = new UTF8Encoding(false); + using (MemoryStream output = new MemoryStream()) + { + //using (var xw = XmlTextWriter.Create(output, new UTF8Encoding(false))) + using (var xw = XmlWriter.Create(output, settings )) + { + // Build Xml with xw. + WriteXml(record, xw); + } + return output.ToArray(); + } + } + } + + + public class SEResponse + { + /* + * + * + * + * + * + * Attached + * + * + * + * + */ + private static IDictionary typeMappings = new Dictionary() + { + { "Response_SimpleResultRecord", typeof(Response_SimpleResultRecord) }, + { "Response_StatusRecord", typeof(Response_StatusRecord) }, + { "Response_moduleGetRecord", typeof(Response_moduleGetRecord) }, + { "Response_setupGetItemListRecord", typeof(Response_setupGetItemListRecord) }, + { "Response_startMethodRecord", typeof(Response_startMethodRecord) }, + { "Response_getSettingRecord", typeof(Response_getSettingRecord) }, + { "Response_loginRecord", typeof(Response_loginRecord) }, + }; + + XmlReader m_reader; + + string m_recordType; + + static public SEResponse CreateFromXml(XmlReader reader) + { + SEResponse response = null; + + // Build Xml with xw. + response = new SEResponse(reader); + + return response; + } + + public SEResponse( XmlReader reader ) + { + m_reader = reader; + m_reader.ReadToFollowing("record"); + m_recordType = m_reader.GetAttribute("type"); + } + + + public Type GetRecordType() + { + return typeMappings[m_recordType]; + } + + public object CreateInstance() + { + if (typeMappings[m_recordType] == typeof(MT.pHLab.SE.V1.Response_StatusRecord) ) + { + MT.pHLab.SE.V1.Response_StatusRecord record = new MT.pHLab.SE.V1.Response_StatusRecord(); + + record.ReadXml(m_reader); + return record; + } else + if (typeMappings[m_recordType] == typeof(MT.pHLab.SE.V1.Response_setupGetItemListRecord)) + { + MT.pHLab.SE.V1.Response_setupGetItemListRecord record = new MT.pHLab.SE.V1.Response_setupGetItemListRecord(); + + record.ReadXml(m_reader); + return record; + } + return null; + } + + } + +} \ No newline at end of file diff --git a/SEClient/SEText.cs b/SEClient/SEText.cs new file mode 100644 index 0000000..8c11ea3 --- /dev/null +++ b/SEClient/SEText.cs @@ -0,0 +1,15 @@ +using MT.pHLab.SE.V1; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace SERemoteLib +{ + class SEText + { + + + } +} diff --git a/SEClient/Validation/Validate.cs b/SEClient/Validation/Validate.cs new file mode 100644 index 0000000..651d21e --- /dev/null +++ b/SEClient/Validation/Validate.cs @@ -0,0 +1,95 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Reflection; +using System.ComponentModel; +using System.Globalization; +using System.Diagnostics.CodeAnalysis; + +namespace MT.Sequoia.Platform.Common +{ + /// + /// This is a helper class for validation. + /// + public sealed class Validate + { + private Validate() { } + + /// + /// Determines whether the specified is null. + /// In case of null the specified exception will be thrown. + /// + /// The o. + /// The formated message. + /// The args. + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "o"), System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "formated"), System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1004:GenericMethodsShouldProvideTypeParameter"), SuppressMessage("Microsoft.DesignRules", "CA1004", Justification = "For a better readability.")] + public static void IsNotNull(object o, string formatedMessage, params object[] args) where TExceptionType : System.Exception, new() + { + IsFalse(o == null, formatedMessage, args); + } + + /// + /// Determines whether the specified is true. + /// In case of the condition is false the specified condition is thrown. + /// + /// if set to true [condition]. + /// The formated message. + /// The args. + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "formated"), System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1004:GenericMethodsShouldProvideTypeParameter"), SuppressMessage("Microsoft.DesignRules", "CA1004", Justification = "For a better readability.")] + public static void IsTrue(bool condition, string formatedMessage, params object[] args) where TExceptionType : System.Exception, new() + { + IsFalse < TExceptionType >(!condition, formatedMessage, args); + } + + /// + /// Determines whether the specified is false. + /// In case of the condition is true the specified exception is thrown. + /// + /// if set to true [condition]. + /// The formated message. + /// The args. + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1004:GenericMethodsShouldProvideTypeParameter"), SuppressMessage("Microsoft.DesignRules", "CA1004", Justification = "For a better readability.")] + public static void IsFalse(bool condition, string formatedMessage, params object[] args) where TExceptionType : System.Exception, new() + { + if (condition) + { + TExceptionType exception = new TExceptionType(); + SetProperty(exception, "_message", string.Format(CultureInfo.CurrentCulture, formatedMessage, args), false); + throw exception; + } + } + + /// + /// Sets a field / property of an object. + /// + /// The object of which the field / property should be set + /// The name of the field / property + /// The value of the property + /// True if it shall operate case insensitive + static private void SetProperty(object obj, string propertyName, string propertyValue, bool ignoreCase) + { + BindingFlags bindings = BindingFlags.Public | BindingFlags.Instance; + if (ignoreCase) + { + bindings |= BindingFlags.IgnoreCase; + } + Type type = obj.GetType(); + + // look for a setable property + PropertyInfo property = type.GetProperty(propertyName, bindings); + if (property != null && property.CanWrite) + { + property.SetValue(obj, propertyValue, null); + return; + } + // look for a public field + FieldInfo field = type.GetField(propertyName, BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance); + if (field != null) + { + field.SetValue(obj, propertyValue); + return; + } + } + } +} diff --git a/SEClient/XmlUtilities.cs b/SEClient/XmlUtilities.cs new file mode 100644 index 0000000..01eff8b --- /dev/null +++ b/SEClient/XmlUtilities.cs @@ -0,0 +1,99 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.IO; +using System.Reflection; +using System.Xml; +using System.Xml.Serialization; + +namespace XMLSerializationCustomization +{ + public class XmlUtilities + { + //public static string SerializeToString(object obj) + //{ + // if (obj != null) + // { + // XmlSerializer serializer = new XmlSerializer(obj.GetType()); + + // using (StringWriter writer = new StringWriter()) + // { + // try + // { + // serializer.Serialize(writer, obj); + + // return writer.ToString(); + // } + // catch + // { + // return string.Empty; + // } + // } + // } + // else + // { + // return string.Empty; + // } + //} + + //public static T SerializeFromString(string xml) + //{ + // if (!string.IsNullOrEmpty(xml)) + // { + // XmlSerializer serializer = new XmlSerializer(typeof(T)); + + // using (StringReader reader = new StringReader(xml)) + // { + // try + // { + // return (T)serializer.Deserialize(reader); + // } + // catch + // { + // throw new Exception("XML document is wrong."); + // } + // } + // } + // else + // { + // return default(T); + // } + //} + + public static void GetTypePropertyDic(Type type, ref Dictionary propertyTypeDic, ref Dictionary propertyInfoDic) + { + PropertyInfo[] propertyArray = type.GetProperties(BindingFlags.Public | BindingFlags.IgnoreCase | BindingFlags.Instance | BindingFlags.SetProperty); + if (propertyArray != null) + { + foreach (PropertyInfo property in propertyArray) + { + propertyTypeDic[property.Name] = property.PropertyType; + propertyInfoDic[property.Name] = property; + } + } + } + } + + + + public class PdkXmlTextReader : XmlTextReader + { + public PdkXmlTextReader(System.IO.TextReader reader) : base(reader) { } + + public override string NamespaceURI + { + get + { + if (base.NamespaceURI == "LancePlatform") + { + return "tf"; + } + else + { + return base.NamespaceURI; + } + } + } + } +} diff --git a/SEClient/bin/Debug/log4net.xml b/SEClient/bin/Debug/log4net.xml new file mode 100644 index 0000000..987015b --- /dev/null +++ b/SEClient/bin/Debug/log4net.xml @@ -0,0 +1,28271 @@ + + + + log4net + + + + + Appender that logs to a database. + + + + appends logging events to a table within a + database. The appender can be configured to specify the connection + string by setting the property. + The connection type (provider) can be specified by setting the + property. For more information on database connection strings for + your specific database see http://www.connectionstrings.com/. + + + Records are written into the database either using a prepared + statement or a stored procedure. The property + is set to (System.Data.CommandType.Text) to specify a prepared statement + or to (System.Data.CommandType.StoredProcedure) to specify a stored + procedure. + + + The prepared statement text or the name of the stored procedure + must be set in the property. + + + The prepared statement or stored procedure can take a number + of parameters. Parameters are added using the + method. This adds a single to the + ordered list of parameters. The + type may be subclassed if required to provide database specific + functionality. The specifies + the parameter name, database type, size, and how the value should + be generated using a . + + + + An example of a SQL Server table that could be logged to: + + CREATE TABLE [dbo].[Log] ( + [ID] [int] IDENTITY (1, 1) NOT NULL , + [Date] [datetime] NOT NULL , + [Thread] [varchar] (255) NOT NULL , + [Level] [varchar] (20) NOT NULL , + [Logger] [varchar] (255) NOT NULL , + [Message] [varchar] (4000) NOT NULL + ) ON [PRIMARY] + + + + An example configuration to log to the above table: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Julian Biddle + Nicko Cadell + Gert Driesen + Lance Nehring + + + + Initializes a new instance of the class. + + + Public default constructor to initialize a new instance of this class. + + + + + Gets or sets the database connection string that is used to connect to + the database. + + + The database connection string used to connect to the database. + + + + The connections string is specific to the connection type. + See for more information. + + + Connection string for MS Access via ODBC: + "DSN=MS Access Database;UID=admin;PWD=;SystemDB=C:\data\System.mdw;SafeTransactions = 0;FIL=MS Access;DriverID = 25;DBQ=C:\data\train33.mdb" + + Another connection string for MS Access via ODBC: + "Driver={Microsoft Access Driver (*.mdb)};DBQ=C:\Work\cvs_root\log4net-1.2\access.mdb;UID=;PWD=;" + + Connection string for MS Access via OLE DB: + "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Work\cvs_root\log4net-1.2\access.mdb;User Id=;Password=;" + + + + + The appSettings key from App.Config that contains the connection string. + + + + + The connectionStrings key from App.Config that contains the connection string. + + + + + Gets or sets the type name of the connection + that should be created. + + + The type name of the connection. + + + + The type name of the ADO.NET provider to use. + + + The default is to use the OLE DB provider. + + + Use the OLE DB Provider. This is the default value. + System.Data.OleDb.OleDbConnection, System.Data, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + Use the MS SQL Server Provider. + System.Data.SqlClient.SqlConnection, System.Data, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + Use the ODBC Provider. + Microsoft.Data.Odbc.OdbcConnection,Microsoft.Data.Odbc,version=1.0.3300.0,publicKeyToken=b77a5c561934e089,culture=neutral + This is an optional package that you can download from + http://msdn.microsoft.com/downloads + search for ODBC .NET Data Provider. + + Use the Oracle Provider. + System.Data.OracleClient.OracleConnection, System.Data.OracleClient, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + This is an optional package that you can download from + http://msdn.microsoft.com/downloads + search for .NET Managed Provider for Oracle. + + + + + Gets or sets the command text that is used to insert logging events + into the database. + + + The command text used to insert logging events into the database. + + + + Either the text of the prepared statement or the + name of the stored procedure to execute to write into + the database. + + + The property determines if + this text is a prepared statement or a stored procedure. + + + If this property is not set, the command text is retrieved by invoking + . + + + + + + Gets or sets the command type to execute. + + + The command type to execute. + + + + This value may be either (System.Data.CommandType.Text) to specify + that the is a prepared statement to execute, + or (System.Data.CommandType.StoredProcedure) to specify that the + property is the name of a stored procedure + to execute. + + + The default value is (System.Data.CommandType.Text). + + + + + + Should transactions be used to insert logging events in the database. + + + true if transactions should be used to insert logging events in + the database, otherwise false. The default value is true. + + + + Gets or sets a value that indicates whether transactions should be used + to insert logging events in the database. + + + When set a single transaction will be used to insert the buffered events + into the database. Otherwise each event will be inserted without using + an explicit transaction. + + + + + + Gets or sets the used to call the NetSend method. + + + The used to call the NetSend method. + + + + Unless a specified here for this appender + the is queried for the + security context to use. The default behavior is to use the security context + of the current thread. + + + + + + Should this appender try to reconnect to the database on error. + + + true if the appender should try to reconnect to the database after an + error has occurred, otherwise false. The default value is false, + i.e. not to try to reconnect. + + + + The default behaviour is for the appender not to try to reconnect to the + database if an error occurs. Subsequent logging events are discarded. + + + To force the appender to attempt to reconnect to the database set this + property to true. + + + When the appender attempts to connect to the database there may be a + delay of up to the connection timeout specified in the connection string. + This delay will block the calling application's thread. + Until the connection can be reestablished this potential delay may occur multiple times. + + + + + + Gets or sets the underlying . + + + The underlying . + + + creates a to insert + logging events into a database. Classes deriving from + can use this property to get or set this . Use the + underlying returned from if + you require access beyond that which provides. + + + + + Initialize the appender based on the options set + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Override the parent method to close the database + + + + Closes the database command and database connection. + + + + + + Inserts the events into the database. + + The events to insert into the database. + + + Insert all the events specified in the + array into the database. + + + + + + Adds a parameter to the command. + + The parameter to add to the command. + + + Adds a parameter to the ordered list of command parameters. + + + + + + Writes the events to the database using the transaction specified. + + The transaction that the events will be executed under. + The array of events to insert into the database. + + + The transaction argument can be null if the appender has been + configured not to use transactions. See + property for more information. + + + + + + Prepare entire database command object to be executed. + + The command to prepare. + + + + Formats the log message into database statement text. + + The event being logged. + + This method can be overridden by subclasses to provide + more control over the format of the database statement. + + + Text that can be passed to a . + + + + + Creates an instance used to connect to the database. + + + This method is called whenever a new IDbConnection is needed (i.e. when a reconnect is necessary). + + The of the object. + The connectionString output from the ResolveConnectionString method. + An instance with a valid connection string. + + + + Resolves the connection string from the ConnectionString, ConnectionStringName, or AppSettingsKey + property. + + Additional information describing the connection string. + A connection string used to connect to the database. + + + + Retrieves the class type of the ADO.NET provider. + + + + Gets the Type of the ADO.NET provider to use to connect to the + database. This method resolves the type specified in the + property. + + + Subclasses can override this method to return a different type + if necessary. + + + The of the ADO.NET provider + + + + Connects to the database. + + + + + Cleanup the existing connection. + + + Calls the IDbConnection's method. + + + + + The list of objects. + + + + The list of objects. + + + + + + The fully qualified type of the AdoNetAppender class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Parameter type used by the . + + + + This class provides the basic database parameter properties + as defined by the interface. + + This type can be subclassed to provide database specific + functionality. The two methods that are called externally are + and . + + + + + + Initializes a new instance of the class. + + + Default constructor for the AdoNetAppenderParameter class. + + + + + Gets or sets the name of this parameter. + + + The name of this parameter. + + + + The name of this parameter. The parameter name + must match up to a named parameter to the SQL stored procedure + or prepared statement. + + + + + + Gets or sets the database type for this parameter. + + + The database type for this parameter. + + + + The database type for this parameter. This property should + be set to the database type from the + enumeration. See . + + + This property is optional. If not specified the ADO.NET provider + will attempt to infer the type from the value. + + + + + + + Gets or sets the precision for this parameter. + + + The precision for this parameter. + + + + The maximum number of digits used to represent the Value. + + + This property is optional. If not specified the ADO.NET provider + will attempt to infer the precision from the value. + + + + + + + Gets or sets the scale for this parameter. + + + The scale for this parameter. + + + + The number of decimal places to which Value is resolved. + + + This property is optional. If not specified the ADO.NET provider + will attempt to infer the scale from the value. + + + + + + + Gets or sets the size for this parameter. + + + The size for this parameter. + + + + The maximum size, in bytes, of the data within the column. + + + This property is optional. If not specified the ADO.NET provider + will attempt to infer the size from the value. + + + For BLOB data types like VARCHAR(max) it may be impossible to infer the value automatically, use -1 as the size in this case. + + + + + + + Gets or sets the to use to + render the logging event into an object for this + parameter. + + + The used to render the + logging event into an object for this parameter. + + + + The that renders the value for this + parameter. + + + The can be used to adapt + any into a + for use in the property. + + + + + + Prepare the specified database command object. + + The command to prepare. + + + Prepares the database command object by adding + this parameter to its collection of parameters. + + + + + + Renders the logging event and set the parameter value in the command. + + The command containing the parameter. + The event to be rendered. + + + Renders the logging event using this parameters layout + object. Sets the value of the parameter on the command object. + + + + + + The database type for this parameter. + + + + + Flag to infer type rather than use the DbType + + + + + Appends logging events to the terminal using ANSI color escape sequences. + + + + AnsiColorTerminalAppender appends log events to the standard output stream + or the error output stream using a layout specified by the + user. It also allows the color of a specific level of message to be set. + + + This appender expects the terminal to understand the VT100 control set + in order to interpret the color codes. If the terminal or console does not + understand the control codes the behavior is not defined. + + + By default, all output is written to the console's standard output stream. + The property can be set to direct the output to the + error stream. + + + NOTE: This appender writes each message to the System.Console.Out or + System.Console.Error that is set at the time the event is appended. + Therefore it is possible to programmatically redirect the output of this appender + (for example NUnit does this to capture program output). While this is the desired + behavior of this appender it may have security implications in your application. + + + When configuring the ANSI colored terminal appender, a mapping should be + specified to map a logging level to a color. For example: + + + + + + + + + + + + + + + The Level is the standard log4net logging level and ForeColor and BackColor can be any + of the following values: + + Blue + Green + Red + White + Yellow + Purple + Cyan + + These color values cannot be combined to make new colors. + + + The attributes can be any combination of the following: + + Brightforeground is brighter + Dimforeground is dimmer + Underscoremessage is underlined + Blinkforeground is blinking (does not work on all terminals) + Reverseforeground and background are reversed + Hiddenoutput is hidden + Strikethroughmessage has a line through it + + While any of these attributes may be combined not all combinations + work well together, for example setting both Bright and Dim attributes makes + no sense. + + + Patrick Wagstrom + Nicko Cadell + + + + The enum of possible display attributes that can be combined to form the ANSI color attributes. + + + + + + text is bright + + + + + text is dim + + + + + text is underlined + + + + + text is blinking + + + Not all terminals support this attribute + + + + + text and background colors are reversed + + + + + text is hidden + + + + + text is displayed with a strikethrough + + + + + text color is light + + + + + The enum of possible foreground or background color values for + use with the color mapping method + + + + + + color is black + + + + + color is red + + + + + color is green + + + + + color is yellow + + + + + color is blue + + + + + color is magenta + + + + + color is cyan + + + + + color is white + + + + + Initializes a new instance of the class. + + + The instance of the class is set up to write + to the standard output stream. + + + + + Gets the console output stream, one of "Console.Out" or "Console.Error". + + + + + Adds a mapping of level to foreground and background colors. + + The mapping to add + + + + Writes the event to the console. + + The event to log. + + + This method is called by the method. + + + The format of the output will depend on the appender layout. + + + + + + This appender requires a to be set. + + + + + Initializes the level to color mappings set on this appender. + + + + + The to use when writing to the Console + standard output stream. + + + + + The to use when writing to the Console + standard error output stream. + + + + + Flag to write output to the error stream rather than the standard output stream + + + + + Mapping from level object to color value + + + + + Ansi code to reset terminal + + + + + A class to act as a mapping between the level that a logging call is made at and + the color it should be displayed as. + + + + Defines the mapping between a level and the color it should be displayed in. + + + + + + The mapped foreground color for the specified level + + + + Required property. + The mapped foreground color for the specified level + + + + + + The mapped background color for the specified level. Required property. + + + + + The color attributes for the specified level. + + + + + Initializes the options for the object + + + + Combines the and together + and appends the attributes. + + + + + + The combined , and + suitable for setting the ansi terminal color. + + + + + A strongly-typed collection of objects. + + Nicko Cadell + + + + Supports type-safe iteration over a . + + + + + Creates a read-only wrapper for a instance. + + list to create a readonly wrapper around + + An wrapper that is read-only. + + + + + An empty readonly static AppenderCollection + + + + + Initializes a new instance of the class + that is empty and has the default initial capacity. + + + + + Initializes a new instance of the class + that has the specified initial capacity. + + + The number of elements that the new is initially capable of storing. + + + + + Initializes a new instance of the class + that contains elements copied from the specified . + + The whose elements are copied to the new collection. + + + + Initializes a new instance of the class + that contains elements copied from the specified array. + + The array whose elements are copied to the new list. + + + + Initializes a new instance of the class + that contains elements copied from the specified collection. + + The collection whose elements are copied to the new list. + + + + Type visible only to our subclasses + Used to access protected constructor + + + + + + A value + + + + + Allow subclasses to avoid our default constructors + + + + + + Gets the number of elements actually contained in the . + + + + + Copies the entire to a one-dimensional + array. + + The one-dimensional array to copy to. + + + + Copies the entire to a one-dimensional + array, starting at the specified index of the target array. + + The one-dimensional array to copy to. + The zero-based index in at which copying begins. + + + + Gets a value indicating whether access to the collection is synchronized (thread-safe). + + false, because the backing type is an array, which is never thread-safe. + + + + Gets an object that can be used to synchronize access to the collection. + + + + + Gets or sets the at the specified index. + + The zero-based index of the element to get or set. + + is less than zero + -or- + is equal to or greater than . + + + + + Adds a to the end of the . + + The to be added to the end of the . + The new + + + + Removes all elements from the . + + + + + Creates a shallow copy of the . + + A new with a shallow copy of the collection data. + + + + Determines whether a given is in the . + + The to check for. + if is found in the ; otherwise, . + + + + Returns the zero-based index of the first occurrence of a + in the . + + The to locate in the . + + The zero-based index of the first occurrence of + in the entire , if found; otherwise, -1. + + + + + Inserts an element into the at the specified index. + + The zero-based index at which should be inserted. + The to insert. + + is less than zero + -or- + is equal to or greater than . + + + + + Removes the first occurrence of a specific from the . + + The to remove from the . + True if the item was removed. + + The specified was not found in the . + + + + + Removes the element at the specified index of the . + + The zero-based index of the element to remove. + + is less than zero + -or- + is equal to or greater than . + + + + + Gets a value indicating whether the collection has a fixed size. + + true if the collection has a fixed size; otherwise, false. The default is false + + + + Gets a value indicating whether the IList is read-only. + + true if the collection is read-only; otherwise, false. The default is false + + + + Returns an enumerator that can iterate through the . + + An for the entire . + + + + Gets or sets the number of elements the can contain. + + + + + Adds the elements of another to the current . + + The whose elements should be added to the end of the current . + The new of the . + + + + Adds the elements of a array to the current . + + The array whose elements should be added to the end of the . + The new of the . + + + + Adds the elements of a collection to the current . + + The collection whose elements should be added to the end of the . + The new of the . + + + + Sets the capacity to the actual number of elements. + + + + + Return the collection elements as an array + + the array + + + + is less than zero + -or- + is equal to or greater than . + + + + + Supports simple iteration over a . + + + + + + Initializes a new instance of the class. + + + + + Gets the current element in the collection. + + + + + Advances the enumerator to the next element in the collection. + + + if the enumerator was successfully advanced to the next element; + if the enumerator has passed the end of the collection. + + + The collection was modified after the enumerator was created. + + + + + Sets the enumerator to its initial position, before the first element in the collection. + + + + + + + + Abstract base class implementation of . + + + + This class provides the code for common functionality, such + as support for threshold filtering and support for general filters. + + + Appenders can also implement the interface. Therefore + they would require that the method + be called after the appenders properties have been configured. + + + Nicko Cadell + Gert Driesen + + + + Default constructor + + + Empty default constructor + + + + + Finalizes this appender by calling the implementation's + method. + + + + If this appender has not been closed then the Finalize method + will call . + + + + + + Gets or sets the threshold of this appender. + Defaults to . + + + The threshold of the appender. + + + + All log events with lower level than the threshold level are ignored + by the appender. + + + In configuration files this option is specified by setting the + value of the option to a level + string, such as "DEBUG", "INFO" and so on. + + + + + + Gets or sets the for this appender. + + The of the appender + + + The provides a default + implementation for the property. + + + + + + The filter chain. + + The head of the filter chain. + + + Returns the head Filter. The Filters are organized in a linked list + and so all Filters on this Appender are available through the result. + + + + + + Gets or sets the for this appender. + + The layout of the appender. + + + See for more information. + + + + + + + Initialize the appender based on the options set + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Gets or sets the name that uniquely identifies this appender. + + + + + Closes the appender and releases resources. + + + + Release any resources allocated within the appender such as file handles, + network connections, etc. + + + It is a programming error to append to a closed appender. + + + This method cannot be overridden by subclasses. This method + delegates the closing of the appender to the + method which must be overridden in the subclass. + + + + + + Performs threshold checks and invokes filters before + delegating actual logging to the subclasses specific + method. + + The event to log. + + + This method cannot be overridden by derived classes. A + derived class should override the method + which is called by this method. + + + The implementation of this method is as follows: + + + + + + Checks that the severity of the + is greater than or equal to the of this + appender. + + + + Checks that the chain accepts the + . + + + + + Calls and checks that + it returns true. + + + + + If all of the above steps succeed then the + will be passed to the abstract method. + + + + + + Performs threshold checks and invokes filters before + delegating actual logging to the subclasses specific + method. + + The array of events to log. + + + This method cannot be overridden by derived classes. A + derived class should override the method + which is called by this method. + + + The implementation of this method is as follows: + + + + + + Checks that the severity of the + is greater than or equal to the of this + appender. + + + + Checks that the chain accepts the + . + + + + + Calls and checks that + it returns true. + + + + + If all of the above steps succeed then the + will be passed to the method. + + + + + + Test if the logging event should we output by this appender + + the event to test + true if the event should be output, false if the event should be ignored + + + This method checks the logging event against the threshold level set + on this appender and also against the filters specified on this + appender. + + + The implementation of this method is as follows: + + + + + + Checks that the severity of the + is greater than or equal to the of this + appender. + + + + Checks that the chain accepts the + . + + + + + + + + + Adds a filter to the end of the filter chain. + + the filter to add to this appender + + + The Filters are organized in a linked list. + + + Setting this property causes the new filter to be pushed onto the + back of the filter chain. + + + + + + Clears the filter list for this appender. + + + + Clears the filter list for this appender. + + + + + + Checks if the message level is below this appender's threshold. + + to test against. + + true if the meets the + requirements of this appender. A null level always maps to true, + the equivalent of . + + + + + Is called when the appender is closed. Derived classes should override + this method if resources need to be released. + + + + Releases any resources allocated within the appender such as file handles, + network connections, etc. + + + It is a programming error to append to a closed appender. + + + + + + Subclasses of should implement this method + to perform actual logging. + + The event to append. + + + A subclass must implement this method to perform + logging of the . + + This method will be called by + if all the conditions listed for that method are met. + + + To restrict the logging of events in the appender + override the method. + + + + + + Append a bulk array of logging events. + + the array of logging events + + + This base class implementation calls the + method for each element in the bulk array. + + + A subclass that can better process a bulk array of events should + override this method in addition to . + + + + + + Appends logging events. + + The logging events + + + This base class implementation calls the + method for each element in the bulk array. + + + A subclass that can better process a bulk array of events should + override this method in addition to . + + + + + + Called before as a precondition. + + + + This method is called by + before the call to the abstract method. + + + This method can be overridden in a subclass to extend the checks + made before the event is passed to the method. + + + A subclass should ensure that they delegate this call to + this base class if it is overridden. + + + true if the call to should proceed. + + + + Renders the to a string. + + The event to render. + The event rendered as a string. + + + Helper method to render a to + a string. This appender must have a + set to render the to + a string. + + If there is exception data in the logging event and + the layout does not process the exception, this method + will append the exception text to the rendered string. + + + Where possible use the alternative version of this method + . + That method streams the rendering onto an existing Writer + which can give better performance if the caller already has + a open and ready for writing. + + + + + + Renders the to a string. + + The event to render. + The TextWriter to write the formatted event to + + + Helper method to render a to + a string. This appender must have a + set to render the to + a string. + + If there is exception data in the logging event and + the layout does not process the exception, this method + will append the exception text to the rendered string. + + + Use this method in preference to + where possible. If, however, the caller needs to render the event + to a string then does + provide an efficient mechanism for doing so. + + + + + + Tests if this appender requires a to be set. + + + + In the rather exceptional case, where the appender + implementation admits a layout but can also work without it, + then the appender should return true. + + + This default implementation always returns false. + + + + true if the appender requires a layout object, otherwise false. + + + + + Flushes any buffered log data. + + + This implementation doesn't flush anything and always returns true + + True if all logging events were flushed successfully, else false. + + + + It is assumed and enforced that errorHandler is never null. + + + + See for more information. + + + + + + The last filter in the filter chain. + + + See for more information. + + + + + Flag indicating if this appender is closed. + + + See for more information. + + + + + The guard prevents an appender from repeatedly calling its own DoAppend method + + + + + Used for locking actions by this appender. + + + + + StringWriter used to render events + + + + + Initial buffer size + + + + + Maximum buffer size before it is recycled + + + + + The fully qualified type of the AppenderSkeleton class. + + + Used by the internal logger to record the Type of the + log message. + + + + + + Appends log events to the ASP.NET system. + + + + + Diagnostic information and tracing messages that you specify are appended to the output + of the page that is sent to the requesting browser. Optionally, you can view this information + from a separate trace viewer (Trace.axd) that displays trace information for every page in a + given application. + + + Trace statements are processed and displayed only when tracing is enabled. You can control + whether tracing is displayed to a page, to the trace viewer, or both. + + + The logging event is passed to the or + method depending on the level of the logging event. + The event's logger name is the default value for the category parameter of the Write/Warn method. + + + Nicko Cadell + Gert Driesen + Ron Grabowski + + + + Write the logging event to the ASP.NET trace HttpContext.Current.Trace. + + the event to log + + + + This appender requires a to be set. + + + + + The category parameter sent to the Trace method. + + + + Defaults to %logger which will use the logger name of the current + as the category parameter. + + + + + + Abstract base class implementation of that + buffers events in a fixed size buffer. + + + + This base class should be used by appenders that need to buffer a + number of events before logging them. + For example the + buffers events and then submits the entire contents of the buffer to + the underlying database in one go. + + + Subclasses should override the + method to deliver the buffered events. + + The BufferingAppenderSkeleton maintains a fixed size cyclic + buffer of events. The size of the buffer is set using + the property. + + A is used to inspect + each event as it arrives in the appender. If the + triggers, then the current buffer is sent immediately + (see ). Otherwise the event + is stored in the buffer. For example, an evaluator can be used to + deliver the events immediately when an ERROR event arrives. + + + The buffering appender can be configured in a mode. + By default the appender is NOT lossy. When the buffer is full all + the buffered events are sent with . + If the property is set to true then the + buffer will not be sent when it is full, and new events arriving + in the appender will overwrite the oldest event in the buffer. + In lossy mode the buffer will only be sent when the + triggers. This can be useful behavior when you need to know about + ERROR events but not about events with a lower level, configure an + evaluator that will trigger when an ERROR event arrives, the whole + buffer will be sent which gives a history of events leading up to + the ERROR event. + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + + Protected default constructor to allow subclassing. + + + + + + Initializes a new instance of the class. + + the events passed through this appender must be + fixed by the time that they arrive in the derived class' SendBuffer method. + + + Protected constructor to allow subclassing. + + + The should be set if the subclass + expects the events delivered to be fixed even if the + is set to zero, i.e. when no buffering occurs. + + + + + + Gets or sets a value that indicates whether the appender is lossy. + + + true if the appender is lossy, otherwise false. The default is false. + + + + This appender uses a buffer to store logging events before + delivering them. A triggering event causes the whole buffer + to be sent to the remote sink. If the buffer overruns before + a triggering event then logging events could be lost. Set + to false to prevent logging events + from being lost. + + If is set to true then an + must be specified. + + + + + Gets or sets the size of the cyclic buffer used to hold the + logging events. + + + The size of the cyclic buffer used to hold the logging events. + + + + The option takes a positive integer + representing the maximum number of logging events to collect in + a cyclic buffer. When the is reached, + oldest events are deleted as new events are added to the + buffer. By default the size of the cyclic buffer is 512 events. + + + If the is set to a value less than + or equal to 1 then no buffering will occur. The logging event + will be delivered synchronously (depending on the + and properties). Otherwise the event will + be buffered. + + + + + + Gets or sets the that causes the + buffer to be sent immediately. + + + The that causes the buffer to be + sent immediately. + + + + The evaluator will be called for each event that is appended to this + appender. If the evaluator triggers then the current buffer will + immediately be sent (see ). + + If is set to true then an + must be specified. + + + + + Gets or sets the value of the to use. + + + The value of the to use. + + + + The evaluator will be called for each event that is discarded from this + appender. If the evaluator triggers then the current buffer will immediately + be sent (see ). + + + + + + Gets or sets the fields that will be fixed in the event. + + + The event fields that will be fixed before the event is buffered + + + + The logging event needs to have certain thread specific values + captured before it can be buffered. See + for details. + + + + + + + Flushes any buffered log data. + + The maximum time to wait for logging events to be flushed. + True if all logging events were flushed successfully, else false. + + + + Flush the currently buffered events + + + + Flushes any events that have been buffered. + + + If the appender is buffering in mode then the contents + of the buffer will NOT be flushed to the appender. + + + + + + Flush the currently buffered events + + set to true to flush the buffer of lossy events + + + Flushes events that have been buffered. If is + false then events will only be flushed if this buffer is non-lossy mode. + + + If the appender is buffering in mode then the contents + of the buffer will only be flushed if is true. + In this case the contents of the buffer will be tested against the + and if triggering will be output. All other buffered + events will be discarded. + + + If is true then the buffer will always + be emptied by calling this method. + + + + + + Initialize the appender based on the options set + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Close this appender instance. + + + + Close this appender instance. If this appender is marked + as not then the remaining events in + the buffer must be sent when the appender is closed. + + + + + + This method is called by the method. + + the event to log + + + Stores the in the cyclic buffer. + + + The buffer will be sent (i.e. passed to the + method) if one of the following conditions is met: + + + + The cyclic buffer is full and this appender is + marked as not lossy (see ) + + + An is set and + it is triggered for the + specified. + + + + Before the event is stored in the buffer it is fixed + (see ) to ensure that + any data referenced by the event will be valid when the buffer + is processed. + + + + + + Sends the contents of the buffer. + + The first logging event. + The buffer containing the events that need to be sent. + + + The subclass must override . + + + + + + Sends the events. + + The events that need to be sent. + + + The subclass must override this method to process the buffered events. + + + + + + The default buffer size. + + + The default size of the cyclic buffer used to store events. + This is set to 512 by default. + + + + + The cyclic buffer used to store the logging events. + + + + + The events delivered to the subclass must be fixed. + + + + + Buffers events and then forwards them to attached appenders. + + + + The events are buffered in this appender until conditions are + met to allow the appender to deliver the events to the attached + appenders. See for the + conditions that cause the buffer to be sent. + + The forwarding appender can be used to specify different + thresholds and filters for the same appender at different locations + within the hierarchy. + + + Nicko Cadell + Gert Driesen + + + + Closes the appender and releases resources. + + + + Releases any resources allocated within the appender such as file handles, + network connections, etc. + + + It is a programming error to append to a closed appender. + + + + + + Send the events. + + The events that need to be sent. + + + Forwards the events to the attached appenders. + + + + + + Adds an to the list of appenders of this + instance. + + The to add to this appender. + + + If the specified is already in the list of + appenders, then it won't be added again. + + + + + + Gets the appenders contained in this appender as an + . + + + If no appenders can be found, then an + is returned. + + + A collection of the appenders in this appender. + + + + + Looks for the appender with the specified name. + + The name of the appender to lookup. + + The appender with the specified name, or null. + + + + + Removes all previously added appenders from this appender. + + + + This is useful when re-reading configuration information. + + + + + + Removes the specified appender from the list of appenders. + + The appender to remove. + The appender removed from the list + + The appender removed is not closed. + If you are discarding the appender you must call + on the appender removed. + + + + + Removes the appender with the specified name from the list of appenders. + + The name of the appender to remove. + The appender removed from the list + + The appender removed is not closed. + If you are discarding the appender you must call + on the appender removed. + + + + + Implementation of the interface + + + + + Appends logging events to the console. + + + + ColoredConsoleAppender appends log events to the standard output stream + or the error output stream using a layout specified by the + user. It also allows the color of a specific type of message to be set. + + + By default, all output is written to the console's standard output stream. + The property can be set to direct the output to the + error stream. + + + NOTE: This appender writes directly to the application's attached console + not to the System.Console.Out or System.Console.Error TextWriter. + The System.Console.Out and System.Console.Error streams can be + programmatically redirected (for example NUnit does this to capture program output). + This appender will ignore these redirections because it needs to use Win32 + API calls to colorize the output. To respect these redirections the + must be used. + + + When configuring the colored console appender, mapping should be + specified to map a logging level to a color. For example: + + + + + + + + + + + + + + The Level is the standard log4net logging level and ForeColor and BackColor can be any + combination of the following values: + + Blue + Green + Red + White + Yellow + Purple + Cyan + HighIntensity + + + + Rick Hobbs + Nicko Cadell + + + + The enum of possible color values for use with the color mapping method + + + + The following flags can be combined to form the colors. + + + + + + + color is blue + + + + + color is green + + + + + color is red + + + + + color is white + + + + + color is yellow + + + + + color is purple + + + + + color is cyan + + + + + color is intensified + + + + + Initializes a new instance of the class. + + + The instance of the class is set up to write + to the standard output stream. + + + + + Target is the value of the console output stream. + This is either "Console.Out" or "Console.Error". + + + Target is the value of the console output stream. + This is either "Console.Out" or "Console.Error". + + + + Target is the value of the console output stream. + This is either "Console.Out" or "Console.Error". + + + + + + Add a mapping of level to color - done by the config file + + The mapping to add + + + Add a mapping to this appender. + Each mapping defines the foreground and background colors + for a level. + + + + + + This method is called by the method. + + The event to log. + + + Writes the event to the console. + + + The format of the output will depend on the appender's layout. + + + + + + This appender requires a to be set. + + + + + Initializes the options for this appender. + + + + + The to use when writing to the Console + standard output stream. + + + + + The to use when writing to the Console + standard error output stream. + + + + + Flag to write output to the error stream rather than the standard output stream + + + + + Mapping from level object to color value + + + + + The console output stream writer to write to + + + + This writer is not thread safe. + + + + + + A class to act as a mapping between the level that a logging call is made at and + the color it should be displayed as. + + + + Defines the mapping between a level and the color it should be displayed in. + + + + + + The mapped foreground color for the specified level + + + + + The mapped background color for the specified level + + + + + Initialize the options for the object + + + + Combine the and together. + + + + + + The combined and suitable for + setting the console color. + + + + + Appends logging events to the console. + + + + ConsoleAppender appends log events to the standard output stream + or the error output stream using a layout specified by the + user. + + + By default, all output is written to the console's standard output stream. + The property can be set to direct the output to the + error stream. + + + NOTE: This appender writes each message to the System.Console.Out or + System.Console.Error that is set at the time the event is appended. + Therefore it is possible to programmatically redirect the output of this appender + (for example NUnit does this to capture program output). While this is the desired + behavior of this appender it may have security implications in your application. + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + The instance of the class is set up to write + to the standard output stream. + + + + + Target is the value of the console output stream. + This is either "Console.Out" or "Console.Error". + + + Target is the value of the console output stream. + This is either "Console.Out" or "Console.Error". + + + + Target is the value of the console output stream. + This is either "Console.Out" or "Console.Error". + + + + + + This method is called by the method. + + The event to log. + + + Writes the event to the console. + + + The format of the output will depend on the appender's layout. + + + + + + This appender requires a to be set. + + + + + The to use when writing to the Console standard output stream. + + + + + The to use when writing to the Console standard error output stream. + + + + + Appends log events to the system. + + + + The application configuration file can be used to control what listeners + are actually used. See the MSDN documentation for the + class for details on configuring the + debug system. + + + Events are written using the + method. The event's logger name is passed as the value for the category name to the Write method. + + + Nicko Cadell + + + + Gets or sets a value that indicates whether the appender will + flush at the end of each write. + + + The default behavior is to flush at the end of each + write. If the option is set tofalse, then the underlying + stream can defer writing to physical medium to a later time. + + + Avoiding the flush operation at the end of each append results + in a performance gain of 10 to 20 percent. However, there is safety + trade-off involved in skipping flushing. Indeed, when flushing is + skipped, then it is likely that the last few log events will not + be recorded on disk when the application exits. This is a high + price to pay even for a 20% performance gain. + + + + + + Formats the category parameter sent to the Debug method. + + + + Defaults to a with %logger as the pattern which will use the logger name of the current + as the category parameter. + + + + + + Flushes any buffered log data. + + The maximum time to wait for logging events to be flushed. + True if all logging events were flushed successfully, else false. + + + + Writes the logging event to the system. + + The event to log. + + + Writes the logging event to the system. + If is true then the + is called. + + + + + + This appender requires a to be set. + + + + + Writes events to the system event log. + + + + The appender will fail if you try to write using an event source that doesn't exist unless it is running with local administrator privileges. + See also http://logging.apache.org/log4net/release/faq.html#trouble-EventLog + + + The EventID of the event log entry can be + set using the EventID property () + on the . + + + The Category of the event log entry can be + set using the Category property () + on the . + + + There is a limit of 32K characters for an event log message + + + When configuring the EventLogAppender a mapping can be + specified to map a logging level to an event log entry type. For example: + + + <mapping> + <level value="ERROR" /> + <eventLogEntryType value="Error" /> + </mapping> + <mapping> + <level value="DEBUG" /> + <eventLogEntryType value="Information" /> + </mapping> + + + The Level is the standard log4net logging level and eventLogEntryType can be any value + from the enum, i.e.: + + Erroran error event + Warninga warning event + Informationan informational event + + + + Aspi Havewala + Douglas de la Torre + Nicko Cadell + Gert Driesen + Thomas Voss + + + + Initializes a new instance of the class. + + + + Default constructor. + + + + + + The name of the log where messages will be stored. + + + The string name of the log where messages will be stored. + + + This is the name of the log as it appears in the Event Viewer + tree. The default value is to log into the Application + log, this is where most applications write their events. However + if you need a separate log for your application (or applications) + then you should set the appropriately. + This should not be used to distinguish your event log messages + from those of other applications, the + property should be used to distinguish events. This property should be + used to group together events into a single log. + + + + + + Property used to set the Application name. This appears in the + event logs when logging. + + + The string used to distinguish events from different sources. + + + Sets the event log source property. + + + + + This property is used to return the name of the computer to use + when accessing the event logs. Currently, this is the current + computer, denoted by a dot "." + + + The string name of the machine holding the event log that + will be logged into. + + + This property cannot be changed. It is currently set to '.' + i.e. the local machine. This may be changed in future. + + + + + Add a mapping of level to - done by the config file + + The mapping to add + + + Add a mapping to this appender. + Each mapping defines the event log entry type for a level. + + + + + + Gets or sets the used to write to the EventLog. + + + The used to write to the EventLog. + + + + The system security context used to write to the EventLog. + + + Unless a specified here for this appender + the is queried for the + security context to use. The default behavior is to use the security context + of the current thread. + + + + + + Gets or sets the EventId to use unless one is explicitly specified via the LoggingEvent's properties. + + + + The EventID of the event log entry will normally be + set using the EventID property () + on the . + This property provides the fallback value which defaults to 0. + + + + + + Gets or sets the Category to use unless one is explicitly specified via the LoggingEvent's properties. + + + + The Category of the event log entry will normally be + set using the Category property () + on the . + This property provides the fallback value which defaults to 0. + + + + + + Initialize the appender based on the options set + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Create an event log source + + + + + This method is called by the + method. + + the event to log + + Writes the event to the system event log using the + . + + If the event has an EventID property (see ) + set then this integer will be used as the event log event id. + + + There is a limit of 32K characters for an event log message + + + + + + This appender requires a to be set. + + true + + + + Get the equivalent for a + + the Level to convert to an EventLogEntryType + The equivalent for a + + Because there are fewer applicable + values to use in logging levels than there are in the + this is a one way mapping. There is + a loss of information during the conversion. + + + + + Mapping from level object to EventLogEntryType + + + + + A class to act as a mapping between the level that a logging call is made at and + the color it should be displayed as. + + + + Defines the mapping between a level and its event log entry type. + + + + + + The for this entry + + + + + The fully qualified type of the EventLogAppender class. + + + Used by the internal logger to record the Type of the + log message. + + + + + The maximum size supported by default. + + + http://msdn.microsoft.com/en-us/library/xzwc042w(v=vs.100).aspx + The 32766 documented max size is two bytes shy of 32K (I'm assuming 32766 + may leave space for a two byte null terminator of #0#0). The 32766 max + length is what the .NET 4.0 source code checks for, but this is WRONG! + Strings with a length > 31839 on Windows Vista or higher can CORRUPT + the event log! See: System.Diagnostics.EventLogInternal.InternalWriteEvent() + for the use of the 32766 max size. + + + + + The maximum size supported by a windows operating system that is vista + or newer. + + + See ReportEvent API: + http://msdn.microsoft.com/en-us/library/aa363679(VS.85).aspx + ReportEvent's lpStrings parameter: + "A pointer to a buffer containing an array of + null-terminated strings that are merged into the message before Event Viewer + displays the string to the user. This parameter must be a valid pointer + (or NULL), even if wNumStrings is zero. Each string is limited to 31,839 characters." + + Going beyond the size of 31839 will (at some point) corrupt the event log on Windows + Vista or higher! It may succeed for a while...but you will eventually run into the + error: "System.ComponentModel.Win32Exception : A device attached to the system is + not functioning", and the event log will then be corrupt (I was able to corrupt + an event log using a length of 31877 on Windows 7). + + The max size for Windows Vista or higher is documented here: + http://msdn.microsoft.com/en-us/library/xzwc042w(v=vs.100).aspx. + Going over this size may succeed a few times but the buffer will overrun and + eventually corrupt the log (based on testing). + + The maxEventMsgSize size is based on the max buffer size of the lpStrings parameter of the ReportEvent API. + The documented max size for EventLog.WriteEntry for Windows Vista and higher is 31839, but I'm leaving room for a + terminator of #0#0, as we cannot see the source of ReportEvent (though we could use an API monitor to examine the + buffer, given enough time). + + + + + The maximum size that the operating system supports for + a event log message. + + + Used to determine the maximum string length that can be written + to the operating system event log and eventually truncate a string + that exceeds the limits. + + + + + This method determines the maximum event log message size allowed for + the current environment. + + + + + + Appends logging events to a file. + + + + Logging events are sent to the file specified by the property. + + + The file can be opened in either append or overwrite mode + by specifying the property. + If the file path is relative it is taken as relative from + the application base directory. The file encoding can be + specified by setting the property. + + + The layout's and + values will be written each time the file is opened and closed + respectively. If the property is + then the file may contain multiple copies of the header and footer. + + + This appender will first try to open the file for writing when + is called. This will typically be during configuration. + If the file cannot be opened for writing the appender will attempt + to open the file again each time a message is logged to the appender. + If the file cannot be opened for writing when a message is logged then + the message will be discarded by this appender. + + + The supports pluggable file locking models via + the property. + The default behavior, implemented by + is to obtain an exclusive write lock on the file until this appender is closed. + The alternative models only hold a + write lock while the appender is writing a logging event () + or synchronize by using a named system-wide Mutex (). + + + All locking strategies have issues and you should seriously consider using a different strategy that + avoids having multiple processes logging to the same file. + + + Nicko Cadell + Gert Driesen + Rodrigo B. de Oliveira + Douglas de la Torre + Niall Daley + + + + Write only that uses the + to manage access to an underlying resource. + + + + + Write only that uses the + to manage access to an underlying resource. + + + + + Locking model base class + + + + Base class for the locking models available to the derived loggers. + + + + + + Open the output file + + The filename to use + Whether to append to the file, or overwrite + The encoding to use + + + Open the file specified and prepare for logging. + No writes will be made until is called. + Must be called before any calls to , + and . + + + + + + Close the file + + + + Close the file. No further writes will be made. + + + + + + Initializes all resources used by this locking model. + + + + + Disposes all resources that were initialized by this locking model. + + + + + Acquire the lock on the file + + A stream that is ready to be written to, or null if there is no active stream because uninitialized or error. + + + Acquire the lock on the file in preparation for writing to it. + Returns a stream pointing to the file. + must be called to release the lock on the output file when the return + value is not null. + + + + + + Releases the lock on the file + + + + No further writes will be made to the stream until is called again. + + + + + + Gets or sets the for this LockingModel + + + The for this LockingModel + + + + The file appender this locking model is attached to and working on + behalf of. + + + The file appender is used to locate the security context and the error handler to use. + + + The value of this property will be set before is + called. + + + + + + Helper method that creates a FileStream under CurrentAppender's SecurityContext. + + + + Typically called during OpenFile or AcquireLock. + + + If the directory portion of the does not exist, it is created + via Directory.CreateDirectory. + + + + + + + + + + Helper method to close under CurrentAppender's SecurityContext. + + + Does not set to null. + + + + + + Hold an exclusive lock on the output file + + + + Open the file once for writing and hold it open until is called. + Maintains an exclusive lock on the file during this time. + + + + + + Open the file specified and prepare for logging. + + The filename to use + Whether to append to the file, or overwrite + The encoding to use + + + Open the file specified and prepare for logging. + No writes will be made until is called. + Must be called before any calls to , + and . + + + + + + Close the file + + + + Close the file. No further writes will be made. + + + + + + Acquire the lock on the file + + A stream that is ready to be written to. + + + Does nothing. The lock is already taken + + + + + + Release the lock on the file + + + + Does nothing. The lock will be released when the file is closed. + + + + + + Initializes all resources used by this locking model. + + + + + Disposes all resources that were initialized by this locking model. + + + + + Acquires the file lock for each write + + + + Opens the file once for each / cycle, + thus holding the lock for the minimal amount of time. This method of locking + is considerably slower than but allows + other processes to move/delete the log file whilst logging continues. + + + + + + Prepares to open the file when the first message is logged. + + The filename to use + Whether to append to the file, or overwrite + The encoding to use + + + Open the file specified and prepare for logging. + No writes will be made until is called. + Must be called before any calls to , + and . + + + + + + Close the file + + + + Close the file. No further writes will be made. + + + + + + Acquire the lock on the file + + A stream that is ready to be written to. + + + Acquire the lock on the file in preparation for writing to it. + Return a stream pointing to the file. + must be called to release the lock on the output file. + + + + + + Release the lock on the file + + + + Release the lock on the file. No further writes will be made to the + stream until is called again. + + + + + + Initializes all resources used by this locking model. + + + + + Disposes all resources that were initialized by this locking model. + + + + + Provides cross-process file locking. + + Ron Grabowski + Steve Wranovsky + + + + Open the file specified and prepare for logging. + + The filename to use + Whether to append to the file, or overwrite + The encoding to use + + + Open the file specified and prepare for logging. + No writes will be made until is called. + Must be called before any calls to , + - and . + + + + + + Close the file + + + + Close the file. No further writes will be made. + + + + + + Acquire the lock on the file + + A stream that is ready to be written to. + + + Does nothing. The lock is already taken + + + + + + Releases the lock and allows others to acquire a lock. + + + + + Initializes all resources used by this locking model. + + + + + Disposes all resources that were initialized by this locking model. + + + + + Hold no lock on the output file + + + + Open the file once and hold it open until is called. + Maintains no lock on the file during this time. + + + + + + Open the file specified and prepare for logging. + + The filename to use + Whether to append to the file, or overwrite + The encoding to use + + + Open the file specified and prepare for logging. + No writes will be made until is called. + Must be called before any calls to , + and . + + + + + + Close the file + + + + Close the file. No further writes will be made. + + + + + + Acquire the lock on the file + + A stream that is ready to be written to. + + + Does nothing. The lock is already taken + + + + + + Release the lock on the file + + + + Does nothing. The lock will be released when the file is closed. + + + + + + Initializes all resources used by this locking model. + + + + + Disposes all resources that were initialized by this locking model. + + + + + Default locking model (when no locking model was configured) + + + + + Specify default locking model + + Type of LockingModel + + + + Gets or sets the path to the file that logging will be written to. + + + The path to the file that logging will be written to. + + + + If the path is relative it is taken as relative from + the application base directory. + + + + + + Gets or sets a flag that indicates whether the file should be + appended to or overwritten. + + + Indicates whether the file should be appended to or overwritten. + + + + If the value is set to false then the file will be overwritten, if + it is set to true then the file will be appended to. + + The default value is true. + + + + + Gets or sets used to write to the file. + + + The used to write to the file. + + + + The default encoding set is + which is the encoding for the system's current ANSI code page. + + + + + + Gets or sets the used to write to the file. + + + The used to write to the file. + + + + Unless a specified here for this appender + the is queried for the + security context to use. The default behavior is to use the security context + of the current thread. + + + + + + Gets or sets the used to handle locking of the file. + + + The used to lock the file. + + + + Gets or sets the used to handle locking of the file. + + + There are three built in locking models, , and . + The first locks the file from the start of logging to the end, the + second locks only for the minimal amount of time when logging each message + and the last synchronizes processes using a named system-wide Mutex. + + + The default locking model is the . + + + + + + Activate the options on the file appender. + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + This will cause the file to be opened. + + + + + + Closes any previously opened file and calls the parent's . + + + + Resets the filename and the file stream. + + + + + + Close this appender instance. The underlying stream or writer is also closed. + + + + + Called to initialize the file writer + + + + Will be called for each logged message until the file is + successfully opened. + + + + + + This method is called by the + method. + + The event to log. + + + Writes a log statement to the output stream if the output stream exists + and is writable. + + + The format of the output will depend on the appender's layout. + + + + + + This method is called by the + method. + + The array of events to log. + + + Acquires the output file locks once before writing all the events to + the stream. + + + + + + Writes a footer as produced by the embedded layout's property. + + + + Writes a footer as produced by the embedded layout's property. + + + + + + Writes a header produced by the embedded layout's property. + + + + Writes a header produced by the embedded layout's property. + + + + + + Closes the underlying . + + + + Closes the underlying . + + + + + + Closes the previously opened file. + + + + Writes the to the file and then + closes the file. + + + + + + Sets and opens the file where the log output will go. The specified file must be writable. + + The path to the log file. Must be a fully qualified path. + If true will append to fileName. Otherwise will truncate fileName + + + Calls but guarantees not to throw an exception. + Errors are passed to the . + + + + + + Sets and opens the file where the log output will go. The specified file must be writable. + + The path to the log file. Must be a fully qualified path. + If true will append to fileName. Otherwise will truncate fileName + + + If there was already an opened file, then the previous file + is closed first. + + + This method will ensure that the directory structure + for the specified exists. + + + + + + Sets the quiet writer used for file output + + the file stream that has been opened for writing + + + This implementation of creates a + over the and passes it to the + method. + + + This method can be overridden by subclasses that want to wrap the + in some way, for example to encrypt the output + data using a System.Security.Cryptography.CryptoStream. + + + + + + Sets the quiet writer being used. + + the writer over the file stream that has been opened for writing + + + This method can be overridden by subclasses that want to + wrap the in some way. + + + + + + Convert a path into a fully qualified path. + + The path to convert. + The fully qualified path. + + + Converts the path specified to a fully + qualified path. If the path is relative it is + taken as relative from the application base + directory. + + + + + + The name of the log file. + + + + + The stream to log to. Has added locking semantics + + + + + The fully qualified type of the FileAppender class. + + + Used by the internal logger to record the Type of the + log message. + + + + + This appender forwards logging events to attached appenders. + + + + The forwarding appender can be used to specify different thresholds + and filters for the same appender at different locations within the hierarchy. + + + Nicko Cadell + Gert Driesen + + + + Closes the appender and releases resources. + + + + Releases any resources allocated within the appender such as file handles, + network connections, etc. + + + It is a programming error to append to a closed appender. + + + + + + Forward the logging event to the attached appenders + + The event to log. + + + Delivers the logging event to all the attached appenders. + + + + + + Forward the logging events to the attached appenders + + The array of events to log. + + + Delivers the logging events to all the attached appenders. + + + + + + Adds an to the list of appenders of this + instance. + + The to add to this appender. + + + If the specified is already in the list of + appenders, then it won't be added again. + + + + + + Gets the appenders contained in this appender as an + . + + + If no appenders can be found, then an + is returned. + + + A collection of the appenders in this appender. + + + + + Looks for the appender with the specified name. + + The name of the appender to lookup. + + The appender with the specified name, or null. + + + + Get the named appender attached to this appender. + + + + + + Removes all previously added appenders from this appender. + + + + This is useful when re-reading configuration information. + + + + + + Removes the specified appender from the list of appenders. + + The appender to remove. + The appender removed from the list + + The appender removed is not closed. + If you are discarding the appender you must call + on the appender removed. + + + + + Removes the appender with the specified name from the list of appenders. + + The name of the appender to remove. + The appender removed from the list + + The appender removed is not closed. + If you are discarding the appender you must call + on the appender removed. + + + + + Implementation of the interface + + + + + Implement this interface for your own strategies for printing log statements. + + + + Implementors should consider extending the + class which provides a default implementation of this interface. + + + Appenders can also implement the interface. Therefore + they would require that the method + be called after the appenders properties have been configured. + + + Nicko Cadell + Gert Driesen + + + + Closes the appender and releases resources. + + + + Releases any resources allocated within the appender such as file handles, + network connections, etc. + + + It is a programming error to append to a closed appender. + + + + + + Log the logging event in Appender specific way. + + The event to log + + + This method is called to log a message into this appender. + + + + + + Gets or sets the name of this appender. + + The name of the appender. + + The name uniquely identifies the appender. + + + + + Interface for appenders that support bulk logging. + + + + This interface extends the interface to + support bulk logging of objects. Appenders + should only implement this interface if they can bulk log efficiently. + + + Nicko Cadell + + + + Log the array of logging events in Appender specific way. + + The events to log + + + This method is called to log an array of events into this appender. + + + + + + Interface that can be implemented by Appenders that buffer logging data and expose a method. + + + + + Flushes any buffered log data. + + + Appenders that implement the method must do so in a thread-safe manner: it can be called concurrently with + the method. + + Typically this is done by locking on the Appender instance, e.g.: + + + + + + The parameter is only relevant for appenders that process logging events asynchronously, + such as RemotingAppender. + + + The maximum time to wait for logging events to be flushed. + True if all logging events were flushed successfully, else false. + + + + Logs events to a local syslog service. + + + + This appender uses the POSIX libc library functions openlog, syslog, and closelog. + If these functions are not available on the local system then this appender will not work! + + + The functions openlog, syslog, and closelog are specified in SUSv2 and + POSIX 1003.1-2001 standards. These are used to log messages to the local syslog service. + + + This appender talks to a local syslog service. If you need to log to a remote syslog + daemon and you cannot configure your local syslog service to do this you may be + able to use the to log via UDP. + + + Syslog messages must have a facility and and a severity. The severity + is derived from the Level of the logging event. + The facility must be chosen from the set of defined syslog + values. The facilities list is predefined + and cannot be extended. + + + An identifier is specified with each log message. This can be specified + by setting the property. The identity (also know + as the tag) must not contain white space. The default value for the + identity is the application name (from ). + + + Rob Lyon + Nicko Cadell + + + + syslog severities + + + + The log4net Level maps to a syslog severity using the + method and the + class. The severity is set on . + + + + + + system is unusable + + + + + action must be taken immediately + + + + + critical conditions + + + + + error conditions + + + + + warning conditions + + + + + normal but significant condition + + + + + informational + + + + + debug-level messages + + + + + syslog facilities + + + + The syslog facility defines which subsystem the logging comes from. + This is set on the property. + + + + + + kernel messages + + + + + random user-level messages + + + + + mail system + + + + + system daemons + + + + + security/authorization messages + + + + + messages generated internally by syslogd + + + + + line printer subsystem + + + + + network news subsystem + + + + + UUCP subsystem + + + + + clock (cron/at) daemon + + + + + security/authorization messages (private) + + + + + ftp daemon + + + + + NTP subsystem + + + + + log audit + + + + + log alert + + + + + clock daemon + + + + + reserved for local use + + + + + reserved for local use + + + + + reserved for local use + + + + + reserved for local use + + + + + reserved for local use + + + + + reserved for local use + + + + + reserved for local use + + + + + reserved for local use + + + + + Message identity + + + + An identifier is specified with each log message. This can be specified + by setting the property. The identity (also known + as the tag) must not contain white space. The default value for the + identity is the application name (from ). + + + + + + Syslog facility + + + Set to one of the values. The list of + facilities is predefined and cannot be extended. The default value + is . + + + + + Add a mapping of level to severity + + The mapping to add + + + Adds a to this appender. + + + + + + Initialize the appender based on the options set. + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + This method is called by the method. + + The event to log. + + + Writes the event to a remote syslog daemon. + + + The format of the output will depend on the appender's layout. + + + + + + Close the syslog when the appender is closed + + + + Close the syslog when the appender is closed + + + + + + This appender requires a to be set. + + + + + Translates a log4net level to a syslog severity. + + A log4net level. + A syslog severity. + + + + Generate a syslog priority. + + The syslog facility. + The syslog severity. + A syslog priority. + + + + Marshaled handle to the identity string. We have to hold on to the + string as the openlog and syslog APIs just hold the + pointer to the ident and dereference it for each log message. + + + + + Mapping from level object to syslog severity + + + + + A class to act as a mapping between the level that a logging call is made at and + the syslog severity that is should be logged at. + + + + + The mapped syslog severity for the specified level + + + + + Appends colorful logging events to the console, using .NET built-in capabilities. + + + + ManagedColoredConsoleAppender appends log events to the standard output stream + or the error output stream using a layout specified by the + user. It also allows the color of a specific type of message to be set. + + + By default, all output is written to the console's standard output stream. + The property can be set to direct the output to the + error stream. + + + When configuring the colored console appender, mappings should be + specified to map logging levels to colors. For example: + + + + + + + + + + + + + + + + + + + + + + The Level is the standard log4net logging level while + ForeColor and BackColor are the values of + enumeration. + + + Based on the ColoredConsoleAppender + + + Rick Hobbs + Nicko Cadell + Pavlos Touboulidis + + + + Gets or sets the console output stream. + This is either "Console.Out" or "Console.Error". + + + + + Add a mapping of level to color - done by the config file + + The mapping to add + + + Each mapping defines the foreground and background colors + for a level. + + + + + + Writes the event to the console. + + The event to log. + + + This method is called by the method. + + + The format of the output will depend on the appender's layout. + + + + + + This appender requires a to be set. + + + + + Initializes the options for this appender. + + + + + The to use when writing to the Console + standard output stream. + + + + + The to use when writing to the Console + standard error output stream. + + + + + Flag to write output to the error stream rather than the standard output stream + + + + + Mapping from level object to color value + + + + + A class to act as a mapping between the level that a logging call is made at and + the color it should be displayed as. + + + + + The mapped foreground color for the specified level + + + + + Gets or sets the mapped background color for the specified level + + + + + Stores logging events in an array. + + + + The memory appender stores all the logging events + that are appended in an in-memory array. + + + Use the method to get + and clear the current list of events that have been appended. + + + Use the method to get the current + list of events that have been appended. Note there is a + race-condition when calling and + in pairs, you better use in that case. + + + Use the method to clear the + current list of events. Note there is a + race-condition when calling and + in pairs, you better use in that case. + + + Julian Biddle + Nicko Cadell + Gert Driesen + + + + Gets the events that have been logged. + + The events that have been logged + + + + Gets or sets the fields that will be fixed in the event + + + + The logging event needs to have certain thread specific values + captured before it can be buffered. See + for details. + + + + + + This method is called by the method. + + the event to log + + Stores the in the events list. + + + + + Clear the list of events + + + Clear the list of events + + + + + Gets the events that have been logged and clears the list of events. + + The events that have been logged + + + + The list of events that have been appended. + + + + + Appends log events to the OutputDebugString system. + + Nicko Cadell + Gert Driesen + + + + Writes the logging event to the output debug string API + + the event to log + + + + This appender requires a to be set. + + + + + Logs events to a remote syslog daemon. + + + + The BSD syslog protocol is used to remotely log to + a syslog daemon. The syslogd listens for messages + on UDP port 514. + + + The syslog UDP protocol is not authenticated. Most syslog daemons + do not accept remote log messages because of the security implications. + You may be able to use the LocalSyslogAppender to talk to a local + syslog service. + + + There is an RFC 3164 that claims to document the BSD Syslog Protocol. + This RFC can be seen here: http://www.faqs.org/rfcs/rfc3164.html. + This appender generates what the RFC calls an "Original Device Message", + i.e. does not include the TIMESTAMP or HOSTNAME fields. By observation + this format of message will be accepted by all current syslog daemon + implementations. The daemon will attach the current time and the source + hostname or IP address to any messages received. + + + Syslog messages must have a facility and a severity. The severity + is derived from the Level of the logging event. + The facility must be chosen from the set of defined syslog + values. The facilities list is predefined + and cannot be extended. + + + An identifier is specified with each log message. This can be specified + by setting the property. The identity (also known + as the tag) must not contain white space. The default value for the + identity is the application name (from ). + + + Rob Lyon + Nicko Cadell + + + + Syslog port 514 + + + + + syslog severities + + + + The syslog severities. + + + + + + system is unusable + + + + + action must be taken immediately + + + + + critical conditions + + + + + error conditions + + + + + warning conditions + + + + + normal but significant condition + + + + + informational + + + + + debug-level messages + + + + + syslog facilities + + + + The syslog facilities + + + + + + kernel messages + + + + + random user-level messages + + + + + mail system + + + + + system daemons + + + + + security/authorization messages + + + + + messages generated internally by syslogd + + + + + line printer subsystem + + + + + network news subsystem + + + + + UUCP subsystem + + + + + clock (cron/at) daemon + + + + + security/authorization messages (private) + + + + + ftp daemon + + + + + NTP subsystem + + + + + log audit + + + + + log alert + + + + + clock daemon + + + + + reserved for local use + + + + + reserved for local use + + + + + reserved for local use + + + + + reserved for local use + + + + + reserved for local use + + + + + reserved for local use + + + + + reserved for local use + + + + + reserved for local use + + + + + Initializes a new instance of the class. + + + This instance of the class is set up to write + to a remote syslog daemon. + + + + + Message identity + + + + An identifier is specified with each log message. This can be specified + by setting the property. The identity (also known + as the tag) must not contain white space. The default value for the + identity is the application name (from ). + + + + + + Syslog facility + + + Set to one of the values. The list of + facilities is predefined and cannot be extended. The default value + is . + + + + + Add a mapping of level to severity + + The mapping to add + + + Add a mapping to this appender. + + + + + + Writes the event to a remote syslog daemon. + + The event to log. + + + This method is called by the method. + + + The format of the output will depend on the appender's layout. + + + + + + Appends the rendered message to the buffer + + rendered message + index of the current character in the message + buffer + + + + Initialize the options for this appender + + + + Initialize the level to syslog severity mappings set on this appender. + + + + + + Translates a log4net level to a syslog severity. + + A log4net level. + A syslog severity. + + + + Generate a syslog priority. + + The syslog facility. + The syslog severity. + A syslog priority. + + + Generate a syslog priority. + + + + + + Mapping from level object to syslog severity + + + + + A class to act as a mapping between the level that a logging call is made at and + the syslog severity that it should be logged at. + + + + A class to act as a mapping between the level that a logging call is made at and + the syslog severity that it should be logged at. + + + + + + The mapped syslog severity for the specified level + + + + Required property. + + + + + + Appender that rolls log files based on size or date or both. + + + + RollingFileAppender can roll log files based on size or date or both + depending on the setting of the property. + When set to the log file will be rolled + once its size exceeds the . + When set to the log file will be rolled + once the date boundary specified in the property + is crossed. + When set to the log file will be + rolled once the date boundary specified in the property + is crossed, but within a date boundary the file will also be rolled + once its size exceeds the . + When set to the log file will be rolled when + the appender is configured. This effectively means that the log file can be + rolled once per program execution. + + + A of few additional optional features have been added: + + Attach date pattern for current log file + Backup number increments for newer files + Infinite number of backups by file size + + + + + + For large or infinite numbers of backup files a + greater than zero is highly recommended, otherwise all the backup files need + to be renamed each time a new backup is created. + + + When Date/Time based rolling is used setting + to will reduce the number of file renamings to few or none. + + + + + + Changing or without clearing + the log file directory of backup files will cause unexpected and unwanted side effects. + + + + + If Date/Time based rolling is enabled this appender will attempt to roll existing files + in the directory without a Date/Time tag based on the last write date of the base log file. + The appender only rolls the log file when a message is logged. If Date/Time based rolling + is enabled then the appender will not roll the log file at the Date/Time boundary but + at the point when the next message is logged after the boundary has been crossed. + + + + The extends the and + has the same behavior when opening the log file. + The appender will first try to open the file for writing when + is called. This will typically be during configuration. + If the file cannot be opened for writing the appender will attempt + to open the file again each time a message is logged to the appender. + If the file cannot be opened for writing when a message is logged then + the message will be discarded by this appender. + + + When rolling a backup file necessitates deleting an older backup file the + file to be deleted is moved to a temporary name before being deleted. + + + + + A maximum number of backup files when rolling on date/time boundaries is not supported. + + + + Nicko Cadell + Gert Driesen + Aspi Havewala + Douglas de la Torre + Edward Smit + + + + Style of rolling to use + + + + + Roll files once per program execution + + + + Roll files once per program execution. + Well really once each time this appender is configured. + + + Setting this option also sets AppendToFile to on the + , otherwise this appender would just be a normal file appender. + + + + + + Roll files based only on the size of the file + + + + + Roll files based only on the date + + + + + Roll files based on both the size and date of the file + + + + + The code assumes that the following 'time' constants are in a increasing sequence. + + + + + + + Roll the log not based on the date + + + + + Roll the log for each minute + + + + + Roll the log for each hour + + + + + Roll the log twice a day (midday and midnight) + + + + + Roll the log each day (midnight) + + + + + Roll the log each week + + + + + Roll the log each month + + + + + Initializes a new instance of the class. + + + + + Cleans up all resources used by this appender. + + + + + Gets or sets the strategy for determining the current date and time. The default + implementation is to use LocalDateTime which internally calls through to DateTime.Now. + DateTime.UtcNow may be used on frameworks newer than .NET 1.0 by specifying + . + + + An implementation of the interface which returns the current date and time. + + + + Gets or sets the used to return the current date and time. + + + There are two built strategies for determining the current date and time, + + and . + + + The default strategy is . + + + + + + Gets or sets the date pattern to be used for generating file names + when rolling over on date. + + + The date pattern to be used for generating file names when rolling + over on date. + + + + Takes a string in the same format as expected by + . + May be set to null to disable date formatting. + + + This property determines the rollover schedule when rolling over + on date. + + + + + + Gets or sets the maximum number of backup files that are kept before + the oldest is erased. + + + The maximum number of backup files that are kept before the oldest is + erased. + + + + If set to zero, then there will be no backup files and the log file + will be truncated when it reaches . + + + If a negative number is supplied then no deletions will be made. Note + that this could result in very slow performance as a large number of + files are rolled over unless is used. + + + The maximum applies to each time based group of files and + not the total. + + + + + + Gets or sets the maximum size that the output file is allowed to reach + before being rolled over to backup files. + + + The maximum size in bytes that the output file is allowed to reach before being + rolled over to backup files. + + + + This property is equivalent to except + that it is required for differentiating the setter taking a + argument from the setter taking a + argument. + + + The default maximum file size is 10MB (10*1024*1024). + + + + + + Gets or sets the maximum size that the output file is allowed to reach + before being rolled over to backup files. + + + The maximum size that the output file is allowed to reach before being + rolled over to backup files. + + + + This property allows you to specify the maximum size with the + suffixes "KB", "MB" or "GB" so that the size is interpreted being + expressed respectively in kilobytes, megabytes or gigabytes. + + + For example, the value "10KB" will be interpreted as 10240 bytes. + + + The default maximum file size is 10MB. + + + If you have the option to set the maximum file size programmatically + consider using the property instead as this + allows you to set the size in bytes as a . + + + + + + Gets or sets the rolling file count direction. + + + The rolling file count direction. + + + + Indicates if the current file is the lowest numbered file or the + highest numbered file. + + + By default newer files have lower numbers ( < 0), + i.e. log.1 is most recent, log.5 is the 5th backup, etc... + + + >= 0 does the opposite i.e. + log.1 is the first backup made, log.5 is the 5th backup made, etc. + For infinite backups use >= 0 to reduce + rollover costs. + + The default file count direction is -1. + + + + + Gets or sets the rolling style. + + The rolling style. + + + The default rolling style is . + + + When set to this appender's + property is set to , otherwise + the appender would append to a single file rather than rolling + the file each time it is opened. + + + + + + Gets or sets a value indicating whether to preserve the file name extension when rolling. + + + if the file name extension should be preserved. + + + + By default file.log is rolled to file.log.yyyy-MM-dd or file.log.curSizeRollBackup. + However, under Windows the new file name will lose any program associations as the + extension is changed. Optionally file.log can be renamed to file.yyyy-MM-dd.log or + file.curSizeRollBackup.log to maintain any program associations. + + + + + + Gets or sets a value indicating whether to always log to + the same file. + + + if always should be logged to the same file, otherwise . + + + + By default file.log is always the current file. Optionally + file.log.yyyy-mm-dd for current formatted datePattern can by the currently + logging file (or file.log.curSizeRollBackup or even + file.log.yyyy-mm-dd.curSizeRollBackup). + + + This will make time based rollovers with a large number of backups + much faster as the appender it won't have to rename all the backups! + + + + + + The fully qualified type of the RollingFileAppender class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Sets the quiet writer being used. + + + This method can be overridden by subclasses. + + the writer to set + + + + Write out a logging event. + + the event to write to file. + + + Handles append time behavior for RollingFileAppender. This checks + if a roll over either by date (checked first) or time (checked second) + is need and then appends to the file last. + + + + + + Write out an array of logging events. + + the events to write to file. + + + Handles append time behavior for RollingFileAppender. This checks + if a roll over either by date (checked first) or time (checked second) + is need and then appends to the file last. + + + + + + Performs any required rolling before outputting the next event + + + + Handles append time behavior for RollingFileAppender. This checks + if a roll over either by date (checked first) or time (checked second) + is need and then appends to the file last. + + + + + + Creates and opens the file for logging. If + is false then the fully qualified name is determined and used. + + the name of the file to open + true to append to existing file + + This method will ensure that the directory structure + for the specified exists. + + + + + Get the current output file name + + the base file name + the output file name + + The output file name is based on the base fileName specified. + If is set then the output + file name is the same as the base file passed in. Otherwise + the output file depends on the date pattern, on the count + direction or both. + + + + + Determines curSizeRollBackups (only within the current roll point) + + + + + Generates a wildcard pattern that can be used to find all files + that are similar to the base file name. + + + + + Builds a list of filenames for all files matching the base filename plus a file pattern. + + + + + Initiates a roll over if needed for crossing a date boundary since the last run. + + + + + Initializes based on existing conditions at time of . + + + + Initializes based on existing conditions at time of . + The following is done + + determine curSizeRollBackups (only within the current roll point) + initiates a roll over if needed for crossing a date boundary since the last run. + + + + + + + Does the work of bumping the 'current' file counter higher + to the highest count when an incremental file name is seen. + The highest count is either the first file (when count direction + is greater than 0) or the last file (when count direction less than 0). + In either case, we want to know the highest count that is present. + + + + + + + Attempts to extract a number from the end of the file name that indicates + the number of the times the file has been rolled over. + + + Certain date pattern extensions like yyyyMMdd will be parsed as valid backup indexes. + + + + + Takes a list of files and a base file name, and looks for 'incremented' versions of the base file. + Bumps the max count up to the highest count seen. + + + + + Calculates the RollPoint for the datePattern supplied. + + the date pattern to calculate the check period for + The RollPoint that is most accurate for the date pattern supplied + + Essentially the date pattern is examined to determine what the + most suitable roll point is. The roll point chosen is the roll point + with the smallest period that can be detected using the date pattern + supplied. i.e. if the date pattern only outputs the year, month, day + and hour then the smallest roll point that can be detected would be + and hourly roll point as minutes could not be detected. + + + + + Initialize the appender based on the options set + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + Sets initial conditions including date/time roll over information, first check, + scheduledFilename, and calls to initialize + the current number of backups. + + + + + + CombinePath + + + .1, .2, .3, etc. + + + + + Rollover the file(s) to date/time tagged file(s). + + set to true if the file to be rolled is currently open + + + Rollover the file(s) to date/time tagged file(s). + Resets curSizeRollBackups. + If fileIsOpen is set then the new file is opened (through SafeOpenFile). + + + + + + Renames file to file . + + Name of existing file to roll. + New name for file. + + + Renames file to file . It + also checks for existence of target file and deletes if it does. + + + + + + Test if a file exists at a specified path + + the path to the file + true if the file exists + + + Test if a file exists at a specified path + + + + + + Deletes the specified file if it exists. + + The file to delete. + + + Delete a file if it exists. + The file is first moved to a new filename then deleted. + This allows the file to be removed even when it cannot + be deleted, but it still can be moved. + + + + + + Implements file roll base on file size. + + + + If the maximum number of size based backups is reached + (curSizeRollBackups == maxSizeRollBackups) then the oldest + file is deleted -- its index determined by the sign of countDirection. + If countDirection < 0, then files + {File.1, ..., File.curSizeRollBackups -1} + are renamed to {File.2, ..., + File.curSizeRollBackups}. Moreover, File is + renamed File.1 and closed. + + + A new file is created to receive further log output. + + + If maxSizeRollBackups is equal to zero, then the + File is truncated with no backup files created. + + + If maxSizeRollBackups < 0, then File is + renamed if needed and no files are deleted. + + + + + + Implements file roll. + + the base name to rename + + + If the maximum number of size based backups is reached + (curSizeRollBackups == maxSizeRollBackups) then the oldest + file is deleted -- its index determined by the sign of countDirection. + If countDirection < 0, then files + {File.1, ..., File.curSizeRollBackups -1} + are renamed to {File.2, ..., + File.curSizeRollBackups}. + + + If maxSizeRollBackups is equal to zero, then the + File is truncated with no backup files created. + + + If maxSizeRollBackups < 0, then File is + renamed if needed and no files are deleted. + + + This is called by to rename the files. + + + + + + Get the start time of the next window for the current rollpoint + + the current date + the type of roll point we are working with + the start time for the next roll point an interval after the currentDateTime date + + + Returns the date of the next roll point after the currentDateTime date passed to the method. + + + The basic strategy is to subtract the time parts that are less significant + than the rollpoint from the current time. This should roll the time back to + the start of the time window for the current rollpoint. Then we add 1 window + worth of time and get the start time of the next window for the rollpoint. + + + + + + The actual formatted filename that is currently being written to + or will be the file transferred to on roll over + (based on staticLogFileName). + + + + + The timestamp when we shall next recompute the filename. + + + + + Holds date of last roll over + + + + + The type of rolling done + + + + + How many sized based backups have been made so far + + + + + The rolling mode used in this appender. + + + + + Cache flag set if we are rolling by date. + + + + + Cache flag set if we are rolling by size. + + + + + FileName provided in configuration. Used for rolling properly + + + + + A mutex that is used to lock rolling of files. + + + + + The 1st of January 1970 in UTC + + + + + This interface is used to supply Date/Time information to the . + + + This interface is used to supply Date/Time information to the . + Used primarily to allow test classes to plug themselves in so they can + supply test date/times. + + + + + Gets the current time. + + The current time. + + + Gets the current time. + + + + + + Default implementation of that returns the current time. + + + + + Gets the current time. + + The current time. + + + Gets the current time. + + + + + + Implementation of that returns the current time as the coordinated universal time (UTC). + + + + + Gets the current time. + + The current time. + + + Gets the current time. + + + + + + Send an e-mail when a specific logging event occurs, typically on errors + or fatal errors. + + + + The number of logging events delivered in this e-mail depend on + the value of option. The + keeps only the last + logging events in its + cyclic buffer. This keeps memory requirements at a reasonable level while + still delivering useful application context. + + + Authentication is supported by setting the property to + either or . + If using authentication then the + and properties must also be set. + + + To set the SMTP server port use the property. The default port is 25. + + + Nicko Cadell + Gert Driesen + + + + Default constructor + + + + Default constructor + + + + + + Gets or sets a comma-delimited list of recipient e-mail addresses. + + + + + Gets or sets a comma-delimited list of recipient e-mail addresses + that will be carbon copied. + + + + + Gets or sets a semicolon-delimited list of recipient e-mail addresses + that will be blind carbon copied. + + + A semicolon-delimited list of e-mail addresses. + + + + A semicolon-delimited list of recipient e-mail addresses. + + + + + + Gets or sets the e-mail address of the sender. + + + The e-mail address of the sender. + + + + The e-mail address of the sender. + + + + + + Gets or sets the subject line of the e-mail message. + + + The subject line of the e-mail message. + + + + The subject line of the e-mail message. + + + + + + Gets or sets the name of the SMTP relay mail server to use to send + the e-mail messages. + + + The name of the e-mail relay server. If SmtpServer is not set, the + name of the local SMTP server is used. + + + + The name of the e-mail relay server. If SmtpServer is not set, the + name of the local SMTP server is used. + + + + + + The mode to use to authentication with the SMTP server + + + + Valid Authentication mode values are: , + , and . + The default value is . When using + you must specify the + and to use to authenticate. + When using the Windows credentials for the current + thread, if impersonating, or the process will be used to authenticate. + + + + + + The username to use to authenticate with the SMTP server + + + + A and must be specified when + is set to , + otherwise the username will be ignored. + + + + + + The password to use to authenticate with the SMTP server + + + + A and must be specified when + is set to , + otherwise the password will be ignored. + + + + + + The port on which the SMTP server is listening + + + + The port on which the SMTP server is listening. The default + port is 25. + + + + + + Gets or sets the priority of the e-mail message + + + One of the values. + + + + Sets the priority of the e-mails generated by this + appender. The default priority is . + + + If you are using this appender to report errors then + you may want to set the priority to . + + + + + + Enable or disable use of SSL when sending e-mail message + + + This is available on MS .NET 2.0 runtime and higher + + + + + Gets or sets the reply-to e-mail address. + + + + + Gets or sets the subject encoding to be used. + + + The default encoding is the operating system's current ANSI codepage. + + + + + Gets or sets the body encoding to be used. + + + The default encoding is the operating system's current ANSI codepage. + + + + + Sends the contents of the cyclic buffer as an e-mail message. + + The logging events to send. + + + + This appender requires a to be set. + + + + + Send the email message + + the body text to include in the mail + + + + Values for the property. + + + + SMTP authentication modes. + + + + + + No authentication + + + + + Basic authentication. + + + Requires a username and password to be supplied + + + + + Integrated authentication + + + Uses the Windows credentials from the current thread or process to authenticate. + + + + + Trims leading and trailing commas or semicolons + + + + + Send an email when a specific logging event occurs, typically on errors + or fatal errors. Rather than sending via smtp it writes a file into the + directory specified by . This allows services such + as the IIS SMTP agent to manage sending the messages. + + + + The configuration for this appender is identical to that of the SMTPAppender, + except that instead of specifying the SMTPAppender.SMTPHost you specify + . + + + The number of logging events delivered in this e-mail depend on + the value of option. The + keeps only the last + logging events in its + cyclic buffer. This keeps memory requirements at a reasonable level while + still delivering useful application context. + + + Niall Daley + Nicko Cadell + + + + Gets or sets a semicolon-delimited list of recipient e-mail addresses. + + + + + Gets or sets the e-mail address of the sender. + + + + + Gets or sets the subject line of the e-mail message. + + + + + Gets or sets the path to write the messages to. + + + + Gets or sets the path to write the messages to. This should be the same + as that used by the agent sending the messages. + + + + + + Gets or sets the file extension for the generated files + + + + + Gets or sets the used to write to the pickup directory. + + + The used to write to the pickup directory. + + + + Unless a specified here for this appender + the is queried for the + security context to use. The default behavior is to use the security context + of the current thread. + + + + + + Sends the contents of the cyclic buffer as an e-mail message. + + The logging events to send. + + + Sends the contents of the cyclic buffer as an e-mail message. + + + + + + Activate the options on this appender. + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + This appender requires a to be set. + + + + + Convert a path into a fully qualified path. + + The path to convert. + The fully qualified path. + + + Converts the path specified to a fully + qualified path. If the path is relative it is + taken as relative from the application base + directory. + + + + + + Appender that allows clients to connect via Telnet to receive log messages + + + + The TelnetAppender accepts socket connections and streams logging messages back to the client. + The output is provided in a telnet-friendly way so that a log can be monitored over a TCP/IP socket. + This allows simple remote monitoring of application logging. + + + The default is 23 (the telnet port). + + + Keith Long + Nicko Cadell + + + + The fully qualified type of the TelnetAppender class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Gets or sets the TCP port number on which this will listen for connections. + + + An integer value in the range to + indicating the TCP port number on which this will listen for connections. + + + + The default value is 23 (the telnet port). + + + The value specified is less than + or greater than . + + + + Overrides the parent method to close the socket handler + + + + Closes all the outstanding connections. + + + + + + This appender requires a to be set. + + + + + Create the socket handler and wait for connections + + + + + Writes the logging event to each connected client. + + The event to log. + + + + Helper class to manage connected clients + + + + The SocketHandler class is used to accept connections from clients. + It is threaded so that clients can connect/disconnect asynchronously. + + + + + + Class that represents a client connected to this handler + + + + + Create this for the specified + + the client's socket + + + Opens a stream writer on the socket. + + + + + + Writes a string to the client. + + string to send + + + + Cleans up the client connection. + + + + + Opens a new server port on + + the local port to listen on for connections + + + Creates a socket handler on the specified local server port. + + + + + + Sends a string message to each of the connected clients. + + the text to send + + + + Add a client to the internal clients list + + client to add + + + + Remove a client from the internal clients list + + client to remove + + + + Test if this handler has active connections + + + + + Callback used to accept a connection on the server socket + + The result of the asynchronous operation + + + On connection adds to the list of connections + if there are too many open connections you will be disconnected + + + + + + Closes all network connections + + + + + Sends logging events to a . + + + + An Appender that writes to a . + + + This appender may be used stand alone if initialized with an appropriate + writer, however it is typically used as a base class for an appender that + can open a to write to. + + + Nicko Cadell + Gert Driesen + Douglas de la Torre + + + + Gets or set whether the appender will flush at the end + of each append operation. + + + + The default behavior is to flush at the end of each + append operation. + + + If this option is set to false, then the underlying + stream can defer persisting the logging event to a later + time. + + + + Avoiding the flush operation at the end of each append results in + a performance gain of 10 to 20 percent. However, there is a safety + trade-off involved in skipping flushing. Indeed, when flushing is + skipped, then it is likely that the last few log events will not + be recorded on disk when the application exits. This is a high + price to pay even for a 20% performance gain. + + + + + Sets the where the log output will go. + + + + The specified must be open and writable. + + + The will be closed when the appender + instance is closed. + + + Note: Logging to an unopened will fail. + + + + + + This method determines if there is a sense in attempting to append. + + + + This method checks if an output target has been set and if a + layout has been set. + + + false if any of the preconditions fail. + + + + This method is called by the + method. + + The event to log. + + + Writes a log statement to the output stream if the output stream exists + and is writable. + + + The format of the output will depend on the appender's layout. + + + + + + This method is called by the + method. + + The array of events to log. + + + This method writes all the bulk logged events to the output writer + before flushing the stream. + + + + + + Close this appender instance. The underlying stream or writer is also closed. + + + Closed appenders cannot be reused. + + + + + Gets or set the and the underlying + , if any, for this appender. + + + The for this appender. + + + + + This appender requires a to be set. + + + + + Writes the footer and closes the underlying . + + + + + Closes the underlying . + + + + + Clears internal references to the underlying + and other variables. + + + + Subclasses can override this method for an alternate closing behavior. + + + + + + Writes a footer as produced by the embedded layout's property. + + + + Writes a footer as produced by the embedded layout's property. + + + + + + Writes a header produced by the embedded layout's property. + + + + Writes a header produced by the embedded layout's property. + + + + + + Called to allow a subclass to lazily initialize the writer + + + + This method is called when an event is logged and the or + have not been set. This allows a subclass to + attempt to initialize the writer multiple times. + + + + + + Gets or sets the where logging events + will be written to. + + + The where logging events are written. + + + + This is the where logging events + will be written to. + + + + + + The fully qualified type of the TextWriterAppender class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Flushes any buffered log data. + + The maximum time to wait for logging events to be flushed. + True if all logging events were flushed successfully, else false. + + + + Appends log events to the system. + + + + The application configuration file can be used to control what listeners + are actually used. See the MSDN documentation for the + class for details on configuring the + trace system. + + + Events are written using the System.Diagnostics.Trace.Write(string,string) + method. The event's logger name is the default value for the category parameter + of the Write method. + + + Compact Framework
+ The Compact Framework does not support the + class for any operation except Assert. When using the Compact Framework this + appender will write to the system rather than + the Trace system. This appender will therefore behave like the . +
+
+ Douglas de la Torre + Nicko Cadell + Gert Driesen + Ron Grabowski +
+ + + Gets or sets a value that indicates whether the appender will + flush at the end of each write. + + + The default behavior is to flush at the end of each + write. If the option is set tofalse, then the underlying + stream can defer writing to physical medium to a later time. + + + Avoiding the flush operation at the end of each append results + in a performance gain of 10 to 20 percent. However, there is safety + trade-off involved in skipping flushing. Indeed, when flushing is + skipped, then it is likely that the last few log events will not + be recorded on disk when the application exits. This is a high + price to pay even for a 20% performance gain. + + + + + + The category parameter sent to the Trace method. + + + + Defaults to %logger which will use the logger name of the current + as the category parameter. + + + + + + Writes the logging event to the system. + + The event to log. + + + + This appender requires a to be set. + + + + + Flushes any buffered log data. + + The maximum time to wait for logging events to be flushed. + True if all logging events were flushed successfully, else false. + + + + Sends logging events as connectionless UDP datagrams to a remote host or a + multicast group using an . + + + + UDP guarantees neither that messages arrive, nor that they arrive in the correct order. + + + To view the logging results, a custom application can be developed that listens for logging + events. + + + When decoding events send via this appender remember to use the same encoding + to decode the events as was used to send the events. See the + property to specify the encoding to use. + + + + This example shows how to log receive logging events that are sent + on IP address 244.0.0.1 and port 8080 to the console. The event is + encoded in the packet as a unicode string and it is decoded as such. + + IPEndPoint remoteEndPoint = new IPEndPoint(IPAddress.Any, 0); + UdpClient udpClient; + byte[] buffer; + string loggingEvent; + + try + { + udpClient = new UdpClient(8080); + + while(true) + { + buffer = udpClient.Receive(ref remoteEndPoint); + loggingEvent = System.Text.Encoding.Unicode.GetString(buffer); + Console.WriteLine(loggingEvent); + } + } + catch(Exception e) + { + Console.WriteLine(e.ToString()); + } + + + Dim remoteEndPoint as IPEndPoint + Dim udpClient as UdpClient + Dim buffer as Byte() + Dim loggingEvent as String + + Try + remoteEndPoint = new IPEndPoint(IPAddress.Any, 0) + udpClient = new UdpClient(8080) + + While True + buffer = udpClient.Receive(ByRef remoteEndPoint) + loggingEvent = System.Text.Encoding.Unicode.GetString(buffer) + Console.WriteLine(loggingEvent) + Wend + Catch e As Exception + Console.WriteLine(e.ToString()) + End Try + + + An example configuration section to log information using this appender to the + IP 224.0.0.1 on port 8080: + + + + + + + + + + Gert Driesen + Nicko Cadell + + + + Initializes a new instance of the class. + + + The default constructor initializes all fields to their default values. + + + + + Gets or sets the IP address of the remote host or multicast group to which + the underlying should sent the logging event. + + + The IP address of the remote host or multicast group to which the logging event + will be sent. + + + + Multicast addresses are identified by IP class D addresses (in the range 224.0.0.0 to + 239.255.255.255). Multicast packets can pass across different networks through routers, so + it is possible to use multicasts in an Internet scenario as long as your network provider + supports multicasting. + + + Hosts that want to receive particular multicast messages must register their interest by joining + the multicast group. Multicast messages are not sent to networks where no host has joined + the multicast group. Class D IP addresses are used for multicast groups, to differentiate + them from normal host addresses, allowing nodes to easily detect if a message is of interest. + + + Static multicast addresses that are needed globally are assigned by IANA. A few examples are listed in the table below: + + + + + IP Address + Description + + + 224.0.0.1 + + + Sends a message to all system on the subnet. + + + + + 224.0.0.2 + + + Sends a message to all routers on the subnet. + + + + + 224.0.0.12 + + + The DHCP server answers messages on the IP address 224.0.0.12, but only on a subnet. + + + + + + + A complete list of actually reserved multicast addresses and their owners in the ranges + defined by RFC 3171 can be found at the IANA web site. + + + The address range 239.0.0.0 to 239.255.255.255 is reserved for administrative scope-relative + addresses. These addresses can be reused with other local groups. Routers are typically + configured with filters to prevent multicast traffic in this range from flowing outside + of the local network. + + + + + + Gets or sets the TCP port number of the remote host or multicast group to which + the underlying should sent the logging event. + + + An integer value in the range to + indicating the TCP port number of the remote host or multicast group to which the logging event + will be sent. + + + The underlying will send messages to this TCP port number + on the remote host or multicast group. + + The value specified is less than or greater than . + + + + Gets or sets the TCP port number from which the underlying will communicate. + + + An integer value in the range to + indicating the TCP port number from which the underlying will communicate. + + + + The underlying will bind to this port for sending messages. + + + Setting the value to 0 (the default) will cause the udp client not to bind to + a local port. + + + The value specified is less than or greater than . + + + + Gets or sets used to write the packets. + + + The used to write the packets. + + + + The used to write the packets. + + + + + + Gets or sets the underlying . + + + The underlying . + + + creates a to send logging events + over a network. Classes deriving from can use this + property to get or set this . Use the underlying + returned from if you require access beyond that which + provides. + + + + + Gets or sets the cached remote endpoint to which the logging events should be sent. + + + The method will initialize the remote endpoint + with the values of the and + properties. + + + + + Initialize the appender based on the options set. + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + The appender will be ignored if no was specified or + an invalid remote or local TCP port number was specified. + + + The required property was not specified. + The TCP port number assigned to or is less than or greater than . + + + + This method is called by the method. + + The event to log. + + + Sends the event using an UDP datagram. + + + Exceptions are passed to the . + + + + + + This appender requires a to be set. + + + + + Closes the UDP connection and releases all resources associated with + this instance. + + + + Disables the underlying and releases all managed + and unmanaged resources associated with the . + + + + + + Initializes the underlying connection. + + + + The underlying is initialized and binds to the + port number from which you intend to communicate. + + + Exceptions are passed to the . + + + + + + The TCP port number of the remote host or multicast group to + which the logging event will be sent. + + + + + The TCP port number from which the will communicate. + + + + + Assembly level attribute that specifies a repository to alias to this assembly's repository. + + + + An assembly's logger repository is defined by its , + however this can be overridden by an assembly loaded before the target assembly. + + + An assembly can alias another assembly's repository to its repository by + specifying this attribute with the name of the target repository. + + + This attribute can only be specified on the assembly and may be used + as many times as necessary to alias all the required repositories. + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class with + the specified repository to alias to this assembly's repository. + + The repository to alias to this assemby's repository. + + + + Gets or sets the repository to alias to this assemby's repository. + + + + + Use this class to quickly configure a . + + + + Allows very simple programmatic configuration of log4net. + + + Only one appender can be configured using this configurator. + The appender is set at the root of the hierarchy and all logging + events will be delivered to that appender. + + + Appenders can also implement the interface. Therefore + they would require that the method + be called after the appenders properties have been configured. + + + Nicko Cadell + Gert Driesen + + + + The fully qualified type of the BasicConfigurator class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Initializes the log4net system with a default configuration. + + + + Initializes the log4net logging system using a + that will write to Console.Out. The log messages are + formatted using the layout object + with the + layout style. + + + + + + Initializes the log4net system using the specified appenders. + + The appenders to use to log all logging events. + + + Initializes the log4net system using the specified appenders. + + + + + + Initializes the with a default configuration. + + The repository to configure. + + + Initializes the specified repository using a + that will write to Console.Out. The log messages are + formatted using the layout object + with the + layout style. + + + + + + Initializes the using the specified appenders. + + The repository to configure. + The appenders to use to log all logging events. + + + Initializes the using the specified appender. + + + + + + Base class for all log4net configuration attributes. + + + This is an abstract class that must be extended by + specific configurators. This attribute allows the + configurator to be parameterized by an assembly level + attribute. + + Nicko Cadell + Gert Driesen + + + + Constructor used by subclasses. + + the ordering priority for this configurator + + + The is used to order the configurator + attributes before they are invoked. Higher priority configurators are executed + before lower priority ones. + + + + + + Configures the for the specified assembly. + + The assembly that this attribute was defined on. + The repository to configure. + + + Abstract method implemented by a subclass. When this method is called + the subclass should configure the . + + + + + + Compare this instance to another ConfiguratorAttribute + + the object to compare to + see + + + Compares the priorities of the two instances. + Sorts by priority in descending order. Objects with the same priority are + randomly ordered. + + + + + + Class to register for the log4net section of the configuration file + + + The log4net section of the configuration file needs to have a section + handler registered. This is the section handler used. It simply returns + the XML element that is the root of the section. + + + Example of registering the log4net section handler : + + + +
+ + + log4net configuration XML goes here + + + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + + Default constructor. + + + + + + Parses the configuration section. + + The configuration settings in a corresponding parent configuration section. + The configuration context when called from the ASP.NET configuration system. Otherwise, this parameter is reserved and is a null reference. + The for the log4net section. + The for the log4net section. + + + Returns the containing the configuration data, + + + + + + Assembly level attribute that specifies a plugin to attach to + the repository. + + + + Specifies the type of a plugin to create and attach to the + assembly's repository. The plugin type must implement the + interface. + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class + with the specified type. + + The type name of plugin to create. + + + Create the attribute with the plugin type specified. + + + Where possible use the constructor that takes a . + + + + + + Initializes a new instance of the class + with the specified type. + + The type of plugin to create. + + + Create the attribute with the plugin type specified. + + + + + + Gets or sets the type for the plugin. + + + + + Gets or sets the type name for the plugin. + + + + Where possible use the property instead. + + + + + + Creates the plugin object defined by this attribute. + + The plugin object. + + + + + + + Assembly level attribute that specifies the logging repository for the assembly. + + + + Assemblies are mapped to logging repository. This attribute specified + on the assembly controls + the configuration of the repository. The property specifies the name + of the repository that this assembly is a part of. The + specifies the type of the object + to create for the assembly. If this attribute is not specified or a + is not specified then the assembly will be part of the default shared logging repository. + + + This attribute can only be specified on the assembly and may only be used + once per assembly. + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + + Default constructor. + + + + + + Initialize a new instance of the class + with the name of the repository. + + The name of the repository. + + + Initialize the attribute with the name for the assembly's repository. + + + + + + Gets or sets the name of the logging repository. + + + The string name to use as the name of the repository associated with this + assembly. + + + + This value does not have to be unique. Several assemblies can share the + same repository. They will share the logging configuration of the repository. + + + + + + Gets or sets the type of repository to create for this assembly. + + + The type of repository to create for this assembly. + + + + The type of the repository to create for the assembly. + The type must implement the + interface. + + + This will be the type of repository created when + the repository is created. If multiple assemblies reference the + same repository then the repository is only created once using the + of the first assembly to call into the + repository. + + + + + + Assembly level attribute to configure the . + + the type of the provider to use + + + This attribute may only be used at the assembly scope and can only + be used once per assembly. + + + Use this attribute to configure the + without calling one of the + methods. + + + Nicko Cadell + + + + Assembly level attribute to configure the . + + the type of the provider to use + + + This attribute may only be used at the assembly scope and can only + be used once per assembly. + + + Use this attribute to configure the + without calling one of the + methods. + + + Nicko Cadell + + + + Gets or sets the type of the provider to use. + + + + The provider specified must subclass the + class. + + + + + + Configures the SecurityContextProvider + + The assembly that this attribute was defined on. + The repository to configure. + + + Creates a provider instance from the specified. + Sets this as the default security context provider . + + + + + + The fully qualified type of the SecurityContextProviderAttribute class. + + + Used by the internal logger to record the Type of the log message. + + + + + Configures a using an XML tree. + + Nicko Cadell + Gert Driesen + + + + Automatically configures the using settings + stored in the application's configuration file. + + + + Each application has a configuration file. This has the + same name as the application with '.config' appended. + This file is XML and calling this function prompts the + configurator to look in that file for a section called + log4net that contains the configuration data. + + + To use this method to configure log4net you must specify + the section + handler for the log4net configuration section. See the + for an example. + + + The repository to configure. + + + + Automatically configures the log4net system based on the + application's configuration settings. + + + + Each application has a configuration file. This has the + same name as the application with '.config' appended. + This file is XML and calling this function prompts the + configurator to look in that file for a section called + log4net that contains the configuration data. + + + To use this method to configure log4net you must specify + the section + handler for the log4net configuration section. See the + for an example. + + + + + + + Configures log4net using a log4net element + + + + Loads the log4net configuration from the XML element + supplied as . + + + The element to parse. + + + + Configures log4net using the specified configuration file. + + The XML file to load the configuration from. + + + The configuration file must be valid XML. It must contain + at least one element called log4net that holds + the log4net configuration data. + + + The log4net configuration file can possibly be specified in the application's + configuration file (either MyAppName.exe.config for a + normal application on Web.config for an ASP.NET application). + + + The first element matching <configuration> will be read as the + configuration. If this file is also a .NET .config file then you must specify + a configuration section for the log4net element otherwise .NET will + complain. Set the type for the section handler to , for example: + + +
+ + + + + The following example configures log4net using a configuration file, of which the + location is stored in the application's configuration file : + + + using log4net.Config; + using System.IO; + using System.Configuration; + + ... + + XmlConfigurator.Configure(new FileInfo(ConfigurationSettings.AppSettings["log4net-config-file"])); + + + In the .config file, the path to the log4net can be specified like this : + + + + + + + + + + + + + Configures log4net using the specified configuration URI. + + A URI to load the XML configuration from. + + + The configuration data must be valid XML. It must contain + at least one element called log4net that holds + the log4net configuration data. + + + The must support the URI scheme specified. + + + + + + Configures log4net using the specified configuration data stream. + + A stream to load the XML configuration from. + + + The configuration data must be valid XML. It must contain + at least one element called log4net that holds + the log4net configuration data. + + + Note that this method will NOT close the stream parameter. + + + + + + Configures the using the specified XML + element. + + + Loads the log4net configuration from the XML element + supplied as . + + The repository to configure. + The element to parse. + + + + Configures the using the specified configuration + file. + + The repository to configure. + The XML file to load the configuration from. + + + The configuration file must be valid XML. It must contain + at least one element called log4net that holds + the configuration data. + + + The log4net configuration file can possibly be specified in the application's + configuration file (either MyAppName.exe.config for a + normal application on Web.config for an ASP.NET application). + + + The first element matching <configuration> will be read as the + configuration. If this file is also a .NET .config file then you must specify + a configuration section for the log4net element otherwise .NET will + complain. Set the type for the section handler to , for example: + + +
+ + + + + The following example configures log4net using a configuration file, of which the + location is stored in the application's configuration file : + + + using log4net.Config; + using System.IO; + using System.Configuration; + + ... + + XmlConfigurator.Configure(new FileInfo(ConfigurationSettings.AppSettings["log4net-config-file"])); + + + In the .config file, the path to the log4net can be specified like this : + + + + + + + + + + + + + Configures the using the specified configuration + URI. + + The repository to configure. + A URI to load the XML configuration from. + + + The configuration data must be valid XML. It must contain + at least one element called log4net that holds + the configuration data. + + + The must support the URI scheme specified. + + + + + + Configures the using the specified configuration + file. + + The repository to configure. + The stream to load the XML configuration from. + + + The configuration data must be valid XML. It must contain + at least one element called log4net that holds + the configuration data. + + + Note that this method will NOT close the stream parameter. + + + + + + Configures log4net using the file specified, monitors the file for changes + and reloads the configuration if a change is detected. + + The XML file to load the configuration from. + + + The configuration file must be valid XML. It must contain + at least one element called log4net that holds + the configuration data. + + + The configuration file will be monitored using a + and depends on the behavior of that class. + + + For more information on how to configure log4net using + a separate configuration file, see . + + + + + + + Configures the using the file specified, + monitors the file for changes and reloads the configuration if a change + is detected. + + The repository to configure. + The XML file to load the configuration from. + + + The configuration file must be valid XML. It must contain + at least one element called log4net that holds + the configuration data. + + + The configuration file will be monitored using a + and depends on the behavior of that class. + + + For more information on how to configure log4net using + a separate configuration file, see . + + + + + + + Class used to watch config files. + + + + Uses the to monitor + changes to a specified file. Because multiple change notifications + may be raised when the file is modified, a timer is used to + compress the notifications into a single event. The timer + waits for time before delivering + the event notification. If any further + change notifications arrive while the timer is waiting it + is reset and waits again for to + elapse. + + + + + + Holds the FileInfo used to configure the XmlConfigurator + + + + + Holds the repository being configured. + + + + + The timer used to compress the notification events. + + + + + The default amount of time to wait after receiving notification + before reloading the config file. + + + + + Watches file for changes. This object should be disposed when no longer + needed to free system handles on the watched resources. + + + + + Initializes a new instance of the class to + watch a specified config file used to configure a repository. + + The repository to configure. + The configuration file to watch. + + + Initializes a new instance of the class. + + + + + + Event handler used by . + + The firing the event. + The argument indicates the file that caused the event to be fired. + + + This handler reloads the configuration from the file when the event is fired. + + + + + + Event handler used by . + + The firing the event. + The argument indicates the file that caused the event to be fired. + + + This handler reloads the configuration from the file when the event is fired. + + + + + + Called by the timer when the configuration has been updated. + + null + + + + Release the handles held by the watcher and timer. + + + + + Configures the specified repository using a log4net element. + + The hierarchy to configure. + The element to parse. + + + Loads the log4net configuration from the XML element + supplied as . + + + This method is ultimately called by one of the Configure methods + to load the configuration from an . + + + + + + Maps repository names to ConfigAndWatchHandler instances to allow a particular + ConfigAndWatchHandler to dispose of its FileSystemWatcher when a repository is + reconfigured. + + + + + The fully qualified type of the XmlConfigurator class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Assembly level attribute to configure the . + + + + This attribute may only be used at the assembly scope and can only + be used once per assembly. + + + Use this attribute to configure the + without calling one of the + methods. + + + If neither of the or + properties are set the configuration is loaded from the application's .config file. + If set the property takes priority over the + property. The property + specifies a path to a file to load the config from. The path is relative to the + application's base directory; . + The property is used as a postfix to the assembly file name. + The config file must be located in the application's base directory; . + For example in a console application setting the to + config has the same effect as not specifying the or + properties. + + + The property can be set to cause the + to watch the configuration file for changes. + + + + Log4net will only look for assembly level configuration attributes once. + When using the log4net assembly level attributes to control the configuration + of log4net you must ensure that the first call to any of the + methods is made from the assembly with the configuration + attributes. + + + If you cannot guarantee the order in which log4net calls will be made from + different assemblies you must use programmatic configuration instead, i.e. + call the method directly. + + + + Nicko Cadell + Gert Driesen + + + + Default constructor + + + + Default constructor + + + + + + Gets or sets the filename of the configuration file. + + + The filename of the configuration file. + + + + If specified, this is the name of the configuration file to use with + the . This file path is relative to the + application base directory (). + + + The takes priority over the . + + + + + + Gets or sets the extension of the configuration file. + + + + If specified this is the extension for the configuration file. + The path to the config file is built by using the application + base directory (), + the assembly file name and the config file extension. + + + If the is set to MyExt then + possible config file names would be: MyConsoleApp.exe.MyExt or + MyClassLibrary.dll.MyExt. + + + The takes priority over the . + + + + + + Gets or sets a value indicating whether to watch the configuration file. + + + true if the configuration should be watched, false otherwise. + + + + If this flag is specified and set to true then the framework + will watch the configuration file and will reload the config each time + the file is modified. + + + The config file can only be watched if it is loaded from local disk. + In a No-Touch (Smart Client) deployment where the application is downloaded + from a web server the config file may not reside on the local disk + and therefore it may not be able to watch it. + + + Watching configuration is not supported on the SSCLI. + + + + + + Configures the for the specified assembly. + + The assembly that this attribute was defined on. + The repository to configure. + + + Configure the repository using the . + The specified must extend the + class otherwise the will not be able to + configure it. + + + The does not extend . + + + + Attempt to load configuration from the local file system + + The assembly that this attribute was defined on. + The repository to configure. + + + + Configure the specified repository using a + + The repository to configure. + the FileInfo pointing to the config file + + + + Attempt to load configuration from a URI + + The repository to configure. + + + + The fully qualified type of the XmlConfiguratorAttribute class. + + + Used by the internal logger to record the Type of the + log message. + + + + + The default implementation of the interface. + + + + Uses attributes defined on the calling assembly to determine how to + configure the hierarchy for the repository. + + + Nicko Cadell + Gert Driesen + + + + Event to notify that a logger repository has been created. + + + Event to notify that a logger repository has been created. + + + + Event raised when a new repository is created. + The event source will be this selector. The event args will + be a which + holds the newly created . + + + + + + Creates a new repository selector. + + The type of the repositories to create, must implement + + + Create a new repository selector. + The default type for repositories must be specified, + an appropriate value would be . + + + is . + does not implement . + + + + Gets the for the specified assembly. + + The assembly use to look up the . + + + The type of the created and the repository + to create can be overridden by specifying the + attribute on the . + + + The default values are to use the + implementation of the interface and to use the + as the name of the repository. + + + The created will be automatically configured using + any attributes defined on + the . + + + The for the assembly + is . + + + + Gets the for the specified repository. + + The repository to use to look up the . + The for the specified repository. + + + Returns the named repository. If is null + a is thrown. If the repository + does not exist a is thrown. + + + Use to create a repository. + + + is . + does not exist. + + + + Creates a new repository for the assembly specified + + the assembly to use to create the repository to associate with the . + The type of repository to create, must implement . + The repository created. + + + The created will be associated with the repository + specified such that a call to with the + same assembly specified will return the same repository instance. + + + The type of the created and + the repository to create can be overridden by specifying the + attribute on the + . The default values are to use the + implementation of the + interface and to use the + as the name of the repository. + + + The created will be automatically + configured using any + attributes defined on the . + + + If a repository for the already exists + that repository will be returned. An error will not be raised and that + repository may be of a different type to that specified in . + Also the attribute on the + assembly may be used to override the repository type specified in + . + + + is . + + + + Creates a new repository for the assembly specified. + + the assembly to use to create the repository to associate with the . + The type of repository to create, must implement . + The name to assign to the created repository + Set to true to read and apply the assembly attributes + The repository created. + + + The created will be associated with the repository + specified such that a call to with the + same assembly specified will return the same repository instance. + + + The type of the created and + the repository to create can be overridden by specifying the + attribute on the + . The default values are to use the + implementation of the + interface and to use the + as the name of the repository. + + + The created will be automatically + configured using any + attributes defined on the . + + + If a repository for the already exists + that repository will be returned. An error will not be raised and that + repository may be of a different type to that specified in . + Also the attribute on the + assembly may be used to override the repository type specified in + . + + + is . + + + + Creates a new repository for the specified repository. + + The repository to associate with the . + The type of repository to create, must implement . + If this param is then the default repository type is used. + The new repository. + + + The created will be associated with the repository + specified such that a call to with the + same repository specified will return the same repository instance. + + + is . + already exists. + + + + Test if a named repository exists + + the named repository to check + true if the repository exists + + + Test if a named repository exists. Use + to create a new repository and to retrieve + a repository. + + + + + + Gets a list of objects + + an array of all known objects + + + Gets an array of all repositories created by this selector. + + + + + + Aliases a repository to an existing repository. + + The repository to alias. + The repository that the repository is aliased to. + + + The repository specified will be aliased to the repository when created. + The repository must not already exist. + + + When the repository is created it must utilize the same repository type as + the repository it is aliased to, otherwise the aliasing will fail. + + + + is . + -or- + is . + + + + + Notifies the registered listeners that the repository has been created. + + The repository that has been created. + + + Raises the event. + + + + + + Gets the repository name and repository type for the specified assembly. + + The assembly that has a . + in/out param to hold the repository name to use for the assembly, caller should set this to the default value before calling. + in/out param to hold the type of the repository to create for the assembly, caller should set this to the default value before calling. + is . + + + + Configures the repository using information from the assembly. + + The assembly containing + attributes which define the configuration for the repository. + The repository to configure. + + is . + -or- + is . + + + + + Loads the attribute defined plugins on the assembly. + + The assembly that contains the attributes. + The repository to add the plugins to. + + is . + -or- + is . + + + + + Loads the attribute defined aliases on the assembly. + + The assembly that contains the attributes. + The repository to alias to. + + is . + -or- + is . + + + + + The fully qualified type of the DefaultRepositorySelector class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Defined error codes that can be passed to the method. + + + + Values passed to the method. + + + Nicko Cadell + + + + A general error + + + + + Error while writing output + + + + + Failed to flush file + + + + + Failed to close file + + + + + Unable to open output file + + + + + No layout specified + + + + + Failed to parse address + + + + + An evaluator that triggers on an Exception type + + + + This evaluator will trigger if the type of the Exception + passed to + is equal to a Type in . /// + + + Drew Schaeffer + + + + Default ctor to allow dynamic creation through a configurator. + + + + + Constructs an evaluator and initializes to trigger on + + the type that triggers this evaluator. + If true, this evaluator will trigger on subclasses of . + + + + The type that triggers this evaluator. + + + + + If true, this evaluator will trigger on subclasses of . + + + + + Is this the triggering event? + + The event to check + This method returns true, if the logging event Exception + Type is . + Otherwise it returns false + + + This evaluator will trigger if the Exception Type of the event + passed to + is . + + + + + + Flags passed to the property + + Nicko Cadell + + + + Fix the MDC + + + + + Fix the NDC + + + + + Fix the rendered message + + + + + Fix the thread name + + + + + Fix the callers location information + + + CAUTION: Very slow to generate + + + + + Fix the callers windows user name + + + CAUTION: Slow to generate + + + + + Fix the domain friendly name + + + + + Fix the callers principal name + + + CAUTION: May be slow to generate + + + + + Fix the exception text + + + + + Fix the event properties. Active properties must implement in order to be eligible for fixing. + + + + + No fields fixed + + + + + All fields fixed + + + + + Partial fields fixed + + + + This set of partial fields gives good performance. The following fields are fixed: + + + + + + + + + + + + + Interface for attaching appenders to objects. + + + + Interface for attaching, removing and retrieving appenders. + + + Nicko Cadell + Gert Driesen + + + + Attaches an appender. + + The appender to add. + + + Add the specified appender. The implementation may + choose to allow or deny duplicate appenders. + + + + + + Gets all attached appenders. + + + A collection of attached appenders. + + + + Gets a collection of attached appenders. + If there are no attached appenders the + implementation should return an empty + collection rather than null. + + + + + + Gets an attached appender with the specified name. + + The name of the appender to get. + + The appender with the name specified, or null if no appender with the + specified name is found. + + + + Returns an attached appender with the specified. + If no appender with the specified name is found null will be + returned. + + + + + + Removes all attached appenders. + + + + Removes and closes all attached appenders + + + + + + Removes the specified appender from the list of attached appenders. + + The appender to remove. + The appender removed from the list + + + The appender removed is not closed. + If you are discarding the appender you must call + on the appender removed. + + + + + + Removes the appender with the specified name from the list of appenders. + + The name of the appender to remove. + The appender removed from the list + + + The appender removed is not closed. + If you are discarding the appender you must call + on the appender removed. + + + + + + Appenders may delegate their error handling to an . + + + + Error handling is a particularly tedious to get right because by + definition errors are hard to predict and to reproduce. + + + Nicko Cadell + Gert Driesen + + + + Handles the error and information about the error condition is passed as + a parameter. + + The message associated with the error. + The that was thrown when the error occurred. + The error code associated with the error. + + + Handles the error and information about the error condition is passed as + a parameter. + + + + + + Prints the error message passed as a parameter. + + The message associated with the error. + The that was thrown when the error occurred. + + + See . + + + + + + Prints the error message passed as a parameter. + + The message associated with the error. + + + See . + + + + + + Interface for objects that require fixing. + + + + Interface that indicates that the object requires fixing before it + can be taken outside the context of the appender's + method. + + + When objects that implement this interface are stored + in the context properties maps + and + are fixed + (see ) the + method will be called. + + + Nicko Cadell + + + + Get a portable version of this object + + the portable instance of this object + + + Get a portable instance object that represents the current + state of this object. The portable object can be stored + and logged from any thread with identical results. + + + + + + Interface that all loggers implement to support logging events and testing if a level + is enabled for logging. + + + + These methods will not throw exceptions. Note to implementers, ensure + that the implementation of these methods cannot allow an exception + to be thrown to the caller. + + + Nicko Cadell + Gert Driesen + + + + Gets the name of the logger. + + + + + Generates a logging event for the specified using + the and . + + The declaring type of the method that is + the stack boundary into the logging system for this call. + The level of the message to be logged. + The message object to log. + the exception to log, including its stack trace. Pass null to not log an exception. + + + This generic form is intended to be used by wrappers. + + + + + + Logs the specified logging event through this logger. + + The event being logged. + + + This is the most generic printing method that is intended to be used + by wrappers. + + + + + + Checks if this logger is enabled for a given passed as parameter. + + The level to check. + + true if this logger is enabled for level, otherwise false. + + + + + Gets the where this + Logger instance is attached to. + + + + + Base interface for all wrappers + + + + Base interface for all wrappers. + + + All wrappers must implement this interface. + + + Nicko Cadell + + + + Gets the object that implements this object. + + + + + + The Logger object may not be the same object as this object because of logger decorators. + This gets the actual underlying objects that is used to process the log events. + + + + + + Interface used to delay activate a configured object. + + + + This allows an object to defer activation of its options until all + options have been set. This is required for components which have + related options that remain ambiguous until all are set. + + + If a component implements this interface then the method + must be called by the container after its all the configured properties have been set + and before the component can be used. + + + Nicko Cadell + + + + Activate the options that were previously set with calls to properties. + + + + This allows an object to defer activation of its options until all + options have been set. This is required for components which have + related options that remain ambiguous until all are set. + + + If a component implements this interface then this method must be called + after its properties have been set before the component can be used. + + + + + + Delegate used to handle logger repository creation event notifications + + The which created the repository. + The event args + that holds the instance that has been created. + + + Delegate used to handle logger repository creation event notifications. + + + + + + Provides data for the event. + + the that has been created + + + A + event is raised every time a is created. + + + + + + Provides data for the event. + + the that has been created + + + A + event is raised every time a is created. + + + + + + The that has been created + + + The that has been created + + + + The that has been created + + + + + + Interface used by the to select the . + + + + The uses a + to specify the policy for selecting the correct + to return to the caller. + + + Nicko Cadell + Gert Driesen + + + + Gets the for the specified assembly. + + The assembly to use to look up to the + The for the assembly. + + + Gets the for the specified assembly. + + + How the association between and + is made is not defined. The implementation may choose any method for + this association. The results of this method must be repeatable, i.e. + when called again with the same arguments the result must be the + save value. + + + + + + Gets the named . + + The name to use to look up to the . + The named + + Lookup a named . This is the repository created by + calling . + + + + + Creates a new repository for the assembly specified. + + The assembly to use to create the domain to associate with the . + The type of repository to create, must implement . + The repository created. + + + The created will be associated with the domain + specified such that a call to with the + same assembly specified will return the same repository instance. + + + How the association between and + is made is not defined. The implementation may choose any method for + this association. + + + + + + Creates a new repository with the name specified. + + The name to associate with the . + The type of repository to create, must implement . + The repository created. + + + The created will be associated with the name + specified such that a call to with the + same name will return the same repository instance. + + + + + + Test if a named repository exists + + the named repository to check + true if the repository exists + + + Test if a named repository exists. Use + to create a new repository and to retrieve + a repository. + + + + + + Gets an array of all currently defined repositories. + + + An array of the instances created by + this . + + + Gets an array of all repositories created by this selector. + + + + + + Event to notify that a logger repository has been created. + + + Event to notify that a logger repository has been created. + + + + Event raised when a new repository is created. + The event source will be this selector. The event args will + be a which + holds the newly created . + + + + + + Test if an triggers an action + + + + Implementations of this interface allow certain appenders to decide + when to perform an appender specific action. + + + The action or behavior triggered is defined by the implementation. + + + Nicko Cadell + + + + Test if this event triggers the action + + The event to check + true if this event triggers the action, otherwise false + + + Return true if this event triggers the action + + + + + + Defines the default set of levels recognized by the system. + + + + Each has an associated . + + + Levels have a numeric that defines the relative + ordering between levels. Two Levels with the same + are deemed to be equivalent. + + + The levels that are recognized by log4net are set for each + and each repository can have different levels defined. The levels are stored + in the on the repository. Levels are + looked up by name from the . + + + When logging at level INFO the actual level used is not but + the value of LoggerRepository.LevelMap["INFO"]. The default value for this is + , but this can be changed by reconfiguring the level map. + + + Each level has a in addition to its . The + is the string that is written into the output log. By default + the display name is the same as the level name, but this can be used to alias levels + or to localize the log output. + + + Some of the predefined levels recognized by the system are: + + + + . + + + . + + + . + + + . + + + . + + + . + + + . + + + + Nicko Cadell + Gert Driesen + + + + Constructor + + Integer value for this level, higher values represent more severe levels. + The string name of this level. + The display name for this level. This may be localized or otherwise different from the name + + + Initializes a new instance of the class with + the specified level name and value. + + + + + + Constructor + + Integer value for this level, higher values represent more severe levels. + The string name of this level. + + + Initializes a new instance of the class with + the specified level name and value. + + + + + + Serialization constructor + + The that holds the serialized object data. + The that contains contextual information about the source or destination. + + + Initializes a new instance of the class + with serialized data. + + + + + + Gets the name of this level. + + + The name of this level. + + + + Gets the name of this level. + + + + + + Gets the value of this level. + + + + + Gets the display name of this level. + + + + + Returns the representation of the current + . + + + A representation of the current . + + + + Returns the level . + + + + + + + + + Compares levels. + + The object to compare against. + if the objects are equal. + + + + Returns a hash code + + A hash code for the current . + + + Returns a hash code suitable for use in hashing algorithms and data + structures like a hash table. + + + Returns the hash code of the level . + + + + + + + + + Compares this instance to a specified object and returns an + indication of their relative values. + + A instance or to compare with this instance. + + A 32-bit signed integer that indicates the relative order of the + values compared. The return value has these meanings: + + + Value + Meaning + + + Less than zero + This instance is less than . + + + Zero + This instance is equal to . + + + Greater than zero + + This instance is greater than . + -or- + is . + + + + + + + must be an instance of + or ; otherwise, an exception is thrown. + + + + + + Serializes this object into the provided. + + The to populate with data. + The destination for this serialization. + + + + Returns a value indicating whether a specified + is greater than another specified . + + A + A + + if is greater than + ; otherwise, . + + + + + Returns a value indicating whether a specified + is less than another specified . + + A + A + + if is less than + ; otherwise, . + + + + + Returns a value indicating whether a specified + is greater than or equal to another specified . + + A + A + + if is greater than or equal to + ; otherwise, . + + + + + Returns a value indicating whether a specified + is less than or equal to another specified . + + A + A + + if is less than or equal to + ; otherwise, . + + + + + Returns a value indicating whether two specified + objects have the same value. + + A or . + A or . + + if the value of is the same as the + value of ; otherwise, . + + + + + Returns a value indicating whether two specified + objects have different values. + + A or . + A or . + + if the value of is different from + the value of ; otherwise, . + + + + + Compares two specified instances. + + The first to compare. + The second to compare. + + A 32-bit signed integer that indicates the relative order of the + two values compared. The return value has these meanings: + + + Value + Meaning + + + Less than zero + is less than . + + + Zero + is equal to . + + + Greater than zero + is greater than . + + + + + + + The level designates a higher level than all the rest. + + + + + The level designates very severe error events. + System unusable, emergencies. + + + + + The level designates very severe error events. + System unusable, emergencies. + + + + + The level designates very severe error events + that will presumably lead the application to abort. + + + + + The level designates very severe error events. + Take immediate action, alerts. + + + + + The level designates very severe error events. + Critical condition, critical. + + + + + The level designates very severe error events. + + + + + The level designates error events that might + still allow the application to continue running. + + + + + The level designates potentially harmful + situations. + + + + + The level designates informational messages + that highlight the progress of the application at the highest level. + + + + + The level designates informational messages that + highlight the progress of the application at coarse-grained level. + + + + + The level designates fine-grained informational + events that are most useful to debug an application. + + + + + The level designates fine-grained informational + events that are most useful to debug an application. + + + + + The level designates fine-grained informational + events that are most useful to debug an application. + + + + + The level designates fine-grained informational + events that are most useful to debug an application. + + + + + The level designates fine-grained informational + events that are most useful to debug an application. + + + + + The level designates fine-grained informational + events that are most useful to debug an application. + + + + + The level designates the lowest level possible. + + + + + A strongly-typed collection of objects. + + Nicko Cadell + + + + Supports type-safe iteration over a . + + + + + Gets the current element in the collection. + + + + + Advances the enumerator to the next element in the collection. + + + true if the enumerator was successfully advanced to the next element; + false if the enumerator has passed the end of the collection. + + + The collection was modified after the enumerator was created. + + + + + Sets the enumerator to its initial position, before the first element in the collection. + + + + + Creates a read-only wrapper for a LevelCollection instance. + + list to create a readonly wrapper arround + + A LevelCollection wrapper that is read-only. + + + + + Initializes a new instance of the LevelCollection class + that is empty and has the default initial capacity. + + + + + Initializes a new instance of the LevelCollection class + that has the specified initial capacity. + + + The number of elements that the new LevelCollection is initially capable of storing. + + + + + Initializes a new instance of the LevelCollection class + that contains elements copied from the specified LevelCollection. + + The LevelCollection whose elements are copied to the new collection. + + + + Initializes a new instance of the LevelCollection class + that contains elements copied from the specified array. + + The array whose elements are copied to the new list. + + + + Initializes a new instance of the LevelCollection class + that contains elements copied from the specified collection. + + The collection whose elements are copied to the new list. + + + + Initializes a new instance of the LevelCollection class + that contains elements copied from the specified collection. + + The collection whose elements are copied to the new list. + + + + Type visible only to our subclasses + Used to access protected constructor + + + + + A value + + + + + Allow subclasses to avoid our default constructors + + + + + Gets the number of elements actually contained in the LevelCollection. + + + + + Copies the entire LevelCollection to a one-dimensional + array. + + The one-dimensional array to copy to. + + + + Copies the entire LevelCollection to a one-dimensional + array, starting at the specified index of the target array. + + The one-dimensional array to copy to. + The zero-based index in at which copying begins. + + + + Gets a value indicating whether access to the collection is synchronized (thread-safe). + + false, because the backing type is an array, which is never thread-safe. + + + + Gets an object that can be used to synchronize access to the collection. + + + + + Gets or sets the at the specified index. + + The zero-based index of the element to get or set. + + is less than zero + -or- + is equal to or greater than . + + + + + Adds a to the end of the LevelCollection. + + The to be added to the end of the LevelCollection. + The index at which the value has been added. + + + + Removes all elements from the LevelCollection. + + + + + Creates a shallow copy of the . + + A new with a shallow copy of the collection data. + + + + Determines whether a given is in the LevelCollection. + + The to check for. + true if is found in the LevelCollection; otherwise, false. + + + + Returns the zero-based index of the first occurrence of a + in the LevelCollection. + + The to locate in the LevelCollection. + + The zero-based index of the first occurrence of + in the entire LevelCollection, if found; otherwise, -1. + + + + + Inserts an element into the LevelCollection at the specified index. + + The zero-based index at which should be inserted. + The to insert. + + is less than zero + -or- + is equal to or greater than . + + + + + Removes the first occurrence of a specific from the LevelCollection. + + The to remove from the LevelCollection. + + The specified was not found in the LevelCollection. + + + + + Removes the element at the specified index of the LevelCollection. + + The zero-based index of the element to remove. + + is less than zero + -or- + is equal to or greater than . + + + + + Gets a value indicating whether the collection has a fixed size. + + true if the collection has a fixed size; otherwise, false. The default is false + + + + Gets a value indicating whether the IList is read-only. + + true if the collection is read-only; otherwise, false. The default is false + + + + Returns an enumerator that can iterate through the LevelCollection. + + An for the entire LevelCollection. + + + + Gets or sets the number of elements the LevelCollection can contain. + + + + + Adds the elements of another LevelCollection to the current LevelCollection. + + The LevelCollection whose elements should be added to the end of the current LevelCollection. + The new of the LevelCollection. + + + + Adds the elements of a array to the current LevelCollection. + + The array whose elements should be added to the end of the LevelCollection. + The new of the LevelCollection. + + + + Adds the elements of a collection to the current LevelCollection. + + The collection whose elements should be added to the end of the LevelCollection. + The new of the LevelCollection. + + + + Sets the capacity to the actual number of elements. + + + + + is less than zero + -or- + is equal to or greater than . + + + + + is less than zero + -or- + is equal to or greater than . + + + + + Supports simple iteration over a . + + + + + Initializes a new instance of the Enumerator class. + + + + + + Gets the current element in the collection. + + + + + Advances the enumerator to the next element in the collection. + + + true if the enumerator was successfully advanced to the next element; + false if the enumerator has passed the end of the collection. + + + The collection was modified after the enumerator was created. + + + + + Sets the enumerator to its initial position, before the first element in the collection. + + + + + An evaluator that triggers at a threshold level + + the threshold to trigger at + + + This evaluator will trigger if the level of the event + passed to + is equal to or greater than the + level. + + + Nicko Cadell + + + + An evaluator that triggers at a threshold level + + the threshold to trigger at + + + This evaluator will trigger if the level of the event + passed to + is equal to or greater than the + level. + + + Nicko Cadell + + + + Create a new evaluator using the threshold. + + + + This evaluator will trigger if the level of the event + passed to + is equal to or greater than the + level. + + + + + + the threshold to trigger at + + + The that will cause this evaluator to trigger + + + + This evaluator will trigger if the level of the event + passed to + is equal to or greater than the + level. + + + + + + Is this the triggering event? + + The event to check + This method returns true, if the event level + is equal or higher than the . + Otherwise it returns false + + + + Maps between string name and Level object. + + + + This mapping is held separately for each . + The level name is case-insensitive. + + + Nicko Cadell + + + + Mapping from level name to Level object. The + level name is case-insensitive + + + + + Clear the internal maps of all levels + + + + Clear the internal maps of all levels + + + + + + Looks up a by name + + The name of the Level to look up. + A Level from the map with the name specified, or null if none is found. + + + + Creates a new Level and adds it to the map. + + the string to display for the Level + the level value to give to the Level + + + + + Creates a new Level and adds it to the map. + + the string to display for the Level + the level value to give to the Level + the display name to give to the Level + + + + Adds a Level to the map. + + the Level to add + + + + Gets all possible levels as a collection of Level objects. + + + + + Looks up a named level from the map. + + + The name of the level to look up is taken from this level. + If the level is not set in the map then this level is added. + If no level with the specified name is found then the + argument is added to the level map + and returned. + + the level in the map with the name specified + + + + The internal representation of caller location information. + + + + This class uses the System.Diagnostics.StackTrace class to generate + a call stack. The caller's information is then extracted from this stack. + + + The System.Diagnostics.StackTrace class is not supported on the + .NET Compact Framework 1.0 therefore caller location information is not + available on that framework. + + + The System.Diagnostics.StackTrace class has this to say about Release builds: + + + "StackTrace information will be most informative with Debug build configurations. + By default, Debug builds include debug symbols, while Release builds do not. The + debug symbols contain most of the file, method name, line number, and column + information used in constructing StackFrame and StackTrace objects. StackTrace + might not report as many method calls as expected, due to code transformations + that occur during optimization." + + + This means that in a Release build the caller information may be incomplete or may + not exist at all! Therefore caller location information cannot be relied upon in a Release build. + + + Nicko Cadell + Gert Driesen + + + + Constructor + + The declaring type of the method that is + the stack boundary into the logging system for this call. + + + Initializes a new instance of the + class based on the current thread. + + + + + + Constructor + + The fully qualified class name. + The method name. + The file name. + The line number of the method within the file. + + + Initializes a new instance of the + class with the specified data. + + + + + + Serialization constructor + + The that holds the serialized object data. + The that contains contextual information about the source or destination. + + + Initializes a new instance of the class + with serialized data. + + + + + + Gets the fully qualified class name of the caller making the logging + request. + + + + + Gets the file name of the caller. + + + + + Gets the line number of the caller. + + + + + Gets the method name of the caller. + + + + + Gets all available caller information + + + All available caller information, in the format + fully.qualified.classname.of.caller.methodName(Filename:line) + + + + + Gets the stack frames from the stack trace of the caller making the log request + + + + + Serializes this object into the provided. + + The to populate with data. + The destination for this serialization. + + + + The fully qualified type of the LocationInfo class. + + + Used by the internal logger to record the Type of the + log message. + + + + + When location information is not available the constant + NA is returned. Current value of this string + constant is ?. + + + + + Exception base type for log4net. + + + + This type extends . It + does not add any new functionality but does differentiate the + type of exception being thrown. + + + Nicko Cadell + Gert Driesen + + + + Constructor + + + + Initializes a new instance of the class. + + + + + + Constructor + + A message to include with the exception. + + + Initializes a new instance of the class with + the specified message. + + + + + + Constructor + + A message to include with the exception. + A nested exception to include. + + + Initializes a new instance of the class + with the specified message and inner exception. + + + + + + Serialization constructor + + The that holds the serialized object data about the exception being thrown. + The that contains contextual information about the source or destination. + + + Initializes a new instance of the class + with serialized data. + + + + + + Static manager that controls the creation of repositories + + + + Static manager that controls the creation of repositories + + + This class is used by the wrapper managers (e.g. ) + to provide access to the objects. + + + This manager also holds the that is used to + lookup and create repositories. The selector can be set either programmatically using + the property, or by setting the log4net.RepositorySelector + AppSetting in the applications config file to the fully qualified type name of the + selector to use. + + + Nicko Cadell + Gert Driesen + + + + Hook the shutdown event + + + + On the full .NET runtime, the static constructor hooks up the + AppDomain.ProcessExit and AppDomain.DomainUnload> events. + These are used to shut down the log4net system as the application exits. + + + + + + Register for ProcessExit and DomainUnload events on the AppDomain + + + + This needs to be in a separate method because the events make + a LinkDemand for the ControlAppDomain SecurityPermission. Because + this is a LinkDemand it is demanded at JIT time. Therefore we cannot + catch the exception in the method itself, we have to catch it in the + caller. + + + + + + Return the default instance. + + the repository to lookup in + Return the default instance + + + Gets the for the repository specified + by the argument. + + + + + + Returns the default instance. + + The assembly to use to look up the repository. + The default instance. + + + Returns the default instance. + + + + + + Returns the named logger if it exists. + + The repository to lookup in. + The fully qualified logger name to look for. + + The logger found, or null if the named logger does not exist in the + specified repository. + + + + If the named logger exists (in the specified repository) then it + returns a reference to the logger, otherwise it returns + null. + + + + + + Returns the named logger if it exists. + + The assembly to use to look up the repository. + The fully qualified logger name to look for. + + The logger found, or null if the named logger does not exist in the + specified assembly's repository. + + + + If the named logger exists (in the specified assembly's repository) then it + returns a reference to the logger, otherwise it returns + null. + + + + + + Returns all the currently defined loggers in the specified repository. + + The repository to lookup in. + All the defined loggers. + + + The root logger is not included in the returned array. + + + + + + Returns all the currently defined loggers in the specified assembly's repository. + + The assembly to use to look up the repository. + All the defined loggers. + + + The root logger is not included in the returned array. + + + + + + Retrieves or creates a named logger. + + The repository to lookup in. + The name of the logger to retrieve. + The logger with the name specified. + + + Retrieves a logger named as the + parameter. If the named logger already exists, then the + existing instance will be returned. Otherwise, a new instance is + created. + + + By default, loggers do not have a set level but inherit + it from the hierarchy. This is one of the central features of + log4net. + + + + + + Retrieves or creates a named logger. + + The assembly to use to look up the repository. + The name of the logger to retrieve. + The logger with the name specified. + + + Retrieves a logger named as the + parameter. If the named logger already exists, then the + existing instance will be returned. Otherwise, a new instance is + created. + + + By default, loggers do not have a set level but inherit + it from the hierarchy. This is one of the central features of + log4net. + + + + + + Shorthand for . + + The repository to lookup in. + The of which the fullname will be used as the name of the logger to retrieve. + The logger with the name specified. + + + Gets the logger for the fully qualified name of the type specified. + + + + + + Shorthand for . + + the assembly to use to look up the repository + The of which the fullname will be used as the name of the logger to retrieve. + The logger with the name specified. + + + Gets the logger for the fully qualified name of the type specified. + + + + + + Shuts down the log4net system. + + + + Calling this method will safely close and remove all + appenders in all the loggers including root contained in all the + default repositories. + + + Some appenders need to be closed before the application exists. + Otherwise, pending logging events might be lost. + + + The shutdown method is careful to close nested + appenders before closing regular appenders. This allows + configurations where a regular appender is attached to a logger + and again to a nested appender. + + + + + + Shuts down the repository for the repository specified. + + The repository to shut down. + + + Calling this method will safely close and remove all + appenders in all the loggers including root contained in the + repository for the specified. + + + Some appenders need to be closed before the application exists. + Otherwise, pending logging events might be lost. + + + The shutdown method is careful to close nested + appenders before closing regular appenders. This allows + configurations where a regular appender is attached to a logger + and again to a nested appender. + + + + + + Shuts down the repository for the repository specified. + + The assembly to use to look up the repository. + + + Calling this method will safely close and remove all + appenders in all the loggers including root contained in the + repository for the repository. The repository is looked up using + the specified. + + + Some appenders need to be closed before the application exists. + Otherwise, pending logging events might be lost. + + + The shutdown method is careful to close nested + appenders before closing regular appenders. This allows + configurations where a regular appender is attached to a logger + and again to a nested appender. + + + + + + Resets all values contained in this repository instance to their defaults. + + The repository to reset. + + + Resets all values contained in the repository instance to their + defaults. This removes all appenders from all loggers, sets + the level of all non-root loggers to null, + sets their additivity flag to true and sets the level + of the root logger to . Moreover, + message disabling is set its default "off" value. + + + + + + Resets all values contained in this repository instance to their defaults. + + The assembly to use to look up the repository to reset. + + + Resets all values contained in the repository instance to their + defaults. This removes all appenders from all loggers, sets + the level of all non-root loggers to null, + sets their additivity flag to true and sets the level + of the root logger to . Moreover, + message disabling is set its default "off" value. + + + + + + Creates a repository with the specified name. + + The name of the repository, this must be unique amongst repositories. + The created for the repository. + + + Creates the default type of which is a + object. + + + The name must be unique. Repositories cannot be redefined. + An will be thrown if the repository already exists. + + + The specified repository already exists. + + + + Creates a repository with the specified name and repository type. + + The name of the repository, this must be unique to the repository. + A that implements + and has a no arg constructor. An instance of this type will be created to act + as the for the repository specified. + The created for the repository. + + + The name must be unique. Repositories cannot be redefined. + An Exception will be thrown if the repository already exists. + + + The specified repository already exists. + + + + Creates a repository for the specified assembly and repository type. + + The assembly to use to get the name of the repository. + A that implements + and has a no arg constructor. An instance of this type will be created to act + as the for the repository specified. + The created for the repository. + + + The created will be associated with the repository + specified such that a call to with the + same assembly specified will return the same repository instance. + + + + + + Gets an array of all currently defined repositories. + + An array of all the known objects. + + + Gets an array of all currently defined repositories. + + + + + + Gets or sets the repository selector used by the . + + + The repository selector used by the . + + + + The repository selector () is used by + the to create and select repositories + (). + + + The caller to supplies either a string name + or an assembly (if not supplied the assembly is inferred using + ). + + + This context is used by the selector to look up a specific repository. + + + + + + Internal method to get pertinent version info. + + A string of version info. + + + + Called when the event fires + + the that is exiting + null + + + Called when the event fires. + + + When the event is triggered the log4net system is . + + + + + + Called when the event fires + + the that is exiting + null + + + Called when the event fires. + + + When the event is triggered the log4net system is . + + + + + + The fully qualified type of the LoggerManager class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Implementation of the interface. + + The logger to wrap. + + + This class should be used as the base for all wrapper implementations. + + + Nicko Cadell + Gert Driesen + + + + Implementation of the interface. + + The logger to wrap. + + + This class should be used as the base for all wrapper implementations. + + + Nicko Cadell + Gert Driesen + + + + Gets the implementation behind this wrapper object. + + + The object that this object is implementing. + + + + The Logger object may not be the same object as this object + because of logger decorators. + + + This gets the actual underlying objects that is used to process + the log events. + + + + + + Portable data structure used by + + Nicko Cadell + + + + The logger name. + + + + + Level of logging event. + + + + A null level produces varying results depending on the appenders in use. + In many cases it is equivalent of , other times + it is mapped to Debug or Info defaults. + + + Level cannot be Serializable because it is a flyweight. + Due to its special serialization it cannot be declared final either. + + + + + + The application supplied message. + + + + + Gets or sets the name of the thread in which this logging event was generated. + + + + + Gets or sets the UTC time the event was logged. + + + + + Location information for the caller. + + + + Location information for the caller. + + + + + + String representation of the user + + + + String representation of the user's windows name, like DOMAIN\username + + + + + + String representation of the identity. + + + + String representation of the current thread's principal identity. + + + + + + The string representation of the exception + + + + The string representation of the exception + + + + + + String representation of the AppDomain. + + + + String representation of the AppDomain. + + + + + + Additional event specific properties + + + + A logger or an appender may attach additional + properties to specific events. These properties + have a string key and an object value. + + + + + + The internal representation of logging events. + + + + When an affirmative decision is made to log then a + instance is created. This instance + is passed around to the different log4net components. + + + This class is of concern to those wishing to extend log4net. + + + Some of the values in instances of + are considered volatile, that is the values are correct at the + time the event is delivered to appenders, but will not be consistent + at any time afterward. If an event is to be stored and then processed + at a later time these volatile values must be fixed by setting + . There is a performance penalty + for incurred by calling but it + is essential to maintain data consistency. + + + Nicko Cadell + Gert Driesen + Douglas de la Torre + Daniel Cazzulino + + + + Initializes a new instance of the class + from the supplied parameters. + + The declaring type of the method that is + the stack boundary into the logging system for this call. + The repository this event is logged in. + The name of the logger of this event. + + The level of this event. + A null level produces varying results depending on the appenders in use. + In many cases it is equivalent of , other times + it is mapped to Debug or Info defaults. + + The message of this event. + The exception for this event. + + + Except , and , + all fields of are lazily filled when actually needed. Set + to cache all data locally to prevent inconsistencies. + + This method is called by the log4net framework + to create a logging event. + + + + + + Initializes a new instance of the class + using specific data. + + The declaring type of the method that is + the stack boundary into the logging system for this call. + The repository this event is logged in. + Data used to initialize the logging event. + The fields in the struct that have already been fixed. + + + This constructor is provided to allow a + to be created independently of the log4net framework. This can + be useful if you require a custom serialization scheme. + + + Use the method to obtain an + instance of the class. + + + The parameter should be used to specify which fields in the + struct have been preset. Fields not specified in the + will be captured from the environment if requested or fixed. + + + + + + Initializes a new instance of the class + using specific data. + + The declaring type of the method that is + the stack boundary into the logging system for this call. + The repository this event is logged in. + Data used to initialize the logging event. + + + This constructor is provided to allow a + to be created independently of the log4net framework. This can + be useful if you require a custom serialization scheme. + + + Use the method to obtain an + instance of the class. + + + This constructor sets this objects flags to , + this assumes that all the data relating to this event is passed in via the + parameter and no other data should be captured from the environment. + + + + + + Initializes a new instance of the class + using specific data. + + Data used to initialize the logging event. + + + This constructor is provided to allow a + to be created independently of the log4net framework. This can + be useful if you require a custom serialization scheme. + + + Use the method to obtain an + instance of the class. + + + This constructor sets this objects flags to , + this assumes that all the data relating to this event is passed in via the + parameter and no other data should be captured from the environment. + + + + + + Initializes a new instance of the class. + + + + This constructor is provided to allow deserialization using System.Text.Json + or Newtonsoft.Json. + + + Use the method to obtain an + instance of the class. + + + This constructor sets this objects flags to . + + + + + + Serialization constructor + + The that holds the serialized object data. + The that contains contextual information about the source or destination. + + + Initializes a new instance of the class + with serialized data. + + + + + + Gets the time when the current process started. + + + This is the time when this process started. + + + + The TimeStamp is stored internally in UTC and converted to the local time zone for this computer. + + + Tries to get the start time for the current process. + Failing that it returns the time of the first call to + this property. + + + Note that AppDomains may be loaded and unloaded within the + same process without the process terminating and therefore + without the process start time being reset. + + + + + + Gets the UTC time when the current process started. + + + This is the UTC time when this process started. + + + + Tries to get the start time for the current process. + Failing that it returns the time of the first call to + this property. + + + Note that AppDomains may be loaded and unloaded within the + same process without the process terminating and therefore + without the process start time being reset. + + + + + + Gets the of the logging event. + A null level produces varying results depending on the appenders in use. + In many cases it is equivalent of , other times + it is mapped to Debug or Info defaults. + + + + + Gets the time of the logging event. + + + The time of the logging event. + + + + The TimeStamp is stored in UTC and converted to the local time zone for this computer. + + + + + + Gets UTC the time of the logging event. + + + The UTC time of the logging event. + + + + + Gets the name of the logger that logged the event. + + + + + Gets the location information for this logging event. + + + + The collected information is cached for future use. + + + See the class for more information on + supported frameworks and the different behavior in Debug and + Release builds. + + + + + + Gets the message object used to initialize this event. + + + The message object used to initialize this event. + + + + Gets the message object used to initialize this event. + Note that this event may not have a valid message object. + If the event is serialized the message object will not + be transferred. To get the text of the message the + property must be used + not this property. + + + If there is no defined message object for this event then + null will be returned. + + + + + + Gets the exception object used to initialize this event. + + + The exception object used to initialize this event. + + + + Gets the exception object used to initialize this event. + Note that this event may not have a valid exception object. + If the event is serialized the exception object will not + be transferred. To get the text of the exception the + method must be used + not this property. + + + If there is no defined exception object for this event then + null will be returned. + + + + + + The that this event was created in. + + + + The that this event was created in. + + + + + + Ensure that the repository is set. + + the value for the repository + + + + Gets the message, rendered through the . + + + The message rendered through the . + + + + The collected information is cached for future use. + + + + + + Write the rendered message to a TextWriter + + the writer to write the message to + + + Unlike the property this method + does store the message data in the internal cache. Therefore + if called only once this method should be faster than the + property, however if the message is + to be accessed multiple times then the property will be more efficient. + + + + + + Gets the name of the current thread. + + + The name of the current thread, or the thread ID when + the name is not available. + + + + The collected information is cached for future use. + + + + + + Returns a 'meaningful' name for the thread (or its Id) + + Name + Meaningful name + + + + Gets the name of the current user. + + + The name of the current user, or NOT AVAILABLE when the + underlying runtime has no support for retrieving the name of the + current user. + + + + Calls WindowsIdentity.GetCurrent().Name to get the name of + the current windows user. + + + To improve performance, we could cache the string representation of + the name, and reuse that as long as the identity stayed constant. + Once the identity changed, we would need to re-assign and re-render + the string. + + + However, the WindowsIdentity.GetCurrent() call seems to + return different objects every time, so the current implementation + doesn't do this type of caching. + + + Timing for these operations: + + + + Method + Results + + + WindowsIdentity.GetCurrent() + 10000 loops, 00:00:00.2031250 seconds + + + WindowsIdentity.GetCurrent().Name + 10000 loops, 00:00:08.0468750 seconds + + + + This means we could speed things up almost 40 times by caching the + value of the WindowsIdentity.GetCurrent().Name property, since + this takes (8.04-0.20) = 7.84375 seconds. + + + + + + Gets the identity of the current thread principal. + + + + Calls System.Threading.Thread.CurrentPrincipal.Identity.Name to get + the name of the current thread principal. + + + + + + Gets the AppDomain friendly name. + + + + + Additional event specific properties. + + + Additional event specific properties. + + + + A logger or an appender may attach additional + properties to specific events. These properties + have a string key and an object value. + + + This property is for events that have been added directly to + this event. The aggregate properties (which include these + event properties) can be retrieved using + and . + + + Once the properties have been fixed this property + returns the combined cached properties. This ensures that updates to + this property are always reflected in the underlying storage. When + returning the combined properties there may be more keys in the + Dictionary than expected. + + + + + + Gets the fixed fields in this event, or on set, fixes fields specified in the value. + + + + Fields will not be fixed if they have previously been fixed. + It is not possible to 'unfix' a field. + + + + + + Serializes this object into the provided. + + The to populate with data. + The destination for this serialization. + + + The data in this event must be fixed before it can be serialized. + + + The property must be set during the + method call if this event + is to be used outside that method. + + + + + + Gets the portable data for this . + + The for this event. + + + A new can be constructed using a + instance. + + + Does a fix of the data + in the logging event before returning the event data. + + + + + + Gets the portable data for this . + + The set of data to ensure is fixed in the LoggingEventData + The for this event. + + + A new can be constructed using a + instance. + + + + + + Returns this event's exception's rendered using the + . + + + This event's exception's rendered using the . + + + + Returns this event's exception's rendered using the + . + + + + + + Fix the fields specified by the parameter + + the fields to fix + + + Only fields specified in the will be fixed. + Fields will not be fixed if they have previously been fixed. + It is not possible to 'unfix' a field. + + + + + + Looks up a composite property in this event + + the key for the property to lookup + the value for the property + + + This event has composite properties that combine properties from + several different contexts in the following order: + + + this event's properties + + This event has that can be set. These + properties are specific to this event only. + + + + the thread properties + + The that are set on the current + thread. These properties are shared by all events logged on this thread. + + + + the global properties + + The that are set globally. These + properties are shared by all the threads in the AppDomain. + + + + + + + + + Get all the composite properties in this event + + the containing all the properties + + + See for details of the composite properties + stored by the event. + + + This method returns a single containing all the + properties defined for this event. + + + + + + The internal logging event data. + + + + + Location information for the caller. + + + + + The internal logging event data. + + + + + The internal logging event data. + + + + + The fully qualified Type of the calling + logger class in the stack frame (i.e. the declaring type of the method). + + + + + The fix state for this event + + + These flags indicate which fields have been fixed. + Not serialized. + + + + + Indicated that the internal cache is updateable (ie not fixed) + + + This is a separate flag to fixFlags as it allows incremental fixing and simpler + changes in the caching strategy. + + + + + The key into the Properties map for the host name value. + + + + + The key into the Properties map for the thread identity value. + + + + + The key into the Properties map for the user name value. + + + + + Implementation of wrapper interface. + + + + This implementation of the interface + forwards to the held by the base class. + + + This logger has methods to allow the caller to log at the following + levels: + + + + DEBUG + + The and methods log messages + at the DEBUG level. That is the level with that name defined in the + repositories . The default value + for this level is . The + property tests if this level is enabled for logging. + + + + INFO + + The and methods log messages + at the INFO level. That is the level with that name defined in the + repositories . The default value + for this level is . The + property tests if this level is enabled for logging. + + + + WARN + + The and methods log messages + at the WARN level. That is the level with that name defined in the + repositories . The default value + for this level is . The + property tests if this level is enabled for logging. + + + + ERROR + + The and methods log messages + at the ERROR level. That is the level with that name defined in the + repositories . The default value + for this level is . The + property tests if this level is enabled for logging. + + + + FATAL + + The and methods log messages + at the FATAL level. That is the level with that name defined in the + repositories . The default value + for this level is . The + property tests if this level is enabled for logging. + + + + + The values for these levels and their semantic meanings can be changed by + configuring the for the repository. + + + Nicko Cadell + Gert Driesen + + + + Construct a new wrapper for the specified logger. + + The logger to wrap. + + + Construct a new wrapper for the specified logger. + + + + + + Virtual method called when the configuration of the repository changes + + the repository holding the levels + + + Virtual method called when the configuration of the repository changes + + + + + + Logs a message object with the DEBUG level. + + The message object to log. + + + This method first checks if this logger is DEBUG + enabled by comparing the level of this logger with the + DEBUG level. If this logger is + DEBUG enabled, then it converts the message object + (passed as parameter) to a string by invoking the appropriate + . It then + proceeds to call all the registered appenders in this logger + and also higher in the hierarchy depending on the value of the + additivity flag. + + + WARNING Note that passing an + to this method will print the name of the + but no stack trace. To print a stack trace use the + form instead. + + + + + + Logs a message object with the DEBUG level + + The message object to log. + The exception to log, including its stack trace. + + + Logs a message object with the DEBUG level including + the stack trace of the passed + as a parameter. + + + See the form for more detailed information. + + + + + + + Logs a formatted message string with the DEBUG level. + + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the DEBUG level. + + A String containing zero or more format items + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the DEBUG level. + + A String containing zero or more format items + An Object to format + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the DEBUG level. + + A String containing zero or more format items + An Object to format + An Object to format + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the DEBUG level. + + An that supplies culture-specific formatting information + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a message object with the INFO level. + + The message object to log. + + + This method first checks if this logger is INFO + enabled by comparing the level of this logger with the + INFO level. If this logger is + INFO enabled, then it converts the message object + (passed as parameter) to a string by invoking the appropriate + . It then + proceeds to call all the registered appenders in this logger + and also higher in the hierarchy depending on the value of + the additivity flag. + + + WARNING Note that passing an + to this method will print the name of the + but no stack trace. To print a stack trace use the + form instead. + + + + + + Logs a message object with the INFO level. + + The message object to log. + The exception to log, including its stack trace. + + + Logs a message object with the INFO level including + the stack trace of the + passed as a parameter. + + + See the form for more detailed information. + + + + + + + Logs a formatted message string with the INFO level. + + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the INFO level. + + A String containing zero or more format items + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the INFO level. + + A String containing zero or more format items + An Object to format + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the INFO level. + + A String containing zero or more format items + An Object to format + An Object to format + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the INFO level. + + An that supplies culture-specific formatting information + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a message object with the WARN level. + + the message object to log + + + This method first checks if this logger is WARN + enabled by comparing the level of this logger with the + WARN level. If this logger is + WARN enabled, then it converts the message object + (passed as parameter) to a string by invoking the appropriate + . It then + proceeds to call all the registered appenders in this logger and + also higher in the hierarchy depending on the value of the + additivity flag. + + + WARNING Note that passing an to this + method will print the name of the but no + stack trace. To print a stack trace use the + form instead. + + + + + + Logs a message object with the WARN level + + The message object to log. + The exception to log, including its stack trace. + + + Logs a message object with the WARN level including + the stack trace of the + passed as a parameter. + + + See the form for more detailed information. + + + + + + + Logs a formatted message string with the WARN level. + + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the WARN level. + + A String containing zero or more format items + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the WARN level. + + A String containing zero or more format items + An Object to format + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the WARN level. + + A String containing zero or more format items + An Object to format + An Object to format + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the WARN level. + + An that supplies culture-specific formatting information + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a message object with the ERROR level. + + The message object to log. + + + This method first checks if this logger is ERROR + enabled by comparing the level of this logger with the + ERROR level. If this logger is + ERROR enabled, then it converts the message object + (passed as parameter) to a string by invoking the appropriate + . It then + proceeds to call all the registered appenders in this logger and + also higher in the hierarchy depending on the value of the + additivity flag. + + + WARNING Note that passing an to this + method will print the name of the but no + stack trace. To print a stack trace use the + form instead. + + + + + + Logs a message object with the ERROR level + + The message object to log. + The exception to log, including its stack trace. + + + Logs a message object with the ERROR level including + the stack trace of the + passed as a parameter. + + + See the form for more detailed information. + + + + + + + Logs a formatted message string with the ERROR level. + + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the ERROR level. + + A String containing zero or more format items + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the ERROR level. + + A String containing zero or more format items + An Object to format + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the ERROR level. + + A String containing zero or more format items + An Object to format + An Object to format + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the ERROR level. + + An that supplies culture-specific formatting information + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a message object with the FATAL level. + + The message object to log. + + + This method first checks if this logger is FATAL + enabled by comparing the level of this logger with the + FATAL level. If this logger is + FATAL enabled, then it converts the message object + (passed as parameter) to a string by invoking the appropriate + . It then + proceeds to call all the registered appenders in this logger and + also higher in the hierarchy depending on the value of the + additivity flag. + + + WARNING Note that passing an to this + method will print the name of the but no + stack trace. To print a stack trace use the + form instead. + + + + + + Logs a message object with the FATAL level + + The message object to log. + The exception to log, including its stack trace. + + + Logs a message object with the FATAL level including + the stack trace of the + passed as a parameter. + + + See the form for more detailed information. + + + + + + + Logs a formatted message string with the FATAL level. + + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the FATAL level. + + A String containing zero or more format items + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the FATAL level. + + A String containing zero or more format items + An Object to format + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the FATAL level. + + A String containing zero or more format items + An Object to format + An Object to format + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the FATAL level. + + An that supplies culture-specific formatting information + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Checks if this logger is enabled for the DEBUG + level. + + + true if this logger is enabled for DEBUG events, + false otherwise. + + + + This function is intended to lessen the computational cost of + disabled log debug statements. + + + For some log Logger object, when you write: + + + log.Debug("This is entry number: " + i ); + + + You incur the cost constructing the message, concatenation in + this case, regardless of whether the message is logged or not. + + + If you are worried about speed, then you should write: + + + if (log.IsDebugEnabled()) + { + log.Debug("This is entry number: " + i ); + } + + + This way you will not incur the cost of parameter + construction if debugging is disabled for log. On + the other hand, if the log is debug enabled, you + will incur the cost of evaluating whether the logger is debug + enabled twice. Once in IsDebugEnabled and once in + the Debug. This is an insignificant overhead + since evaluating a logger takes about 1% of the time it + takes to actually log. + + + + + + Checks if this logger is enabled for the INFO level. + + + true if this logger is enabled for INFO events, + false otherwise. + + + + See for more information and examples + of using this method. + + + + + + + Checks if this logger is enabled for the WARN level. + + + true if this logger is enabled for WARN events, + false otherwise. + + + + See for more information and examples + of using this method. + + + + + + + Checks if this logger is enabled for the ERROR level. + + + true if this logger is enabled for ERROR events, + false otherwise. + + + + See for more information and examples of using this method. + + + + + + + Checks if this logger is enabled for the FATAL level. + + + true if this logger is enabled for FATAL events, + false otherwise. + + + + See for more information and examples of using this method. + + + + + + + Event handler for the event + + the repository + Empty + + + + The fully qualified name of this declaring type not the type of any subclass. + + + + + Used to ensure 'params object?[]?' arguments that receive a null are converted + to an array of one null value so that 'XxxFormat("{0}", null)' will work correctly. + Overloads like 'XxxFormat(message, object? arg0)' are not matched by the compiler in this case. + + + + + provides method information without actually referencing a System.Reflection.MethodBase + as that would require that the containing assembly is loaded. + + + + + + constructs a method item for an unknown method. + + + + + constructs a method item from the name of the method. + + + + + + constructs a method item from the name of the method and its parameters. + + + + + + + constructs a method item from a method base by determining the method name and its parameters. + + + + + + Gets the method name of the caller making the logging request. + + + + + Gets the method parameters of the caller making the logging request. + + + + + The fully qualified type of the StackFrameItem class. + + + Used by the internal logger to record the Type of the + log message. + + + + + When location information is not available the constant + NA is returned. Current value of this string + constant is ?. + + + + + A SecurityContext used by log4net when interacting with protected resources + + + + A SecurityContext used by log4net when interacting with protected resources + for example with operating system services. This can be used to impersonate + a principal that has been granted privileges on the system resources. + + + Nicko Cadell + + + + Impersonate this SecurityContext + + State supplied by the caller + An instance that will + revoke the impersonation of this SecurityContext, or null + + + Impersonate this security context. Further calls on the current + thread should now be made in the security context provided + by this object. When the result + method is called the security + context of the thread should be reverted to the state it was in + before was called. + + + + + + The providers default instances. + + + + A configured component that interacts with potentially protected system + resources uses a to provide the elevated + privileges required. If the object has + been not been explicitly provided to the component then the component + will request one from this . + + + By default the is + an instance of which returns only + objects. This is a reasonable default + where the privileges required are not know by the system. + + + This default behavior can be overridden by subclassing the + and overriding the method to return + the desired objects. The default provider + can be replaced by programmatically setting the value of the + property. + + + An alternative is to use the log4net.Config.SecurityContextProviderAttribute + This attribute can be applied to an assembly in the same way as the + log4net.Config.XmlConfiguratorAttribute". The attribute takes + the type to use as the as an argument. + + + Nicko Cadell + + + + The default provider + + + + + Gets or sets the default SecurityContextProvider + + + The default SecurityContextProvider + + + + The default provider is used by configured components that + require a and have not had one + given to them. + + + By default this is an instance of + that returns objects. + + + The default provider can be set programmatically by setting + the value of this property to a sub class of + that has the desired behavior. + + + + + + Protected default constructor to allow subclassing + + + + Protected default constructor to allow subclassing + + + + + + Create a SecurityContext for a consumer + + The consumer requesting the SecurityContext + An impersonation context + + + The default implementation is to return a . + + + Subclasses should override this method to provide their own + behavior. + + + + + + Provides stack frame information without actually referencing a System.Diagnostics.StackFrame + as that would require that the containing assembly is loaded. + + + + + Creates a stack frame item from a stack frame. + + + + + + Gets the fully qualified class name of the caller making the logging + request. + + + + + Gets the file name of the caller. + + + + + Gets the line number of the caller. + + + + + Gets the method name of the caller. + + + + + Gets all available caller information in the format + fully.qualified.classname.of.caller.methodName(Filename:line) + + + + + The fully qualified type of the StackFrameItem class. + + + Used by the internal logger to record the Type of the + log message. + + + + + When location information is not available the constant + NA is returned. Current value of this string + constant is ?. + + + + + An evaluator that triggers after specified number of seconds. + + + The time threshold in seconds to trigger after. + Zero means it won't trigger at all. + + + + This evaluator will trigger if the specified time period + has passed since last check. + + + Robert Sevcik + + + + An evaluator that triggers after specified number of seconds. + + + The time threshold in seconds to trigger after. + Zero means it won't trigger at all. + + + + This evaluator will trigger if the specified time period + has passed since last check. + + + Robert Sevcik + + + + The UTC time of last check. This gets updated when the object is created and when the evaluator triggers. + + + + + The default time threshold for triggering in seconds. Zero means it won't trigger at all. + + + + + Create a new evaluator using the time threshold in seconds. + + + + Create a new evaluator using the time threshold in seconds. + + + This evaluator will trigger if the specified time period + has passed since last check. + + + + + + The time threshold in seconds to trigger after + + + The time threshold in seconds to trigger after. + Zero means it won't trigger at all. + + + + This evaluator will trigger if the specified time period + has passed since last check. + + + + + + Is this the triggering event? + + The event to check + This method returns true, if the specified time period + has passed since last check.. + Otherwise it returns false + + + This evaluator will trigger if the specified time period + has passed since last check. + + + + + + Delegate used to handle creation of new wrappers. + + The logger to wrap in a wrapper. + + + Delegate used to handle creation of new wrappers. This delegate + is called from the + method to construct the wrapper for the specified logger. + + + The delegate to use is supplied to the + constructor. + + + + + + Maps between logger objects and wrapper objects. + + + + This class maintains a mapping between objects and + objects. Use the method to + look up the for the specified . + + + New wrapper instances are created by the + method. The default behavior is for this method to delegate construction + of the wrapper to the delegate supplied + to the constructor. This allows specialization of the behavior without + requiring subclassing of this type. + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the + + The handler to use to create the wrapper objects. + + + Initializes a new instance of the class with + the specified handler to create the wrapper objects. + + + + + + Gets the wrapper object for the specified logger. + + The wrapper object for the specified logger + + + If the logger is null then the corresponding wrapper is null. + + + Looks up the wrapper it has previously been requested and + returns it. If the wrapper has never been requested before then + the virtual method is + called. + + + + + + Gets the map of logger repositories. + + + Map of logger repositories. + + + + Gets the hashtable that is keyed on . The + values are hashtables keyed on with the + value being the corresponding . + + + + + + Creates the wrapper object for the specified logger. + + The logger to wrap in a wrapper. + The wrapper object for the logger. + + + This implementation uses the + passed to the constructor to create the wrapper. This method + can be overridden in a subclass. + + + + + + Called when a monitored repository shutdown event is received. + + The that is shutting down + + + This method is called when a that this + is holding loggers for has signaled its shutdown + event . The default + behavior of this method is to release the references to the loggers + and their wrappers generated for this repository. + + + + + + Event handler for repository shutdown event. + + The sender of the event. + The event args. + + + + The handler to use to create the extension wrapper objects. + + + + + Internal reference to the delegate used to register for repository shutdown events. + + + + + Formats a as "HH:mm:ss,fff". + + + + Formats a in the format "HH:mm:ss,fff" for example, "15:49:37,459". + + + Nicko Cadell + Gert Driesen + + + + Renders the date into a string. Format is "HH:mm:ss". + + The date to render into a string. + The string builder to write to. + + + Subclasses should override this method to render the date + into a string using a precision up to the second. This method + will be called at most once per second and the result will be + reused if it is needed again during the same second. + + + + + + Renders the date into a string. Format is "HH:mm:ss,fff". + + The date to render into a string. + The writer to write to. + + + Uses the method to generate the + time string up to the seconds and then appends the current + milliseconds. The results from are + cached and is called at most once + per second. + + + Subclasses should override + rather than . + + + + + + String constant used to specify AbsoluteTimeDateFormat in layouts. Current value is ABSOLUTE. + + + + + String constant used to specify DateTimeDateFormat in layouts. Current value is DATE. + + + + + String constant used to specify ISO8601DateFormat in layouts. Current value is ISO8601. + + + + + Last stored time with precision up to the second. + + + + + Last stored time with precision up to the second, formatted + as a string. + + + + + Formats a as "dd MMM yyyy HH:mm:ss,fff" + + + + Formats a in the format + "dd MMM yyyy HH:mm:ss,fff" for example, + "06 Nov 1994 15:49:37,459". + + + Nicko Cadell + Gert Driesen + Angelika Schnagl + + + + Formats the date without the milliseconds part + + The date to format. + The string builder to write to. + + + Formats a DateTime in the format "dd MMM yyyy HH:mm:ss" + for example, "06 Nov 1994 15:49:37". + + + The base class will append the ",fff" milliseconds section. + This method will only be called at most once per second. + + + + + + Render a as a string. + + + + Interface to abstract the rendering of a + instance into a string. + + + The method is used to render the + date to a text writer. + + + Nicko Cadell + Gert Driesen + + + + Formats the specified date as a string. + + The date to format. + The writer to write to. + + + Format the as a string and write it + to the provided. + + + + + + Formats the as "yyyy-MM-dd HH:mm:ss,fff". + + + + Formats the specified as a string: "yyyy-MM-dd HH:mm:ss,fff". + + + Nicko Cadell + Gert Driesen + + + + Formats the date without the milliseconds part + + The date to format. + The string builder to write to. + + + Formats the date specified as a string: "yyyy-MM-dd HH:mm:ss". + + + The base class will append the ",fff" milliseconds section. + This method will only be called at most once per second. + + + + + + Formats the using the method. + + + + Formats the using the method. + + + Nicko Cadell + Gert Driesen + The format string. + + + + Formats the using the method. + + + + Formats the using the method. + + + Nicko Cadell + Gert Driesen + The format string. + + + + Formats the date using . + + The date to convert to a string. + The writer to write to. + + + Uses the date format string supplied to the constructor to call + the method to format the date. + + + + + + This filter drops all . + + + + You can add this filter to the end of a filter chain to + switch from the default "accept all unless instructed otherwise" + filtering behavior to a "deny all unless instructed otherwise" + behavior. + + + Nicko Cadell + Gert Driesen + + + + Always returns . + + the LoggingEvent to filter + Always returns + + + Ignores the event being logged and just returns + . This can be used to change the default filter + chain behavior from to . This filter + should only be used as the last filter in the chain + as any further filters will be ignored! + + + + + + The return result from + + + + The return result from + + + + + + The log event must be dropped immediately without + consulting with the remaining filters, if any, in the chain. + + + + + This filter is neutral with respect to the log event. + The remaining filters, if any, should be consulted for a final decision. + + + + + The log event must be logged immediately without + consulting with the remaining filters, if any, in the chain. + + + + + Subclass this type to implement customized logging event filtering + + + + Users should extend this class to implement customized logging + event filtering. Note that and + , the parent class of all standard + appenders, have built-in filtering rules. It is suggested that you + first use and understand the built-in rules before rushing to write + your own custom filters. + + + This abstract class assumes and also imposes that filters be + organized in a linear chain. The + method of each filter is called sequentially, in the order of their + addition to the chain. + + + The method must return one + of the integer constants , + or . + + + If the value is returned, then the log event is dropped + immediately without consulting with the remaining filters. + + + If the value is returned, then the next filter + in the chain is consulted. If there are no more filters in the + chain, then the log event is logged. Thus, in the presence of no + filters, the default behavior is to log all logging events. + + + If the value is returned, then the log + event is logged without consulting the remaining filters. + + + The philosophy of log4net filters is largely inspired from the + Linux ipchains. + + + Nicko Cadell + Gert Driesen + + + + Initialize the filter with the options set + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + Typically filter's options become active immediately on set, + however this method must still be called. + + + + + + Decide if the should be logged through an appender. + + The to decide upon + The decision of the filter + + + If the decision is , then the event will be + dropped. If the decision is , then the next + filter, if any, will be invoked. If the decision is then + the event will be logged without consulting with other filters in + the chain. + + + This method is marked abstract and must be implemented + in a subclass. + + + + + + Gets or sets the next filter in the filter chain. + + + + Filters are typically composed into chains. This property allows the next filter in + the chain to be accessed. + + + + + + Implement this interface to provide customized logging event filtering + + + + Users should implement this interface to implement customized logging + event filtering. Note that and + , the parent class of all standard + appenders, have built-in filtering rules. It is suggested that you + first use and understand the built-in rules before rushing to write + your own custom filters. + + + This abstract class assumes and also imposes that filters be + organized in a linear chain. The + method of each filter is called sequentially, in the order of their + addition to the chain. + + + The method must return one + of the integer constants , + or . + + + If the value is returned, then the log event is dropped + immediately without consulting with the remaining filters. + + + If the value is returned, then the next filter + in the chain is consulted. If there are no more filters in the + chain, then the log event is logged. Thus, in the presence of no + filters, the default behavior is to log all logging events. + + + If the value is returned, then the log + event is logged without consulting the remaining filters. + + + The philosophy of log4net filters is largely inspired from the + Linux ipchains. + + + Nicko Cadell + Gert Driesen + + + + Decide if the logging event should be logged through an appender. + + The LoggingEvent to decide upon + The decision of the filter + + + If the decision is , then the event will be + dropped. If the decision is , then the next + filter, if any, will be invoked. If the decision is then + the event will be logged without consulting with other filters in + the chain. + + + + + + Gets or sets the next filter in the chain. + + + + Filters are typically composed into chains. This property allows the next filter in + the chain to be accessed. + + + + + + This is a very simple filter based on matching. + + + + The filter admits two options and + . If there is an exact match between the value + of the option and the of the + , then the method returns in + case the option value is set + to true, if it is false then + is returned. If the does not match then + the result will be . + + + Nicko Cadell + Gert Driesen + + + + when matching + + + + The property is a flag that determines + the behavior when a matching is found. If the + flag is set to true then the filter will the + logging event, otherwise it will the event. + + + The default is true i.e. to the event. + + + + + + The that the filter will match + + + + The level that this filter will attempt to match against the + level. If a match is found then + the result depends on the value of . + + + + + + Tests if the of the logging event matches that of the filter + + the event to filter + see remarks + + + If the of the event matches the level of the + filter then the result of the function depends on the + value of . If it is true then + the function will return , it it is false then it + will return . If the does not match then + the result will be . + + + + + + This is a simple filter based on matching. + + + + The filter admits three options and + that determine the range of priorities that are matched, and + . If there is a match between the range + of priorities and the of the , then the + method returns in case the + option value is set to true, if it is false + then is returned. If there is no match, is returned. + + + Nicko Cadell + Gert Driesen + + + + when matching and + + + + The property is a flag that determines + the behavior when a matching is found. If the + flag is set to true then the filter will the + logging event, otherwise it will the event. + + + The default is true i.e. to the event. + + + + + + Set the minimum matched + + + + The minimum level that this filter will attempt to match against the + level. If a match is found then + the result depends on the value of . + + + + + + Sets the maximum matched + + + + The maximum level that this filter will attempt to match against the + level. If a match is found then + the result depends on the value of . + + + + + + Check if the event should be logged. + + the logging event to check + see remarks + + + If the of the logging event is outside the range + matched by this filter then + is returned. If the is matched then the value of + is checked. If it is true then + is returned, otherwise + is returned. + + + + + + Simple filter to match a string in the event's logger name. + + + + The works very similar to the . It admits two + options and . If the + of the starts + with the value of the option, then the + method returns in + case the option value is set to true, + if it is false then is returned. + + + Daniel Cazzulino + + + + when matching + + + + The property is a flag that determines + the behavior when a matching is found. If the + flag is set to true then the filter will the + logging event, otherwise it will the event. + + + The default is true i.e. to the event. + + + + + + The that the filter will match + + + + This filter will attempt to match this value against logger name in + the following way. The match will be done against the beginning of the + logger name (using ). The match is + case sensitive. If a match is found then + the result depends on the value of . + + + + + + Check if this filter should allow the event to be logged + + the event being logged + see remarks + + + The rendered message is matched against the . + If the equals the beginning of + the incoming () + then a match will have occurred. If no match occurs + this function will return + allowing other filters to check the event. If a match occurs then + the value of is checked. If it is + true then is returned otherwise + is returned. + + + + + + Simple filter to match a keyed string in the + + + + Simple filter to match a keyed string in the + + + As the MDC has been replaced with layered properties the + should be used instead. + + + Nicko Cadell + Gert Driesen + + + + Simple filter to match a string in the + + + + Simple filter to match a string in the + + + As the NDC has been replaced with named stacks stored in the + properties collections the should + be used instead. + + + Nicko Cadell + Gert Driesen + + + + Default constructor + + + + Sets the to "NDC". + + + + + + Simple filter to match a string an event property + + + + Simple filter to match a string in the value for a + specific event property + + + Nicko Cadell + + + + The key to lookup in the event properties and then match against. + + + + The key name to use to lookup in the properties map of the + . The match will be performed against + the value of this property if it exists. + + + + + + Check if this filter should allow the event to be logged + + the event being logged + see remarks + + + The event property for the is matched against + the . + If the occurs as a substring within + the property value then a match will have occurred. If no match occurs + this function will return + allowing other filters to check the event. If a match occurs then + the value of is checked. If it is + true then is returned otherwise + is returned. + + + + + + Simple filter to match a string in the rendered message. + + Nicko Cadell + Gert Driesen + + + + A regex object to match (generated from m_stringRegexToMatch) + + + + + Initialize and precompile the Regex if required + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + when matching or + + + + The property is a flag that determines + the behavior when a matching is found. If the + flag is set to true then the filter will the + logging event, otherwise it will the event. + + + The default is true i.e. to the event. + + + + + + Sets the static string to match + + + + The string that will be substring matched against + the rendered message. If the message contains this + string then the filter will match. If a match is found then + the result depends on the value of . + + + One of or + must be specified. + + + + + + Sets the regular expression to match + + + + The regular expression pattern that will be matched against + the rendered message. If the message matches this + pattern then the filter will match. If a match is found then + the result depends on the value of . + + + One of or + must be specified. + + + + + + Check if this filter should allow the event to be logged + + the event being logged + see remarks + + + The rendered message is matched against the . + If the occurs as a substring within + the message then a match will have occurred. If no match occurs + this function will return + allowing other filters to check the event. If a match occurs then + the value of is checked. If it is + true then is returned otherwise + is returned. + + + + + + The log4net Global Context. + + + + The GlobalContext provides a location for global debugging + information to be stored. + + + The global context has a properties map and these properties can + be included in the output of log messages. The + supports selecting and outputing these properties. + + + By default the log4net:HostName property is set to the name of + the current machine. + + + + + GlobalContext.Properties["hostname"] = Environment.MachineName; + + + + Nicko Cadell + + + + The global properties map. + + + + + The ILog interface is use by application to log messages into + the log4net framework. + + + + Use the to obtain logger instances + that implement this interface. The + static method is used to get logger instances. + + + This class contains methods for logging at different levels and also + has properties for determining if those logging levels are + enabled in the current configuration. + + + This interface can be implemented in different ways. This documentation + specifies reasonable behavior that a caller can expect from the actual + implementation, however different implementations reserve the right to + do things differently. + + + Simple example of logging messages + + ILog log = LogManager.GetLogger("application-log"); + + log.Info("Application Start"); + log.Debug("This is a debug message"); + + if (log.IsDebugEnabled) + { + log.Debug("This is another debug message"); + } + + + + + Nicko Cadell + Gert Driesen + + + Log a message object with the level. + + Logs a message object with the level. + + The message object to log. + + + This method first checks if this logger is DEBUG + enabled by comparing the level of this logger with the + level. If this logger is + DEBUG enabled, then it converts the message object + (passed as parameter) to a string by invoking the appropriate + . It then + proceeds to call all the registered appenders in this logger + and also higher in the hierarchy depending on the value of + the additivity flag. + + WARNING Note that passing an + to this method will print the name of the + but no stack trace. To print a stack trace use the + form instead. + + + + + + + + Log a message object with the level including + the stack trace of the passed + as a parameter. + + The message object to log. + The exception to log, including its stack trace. + + + See the form for more detailed information. + + + + + + + Log a formatted string with the level. + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + An that supplies culture-specific formatting information + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + Log a message object with the level. + + Logs a message object with the level. + + + + This method first checks if this logger is INFO + enabled by comparing the level of this logger with the + level. If this logger is + INFO enabled, then it converts the message object + (passed as parameter) to a string by invoking the appropriate + . It then + proceeds to call all the registered appenders in this logger + and also higher in the hierarchy depending on the value of the + additivity flag. + + WARNING Note that passing an + to this method will print the name of the + but no stack trace. To print a stack trace use the + form instead. + + + The message object to log. + + + + + + Logs a message object with the INFO level including + the stack trace of the passed + as a parameter. + + The message object to log. + The exception to log, including its stack trace. + + + See the form for more detailed information. + + + + + + + Log a formatted message string with the level. + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + An that supplies culture-specific formatting information + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + Log a message object with the level. + + Log a message object with the level. + + + + This method first checks if this logger is WARN + enabled by comparing the level of this logger with the + level. If this logger is + WARN enabled, then it converts the message object + (passed as parameter) to a string by invoking the appropriate + . It then + proceeds to call all the registered appenders in this logger + and also higher in the hierarchy depending on the value of the + additivity flag. + + WARNING Note that passing an + to this method will print the name of the + but no stack trace. To print a stack trace use the + form instead. + + + The message object to log. + + + + + + Log a message object with the level including + the stack trace of the passed + as a parameter. + + The message object to log. + The exception to log, including its stack trace. + + + See the form for more detailed information. + + + + + + + Log a formatted message string with the level. + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + An that supplies culture-specific formatting information + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + Log a message object with the level. + + Logs a message object with the level. + + The message object to log. + + + This method first checks if this logger is ERROR + enabled by comparing the level of this logger with the + level. If this logger is + ERROR enabled, then it converts the message object + (passed as parameter) to a string by invoking the appropriate + . It then + proceeds to call all the registered appenders in this logger + and also higher in the hierarchy depending on the value of the + additivity flag. + + WARNING Note that passing an + to this method will print the name of the + but no stack trace. To print a stack trace use the + form instead. + + + + + + + + Log a message object with the level including + the stack trace of the passed + as a parameter. + + The message object to log. + The exception to log, including its stack trace. + + + See the form for more detailed information. + + + + + + + Log a formatted message string with the level. + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + An that supplies culture-specific formatting information + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + Log a message object with the level. + + Log a message object with the level. + + + + This method first checks if this logger is FATAL + enabled by comparing the level of this logger with the + level. If this logger is + FATAL enabled, then it converts the message object + (passed as parameter) to a string by invoking the appropriate + . It then + proceeds to call all the registered appenders in this logger + and also higher in the hierarchy depending on the value of the + additivity flag. + + WARNING Note that passing an + to this method will print the name of the + but no stack trace. To print a stack trace use the + form instead. + + + The message object to log. + + + + + + Log a message object with the level including + the stack trace of the passed + as a parameter. + + The message object to log. + The exception to log, including its stack trace. + + + See the form for more detailed information. + + + + + + + Log a formatted message string with the level. + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + An that supplies culture-specific formatting information + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Checks if this logger is enabled for the level. + + + true if this logger is enabled for events, false otherwise. + + + + This function is intended to lessen the computational cost of + disabled log debug statements. + + For some ILog interface log, when you write: + + log.Debug("This is entry number: " + i ); + + + You incur the cost constructing the message, string construction and concatenation in + this case, regardless of whether the message is logged or not. + + + If you are worried about speed (who isn't), then you should write: + + + if (log.IsDebugEnabled) + { + log.Debug("This is entry number: " + i ); + } + + + This way you will not incur the cost of parameter + construction if debugging is disabled for log. On + the other hand, if the log is debug enabled, you + will incur the cost of evaluating whether the logger is debug + enabled twice. Once in and once in + the . This is an insignificant overhead + since evaluating a logger takes about 1% of the time it + takes to actually log. This is the preferred style of logging. + + Alternatively if your logger is available statically then the is debug + enabled state can be stored in a static variable like this: + + + private static readonly bool isDebugEnabled = log.IsDebugEnabled; + + + Then when you come to log you can write: + + + if (isDebugEnabled) + { + log.Debug("This is entry number: " + i ); + } + + + This way the debug enabled state is only queried once + when the class is loaded. Using a private static readonly + variable is the most efficient because it is a run time constant + and can be heavily optimized by the JIT compiler. + + + Of course if you use a static readonly variable to + hold the enabled state of the logger then you cannot + change the enabled state at runtime to vary the logging + that is produced. You have to decide if you need absolute + speed or runtime flexibility. + + + + + + + + Checks if this logger is enabled for the level. + + + true if this logger is enabled for events, false otherwise. + + + For more information see . + + + + + + + + Checks if this logger is enabled for the level. + + + true if this logger is enabled for events, false otherwise. + + + For more information see . + + + + + + + + Checks if this logger is enabled for the level. + + + true if this logger is enabled for events, false otherwise. + + + For more information see . + + + + + + + + Checks if this logger is enabled for the level. + + + true if this logger is enabled for events, false otherwise. + + + For more information see . + + + + + + + + A flexible layout configurable with pattern string that re-evaluates on each call. + + + This class is built on and provides all the + features and capabilities of PatternLayout. PatternLayout is a 'static' class + in that its layout is done once at configuration time. This class will recreate + the layout on each reference. + One important difference between PatternLayout and DynamicPatternLayout is the + treatment of the Header and Footer parameters in the configuration. The Header and Footer + parameters for DynamicPatternLayout must be syntactically in the form of a PatternString, + but should not be marked as type log4net.Util.PatternString. Doing so causes the + pattern to be statically converted at configuration time and causes DynamicPatternLayout + to perform the same as PatternLayout. + Please see for complete documentation. + + <layout type="log4net.Layout.DynamicPatternLayout"> + <param name="Header" value="%newline**** Trace Opened Local: %date{yyyy-MM-dd HH:mm:ss.fff} UTC: %utcdate{yyyy-MM-dd HH:mm:ss.fff} ****%newline" /> + <param name="Footer" value="**** Trace Closed %date{yyyy-MM-dd HH:mm:ss.fff} ****%newline" /> + </layout> + + + + + + The header PatternString + + + + + The footer PatternString + + + + + Constructs a DynamicPatternLayout using the DefaultConversionPattern + + + + The default pattern just produces the application supplied message. + + + + + + Constructs a DynamicPatternLayout using the supplied conversion pattern. + + The pattern to use. + + + + Gets or sets the header for the layout format. + + the layout header + + + The Header text will be appended before any logging events + are formatted and appended. + + The pattern will be formatted on each get operation. + + + + + Gets or sets the footer for the layout format. + + the layout footer + + + The Footer text will be appended after all the logging events + have been formatted and appended. + + The pattern will be formatted on each get operation. + + + + + A Layout that renders only the Exception text from the logging event + + + + This Layout should only be used with appenders that utilize multiple + layouts (e.g. ). + + + Nicko Cadell + Gert Driesen + + + + Constructs an ExceptionLayout. + + + + + Activates component options. + + + + Part of the component activation + framework. + + + This method does nothing as options become effective immediately. + + + + + + Gets the exception text from the logging event + + The TextWriter to write the formatted event to + the event being logged + + + Write the exception string to the . + The exception string is retrieved from . + + + + + + Interface implemented by layout objects + + + + An object is used to format a + as text. The method is called by an + appender to transform the into a string. + + + The layout can also supply and + text that is appender before any events and after all the events respectively. + + + Nicko Cadell + Gert Driesen + + + + Implement this method to create your own layout format. + + The TextWriter to write the formatted event to + The event to format + + + This method is called by an appender to format + the as text and output to a writer. + + + If the caller does not have a and prefers the + event to be formatted as a then the following + code can be used to format the event into a . + + + StringWriter writer = new StringWriter(); + Layout.Format(writer, loggingEvent); + string formattedEvent = writer.ToString(); + + + + + + The content type output by this layout. + + The content type + + + The content type output by this layout. + + + This is a MIME type e.g. "text/plain". + + + + + + The header for the layout format. + + the layout header + + + The Header text will be appended before any logging events + are formatted and appended. + + + + + + The footer for the layout format. + + the layout footer + + + The Footer text will be appended after all the logging events + have been formatted and appended. + + + + + + Flag indicating if this layout handle exceptions + + false if this layout handles exceptions + + + If this layout handles the exception object contained within + , then the layout should return + false. Otherwise, if the layout ignores the exception + object, then the layout should return true. + + + + + + Extensions for + + Jan Friedrich + + + + writes the specified start tag and associates it with the given namespace and prefix + + Writer + The full name of the element + The namespace prefix of the element + The local name of the element + The namespace URI to associate with the element + + + + Creates an XmlWriter + + TextWriter + XmlWriter + + + + Interface for raw layout objects + + + + Interface used to format a + to an object. + + + This interface should not be confused with the + interface. This interface is used in + only certain specialized situations where a raw object is + required rather than a formatted string. The + is not generally useful than this interface. + + + Nicko Cadell + Gert Driesen + + + + Implement this method to create your own layout format. + + The event to format + returns the formatted event + + + Implement this method to create your own layout format. + + + + + + Adapts any to a + + + + Where an is required this adapter + allows a to be specified. + + + Nicko Cadell + Gert Driesen + + + + The layout to adapt + + + + + Construct a new adapter + + the layout to adapt + + + Create the adapter for the specified . + + + + + + Formats the logging event as an object. + + The event to format + returns the formatted event + + + Uses the object supplied to + the constructor to perform the formatting. + + + + + + Extend this abstract class to create your own log layout format. + + + + This is the base implementation of the + interface. Most layout objects should extend this class. + + + + + + Subclasses must implement the + method. + + + Subclasses should set the in their default + constructor. + + + + Nicko Cadell + Gert Driesen + + + + Empty default constructor + + + + Empty default constructor + + + + + + Activate component options + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + This method must be implemented by the subclass. + + + + + + Implement this method to create your own layout format. + + The TextWriter to write the formatted event to + The event to format + + + This method is called by an appender to format + the as text. + + + + + + Convenience method for easily formatting the logging event into a string variable. + + + + Creates a new StringWriter instance to store the formatted logging event. + + + + + The content type output by this layout. + + The content type is "text/plain" + + + The content type output by this layout. + + + This base class uses the value "text/plain". + To change this value a subclass must override this + property. + + + + + + The header for the layout format. + + the layout header + + + The Header text will be appended before any logging events + are formatted and appended. + + + + + + The footer for the layout format. + + the layout footer + + + The Footer text will be appended after all the logging events + have been formatted and appended. + + + + + + Flag indicating if this layout handles exceptions. + + false if this layout handles exceptions + + + If this layout handles the exception object contained within + , then the layout should return + false. Otherwise, if the layout ignores the exception + object, then the layout should return true. + + + Set this value to override the default setting. The default + value is true, this layout does not handle the exception. + + + + + + A flexible layout configurable with pattern string. + + + + The goal of this class is to a + as a string. The results + depend on the conversion pattern. + + + The conversion pattern is closely related to the conversion + pattern of the printf function in C. A conversion pattern is + composed of literal text and format control expressions called + conversion specifiers. + + + You are free to insert any literal text within the conversion + pattern. + + + Each conversion specifier starts with a percent sign (%) and is + followed by optional format modifiers and a conversion + pattern name. The conversion pattern name specifies the type of + data, e.g. logger, level, date, thread name. The format + modifiers control such things as field width, padding, left and + right justification. The following is a simple example. + + + Let the conversion pattern be "%-5level [%thread]: %message%newline" and assume + that the log4net environment was set to use a PatternLayout. Then the + statements + + + ILog log = LogManager.GetLogger(typeof(TestApp)); + log.Debug("Message 1"); + log.Warn("Message 2"); + + would yield the output + + DEBUG [main]: Message 1 + WARN [main]: Message 2 + + + Note that there is no explicit separator between text and + conversion specifiers. The pattern parser knows when it has reached + the end of a conversion specifier when it reads a conversion + character. In the example above the conversion specifier + %-5level means the level of the logging event should be left + justified to a width of five characters. + + + The recognized conversion pattern names are: + + + + Conversion Pattern Name + Effect + + + a + Equivalent to appdomain + + + appdomain + + Used to output the friendly name of the AppDomain where the + logging event was generated. + + + + aspnet-cache + + + Used to output all cache items in the case of %aspnet-cache or just one named item if used as %aspnet-cache{key} + + + This pattern is not available for Compact Framework or Client Profile assemblies. + + + + + aspnet-context + + + Used to output all context items in the case of %aspnet-context or just one named item if used as %aspnet-context{key} + + + This pattern is not available for Compact Framework or Client Profile assemblies. + + + + + aspnet-request + + + Used to output all request parameters in the case of %aspnet-request or just one named param if used as %aspnet-request{key} + + + This pattern is not available for Compact Framework or Client Profile assemblies. + + + + + aspnet-session + + + Used to output all session items in the case of %aspnet-session or just one named item if used as %aspnet-session{key} + + + This pattern is not available for Compact Framework or Client Profile assemblies. + + + + + c + Equivalent to logger + + + C + Equivalent to type + + + class + Equivalent to type + + + d + Equivalent to date + + + date + + + Used to output the date of the logging event in the local time zone. + To output the date in universal time use the %utcdate pattern. + The date conversion + specifier may be followed by a date format specifier enclosed + between braces. For example, %date{HH:mm:ss,fff} or + %date{dd MMM yyyy HH:mm:ss,fff}. If no date format specifier is + given then ISO8601 format is + assumed (). + + + The date format specifier admits the same syntax as the + time pattern string of the . + + + For better results it is recommended to use the log4net date + formatters. These can be specified using one of the strings + "ABSOLUTE", "DATE" and "ISO8601" for specifying + , + and respectively + . For example, + %date{ISO8601} or %date{ABSOLUTE}. + + + These dedicated date formatters perform significantly + better than . + + + + + exception + + + Used to output the exception passed in with the log message. + + + If an exception object is stored in the logging event + it will be rendered into the pattern output with a + trailing newline. + If there is no exception then nothing will be output + and no trailing newline will be appended. + It is typical to put a newline before the exception + and to have the exception as the last data in the pattern. + + + + + F + Equivalent to file + + + file + + + Used to output the file name where the logging request was + issued. + + + WARNING Generating caller location information is + extremely slow. Its use should be avoided unless execution speed + is not an issue. + + + See the note below on the availability of caller location information. + + + + + identity + + + Used to output the user name for the currently active user + (Principal.Identity.Name). + + + WARNING Generating caller information is + extremely slow. Its use should be avoided unless execution speed + is not an issue. + + + + + l + Equivalent to location + + + L + Equivalent to line + + + location + + + Used to output location information of the caller which generated + the logging event. + + + The location information depends on the CLI implementation but + usually consists of the fully qualified name of the calling + method followed by the callers source the file name and line + number between parentheses. + + + The location information can be very useful. However, its + generation is extremely slow. Its use should be avoided + unless execution speed is not an issue. + + + See the note below on the availability of caller location information. + + + + + level + + + Used to output the level of the logging event. + + + + + line + + + Used to output the line number from where the logging request + was issued. + + + WARNING Generating caller location information is + extremely slow. Its use should be avoided unless execution speed + is not an issue. + + + See the note below on the availability of caller location information. + + + + + logger + + + Used to output the logger of the logging event. The + logger conversion specifier can be optionally followed by + precision specifier, that is a decimal constant in + brackets. + + + If a precision specifier is given, then only the corresponding + number of right most components of the logger name will be + printed. By default the logger name is printed in full. + + + For example, for the logger name "a.b.c" the pattern + %logger{2} will output "b.c". + + + + + m + Equivalent to message + + + M + Equivalent to method + + + message + + + Used to output the application supplied message associated with + the logging event. + + + + + mdc + + + The MDC (old name for the ThreadContext.Properties) is now part of the + combined event properties. This pattern is supported for compatibility + but is equivalent to property. + + + + + method + + + Used to output the method name where the logging request was + issued. + + + WARNING Generating caller location information is + extremely slow. Its use should be avoided unless execution speed + is not an issue. + + + See the note below on the availability of caller location information. + + + + + n + Equivalent to newline + + + newline + + + Outputs the platform dependent line separator character or + characters. + + + This conversion pattern offers the same performance as using + non-portable line separator strings such as "\n", or "\r\n". + Thus, it is the preferred way of specifying a line separator. + + + + + ndc + + + Used to output the NDC (nested diagnostic context) associated + with the thread that generated the logging event. + + + + + p + Equivalent to level + + + P + Equivalent to property + + + properties + Equivalent to property + + + property + + + Used to output the an event specific property. The key to + lookup must be specified within braces and directly following the + pattern specifier, e.g. %property{user} would include the value + from the property that is keyed by the string 'user'. Each property value + that is to be included in the log must be specified separately. + Properties are added to events by loggers or appenders. By default + the log4net:HostName property is set to the name of machine on + which the event was originally logged. + + + If no key is specified, e.g. %property then all the keys and their + values are printed in a comma separated list. + + + The properties of an event are combined from a number of different + contexts. These are listed below in the order in which they are searched. + + + + the event properties + + The event has that can be set. These + properties are specific to this event only. + + + + the thread properties + + The that are set on the current + thread. These properties are shared by all events logged on this thread. + + + + the global properties + + The that are set globally. These + properties are shared by all the threads in the AppDomain. + + + + + + + + r + Equivalent to timestamp + + + stacktrace + + + Used to output the stack trace of the logging event + The stack trace level specifier may be enclosed + between braces. For example, %stacktrace{level}. + If no stack trace level specifier is given then 1 is assumed + + + Output uses the format: + type3.MethodCall3 > type2.MethodCall2 > type1.MethodCall1 + + + This pattern is not available for Compact Framework assemblies. + + + + + stacktracedetail + + + Used to output the stack trace of the logging event + The stack trace level specifier may be enclosed + between braces. For example, %stacktracedetail{level}. + If no stack trace level specifier is given then 1 is assumed + + + Output uses the format: + type3.MethodCall3(type param,...) > type2.MethodCall2(type param,...) > type1.MethodCall1(type param,...) + + + This pattern is not available for Compact Framework assemblies. + + + + + t + Equivalent to thread + + + timestamp + + + Used to output the number of milliseconds elapsed since the start + of the application until the creation of the logging event. + + + + + thread + + + Used to output the name of the thread that generated the + logging event. Uses the thread number if no name is available. + + + + + type + + + Used to output the fully qualified type name of the caller + issuing the logging request. This conversion specifier + can be optionally followed by precision specifier, that + is a decimal constant in brackets. + + + If a precision specifier is given, then only the corresponding + number of right most components of the class name will be + printed. By default the class name is output in fully qualified form. + + + For example, for the class name "log4net.Layout.PatternLayout", the + pattern %type{1} will output "PatternLayout". + + + WARNING Generating the caller class information is + slow. Thus, its use should be avoided unless execution speed is + not an issue. + + + See the note below on the availability of caller location information. + + + + + u + Equivalent to identity + + + username + + + Used to output the WindowsIdentity for the currently + active user. + + + WARNING Generating caller WindowsIdentity information is + extremely slow. Its use should be avoided unless execution speed + is not an issue. + + + + + utcdate + + + Used to output the date of the logging event in universal time. + The date conversion + specifier may be followed by a date format specifier enclosed + between braces. For example, %utcdate{HH:mm:ss,fff} or + %utcdate{dd MMM yyyy HH:mm:ss,fff}. If no date format specifier is + given then ISO8601 format is + assumed (). + + + The date format specifier admits the same syntax as the + time pattern string of the . + + + For better results it is recommended to use the log4net date + formatters. These can be specified using one of the strings + "ABSOLUTE", "DATE" and "ISO8601" for specifying + , + and respectively + . For example, + %utcdate{ISO8601} or %utcdate{ABSOLUTE}. + + + These dedicated date formatters perform significantly + better than . + + + + + w + Equivalent to username + + + x + Equivalent to ndc + + + X + Equivalent to mdc + + + % + + + The sequence %% outputs a single percent sign. + + + + + + The single letter patterns are deprecated in favor of the + longer more descriptive pattern names. + + + By default the relevant information is output as is. However, + with the aid of format modifiers it is possible to change the + minimum field width, the maximum field width and justification. + + + The optional format modifier is placed between the percent sign + and the conversion pattern name. + + + The first optional format modifier is the left justification + flag which is just the minus (-) character. Then comes the + optional minimum field width modifier. This is a decimal + constant that represents the minimum number of characters to + output. If the data item requires fewer characters, it is padded on + either the left or the right until the minimum width is + reached. The default is to pad on the left (right justify) but you + can specify right padding with the left justification flag. The + padding character is space. If the data item is larger than the + minimum field width, the field is expanded to accommodate the + data. The value is never truncated. + + + This behavior can be changed using the maximum field + width modifier which is designated by a period followed by a + decimal constant. If the data item is longer than the maximum + field, then the extra characters are removed from the + beginning of the data item and not from the end. For + example, it the maximum field width is eight and the data item is + ten characters long, then the first two characters of the data item + are dropped. This behavior deviates from the printf function in C + where truncation is done from the end. + + + Below are various format modifier examples for the logger + conversion specifier. + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Format modifierleft justifyminimum widthmaximum widthcomment
%20loggerfalse20none + + Left pad with spaces if the logger name is less than 20 + characters long. + +
%-20loggertrue20none + + Right pad with spaces if the logger + name is less than 20 characters long. + +
%.30loggerNAnone30 + + Truncate from the beginning if the logger + name is longer than 30 characters. + +
%20.30loggerfalse2030 + + Left pad with spaces if the logger name is shorter than 20 + characters. However, if logger name is longer than 30 characters, + then truncate from the beginning. + +
%-20.30loggertrue2030 + + Right pad with spaces if the logger name is shorter than 20 + characters. However, if logger name is longer than 30 characters, + then truncate from the beginning. + +
+
+ + Note about caller location information.
+ The following patterns %type %file %line %method %location %class %C %F %L %l %M + all generate caller location information. + Location information uses the System.Diagnostics.StackTrace class to generate + a call stack. The caller's information is then extracted from this stack. +
+ + + The System.Diagnostics.StackTrace class is not supported on the + .NET Compact Framework 1.0 therefore caller location information is not + available on that framework. + + + + + The System.Diagnostics.StackTrace class has this to say about Release builds: + + + "StackTrace information will be most informative with Debug build configurations. + By default, Debug builds include debug symbols, while Release builds do not. The + debug symbols contain most of the file, method name, line number, and column + information used in constructing StackFrame and StackTrace objects. StackTrace + might not report as many method calls as expected, due to code transformations + that occur during optimization." + + + This means that in a Release build the caller information may be incomplete or may + not exist at all! Therefore caller location information cannot be relied upon in a Release build. + + + + Additional pattern converters may be registered with a specific + instance using the method. + +
+ + This is a more detailed pattern. + %timestamp [%thread] %level %logger %ndc - %message%newline + + + A similar pattern except that the relative time is + right padded if less than 6 digits, thread name is right padded if + less than 15 characters and truncated if longer and the logger + name is left padded if shorter than 30 characters and truncated if + longer. + %-6timestamp [%15.15thread] %-5level %30.30logger %ndc - %message%newline + + Nicko Cadell + Gert Driesen + Douglas de la Torre + Daniel Cazzulino +
+ + + Default pattern string for log output. + + + + Default pattern string for log output. + Currently set to the string "%message%newline" + which just prints the application supplied message. + + + + + + A detailed conversion pattern + + + + A conversion pattern which includes Time, Thread, Logger, and Nested Context. + Current value is %timestamp [%thread] %level %logger %ndc - %message%newline. + + + + + + Internal map of converter identifiers to converter types. + + + + This static map is overridden by the converterRegistry instance map + + + + + + the head of the pattern converter chain + + + + + patterns defined on this PatternLayout only + + + + + Constructs a PatternLayout using the DefaultConversionPattern + + + + The default pattern just produces the application supplied message. + + + Note to Inheritors: This constructor calls the virtual method + . If you override this method be + aware that it will be called before your is called constructor. + + + As per the contract the + method must be called after the properties on this object have been + configured. + + + + + + Constructs a PatternLayout using the supplied conversion pattern + + the pattern to use + + + Note to Inheritors: This constructor calls the virtual method + . If you override this method be + aware that it will be called before your is called constructor. + + + When using this constructor the method + need not be called. This may not be the case when using a subclass. + + + + + + Gets or sets the pattern formatting string. + + + + The ConversionPattern option. This is the string which + controls formatting and consists of a mix of literal content and + conversion specifiers. + + + + + + Create the pattern parser instance + + the pattern to parse + The that will format the event + + + Creates the used to parse the conversion string. Sets the + global and instance rules on the . + + + + + + Initializes layout options. + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Produces a formatted string as specified by the conversion pattern. + + The event being logged. + The TextWriter to write the formatted event to. + + + Parses the using the patter format + specified in the property. + + + + + + Add a converter to this PatternLayout + + the converter info + + + This version of the method is used by the configurator. + Programmatic users should use the alternative method. + + + + + + Adds a named pattern converter to this PatternLayout. + + the name of the conversion pattern for this converter + the type of the converter + + + This converter will be used in the formatting of the event. + This method must be called before . + + + The specified must extend the + type. + + + + + + Write the event appdomain name to the output + + + + Writes the to the output writer. + + + Daniel Cazzulino + Nicko Cadell + + + + Write the event appdomain name to the output + + that will receive the formatted result. + the event being logged + + + Writes the to the output . + + + + + + Converter for items in the ASP.Net Cache. + + + + Outputs an item from the . + + + Ron Grabowski + + + + Write the ASP.Net Cache item to the output + + that will receive the formatted result. + The on which the pattern converter should be executed. + The under which the ASP.Net request is running. + + + Writes out the value of a named property. The property name + should be set in the + property. If no property has been set, all key value pairs from the Cache will + be written to the output. + + + + + + Converter for items in the . + + + + Outputs an item from the . + + + Ron Grabowski + + + + Write the ASP.Net HttpContext item to the output + + that will receive the formatted result. + The on which the pattern converter should be executed. + The under which the ASP.Net request is running. + + + Writes out the value of a named property. The property name + should be set in the + property. + + + + + + Abstract class that provides access to the current HttpContext () that + derived classes need. + + + This class handles the case when HttpContext.Current is null by writing + to the writer. + + Ron Grabowski + + + + Derived pattern converters must override this method in order to + convert conversion specifiers in the correct way. + + that will receive the formatted result. + The on which the pattern converter should be executed. + The under which the ASP.Net request is running. + + + + Converter for items in the ASP.Net Cache. + + + + Outputs an item from the . + + + Ron Grabowski + + + + Write the ASP.Net Cache item to the output + + that will receive the formatted result. + The on which the pattern converter should be executed. + The under which the ASP.Net request is running. + + + Writes out the value of a named property. The property name + should be set in the + property. + + + + + + Converter for items in the ASP.Net Cache. + + + + Outputs an item from the . + + + Ron Grabowski + + + + Write the ASP.Net Cache item to the output + + that will receive the formatted result. + The on which the pattern converter should be executed. + The under which the ASP.Net request is running. + + + Writes out the value of a named property. The property name + should be set in the + property. If no property has been set, all key value pairs from the Session will + be written to the output. + + + + + + Date pattern converter, uses a to format + the date of a . + + + + Render the to the writer as a string. + + + The value of the determines + the formatting of the date. The following values are allowed: + + + Option value + Output + + + ISO8601 + + Uses the formatter. + Formats using the "yyyy-MM-dd HH:mm:ss,fff" pattern. + + + + DATE + + Uses the formatter. + Formats using the "dd MMM yyyy HH:mm:ss,fff" for example, "06 Nov 1994 15:49:37,459". + + + + ABSOLUTE + + Uses the formatter. + Formats using the "HH:mm:ss,yyyy" for example, "15:49:37,459". + + + + other + + Any other pattern string uses the formatter. + This formatter passes the pattern string to the + method. + For details on valid patterns see + DateTimeFormatInfo Class. + + + + + + The is in the local time zone and is rendered in that zone. + To output the time in Universal time see . + + + Nicko Cadell + + + + The used to render the date to a string + + + + + Initialize the converter pattern based on the property. + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Converts the pattern into the rendered message. + + that will receive the formatted result. + the event being logged + + + Pass the to the + for it to render it to the writer. + + + The passed is in the local time zone. + + + + + + Write the exception text to the output + + + + If an exception object is stored in the logging event + it will be rendered into the pattern output with a + trailing newline. + + + If there is no exception then nothing will be output + and no trailing newline will be appended. + It is typical to put a newline before the exception + and to have the exception as the last data in the pattern. + + + Nicko Cadell + + + + Default constructor + + + + + Write the exception text to the output + + that will receive the formatted result. + the event being logged + + + If an exception object is stored in the logging event + it will be rendered into the pattern output with a + trailing newline. + + + If there is no exception or the exception property specified + by the Option value does not exist then nothing will be output + and no trailing newline will be appended. + It is typical to put a newline before the exception + and to have the exception as the last data in the pattern. + + + Recognized values for the Option parameter are: + + + + Message + + + Source + + + StackTrace + + + TargetSite + + + HelpLink + + + + + + + Writes the value of the for + the event to the output writer. + + Nicko Cadell + + + + Writes the value of the for + the to the output . + + that will receive the formatted result. + the event being logged + + + + Write the caller location info to the output + + + + Writes the to the output writer. + + + Nicko Cadell + + + + Write the caller location info to the output + + that will receive the formatted result. + the event being logged + + + Writes the to the output writer. + + + + + + Writes the event identity to the output + + + + Writes the value of the to + the output writer. + + + Daniel Cazzulino + Nicko Cadell + + + + Writes the event identity to the output + + that will receive the formatted result. + the event being logged + + + Writes the value of the + to + the output . + + + + + + Write the event level to the output + + + + Writes the display name of the event + to the writer. + + + Nicko Cadell + + + + Write the event level to the output + + that will receive the formatted result. + the event being logged + + + Writes the of the + to the . + + + + + + Write the caller location line number to the output + + + + Writes the value of the for + the event to the output writer. + + + Nicko Cadell + + + + Write the caller location line number to the output + + that will receive the formatted result. + the event being logged + + + Writes the value of the for + the to the output . + + + + + + Converter for logger name + + + + Outputs the of the event. + + + Nicko Cadell + + + + Gets the fully qualified name of the logger + + the event being logged + The fully qualified logger name + + + Returns the of the . + + + + + + Writes the event message to the output + + + + Uses the method + to write out the event message. + + + Nicko Cadell + + + + Writes the event message to the output + + that will receive the formatted result. + the event being logged + + + Uses the method + to write out the event message. + + + + + + Write the method name to the output + + + + Writes the caller location to + the output. + + + Nicko Cadell + + + + Write the method name to the output + + that will receive the formatted result. + the event being logged + + + Writes the caller location to + the output. + + + + + + Converter to output and truncate '.' separated strings + + + + This abstract class supports truncating a '.' separated string + to show a specified number of elements from the right hand side. + This is used to truncate class names that are fully qualified. + + + Subclasses should override the method to + return the fully qualified string. + + + Nicko Cadell + + + + Initialize the converter + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Gets the fully qualified '.' (dot/period) separated name for an event. + + the event being logged + the fully qualified name + + + Overridden by subclasses to get the fully qualified name before the + precision is applied to it. + + + + + + Converts the pattern to the rendered message + + that will receive the formatted result. + the event being logged + + Render the to the precision + specified by the property. + + + + + The fully qualified type of the NamedPatternConverter class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Converter to include event NDC + + + + Outputs the value of the event property named NDC. + + + The should be used instead. + + + Nicko Cadell + + + + Write the event NDC to the output + + that will receive the formatted result. + the event being logged + + + As the thread context stacks are now stored in named event properties + this converter simply looks up the value of the NDC property. + + + The should be used instead. + + + + + + Abstract class that provides the formatting functionality that + derived classes need. + + + Conversion specifiers in a conversion patterns are parsed to + individual PatternConverters. Each of which is responsible for + converting a logging event in a converter specific manner. + + Nicko Cadell + + + + Initializes a new instance of the class. + + + + + Flag indicating if this converter handles the logging event exception + + false if this converter handles the logging event exception + + + If this converter handles the exception object contained within + , then this property should be set to + false. Otherwise, if the layout ignores the exception + object, then the property should be set to true. + + + Set this value to override a this default setting. The default + value is true, this converter does not handle the exception. + + + + + + Derived pattern converters must override this method in order to + convert conversion specifiers in the correct way. + + that will receive the formatted result. + The on which the pattern converter should be executed. + + + + Derived pattern converters must override this method in order to + convert conversion specifiers in the correct way. + + that will receive the formatted result. + The state object on which the pattern converter should be executed. + + + + Property pattern converter + + + + Writes out the value of a named property. The property name + should be set in the + property. + + + If the is set to null + then all the properties are written as key value pairs. + + + Nicko Cadell + + + + Write the property value to the output + + that will receive the formatted result. + the event being logged + + + Writes out the value of a named property. The property name + should be set in the + property. + + + If the is set to null + then all the properties are written as key value pairs. + + + + + + Converter to output the relative time of the event + + + + Converter to output the time of the event relative to the start of the program. + + + Nicko Cadell + + + + Write the relative time to the output + + that will receive the formatted result. + the event being logged + + + Writes out the relative time of the event in milliseconds. + That is the number of milliseconds between the event + and the . + + + + + + Helper method to get the time difference between two DateTime objects + + start time (in the current local time zone) + end time (in the current local time zone) + the time difference in milliseconds + + + + Writes the to the output writer, using format: + type3.MethodCall3(type param,...) > type2.MethodCall2(type param,...) > type1.MethodCall1(type param,...) + + Adam Davies + + + + + + + The fully qualified type of the StackTraceDetailPatternConverter class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Write the caller stack frames to the output + + + + Writes the to the output writer, using format: + type3.MethodCall3 > type2.MethodCall2 > type1.MethodCall1 + + + Michael Cromwell + + + + Initialize the converter + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Write the strack frames to the output + + that will receive the formatted result. + the event being logged + + + Writes the to the output writer. + + + + + + Returns the Name of the method + + + This method was created, so this class could be used as a base class for StackTraceDetailPatternConverter + string + + + + The fully qualified type of the StackTracePatternConverter class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Converter to include event thread name + + + + Writes the to the output. + + + Nicko Cadell + + + + Write the ThreadName to the output + + that will receive the formatted result. + the event being logged + + + Writes the to the . + + + + + + Pattern converter for the class name + + + + Outputs the of the event. + + + Nicko Cadell + + + + Gets the fully qualified name of the class + + the event being logged + The fully qualified type name for the caller location + + + Returns the of the . + + + + + + Converter to include event user name + + Douglas de la Torre + Nicko Cadell + + + + Convert the pattern to the rendered message + + that will receive the formatted result. + the event being logged + + + + Writes the TimeStamp to the output. + + + + Date pattern converter, uses a to format + the date of a . + + + Uses a to format the + in Universal time. + + + See the for details on the date pattern syntax. + + + + Nicko Cadell + + + + Writes the TimeStamp to the output. + + that will receive the formatted result. + the event being logged + + + Pass the to the + for it to render it to the writer. + + + The passed is in the local time zone, this is converted + to Universal time before it is rendered. + + + + + + + The fully qualified type of the UtcDatePatternConverter class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Type converter for the interface. + + + + Supports converting from the interface to + the interface using the . + + + Nicko Cadell + Gert Driesen + + + + Can the sourceType be converted to an + + the source to be to be converted + true if the source type can be converted to + + + Test if the can be converted to a + . Only is supported + as the . + + + + + + Converts the value to a object. + + the value to convert + the object + + + If the object is an then the + is used to adapt between the two interfaces, + otherwise an exception is thrown. + + + + + + Extracts the value of a property from the . + + Nicko Cadell + + + + The name of the value to look up in the LoggingEvent Properties collection. + + + + + Looks up the property for . + + The event to format + returns property value + + + Looks up and returns the object value of the property + named . If there is no property defined + with than name then null will be returned. + + + + + + Extracts the date from the . + + Nicko Cadell + Gert Driesen + + + + Gets the as a . + + The event to format + returns the time stamp + + + The time stamp is in local time. To format the time stamp + in universal time use . + + + + + + Extracts the date from the . + + Nicko Cadell + Gert Driesen + + + + Gets the as a . + + The event to format + returns the time stamp + + + The time stamp is in universal time. To format the time stamp + in local time use . + + + + + + A very simple layout + + + + SimpleLayout consists of the level of the log statement, + followed by " - " and then the log message itself. For example, + + DEBUG - Hello world + + + + Nicko Cadell + Gert Driesen + + + + Constructs a SimpleLayout + + + + + Initialize layout options + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Produces a simple formatted output. + + the event being logged + The TextWriter to write the formatted event to + + + Formats the event as the level of the event, + followed by " - " and then the log message itself. The + output is terminated by a newline. + + + + + + Layout that formats the log events as XML elements. + + + + The output of the consists of a series of + log4net:event elements. It does not output a complete well-formed XML + file. The output is designed to be included as an external entity + in a separate file to form a correct XML file. + + + For example, if abc is the name of the file where + the output goes, then a well-formed XML file would + be: + + + <?xml version="1.0" ?> + + <!DOCTYPE log4net:events SYSTEM "log4net-events.dtd" [<!ENTITY data SYSTEM "abc">]> + + <log4net:events version="1.2" xmlns:log4net="http://logging.apache.org/log4net/schemas/log4net-events-1.2> + &data; + </log4net:events> + + + This approach enforces the independence of the + and the appender where it is embedded. + + + The version attribute helps components to correctly + interpret output generated by . The value of + this attribute should be "1.2" for release 1.2 and later. + + + Alternatively the Header and Footer properties can be + configured to output the correct XML header, open tag and close tag. + When setting the Header and Footer properties it is essential + that the underlying data store not be appendable otherwise the data + will become invalid XML. + + + Nicko Cadell + Gert Driesen + + + + Constructs an XmlLayout + + + + + Constructs an XmlLayout. + + + + The LocationInfo option takes a boolean value. By + default, it is set to false which means there will be no location + information output by this layout. If the option is set to + true, then the file name and line number of the statement + at the origin of the log statement will be output. + + + If you are embedding this layout within an SmtpAppender + then make sure to set the LocationInfo option of that + appender as well. + + + + + + The prefix to use for all element names + + + + The default prefix is log4net. Set this property + to change the prefix. If the prefix is set to an empty string + then no prefix will be written. + + + + + + Set whether to base64 encode the message. + + + + By default the log message will be written as text to the xml + output. This can cause problems when the message contains binary + data. By setting this to true the contents of the message will be + base64 encoded. If this is set then invalid character replacement + (see ) will not be performed + on the log message. + + + + + + Set whether to base64 encode the property values. + + + + By default the properties will be written as text to the xml + output. This can cause problems when one or more properties contain + binary data. By setting this to true the values of the properties + will be base64 encoded. If this is set then invalid character replacement + (see ) will not be performed + on the property values. + + + + + + Initialize layout options + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + Builds a cache of the element names + + + + + + Does the actual writing of the XML. + + The writer to use to output the event to. + The event to write. + + + Override the base class method + to write the to the . + + + + + + Layout that formats the log events as XML elements. + + + + This is an abstract class that must be subclassed by an implementation + to conform to a specific schema. + + + Deriving classes must implement the method. + + + Nicko Cadell + Gert Driesen + + + + Protected constructor to support subclasses + + + + Initializes a new instance of the class + with no location info. + + + + + + Protected constructor to support subclasses + + + + The parameter determines whether + location information will be output by the layout. If + is set to true, then the + file name and line number of the statement at the origin of the log + statement will be output. + + + If you are embedding this layout within an SMTPAppender + then make sure to set the LocationInfo option of that + appender as well. + + + + + + Gets a value indicating whether to include location information in + the XML events. + + + true if location information should be included in the XML + events; otherwise, false. + + + + If is set to true, then the file + name and line number of the statement at the origin of the log + statement will be output. + + + If you are embedding this layout within an SMTPAppender + then make sure to set the LocationInfo option of that + appender as well. + + + + + + The string to replace characters that can not be expressed in XML with. + + + Not all characters may be expressed in XML. This property contains the + string to replace those that can not with. This defaults to a ?. Set it + to the empty string to simply remove offending characters. For more + details on the allowed character ranges see http://www.w3.org/TR/REC-xml/#charsets + Character replacement will occur in the log message, the property names + and the property values. + + + + + + + Initialize layout options + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Gets the content type output by this layout. + + + As this is the XML layout, the value is always "text/xml". + + + + As this is the XML layout, the value is always "text/xml". + + + + + + Produces a formatted string. + + The event being logged. + The TextWriter to write the formatted event to + + + Format the and write it to the . + + + This method creates an that writes to the + . The is passed + to the method. Subclasses should override the + method rather than this method. + + + + + + Does the actual writing of the XML. + + The writer to use to output the event to. + The event to write. + + + Subclasses should override this method to format the as XML. + + + + + + Layout that formats the log events as XML elements compatible with the log4j schema + + + + Formats the log events according to the http://logging.apache.org/log4j schema. + + + Nicko Cadell + + + + The 1st of January 1970 in UTC + + + + + Constructs an XMLLayoutSchemaLog4j + + + + + Constructs an XMLLayoutSchemaLog4j. + + + + The LocationInfo option takes a boolean value. By + default, it is set to false which means there will be no location + information output by this layout. If the option is set to + true, then the file name and line number of the statement + at the origin of the log statement will be output. + + + If you are embedding this layout within an SMTPAppender + then make sure to set the LocationInfo option of that + appender as well. + + + + + + The version of the log4j schema to use. + + + + Only version 1.2 of the log4j schema is supported. + + + + + + Actually do the writing of the xml + + the writer to use + the event to write + + + Generate XML that is compatible with the log4j schema. + + + + + + The log4net Logical Thread Context. + + + + The LogicalThreadContext provides a location for specific debugging + information to be stored. + The LogicalThreadContext properties override any or + properties with the same name. + + + For .NET Standard this class uses System.Threading.AsyncLocal rather than . + + + The Logical Thread Context has a properties map and a stack. + The properties and stack can + be included in the output of log messages. The + supports selecting and outputting these properties. + + + The Logical Thread Context provides a diagnostic context for the current call context. + This is an instrument for distinguishing interleaved log + output from different sources. Log output is typically interleaved + when a server handles multiple clients near-simultaneously. + + + The Logical Thread Context is managed on a per basis. + + + The requires a link time + for the + . + If the calling code does not have this permission then this context will be disabled. + It will not store any property values set on it. + + + Example of using the thread context properties to store a username. + + LogicalThreadContext.Properties["user"] = userName; + log.Info("This log message has a LogicalThreadContext Property called 'user'"); + + + Example of how to push a message into the context stack + + using(LogicalThreadContext.Stacks["LDC"].Push("my context message")) + { + log.Info("This log message has a LogicalThreadContext Stack message that includes 'my context message'"); + + } // at the end of the using block the message is automatically popped + + + + Nicko Cadell + + + + The thread properties map + + + + The LogicalThreadContext properties override any + or properties with the same name. + + + + + + The logical thread stacks. + + + + + This class is used by client applications to request logger instances. + + + + This class has static methods that are used by a client to request + a logger instance. The method is + used to retrieve a logger. + + + See the interface for more details. + + + Simple example of logging messages + + ILog log = LogManager.GetLogger("application-log"); + + log.Info("Application Start"); + log.Debug("This is a debug message"); + + if (log.IsDebugEnabled) + { + log.Debug("This is another debug message"); + } + + + + + Nicko Cadell + Gert Driesen + + + Returns the named logger if it exists. + + Returns the named logger if it exists. + + + + If the named logger exists (in the default repository) then it + returns a reference to the logger, otherwise it returns null. + + + The fully qualified logger name to look for. + The logger found, or null if no logger could be found. + + + Get the currently defined loggers. + + Returns all the currently defined loggers in the default repository. + + + The root logger is not included in the returned array. + + All the defined loggers. + + + Get or create a logger. + + Retrieves or creates a named logger. + + + + Retrieves a logger named as the + parameter. If the named logger already exists, then the + existing instance will be returned. Otherwise, a new instance is + created. + + By default, loggers do not have a set level but inherit + it from the hierarchy. This is one of the central features of + log4net. + + + The name of the logger to retrieve. + The logger with the name specified. + + + + Returns the named logger if it exists. + + + + If the named logger exists (in the specified repository) then it + returns a reference to the logger, otherwise it returns + null. + + + The repository to lookup in. + The fully qualified logger name to look for. + + The logger found, or null if the logger doesn't exist in the specified + repository. + + + + + Returns the named logger if it exists. + + + + If the named logger exists (in the repository for the specified assembly) then it + returns a reference to the logger, otherwise it returns + null. + + + The assembly to use to look up the repository. + The fully qualified logger name to look for. + + The logger, or null if the logger doesn't exist in the specified + assembly's repository. + + + + + Returns all the currently defined loggers in the specified repository. + + The repository to lookup in. + + The root logger is not included in the returned array. + + All the defined loggers. + + + + Returns all the currently defined loggers in the specified assembly's repository. + + The assembly to use to look up the repository. + + The root logger is not included in the returned array. + + All the defined loggers. + + + + Retrieves or creates a named logger. + + + + Retrieve a logger named as the + parameter. If the named logger already exists, then the + existing instance will be returned. Otherwise, a new instance is + created. + + + By default, loggers do not have a set level but inherit + it from the hierarchy. This is one of the central features of + log4net. + + + The repository to lookup in. + The name of the logger to retrieve. + The logger with the name specified. + + + + Retrieves or creates a named logger. + + + + Retrieve a logger named as the + parameter. If the named logger already exists, then the + existing instance will be returned. Otherwise, a new instance is + created. + + + By default, loggers do not have a set level but inherit + it from the hierarchy. This is one of the central features of + log4net. + + + The assembly to use to look up the repository. + The name of the logger to retrieve. + The logger with the name specified. + + + + Shorthand for . + + + Get the logger for the fully qualified name of the type specified. + + The full name of will be used as the name of the logger to retrieve. + The logger with the name specified. + + + + Shorthand for . + + + Gets the logger for the fully qualified name of the type specified. + + The repository to lookup in. + The full name of will be used as the name of the logger to retrieve. + The logger with the name specified. + + + + Shorthand for . + + + Gets the logger for the fully qualified name of the type specified. + + The assembly to use to look up the repository. + The full name of will be used as the name of the logger to retrieve. + The logger with the name specified. + + + + Shuts down the log4net system. + + + + Calling this method will safely close and remove all + appenders in all the loggers including root contained in all the + default repositories. + + + Some appenders need to be closed before the application exists. + Otherwise, pending logging events might be lost. + + The shutdown method is careful to close nested + appenders before closing regular appenders. This allows + configurations where a regular appender is attached to a logger + and again to a nested appender. + + + + + Shutdown a logger repository. + + Shuts down the default repository. + + + + Calling this method will safely close and remove all + appenders in all the loggers including root contained in the + default repository. + + Some appenders need to be closed before the application exists. + Otherwise, pending logging events might be lost. + + The shutdown method is careful to close nested + appenders before closing regular appenders. This allows + configurations where a regular appender is attached to a logger + and again to a nested appender. + + + + + + Shuts down the repository for the repository specified. + + + + Calling this method will safely close and remove all + appenders in all the loggers including root contained in the + specified. + + + Some appenders need to be closed before the application exists. + Otherwise, pending logging events might be lost. + + The shutdown method is careful to close nested + appenders before closing regular appenders. This allows + configurations where a regular appender is attached to a logger + and again to a nested appender. + + + The repository to shut down. + + + + Shuts down the repository specified. + + + + Calling this method will safely close and remove all + appenders in all the loggers including root contained in the + repository. The repository is looked up using + the specified. + + + Some appenders need to be closed before the application exists. + Otherwise, pending logging events might be lost. + + + The shutdown method is careful to close nested + appenders before closing regular appenders. This allows + configurations where a regular appender is attached to a logger + and again to a nested appender. + + + The assembly to use to look up the repository. + + + Reset the configuration of a repository + + Resets all values contained in this repository instance to their defaults. + + + + Resets all values contained in the repository instance to their + defaults. This removes all appenders from all loggers, sets + the level of all non-root loggers to null, + sets their additivity flag to true and sets the level + of the root logger to . Moreover, + message disabling is set to its default "off" value. + + + + + + Resets all values contained in this repository instance to their defaults. + + + + Reset all values contained in the repository instance to their + defaults. This removes all appenders from all loggers, sets + the level of all non-root loggers to null, + sets their additivity flag to true and sets the level + of the root logger to . Moreover, + message disabling is set to its default "off" value. + + + The repository to reset. + + + + Resets all values contained in this repository instance to their defaults. + + + + Reset all values contained in the repository instance to their + defaults. This removes all appenders from all loggers, sets + the level of all non-root loggers to null, + sets their additivity flag to true and sets the level + of the root logger to . Moreover, + message disabling is set to its default "off" value. + + + The assembly to use to look up the repository to reset. + + + Get a logger repository. + + Returns the default instance. + + + + Gets the for the repository specified + by the callers assembly (). + + + The instance for the default repository. + + + + Returns the default instance. + + The default instance. + + + Gets the for the repository specified + by the argument. + + + The repository to lookup in. + + + + Returns the default instance. + + The default instance. + + + Gets the for the repository specified + by the argument. + + + The assembly to use to look up the repository. + + + Create a logger repository. + + Creates a repository with the specified repository type. + + A that implements + and has a no arg constructor. An instance of this type will be created to act + as the for the repository specified. + The created for the repository. + + + The created will be associated with the repository + specified such that a call to will return + the same repository instance. + + + + + + Creates a repository with the specified name. + + + + Creates the default type of which is a + object. + + + The name must be unique. Repositories cannot be redefined. + An will be thrown if the repository already exists. + + + The name of the repository, this must be unique amongst repositories. + The created for the repository. + The specified repository already exists. + + + + Creates a repository with the specified name and repository type. + + + + The name must be unique. Repositories cannot be redefined. + An will be thrown if the repository already exists. + + + The name of the repository, this must be unique to the repository. + A that implements + and has a no arg constructor. An instance of this type will be created to act + as the for the repository specified. + The created for the repository. + The specified repository already exists. + + + + Creates a repository for the specified assembly and repository type. + + + + The created will be associated with the repository + specified such that a call to with the + same assembly specified will return the same repository instance. + + + The assembly to use to get the name of the repository. + A that implements + and has a no arg constructor. An instance of this type will be created to act + as the for the repository specified. + The created for the repository. + + + + Gets the list of currently defined repositories. + + + + Get an array of all the objects that have been created. + + + An array of all the known objects. + + + + Flushes logging events buffered in all configured appenders in the default repository. + + The maximum time in milliseconds to wait for logging events from asynchronous appenders to be flushed. + True if all logging events were flushed successfully, else false. + + + + Looks up the wrapper object for the logger specified. + + The logger to get the wrapper for. + The wrapper for the logger specified. + + + + Looks up the wrapper objects for the loggers specified. + + The loggers to get the wrappers for. + The wrapper objects for the loggers specified. + + + + Create the objects used by + this manager. + + The logger to wrap. + The wrapper for the logger specified. + + + + The wrapper map to use to hold the objects. + + + + + Implementation of Mapped Diagnostic Contexts. + + + + + The MDC is deprecated and has been replaced by the . + The current MDC implementation forwards to the ThreadContext.Properties. + + + + The MDC class is similar to the class except that it is + based on a map instead of a stack. It provides mapped + diagnostic contexts. A Mapped Diagnostic Context, or + MDC in short, is an instrument for distinguishing interleaved log + output from different sources. Log output is typically interleaved + when a server handles multiple clients near-simultaneously. + + + The MDC is managed on a per thread basis. + + + + Nicko Cadell + Gert Driesen + + + + Gets the context value identified by the parameter. + + The key to lookup in the MDC. + The string value held for the key, or a null reference if no corresponding value is found. + + + + The MDC is deprecated and has been replaced by the . + The current MDC implementation forwards to the ThreadContext.Properties. + + + + If the parameter does not look up to a + previously defined context then null will be returned. + + + + + + Add an entry to the MDC + + The key to store the value under. + The value to store. + + + + The MDC is deprecated and has been replaced by the . + The current MDC implementation forwards to the ThreadContext.Properties. + + + + Puts a context value (the parameter) as identified + with the parameter into the current thread's + context map. + + + If a value is already defined for the + specified then the value will be replaced. If the + is specified as null then the key value mapping will be removed. + + + + + + Removes the key value mapping for the key specified. + + The key to remove. + + + + The MDC is deprecated and has been replaced by the . + The current MDC implementation forwards to the ThreadContext.Properties. + + + + Remove the specified entry from this thread's MDC + + + + + + Clear all entries in the MDC + + + + + The MDC is deprecated and has been replaced by the . + The current MDC implementation forwards to the ThreadContext.Properties. + + + + Remove all the entries from this thread's MDC + + + + + + Implementation of Nested Diagnostic Contexts. + + + + + The NDC is deprecated and has been replaced by the . + The current NDC implementation forwards to the ThreadContext.Stacks["NDC"]. + + + + A Nested Diagnostic Context, or NDC in short, is an instrument + to distinguish interleaved log output from different sources. Log + output is typically interleaved when a server handles multiple + clients near-simultaneously. + + + Interleaved log output can still be meaningful if each log entry + from different contexts had a distinctive stamp. This is where NDCs + come into play. + + + Note that NDCs are managed on a per-thread basis. The NDC class + is made up of static methods that operate on the context of the + calling thread. + + + How to push a message into the context + + using (NDC.Push("my context message")) + { + ... all log calls will have 'my context message' included ... + + } // at the end of the using block the message is automatically removed + + + + Nicko Cadell + Gert Driesen + + + + Gets the current context depth. + + The current context depth. + + + + The NDC is deprecated and has been replaced by the . + The current NDC implementation forwards to the ThreadContext.Stacks["NDC"]. + + + + The number of context values pushed onto the context stack. + + + Used to record the current depth of the context. This can then + be restored using the method. + + + + + + + Clears all the contextual information held on the current thread. + + + + + The NDC is deprecated and has been replaced by the . + The current NDC implementation forwards to the ThreadContext.Stacks["NDC"]. + + + + Clears the stack of NDC data held on the current thread. + + + + + + Creates a clone of the stack of context information. + + A clone of the context info for this thread. + + + + The NDC is deprecated and has been replaced by the . + The current NDC implementation forwards to the ThreadContext.Stacks["NDC"]. + + + + The results of this method can be passed to the + method to allow child threads to inherit the context of their + parent thread. + + + + + + Inherits the contextual information from another thread. + + The context stack to inherit. + + + + The NDC is deprecated and has been replaced by the . + The current NDC implementation forwards to the ThreadContext.Stacks["NDC"]. + + + + This thread will use the context information from the stack + supplied. This can be used to initialize child threads with + the same contextual information as their parent threads. These + contexts will NOT be shared. Any further contexts that + are pushed onto the stack will not be visible to the other. + Call to obtain a stack to pass to + this method. + + + + + + Removes the top context from the stack. + + + The message in the context that was removed from the top + of the stack. + + + + + The NDC is deprecated and has been replaced by the . + The current NDC implementation forwards to the ThreadContext.Stacks["NDC"]. + + + + Remove the top context from the stack, and return + it to the caller. If the stack is empty then an + empty string (not null) is returned. + + + + + + Pushes a new context message. + + The new context message. + + An that can be used to clean up + the context stack. + + + + + The NDC is deprecated and has been replaced by the . + The current NDC implementation forwards to the ThreadContext.Stacks["NDC"]. + + + + Pushes a new context onto the context stack. An + is returned that can be used to clean up the context stack. This + can be easily combined with the using keyword to scope the + context. + + + Simple example of using the Push method with the using keyword. + + using(log4net.NDC.Push("NDC_Message")) + { + log.Warn("This should have an NDC message"); + } + + + + + + Pushes a new context message. + + The new context message string format. + Arguments to be passed into messageFormat. + + An that can be used to clean up + the context stack. + + + + + The NDC is deprecated and has been replaced by the . + The current NDC implementation forwards to the ThreadContext.Stacks["NDC"]. + + + + Pushes a new context onto the context stack. An + is returned that can be used to clean up the context stack. This + can be easily combined with the using keyword to scope the + context. + + + Simple example of using the Push method with the using keyword. + + var someValue = "ExampleContext" + using(log4net.NDC.PushFormat("NDC_Message {0}", someValue)) + { + log.Warn("This should have an NDC message"); + } + + + + + + Removes the context information for this thread. It is + not required to call this method. + + + + + The NDC is deprecated and has been replaced by the . + The current NDC implementation forwards to the ThreadContext.Stacks["NDC"]. + + + + This method is not implemented. + + + + + + Forces the stack depth to be at most . + + The maximum depth of the stack + + + + The NDC is deprecated and has been replaced by the . + The current NDC implementation forwards to the ThreadContext.Stacks["NDC"]. + + + + Forces the stack depth to be at most . + This may truncate the head of the stack. This only affects the + stack in the current thread. Also it does not prevent it from + growing, it only sets the maximum depth at the time of the + call. This can be used to return to a known context depth. + + + + + + The default object Renderer. + + + + The default renderer supports rendering objects and collections to strings. + + + See the method for details of the output. + + + Nicko Cadell + Gert Driesen + + + + Renders the object to a string. + + The map used to lookup renderers + The object to render + The writer to render to + + + Render the object to a string. + + + The parameter is + provided to lookup and render other objects. This is + very useful where contains + nested objects of unknown type. The + method can be used to render these objects. + + + The default renderer supports rendering objects to strings as follows: + + + + Value + Rendered String + + + null + + "(null)" + + + + + + + For a one dimensional array this is the + array type name, an open brace, followed by a comma + separated list of the elements (using the appropriate + renderer), followed by a close brace. + + + For example: int[] {1, 2, 3}. + + + If the array is not one dimensional the + Array.ToString() is returned. + + + + + , & + + + Rendered as an open brace, followed by a comma + separated list of the elements (using the appropriate + renderer), followed by a close brace. + + + For example: {a, b, c}. + + + All collection classes that implement its subclasses, + or generic equivalents all implement the interface. + + + + + + + + Rendered as the key, an equals sign ('='), and the value (using the appropriate + renderer). + + + For example: key=value. + + + + + other + + Object.ToString() + + + + + + + + Render the array argument into a string + + The map used to lookup renderers + the array to render + The writer to render to + + + For a one dimensional array this is the + array type name, an open brace, followed by a comma + separated list of the elements (using the appropriate + renderer), followed by a close brace. For example: + int[] {1, 2, 3}. + + + If the array is not one dimensional the + Array.ToString() is returned. + + + + + + Render the enumerator argument into a string + + The map used to lookup renderers + the enumerator to render + The writer to render to + + + Rendered as an open brace, followed by a comma + separated list of the elements (using the appropriate + renderer), followed by a close brace. For example: + {a, b, c}. + + + + + + Renders the DictionaryEntry argument into a string. + + The map used to lookup renderers + the DictionaryEntry to render + The writer to render to + + + Render the key, an equals sign ('='), and the value (using the appropriate + renderer). For example: key=value. + + + + + + Implement this interface in order to render objects as strings + + + + Certain types require special case conversion to + string form. This conversion is done by an object renderer. + Object renderers implement the + interface. + + + Nicko Cadell + Gert Driesen + + + + Render the object to a string + + The map used to lookup renderers + The object to render + The writer to render to + + + Render the object to a + string. + + + The parameter is + provided to lookup and render other objects. This is + very useful where contains + nested objects of unknown type. The + method can be used to render these objects. + + + + + + Maps types to instances for types that require custom + rendering. + + + + The method is used to render an + object using the appropriate renderers defined in this map, + using a default renderer if no custom renderer is defined for a type. + + + Nicko Cadell + Gert Driesen + + + + Renders using the appropriate renderer. + + the object to render to a string + The object rendered as a string. + + + This is a convenience method used to render an object to a string. + The alternative method + should be used when streaming output to a . + + + + + + Render using the appropriate renderer. + + the object to render to a string + The writer to render to + + + Find the appropriate renderer for the type of the + parameter. This is accomplished by calling the + method. Once a renderer is found, it is + applied on the object and the result is returned + as a . + + + + + + Gets the renderer for the specified object type. + + The object for which to look up the renderer. + the renderer for + + + Gets the renderer for the specified object type. + + + Syntactic sugar method that calls + with the type of the object parameter. + + + + + + Gets the renderer for the specified type + + the type to look up the renderer for + The renderer for the specified type, or if no specific renderer has been defined. + + + + Recursively searches interfaces. + + The type for which to look up the renderer. + The renderer for the specified type, or null if not found. + + + + Gets the default renderer instance + + + + + Clears the map of custom renderers. The + is not removed. + + + + + Registers an for . + + The type that will be rendered by . + The renderer for . + + + + Interface implemented by logger repository plugins. + + + + Plugins define additional behavior that can be associated + with a . + The held by the + property is used to store the plugins for a repository. + + + The log4net.Config.PluginAttribute can be used to + attach plugins to repositories created using configuration + attributes. + + + Nicko Cadell + Gert Driesen + + + + Gets the name of the plugin. + + + The name of the plugin. + + + + Plugins are stored in the + keyed by name. Each plugin instance attached to a + repository must be a unique name. + + + + + + Attaches the plugin to the specified . + + The that this plugin should be attached to. + + + A plugin may only be attached to a single repository. + + + This method is called when the plugin is attached to the repository. + + + + + + Is called when the plugin is to shutdown. + + + + This method is called to notify the plugin that + it should stop operating and should detach from + the repository. + + + + + + Interface used to create plugins. + + + + Interface used to create a plugin. + + + Nicko Cadell + Gert Driesen + + + + Creates the plugin object. + + the new plugin instance + + + Create and return a new plugin instance. + + + + + + A strongly-typed collection of objects. + + Nicko Cadell + + + + Supports type-safe iteration over a . + + + + + + Gets the current element in the collection. + + + + + Advances the enumerator to the next element in the collection. + + + true if the enumerator was successfully advanced to the next element; + false if the enumerator has passed the end of the collection. + + + The collection was modified after the enumerator was created. + + + + + Sets the enumerator to its initial position, before the first element in the collection. + + + + + Creates a read-only wrapper for a PluginCollection instance. + + list to create a readonly wrapper arround + + A PluginCollection wrapper that is read-only. + + + + + Initializes a new instance of the PluginCollection class + that is empty and has the default initial capacity. + + + + + Initializes a new instance of the PluginCollection class + that has the specified initial capacity. + + + The number of elements that the new PluginCollection is initially capable of storing. + + + + + Initializes a new instance of the PluginCollection class + that contains elements copied from the specified PluginCollection. + + The PluginCollection whose elements are copied to the new collection. + + + + Initializes a new instance of the PluginCollection class + that contains elements copied from the specified array. + + The array whose elements are copied to the new list. + + + + Initializes a new instance of the PluginCollection class + that contains elements copied from the specified collection. + + The collection whose elements are copied to the new list. + + + + Initializes a new instance of the PluginCollection class + that contains elements copied from the specified collection. + + The collection whose elements are copied to the new list. + + + + Type visible only to our subclasses + Used to access protected constructor + + + + + + A value + + + + + Allow subclasses to avoid our default constructors + + + + + + Gets the number of elements actually contained in the PluginCollection. + + + + + Copies the entire PluginCollection to a one-dimensional + array. + + The one-dimensional array to copy to. + + + + Copies the entire PluginCollection to a one-dimensional + array, starting at the specified index of the target array. + + The one-dimensional array to copy to. + The zero-based index in at which copying begins. + + + + Gets a value indicating whether access to the collection is synchronized (thread-safe). + + false, because the backing type is an array, which is never thread-safe. + + + + Gets an object that can be used to synchronize access to the collection. + + + + + Gets or sets the at the specified index. + + + The at the specified index. + + The zero-based index of the element to get or set. + + is less than zero. + -or- + is equal to or greater than . + + + + + Adds a to the end of the PluginCollection. + + The to be added to the end of the PluginCollection. + The index at which the value has been added. + + + + Removes all elements from the PluginCollection. + + + + + Creates a shallow copy of the . + + A new with a shallow copy of the collection data. + + + + Determines whether a given is in the PluginCollection. + + The to check for. + true if is found in the PluginCollection; otherwise, false. + + + + Returns the zero-based index of the first occurrence of a + in the PluginCollection. + + The to locate in the PluginCollection. + + The zero-based index of the first occurrence of + in the entire PluginCollection, if found; otherwise, -1. + + + + + Inserts an element into the PluginCollection at the specified index. + + The zero-based index at which should be inserted. + The to insert. + + is less than zero + -or- + is equal to or greater than . + + + + + Removes the first occurrence of a specific from the PluginCollection. + + The to remove from the PluginCollection. + + The specified was not found in the PluginCollection. + + + + + Removes the element at the specified index of the PluginCollection. + + The zero-based index of the element to remove. + + is less than zero. + -or- + is equal to or greater than . + + + + + Gets a value indicating whether the collection has a fixed size. + + true if the collection has a fixed size; otherwise, false. The default is false. + + + + Gets a value indicating whether the IList is read-only. + + true if the collection is read-only; otherwise, false. The default is false. + + + + Returns an enumerator that can iterate through the PluginCollection. + + An for the entire PluginCollection. + + + + Gets or sets the number of elements the PluginCollection can contain. + + + The number of elements the PluginCollection can contain. + + + + + Adds the elements of another PluginCollection to the current PluginCollection. + + The PluginCollection whose elements should be added to the end of the current PluginCollection. + The new of the PluginCollection. + + + + Adds the elements of a array to the current PluginCollection. + + The array whose elements should be added to the end of the PluginCollection. + The new of the PluginCollection. + + + + Adds the elements of a collection to the current PluginCollection. + + The collection whose elements should be added to the end of the PluginCollection. + The new of the PluginCollection. + + + + Adds the elements of a collection to the current PluginCollection. + + The collection whose elements should be added to the end of the PluginCollection. + The new of the PluginCollection. + + + + Sets the capacity to the actual number of elements. + + + + + is less than zero. + -or- + is equal to or greater than . + + + + + is less than zero. + -or- + is equal to or greater than . + + + + + Supports simple iteration over a . + + + + + + Initializes a new instance of the Enumerator class. + + + + + + Gets the current element in the collection. + + + + + Advances the enumerator to the next element in the collection. + + + true if the enumerator was successfully advanced to the next element; + false if the enumerator has passed the end of the collection. + + + The collection was modified after the enumerator was created. + + + + + Sets the enumerator to its initial position, before the first element in the collection. + + + + + + + + Map of repository plugins. + + The repository that the plugins should be attached to. + + + This class is a name keyed map of the plugins that are + attached to a repository. + + + Nicko Cadell + Gert Driesen + + + + Map of repository plugins. + + The repository that the plugins should be attached to. + + + This class is a name keyed map of the plugins that are + attached to a repository. + + + Nicko Cadell + Gert Driesen + + + + Gets a by name. + + The name of the to lookup. + + The from the map with the name specified, or + null if no plugin is found. + + + + + Gets all possible plugins as a list of objects. + + All possible plugins as a list of objects. + + + + Adds a to the map. + + The to add to the map. + + + The will be attached to the repository when added. + + + If there already exists a plugin with the same name + attached to the repository then the old plugin will + be and replaced with + the new plugin. + + + + + + Removes an from the map. + + The to remove from the map. + + + + Base implementation of + + + + Default abstract implementation of the + interface. This base class can be used by implementors + of the interface. + + + Nicko Cadell + Gert Driesen + + + + Constructor + + the name of the plugin + + Initializes a new Plugin with the specified name. + + + + + Gets or sets the name of the plugin. + + + The name of the plugin. + + + + Plugins are stored in the + keyed by name. Each plugin instance attached to a + repository must be a unique name. + + + The name of the plugin must not change once the + plugin has been attached to a repository. + + + + + + Attaches this plugin to a . + + The that this plugin should be attached to. + + + A plugin may only be attached to a single repository. + + + This method is called when the plugin is attached to the repository. + + + + + + Is called when the plugin is to shutdown. + + + + This method is called to notify the plugin that + it should stop operating and should detach from + the repository. + + + + + + The repository for this plugin + + + The that this plugin is attached to. + + + + Gets or sets the that this plugin is + attached to. + + + + + + + + + + + + + + + + + + + + + + Default implementation of + + + + This default implementation of the + interface is used to create the default subclass + of the object. + + + Nicko Cadell + Gert Driesen + + + + Create a new instance with the specified name. + + The that will own the . + The name of the . If null, the root logger is returned. + The instance for the specified name. + + + Called by the to create + new named instances. + + + + + + Default internal subclass of + + + + This subclass has no additional behavior over the + class but does allow instances + to be created. + + + + + + Initializes a new instance of the class + with the specified name. + + the name of the logger + + + + Delegate used to handle logger creation event notifications. + + The in which the has been created. + The event args that hold the instance that has been created. + + + + Provides data for the event. + + + + A event is raised every time a is created. + + + The that has been created. + + + + Provides data for the event. + + + + A event is raised every time a is created. + + + The that has been created. + + + + Gets the that has been created. + + + + + Hierarchical organization of loggers + + + + The casual user should not have to deal with this class directly. + + + This class is specialized in retrieving loggers by name and also maintaining the logger + hierarchy. Implements the interface. + + + The structure of the logger hierarchy is maintained by the + method. The hierarchy is such that children + link to their parent but parents do not have any references to their + children. Moreover, loggers can be instantiated in any order, in + particular descendant before ancestor. + + + In case a descendant is created before a particular ancestor, then it creates a provision node + for the ancestor and adds itself to the provision node. Other descendants of the same ancestor + add themselves to the previously created provision node. + + + Nicko Cadell + Gert Driesen + The properties to pass to this repository. + The factory to use to create new logger instances. + + + + Hierarchical organization of loggers + + + + The casual user should not have to deal with this class directly. + + + This class is specialized in retrieving loggers by name and also maintaining the logger + hierarchy. Implements the interface. + + + The structure of the logger hierarchy is maintained by the + method. The hierarchy is such that children + link to their parent but parents do not have any references to their + children. Moreover, loggers can be instantiated in any order, in + particular descendant before ancestor. + + + In case a descendant is created before a particular ancestor, then it creates a provision node + for the ancestor and adds itself to the provision node. Other descendants of the same ancestor + add themselves to the previously created provision node. + + + Nicko Cadell + Gert Driesen + The properties to pass to this repository. + The factory to use to create new logger instances. + + + + The fully qualified type of the Hierarchy class. + + + Used by the internal logger to record the type of the log message. + + + + + Event used to notify that a logger has been created. + + + + + Default constructor + + + + + Construct with properties + + The properties to pass to this repository. + + + + Construct with a logger factory + + The factory to use to create new logger instances. + + + + Has no appender warning been emitted + + + Flag to indicate if we have already issued a warning about not having an appender warning. + + + + + Get the root of this hierarchy + + + + + Gets or sets the default instance. + + + + The logger factory is used to create logger instances. + + + + + + Test if a logger exists + + The name of the logger to lookup + The Logger object with the name specified + + + Check if the named logger exists in the hierarchy. If so return + its reference, otherwise returns . + + + + + + Returns all the currently defined loggers in the hierarchy as an Array + + All the defined loggers + + + Returns all the currently defined loggers in the hierarchy as an Array. + The root logger is not included in the returned + enumeration. + + + + + + Return a new logger instance named as the first parameter using + the default factory. + + + If a logger of that name already exists, then it will be + returned. Otherwise, a new logger will be instantiated and + then linked with its existing ancestors as well as children. + + The name of the logger to retrieve + The logger object with the name specified + + + + Shutting down a hierarchy will safely close and remove + all appenders in all loggers including the root logger. + + + + Shutting down a hierarchy will safely close and remove + all appenders in all loggers including the root logger. + + + Some appenders need to be closed before the + application exists. Otherwise, pending logging events might be + lost. + + + The method is careful to close nested + appenders before closing regular appenders. This allows + configurations where a regular appender is attached to a logger + and again to a nested appender. + + + + + + Reset all values contained in this hierarchy instance to their default. + + + + Reset all values contained in this hierarchy instance to their + default. This removes all appenders from all loggers, sets + the level of all non-root loggers to , + sets their additivity flag to and sets the level + of the root logger to . Moreover, + message disabling is set its default "off" value. + + + Existing loggers are not removed. They are just reset. + + + This method should be used sparingly and with care as it will + block all logging until it is completed. + + + + + + Log the logEvent through this hierarchy. + + the event to log + + + This method should not normally be used to log. + The interface should be used + for routine logging. This interface can be obtained + using the method. + + + The is delivered to the appropriate logger and + that logger is then responsible for logging the event. + + + + + + Returns all the Appenders that are currently configured + + An array containing all the currently configured appenders + + + Returns all the instances that are currently configured. + All the loggers are searched for appenders. The appenders may also be containers + for appenders and these are also searched for additional loggers. + + + The list returned is unordered but does not contain duplicates. + + + + + + Collect the appenders from an . + The appender may also be a container. + + + + + Collect the appenders from an container + + + + + Initialize the log4net system using the specified appender + + the appender to use to log all logging events + + + + Initialize the log4net system using the specified appenders + + the appenders to use to log all logging events + + + + Initialize the log4net system using the specified appenders + + the appenders to use to log all logging events + + + This method provides the same functionality as the + method implemented + on this object, but it is protected and therefore can be called by subclasses. + + + + + + Initialize the log4net system using the specified config + + the element containing the root of the config + + + + Initialize the log4net system using the specified config + + the element containing the root of the config + + + This method provides the same functionality as the + method implemented + on this object, but it is protected and therefore can be called by subclasses. + + + + + + Test if this hierarchy is disabled for the specified . + + The level to check against. + + if the repository is disabled for the level argument, otherwise. + + + If this hierarchy has not been configured then this method will always return . + See also the property. + + + + + Clear all logger definitions from the internal hashtable + + + + This call will clear all logger definitions from the internal + hashtable. Invoking this method will irrevocably mess up the + logger hierarchy. + + + You should really know what you are doing before invoking this method. + + + + + + Returns a new logger instance named as the first parameter using + . + + The name of the logger to retrieve + The factory that will make the new logger instance + The logger object with the name specified + + + If a logger of that name already exists, then it will be + returned. Otherwise, a new logger will be instantiated by the + parameter and linked with its existing + ancestors as well as children. + + + + + + Sends a logger creation event to all registered listeners + + The newly created logger + + Raises the logger creation event. + + + + + Updates all the parents of the specified logger + + The logger to update the parents for + + + This method loops through all the potential parents of + . There 3 possible cases: + + + + No entry for the potential parent of exists + + We create a ProvisionNode for this potential + parent and insert in that provision node. + + + + The entry is of type Logger for the potential parent. + + The entry is 's nearest existing parent. We + update 's parent field with this entry. We also break from + the loop because updating our parent's parent is our parent's + responsibility. + + + + The entry is of type ProvisionNode for this potential parent. + + We add to the list of children for this potential parent. + + + + + + + + Replace a with a in the hierarchy. + + + + We update the links for all the children that placed themselves + in the provision node 'pn'. The second argument 'log' is a + reference for the newly created Logger, parent of all the + children in 'pn'. + + + We loop on all the children 'c' in 'pn'. + + + If the child 'c' has been already linked to a child of + 'log' then there is no need to update 'c'. + + + Otherwise, we set log's parent field to c's parent and set + c's parent field to log. + + + + + + Define or redefine a Level using the values in the argument + + the level values + + Supports setting levels via the configuration file. + + + + + A class to hold the value, name and display name for a level + + + + + Value of the level + + + If the value is not set (defaults to -1) the value will be looked + up for the current level with the same name. + + + + + Name of the level + + + + + Display name for the level + + + + + Override Object.ToString to return sensible debug info + + string info about this object + + + + Set a Property using the values in the argument + + the property value + + Supports setting property values via the configuration file. + + + + + Interface abstracts creation of instances + + + + This interface is used by the to + create new objects. + + + The method is called + to create a named . + + + Implement this interface to create new subclasses of . + + + Nicko Cadell + Gert Driesen + + + + Create a new instance + + The that will own the . + The name of the . + The instance for the specified name. + + + Create a new instance with the + specified name. + + + Called by the to create + new named instances. + + + If the is null then the root logger + must be returned. + + + + + + Implementation of used by + + The name of the . + + + Internal class used to provide implementation of + interface. Applications should use to get + logger instances. + + + This is one of the central classes in the log4net implementation. One of the + distinctive features of log4net are hierarchical loggers and their + evaluation. The organizes the + instances into a rooted tree hierarchy. + + + The class is abstract. Only concrete subclasses of + can be created. The + is used to create instances of this type for the . + + + Nicko Cadell + Gert Driesen + Aspi Havewala + Douglas de la Torre + + + + Implementation of used by + + The name of the . + + + Internal class used to provide implementation of + interface. Applications should use to get + logger instances. + + + This is one of the central classes in the log4net implementation. One of the + distinctive features of log4net are hierarchical loggers and their + evaluation. The organizes the + instances into a rooted tree hierarchy. + + + The class is abstract. Only concrete subclasses of + can be created. The + is used to create instances of this type for the . + + + Nicko Cadell + Gert Driesen + Aspi Havewala + Douglas de la Torre + + + + The fully qualified type of the Logger class. + + + + + The parent of this logger. + + + + All loggers have at least one ancestor which is the root logger. + + + + + + Loggers need to know what Hierarchy they are in. + + + + + Helper implementation of the interface + + + + + Lock to protect AppenderAttachedImpl variable appenderAttachedImpl + + + + + Gets or sets the parent logger in the hierarchy. + + + The parent logger in the hierarchy. + + + + Part of the Composite pattern that makes the hierarchy. + The hierarchy is parent linked rather than child linked. + + + + + + Gets or sets a value indicating if child loggers inherit their parent's appenders. + + + if child loggers inherit their parent's appenders. + + + + Additivity is set to by default, that is children inherit + the appenders of their ancestors by default. If this variable is + set to then the appenders found in the + ancestors of this logger are not used. However, the children + of this logger will inherit its appenders, unless the children + have their additivity flag set to too. See + the user manual for more details. + + + + + + Gets the effective level for this logger. + + The nearest level in the logger hierarchy. + + + Starting from this logger, searches the logger hierarchy for a + non-null level and returns it. Otherwise, returns the level of the + root logger. + + The Logger class is designed so that this method executes as + quickly as possible. + + + + + Gets or sets the where this instance is attached to. + + + + + Gets or sets the assigned for this Logger. + + + + + Add to the list of appenders of this + Logger instance. + + An appender to add to this logger + + + If is already in the list of + appenders, then it won't be added again. + + + + + + Get the appenders contained in this logger as an + . + + + A collection of the appenders in this logger. If no appenders + can be found, then a is returned. + + + + + Look for the appender named as + + The name of the appender to lookup + The appender with the name specified, or . + + + + Removes all previously added appenders from this Logger instance. + + + + This is useful when re-reading configuration information. + + + + + + Remove the appender passed as parameter form the list of appenders. + + The appender to remove + The appender removed from the list + + + The appender removed is not closed. + If you are discarding the appender you must call + on the appender removed. + + + + + + Remove the appender passed as parameter form the list of appenders. + + The name of the appender to remove + The appender removed from the list + + + The appender removed is not closed. + If you are discarding the appender you must call + on the appender removed. + + + + + + Gets the logger name. + + + + + Generates a logging event for the specified using + the and . + + The declaring type of the method that is + the stack boundary into the logging system for this call. + The level of the message to be logged. + The message object to log. + The exception to log, including its stack trace. + + + This generic form is intended to be used by wrappers. + + + This method must not throw any exception to the caller. + + + + + + Logs the specified logging event through this logger. + + The event being logged. + + + This is the most generic printing method that is intended to be used + by wrappers. + + + This method must not throw any exception to the caller. + + + + + + Checks if this logger is enabled for a given passed as parameter. + + The level to check. + + if this logger is enabled for , + otherwise . + + + + This method must not throw any exception to the caller. + + + + + + Gets the where this + instance is attached to. + + + + + Deliver the to the attached appenders. + + The event to log. + + + Call the appenders in the hierarchy starting at . + If no appenders could be found, emit a warning. + + + This method calls all the appenders inherited from the + hierarchy circumventing any evaluation of whether to log or not + to log the particular log request. + + + + + + Closes all attached appenders implementing the interface. + + + + Used to ensure that the appenders are correctly shutdown. + + + + + + This is the most generic printing method. This generic form is intended to be used by wrappers + + The level of the message to be logged. + The message object to log. + The exception to log, including its stack trace. + + + Generate a logging event for the specified using + the . + + + + + + Creates a new logging event and logs the event without further checks. + + The declaring type of the method that is + the stack boundary into the logging system for this call. + The level of the message to be logged. + The message object to log. + The exception to log, including its stack trace. + + + Generates a logging event and delivers it to the attached + appenders. + + + + + + Creates a new logging event and logs the event without further checks. + + The event being logged. + + + Delivers the logging event to the attached appenders. + + + + + + Used internally to accelerate hash table searches. + + + + Internal class used to improve performance of + string keyed hashtables. + + + The hashcode of the string is cached for reuse. + The string is stored as an interned value. + When comparing two objects for equality + the reference equality of the interned strings is compared. + + + Nicko Cadell + Gert Driesen + + + + Construct key with string name + + + + Initializes a new instance of the class + with the specified name. + + + Stores the hashcode of the string and interns + the string key to optimize comparisons. + + + The Compact Framework 1.0 the + method does not work. On the Compact Framework + the string keys are not interned nor are they + compared by reference. + + + The name of the logger. + + + + Returns a hash code for the current instance. + + A hash code for the current instance. + + + Returns the cached hashcode. + + + + + + Name of the Logger + + + + + Provision nodes are used where no logger instance has been specified + + + + instances are used in the + when there is no specified + for that node. + + + A provision node holds a list of child loggers on behalf of a logger that does not exist. + + + Nicko Cadell + Gert Driesen + + + + Create a new provision node with child node + + A child logger to add to this node. + + + + Add a to the internal List + + Logger + + + + Calls for each logger in the internal list + + Callback to execute + Parant logger + + + + The sits at the root of the logger hierarchy tree. + + + + The is a regular except + that it provides several guarantees. + + + First, it cannot be assigned a null + level. Second, since the root logger cannot have a parent, the + property always returns the value of the + level field without walking the hierarchy. + + + Nicko Cadell + Gert Driesen + + + + Construct a + + The level to assign to the root logger. + + + Initializes a new instance of the class with + the specified logging level. + + + The root logger names itself as "root". However, the root + logger cannot be retrieved by name. + + + + + + Gets the assigned level value without walking the logger hierarchy. + + The assigned level value without walking the logger hierarchy. + + + Because the root logger cannot have a parent and its level + must not be null this property just returns the + value of . + + + + + + Gets or sets the assigned for the root logger. + + + The of the root logger. + + + + Setting the level of the root logger to a null reference + may have catastrophic results. We prevent this here. + + + + + + The fully qualified type of the RootLogger class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Initializes the log4net environment using an XML DOM. + + The hierarchy to build. + Nicko Cadell + Gert Driesen + + + + Initializes the log4net environment using an XML DOM. + + The hierarchy to build. + Nicko Cadell + Gert Driesen + + + + Configure the hierarchy by parsing a DOM tree of XML elements. + + The root element to parse. + + + Configure the hierarchy by parsing a DOM tree of XML elements. + + + + + + Parse appenders by IDREF. + + The appender ref element. + The instance of the appender that the ref refers to. + + + Parse an XML element that represents an appender and return + the appender. + + + + + + Parses an appender element. + + The appender element. + The appender instance or null when parsing failed. + + + Parse an XML element that represents an appender and return + the appender instance. + + + + + + Parses a logger element. + + The logger element. + + + Parse an XML element that represents a logger. + + + + + + Parses the root logger element. + + The root element. + + + Parse an XML element that represents the root logger. + + + + + + Parses the children of a logger element. + + The category element. + The logger instance. + Flag to indicate if the logger is the root logger. + + + Parse the child elements of a <logger> element. + + + + + + Parses an object renderer. + + The renderer element. + + + Parse an XML element that represents a renderer. + + + + + + Parses a level element. + + The level element. + The logger object to set the level on. + Flag to indicate if the logger is the root logger. + + + Parse an XML element that represents a level. + + + + + + Sets a parameter on an object. + + The parameter element. + The object to set the parameter on. + + The parameter name must correspond to a writable property + on the object. The value of the parameter is a string, + therefore this function will attempt to set a string + property first. If unable to set a string property it + will inspect the property and its argument type. It will + attempt to call a static method called Parse on the + type of the property. This method will take a single + string argument and return a value that can be used to + set the property. + + + + + Test if an element has no attributes or child elements + + the element to inspect + true if the element has any attributes or child elements, false otherwise + + + + Test if a is constructible with Activator.CreateInstance. + + the type to inspect + true if the type is creatable using a default constructor, false otherwise + + + + Look for a method on the that matches the supplied + + the type that has the method + the name of the method + the method info found + + + The method must be a public instance method on the . + The method must be named or "Add" followed by . + The method must take a single parameter. + + + + + + Converts a string value to a target type. + + The type of object to convert the string to. + The string value to use as the value of the object. + + + An object of type with value or + null when the conversion could not be performed. + + + + + + Creates an object as specified in XML. + + The XML element that contains the definition of the object. + The object type to use if not explicitly specified. + The type that the returned object must be or must inherit from. + The object or null + + + Parse an XML element and create an object instance based on the configuration + data. + + + The type of the instance may be specified in the XML. If not + specified then the is used + as the type. However the type is specified it must support the + type. + + + + + + key: appenderName, value: appender. + + + + + The fully qualified type of the XmlHierarchyConfigurator class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Basic Configurator interface for repositories + + + + Interface used by basic configurator to configure a + with a default . + + + A should implement this interface to support + configuration by the . + + + Nicko Cadell + Gert Driesen + + + + Initialize the repository using the specified appender + + the appender to use to log all logging events + + + Configure the repository to route all logging events to the + specified appender. + + + + + + Initialize the repository using the specified appenders + + the appenders to use to log all logging events + + + Configure the repository to route all logging events to the + specified appenders. + + + + + + Delegate used to handle logger repository shutdown event notifications. + + The that is shutting down. + Empty event args + + + + Delegate used to handle logger repository configuration reset event notifications. + + The that has had its configuration reset. + Empty event args + + + + Delegate used to handle event notifications for logger repository configuration changes. + + The that has had its configuration changed. + Empty event arguments. + + + + Interface implemented by logger repositories, e.g. , and used by the + to obtain instances. + + Nicko Cadell + Gert Driesen + + + + Gets or sets the name of the repository. + + + + + Gets the map from types to instances for custom rendering. + + + + + Gets the map from plugin name to plugin value for plugins attacked to this repository. + + + + + Gets the map from level names and values for this repository. + + + + + Gets or sets the threshold for all events in this repository. + + + + + Gets the named logger, or null. + + The name of the logger to look up. + The logger if found, or null. + + + + Gets all the currently defined loggers. + + + + + Returns a named logger instance + + The name of the logger to retrieve + The logger object with the name specified + + + Returns a named logger instance. + + + If a logger of that name already exists, then it will be + returned. Otherwise, a new logger will be instantiated and + then linked with its existing ancestors as well as children. + + + + + + Shuts down the repository, safely closing and removing + all appenders in all loggers including the root logger. + + + + Some appenders need to be closed before the + application exists. Otherwise, pending logging events might be + lost. + + + The method is careful to close nested + appenders before closing regular appenders. This allows + configurations where a regular appender is attached to a logger + and again to a nested appender. + + + + + + Resets the repository configuration to a default state. Loggers are reset but not removed. + + + + This method should be used sparingly and with care as it will + block all logging until it is completed. + + + + + + Logs a through this repository. + + The event to log. + + + This method should not normally be used to log. + The interface should be used + for routine logging. This interface can be obtained + using the method. + + + The logEvent is delivered to the appropriate logger and + that logger is then responsible for logging the event. + + + + + + Gets or sets a value that indicates whether this repository has been configured. + + + + + Collection of internal messages captured during the most + recent configuration process. + + + + + Event to notify that the repository has been shut down. + + + + + Event to notify that the repository has had its configuration reset to default. + + + + + Event to notify that the repository's configuration has changed. + + + + + Repository specific properties. + + + + + Gets all Appenders that are configured for this repository. + + + + + Configure repository using XML + + + + Interface used by Xml configurator to configure a . + + + A should implement this interface to support + configuration by the . + + + Nicko Cadell + Gert Driesen + + + + Initialize the repository using the specified config + + the element containing the root of the config + + + The schema for the XML configuration data is defined by + the implementation. + + + + + + Base implementation of + + + + Default abstract implementation of the interface. + + + Skeleton implementation of the interface. + All types can extend this type. + + + Nicko Cadell + Gert Driesen + + + + Default Constructor + + + + Initializes the repository with default (empty) properties. + + + + + + Construct the repository using specific properties + + the properties to set for this repository + + + Initializes the repository with specified properties. + + + + + + The name of the repository + + + The string name of the repository + + + + The name of this repository. The name is + used to store and lookup the repositories + stored by the . + + + + + + The threshold for all events in this repository + + + The threshold for all events in this repository + + + + The threshold for all events in this repository + + + + + + RendererMap accesses the object renderer map for this repository. + + + RendererMap accesses the object renderer map for this repository. + + + + RendererMap accesses the object renderer map for this repository. + + + The RendererMap holds a mapping between types and + objects. + + + + + + The plugin map for this repository. + + + The plugin map for this repository. + + + + The plugin map holds the instances + that have been attached to this repository. + + + + + + Get the level map for the Repository. + + + + Get the level map for the Repository. + + + The level map defines the mappings between + level names and objects in + this repository. + + + + + + Test if logger exists + + The name of the logger to lookup + The Logger object with the name specified + + + Check if the named logger exists in the repository. If so return + its reference, otherwise returns null. + + + + + + Returns all the currently defined loggers in the repository + + All the defined loggers + + + Returns all the currently defined loggers in the repository as an Array. + + + + + + Return a new logger instance + + The name of the logger to retrieve + The logger object with the name specified + + + Return a new logger instance. + + + If a logger of that name already exists, then it will be + returned. Otherwise, a new logger will be instantiated and + then linked with its existing ancestors as well as children. + + + + + + Shutdown the repository + + + + Shutdown the repository. Can be overridden in a subclass. + This base class implementation notifies the + listeners and all attached plugins of the shutdown event. + + + + + + Reset the repositories configuration to a default state + + + + Reset all values contained in this instance to their + default state. + + + Existing loggers are not removed. They are just reset. + + + This method should be used sparingly and with care as it will + block all logging until it is completed. + + + + + + Log the logEvent through this repository. + + the event to log + + + This method should not normally be used to log. + The interface should be used + for routine logging. This interface can be obtained + using the method. + + + The logEvent is delivered to the appropriate logger and + that logger is then responsible for logging the event. + + + + + + Flag indicates if this repository has been configured. + + + + + Contains a list of internal messages captured during the + last configuration. + + + + + Event to notify that the repository has been shutdown. + + + Event to notify that the repository has been shutdown. + + + + Event raised when the repository has been shutdown. + + + + + + Event to notify that the repository has had its configuration reset. + + + Event to notify that the repository has had its configuration reset. + + + + Event raised when the repository's configuration has been + reset to default. + + + + + + Event to notify that the repository has had its configuration changed. + + + Event to notify that the repository has had its configuration changed. + + + + Event raised when the repository's configuration has been changed. + + + + + + Repository specific properties + + + Repository specific properties + + + These properties can be specified on a repository specific basis + + + + + Returns all the Appenders that are configured as an Array. + + All the Appenders + + + Returns all the Appenders that are configured as an Array. + + + + + + The fully qualified type of the LoggerRepositorySkeleton class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Adds an object renderer for a specific class. + + The type that will be rendered by the renderer supplied. + The object renderer used to render the object. + + + Adds an object renderer for a specific class. + + + + + + Notify the registered listeners that the repository is shutting down + + Empty EventArgs + + + Notify any listeners that this repository is shutting down. + + + + + + Notify the registered listeners that the repository has had its configuration reset + + Empty EventArgs + + + Notify any listeners that this repository's configuration has been reset. + + + + + + Notify the registered listeners that the repository has had its configuration changed + + Empty EventArgs + + + + Raise a configuration changed event on this repository + + EventArgs.Empty + + + Applications that programmatically change the configuration of the repository should + raise this event notification to notify listeners. + + + + + + Flushes all configured Appenders that implement . + + The maximum time in milliseconds to wait for logging events from asynchronous appenders to be flushed, + or to wait indefinitely. + True if all logging events were flushed successfully, else false. + + + + The log4net Thread Context. + + + + The ThreadContext provides a location for thread specific debugging + information to be stored. + The ThreadContext properties override any + properties with the same name. + + + The thread context has a properties map and a stack. + The properties and stack can + be included in the output of log messages. The + supports selecting and outputting these properties. + + + The Thread Context provides a diagnostic context for the current thread. + This is an instrument for distinguishing interleaved log + output from different sources. Log output is typically interleaved + when a server handles multiple clients near-simultaneously. + + + The Thread Context is managed on a per thread basis. + + + Example of using the thread context properties to store a username. + + ThreadContext.Properties["user"] = userName; + log.Info("This log message has a ThreadContext Property called 'user'"); + + + Example of how to push a message into the context stack + + using(ThreadContext.Stacks["NDC"].Push("my context message")) + { + log.Info("This log message has a ThreadContext Stack message that includes 'my context message'"); + + } // at the end of the using block the message is automatically popped + + + + Nicko Cadell + + + + The thread properties map + + + The thread properties map + + + + The ThreadContext properties override any + properties with the same name. + + + + + + The thread stacks + + + stack map + + + + The thread local stacks. + + + + + + A straightforward implementation of the interface. + + + + This is the default implementation of the + interface. Implementors of the interface + should aggregate an instance of this type. + + + Nicko Cadell + Gert Driesen + + + + Constructor + + + + Initializes a new instance of the class. + + + + + + Append on on all attached appenders. + + The event being logged. + The number of appenders called. + + + Calls the method on all + attached appenders. + + + + + + Append on on all attached appenders. + + The array of events being logged. + The number of appenders called. + + + Calls the method on all + attached appenders. + + + + + + Calls the DoAppende method on the with + the objects supplied. + + The appender + The events + + + If the supports the + interface then the will be passed + through using that interface. Otherwise the + objects in the array will be passed one at a time. + + + + + + Attaches an appender. + + The appender to add. + + + If the appender is already in the list it won't be added again. + + + + + + Gets all attached appenders. + + + A collection of attached appenders, or null if there + are no attached appenders. + + + + The read only collection of all currently attached appenders. + + + + + + Gets an attached appender with the specified name. + + The name of the appender to get. + + The appender with the name specified, or null if no appender with the + specified name is found. + + + + Lookup an attached appender by name. + + + + + + Removes all attached appenders. + + + + Removes and closes all attached appenders + + + + + + Removes the specified appender from the list of attached appenders. + + The appender to remove. + The appender removed from the list + + + The appender removed is not closed. + If you are discarding the appender you must call + on the appender removed. + + + + + + Removes the appender with the specified name from the list of appenders. + + The name of the appender to remove. + The appender removed from the list + + + The appender removed is not closed. + If you are discarding the appender you must call + on the appender removed. + + + + + + List of appenders + + + + + Array of appenders, used to cache the appenderList + + + + + The fully qualified type of the AppenderAttachedImpl class. + + + Used by the internal logger to record the Type of the + log message. + + + + + This class aggregates several PropertiesDictionary collections together. + + + + Provides a dictionary style lookup over an ordered list of + collections. + + + Nicko Cadell + + + + Constructor + + + + Initializes a new instance of the class. + + + + + + Gets the value of a property + + + The value for the property with the specified key + + + + Looks up the value for the specified. + The collections are searched + in the order in which they were added to this collection. The value + returned is the value held by the first collection that contains + the specified key. + + + If none of the collections contain the specified key then + null is returned. + + + + + + Add a Properties Dictionary to this composite collection + + the properties to add + + + Properties dictionaries added first take precedence over dictionaries added + later. + + + + + + Flatten this composite collection into a single properties dictionary + + the flattened dictionary + + + Reduces the collection of ordered dictionaries to a single dictionary + containing the resultant values for the keys. + + + + + + Base class for Context Properties implementations + + Nicko Cadell + + + + Gets or sets the value of a property. + + + + + Wrapper class used to map converter names to converter types + + + + Pattern converter info class used during configuration by custom + PatternString and PatternLayer converters. + + + + + + Gets or sets the name of the conversion pattern in the format string. + + + + + Gets or sets the type of the converter. The type must extend . + + + + + + + + + + + + + + + + Subclass of that maintains a count of + the number of bytes written. + + + + This writer counts the number of bytes written. + + + Nicko Cadell + Gert Driesen + + + + Constructor + + The to actually write to. + The to report errors to. + + + Creates a new instance of the class + with the specified and . + + + + + + Writes a character to the underlying writer and counts the number of bytes written. + + the char to write + + + Overrides implementation of . Counts + the number of bytes written. + + + + + + Writes a buffer to the underlying writer and counts the number of bytes written. + + the buffer to write + the start index to write from + the number of characters to write + + + Overrides implementation of . Counts + the number of bytes written. + + + + + + Writes a string to the output and counts the number of bytes written. + + The string data to write to the output. + + + Overrides implementation of . Counts + the number of bytes written. + + + + + + Gets or sets the total number of bytes written. + + + The total number of bytes written. + + + + Gets or sets the total number of bytes written. + + + + + + A fixed size rolling buffer of logging events. + + + + An array backed fixed size leaky bucket. + + + Nicko Cadell + Gert Driesen + + + + Constructor + + The maximum number of logging events in the buffer. + + + Initializes a new instance of the class with + the specified maximum number of buffered logging events. + + + The argument is not a positive integer. + + + + Appends a to the buffer. + + The event to append to the buffer. + The event discarded from the buffer, if the buffer is full, otherwise null. + + + Append an event to the buffer. If the buffer still contains free space then + null is returned. If the buffer is full then an event will be dropped + to make space for the new event, the dropped event is returned. + + + + + + Get and remove the oldest event in the buffer. + + The oldest logging event in the buffer + + + Gets the oldest (first) logging event in the buffer and removes it + from the buffer. + + + + + + Pops all the logging events from the buffer into an array. + + An array of all the logging events in the buffer. + + + Get all the events in the buffer and clear the buffer. + + + + + + Clear the buffer + + + + Clear the buffer of all events. The events in the buffer are lost. + + + + + + Gets the th oldest event currently in the buffer. + + + + If is outside the range 0 to the number of events + currently in the buffer, then null is returned. + + + + + + Gets the maximum size of the buffer. + + The maximum size of the buffer. + + + Gets the maximum size of the buffer + + + + + + Gets the number of logging events in the buffer. + + The number of logging events in the buffer. + + + This number is guaranteed to be in the range 0 to + (inclusive). + + + + + + An always empty . + + + + A singleton implementation of the + interface that always represents an empty collection. + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + + Uses a private access modifier to enforce the singleton pattern. + + + + + + Gets the singleton instance of the empty collection. + + The singleton instance of the empty collection. + + + Gets the singleton instance of the empty collection. + + + + + + Copies the elements of the to an + , starting at a particular Array index. + + The one-dimensional + that is the destination of the elements copied from + . The Array must have zero-based + indexing. + The zero-based index in array at which + copying begins. + + + As the collection is empty no values are copied into the array. + + + + + + Gets a value indicating if access to the is synchronized (thread-safe). + + + true if access to the is synchronized (thread-safe); otherwise, false. + + + + For the this property is always true. + + + + + + Gets the number of elements contained in the . + + + The number of elements contained in the . + + + + As the collection is empty the is always 0. + + + + + + Gets an object that can be used to synchronize access to the . + + + An object that can be used to synchronize access to the . + + + + As the collection is empty and thread safe and synchronized this instance is also + the object. + + + + + + Returns an enumerator that can iterate through a collection. + + + An that can be used to + iterate through the collection. + + + + As the collection is empty a is returned. + + + + + + An always empty . + + + + A singleton implementation of the + interface that always represents an empty collection. + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + + Uses a private access modifier to enforce the singleton pattern. + + + + + + Gets the singleton instance of the . + + The singleton instance of the . + + + Gets the singleton instance of the . + + + + + + Copies the elements of the to an + , starting at a particular Array index. + + The one-dimensional + that is the destination of the elements copied from + . The Array must have zero-based + indexing. + The zero-based index in array at which + copying begins. + + + As the collection is empty no values are copied into the array. + + + + + + Gets a value indicating if access to the is synchronized (thread-safe). + + + true if access to the is synchronized (thread-safe); otherwise, false. + + + + For the this property is always true. + + + + + + Gets the number of elements contained in the + + + The number of elements contained in the . + + + + As the collection is empty the is always 0. + + + + + + Gets an object that can be used to synchronize access to the . + + + An object that can be used to synchronize access to the . + + + + As the collection is empty and thread safe and synchronized this instance is also + the object. + + + + + + Returns an enumerator that can iterate through a collection. + + + An that can be used to + iterate through the collection. + + + + As the collection is empty a is returned. + + + + + + Adds an element with the provided key and value to the + . + + The to use as the key of the element to add. + The to use as the value of the element to add. + + + As the collection is empty no new values can be added. A + is thrown if this method is called. + + + This dictionary is always empty and cannot be modified. + + + + Removes all elements from the . + + + + As the collection is empty no values can be removed. A + is thrown if this method is called. + + + This dictionary is always empty and cannot be modified. + + + + Determines whether the contains an element + with the specified key. + + The key to locate in the . + false + + + As the collection is empty the method always returns false. + + + + + + Returns an enumerator that can iterate through a collection. + + + An that can be used to + iterate through the collection. + + + + As the collection is empty a is returned. + + + + + + Removes the element with the specified key from the . + + The key of the element to remove. + + + As the collection is empty no values can be removed. A + is thrown if this method is called. + + + This dictionary is always empty and cannot be modified. + + + + Gets a value indicating whether the has a fixed size. + + true + + + As the collection is empty always returns true. + + + + + + Gets a value indicating whether the is read-only. + + true + + + As the collection is empty always returns true. + + + + + + Gets an containing the keys of the . + + An containing the keys of the . + + + As the collection is empty a is returned. + + + + + + Gets an containing the values of the . + + An containing the values of the . + + + As the collection is empty a is returned. + + + + + + Gets or sets the element with the specified key. + + The key of the element to get or set. + null + + + As the collection is empty no values can be looked up or stored. + If the index getter is called then null is returned. + A is thrown if the setter is called. + + + This dictionary is always empty and cannot be modified. + + + + Wrapper for an + + acts like the wrapped encoding, but without a preamble + + + + + + + wraps the in case it has a preamble + + Encoding to check + encoding without preamble + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Contain the information obtained when parsing formatting modifiers + in conversion modifiers. + + + + Holds the formatting information extracted from the format string by + the . This is used by the + objects when rendering the output. + + + Nicko Cadell + Gert Driesen + + + + Defaut Constructor + + + + Initializes a new instance of the class. + + + + + + Constructor + + + + Initializes a new instance of the class + with the specified parameters. + + + + + + Gets or sets the minimum value. + + + + + Gets or sets the maximum value. + + + + + Gets or sets a flag indicating whether left align is enabled. + or not. + + + + + Implementation of Properties collection for the + + + + This class implements a properties collection that is thread safe and supports both + storing properties and capturing a read only copy of the current propertied. + + + This class is optimized to the scenario where the properties are read frequently + and are modified infrequently. + + + Nicko Cadell + + + + The read only copy of the properties. + + + + This variable is declared volatile to prevent the compiler and JIT from + reordering reads and writes of this thread performed on different threads. + + + + + + Lock object used to synchronize updates within this instance + + + + + Constructor + + + + Initializes a new instance of the class. + + + + + + Gets or sets the value of a property + + + The value for the property with the specified key + + + + Reading the value for a key is faster than setting the value. + When the value is written a new read only copy of + the properties is created. + + + + + + Remove a property from the global context + + the key for the entry to remove + + + Removing an entry from the global context properties is relatively expensive compared + with reading a value. + + + + + + Clear the global context properties + + + + + Get a readonly immutable copy of the properties + + the current global context properties + + + This implementation is fast because the GlobalContextProperties class + stores a readonly copy of the properties. + + + + + + The static class ILogExtensions contains a set of widely used + methods that ease the interaction with the ILog interface implementations. + + + + This class contains methods for logging at different levels and checks the + properties for determining if those logging levels are enabled in the current + configuration. + + + Simple example of logging messages + + using log4net.Util; + + ILog log = LogManager.GetLogger("application-log"); + + log.InfoExt("Application Start"); + log.DebugExt("This is a debug message"); + + + + + + The fully qualified type of the Logger class. + + + + + Log a message object with the level. + + The logger on which the message is logged. + The lambda expression that gets the object to log. + + + This method first checks if this logger is INFO + enabled by reading the value property. + This check happens always and does not depend on the + implementation. If this logger is INFO enabled, then it converts + the message object (retrieved by invocation of the provided callback) to a + string by invoking the appropriate . + It then proceeds to call all the registered appenders in this logger + and also higher in the hierarchy depending on the value of + the additivity flag. + + WARNING Note that passing an + to this method will print the name of the + but no stack trace. To print a stack trace use the + form instead. + + + + + + + + Log a message object with the level including + the stack trace of the passed + as a parameter. + + The logger on which the message is logged. + The lambda expression that gets the object to log. + The exception to log, including its stack trace. + + + See the form for more detailed information. + + + + + + + Log a message object with the level. //TODO + + Log a message object with the level. + + The logger on which the message is logged. + The message object to log. + + + This method first checks if this logger is INFO + enabled by reading the value property. + This check happens always and does not depend on the + implementation. If this logger is INFO enabled, then it converts + the message object (passed as parameter) to a string by invoking the appropriate + . It then + proceeds to call all the registered appenders in this logger + and also higher in the hierarchy depending on the value of + the additivity flag. + + WARNING Note that passing an + to this method will print the name of the + but no stack trace. To print a stack trace use the + form instead. + + + + + + + + Log a message object with the level including + the stack trace of the passed + as a parameter. + + The logger on which the message is logged. + The message object to log. + The exception to log, including its stack trace. + + + See the form for more detailed information. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + An that supplies culture-specific formatting information + The logger on which the message is logged. + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object to format + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Log a message object with the level. + + The logger on which the message is logged. + The lambda expression that gets the object to log. + + + This method first checks if this logger is INFO + enabled by reading the value property. + This check happens always and does not depend on the + implementation. If this logger is INFO enabled, then it converts + the message object (retrieved by invocation of the provided callback) to a + string by invoking the appropriate . + It then proceeds to call all the registered appenders in this logger + and also higher in the hierarchy depending on the value of + the additivity flag. + + WARNING Note that passing an + to this method will print the name of the + but no stack trace. To print a stack trace use the + form instead. + + + + + + + + Log a message object with the level including + the stack trace of the passed + as a parameter. + + The logger on which the message is logged. + The lambda expression that gets the object to log. + The exception to log, including its stack trace. + + + See the form for more detailed information. + + + + + + + Log a message object with the level. //TODO + + Log a message object with the level. + + The logger on which the message is logged. + The message object to log. + + + This method first checks if this logger is INFO + enabled by reading the value property. + This check happens always and does not depend on the + implementation. If this logger is INFO enabled, then it converts + the message object (passed as parameter) to a string by invoking the appropriate + . It then + proceeds to call all the registered appenders in this logger + and also higher in the hierarchy depending on the value of + the additivity flag. + + WARNING Note that passing an + to this method will print the name of the + but no stack trace. To print a stack trace use the + form instead. + + + + + + + + Log a message object with the level including + the stack trace of the passed + as a parameter. + + The logger on which the message is logged. + The message object to log. + The exception to log, including its stack trace. + + + See the form for more detailed information. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + An that supplies culture-specific formatting information + The logger on which the message is logged. + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object to format + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Log a message object with the level. + + The logger on which the message is logged. + The lambda expression that gets the object to log. + + + This method first checks if this logger is WARN + enabled by reading the value property. + This check happens always and does not depend on the + implementation. If this logger is WARN enabled, then it converts + the message object (retrieved by invocation of the provided callback) to a + string by invoking the appropriate . + It then proceeds to call all the registered appenders in this logger + and also higher in the hierarchy depending on the value of + the additivity flag. + + WARNING Note that passing an + to this method will print the name of the + but no stack trace. To print a stack trace use the + form instead. + + + + + + + + Log a message object with the level including + the stack trace of the passed + as a parameter. + + The logger on which the message is logged. + The lambda expression that gets the object to log. + The exception to log, including its stack trace. + + + See the form for more detailed information. + + + + + + + Log a message object with the level. //TODO + + Log a message object with the level. + + The logger on which the message is logged. + The message object to log. + + + This method first checks if this logger is WARN + enabled by reading the value property. + This check happens always and does not depend on the + implementation. If this logger is WARN enabled, then it converts + the message object (passed as parameter) to a string by invoking the appropriate + . It then + proceeds to call all the registered appenders in this logger + and also higher in the hierarchy depending on the value of + the additivity flag. + + WARNING Note that passing an + to this method will print the name of the + but no stack trace. To print a stack trace use the + form instead. + + + + + + + + Log a message object with the level including + the stack trace of the passed + as a parameter. + + The logger on which the message is logged. + The message object to log. + The exception to log, including its stack trace. + + + See the form for more detailed information. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + An that supplies culture-specific formatting information + The logger on which the message is logged. + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object to format + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Log a message object with the level. + + The logger on which the message is logged. + The lambda expression that gets the object to log. + + + This method first checks if this logger is ERROR + enabled by reading the value property. + This check happens always and does not depend on the + implementation. If this logger is ERROR enabled, then it converts + the message object (retrieved by invocation of the provided callback) to a + string by invoking the appropriate . + It then proceeds to call all the registered appenders in this logger + and also higher in the hierarchy depending on the value of + the additivity flag. + + WARNING Note that passing an + to this method will print the name of the + but no stack trace. To print a stack trace use the + form instead. + + + + + + + + Log a message object with the level including + the stack trace of the passed + as a parameter. + + The logger on which the message is logged. + The lambda expression that gets the object to log. + The exception to log, including its stack trace. + + + See the form for more detailed information. + + + + + + + Log a message object with the level. //TODO + + Log a message object with the level. + + The logger on which the message is logged. + The message object to log. + + + This method first checks if this logger is ERROR + enabled by reading the value property. + This check happens always and does not depend on the + implementation. If this logger is ERROR enabled, then it converts + the message object (passed as parameter) to a string by invoking the appropriate + . It then + proceeds to call all the registered appenders in this logger + and also higher in the hierarchy depending on the value of + the additivity flag. + + WARNING Note that passing an + to this method will print the name of the + but no stack trace. To print a stack trace use the + form instead. + + + + + + + + Log a message object with the level including + the stack trace of the passed + as a parameter. + + The logger on which the message is logged. + The message object to log. + The exception to log, including its stack trace. + + + See the form for more detailed information. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + An that supplies culture-specific formatting information + The logger on which the message is logged. + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object to format + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Log a message object with the level. + + The logger on which the message is logged. + The lambda expression that gets the object to log. + + + This method first checks if this logger is FATAL + enabled by reading the value property. + This check happens always and does not depend on the + implementation. If this logger is FATAL enabled, then it converts + the message object (retrieved by invocation of the provided callback) to a + string by invoking the appropriate . + It then proceeds to call all the registered appenders in this logger + and also higher in the hierarchy depending on the value of + the additivity flag. + + WARNING Note that passing an + to this method will print the name of the + but no stack trace. To print a stack trace use the + form instead. + + + + + + + + Log a message object with the level including + the stack trace of the passed + as a parameter. + + The logger on which the message is logged. + The lambda expression that gets the object to log. + The exception to log, including its stack trace. + + + See the form for more detailed information. + + + + + + + Log a message object with the level. //TODO + + Log a message object with the level. + + The logger on which the message is logged. + The message object to log. + + + This method first checks if this logger is FATAL + enabled by reading the value property. + This check happens always and does not depend on the + implementation. If this logger is FATAL enabled, then it converts + the message object (passed as parameter) to a string by invoking the appropriate + . It then + proceeds to call all the registered appenders in this logger + and also higher in the hierarchy depending on the value of + the additivity flag. + + WARNING Note that passing an + to this method will print the name of the + but no stack trace. To print a stack trace use the + form instead. + + + + + + + + Log a message object with the level including + the stack trace of the passed + as a parameter. + + The logger on which the message is logged. + The message object to log. + The exception to log, including its stack trace. + + + See the form for more detailed information. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + An that supplies culture-specific formatting information + The logger on which the message is logged. + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object to format + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Manages an ordered mapping from instances + to subclasses. + + Nicko Cadell + + + + Add a to this mapping + + the entry to add + + + If a has previously been added + for the same then that entry will be + overwritten. + + + + + + Looks up the value for the specified level. Finds the nearest + mapping value for the level that is equal to or less than the + specified. + + the level to look up. + The for the level or if no mapping found + + + + Initialize options + + + Caches the sorted list of + + + + + An abstract base class for types that are stored in the + object. + + Nicko Cadell + + + + Default protected constructor + + + + + Gets or sets the level that is the key for this mapping. + + + + + Initialize any options defined on this entry + + + + Should be overridden by any classes that need to initialize based on their options + + + + + + Class for assertions + + + + + Ensures that is not and returns the validated value + + Type of + Value to validate + Name of the value + Error message (optional) + Value (when not null) + + + + + Ensures that is not null and an instance of + and returns the validated value + + Type to check for + Value to validate + Name of the value + Error message (optional) + Value (when not null and of the required type) + + + + + + Determines whether this is a fatal exception that should not be handled + + Exception + , if it is a fatal exception, otherwise + + + + Implementation of Properties collection for the + + + + Class implements a collection of properties that is specific to each thread. + The class is not synchronized as each thread has its own . + + + This class stores its properties in a slot on the named + for .net4x, + otherwise System.Threading.AsyncLocal + + + Nicko Cadell + + + + Flag used to disable this context if we don't have permission to access the CallContext. + + + + + Constructor + + + + Initializes a new instance of the class. + + + + + + + + + Remove a property + + the key for the entry to remove + + + Remove the value for the specified from the context. + + + + + + Clear all the context properties + + + + Clear all the context properties + + + + + + Get the PropertiesDictionary stored in the LocalDataStoreSlot for this thread. + + create the dictionary if it does not exist, otherwise return null if it does not exist + the properties for this thread + + + The collection returned is only to be used on the calling thread. If the + caller needs to share the collection between different threads then the + caller must clone the collection before doings so. + + + + + + Gets the call context get data. + + The properties dictionary stored in the call context + + The method GetData security link demand, therefore we must + put the method call in a separate method that we can wrap in an exception handler. + + + + + Sets the call context data. + + The properties. + + The method SetData has a security link demand, therefore we must + put the method call in a separate method that we can wrap in an exception handler. + + + + + The fully qualified type of the LogicalThreadContextProperties class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Delegate type used for LogicalThreadContextStack's callbacks. + + + + + Implementation of Stack for the + + Nicko Cadell + + + + The stack store. + + + + + The name of this within the + . + + + + + The callback used to let the register a + new instance of a . + + + + + Internal constructor + + + + Initializes a new instance of the class. + + + + + + Gets the number of messages in the stack. + + + + The current number of messages in the stack. That is + the number of times has been called + minus the number of times has been called. + + + + + + Clears all the contextual information held in this stack. + + + + Clears all the contextual information held in this stack. + Only call this if you think that this thread is being reused after + a previous call execution which may not have completed correctly. + You do not need to use this method if you always guarantee to call + the method of the + returned from even in exceptional circumstances, + for example by using the using(log4net.LogicalThreadContext.Stacks["NDC"].Push("Stack_Message")) + syntax. + + + + + + Removes the top context from this stack. + + The message in the context that was removed from the top of this stack. + + + Remove the top context from this stack, and return + it to the caller. If this stack is empty then an + empty string (not ) is returned. + + + + + + Pushes a new context message into this stack. + + The new context message. + + An that can be used to clean up the context stack. + + + + Pushes a new context onto this stack. An + is returned that can be used to clean up this stack. This + can be easily combined with the using keyword to scope the + context. + + + Simple example of using the Push method with the using keyword. + + using(log4net.LogicalThreadContext.Stacks["NDC"].Push("Stack_Message")) + { + log.Warn("This should have an ThreadContext Stack message"); + } + + + + + + Returns the top context from this stack. + + The message in the context from the top of this stack. + + + Returns the top context from this stack. If this stack is empty then an + empty string (not ) is returned. + + + + + + Gets the current context information for this stack. + + The current context information. + + + + Gets the current context information for this stack. + + Gets the current context information + + + + Gets a cross-thread portable version of this object + + + + + Inner class used to represent a single context frame in the stack. + + + + + Constructor + + The message for this context. + The parent context in the chain. + + + Initializes a new instance of the class + with the specified message and parent context. + + + + + + Get the message. + + The message. + + + Get the message. + + + + + + Gets the full text of the context down to the root level. + + + The full text of the context down to the root level. + + + + Gets the full text of the context down to the root level. + + + + + + Struct returned from the method. + + + + This struct implements the and is designed to be used + with the pattern to remove the stack frame at the end of the scope. + + + + + + The depth to trim the stack to when this instance is disposed + + + + + The outer LogicalThreadContextStack. + + + + + Constructor + + The internal stack used by the ThreadContextStack. + The depth to return the stack to when this object is disposed. + + + Initializes a new instance of the class with + the specified stack and return depth. + + + + + + Returns the stack to the correct depth. + + + + Returns the stack to the correct depth. + + + + + + Implementation of Stacks collection for the + + Nicko Cadell + + + + Internal constructor + + + + Initializes a new instance of the class. + + + + + + Gets the named thread context stack + + + The named stack + + + + Gets the named thread context stack + + + + + + The fully qualified type of the ThreadContextStacks class. + + + Used by the internal logger to record the Type of the + log message. + + + + + LogReceivedEventHandler + + + + + Outputs log statements from within the log4net assembly. + + + + Log4net components cannot make log4net logging calls. However, it is + sometimes useful for the user to learn about what log4net is + doing. + + + All log4net internal debug calls go to the standard output stream + whereas internal error messages are sent to the standard error output + stream. + + + Nicko Cadell + Gert Driesen + + + + The event raised when an internal message has been received. + + + + + The Type that generated the internal message. + + + + + The DateTime stamp of when the internal message was received. + + + + + The UTC DateTime stamp of when the internal message was received. + + + + + A string indicating the severity of the internal message. + + + "log4net: ", + "log4net:ERROR ", + "log4net:WARN " + + + + + The internal log message. + + + + + The Exception related to the message. + + + Optional. Will be null if no Exception was passed. + + + + + Formats Prefix, Source, and Message in the same format as the value + sent to Console.Out and Trace.Write. + + + + + + Initializes a new instance of the class. + + + + + Static constructor that initializes logging by reading + settings from the application configuration file. + + + + The log4net.Internal.Debug application setting + controls internal debugging. This setting should be set + to true to enable debugging. + + + The log4net.Internal.Quiet application setting + suppresses all internal logging including error messages. + This setting should be set to true to enable message + suppression. + + + + + + Gets or sets a value indicating whether log4net internal logging + is enabled or disabled. + + + true if log4net internal logging is enabled, otherwise + false. + + + + When set to true, internal debug level logging will be + displayed. + + + This value can be set by setting the application setting + log4net.Internal.Debug in the application configuration + file. + + + The default value is false, i.e. debugging is + disabled. + + + + + The following example enables internal debugging using the + application configuration file : + + + + + + + + + + + + + Gets or sets a value indicating whether log4net should generate no output + from internal logging, not even for errors. + + + true if log4net should generate no output at all from internal + logging, otherwise false. + + + + When set to true will cause internal logging at all levels to be + suppressed. This means that no warning or error reports will be logged. + This option overrides the setting and + disables all debug also. + + This value can be set by setting the application setting + log4net.Internal.Quiet in the application configuration file. + + + The default value is false, i.e. internal logging is not + disabled. + + + + The following example disables internal logging using the + application configuration file : + + + + + + + + + + + + + + + + + Raises the LogReceived event when an internal messages is received. + + + + + + + + + Test if LogLog.Debug is enabled for output. + + + true if Debug is enabled + + + + Test if LogLog.Debug is enabled for output. + + + + + + Writes log4net internal debug messages to the + standard output stream. + + + The message to log. + + + All internal debug messages are prepended with + the string "log4net: ". + + + + + + Writes log4net internal debug messages to the + standard output stream. + + The Type that generated this message. + The message to log. + An exception to log. + + + All internal debug messages are prepended with + the string "log4net: ". + + + + + + Test if LogLog.Warn is enabled for output. + + + true if Warn is enabled + + + + + Writes log4net internal warning messages to the + standard error stream. + + The Type that generated this message. + The message to log. + + + All internal warning messages are prepended with + the string "log4net:WARN ". + + + + + + Writes log4net internal warning messages to the + standard error stream. + + The Type that generated this message. + The message to log. + An exception to log. + + + All internal warning messages are prepended with + the string "log4net:WARN ". + + + + + + Test if LogLog.Error is enabled for output. + + + true if Error is enabled + + + + Test if LogLog.Error is enabled for output. + + + + + + Writes log4net internal error messages to the + standard error stream. + + The Type that generated this message. + The message to log. + + + All internal error messages are prepended with + the string "log4net:ERROR ". + + + + + + Writes log4net internal error messages to the + standard error stream. + + The Type that generated this message. + The message to log. + An exception to log. + + + All internal debug messages are prepended with + the string "log4net:ERROR ". + + + + + + Writes output to the standard output stream. + + The message to log. + + + Writes to both Console.Out and System.Diagnostics.Trace. + + + If the AppDomain is not configured with a config file then + the call to System.Diagnostics.Trace may fail. This is only + an issue if you are programmatically creating your own AppDomains. + + + + + + Writes output to the standard error stream. + + The message to log. + + + Writes to both Console.Error and System.Diagnostics.Trace. + Note that the System.Diagnostics.Trace is not supported + on the Compact Framework. + + + If the AppDomain is not configured with a config file then + the call to System.Diagnostics.Trace may fail. This is only + an issue if you are programmatically creating your own AppDomains. + + + + + + Subscribes to the LogLog.LogReceived event and stores messages + to the supplied IList instance. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Represents a Win32 native error code and message. + + Nicko Cadell + Gert Driesen + + + + Create an instance of the class with the specified + error number and message. + + The number of the native error. + The message of the native error. + + + + Gets the number of the native error. + + + The number of the native error. + + + + Gets the number of the native error. + + + + + + Gets the message of the native error. + + + + + Creates a new instance of the class for the last Windows error. + + + An instance of the class for the last windows error. + + + + The message for the error number is lookup up using the + native Win32 FormatMessage function. + + + + + + Create a new instance of the class. + + the error number for the native error + + An instance of the class for the specified + error number. + + + + The message for the specified error number is lookup up using the + native Win32 FormatMessage function. + + + + + + Retrieves the message corresponding with a Win32 message identifier. + + Message identifier for the requested message. + + The message corresponding with the specified message identifier. + + + + The message will be searched for in system message-table resource(s) + using the native FormatMessage function. + + + + + + Return error information string + + error information string + + + Return error information string + + + + + + Native Methods + + Jan Friedrich + + + + Formats a message string. + + Formatting options, and how to interpret the parameter. + Location of the message definition. + Message identifier for the requested message. + Language identifier for the requested message. + If includes FORMAT_MESSAGE_ALLOCATE_BUFFER, the function allocates a buffer using the LocalAlloc function, and places the pointer to the buffer at the address specified in . + If the FORMAT_MESSAGE_ALLOCATE_BUFFER flag is not set, this parameter specifies the maximum number of TCHARs that can be stored in the output buffer. If FORMAT_MESSAGE_ALLOCATE_BUFFER is set, this parameter specifies the minimum number of TCHARs to allocate for an output buffer. + Pointer to an array of values that are used as insert values in the formatted message. + + + The function requires a message definition as input. The message definition can come from a + buffer passed into the function. It can come from a message table resource in an + already-loaded module. Or the caller can ask the function to search the system's message + table resource(s) for the message definition. The function finds the message definition + in a message table resource based on a message identifier and a language identifier. + The function copies the formatted message text to an output buffer, processing any embedded + insert sequences if requested. + + + To prevent the usage of unsafe code, this stub does not support inserting values in the formatted message. + + + + + If the function succeeds, the return value is the number of TCHARs stored in the output + buffer, excluding the terminating null character. + + + If the function fails, the return value is zero. To get extended error information, + call . + + + + + + Stub for OutputDebugString native method + + the string to output + + + + Open connection to system logger. + + + + + Generate a log message. + + + + The libc syslog method takes a format string and a variable argument list similar + to the classic printf function. As this type of vararg list is not supported + by C# we need to specify the arguments explicitly. Here we have specified the + format string with a single message argument. The caller must set the format + string to "%s". + + + + + + Close descriptor used to write to system logger. + + + + + An always empty . + + + + A singleton implementation of the over a collection + that is empty and not modifiable. + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + + Uses a private access modifier to enforce the singleton pattern. + + + + + + Gets the singleton instance of the . + + The singleton instance of the . + + + + Gets the current object from the enumerator. + + + Throws an because the + never has a current value. + + + + As the enumerator is over an empty collection its + value cannot be moved over a valid position, therefore + will throw an . + + + The collection is empty and + cannot be positioned over a valid location. + + + + Test if the enumerator can advance, if so advance. + + false as the cannot advance. + + + As the enumerator is over an empty collection its + value cannot be moved over a valid position, therefore + will always return false. + + + + + + Resets the enumerator back to the start. + + + + As the enumerator is over an empty collection does nothing. + + + + + + Gets the current key from the enumerator. + + + Throws an exception because the + never has a current value. + + + + As the enumerator is over an empty collection its + value cannot be moved over a valid position, therefore + will throw an . + + + The collection is empty and + cannot be positioned over a valid location. + + + + Gets the current value from the enumerator. + + The current value from the enumerator. + + Throws an because the + never has a current value. + + + + As the enumerator is over an empty collection its + value cannot be moved over a valid position, therefore + will throw an . + + + The collection is empty and + cannot be positioned over a valid location. + + + + Gets the current entry from the enumerator. + + + Throws an because the + never has a current entry. + + + + As the enumerator is over an empty collection its + value cannot be moved over a valid position, therefore + will throw an . + + + The collection is empty and + cannot be positioned over a valid location. + + + + An always empty . + + + + A singleton implementation of the over a collection + that is empty and not modifiable. + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + + Uses a private access modifier to enforce the singleton pattern. + + + + + + Get the singleton instance of the . + + The singleton instance of the . + + + + Gets the current object from the enumerator. + + + Throws an because the + never has a current value. + + + + As the enumerator is over an empty collection its + value cannot be moved over a valid position, therefore + will throw an . + + + The collection is empty and + cannot be positioned over a valid location. + + + + Test if the enumerator can advance, if so advance + + false as the cannot advance. + + + As the enumerator is over an empty collection its + value cannot be moved over a valid position, therefore + will always return false. + + + + + + Resets the enumerator back to the start. + + + + As the enumerator is over an empty collection does nothing. + + + + + + A SecurityContext used when a SecurityContext is not required + + + + The is a no-op implementation of the + base class. It is used where a + is required but one has not been provided. + + + Nicko Cadell + + + + Singleton instance of + + + + Singleton instance of + + + + + + Private constructor + + + + Private constructor for singleton pattern. + + + + + + Impersonate this SecurityContext + + State supplied by the caller + null + + + No impersonation is done and null is always returned. + + + + + + Implements log4net's default error handling policy which consists + of emitting a message for the first error in an appender and + ignoring all subsequent errors. + + + + The error message is processed using the LogLog sub-system by default. + + + This policy aims at protecting an otherwise working application + from being flooded with error messages when logging fails. + + + Nicko Cadell + Gert Driesen + Ron Grabowski + + + + Default Constructor + + + + Initializes a new instance of the class. + + + + + + Constructor + + The prefix to use for each message. + + + Initializes a new instance of the class + with the specified prefix. + + + + + + Reset the error handler back to its initial disabled state. + + + + + Log an Error + + The error message. + The exception. + The internal error code. + + + Invokes if and only if this is the first error or the first error after has been called. + + + + + + Log the very first error + + The error message. + The exception. + The internal error code. + + + Sends the error information to 's Error method. + + + + + + Log an Error + + The error message. + The exception. + + + Invokes if and only if this is the first error or the first error after has been called. + + + + + + Log an error + + The error message. + + + Invokes if and only if this is the first error or the first error after has been called. + + + + + + Is error logging enabled + + + + Logging is only enabled for the first error delivered to the . + + + + + + The date the first error that triggered this error handler occurred, or if it has not been triggered. + + + + + The UTC date the first error that triggered this error handler occured, or if it has not been triggered. + + + + + The message from the first error that triggered this error handler. + + + + + The exception from the first error that triggered this error handler. + + + May be . + + + + + The error code from the first error that triggered this error handler. + + + Defaults to + + + + + String to prefix each message with + + + + + The fully qualified type of the OnlyOnceErrorHandler class. + + + Used by the internal logger to record the Type of the + log message. + + + + + A convenience class to convert property values to specific types. + + + + Utility functions for converting types and parsing values. + + + Nicko Cadell + Gert Driesen + + + + Converts a string to a value. + + String to convert. + The default value. + The value of . + + + If is "true", then true is returned. + If is "false", then false is returned. + Otherwise, is returned. + + + + + + Parses a file size into a number. + + String to parse. + The default value. + The value of . + + + Parses a file size of the form: number[KB|MB|GB] into a + long value. It is scaled with the appropriate multiplier. + + + is returned when + cannot be converted to a value. + + + + + + Converts a string to an object. + + The target type to convert to. + The string to convert to an object. + + The object converted from a string or null when the + conversion failed. + + + + Converts a string to an object. Uses the converter registry to try + to convert the string value into the specified target type. + + + + + + Checks if there is an appropriate type conversion from the source type to the target type. + + The type to convert from. + The type to convert to. + true if there is a conversion from the source type to the target type. + + Checks if there is an appropriate type conversion from the source type to the target type. + + + + + + + Converts an object to the target type. + + The object to convert to the target type. + The type to convert to. + The converted object. + + + Converts an object to the target type. + + + + + + Instantiates an object given a class name. + + The fully qualified class name of the object to instantiate. + The class to which the new object should belong. + The object to return in case of non-fulfillment. + + An instance of the or + if the object could not be instantiated. + + + + Checks that the is a subclass of + . If that test fails or the object could + not be instantiated, then is returned. + + + + + + Performs variable substitution in string from the + values of keys found in . + + The string on which variable substitution is performed. + The dictionary to use to lookup variables. + The result of the substitutions. + + + The variable substitution delimiters are ${ and }. + + + For example, if props contains key=value, then the call + + + + string s = OptionConverter.SubstituteVariables("Value of key is ${key}."); + + + + will set the variable s to "Value of key is value.". + + + If no value could be found for the specified key, then substitution + defaults to an empty string. + + + For example, if system properties contains no value for the key + "nonExistentKey", then the call + + + + string s = OptionConverter.SubstituteVariables("Value of nonExistentKey is [${nonExistentKey}]"); + + + + will set s to "Value of nonExistentKey is []". + + + An Exception is thrown if contains a start + delimiter "${" which is not balanced by a stop delimiter "}". + + + + + + Converts the string representation of the name or numeric value of one or + more enumerated constants to an equivalent enumerated object. + + The type to convert to. + The enum string value. + If true, ignore case; otherwise, regard case. + An object of type whose value is represented by . + + + + The fully qualified type of the OptionConverter class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Abstract class that provides the formatting functionality that + derived classes need. + + + + Conversion specifiers in a conversion patterns are parsed to + individual PatternConverters. Each of which is responsible for + converting a logging event in a converter specific manner. + + + Nicko Cadell + Gert Driesen + + + + Protected constructor + + + + Initializes a new instance of the class. + + + + + + Gets the next pattern converter in the chain. + + + + + Gets or sets the formatting info for this converter + + + The formatting info for this converter + + + + Gets or sets the formatting info for this converter + + + + + + Gets or sets the option value for this converter + + + The option for this converter + + + + Gets or sets the option value for this converter + + + + + + Evaluate this pattern converter and write the output to a writer. + + that will receive the formatted result. + The state object on which the pattern converter should be executed. + + + Derived pattern converters must override this method in order to + convert conversion specifiers in the appropriate way. + + + + + + Set the next pattern converter in the chains + + the pattern converter that should follow this converter in the chain + the next converter + + + The PatternConverter can merge with its neighbor during this method (or a subclass). + Therefore the return value may or may not be the value of the argument passed in. + + + + + + Write the pattern converter to the writer with appropriate formatting + + that will receive the formatted result. + The state object on which the pattern converter should be executed. + + + This method calls to allow the subclass to perform + appropriate conversion of the pattern converter. If formatting options have + been specified via the then this method will + apply those formattings before writing the output. + + + + + + Fast space padding method. + + to which the spaces will be appended. + The number of spaces to be padded. + + + Fast space padding method. + + + + + + Initial buffer size + + + + + Maximum buffer size before it is recycled + + + + + Write an dictionary to a + + the writer to write to + a to use for object conversion + the value to write to the writer + + + Writes the to a writer in the form: + + + {key1=value1, key2=value2, key3=value3} + + + If the specified + is not null then it is used to render the key and value to text, otherwise + the object's ToString method is called. + + + + + + Writes a dictionary to a + + the writer to write to + a to use for object conversion + the value to write to the writer + + + Writes the to a writer in the form: + + + {key1=value1, key2=value2, key3=value3} + + + If the specified + is not null then it is used to render the key and value to text, otherwise + the object's ToString method is called. + + + + + + Write an object to a + + the writer to write to + a to use for object conversion + the value to write to the writer + + + Writes the Object to a writer. If the specified + is not null then it is used to render the object to text, otherwise + the object's ToString method is called. + + + + + + + + + + + Most of the work of the class + is delegated to the PatternParser class. + + + + The PatternParser processes a pattern string and + returns a chain of objects. + + + Nicko Cadell + Gert Driesen + + + + Constructor + + The pattern to parse. + + + Initializes a new instance of the class + with the specified pattern string. + + + + + + Parses the pattern into a chain of pattern converters. + + The head of a chain of pattern converters. + + + + Gets the converter registry used by this parser. + + + + + Build the unified cache of converters from the static and instance maps + + the list of all the converter names + + + + Sort strings by length + + + + that orders strings by string length. + The longest strings are placed first + + + + + + Internal method to parse the specified pattern to find specified matches + + the pattern to parse + the converter names to match in the pattern + + + The matches param must be sorted such that longer strings come before shorter ones. + + + + + + Process a parsed literal + + the literal text + + + + Process a parsed converter pattern + + the name of the converter + the optional option for the converter + the formatting info for the converter + + + + Resets the internal state of the parser and adds the specified pattern converter + to the chain. + + The pattern converter to add. + + + + The first pattern converter in the chain + + + + + the last pattern converter in the chain + + + + + The pattern + + + + + The fully qualified type of the PatternParser class. + + + Used by the internal logger to record the Type of the + log message. + + + + + This class implements a patterned string. + + + + This string has embedded patterns that are resolved and expanded + when the string is formatted. + + + This class functions similarly to the + in that it accepts a pattern and renders it to a string. Unlike the + however the PatternString + does not render the properties of a specific but + of the process in general. + + + The recognized conversion pattern names are: + + + + Conversion Pattern Name + Effect + + + appdomain + + + Used to output the friendly name of the current AppDomain. + + + + + appsetting + + + Used to output the value of a specific appSetting key in the application + configuration file. + + + + + date + + + Used to output the current date and time in the local time zone. + To output the date in universal time use the %utcdate pattern. + The date conversion + specifier may be followed by a date format specifier enclosed + between braces. For example, %date{HH:mm:ss,fff} or + %date{dd MMM yyyy HH:mm:ss,fff}. If no date format specifier is + given then ISO8601 format is + assumed (). + + + The date format specifier admits the same syntax as the + time pattern string of the . + + + For better results it is recommended to use the log4net date + formatters. These can be specified using one of the strings + "ABSOLUTE", "DATE" and "ISO8601" for specifying + , + and respectively + . For example, + %date{ISO8601} or %date{ABSOLUTE}. + + + These dedicated date formatters perform significantly + better than . + + + + + env + + + Used to output the a specific environment variable. The key to + lookup must be specified within braces and directly following the + pattern specifier, e.g. %env{COMPUTERNAME} would include the value + of the COMPUTERNAME environment variable. + + + The env pattern is not supported on the .NET Compact Framework. + + + + + identity + + + Used to output the user name for the currently active user + (Principal.Identity.Name). + + + + + newline + + + Outputs the platform dependent line separator character or + characters. + + + This conversion pattern name offers the same performance as using + non-portable line separator strings such as "\n", or "\r\n". + Thus, it is the preferred way of specifying a line separator. + + + + + processid + + + Used to output the system process ID for the current process. + + + + + property + + + Used to output a specific context property. The key to + lookup must be specified within braces and directly following the + pattern specifier, e.g. %property{user} would include the value + from the property that is keyed by the string 'user'. Each property value + that is to be included in the log must be specified separately. + Properties are stored in logging contexts. By default + the log4net:HostName property is set to the name of machine on + which the event was originally logged. + + + If no key is specified, e.g. %property then all the keys and their + values are printed in a comma separated list. + + + The properties of an event are combined from a number of different + contexts. These are listed below in the order in which they are searched. + + + + the thread properties + + The that are set on the current + thread. These properties are shared by all events logged on this thread. + + + + the global properties + + The that are set globally. These + properties are shared by all the threads in the AppDomain. + + + + + + + random + + + Used to output a random string of characters. The string is made up of + uppercase letters and numbers. By default the string is 4 characters long. + The length of the string can be specified within braces directly following the + pattern specifier, e.g. %random{8} would output an 8 character string. + + + + + username + + + Used to output the WindowsIdentity for the currently + active user. + + + + + utcdate + + + Used to output the date of the logging event in universal time. + The date conversion + specifier may be followed by a date format specifier enclosed + between braces. For example, %utcdate{HH:mm:ss,fff} or + %utcdate{dd MMM yyyy HH:mm:ss,fff}. If no date format specifier is + given then ISO8601 format is + assumed (). + + + The date format specifier admits the same syntax as the + time pattern string of the . + + + For better results it is recommended to use the log4net date + formatters. These can be specified using one of the strings + "ABSOLUTE", "DATE" and "ISO8601" for specifying + , + and respectively + . For example, + %utcdate{ISO8601} or %utcdate{ABSOLUTE}. + + + These dedicated date formatters perform significantly + better than . + + + + + % + + + The sequence %% outputs a single percent sign. + + + + + + Additional pattern converters may be registered with a specific + instance using or + . + + + See the for details on the + format modifiers supported by the patterns. + + + Nicko Cadell + + + + Internal map of converter identifiers to converter types. + + + + + the head of the pattern converter chain + + + + + patterns defined on this PatternString only + + + + + Default constructor + + + + Initialize a new instance of + + + + + + Constructs a PatternString + + The pattern to use with this PatternString + + + Initialize a new instance of with the pattern specified. + + + + + + Gets or sets the pattern formatting string + + + The pattern formatting string + + + + The ConversionPattern option. This is the string which + controls formatting and consists of a mix of literal content and + conversion specifiers. + + + + + + Initialize object options + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Create the used to parse the pattern + + the pattern to parse + The + + + Returns PatternParser used to parse the conversion string. Subclasses + may override this to return a subclass of PatternParser which recognize + custom conversion pattern name. + + + + + + Produces a formatted string as specified by the conversion pattern. + + The TextWriter to write the formatted event to + + + Format the pattern to the . + + + + + + Format the pattern as a string + + the pattern formatted as a string + + + Format the pattern to a string. + + + + + + Adds a converter to this PatternString. + + the converter info + + + This version of the method is used by the configurator. + Programmatic users should use the alternative method. + The converter name is case-insensitive. + + + + + + Add a converter to this PatternString + + the name of the conversion pattern for this converter + the type of the converter + + + + Write the name of the current AppDomain to the output writer + + Nicko Cadell + + + + Write the name of the current AppDomain to the output + + the writer to write to + null, state is not set + + + Writes name of the current AppDomain to the output . + + + + + + AppSetting pattern converter + + + + This pattern converter reads appSettings from the application configuration file. + + + If the is specified then that will be used to + lookup a single appSettings value. If no is specified + then all appSettings will be dumped as a list of key value pairs. + + + A typical use is to specify a base directory for log files, e.g. + + + + + ... + + + ]]> + + + + + + + Write the property value to the output + + that will receive the formatted result. + null, state is not set + + + Writes out the value of a named property. The property name + should be set in the + property. + + + If the is set to null + then all the properties are written as key value pairs. + + + + + + Write the current date to the output + + + + Date pattern converter, uses a to format + the current date and time to the writer as a string. + + + The value of the determines + the formatting of the date. The following values are allowed: + + + Option value + Output + + + ISO8601 + + Uses the formatter. + Formats using the "yyyy-MM-dd HH:mm:ss,fff" pattern. + + + + DATE + + Uses the formatter. + Formats using the "dd MMM yyyy HH:mm:ss,fff" for example, "06 Nov 1994 15:49:37,459". + + + + ABSOLUTE + + Uses the formatter. + Formats using the "HH:mm:ss,fff" for example, "15:49:37,459". + + + + other + + Any other pattern string uses the formatter. + This formatter passes the pattern string to the + method. + For details on valid patterns see + DateTimeFormatInfo Class. + + + + + + The date and time is in the local time zone and is rendered in that zone. + To output the time in Universal time see . + + + Nicko Cadell + + + + The used to render the date to a string + + + + + Initialize the converter options + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Write the current date to the output + + that will receive the formatted result. + null, state is not set + + + Pass the current date and time to the + for it to render it to the writer. + + + The date and time passed is in the local time zone. + + + + + + The fully qualified type of the DatePatternConverter class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Write an folder path to the output + + + + The value of the determines + the name of the variable to output. + should be a value in the enumeration. + + + Ron Grabowski + + + + Writes a special path environment folder path to the output + + the writer to write to + null, state is not set + + + Writes the special path environment folder path to the output . + The name of the special path environment folder path to output must be set + using the + property. + + + + + + The fully qualified type of the EnvironmentFolderPathPatternConverter class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Write an environment variable to the output + + + + Write an environment variable to the output writer. + The value of the determines + the name of the variable to output. + + + Nicko Cadell + + + + Write an environment variable to the output + + the writer to write to + null, state is not set + + + Writes the environment variable to the output . + The name of the environment variable to output must be set + using the + property. + + + + + + The fully qualified type of the EnvironmentPatternConverter class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Write the current thread identity to the output + + + + Write the current thread identity to the output writer + + + Nicko Cadell + + + + Write the current thread identity to the output + + the writer to write to + null, state is not set + + + Writes the current thread identity to the output . + + + + + + The fully qualified type of the IdentityPatternConverter class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Pattern converter for literal string instances in the pattern + + + + Writes the literal string value specified in the + property to + the output. + + + Nicko Cadell + + + + Set the next converter in the chain + + The next pattern converter in the chain + The next pattern converter + + + Special case the building of the pattern converter chain + for instances. Two adjacent + literals in the pattern can be represented by a single combined + pattern converter. This implementation detects when a + is added to the chain + after this converter and combines its value with this converter's + literal value. + + + + + + Write the literal to the output + + the writer to write to + null, not set + + + Override the formatting behavior to ignore the FormattingInfo + because we have a literal instead. + + + Writes the value of + to the output . + + + + + + Convert this pattern into the rendered message + + that will receive the formatted result. + null, not set + + + This method is not used. + + + + + + Writes a newline to the output + + + + Writes the system dependent line terminator to the output. + This behavior can be overridden by setting the : + + + + Option Value + Output + + + DOS + DOS or Windows line terminator "\r\n" + + + UNIX + UNIX line terminator "\n" + + + + Nicko Cadell + + + + Initialize the converter + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Write the current process ID to the output + + + + Write the current process ID to the output writer + + + Nicko Cadell + + + + Write the current process ID to the output + + the writer to write to + null, state is not set + + + Write the current process ID to the output . + + + + + + The fully qualified type of the ProcessIdPatternConverter class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Property pattern converter + + + + This pattern converter reads the thread and global properties. + The thread properties take priority over global properties. + See for details of the + thread properties. See for + details of the global properties. + + + If the is specified then that will be used to + lookup a single property. If no is specified + then all properties will be dumped as a list of key value pairs. + + + Nicko Cadell + + + + Write the property value to the output + + that will receive the formatted result. + null, state is not set + + + Writes out the value of a named property. The property name + should be set in the + property. + + + If the is set to null + then all the properties are written as key value pairs. + + + + + + A Pattern converter that generates a string of random characters + + + + The converter generates a string of random characters. By default + the string is length 4. This can be changed by setting the + to the string value of the length required. + + + The random characters in the string are limited to uppercase letters and numbers only. + + + The random number generator used by this class is not cryptographically secure. + + + Nicko Cadell + + + + Shared random number generator + + + + + Length of random string to generate. Default length 4. + + + + + Initialize the converter options + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Writes a random string to the output + + the writer to write to + null, state is not set + + + + The fully qualified type of the RandomStringPatternConverter class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Write the current threads username to the output + + + + Write the current threads username to the output writer + + + Nicko Cadell + + + + Write the current threads username to the output + + the writer to write to + null, state is not set + + + Write the current threads username to the output . + + + + + + The fully qualified type of the UserNamePatternConverter class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Write the UTC date time to the output + + + + Date pattern converter, uses a to format + the current date and time in Universal time. + + + See the for details on the date pattern syntax. + + + + Nicko Cadell + + + + Write the current date and time to the output + + that will receive the formatted result. + null, state is not set + + + Pass the current date and time to the + for it to render it to the writer. + + + The date is in Universal time when it is rendered. + + + + + + + The fully qualified type of the UtcDatePatternConverter class. + + + Used by the internal logger to record the Type of the + log message. + + + + + String keyed object map. + + + + While this collection is serializable, only member objects that are serializable + will be serialized along with this collection. + + + Nicko Cadell + Gert Driesen + + + + Constructor + + + + Initializes a new instance of the class. + + + + + + Constructor + + properties to copy + + + Initializes a new instance of the class. + + + + + + Initializes a new instance of the class + with serialized data. + + The that holds the serialized object data. + The that contains contextual information about the source or destination. + + + Because this class is sealed the serialization constructor is private. + + + + + + Gets or sets the value of the property with the specified key. + + + The value of the property with the specified key. + + The key of the property to get or set. + + + The property value will only be serialized if it is serializable. + If it cannot be serialized it will be silently ignored if + a serialization operation is performed. + + + + + + See . + + + + + Remove the entry with the specified key from this dictionary + + the key for the entry to remove + + + Remove the entry with the specified key from this dictionary + + + + + + See + + an enumerator + + + Returns a over the contest of this collection. + + + + + + See + + the key to remove + + + Remove the entry with the specified key from this dictionary + + + + + + Remove all properties from the properties collection + + + + Remove all properties from the properties collection + + + + + + See + + the key + the value to store for the key + + + Store a value for the specified . + + + Thrown if the is not a string + + + + See + + + false + + + + This collection is modifiable. This property always + returns false. + + + + + + See + + + The value for the key specified. + + + + Get or set a value for the specified . + + + Thrown if the is not a string + + + + A class to hold the key and data for a property set in the config file + + + + + Property Key + + + + + Property Value + + + + + Override Object.ToString to return sensible debug info + + string info about this object + + + + A that ignores the message + + + This writer is used in special cases where it is necessary + to protect a writer from being closed by a client. + + Nicko Cadell + + + + Constructor + + the writer to actually write to + + Create a new ProtectCloseTextWriter using a writer + + + + + Attaches this instance to a different underlying . + + the writer to attach to + + + + Does not close the underlying output writer. + + + + + that does not leak exceptions + + + + does not throw exceptions when things go wrong. + Instead, it delegates error handling to its . + + + Nicko Cadell + Gert Driesen + + + + Constructor + + the writer to actually write to + the error handler to report error to + + + Create a new QuietTextWriter using a writer and error handler + + + + + + Gets or sets the error handler that all errors are passed to. + + + The error handler that all errors are passed to. + + + + Gets or sets the error handler that all errors are passed to. + + + + + + Gets a value indicating whether this writer is closed. + + + true if this writer is closed, otherwise false. + + + + Gets a value indicating whether this writer is closed. + + + + + + Writes a character to the underlying writer + + the char to write + + + Writes a character to the underlying writer + + + + + + Writes a buffer to the underlying writer + + the buffer to write + the start index to write from + the number of characters to write + + + Writes a buffer to the underlying writer + + + + + + Writes a string to the output. + + The string data to write to the output. + + + + Closes the underlying output writer. + + + + Closes the underlying output writer. + + + + + + The error handler instance to pass all errors to + + + + + Defines a lock that supports single writers and multiple readers + + + + ReaderWriterLock is used to synchronize access to a resource. + At any given time, it allows either concurrent read access for + multiple threads, or write access for a single thread. In a + situation where a resource is changed infrequently, a + ReaderWriterLock provides better throughput than a simple + one-at-a-time lock, such as . + + + If a platform does not support a System.Threading.ReaderWriterLock + implementation then all readers and writers are serialized. Therefore + the caller must not rely on multiple simultaneous readers. + + + Nicko Cadell + + + + Acquires a reader lock + + + + blocks if a different thread has the writer + lock, or if at least one thread is waiting for the writer lock. + + + + + + Decrements the lock count + + + + decrements the lock count. When the count + reaches zero, the lock is released. + + + + + + Acquires the writer lock + + + + This method blocks if another thread has a reader lock or writer lock. + + + + + + Decrements the lock count on the writer lock + + + + ReleaseWriterLock decrements the writer lock count. + When the count reaches zero, the writer lock is released. + + + + + + String keyed object map that is read only. + + + + This collection is readonly and cannot be modified. It is not thread-safe. + + + While this collection is serializable, only member + objects that are serializable will + be serialized along with this collection. + + + Nicko Cadell + Gert Driesen + + + + Constructor + + + + Initializes a new instance of the class. + + + + + + Copy Constructor + + properties to copy + + + Initializes a new instance of the class. + + + + + + Deserialization constructor + + The that holds the serialized object data. + The that contains contextual information about the source or destination. + + + Initializes a new instance of the class + with serialized data. + + + + + + Gets the key names. + + An array of all the keys. + + + Gets the key names. + + + + + + See . + + + + + See . + + + + + See . + + + + + See . + + + + + Gets or sets the value of the property with the specified key. + + + The value of the property with the specified key, or null if a property is not present in the dictionary. + Note this is the semantic, not that of . + + The key of the property to get or set. + + + The property value will only be serialized if it is serializable. + If it cannot be serialized it will be silently ignored if + a serialization operation is performed. + + + + + + Test if the dictionary contains a specified key + + the key to look for + true if the dictionary contains the specified key + + + Test if the dictionary contains a specified key + + + + + + The hashtable used to store the properties + + + The internal collection used to store the properties + + + + The hashtable used to store the properties + + + + + + Serializes this object into the provided. + + The to populate with data. + The destination for this serialization. + + + Serializes this object into the provided. + + + + + + See + + + + + See + + + + + See + + + + + + See + + + + + See . + + + + + Removes all properties from the properties collection + + + + + See . + + + + + See . + + + + + See . + + + + + See . + + + + + See . + + + + + See + + + + + See . + + + + + See . + + + + + See + + + + + See + + + + + See + + + + + See + + + + + See + + + + + The number of properties in this collection + + + + + See . + + + + + See + + + + + See + + + + + A that can be and reused + + + + This uses a single buffer for string operations. + + + Nicko Cadell + + + + Creates an instance of + + the format provider to use + + + + Override Dispose to prevent closing of writer + + flag + + + + Reset this string writer so that it can be reused. + + the maximum buffer capacity before it is trimmed + the default size to make the buffer + + + Reset this string writer so that it can be reused. + The internal buffers are cleared and reset. + + + + + + Utility class for system specific information. + + Nicko Cadell + Gert Driesen + Alexey Solofnenko + + + + Initialize default values for private static fields. + + + + Only static methods are exposed from this type. + + + + + + Gets the system dependent line terminator. + + + + + Gets the base directory for this . + + + + The value returned may be either a local file path or a URI. + + + + + + Gets the path to the configuration file for the current . + + + + The value returned may be either a local file path or a URI. + + + + + + Gets the path to the file that first executed in the current . + + + + + Gets the ID of the current thread. + + + + + Gets the host name or machine name for the current machine. + + + + The host name () or + the machine name () for + the current machine, or if neither of these are available + then NOT AVAILABLE is returned. + + + + + + Gets this application's friendly name. + + + + If available the name of the application is retrieved from + the AppDomain using AppDomain.CurrentDomain.FriendlyName. + + + Otherwise the file name of the entry assembly is used. + + + + + + Get the UTC start time for the current process. + + + + This is the UTC time at which the log4net library was loaded into the + AppDomain. Due to reports of a hang in the call to System.Diagnostics.Process.StartTime + this is not the start time for the current process. + + + The log4net library should be loaded by an application early during its + startup, therefore this start time should be a good approximation for + the actual start time. + + + Note that AppDomains may be loaded and unloaded within the + same process without the process terminating, however this start time + will be set per AppDomain. + + + + + + Text to output when a null is encountered. + + + + Use this value to indicate a null has been encountered while + outputting a string representation of an item. + + + The default value is (null). This value can be overridden by specifying + a value for the log4net.NullText appSetting in the application's + .config file. + + + + + + Text to output when an unsupported feature is requested. + + + + Use this value when an unsupported feature is requested. + + + The default value is NOT AVAILABLE. This value can be overridden by specifying + a value for the log4net.NotAvailableText appSetting in the application's + .config file. + + + + + + Gets the assembly location path for the specified assembly. + + The assembly to get the location for. + The location of the assembly. + + + This method does not guarantee to return the correct path + to the assembly. If only tries to give an indication as to + where the assembly was loaded from. + + + + + + Gets the short name of the . + + The to get the name for. + The short name of the . + + + The short name of the assembly is the + without the version, culture, or public key. i.e. it is just the + assembly's file name without the extension. + + + Because of a FileIOPermission security demand we cannot do + the obvious Assembly.GetName().Name. We are allowed to get + the of the assembly so we + start from there and strip out just the assembly name. + + + + + + Gets the file name portion of the , including the extension. + + The to get the file name for. + The file name of the assembly. + + + Gets the file name portion of the , including the extension. + + + + + + Loads the type specified in the type string. + + A sibling type to use to load the type. + The name of the type to load. + Flag set to true to throw an exception if the type cannot be loaded. + true to ignore the case of the type name; otherwise, false + The type loaded or null if it could not be loaded. + + + If the type name is fully qualified, i.e. if contains an assembly name in + the type name, the type will be loaded from the system using + . + + + If the type name is not fully qualified, it will be loaded from the assembly + containing the specified relative type. If the type is not found in the assembly + then all the loaded assemblies will be searched for the type. + + + + + + Loads the type specified in the type string. + + The name of the type to load. + Flag set to true to throw an exception if the type cannot be loaded. + true to ignore the case of the type name; otherwise, false + The type loaded or null if it could not be loaded. + + + If the type name is fully qualified, i.e. if contains an assembly name in + the type name, the type will be loaded from the system using + . + + + If the type name is not fully qualified it will be loaded from the + assembly that is directly calling this method. If the type is not found + in the assembly then all the loaded assemblies will be searched for the type. + + + + + + Loads the type specified in the type string. + + An assembly to load the type from. + The name of the type to load. + Flag set to true to throw an exception if the type cannot be loaded. + true to ignore the case of the type name; otherwise, false + The type loaded or null if it could not be loaded. + + + If the type name is fully qualified, i.e. if contains an assembly name in + the type name, the type will be loaded from the system using + . + + + If the type name is not fully qualified it will be loaded from the specified + assembly. If the type is not found in the assembly then all the loaded assemblies + will be searched for the type. + + + + + + Creates an + + The name of the parameter that caused the exception + The value of the argument that causes this exception + The message that describes the error + + A new instance of the class + with the specified error message, parameter name, and value + of the argument. + + + + + Creates a for read-only collection modification calls. + + The NotSupportedException object + + + + Parse a string into an value + + the string to parse + out param where the parsed value is placed + true if the string was parsed into an integer + + + Attempts to parse the string into an integer. If the string cannot + be parsed then this method returns false. The method does not throw an exception. + + + + + + Parse a string into an value + + the string to parse + out param where the parsed value is placed + true if the string was parsed into an integer + + + Attempts to parse the string into an integer. If the string cannot + be parsed then this method returns false. The method does not throw an exception. + + + + + + Parse a string into an value + + the string to parse + out param where the parsed value is placed + true if the string was parsed into an integer + + + Attempts to parse the string into an integer. If the string cannot + be parsed then this method returns false. The method does not throw an exception. + + + + + + Lookup an application setting + + the application settings key to lookup + the value for the key, or null + + + + Convert a path into a fully qualified local file path. + + The path to convert. + The fully qualified path. + + + Converts the path specified to a fully + qualified path. If the path is relative it is + taken as relative from the application base + directory. + + + The path specified must be a local file path, a URI is not supported. + + + + + + Creates a new case-insensitive instance of the class with the default initial capacity. + + A new case-insensitive instance of the class with the default initial capacity + + + The new Hashtable instance uses the default load factor, the CaseInsensitiveHashCodeProvider, and the CaseInsensitiveComparer. + + + + + + Tests two strings for equality, the ignoring case. + + + If the platform permits, culture information is ignored completely (ordinal comparison). + The aim of this method is to provide a fast comparison that deals with null and ignores different casing. + It is not supposed to deal with various, culture-specific habits. + Use it to compare against pure ASCII constants, like keywords etc. + + The one string. + The other string. + true if the strings are equal, false otherwise. + + + + The fully qualified type of the SystemInfo class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Cache the host name for the current machine + + + + + Cache the application friendly name + + + + + Utility class that represents a format string. + + Nicko Cadell + An that supplies culture-specific formatting information. + A containing zero or more format items. + An array containing zero or more objects to format. + + + + Utility class that represents a format string. + + Nicko Cadell + An that supplies culture-specific formatting information. + A containing zero or more format items. + An array containing zero or more objects to format. + + + + Format + + + + + Args + + + + + Format the string and arguments + + the formatted string + + + + Replaces the format item in a specified with the text equivalent + of the value of a corresponding instance in a specified array. + A specified parameter supplies culture-specific formatting information. + + An that supplies culture-specific formatting information. + A containing zero or more format items. + An array containing zero or more objects to format. + + A copy of format in which the format items have been replaced by the + equivalent of the corresponding instances of in args. + + + + This method does not throw exceptions. If an exception thrown while formatting the result the + exception and arguments are returned in the result string. + + + + + + Process an error during StringFormat + + + + + Dump the contents of an array into a string builder + + + + + Dump an object to a string + + + + + The fully qualified type of the SystemStringFormat class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Adapter that extends and forwards all + messages to an instance of . + + Nicko Cadell + + + + Creates an instance of that forwards all + messages to a . + + The to forward to + + + + Gets or sets the underlying . + + + + + The in which the output is written + + + + + Gets an object that controls formatting + + + + + Gets or sets the line terminator string used by the TextWriter. + + + + + Closes the writer and releases any system resources associated with the writer + + + + + + + + + Dispose this writer + + flag indicating if we are being disposed + + + Dispose this writer + + + + + + Flushes any buffered output + + + + Clears all buffers for the writer and causes any buffered data to be written + to the underlying device + + + + + + Writes a character to the wrapped TextWriter + + the value to write to the TextWriter + + + Writes a character to the wrapped TextWriter + + + + + + Writes a character buffer to the wrapped TextWriter + + the data buffer + the start index + the number of characters to write + + + Writes a character buffer to the wrapped TextWriter + + + + + + Writes a string to the wrapped TextWriter + + the value to write to the TextWriter + + + Writes a string to the wrapped TextWriter + + + + + + Implementation of Properties collection for the + + + + Class implements a collection of properties that is specific to each thread. + The class is not synchronized as each thread has its own . + + + Nicko Cadell + + + + Each thread will automatically have its instance. + + + + + Internal constructor + + + + Initializes a new instance of the class. + + + + + + Gets or sets the value of a property + + + The value for the property with the specified key + + + + Gets or sets the value of a property + + + + + + Remove a property + + the key for the entry to remove + + + Remove a property + + + + + + Get the keys stored in the properties. + + + Gets the keys stored in the properties. + + a set of the defined keys + + + + Clear all properties + + + + Clear all properties + + + + + + Get the PropertiesDictionary for this thread. + + create the dictionary if it does not exist, otherwise return null if it does not exist + the properties for this thread + + + The collection returned is only to be used on the calling thread. If the + caller needs to share the collection between different threads then the + caller must clone the collection before doing so. + + + + + + Implementation of Stack for the + + + + Implementation of Stack for the + + + Nicko Cadell + + + + The stack store. + + + + + Internal constructor + + + + Initializes a new instance of the class. + + + + + + The number of messages in the stack + + + The current number of messages in the stack + + + + The current number of messages in the stack. That is + the number of times has been called + minus the number of times has been called. + + + + + + Clears all the contextual information held in this stack. + + + + Clears all the contextual information held in this stack. + Only call this if you think that this tread is being reused after + a previous call execution which may not have completed correctly. + You do not need to use this method if you always guarantee to call + the method of the + returned from even in exceptional circumstances, + for example by using the using(log4net.ThreadContext.Stacks["NDC"].Push("Stack_Message")) + syntax. + + + + + + Removes the top context from this stack. + + The message in the context that was removed from the top of this stack. + + + Remove the top context from this stack, and return + it to the caller. If this stack is empty then an + empty string (not ) is returned. + + + + + + Pushes a new context message into this stack. + + The new context message. + + An that can be used to clean up the context stack. + + + + Pushes a new context onto this stack. An + is returned that can be used to clean up this stack. This + can be easily combined with the using keyword to scope the + context. + + + Simple example of using the Push method with the using keyword. + + using(log4net.ThreadContext.Stacks["NDC"].Push("Stack_Message")) + { + log.Warn("This should have an ThreadContext Stack message"); + } + + + + + + Returns the top context from this stack. + + The message in the context from the top of this stack. + + + Returns the top context from this stack. If this stack is empty then an + empty string (not ) is returned. + + + + + + Gets the current context information for this stack. + + The current context information. + + + + Gets and sets the internal stack used by this + + The internal storage stack + + + This property is provided only to support backward compatibility + of the . Typically the internal stack should not + be modified. + + + + + + Gets the current context information for this stack. + + + + + Get a portable version of this object + + + + + Inner class used to represent a single context frame in the stack. + + + + + Constructor + + The message for this context. + The parent context in the chain. + + + Initializes a new instance of the class + with the specified message and parent context. + + + + + + Get the message. + + + + + Gets the full text of the context down to the root level. + + + + + Struct returned from the method. + + + + This struct implements the and is designed to be used + with the pattern to remove the stack frame at the end of the scope. + + + + + + The ThreadContextStack internal stack + + + + + The depth to trim the stack to when this instance is disposed + + + + + Initializes a new instance of the class with + the specified stack and return depth. + + The internal stack used by the ThreadContextStack. + The depth to return the stack to when this object is disposed. + + + + Returns the stack to the correct depth. + + + + + Implementation of Stacks collection for the + + Nicko Cadell + + + + Initializes a new instance of the class. + + + + + Gets the named thread context stack. + + + + + The fully qualified type of the ThreadContextStacks class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Utility class for transforming strings. + + + + Utility class for transforming strings. + + + Nicko Cadell + Gert Driesen + + + + Write a string to an + + the writer to write to + the string to write + The string to replace non XML compliant chars with + + + The test is escaped either using XML escape entities + or using CDATA sections. + + + + + + Replace invalid XML characters in text string + + the XML text input string + the string to use in place of invalid characters + A string that does not contain invalid XML characters. + + + Certain Unicode code points are not allowed in the XML InfoSet, for + details see: http://www.w3.org/TR/REC-xml/#charsets. + + + This method replaces any illegal characters in the input string + with the mask string specified. + + + + + + Count the number of times that the substring occurs in the text + + the text to search + the substring to find + the number of times the substring occurs in the text + + + The substring is assumed to be non repeating within itself. + + + + + + Characters illegal in XML 1.0 + + + + + Type converter for Boolean. + + + + Supports conversion from string to bool type. + + + + + + Nicko Cadell + Gert Driesen + + + + Can the source type be converted to the type supported by this object + + the type to convert + + True if the is + the type. + + + + + Converts the source object to the type supported by this object + + the object to convert + the converted object + + + Uses the method to convert the + argument to a . + + + + The object cannot be converted to the + target type. To check for this condition use the + method. + + + + + Exception base type for conversion errors. + + + + This type extends . It + does not add any new functionality but does differentiate the + type of exception being thrown. + + + Nicko Cadell + Gert Driesen + + + + Constructor + + + + Initializes a new instance of the class. + + + + + + Constructor + + A message to include with the exception. + + + Initializes a new instance of the class + with the specified message. + + + + + + Constructor + + A message to include with the exception. + A nested exception to include. + + + Initializes a new instance of the class + with the specified message and inner exception. + + + + + + Serialization constructor + + The that holds the serialized object data about the exception being thrown. + The that contains contextual information about the source or destination. + + + Initializes a new instance of the class + with serialized data. + + + + + + Creates a new instance of the class. + + The conversion destination type. + The value to convert. + An instance of the . + + + Creates a new instance of the class. + + + + + + Creates a new instance of the class. + + The conversion destination type. + The value to convert. + A nested exception to include. + An instance of the . + + + Creates a new instance of the class. + + + + + + Register of type converters for specific types. + + + + Maintains a registry of type converters used to convert between types. + + + Use the and + methods to register new converters. + The and methods + lookup appropriate converters to use. + + + + + Nicko Cadell + Gert Driesen + + + + This class constructor adds the intrinsic type converters + + + + + Adds a converter for a specific type. + + The type being converted to. + The type converter to use to convert to the destination type. + + + + Adds a converter for a specific type. + + The type being converted to. + The type of the type converter to use to convert to the destination type. + + + + Gets the type converter to use to convert values to the destination type. + + The type being converted from. + The type being converted to. + + The type converter instance to use for type conversions or null + if no type converter is found. + + + + + Gets the type converter to use to convert values to the destination type. + + The type being converted to. + + The type converter instance to use for type conversions or null + if no type converter is found. + + + + + Lookups the type converter to use as specified by the attributes on the + destination type. + + The type being converted to. + + The type converter instance to use for type conversions or null + if no type converter is found. + + + + + Creates the instance of the type converter. + + The type of the type converter. + + The type converter instance to use for type conversions or null + if no type converter is found. + + + + The type specified for the type converter must implement + the or interfaces + and must have a public default (no argument) constructor. + + + + + + The fully qualified type of the ConverterRegistry class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Supports conversion from string to type. + + + + + Nicko Cadell + Gert Driesen + + + + Can the source type be converted to the type supported by this object + + the type to convert + + True if the is + the type. + + + + + Overrides the ConvertFrom method of IConvertFrom. + + the object to convert to an encoding + the encoding + + + Uses the method to + convert the argument to an . + + + + The object cannot be converted to the + target type. To check for this condition use the + method. + + + + + Interface supported by type converters + + + + This interface supports conversion from arbitrary types + to a single target type. See . + + + Nicko Cadell + Gert Driesen + + + + Can the source type be converted to the type supported by this object + + the type to convert + true if the conversion is possible + + + Test if the can be converted to the + type supported by this converter. + + + + + + Convert the source object to the type supported by this object + + the object to convert + the converted object + + + Converts the to the type supported + by this converter. + + + + + + Interface supported by type converters + + + + This interface supports conversion from a single type to arbitrary types. + See . + + + Nicko Cadell + + + + Returns whether this converter can convert the object to the specified type + + A Type that represents the type you want to convert to + true if the conversion is possible + + + Test if the type supported by this converter can be converted to the + . + + + + + + Converts the given value object to the specified type, using the arguments + + the object to convert + The Type to convert the value parameter to + the converted object + + + Converts the (which must be of the type supported + by this converter) to the specified.. + + + + + + Supports conversion from string to type. + + + + Supports conversion from string to type. + + + + + Nicko Cadell + + + + Can the source type be converted to the type supported by this object + + the type to convert + true if the conversion is possible + + + Returns true if the is + the type. + + + + + + Overrides the ConvertFrom method of IConvertFrom. + + the object to convert to an IPAddress + the IPAddress + + + Uses the method to convert the + argument to an . + If that fails then the string is resolved as a DNS hostname. + + + + The object cannot be converted to the + target type. To check for this condition use the + method. + + + + + Supports conversion from string to type. + + + + The string is used as the + of the . + + + + + + Nicko Cadell + + + + Can the source type be converted to the type supported by this object + + the type to convert + + True if the is + the type. + + + + + Overrides the ConvertFrom method of IConvertFrom. + + the object to convert to a PatternLayout + the PatternLayout + + + Creates and returns a new using + the as the + . + + + + The object cannot be converted to the + target type. To check for this condition use the + method. + + + + + Convert between string and + + + + Supports conversion from string to type, + and from a type to a string. + + + The string is used as the + of the . + + + + + + Nicko Cadell + + + + Can the target type be converted to the type supported by this object + + A that represents the type you want to convert to + true if the conversion is possible + + + Returns true if the is + assignable from a type. + + + + + + Converts the given value object to the specified type, using the arguments + + the object to convert + The Type to convert the value parameter to + the converted object + + + Uses the method to convert the + argument to a . + + + + The object cannot be converted to the + . To check for this condition use the + method. + + + + + Can the source type be converted to the type supported by this object + + the type to convert + + True if the is + the type. + + + + + Overrides the ConvertFrom method of IConvertFrom. + + the object to convert to a PatternString + the PatternString + + + Creates and returns a new using + the as the + . + + + + The object cannot be converted to the + target type. To check for this condition use the + method. + + + + + Supports conversion from string to type. + + + + + Nicko Cadell + + + + Can the source type be converted to the type supported by this object + + the type to convert + + True if the is + the type. + + + + + Overrides the ConvertFrom method of IConvertFrom. + + the object to convert to a Type + the Type + + + Uses the method to convert the + argument to a . + Additional effort is made to locate partially specified types + by searching the loaded assemblies. + + + + The object cannot be converted to the + target type. To check for this condition use the + method. + + + + + Attribute used to associate a type converter + + + + Class and Interface level attribute that specifies a type converter + to use with the associated type. + + + To associate a type converter with a target type apply a + TypeConverterAttribute to the target type. Specify the + type of the type converter on the attribute. + + + Nicko Cadell + Gert Driesen + + + + Creates a new type converter attribute for the specified type name + + The string type name of the type converter + + + The type specified must implement the + or the interfaces. + + + + + + Creates a new type converter attribute for the specified type + + The type of the type converter + + + The type specified must implement the + or the interfaces. + + + + + + The string type name of the type converter + + + + The type specified must implement the + or the interfaces. + + + + + + Impersonate a Windows Account + + + + This impersonates a Windows account. + + + How the impersonation is done depends on the value of . + This allows the context to either impersonate a set of user credentials specified + using username, domain name and password or to revert to the process credentials. + + + + + + The impersonation modes for the + + + + See the property for + details. + + + + + + Impersonate a user using the credentials supplied + + + + + Revert this the thread to the credentials of the process + + + + + Gets or sets the impersonation mode for this security context + + + The impersonation mode for this security context + + + + Impersonate either a user with user credentials or + revert this thread to the credentials of the process. + The value is one of the + enum. + + + The default value is + + + When the mode is set to + the user's credentials are established using the + , and + values. + + + When the mode is set to + no other properties need to be set. If the calling thread is + impersonating then it will be reverted back to the process credentials. + + + + + + Gets or sets the Windows username for this security context + + + The Windows username for this security context + + + + This property must be set if + is set to (the default setting). + + + + + + Gets or sets the Windows domain name for this security context + + + The Windows domain name for this security context + + + + The default value for is the local machine name + taken from the property. + + + This property must be set if + is set to (the default setting). + + + + + + Sets the password for the Windows account specified by the and properties. + + + The password for the Windows account specified by the and properties. + + + + This property must be set if + is set to (the default setting). + + + + + + Initialize the SecurityContext based on the options set. + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + The security context will try to Logon the specified user account and + capture a primary token for impersonation. + + + The required , + or properties were not specified. + + + + Impersonate the Windows account specified by the and properties. + + caller provided state + + An instance that will revoke the impersonation of this SecurityContext + + + + Depending on the property either + impersonate a user using credentials supplied or revert + to the process credentials. + + + + + + Create a given the userName, domainName and password. + + the user name + the domain name + the password + the for the account specified + + + Uses the Windows API call LogonUser to get a principal token for the account. This + token is used to initialize the WindowsIdentity. + + + + + + Adds to + + the impersonation context being wrapped + + + Helper class to expose the + through the interface. + + + + + + Adds to + + the impersonation context being wrapped + + + Helper class to expose the + through the interface. + + + + + + Revert the impersonation + + + + + Specifies that null is allowed as an input even if the corresponding type disallows it. + + + + + Initializes a new instance of the System.Diagnostics.CodeAnalysis.AllowNullAttribute class. + + + + + Specifies that null is disallowed as an input even if the corresponding type allows it. + + + + + Initializes a new instance of the System.Diagnostics.CodeAnalysis.DisallowNullAttribute class. + + + + + Specifies that a method that will never return under any circumstance. + + + + + Initializes a new instance of the System.Diagnostics.CodeAnalysis.DoesNotReturnAttribute class. + + + + + Specifies that the method will not return if the associated System.Boolean parameter is passed the specified value. + + + + + Initializes a new instance of the System.Diagnostics.CodeAnalysis.DoesNotReturnIfAttribute class + with the specified parameter value. + + + The condition parameter value. + Code after the method is considered unreachable by diagnostics if the argument to the associated parameter + matches this value. + + + + + Gets the condition parameter value. + + The condition parameter value. Code after the method is considered unreachable + by diagnostics if the argument to the associated parameter matches this value. + + + + + Specifies that an output may be null even if the corresponding type disallows it. + + + + + Specifies that when a method returns System.Diagnostics.CodeAnalysis.MaybeNullWhenAttribute.ReturnValue, + the parameter may be null even if the corresponding type disallows it. + + + + + Initializes the attribute with the specified return value condition. + + The return value condition. If the method returns this value, the associated parameter may be null. + + + + Gets the return value condition. + + + + + Specifies that the method or property will ensure that the listed field and property members have values that aren't null. + + + + + Initializes the attribute with list of field or property members. + + The list of field and property members that are promised to be non-null. + + + + Initializes the attribute with a field or property member. + + The field or property member that is promised to be non-null. + + + + Gets field or property member names. + + + + + Specifies that the method or property will ensure that the listed field and property members have non-null values + when returning with the specified return value condition. + + + + + Initializes the attribute with the specified return value condition and a field or property member. + + The return value condition. If the method returns this value, the associated parameter will not be null. + The list of field and property members that are promised to be non-null. + + + + Initializes the attribute with the specified return value condition and a field or property member. + + The return value condition. If the method returns this value, the associated parameter will not be null. + The field or property member that is promised to be non-null. + + + + Gets field or property member names. + + + + + Gets the return value condition. + + + + + Specifies that an output is not even if the corresponding type allows it. + Specifies that an input argument was not when the call returns. + + + + + Specifies that the output will be non-null if the named parameter is non-null. + + + + + Initializes the attribute with the associated parameter name. + + + The associated parameter name. + The output will be non-null if the argument to the parameter specified is non-null. + + + + + Gets the associated parameter name. + + + + + Specifies that when a method returns ReturnValue, + the parameter will not be null even if the corresponding type allows it. + + + + + Initializes the attribute with the specified return value condition. + + + The return value condition. + If the method returns this value, the associated parameter will not be null. + + + + Gets the return value condition. + + + + + Specifies that this constructor sets all required members for the current type, + and callers do not need to set any required members themselves. + + + + + Attribute to tell Roslyn-Analyzers that a parameter will be checked for + + + + + Indicates that a parameter captures the expression passed for another parameter as a string. + + + + + Name of the parameter whose expression should be captured as a string + + + + + + + + Indicates that compiler support for a particular feature is required for the location where this attribute is applied + + + + + The used for the ref structs C# feature + + + + + The used for the required members C# feature + + + + + The name of the compiler feature + + + + + Gets a value that indicates whether the compiler can choose to allow access to the location + where this attribute is applied if it does not understand + + + + + Initializes a instance for the passed in compiler feature + + The name of the compiler feature + + + + + + + + + + + + + + + + + + + + + + + + + + + + Specifies that a type has required members or that a member is required + + + + diff --git a/SEClient/decfloat.cs b/SEClient/decfloat.cs new file mode 100644 index 0000000..3a8667b --- /dev/null +++ b/SEClient/decfloat.cs @@ -0,0 +1,69 @@ +using System; +using System.Collections.Generic; +using System.Globalization; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace MT.pHLab.SE.V1 +{ + public partial class decfloat + { + public decfloat() + { + DecimalValue = null; + } + + public decfloat(decimal value) + { + DecimalValue = value; + } + + [System.Xml.Serialization.XmlIgnoreAttribute()] + public decimal? DecimalValue + { + get + { + decimal value; + + if (decimal.TryParse(this.valueField, NumberStyles.Float, CultureInfo.InvariantCulture, out value)) + { + return value; + } + + return null; + } + + set + { + if (value.HasValue) + { + this.valueField = string.Format(CultureInfo.InvariantCulture, "{0}", value); + } + else + { + this.valueField = "NaN"; + } + } + } + + public static implicit operator decfloat(decimal value) + { + return new decfloat(value); + } + + public override string ToString() + { + decimal? value = DecimalValue; + if (value.HasValue) + { + return value.Value.ToString(); + } + else + { + return "not defined"; + } + } + + } +} diff --git a/SEClient/obj/Debug/.NETFramework,Version=v4.8.AssemblyAttributes.cs b/SEClient/obj/Debug/.NETFramework,Version=v4.8.AssemblyAttributes.cs new file mode 100644 index 0000000..15efebf --- /dev/null +++ b/SEClient/obj/Debug/.NETFramework,Version=v4.8.AssemblyAttributes.cs @@ -0,0 +1,4 @@ +// +using System; +using System.Reflection; +[assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(".NETFramework,Version=v4.8", FrameworkDisplayName = ".NET Framework 4.8")] diff --git a/SEClient/obj/Debug/SEClient.csproj.CopyComplete b/SEClient/obj/Debug/SEClient.csproj.CopyComplete new file mode 100644 index 0000000..e69de29 diff --git a/SEClient/obj/Debug/SEClient.csproj.FileListAbsolute.txt b/SEClient/obj/Debug/SEClient.csproj.FileListAbsolute.txt new file mode 100644 index 0000000..b4414f6 --- /dev/null +++ b/SEClient/obj/Debug/SEClient.csproj.FileListAbsolute.txt @@ -0,0 +1,19 @@ +D:\Code\SERemoteControl-master\SERemoteControl-master\SEClient\bin\Debug\SERemoteLib.dll +D:\Code\SERemoteControl-master\SERemoteControl-master\SEClient\bin\Debug\SERemoteLib.pdb +D:\Code\SERemoteControl-master\SERemoteControl-master\SEClient\bin\Debug\log4net.dll +D:\Code\SERemoteControl-master\SERemoteControl-master\SEClient\bin\Debug\log4net.xml +D:\Code\SERemoteControl-master\SERemoteControl-master\SEClient\obj\Debug\SEClient.csproj.AssemblyReference.cache +D:\Code\SERemoteControl-master\SERemoteControl-master\SEClient\obj\Debug\SEClient.csproj.CoreCompileInputs.cache +D:\Code\SERemoteControl-master\SERemoteControl-master\SEClient\obj\Debug\SEClient.csproj.CopyComplete +D:\Code\SERemoteControl-master\SERemoteControl-master\SEClient\obj\Debug\SERemoteLib.dll +D:\Code\SERemoteControl-master\SERemoteControl-master\SEClient\obj\Debug\SERemoteLib.pdb +D:\GitCode\Remote-control\SEClient\obj\Debug\SEClient.csproj.AssemblyReference.cache +D:\GitCode\Remote-control\SEClient\obj\Debug\SEClient.csproj.CoreCompileInputs.cache +D:\GitCode\Remote-control\SEClient\bin\Debug\SERemoteLib.dll +D:\GitCode\Remote-control\SEClient\bin\Debug\SERemoteLib.pdb +D:\GitCode\Remote-control\SEClient\bin\Debug\log4net.dll +D:\GitCode\Remote-control\SEClient\bin\Debug\log4net.pdb +D:\GitCode\Remote-control\SEClient\bin\Debug\log4net.xml +D:\GitCode\Remote-control\SEClient\obj\Debug\SEClient.csproj.CopyComplete +D:\GitCode\Remote-control\SEClient\obj\Debug\SERemoteLib.dll +D:\GitCode\Remote-control\SEClient\obj\Debug\SERemoteLib.pdb diff --git a/SEClient/obj/Debug/_IsIncrementalBuild b/SEClient/obj/Debug/_IsIncrementalBuild new file mode 100644 index 0000000..e5f828c --- /dev/null +++ b/SEClient/obj/Debug/_IsIncrementalBuild @@ -0,0 +1 @@ +obj\Debug\\_IsIncrementalBuild diff --git a/SEClient/packages.config b/SEClient/packages.config new file mode 100644 index 0000000..87dc5d3 --- /dev/null +++ b/SEClient/packages.config @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/SECockpit.sln b/SECockpit.sln new file mode 100644 index 0000000..826cc47 --- /dev/null +++ b/SECockpit.sln @@ -0,0 +1,32 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 2012 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SEClient", "SEClient\SEClient.csproj", "{5222F720-4E4F-4932-B01D-E4B8DBD8CC5F}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "UnitTestProject", "UnitTestProject\UnitTestProject.csproj", "{80352D19-F394-4627-BACE-6AC5FC8BF7F8}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SERemoteControl", "SERemoteControl\SERemoteControl.csproj", "{038E7505-59C6-4800-B91B-97A432233BF1}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {5222F720-4E4F-4932-B01D-E4B8DBD8CC5F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {5222F720-4E4F-4932-B01D-E4B8DBD8CC5F}.Debug|Any CPU.Build.0 = Debug|Any CPU + {5222F720-4E4F-4932-B01D-E4B8DBD8CC5F}.Release|Any CPU.ActiveCfg = Release|Any CPU + {5222F720-4E4F-4932-B01D-E4B8DBD8CC5F}.Release|Any CPU.Build.0 = Release|Any CPU + {80352D19-F394-4627-BACE-6AC5FC8BF7F8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {80352D19-F394-4627-BACE-6AC5FC8BF7F8}.Debug|Any CPU.Build.0 = Debug|Any CPU + {80352D19-F394-4627-BACE-6AC5FC8BF7F8}.Release|Any CPU.ActiveCfg = Release|Any CPU + {80352D19-F394-4627-BACE-6AC5FC8BF7F8}.Release|Any CPU.Build.0 = Release|Any CPU + {038E7505-59C6-4800-B91B-97A432233BF1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {038E7505-59C6-4800-B91B-97A432233BF1}.Debug|Any CPU.Build.0 = Debug|Any CPU + {038E7505-59C6-4800-B91B-97A432233BF1}.Release|Any CPU.ActiveCfg = Release|Any CPU + {038E7505-59C6-4800-B91B-97A432233BF1}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/SERemoteControl/AboutBox.Designer.cs b/SERemoteControl/AboutBox.Designer.cs new file mode 100644 index 0000000..2e4931b --- /dev/null +++ b/SERemoteControl/AboutBox.Designer.cs @@ -0,0 +1,185 @@ +namespace SERemoteControl +{ + partial class AboutBox + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.tableLayoutPanel = new System.Windows.Forms.TableLayoutPanel(); + this.logoPictureBox = new System.Windows.Forms.PictureBox(); + this.labelProductName = new System.Windows.Forms.Label(); + this.labelVersion = new System.Windows.Forms.Label(); + this.labelCopyright = new System.Windows.Forms.Label(); + this.labelCompanyName = new System.Windows.Forms.Label(); + this.textBoxDescription = new System.Windows.Forms.TextBox(); + this.okButton = new System.Windows.Forms.Button(); + this.tableLayoutPanel.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.logoPictureBox)).BeginInit(); + this.SuspendLayout(); + // + // tableLayoutPanel + // + this.tableLayoutPanel.ColumnCount = 2; + this.tableLayoutPanel.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 33F)); + this.tableLayoutPanel.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 67F)); + this.tableLayoutPanel.Controls.Add(this.logoPictureBox, 0, 0); + this.tableLayoutPanel.Controls.Add(this.labelProductName, 1, 0); + this.tableLayoutPanel.Controls.Add(this.labelVersion, 1, 1); + this.tableLayoutPanel.Controls.Add(this.labelCopyright, 1, 2); + this.tableLayoutPanel.Controls.Add(this.labelCompanyName, 1, 3); + this.tableLayoutPanel.Controls.Add(this.textBoxDescription, 1, 4); + this.tableLayoutPanel.Controls.Add(this.okButton, 1, 5); + this.tableLayoutPanel.Dock = System.Windows.Forms.DockStyle.Fill; + this.tableLayoutPanel.Location = new System.Drawing.Point(9, 8); + this.tableLayoutPanel.Name = "tableLayoutPanel"; + this.tableLayoutPanel.RowCount = 6; + this.tableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 10F)); + this.tableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 10F)); + this.tableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 10F)); + this.tableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 10F)); + this.tableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 50F)); + this.tableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 10F)); + this.tableLayoutPanel.Size = new System.Drawing.Size(417, 245); + this.tableLayoutPanel.TabIndex = 0; + // + // logoPictureBox + // + this.logoPictureBox.Dock = System.Windows.Forms.DockStyle.Fill; + this.logoPictureBox.Image = global::SERemoteControl.Properties.Resources.SevenExcellence; + this.logoPictureBox.Location = new System.Drawing.Point(3, 3); + this.logoPictureBox.Name = "logoPictureBox"; + this.tableLayoutPanel.SetRowSpan(this.logoPictureBox, 6); + this.logoPictureBox.Size = new System.Drawing.Size(131, 239); + this.logoPictureBox.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage; + this.logoPictureBox.TabIndex = 12; + this.logoPictureBox.TabStop = false; + // + // labelProductName + // + this.labelProductName.Dock = System.Windows.Forms.DockStyle.Fill; + this.labelProductName.Location = new System.Drawing.Point(143, 0); + this.labelProductName.Margin = new System.Windows.Forms.Padding(6, 0, 3, 0); + this.labelProductName.MaximumSize = new System.Drawing.Size(0, 16); + this.labelProductName.Name = "labelProductName"; + this.labelProductName.Size = new System.Drawing.Size(271, 16); + this.labelProductName.TabIndex = 19; + this.labelProductName.Text = "Product Name"; + this.labelProductName.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + // + // labelVersion + // + this.labelVersion.Dock = System.Windows.Forms.DockStyle.Fill; + this.labelVersion.Location = new System.Drawing.Point(143, 24); + this.labelVersion.Margin = new System.Windows.Forms.Padding(6, 0, 3, 0); + this.labelVersion.MaximumSize = new System.Drawing.Size(0, 16); + this.labelVersion.Name = "labelVersion"; + this.labelVersion.Size = new System.Drawing.Size(271, 16); + this.labelVersion.TabIndex = 0; + this.labelVersion.Text = "Version"; + this.labelVersion.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + // + // labelCopyright + // + this.labelCopyright.Dock = System.Windows.Forms.DockStyle.Fill; + this.labelCopyright.Location = new System.Drawing.Point(143, 48); + this.labelCopyright.Margin = new System.Windows.Forms.Padding(6, 0, 3, 0); + this.labelCopyright.MaximumSize = new System.Drawing.Size(0, 16); + this.labelCopyright.Name = "labelCopyright"; + this.labelCopyright.Size = new System.Drawing.Size(271, 16); + this.labelCopyright.TabIndex = 21; + this.labelCopyright.Text = "Copyright"; + this.labelCopyright.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + // + // labelCompanyName + // + this.labelCompanyName.Dock = System.Windows.Forms.DockStyle.Fill; + this.labelCompanyName.Location = new System.Drawing.Point(143, 72); + this.labelCompanyName.Margin = new System.Windows.Forms.Padding(6, 0, 3, 0); + this.labelCompanyName.MaximumSize = new System.Drawing.Size(0, 16); + this.labelCompanyName.Name = "labelCompanyName"; + this.labelCompanyName.Size = new System.Drawing.Size(271, 16); + this.labelCompanyName.TabIndex = 22; + this.labelCompanyName.Text = "Company Name"; + this.labelCompanyName.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + // + // textBoxDescription + // + this.textBoxDescription.Dock = System.Windows.Forms.DockStyle.Fill; + this.textBoxDescription.Location = new System.Drawing.Point(143, 99); + this.textBoxDescription.Margin = new System.Windows.Forms.Padding(6, 3, 3, 3); + this.textBoxDescription.Multiline = true; + this.textBoxDescription.Name = "textBoxDescription"; + this.textBoxDescription.ReadOnly = true; + this.textBoxDescription.ScrollBars = System.Windows.Forms.ScrollBars.Both; + this.textBoxDescription.Size = new System.Drawing.Size(271, 116); + this.textBoxDescription.TabIndex = 23; + this.textBoxDescription.TabStop = false; + this.textBoxDescription.Text = "Description"; + // + // okButton + // + this.okButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.okButton.DialogResult = System.Windows.Forms.DialogResult.Cancel; + this.okButton.Location = new System.Drawing.Point(339, 221); + this.okButton.Name = "okButton"; + this.okButton.Size = new System.Drawing.Size(75, 21); + this.okButton.TabIndex = 24; + this.okButton.Text = "&OK"; + // + // AboutBox + // + this.AcceptButton = this.okButton; + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(435, 261); + this.Controls.Add(this.tableLayoutPanel); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; + this.MaximizeBox = false; + this.MinimizeBox = false; + this.Name = "AboutBox"; + this.Padding = new System.Windows.Forms.Padding(9, 8, 9, 8); + this.ShowIcon = false; + this.ShowInTaskbar = false; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; + this.Text = "About"; + this.tableLayoutPanel.ResumeLayout(false); + this.tableLayoutPanel.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.logoPictureBox)).EndInit(); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.TableLayoutPanel tableLayoutPanel; + private System.Windows.Forms.PictureBox logoPictureBox; + private System.Windows.Forms.Label labelProductName; + private System.Windows.Forms.Label labelVersion; + private System.Windows.Forms.Label labelCopyright; + private System.Windows.Forms.Label labelCompanyName; + private System.Windows.Forms.TextBox textBoxDescription; + private System.Windows.Forms.Button okButton; + } +} diff --git a/SERemoteControl/AboutBox.cs b/SERemoteControl/AboutBox.cs new file mode 100644 index 0000000..bb7221d --- /dev/null +++ b/SERemoteControl/AboutBox.cs @@ -0,0 +1,105 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Drawing; +using System.Linq; +using System.Reflection; +using System.Threading.Tasks; +using System.Windows.Forms; + +namespace SERemoteControl +{ + partial class AboutBox : Form + { + public AboutBox() + { + InitializeComponent(); + this.Text = String.Format("About {0}", AssemblyTitle); + this.labelProductName.Text = AssemblyProduct; + this.labelVersion.Text = String.Format("Version {0}", AssemblyVersion); + this.labelCopyright.Text = AssemblyCopyright; + this.labelCompanyName.Text = AssemblyCompany; + this.textBoxDescription.Text = AssemblyDescription; + } + + #region Assembly Attribute Accessors + + public string AssemblyTitle + { + get + { + object[] attributes = Assembly.GetExecutingAssembly().GetCustomAttributes(typeof(AssemblyTitleAttribute), false); + if (attributes.Length > 0) + { + AssemblyTitleAttribute titleAttribute = (AssemblyTitleAttribute)attributes[0]; + if (titleAttribute.Title != "") + { + return titleAttribute.Title; + } + } + return System.IO.Path.GetFileNameWithoutExtension(Assembly.GetExecutingAssembly().CodeBase); + } + } + + public string AssemblyVersion + { + get + { + return Assembly.GetExecutingAssembly().GetName().Version.ToString(); + } + } + + public string AssemblyDescription + { + get + { + object[] attributes = Assembly.GetExecutingAssembly().GetCustomAttributes(typeof(AssemblyDescriptionAttribute), false); + if (attributes.Length == 0) + { + return ""; + } + return ((AssemblyDescriptionAttribute)attributes[0]).Description; + } + } + + public string AssemblyProduct + { + get + { + object[] attributes = Assembly.GetExecutingAssembly().GetCustomAttributes(typeof(AssemblyProductAttribute), false); + if (attributes.Length == 0) + { + return ""; + } + return ((AssemblyProductAttribute)attributes[0]).Product; + } + } + + public string AssemblyCopyright + { + get + { + object[] attributes = Assembly.GetExecutingAssembly().GetCustomAttributes(typeof(AssemblyCopyrightAttribute), false); + if (attributes.Length == 0) + { + return ""; + } + return ((AssemblyCopyrightAttribute)attributes[0]).Copyright; + } + } + + public string AssemblyCompany + { + get + { + object[] attributes = Assembly.GetExecutingAssembly().GetCustomAttributes(typeof(AssemblyCompanyAttribute), false); + if (attributes.Length == 0) + { + return ""; + } + return ((AssemblyCompanyAttribute)attributes[0]).Company; + } + } + #endregion + } +} diff --git a/SERemoteControl/AboutBox.resx b/SERemoteControl/AboutBox.resx new file mode 100644 index 0000000..1af7de1 --- /dev/null +++ b/SERemoteControl/AboutBox.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/SERemoteControl/App.config b/SERemoteControl/App.config new file mode 100644 index 0000000..141774c --- /dev/null +++ b/SERemoteControl/App.config @@ -0,0 +1,21 @@ + + + + +
+ + + + + + + + + http://192.168.1.101:8088; + + + + + + + diff --git a/SERemoteControl/FormMain.Designer.cs b/SERemoteControl/FormMain.Designer.cs new file mode 100644 index 0000000..8c4bd47 --- /dev/null +++ b/SERemoteControl/FormMain.Designer.cs @@ -0,0 +1,776 @@ +namespace SERemoteControl +{ + partial class FormMain + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(FormMain)); + this.splitContainer = new System.Windows.Forms.SplitContainer(); + this.panel1 = new System.Windows.Forms.Panel(); + this.tabCockpit = new System.Windows.Forms.TabControl(); + this.tabPage1 = new System.Windows.Forms.TabPage(); + this.comboBoxSevenExcellence = new System.Windows.Forms.ComboBox(); + this.buttonClearLog = new System.Windows.Forms.Button(); + this.textBoxState = new System.Windows.Forms.TextBox(); + this.buttonGetState = new System.Windows.Forms.Button(); + this.buttonDetach = new System.Windows.Forms.Button(); + this.buttonAttach = new System.Windows.Forms.Button(); + this.buttonDisconnect = new System.Windows.Forms.Button(); + this.buttonConnect = new System.Windows.Forms.Button(); + this.tabPage2 = new System.Windows.Forms.TabPage(); + this.comboBoxSensor = new System.Windows.Forms.ComboBox(); + this.comboBoxModule = new System.Windows.Forms.ComboBox(); + this.buttonConnectSensorToModule = new System.Windows.Forms.Button(); + this.listView2 = new System.Windows.Forms.ListView(); + this.columnSensor = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.columnHeader2 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.buttonSensors = new System.Windows.Forms.Button(); + this.listView1 = new System.Windows.Forms.ListView(); + this.columnHeaderModule = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.columnHeaderSensor = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.buttonModules = new System.Windows.Forms.Button(); + this.tabPage3 = new System.Windows.Forms.TabPage(); + this.buttonTermiate = new System.Windows.Forms.Button(); + this.textBoxMethodSampleId = new System.Windows.Forms.TextBox(); + this.textBoxMethodInstruction = new System.Windows.Forms.TextBox(); + this.buttonStartMethod = new System.Windows.Forms.Button(); + this.listboxListOfMethods = new System.Windows.Forms.ListBox(); + this.buttonMethods = new System.Windows.Forms.Button(); + this.tabPage4 = new System.Windows.Forms.TabPage(); + this.textBoxSettingValue = new System.Windows.Forms.TextBox(); + this.comboBoxSettingTag = new System.Windows.Forms.ComboBox(); + this.buttonSetupSetting = new System.Windows.Forms.Button(); + this.listViewSettings = new System.Windows.Forms.ListView(); + this.columnHeader3 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.columnHeader4 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.buttonRequestSetupItemList = new System.Windows.Forms.Button(); + this.tabPage5 = new System.Windows.Forms.TabPage(); + this.buttonImport = new System.Windows.Forms.Button(); + this.buttonExport = new System.Windows.Forms.Button(); + this.comboBox2 = new System.Windows.Forms.ComboBox(); + this.tabPage6 = new System.Windows.Forms.TabPage(); + this.buttonLoginCancel = new System.Windows.Forms.Button(); + this.checkBoxProposedUsers = new System.Windows.Forms.CheckBox(); + this.textBoxUsernameList = new System.Windows.Forms.TextBox(); + this.label2 = new System.Windows.Forms.Label(); + this.label1 = new System.Windows.Forms.Label(); + this.textBoxPassword = new System.Windows.Forms.TextBox(); + this.textBoxUsername = new System.Windows.Forms.TextBox(); + this.buttonLogin = new System.Windows.Forms.Button(); + this.listviewLog = new System.Windows.Forms.ListView(); + this.columnHeaderTime = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.columnHeaderLog = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.menuStrip1 = new System.Windows.Forms.MenuStrip(); + this.toolStripMenuItem1 = new System.Windows.Forms.ToolStripMenuItem(); + ((System.ComponentModel.ISupportInitialize)(this.splitContainer)).BeginInit(); + this.splitContainer.Panel1.SuspendLayout(); + this.splitContainer.Panel2.SuspendLayout(); + this.splitContainer.SuspendLayout(); + this.panel1.SuspendLayout(); + this.tabCockpit.SuspendLayout(); + this.tabPage1.SuspendLayout(); + this.tabPage2.SuspendLayout(); + this.tabPage3.SuspendLayout(); + this.tabPage4.SuspendLayout(); + this.tabPage5.SuspendLayout(); + this.tabPage6.SuspendLayout(); + this.menuStrip1.SuspendLayout(); + this.SuspendLayout(); + // + // splitContainer + // + this.splitContainer.Dock = System.Windows.Forms.DockStyle.Fill; + this.splitContainer.FixedPanel = System.Windows.Forms.FixedPanel.Panel1; + this.splitContainer.Location = new System.Drawing.Point(0, 24); + this.splitContainer.Margin = new System.Windows.Forms.Padding(4); + this.splitContainer.Name = "splitContainer"; + this.splitContainer.Orientation = System.Windows.Forms.Orientation.Horizontal; + // + // splitContainer.Panel1 + // + this.splitContainer.Panel1.Controls.Add(this.panel1); + // + // splitContainer.Panel2 + // + this.splitContainer.Panel2.Controls.Add(this.listviewLog); + this.splitContainer.Size = new System.Drawing.Size(611, 471); + this.splitContainer.SplitterDistance = 305; + this.splitContainer.SplitterWidth = 5; + this.splitContainer.TabIndex = 4; + // + // panel1 + // + this.panel1.AutoSize = true; + this.panel1.Controls.Add(this.tabCockpit); + this.panel1.Dock = System.Windows.Forms.DockStyle.Fill; + this.panel1.Location = new System.Drawing.Point(0, 0); + this.panel1.Name = "panel1"; + this.panel1.Size = new System.Drawing.Size(611, 305); + this.panel1.TabIndex = 0; + // + // tabCockpit + // + this.tabCockpit.Controls.Add(this.tabPage1); + this.tabCockpit.Controls.Add(this.tabPage2); + this.tabCockpit.Controls.Add(this.tabPage3); + this.tabCockpit.Controls.Add(this.tabPage4); + this.tabCockpit.Controls.Add(this.tabPage5); + this.tabCockpit.Controls.Add(this.tabPage6); + this.tabCockpit.Dock = System.Windows.Forms.DockStyle.Fill; + this.tabCockpit.Location = new System.Drawing.Point(0, 0); + this.tabCockpit.Name = "tabCockpit"; + this.tabCockpit.SelectedIndex = 0; + this.tabCockpit.Size = new System.Drawing.Size(611, 305); + this.tabCockpit.TabIndex = 0; + // + // tabPage1 + // + this.tabPage1.Controls.Add(this.comboBoxSevenExcellence); + this.tabPage1.Controls.Add(this.buttonClearLog); + this.tabPage1.Controls.Add(this.textBoxState); + this.tabPage1.Controls.Add(this.buttonGetState); + this.tabPage1.Controls.Add(this.buttonDetach); + this.tabPage1.Controls.Add(this.buttonAttach); + this.tabPage1.Controls.Add(this.buttonDisconnect); + this.tabPage1.Controls.Add(this.buttonConnect); + this.tabPage1.Location = new System.Drawing.Point(4, 22); + this.tabPage1.Name = "tabPage1"; + this.tabPage1.Padding = new System.Windows.Forms.Padding(3); + this.tabPage1.Size = new System.Drawing.Size(603, 279); + this.tabPage1.TabIndex = 0; + this.tabPage1.Text = "Connection"; + this.tabPage1.UseVisualStyleBackColor = true; + // + // comboBoxSevenExcellence + // + this.comboBoxSevenExcellence.FormattingEnabled = true; + this.comboBoxSevenExcellence.Location = new System.Drawing.Point(128, 29); + this.comboBoxSevenExcellence.Name = "comboBoxSevenExcellence"; + this.comboBoxSevenExcellence.Size = new System.Drawing.Size(213, 21); + this.comboBoxSevenExcellence.TabIndex = 7; + // + // buttonClearLog + // + this.buttonClearLog.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.buttonClearLog.Location = new System.Drawing.Point(522, 247); + this.buttonClearLog.Name = "buttonClearLog"; + this.buttonClearLog.Size = new System.Drawing.Size(75, 23); + this.buttonClearLog.TabIndex = 6; + this.buttonClearLog.Text = "Clear Log"; + this.buttonClearLog.UseVisualStyleBackColor = true; + this.buttonClearLog.Click += new System.EventHandler(this.buttonClearLog_Click); + // + // textBoxState + // + this.textBoxState.Location = new System.Drawing.Point(128, 117); + this.textBoxState.Name = "textBoxState"; + this.textBoxState.Size = new System.Drawing.Size(181, 20); + this.textBoxState.TabIndex = 0; + // + // buttonGetState + // + this.buttonGetState.Location = new System.Drawing.Point(28, 114); + this.buttonGetState.Name = "buttonGetState"; + this.buttonGetState.Size = new System.Drawing.Size(75, 23); + this.buttonGetState.TabIndex = 5; + this.buttonGetState.Text = "State"; + this.buttonGetState.UseVisualStyleBackColor = true; + this.buttonGetState.Click += new System.EventHandler(this.buttonGetState_Click); + // + // buttonDetach + // + this.buttonDetach.Location = new System.Drawing.Point(28, 161); + this.buttonDetach.Name = "buttonDetach"; + this.buttonDetach.Size = new System.Drawing.Size(75, 23); + this.buttonDetach.TabIndex = 3; + this.buttonDetach.Text = "Detach"; + this.buttonDetach.UseVisualStyleBackColor = true; + this.buttonDetach.Click += new System.EventHandler(this.buttonDetach_Click); + // + // buttonAttach + // + this.buttonAttach.Location = new System.Drawing.Point(28, 70); + this.buttonAttach.Name = "buttonAttach"; + this.buttonAttach.Size = new System.Drawing.Size(75, 23); + this.buttonAttach.TabIndex = 2; + this.buttonAttach.Text = "Attach"; + this.buttonAttach.UseVisualStyleBackColor = true; + this.buttonAttach.Click += new System.EventHandler(this.buttonAttach_Click); + // + // buttonDisconnect + // + this.buttonDisconnect.Location = new System.Drawing.Point(28, 203); + this.buttonDisconnect.Name = "buttonDisconnect"; + this.buttonDisconnect.Size = new System.Drawing.Size(75, 23); + this.buttonDisconnect.TabIndex = 1; + this.buttonDisconnect.Text = "Disconnect"; + this.buttonDisconnect.UseVisualStyleBackColor = true; + this.buttonDisconnect.Click += new System.EventHandler(this.buttonDisconnect_Click); + // + // buttonConnect + // + this.buttonConnect.Location = new System.Drawing.Point(28, 28); + this.buttonConnect.Name = "buttonConnect"; + this.buttonConnect.Size = new System.Drawing.Size(75, 23); + this.buttonConnect.TabIndex = 0; + this.buttonConnect.Text = "Connect"; + this.buttonConnect.UseVisualStyleBackColor = true; + this.buttonConnect.Click += new System.EventHandler(this.buttonConnect_Click); + // + // tabPage2 + // + this.tabPage2.Controls.Add(this.comboBoxSensor); + this.tabPage2.Controls.Add(this.comboBoxModule); + this.tabPage2.Controls.Add(this.buttonConnectSensorToModule); + this.tabPage2.Controls.Add(this.listView2); + this.tabPage2.Controls.Add(this.buttonSensors); + this.tabPage2.Controls.Add(this.listView1); + this.tabPage2.Controls.Add(this.buttonModules); + this.tabPage2.Location = new System.Drawing.Point(4, 22); + this.tabPage2.Name = "tabPage2"; + this.tabPage2.Padding = new System.Windows.Forms.Padding(3); + this.tabPage2.Size = new System.Drawing.Size(603, 279); + this.tabPage2.TabIndex = 1; + this.tabPage2.Text = "Modules"; + this.tabPage2.UseVisualStyleBackColor = true; + // + // comboBoxSensor + // + this.comboBoxSensor.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.comboBoxSensor.FormattingEnabled = true; + this.comboBoxSensor.Location = new System.Drawing.Point(246, 218); + this.comboBoxSensor.Name = "comboBoxSensor"; + this.comboBoxSensor.Size = new System.Drawing.Size(307, 21); + this.comboBoxSensor.TabIndex = 7; + // + // comboBoxModule + // + this.comboBoxModule.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.comboBoxModule.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.comboBoxModule.FormattingEnabled = true; + this.comboBoxModule.Location = new System.Drawing.Point(91, 218); + this.comboBoxModule.Name = "comboBoxModule"; + this.comboBoxModule.Size = new System.Drawing.Size(149, 21); + this.comboBoxModule.TabIndex = 6; + // + // buttonConnectSensorToModule + // + this.buttonConnectSensorToModule.Location = new System.Drawing.Point(10, 218); + this.buttonConnectSensorToModule.Name = "buttonConnectSensorToModule"; + this.buttonConnectSensorToModule.Size = new System.Drawing.Size(75, 23); + this.buttonConnectSensorToModule.TabIndex = 5; + this.buttonConnectSensorToModule.Text = "Connect"; + this.buttonConnectSensorToModule.UseVisualStyleBackColor = true; + this.buttonConnectSensorToModule.Click += new System.EventHandler(this.buttonConnectSensorToModule_Click); + // + // listView2 + // + this.listView2.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { + this.columnSensor, + this.columnHeader2}); + this.listView2.FullRowSelect = true; + this.listView2.HideSelection = false; + this.listView2.Location = new System.Drawing.Point(91, 100); + this.listView2.Name = "listView2"; + this.listView2.Size = new System.Drawing.Size(462, 104); + this.listView2.TabIndex = 4; + this.listView2.UseCompatibleStateImageBehavior = false; + this.listView2.View = System.Windows.Forms.View.Details; + this.listView2.SelectedIndexChanged += new System.EventHandler(this.listView2_SelectedIndexChanged); + // + // columnSensor + // + this.columnSensor.Text = "Sensor"; + this.columnSensor.Width = 190; + // + // columnHeader2 + // + this.columnHeader2.Text = "Sensor"; + this.columnHeader2.Width = 200; + // + // buttonSensors + // + this.buttonSensors.Location = new System.Drawing.Point(10, 100); + this.buttonSensors.Name = "buttonSensors"; + this.buttonSensors.Size = new System.Drawing.Size(75, 22); + this.buttonSensors.TabIndex = 3; + this.buttonSensors.Text = "Sensor"; + this.buttonSensors.UseVisualStyleBackColor = true; + this.buttonSensors.Click += new System.EventHandler(this.buttonConnectSensor_Click); + // + // listView1 + // + this.listView1.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { + this.columnHeaderModule, + this.columnHeaderSensor}); + this.listView1.FullRowSelect = true; + this.listView1.HideSelection = false; + this.listView1.Location = new System.Drawing.Point(91, 19); + this.listView1.Name = "listView1"; + this.listView1.Size = new System.Drawing.Size(462, 75); + this.listView1.TabIndex = 2; + this.listView1.UseCompatibleStateImageBehavior = false; + this.listView1.View = System.Windows.Forms.View.Details; + this.listView1.SelectedIndexChanged += new System.EventHandler(this.listView1_SelectedIndexChanged); + // + // columnHeaderModule + // + this.columnHeaderModule.Text = "Module"; + this.columnHeaderModule.Width = 190; + // + // columnHeaderSensor + // + this.columnHeaderSensor.Text = "Sensor"; + this.columnHeaderSensor.Width = 200; + // + // buttonModules + // + this.buttonModules.Location = new System.Drawing.Point(10, 19); + this.buttonModules.Name = "buttonModules"; + this.buttonModules.Size = new System.Drawing.Size(75, 23); + this.buttonModules.TabIndex = 0; + this.buttonModules.Text = "Modules"; + this.buttonModules.UseVisualStyleBackColor = true; + this.buttonModules.Click += new System.EventHandler(this.buttonModules_Click); + // + // tabPage3 + // + this.tabPage3.Controls.Add(this.buttonTermiate); + this.tabPage3.Controls.Add(this.textBoxMethodSampleId); + this.tabPage3.Controls.Add(this.textBoxMethodInstruction); + this.tabPage3.Controls.Add(this.buttonStartMethod); + this.tabPage3.Controls.Add(this.listboxListOfMethods); + this.tabPage3.Controls.Add(this.buttonMethods); + this.tabPage3.Location = new System.Drawing.Point(4, 22); + this.tabPage3.Name = "tabPage3"; + this.tabPage3.Padding = new System.Windows.Forms.Padding(3); + this.tabPage3.Size = new System.Drawing.Size(603, 279); + this.tabPage3.TabIndex = 2; + this.tabPage3.Text = "Methods"; + this.tabPage3.UseVisualStyleBackColor = true; + // + // buttonTermiate + // + this.buttonTermiate.Location = new System.Drawing.Point(11, 197); + this.buttonTermiate.Name = "buttonTermiate"; + this.buttonTermiate.Size = new System.Drawing.Size(75, 23); + this.buttonTermiate.TabIndex = 5; + this.buttonTermiate.Text = "Terminate"; + this.buttonTermiate.UseVisualStyleBackColor = true; + this.buttonTermiate.Click += new System.EventHandler(this.buttonTermiate_Click); + // + // textBoxMethodSampleId + // + this.textBoxMethodSampleId.Location = new System.Drawing.Point(181, 131); + this.textBoxMethodSampleId.Name = "textBoxMethodSampleId"; + this.textBoxMethodSampleId.Size = new System.Drawing.Size(405, 20); + this.textBoxMethodSampleId.TabIndex = 4; + // + // textBoxMethodInstruction + // + this.textBoxMethodInstruction.Location = new System.Drawing.Point(181, 157); + this.textBoxMethodInstruction.Name = "textBoxMethodInstruction"; + this.textBoxMethodInstruction.Size = new System.Drawing.Size(405, 20); + this.textBoxMethodInstruction.TabIndex = 3; + // + // buttonStartMethod + // + this.buttonStartMethod.Location = new System.Drawing.Point(10, 129); + this.buttonStartMethod.Name = "buttonStartMethod"; + this.buttonStartMethod.Size = new System.Drawing.Size(75, 23); + this.buttonStartMethod.TabIndex = 2; + this.buttonStartMethod.Text = "Start Method"; + this.buttonStartMethod.UseVisualStyleBackColor = true; + this.buttonStartMethod.Click += new System.EventHandler(this.buttonStartMethod_Click); + // + // listboxListOfMethods + // + this.listboxListOfMethods.FormattingEnabled = true; + this.listboxListOfMethods.Location = new System.Drawing.Point(91, 17); + this.listboxListOfMethods.Name = "listboxListOfMethods"; + this.listboxListOfMethods.Size = new System.Drawing.Size(495, 95); + this.listboxListOfMethods.TabIndex = 1; + // + // buttonMethods + // + this.buttonMethods.Location = new System.Drawing.Point(10, 18); + this.buttonMethods.Name = "buttonMethods"; + this.buttonMethods.Size = new System.Drawing.Size(75, 23); + this.buttonMethods.TabIndex = 0; + this.buttonMethods.Text = "Methods"; + this.buttonMethods.UseVisualStyleBackColor = true; + this.buttonMethods.Click += new System.EventHandler(this.buttonMethods_Click); + // + // tabPage4 + // + this.tabPage4.Controls.Add(this.textBoxSettingValue); + this.tabPage4.Controls.Add(this.comboBoxSettingTag); + this.tabPage4.Controls.Add(this.buttonSetupSetting); + this.tabPage4.Controls.Add(this.listViewSettings); + this.tabPage4.Controls.Add(this.buttonRequestSetupItemList); + this.tabPage4.Location = new System.Drawing.Point(4, 22); + this.tabPage4.Name = "tabPage4"; + this.tabPage4.Padding = new System.Windows.Forms.Padding(3); + this.tabPage4.Size = new System.Drawing.Size(603, 279); + this.tabPage4.TabIndex = 3; + this.tabPage4.Text = "Settings"; + this.tabPage4.UseVisualStyleBackColor = true; + // + // textBoxSettingValue + // + this.textBoxSettingValue.Location = new System.Drawing.Point(340, 222); + this.textBoxSettingValue.Name = "textBoxSettingValue"; + this.textBoxSettingValue.Size = new System.Drawing.Size(226, 20); + this.textBoxSettingValue.TabIndex = 4; + // + // comboBoxSettingTag + // + this.comboBoxSettingTag.FormattingEnabled = true; + this.comboBoxSettingTag.Location = new System.Drawing.Point(118, 222); + this.comboBoxSettingTag.Name = "comboBoxSettingTag"; + this.comboBoxSettingTag.Size = new System.Drawing.Size(216, 21); + this.comboBoxSettingTag.TabIndex = 3; + // + // buttonSetupSetting + // + this.buttonSetupSetting.Location = new System.Drawing.Point(20, 222); + this.buttonSetupSetting.Name = "buttonSetupSetting"; + this.buttonSetupSetting.Size = new System.Drawing.Size(75, 23); + this.buttonSetupSetting.TabIndex = 2; + this.buttonSetupSetting.Text = "Setup"; + this.buttonSetupSetting.UseVisualStyleBackColor = true; + this.buttonSetupSetting.Click += new System.EventHandler(this.buttonSetupSetting_Click); + // + // listViewSettings + // + this.listViewSettings.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { + this.columnHeader3, + this.columnHeader4}); + this.listViewSettings.Location = new System.Drawing.Point(118, 23); + this.listViewSettings.Name = "listViewSettings"; + this.listViewSettings.Size = new System.Drawing.Size(448, 176); + this.listViewSettings.TabIndex = 1; + this.listViewSettings.UseCompatibleStateImageBehavior = false; + this.listViewSettings.View = System.Windows.Forms.View.Details; + this.listViewSettings.SelectedIndexChanged += new System.EventHandler(this.listViewSettings_SelectedIndexChanged); + // + // columnHeader3 + // + this.columnHeader3.Text = "Setting"; + this.columnHeader3.Width = 304; + // + // columnHeader4 + // + this.columnHeader4.Text = "Value"; + this.columnHeader4.Width = 125; + // + // buttonRequestSetupItemList + // + this.buttonRequestSetupItemList.Location = new System.Drawing.Point(20, 23); + this.buttonRequestSetupItemList.Name = "buttonRequestSetupItemList"; + this.buttonRequestSetupItemList.Size = new System.Drawing.Size(75, 23); + this.buttonRequestSetupItemList.TabIndex = 0; + this.buttonRequestSetupItemList.Text = "List"; + this.buttonRequestSetupItemList.UseVisualStyleBackColor = true; + this.buttonRequestSetupItemList.Click += new System.EventHandler(this.buttonRequestSetupItemListt_Click); + // + // tabPage5 + // + this.tabPage5.Controls.Add(this.buttonImport); + this.tabPage5.Controls.Add(this.buttonExport); + this.tabPage5.Controls.Add(this.comboBox2); + this.tabPage5.Location = new System.Drawing.Point(4, 22); + this.tabPage5.Name = "tabPage5"; + this.tabPage5.Padding = new System.Windows.Forms.Padding(3); + this.tabPage5.Size = new System.Drawing.Size(603, 279); + this.tabPage5.TabIndex = 4; + this.tabPage5.Text = "Import/Export"; + this.tabPage5.UseVisualStyleBackColor = true; + // + // buttonImport + // + this.buttonImport.Location = new System.Drawing.Point(206, 91); + this.buttonImport.Name = "buttonImport"; + this.buttonImport.Size = new System.Drawing.Size(75, 23); + this.buttonImport.TabIndex = 3; + this.buttonImport.Text = "Import..."; + this.buttonImport.UseVisualStyleBackColor = true; + this.buttonImport.Click += new System.EventHandler(this.buttonImport_Click); + // + // buttonExport + // + this.buttonExport.Location = new System.Drawing.Point(206, 45); + this.buttonExport.Name = "buttonExport"; + this.buttonExport.Size = new System.Drawing.Size(75, 23); + this.buttonExport.TabIndex = 2; + this.buttonExport.Text = "Export..."; + this.buttonExport.UseVisualStyleBackColor = true; + this.buttonExport.Click += new System.EventHandler(this.buttonExport_Click); + // + // comboBox2 + // + this.comboBox2.FormattingEnabled = true; + this.comboBox2.Location = new System.Drawing.Point(61, 47); + this.comboBox2.Name = "comboBox2"; + this.comboBox2.Size = new System.Drawing.Size(121, 21); + this.comboBox2.TabIndex = 1; + // + // tabPage6 + // + this.tabPage6.Controls.Add(this.buttonLoginCancel); + this.tabPage6.Controls.Add(this.checkBoxProposedUsers); + this.tabPage6.Controls.Add(this.textBoxUsernameList); + this.tabPage6.Controls.Add(this.label2); + this.tabPage6.Controls.Add(this.label1); + this.tabPage6.Controls.Add(this.textBoxPassword); + this.tabPage6.Controls.Add(this.textBoxUsername); + this.tabPage6.Controls.Add(this.buttonLogin); + this.tabPage6.Location = new System.Drawing.Point(4, 22); + this.tabPage6.Name = "tabPage6"; + this.tabPage6.Padding = new System.Windows.Forms.Padding(3); + this.tabPage6.Size = new System.Drawing.Size(603, 279); + this.tabPage6.TabIndex = 5; + this.tabPage6.Text = "Login"; + this.tabPage6.UseVisualStyleBackColor = true; + // + // buttonLoginCancel + // + this.buttonLoginCancel.Location = new System.Drawing.Point(34, 209); + this.buttonLoginCancel.Name = "buttonLoginCancel"; + this.buttonLoginCancel.Size = new System.Drawing.Size(75, 24); + this.buttonLoginCancel.TabIndex = 7; + this.buttonLoginCancel.Text = "Cancel"; + this.buttonLoginCancel.UseVisualStyleBackColor = true; + this.buttonLoginCancel.Click += new System.EventHandler(this.buttonLoginCancel_Click); + // + // checkBoxProposedUsers + // + this.checkBoxProposedUsers.AutoSize = true; + this.checkBoxProposedUsers.Location = new System.Drawing.Point(34, 22); + this.checkBoxProposedUsers.Name = "checkBoxProposedUsers"; + this.checkBoxProposedUsers.Size = new System.Drawing.Size(96, 17); + this.checkBoxProposedUsers.TabIndex = 6; + this.checkBoxProposedUsers.Text = "Proposed User"; + this.checkBoxProposedUsers.UseVisualStyleBackColor = true; + // + // textBoxUsernameList + // + this.textBoxUsernameList.Location = new System.Drawing.Point(34, 45); + this.textBoxUsernameList.Name = "textBoxUsernameList"; + this.textBoxUsernameList.Size = new System.Drawing.Size(547, 20); + this.textBoxUsernameList.TabIndex = 5; + // + // label2 + // + this.label2.AutoSize = true; + this.label2.Location = new System.Drawing.Point(31, 169); + this.label2.Name = "label2"; + this.label2.Size = new System.Drawing.Size(53, 13); + this.label2.TabIndex = 4; + this.label2.Text = "Password"; + // + // label1 + // + this.label1.AutoSize = true; + this.label1.Location = new System.Drawing.Point(31, 132); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(55, 13); + this.label1.TabIndex = 3; + this.label1.Text = "Username"; + // + // textBoxPassword + // + this.textBoxPassword.Location = new System.Drawing.Point(123, 162); + this.textBoxPassword.Name = "textBoxPassword"; + this.textBoxPassword.Size = new System.Drawing.Size(154, 20); + this.textBoxPassword.TabIndex = 2; + // + // textBoxUsername + // + this.textBoxUsername.Location = new System.Drawing.Point(123, 125); + this.textBoxUsername.Name = "textBoxUsername"; + this.textBoxUsername.Size = new System.Drawing.Size(154, 20); + this.textBoxUsername.TabIndex = 1; + // + // buttonLogin + // + this.buttonLogin.Location = new System.Drawing.Point(34, 76); + this.buttonLogin.Name = "buttonLogin"; + this.buttonLogin.Size = new System.Drawing.Size(75, 23); + this.buttonLogin.TabIndex = 0; + this.buttonLogin.Text = "Login"; + this.buttonLogin.UseVisualStyleBackColor = true; + this.buttonLogin.Click += new System.EventHandler(this.buttonLogin_Click); + // + // listviewLog + // + this.listviewLog.AllowColumnReorder = true; + this.listviewLog.BackColor = System.Drawing.SystemColors.ControlLightLight; + this.listviewLog.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { + this.columnHeaderTime, + this.columnHeaderLog}); + this.listviewLog.Dock = System.Windows.Forms.DockStyle.Fill; + this.listviewLog.FullRowSelect = true; + this.listviewLog.GridLines = true; + this.listviewLog.Location = new System.Drawing.Point(0, 0); + this.listviewLog.Name = "listviewLog"; + this.listviewLog.Size = new System.Drawing.Size(611, 161); + this.listviewLog.TabIndex = 0; + this.listviewLog.UseCompatibleStateImageBehavior = false; + this.listviewLog.View = System.Windows.Forms.View.Details; + this.listviewLog.DoubleClick += new System.EventHandler(this.listviewLog_DoubleClick); + this.listviewLog.Resize += new System.EventHandler(this.listviewLog_Resize); + // + // columnHeaderTime + // + this.columnHeaderTime.Text = "Time"; + // + // columnHeaderLog + // + this.columnHeaderLog.Text = "Log"; + this.columnHeaderLog.Width = 508; + // + // menuStrip1 + // + this.menuStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.toolStripMenuItem1}); + this.menuStrip1.Location = new System.Drawing.Point(0, 0); + this.menuStrip1.Name = "menuStrip1"; + this.menuStrip1.Size = new System.Drawing.Size(611, 24); + this.menuStrip1.TabIndex = 5; + this.menuStrip1.Text = "menuStrip1"; + // + // toolStripMenuItem1 + // + this.toolStripMenuItem1.Name = "toolStripMenuItem1"; + this.toolStripMenuItem1.Size = new System.Drawing.Size(52, 20); + this.toolStripMenuItem1.Text = "About"; + this.toolStripMenuItem1.Click += new System.EventHandler(this.toolStripMenuItem1_Click); + // + // FormMain + // + this.ClientSize = new System.Drawing.Size(611, 495); + this.Controls.Add(this.splitContainer); + this.Controls.Add(this.menuStrip1); + this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); + this.MainMenuStrip = this.menuStrip1; + this.Name = "FormMain"; + this.Text = "SE Cockpit"; + this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.FormMain_FormClosing); + this.FormClosed += new System.Windows.Forms.FormClosedEventHandler(this.FormMain_FormClose); + this.Load += new System.EventHandler(this.FormMain_Load); + this.ResizeEnd += new System.EventHandler(this.FormMain_ResizeEnd); + this.splitContainer.Panel1.ResumeLayout(false); + this.splitContainer.Panel1.PerformLayout(); + this.splitContainer.Panel2.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)(this.splitContainer)).EndInit(); + this.splitContainer.ResumeLayout(false); + this.panel1.ResumeLayout(false); + this.tabCockpit.ResumeLayout(false); + this.tabPage1.ResumeLayout(false); + this.tabPage1.PerformLayout(); + this.tabPage2.ResumeLayout(false); + this.tabPage3.ResumeLayout(false); + this.tabPage3.PerformLayout(); + this.tabPage4.ResumeLayout(false); + this.tabPage4.PerformLayout(); + this.tabPage5.ResumeLayout(false); + this.tabPage6.ResumeLayout(false); + this.tabPage6.PerformLayout(); + this.menuStrip1.ResumeLayout(false); + this.menuStrip1.PerformLayout(); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + private System.Windows.Forms.SplitContainer splitContainer; + private System.Windows.Forms.Panel panel1; + private System.Windows.Forms.TabControl tabCockpit; + private System.Windows.Forms.TabPage tabPage1; + private System.Windows.Forms.TabPage tabPage2; + private System.Windows.Forms.TabPage tabPage3; + private System.Windows.Forms.TabPage tabPage4; + private System.Windows.Forms.ListView listviewLog; + private System.Windows.Forms.Button buttonGetState; + private System.Windows.Forms.Button buttonDetach; + private System.Windows.Forms.Button buttonAttach; + private System.Windows.Forms.Button buttonDisconnect; + private System.Windows.Forms.Button buttonConnect; + private System.Windows.Forms.Button buttonModules; + private System.Windows.Forms.Button buttonStartMethod; + private System.Windows.Forms.ListBox listboxListOfMethods; + private System.Windows.Forms.Button buttonMethods; + private System.Windows.Forms.TextBox textBoxState; + private System.Windows.Forms.ColumnHeader columnHeaderTime; + private System.Windows.Forms.ColumnHeader columnHeaderLog; + private System.Windows.Forms.ListView listView1; + private System.Windows.Forms.ColumnHeader columnHeaderModule; + private System.Windows.Forms.ColumnHeader columnHeaderSensor; + private System.Windows.Forms.TextBox textBoxMethodInstruction; + private System.Windows.Forms.TextBox textBoxMethodSampleId; + private System.Windows.Forms.ListView listView2; + private System.Windows.Forms.ColumnHeader columnSensor; + private System.Windows.Forms.ColumnHeader columnHeader2; + private System.Windows.Forms.Button buttonSensors; + private System.Windows.Forms.Button buttonConnectSensorToModule; + private System.Windows.Forms.Button buttonTermiate; + private System.Windows.Forms.TabPage tabPage5; + private System.Windows.Forms.Button buttonExport; + private System.Windows.Forms.ComboBox comboBox2; + private System.Windows.Forms.Button buttonImport; + private System.Windows.Forms.ComboBox comboBoxSensor; + private System.Windows.Forms.ComboBox comboBoxModule; + private System.Windows.Forms.Button buttonRequestSetupItemList; + private System.Windows.Forms.ListView listViewSettings; + private System.Windows.Forms.ColumnHeader columnHeader3; + private System.Windows.Forms.ColumnHeader columnHeader4; + private System.Windows.Forms.TabPage tabPage6; + private System.Windows.Forms.Button buttonLogin; + private System.Windows.Forms.Button buttonClearLog; + private System.Windows.Forms.ComboBox comboBoxSevenExcellence; + private System.Windows.Forms.Button buttonLoginCancel; + private System.Windows.Forms.CheckBox checkBoxProposedUsers; + private System.Windows.Forms.TextBox textBoxUsernameList; + private System.Windows.Forms.Label label2; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.TextBox textBoxPassword; + private System.Windows.Forms.TextBox textBoxUsername; + private System.Windows.Forms.Button buttonSetupSetting; + private System.Windows.Forms.TextBox textBoxSettingValue; + private System.Windows.Forms.ComboBox comboBoxSettingTag; + private System.Windows.Forms.MenuStrip menuStrip1; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItem1; + + + + + + } +} + diff --git a/SERemoteControl/FormMain.cs b/SERemoteControl/FormMain.cs new file mode 100644 index 0000000..923e2c9 --- /dev/null +++ b/SERemoteControl/FormMain.cs @@ -0,0 +1,616 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Globalization; +using System.IO; +using System.Linq; +using System.Text; +using System.Threading; +using System.Threading.Tasks; +using System.Windows.Forms; +using log4net; +using log4net.Appender; +using MT.Platform.Common; +using SERemoteLib; +using Services.NotificationBroker.Notifications; + +namespace SERemoteControl +{ + public partial class FormMain : Form + { + private SERemoteConnection.SEClient m_client; + private SERemoteConnection.SEConnection m_connection; + + /// + /// Make use of logging infrastructure. + /// + private static readonly ILog _logger = LogManager.GetLogger(typeof(FormMain)); + + /// + /// This logger property is used to log events + /// + public static ILog Logger + { + get { return _logger; } + } + + /// + /// Marshal calls back to the UI thread. Do not access UI controls from background threads (e.g. callback operation calls!) + /// + private readonly SynchronizationContext uiSynchronizationContext; + + public FormMain() + { + InitializeComponent(); + + uiSynchronizationContext = SynchronizationContext.Current; + + //((log4net.Repository.Hierarchy.Hierarchy)log4net.LogManager.GetRepository()).Root.AddAppender(this); + + // register a notification handler to log + NotificationBroker.Register(typeof(LogWrittenNotification), (object thesender, Notification notification) => + { + LogWrittenNotification logNotification = notification as LogWrittenNotification; + + // only write on UI thread! + uiSynchronizationContext.Send((object state) => + { + Log(state as string); + }, logNotification.Text); + }, null); + + + this.comboBox2.DataSource = Enum.GetValues(typeof(SERemoteConnection.EItemType)); + + var version = System.Reflection.Assembly.GetExecutingAssembly().GetName().Version; + this.Text = String.Format("Mettler Toledo - SE Cockpit V{0}", version); + + EnableTabAndControls(false); + } + + public void EnableTabAndControls( bool enable ) + { + EnableTab(tabPage2, enable); + EnableTab(tabPage3, enable); + EnableTab(tabPage4, enable); + EnableTab(tabPage5, enable); + EnableTab(tabPage6, enable); + buttonConnect.Enabled= !enable; + buttonDetach.Enabled= enable; + buttonGetState.Enabled = enable; + buttonAttach.Enabled= enable; + buttonDisconnect.Enabled= enable; + } + + public static void EnableTab(TabPage page, bool enable) + { + foreach (Control ctl in page.Controls) ctl.Enabled = enable; + } + + private void buttonConnect_Click(object sender, EventArgs e) + { + m_connection = new SERemoteConnection.SEConnection(); + + string address = this.comboBoxSevenExcellence.Text; + + try + { + Uri uri = new Uri(address); + + if (m_connection.Open(uri.Host, uri.Port)) + { + m_client = new SERemoteConnection.SEClient(m_connection); + + EnableTabAndControls(true); + + if (this.comboBoxSevenExcellence.FindString(address) == -1) + { + this.comboBoxSevenExcellence.Items.Add(address); + } + + } + } + catch( UriFormatException ) + { + } + } + + private void buttonAttach_Click(object sender, EventArgs e) + { + if (m_client!=null) + m_client.Attach(); + } + + private void buttonDetach_Click(object sender, EventArgs e) + { + if (m_client != null) + m_client.Detach(); + } + + private void buttonDisconnect_Click(object sender, EventArgs e) + { + if (m_client != null) + { + m_connection.Close(); + EnableTabAndControls(false); + } + } + + private void buttonGetState_Click(object sender, EventArgs e) + { + if (m_client != null) + textBoxState.Text = m_client.GetStatus(); + } + + private void buttonStartMethod_Click(object sender, EventArgs e) + { + if (m_client != null) + { + int index= this.listboxListOfMethods.SelectedIndex; + if (index>=0) + { + string methodId= this.listboxListOfMethods.SelectedItem.ToString(); + string comment= this.textBoxMethodInstruction.Text; + string sampleId = this.textBoxMethodSampleId.Text; + m_client.startMethod(methodId, sampleId, comment); + } + } + } + + + private void buttonTermiate_Click(object sender, EventArgs e) + { + if (m_client != null) + { + m_client.terminateMethod(); + } + } + + private void LogUI(string text) + { + // make sure we are on UI thread + if (this.InvokeRequired) + { + throw new InvalidOperationException("must only be called on UI thread!"); + } + + // log to list view + ListViewItem item = listviewLog.Items.Add(new ListViewItem(new string[] { DateTime.Now.ToString("dd.MM.yyyy HH:mm:ss.fff", CultureInfo.InvariantCulture), text })); + item.EnsureVisible(); + } + + /// + /// Write to list view log and scroll automatically. + /// + /// + public void Log(string text) + { + if (this.InvokeRequired) + { + // switch to UI thread, because call came from bg thread + this.uiSynchronizationContext.Send((state) => { LogUI(text); }, null); + } + else + { + LogUI(text); + } + } + + private void buttonMethods_Click(object sender, EventArgs e) + { + if (m_client != null) + { + this.listboxListOfMethods.Items.Clear(); + string[] methods = m_client.getListOfMethods(); + if (methods!=null) + this.listboxListOfMethods.Items.AddRange(methods); + } + } + + private void buttonModules_Click(object sender, EventArgs e) + { + if (m_client != null) + { + this.listView1.Items.Clear(); + this.comboBoxModule.Items.Clear(); + + MT.pHLab.SE.V1.moduleConfigParamRecord[] modules = m_client.getListOfModules(); + + if (modules!=null) + { + foreach (MT.pHLab.SE.V1.moduleConfigParamRecord module in modules) + { + ListViewItem item = new ListViewItem(module.m_moduleId); + item.SubItems.Add(module.m_sensorId); + item.SubItems.Add(module.m_tempSensorId); + this.listView1.Items.Add(item); + this.comboBoxModule.Items.Add(module.m_moduleId); + } + } + } + } + + private void buttonConnectSensor_Click(object sender, EventArgs e) + { + if (m_client != null) + { + this.listView2.Items.Clear(); + this.comboBoxSensor.Items.Clear(); + + this.listboxListOfMethods.Items.Clear(); + string[] sensors = m_client.getListOfSensors(); + + foreach (string sensor in sensors) + { + ListViewItem item = new ListViewItem(sensor); + // item.SubItems.Add(sensor); + this.listView2.Items.Add(item); + this.comboBoxSensor.Items.Add(sensor); + } + } + } + + private void buttonConnectSensorToModule_Click(object sender, EventArgs e) + { + string sensorId = this.comboBoxSensor.Text; + string moduleId = this.comboBoxModule.Text; + + if (m_client != null && moduleId != null && sensorId != null) + { + m_client.setModule(moduleId, sensorId); + buttonModules_Click(sender, e); + } + } + + private void buttonExport_Click(object sender, EventArgs e) + { + if (m_client != null) + { + SERemoteConnection.EItemType eItemType = (SERemoteConnection.EItemType)Enum.Parse(typeof(SERemoteConnection.EItemType), this.comboBox2.SelectedValue.ToString()); + + Byte[] table= null; + table= m_client.exportTable(eItemType); + + if (table != null) + { + SaveFileDialog saveFileDialog = new SaveFileDialog(); + + saveFileDialog.FileName = "Export-" + eItemType.ToString() + "-" + DateTime.Now.ToString("yyyyMMddHHmmssfff"); + // the filter box and no extension is specified by the user. + saveFileDialog.DefaultExt = "xml"; + saveFileDialog.Filter = "xml files (*.xml)|*.xml|All files (*.*)|*.*"; + saveFileDialog.FilterIndex = 1; + saveFileDialog.RestoreDirectory = true; + saveFileDialog.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments); + + if (saveFileDialog.ShowDialog() == DialogResult.OK) + { + Stream myStream; + if ((myStream = saveFileDialog.OpenFile()) != null) + { + using (BinaryWriter writer = new BinaryWriter(myStream, Encoding.UTF8)) + { + writer.Write(table); + } + myStream.Close(); + } + } + } + } + } + + private void buttonImport_Click(object sender, EventArgs e) + { + if (m_client != null) + { + Stream myStream = null; + OpenFileDialog openFileDialog = new OpenFileDialog(); + + openFileDialog.InitialDirectory = "c:\\"; + openFileDialog.Filter = "xml files (*.xml)|*.xml|All files (*.*)|*.*"; + openFileDialog.FilterIndex = 1; + openFileDialog.RestoreDirectory = true; + openFileDialog.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments); + + if (openFileDialog.ShowDialog() == DialogResult.OK) + { + try + { + if ((myStream = openFileDialog.OpenFile()) != null) + { + using (myStream) + { + // Insert code to read the stream here. + byte[] table= ReadToEnd(myStream); + if (table != null) + { + m_client.importTable(table); + } + } + } + } + catch (Exception ex) + { + MessageBox.Show("Error: Could not read file from disk. Original error: " + ex.Message); + } + } + } + } + + public static byte[] ReadToEnd(System.IO.Stream stream) + { + long originalPosition = 0; + + if (stream.CanSeek) + { + originalPosition = stream.Position; + stream.Position = 0; + } + + try + { + byte[] readBuffer = new byte[4096]; + + int totalBytesRead = 0; + int bytesRead; + + while ((bytesRead = stream.Read(readBuffer, totalBytesRead, readBuffer.Length - totalBytesRead)) > 0) + { + totalBytesRead += bytesRead; + + if (totalBytesRead == readBuffer.Length) + { + int nextByte = stream.ReadByte(); + if (nextByte != -1) + { + byte[] temp = new byte[readBuffer.Length * 2]; + Buffer.BlockCopy(readBuffer, 0, temp, 0, readBuffer.Length); + Buffer.SetByte(temp, totalBytesRead, (byte)nextByte); + readBuffer = temp; + totalBytesRead++; + } + } + } + + byte[] buffer = readBuffer; + if (readBuffer.Length != totalBytesRead) + { + buffer = new byte[totalBytesRead]; + Buffer.BlockCopy(readBuffer, 0, buffer, 0, totalBytesRead); + } + return buffer; + } + finally + { + if (stream.CanSeek) + { + stream.Position = originalPosition; + } + } + } + + private void listView1_SelectedIndexChanged(object sender, EventArgs e) + { + string moduleId = this.listView1.SelectedItems[0].Text; + + if (moduleId != null) + { + this.comboBoxModule.SelectedIndex = this.comboBoxModule.FindStringExact(moduleId); + } + } + + private void listView2_SelectedIndexChanged(object sender, EventArgs e) + { + string sensorId = this.listView2.SelectedItems[0].Text; + + if (sensorId != null) + { + this.comboBoxSensor.SelectedIndex = this.comboBoxSensor.FindStringExact(sensorId); + } + } + + private void buttonRequestSetupItemListt_Click(object sender, EventArgs e) + { + if (m_client != null) + { + string[] settingNames = { + "UserSetting.guiLanguage", + "UserSetting.protocolLanguage", + "UserSetting.settingsBrightness", + "UserSetting.Beep.buttonBeep", + "UserSetting.Beep.userBeep", + "UserSetting.Beep.newsBeep", + "UserSetting.Beep.errorBeep", + "UserSetting.Beep.stabilityBeep", + "UserSetting.alphanumericKeyboard", + "GlobalSetting.confirmEndOfAnalysis", + "GlobalSetting.showRequiredResourcesAtStart", + "GlobalSetting.showCalulatedResultsAfterAnalysis", + "GlobalSetting.bSuppresPopups", + "GlobalSetting.globalTemperatureUnit", + "GlobalSetting.globalBarometricPressureUnit", + "GlobalSetting.lifeSpanExpireAction", + "GlobalSetting.usableLifeExpireAction", + "GlobalSetting.DataTime", + "GlobalSetting.Identification_ID", + //"NetworkSetting.keepAlive" + }; + + this.comboBoxSettingTag.Items.Clear(); + + this.listViewSettings.Items.Clear(); + + foreach (string settingName in settingNames) + { + string value = m_client.getSettings(settingName); + + ListViewItem item = new ListViewItem(settingName); + item.SubItems.Add(value); + this.listViewSettings.Items.Add(item); + + this.comboBoxSettingTag.Items.Add(settingName); + } + } + } + + private void listViewSettings_SelectedIndexChanged(object sender, EventArgs e) + { + string settingTag = this.listViewSettings.SelectedItems[0].Text; + + if (settingTag != null) + { + this.comboBoxSettingTag.SelectedIndex = this.comboBoxSettingTag.FindStringExact(settingTag); + } + } + + private void buttonSetupSetting_Click(object sender, EventArgs e) + { + string settingTag = this.comboBoxSettingTag.Text; + string settingValue = this.textBoxSettingValue.Text; + + if (m_client != null && settingTag != null && settingValue != null) + { + m_client.setSettings(settingTag, settingValue); + buttonRequestSetupItemListt_Click(sender, e); + } + } + + private void FormMain_ResizeEnd(object sender, EventArgs e) + { + + } + + private void listviewLog_Resize(object sender, System.EventArgs e) + { + SizeLastColumn((ListView)sender); + } + + private void SizeLastColumn(ListView lv) + { + this.listviewLog.Columns[this.listviewLog.Columns.Count - 1].Width = -2; + } + + + private void listviewLog_DoubleClick(object sender, EventArgs e) + { + foreach (ListViewItem item in this.listviewLog.SelectedItems) + { + MessageBox.Show(item.SubItems[1].Text, item.SubItems[0].Text); + } + } + + private void buttonClearLog_Click(object sender, EventArgs e) + { + + } + + private void FormMain_FormClose(object sender, EventArgs e) + { + if (m_connection != null) + m_connection.Close(); + } + + private void FormMain_Load(object sender, EventArgs e) + { + if (SERemoteControl.Properties.Settings.Default.AddressHistory != null) + { + try + { + StringReader sr = new StringReader(SERemoteControl.Properties.Settings.Default.AddressHistory); + var adresses = sr.ReadLine().Split(';'); + this.comboBoxSevenExcellence.Items.AddRange(adresses.ToArray()); + } + catch (System.NullReferenceException) + { + this.comboBoxSevenExcellence.Items.Add("http://localhost:8016"); + this.comboBoxSevenExcellence.Items.Add("http://localhost:8014"); + } + + string address= SERemoteControl.Properties.Settings.Default.CurrentAddress; + int index= this.comboBoxSevenExcellence.FindString(address); + if ( index!= -1) + { + this.comboBoxSevenExcellence.SelectedIndex= index; + } + } + + this.textBoxUsernameList.Text= "Thomas;Xufeng;Toni;Max"; + } + + private void FormMain_FormClosing(object sender, FormClosingEventArgs e) + { + if (SERemoteControl.Properties.Settings.Default.AddressHistory != null) + { + + var list= new List(); + { + foreach (var item in this.comboBoxSevenExcellence.Items) + { + list.Add(item.ToString()); + } + } + + SERemoteControl.Properties.Settings.Default.CurrentAddress = this.comboBoxSevenExcellence.Text; + SERemoteControl.Properties.Settings.Default.AddressHistory = string.Join(";", list.ToArray()); + + SERemoteControl.Properties.Settings.Default.Save(); + } + + } + + struct LoginRequestResult + { + public string username; + public string password; + } + + LoginRequestResult LoginRequest() + { + string[] usernamelist = null; + if (this.checkBoxProposedUsers.Checked) + { + StringReader sr = new StringReader(this.textBoxUsernameList.Text); + usernamelist = sr.ReadLine().Split(';'); + } + + LoginRequestResult result; + result.username= ""; + result.password= ""; + + if (m_client.showScreenLogin(usernamelist, ref result.username, ref result.password)) + { + // + } + return result; + } + + private async void buttonLogin_Click(object sender, EventArgs e) + { + Task returnedTask = Task.Run(() => LoginRequest()); + + LoginRequestResult result= await returnedTask; + + this.textBoxUsername.Text = result.username; + this.textBoxPassword.Text = result.password; + } + + + private void buttonLoginCancel_Click(object sender, EventArgs e) + { + if (m_client.showScreenLoginCancel() ) + { + // ... + } + } + + private void toolStripMenuItem1_Click(object sender, EventArgs e) + { + AboutBox about= new AboutBox(); + about.ShowDialog(); + } + + } + +} diff --git a/SERemoteControl/FormMain.resx b/SERemoteControl/FormMain.resx new file mode 100644 index 0000000..b2041ae --- /dev/null +++ b/SERemoteControl/FormMain.resx @@ -0,0 +1,1648 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 17, 17 + + + + + AAABAAEAqqoAAAEAGAAYZAEAFgAAACgAAACqAAAAVAEAAAEAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAD///////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////+/v7////////+/v7////+/v7+/v7//////////////v/////+///8///7/f/6/v/5 + /f76/P3+/f3////////+/v7+/v7+/v7////////////8/v79//////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////8AAP////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////7+/v7+/v////7+/v/////////+//3+//3+/v3+/v3+//7///7///7///7///// + //7+/v79//z7/fr5+vX09u7t8Ofn6eHi49vc3NbY2NXX2NjZ2eDg4PDu7vv6+v/////+/v/+/v////39 + /f7+/v7///7+/v////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////wAA//////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////v7+//////////////// + /////v7//f///f///f///f///f///P//+v3++Pv79PX27u7w5Obo293e0tLUxsbIu7u8tbO1oJ2eeXZ1 + gX5/raqqvLm5vby8yMfH4d7f+vf3//////////7+//7+/////f39/v7+//////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////AAD///////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////+/v7+/v7+/v7////////////+///9///7/f75/P31+vvx9ffq7/Dj5+jZ3d7R + 09XGyMm6vb6usrOnq6ujpKaioqSjoqKqp6enoqOmoaK2r7DFvb7Evr/Avr6/vr7EwMHW0dLu6ev7+vr/ + /////v7+/v7+/v7+/v7///////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////8AAP////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////7+/v////////////////////////////7+/v39 + /fn5+fT09e7u8eXm6dnc387S1MPGybe7va+ytaeqraWmqaWmqaamqayqrLSxs7y5usbDxM3Ly9HOztzZ + 2eHd3dzY19LOzcrHx8O+v7q2t7axsrWwscC7vNTP0Ovn6P38/P////7+/v7+/v////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////wAA//////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////7///// + ///////////////////////////+///+///+//////7//////////////////v///v///v///v///v// + ///+///+///+///+///+///+///+///+///+///+//////7//v7//v7///7///7///////////////// + //////////////////7//Pv8+fn69fX27e7v4+Xl293d0NHSxcXGvbu8srCyqaiop6ampqWmqqipsbCx + ubm5wb/AyMXIz83O1dPU2tfY3Nra3Nra3t3d4ODg4N7e4N7e3dvb1dLSz8vLxsHCvrm6tbCxq6anpaCh + qKKjvLe43tvb+vn5//////////7+/////v7+//////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////AAD///////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////v////////////////////////////////7///7///7/ + ///////////////////////////+///+///+///+//////7///7///7///7///7///7+/v7///7///7+ + //3+/v7//f///v///v///v///////////////v///v/8+/35+fr08/Xr7O7l5ufc293Pz9HExce6vL2w + sLKrqqymp6impaasqamyra+7trbGwcDPysnUz8/Z1dTe2tne29vf3d3g39/f397e3t7g4ODh4eHj4+Pk + 5OTl5OTk4+Pf3d3X09TQysvIw8TAu7y3srOzrq+sp6ihnJ2fmpuuqqrY1tb9+vr////////////+/v7+ + /v7///////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////8AAP////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////7///7///7///3///3///7////////////////+ + ///////+/v/+/v/+/v7///7///3+/vz+/v3+/v3///3///7////////////+//38/vz7/fn4+vLx8+vq + 7OXk5trZ287P0cTIybm8va+ys6yur6usrquqra6tsLaztr+7vcfDxc7KzNXT09nX19za2d/c2+Lf3uLf + 3uDe3eDe3eHg4OHh4eTj4+Xj4+Pi4uXl5eTk5OTk5OTk5OTj4+Pi4t/d3dbT083KysbBwr+6u7WwsbCr + rK6pqq2oqaynqKijpLGvr+bk5P/////////+/v////7+/v////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////wAA//////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////v///v///v///f///f///f///v///////////////v//+///+///+///+////P///v///v////// + /////v3//Pv9+fj69PP17u3v5OPm2tnczczOw8PFurm8sbCyrq2vrayusq+wubW2vLq6wsDAy8rL0dDR + 1NTU19nZ2tvc2drb29zd4eDg4N/f4eHg4uLi4+Ti5OXj5OTj4+Pj4+Tk4+Xl5eTk5ePj5ePj5eXl5OTk + 5OTk4uTk4+Tk4+Pj3d3d09LSzMvLxcLCvLm6tK+wr6qrq6anq6anrqmqt7Kzu7m5xMLC8vHx//////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////AAD///////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////////////////////////////+///+///9///9///9///+ + ///+///+///8/v/9///+///9///8/v/6/P33+fry9PXt7e/j5Obb29zRz9DGxca8u7y0srSura6trK2v + rq+1tLW+vb7HxsfQzs7W09Pc2Njh3d3g3t7f3t7e3t7e3d3c3t7e4ODf4uLj5OTm5ubl5eXl5eXl5eXk + 5eTl5eTl5eXl5eXj5eXi5OTk5OTm5OTl5eXm5eXk5OTk5eXj5eXj5OXi4uLb3NzP0NDJycnCwcG6uLiz + sLCuqquqpaappKWtqaq2srPEwsLOzMzc2dn7+vr///////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////8AAP////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////////////////////////////////////////////+///+ + ///+///+///+///+//////////////////7///3///7///7///7///78/vv4+vbz9e3s7uPj5dnY2s7P + 0MPFxru+vrW3uLGzs7Sysri1tbu5ucLAwMjGxtHOztjV1d3b297c3N7c293d3N7f3+Dg4OHg4ODg4OHi + 4uTi4ubk5Ojm5ufm5unl5ujl5uTk5OXl5eTk5OXl5ebm5uXl5eTk5OTk5OPl5eTm5uXl5eXk5OTk5OXl + 5eTl5eLl5eHj4+Hj4+Dj4tvd3dHT08rLy8DAwLa0tK2rq6mmp6mlpqmkpa6qq7a0tMfFxd/d3d7c3Onn + 5//+/v////7+/v7+/v////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////////wAA//////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////v7+/////////v7+//////7//v3+/v3//v3//////////////////////v7+/P39 + +Pj49fX18O7u5uXm2Nrazc7OxMPEvb29uLi4uLa2ubW2vbi5w76/ysXG0MzM1tTU2dfX3dvb3tzc393d + 4t/f4t/f4N7e4t/f4+Hh4uLi4+Tk5eTk5uXl5eXl5ubm5+Xl5+Xl6Obm5+Xl6OTl6eXm5+Xl5+Xl5eTk + 5ubm5ubm5eXl5OTk5eXl5eXl5OTk4+Pj5OTk5OTk4uPj5Obm5ujo6Ozr6vDu6O3s4uTk3N7e2dvb19jZ + 0dHRv76+rKurpKKipqSkr6ysuri4zMrK5eXl5+bm3tzc9PLy/////v7+/v7+//////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////AAD///////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////////////////////////////+/v7//////////v/+/f/+ + /f///////v/9/v/7///5/fz3/Pv09vbt7e3l5eXe3NzV0NG2sbGbk5SknJ62srG8ubjDv7/Gw8LLyMjR + 0M/Z1tXe29vh397f3dzc29rc29vg39/j4uLj4+Pj4+Pl5OTl5eXl5OTm5eXn5+fp5+fp5ebq5ebp5OXn + 5OTm5eXo5+fm5eXk5eXl5ubl5+fm5+bo5ubp5+fm5eXl5OTk4+Xm5ebl5eXk5OTl5eXo5+fo6Ojq7Ozt + 7+/u8PDq7u7m6unb4N/O09LFysnAxMTBxMTAwsLDx8bJzczV1tba29vDwsKrqqqura29vLzR0NDp6enr + 6urj4ODj4eH9/Pz+/v7///////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////8AAP// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////7///7+//7////////////+//79/v38/Pn4+fPy8+zt7eHn5tfd3M/U08bLysLDw728 + vL26urq0tbCoqbmtr83Cw9jT0trW1eDc2+Pf3uTh3+Lg3+Hf3uDg3uHg3uPj4eTk4uXl5ebm5ufn5+bm + 5ufn5+Xl5eXl5ebm5ubm5ubm5ubm5ufl5unl5ujm5ufm5ujm5ufm5ubm5uXm5ubn5+Xm5uXl5efm5ujm + 5ubm5ubn5+jo6urp6+vq6+zs7Ovs7Onp6eXn59/i4tfa2c3S0cXLyb/FxLvAv7vAv7/Dw7/Dw8PFxcHE + w7/Fw7zCwb/CwsjLytjZ2dPU1L29vbu8vNjZ2e3t7ezs7Ozq6tza2unp6f////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////wAA//////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////f///f///P7/+fr89fT27u7v + 5eXl3Nra1tTU0M7OycfHw8PDwcHBwsLCw8XFysrK0c/P1tPT4Nvc5+Dh6OHi5+Dh4N/e4uLg5eXj5eTj + 5ePi5+Xk6Obl6ujn7eno7uno7Ojo6Ofn6Ojo5+fn5+fn5ubm5+fn5+fn6Ojo6Ojo6Ojo5ujo5ejo5Ojo + 4+fm5Obm5Obm5ubm5ubm5+Xl6ebm7enq7err7O3t7u7u7vDw6uzt5ejp3+Pk2dzd0tXWzM7OycvLxsjI + v8TDu8HAvcLBv8TEwcbFwsfGw8jHwsbHxMfHx8nKxMnIwsjHwsjHwsjGwcbFw8XFztDQ2tzczdDQ2Nvb + 7e/v6+zs7uzs5+Xl2NjY8PHx//////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + AAD///////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////7/v/2+Pnn6erU1dfHxsnCwsPEw8PJx8fOzc3Tz9DX0dLc1NXd1dbh29zi3t/i + 3t/i4ODj4uLk4uLk5OTm5+fn5+fp5+fq6enq6uro6Ojp6enq6urp6eno6Ojp6Ojp6Ojp6Ojn5+fn5+fn + 6Ojn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fm5+bm5+fm5+fn5+jo6Ojp6urr7u7v8fHy8/Lv8fDp7Ovi + 5OTX2trO09PIzM3Dx8jAxca/xMW+wsO+w8K/w8PAxcTBxsXBxsXDyMfBx8bBx8bGy8nIzMvKzs3LzMzB + wcHCx8W/x8a+xcTAxsXBx8bBxsW9wsHGysng4+Lg5eTo7Ovr7Ozs6+vu7Oze3t7b29v09PT///////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////8AAP////////////////////////////////// + //////7///v///z///7///////7//v3//vz//vz//f7//v///v///v/+/v///v///v7//v7///7///// + ///+///+///9///+//////////////////////7+/v////////7+/v////z9/e7x8tPX2Li7vLKztMDA + wdDPz9jX1t3b29/d3N/d3ePf3+Xf3+Tg3+fj4ujl4+fj4+nn5uzq6urq6ejq6ejr6unr6+3q6+zq6uvq + 6urp6erp6eno6Oro6Ono6Ono6Ono6Ojn5+no6Ojn5+fn5+jo6Ojn5+fn5+jn5+fn5+bn5+jp6err6+vr + 6+3t7e7w8O7x8Ozu7ujs6+Tq6d3j4tPa2crS0MXJyMHCwrzAvrrBvbrEwLvFw7/Gxb/DxMDFxsLHyL/G + yL/HyMbJycjJycbFxsK/vb+6trqwq66im5+Qh4t5b3dkWJCDe8bCwsXExcDCwr3Cw7vCwL7EwLzCvc7S + zubp6Obp6+vu8Ovs7e3s7Onp6djY2N7c3Pn4+P////7+/v3+/v3+/v7///////////////////////// + //////////7///7///7///////////////////////////////////////////////////////////// + /////wAA/////////////////////////////////////////f//+////P///v///////v///v///P/+ + +v/9/P/9///9//7+///+///+///+/v/+/P/+/v////////////7///7///7///////////////////// + //////////////7+////9/j4297fvMDBv8PD2dnZ5OTk5ePi5OLi5ePj5uXj5+fl5+jm5unn6Ovp6uvp + 6uvp6+vq7Ovq6+rp6+vq6+vr6erq6erq6+rq7Orq6+np6+np6+rq6ujo6+np6+rq6ujo6+jo6+np6+np + 6ujo6ejo6enp6enp6+zs7u7u8PDw7u/w7O7u6uzs5ujo4uXk3N/f1NrYzdLRxszLwsjHvcTDusHAu8PC + v8TEwsTGwMXFvcfDucfCu8bDvsXEwsTEycnGycbEv766trOurqWgo5eSlIeBjHpyfmleb1VIZUY3YD4r + Yj0oYTwjYUIypJWRysjHv8TDvcPDvcXCvMbAu8W+v8XA2tzb5+js5+ns7O7u6uzs6+zs5OPj09DQ4N7e + +/r6/v///P///P///f7+/////////////////////////////////f///f///v////////////////// + ////////////////////////////////////////////////AAD///////////////////////////// + /////////////////v///v///v///v///v///v///v/+/f/9/v/9/v/+/v///v///v///v7///7+//7/ + //7///7+//3+//39//39//7+///////////////////////+/v7////////////4+fnl6Ond3+Dr7Ozu + 7u7r6+vr6enr6ent6+vr7Orr7err7Ovp6+3n6+vo6erp6uvr6+zr6uvr6evt6+zr6uzq6evp6Orq6unq + 6urq6urq6urp6enp6enq6urq6urq6ens6uru7e3u7u7x8fHy8vLx8vLw8vLs7u7l5+fd39/W2NjR0tLL + zs7Gy8rEycjBxsW/xMO/xMO/xMPAxcTAxcTAxsXAxsXAxce+xMm+xcm/xsi/xse/xsXAxcXGxcKmnpWH + dWiBZ1Z1V0RsTTxkRTRqSzqGZVOCX01uSjZpQy1qQStvRCxvQytiPCpjUEassKe9y8K7xMDAxMO8xMG6 + x8O6wsDLy8vl5ebn6Onq7Ozq7Ozv7+/r6urf3d3Qzs7n5ub9/v7+///8/v7+//////////////////// + ///////////////////9///+//////////////////////////////////////////////////////// + //////////8AAP/////////////////////////////////////////////+///+///+///////+/v// + ///////////+//3+//z+//v+//z///3////+///+///+//////7//vr//vj//vj///7///////////// + //////////7+/v////7+/v////7+/vf3+PDx8fHx8e7u7urq6u3r6+7s7Orq6uvr6uzt7O/t7fDq7u/q + 7u7p7e7p7fDr7e/q7e3q7Ozq6urq6unq6ujp6ujq6unr6+nq6unq6+zt7evs7Ozu7u7w8PDy8vLy8u/w + 8Ovt7efp6ODi4tba2czR0cfLy8PIx8DEw7/Dw8DEw8DExMDGxcHGxcDFxMHGxcPIxsHFxsLFxsLFxsPG + xsLFxcDFxb/JxMHIxsTGx8bFx8PGx8HFxsnJxpaKg1c8LWc+Km9AKWxDKmtCK3NKNIBaQ3VOOXpSPm9I + M2g/K2k+K21ALm5FN2FHP5KOhMHKwbvCvsHAwsDCxbzExrrDxLzAwNXZ1ujr6eTo5+zv7+3u7u/v7+no + 6NPS0srJyeXm5vv8/P7///3///3+/v////////////////////////////////////////////////// + /////////////////////////////////////////////////////wAA//////////////////////// + //////////////////////3///7//v7//P7++//+/v/+///9///9///+/f/++//+/P///P///f///v7/ + /v7//f7//f3//v7//P7//P7//P///v///////////////////////////////f39/////v7+9fT08vDw + 7+7u7e3t7Ozs7Ovr7ezs7Ozs7Ozs6+zs7ezs8Ovt7urs7urs7err7enq7Ovr6+zr6ezq6ezr6e3s6u7t + 6+/u7vLx7/Ly7vHx7fDw6+/u5+rq4OTj2t7d1NjXz9LSyc3Mw8jHwMXEwMbFwMXEwMXEwMXEwMXEwMXE + v8XEwcbFwsfGwsfGwsfGwcfGwcbGwcbGwsbHw8bHwsXGwsXGwMfEvsnCwcjCxsXFx8THw8XJwMXJxsvK + xb+5gGhcZj0rckEtbD4rbD8tZj0tZkQzaUw+bVRHbFZJeWVZiXZrmYd7q5mSuKqnwr+4x83Fx83Jx8jJ + v8HGvL/FvsTHvMHBwcXA3uLe5erp5+rq6+3t7O3t7O3t5uTkycjIx8bG4ODg+fr6/v///P7+/f7+//// + //////////////////////////////////////////////////////////////////////////////// + ////////////////AAD//////////////////////////////////////////////v/+/v/9/v/6//76 + //78//77/fr3+fTy9O/t8u/q8e7q8e/u8/Hy9vX2+Pj6/P3+/////v///f///f///f7//f7///////// + ///////////////+/v7////////////8/Pz18/Py7+/w7+/u7u7t7e3r6+vs7Ozs7Ozr7Ozq6+vo6uro + 6ujo6+no6+nq7Ovr7uzs8O7u8/Hv9PLv9PHu8vDs8fDl6unf5ePc4eDV2tnP1NPKz87HzMvEycjCyMfC + x8bBx8bCyMfCyMfDycjCyMfCycjBx8bCyMfDycjCyMfBx8bCyMfDyMfCx8bCx8bCyMfBxsjAxsfAxsbB + x8fBxsfBx8bAx8W7xsO/xsPGxcbFxMa/xMi8xcq7xsfJzcm2rKRqU0ZjQzdxUEh+XlmJb2mTgHqek4yo + o56ztLC/wr7HzMjP1dHR0tDTzc3DvbmyraWgmZOemJXAv8C/wsW9wMTBxcW8wr7Hzcjj6Ofl6Ojq7Ozr + 7e3s7Ozt6+vg3t7KycnBwcHZ2dn3+Pj+///8/v7+//////////////////////////////////////// + //////////////////////////////////////////////////////////8AAP////////////////// + //////////////////////////r+/vn+/vj+/vf+/e/09OTo59rd3tHW2M/W2c/Z3szd4MXg38jg4M7h + 4dTf4tzj5+bq7/H09/v9/v7//////v3+/f////////////////////////7+/v////7+/v////z8/PXz + 8/Lw8PHw8O7u7uvr6+vr6+zs7Ovs7Ovt7evt7erv7evy7u728e708fD08/D18+vv7ujq6uLj5Nvb3NbU + 1c/Oz8fLysTKycTJyMLHxsPIx8LIx8PJyMPJyMPJyMLIx8LIx8PJyMPJyMPJyMPJyMPJyMLIx8LIx8PJ + yMPJyMLIx8LHx8TIxsTIx8PIx8HIx8DIyL/Hx77Gx7/Hx7/Ix7/Gxr/HxsDIx8DGxsLFxsPGxr7FxrrG + yLnGx7nGxMTKx7Gwqqainbm3tcfGxM7Oy87PzNLTzs/QzMrKyL+8u7CqqaCZmJODgoVraHdeVnJUSWtG + OmdHPaudlszMyb7Cwr/Cwr3FxLvEwtPY2Obr6ufq6u3u7u/v7+3t7eno6NvZ2dPR0b++vtXU1PT29vz/ + //3+/vz8/P7+/v////7+/v////////////////////////////////////////////////////////// + /////////////////////wAA/////////////////////////////////////////////f/+/f/++fn5 + 4eTkwsbKt8LHuMzVttbhstzord7spd/rmt7nl9zmm97nndzlndnhodfdst/jxefp4vX19/39///+//// + /////////////////v7+/v7+/////v7+////+/v78/Ly8vHx7u7u7/Dw7u/v8PHx8PHx8PHx7/Hx7vDw + 7O/u5+vq4+bm3uHh19vb0NTVys7Px8rMxMbJxMXJxsfLxcfKx8vKw8nIxcrJxMrJxcrJxcrJxMrJxMrJ + xMrJxMrJxMrJw8nIw8nIw8nIw8nIw8nIw8nIw8nIw8nIw8nIw8nIw8nHxcnGw8jHw8jHwcjHv8jIwMjH + v8fGvsfFwMjFwMfFvcfFvsfHwMfIwcbFwsfEwMfDwMbEw8rJxMvLys/P0NPS0tPRycnFv724tLCqp6Ga + nJGKk4N6jXpwhGpjhGZfgmJahmRajmtemHhmo31onm1ZlWZVhWxdwb2zw8nEu8HCu8PFvcPFwcfG3+Xj + 5ejo7O3t7e/v7Ozs7ezs4t/f3dnZ1tLSwb+/0dHR8fLy/v///f39/v7+/v7+//////////////////// + ////////////////////////////////////////////////////////////////AAD///////////// + //////////////////////////////////7//fvs6Om6u76msLe30tux3uue3euN2+yD2ux92Ot91+p5 + 0+Z41ed51+h42OZ61+F/0tqKzNGeys7R6evy/P3+///////+/v7////////+/v7+/v7////+/v7////7 + +/vz8/Py8/L19vXx8/Ps7u7m6eng5OPc39/W2NnS1NTN0NDKzM3HycvGycrDyMjDyMnCycrCycrEy8zD + y8vEzMzGzc3EycjGysrIzMvHy8rFysnFysnFysnEysnEysnEysnEysnEysnEysnDycjDycjDycjDycjD + ycjDycjDycjDycjDycfDycbCyMfCx8fBx8bBycjAyMfBx8bCyMbEyMXFycPByMW+x8nCysrIzsrQ0szV + 08vUz8jNxL/CtrKwpJ2fkYuQf3eAa2FvWE1iST1fQTRxT0J5VESYbV6ldmexgXG3h3e2iHa8kny6k3y4 + j3i9jXe/jXt6WEmGe2/EysK7xcS7wsW8wcS8wsHM0tDn7Ovm6ent7+/u7u7t7Ozt6+ve2drg29zY1NXA + wMDMzMzu7u7+/v7+///9/v7///////////////////////////////////////////////////////// + //////////////////////////8AAP////////////////////////////////////////7///7///38 + /eDh4rK6vbLIzbbi6J7f6Ivd53/a53jX5nfU5XrQ4nbK3XHI227H2mrH2GfG1GrF0X3M1nCvt42+xdX0 + +Pn+//////7+/v7+/v////////7+/v////7+/v////v8+/L08ff599/h4MrNzcnOzcfNy8bLysXKycbI + ycbIysXIycTJycbLy8fNzMnOzMvQzszSzs3Rzs/Uzc7RycnKwcrLxszOz8fKysbIyMnLy8bKycbLysbL + ysXLysXLysTKycTKycTKycTKycTKycTKycTKycXKycXKycTJyMTJyMTJyMPJyMHJxsLJyMLIx8LIx8PK + ycTKycfKycrLyc/NydPPytPPzM7NzMXDwLexqqSakJKAdoRvY3VcUWhLPl9AMV47K1o1JF02JV00I2I2 + JGU1JIFPPqp4ZMeUgMuYhbyKeKx+arGAb69+bKB0Y5duYJhtYad8cquJfrWkmsHAuLzCwLvCxb3Dxr3C + wsDFxNfc2+Xp6Onr6+/v7+/u7vLv7+vm59jT1OLe39nX18DAwMnJyezt7fz+/v3///7///7+/v7+/v// + //7+/v///////////////////////////////////////////////////////////////wAA//////// + /////////////////////////////////////////v3+6u3vydfZweLjr+bmktvcid3fjeHmjdzkidff + gdfcftbbf9LafM3XeczWfNHagdTdfcvThsrRnNneyfH18/v8/////////////////////v7+/////v7+ + ////+/v79ff22NvZuLy6w8jHxMnIxsrJx8zLxcrJycvMzc7P0NHSz9HPztDMzczIysfCwrq0u6+nsqKX + oo6BkXhrgGJUgm1jvLu5zc/PyMrKyMrKx8rKxsrJxcvKxsvKxcvKxcvKxcvKxMrJxMrJxMrJxcrJxcrJ + xcrJxcrJxcrJx8nJxsjJxcvJxc3Kx87My9HPys/OxsrJxMXDwb68u7WysKejnpSOkX92gWZacFJDZEQ0 + WDcoVTIkUzIlUTEjVjQlWjcnXzkoXzsmXTolXjgkYDgiXjMeZjcmonRitYp3qYBun3dom3lppH5xr4h/ + t5iSya2r2by85MfF5M/K6dvV183Iw7+9v8TEusTEvsXEvcPCwcbF3+Pi6Orq7u7u8fDw8O3t8e3t5uDh + 29bX4eDg1tXVxMPDxcbG5+np+fv6/f///f////7+/////v7+//////////////////////////////// + ////////////////////////////////AAD///////////////////////////////////////////// + /v7+///4/Pzj7+7D6OWt5uSf5eOa5+ac6Oqa5Oaa4uaS4uWL4uKP5eOU4+WR3OOR3eCT39+R2dme4+KS + 1NGm1NLr9/X//v79/v7+/////////v///v/////+/v7+/v7+/v7o6Om/xMPDy8jFzcrIy8rJycrIzMvH + zMvJx8PIu7W+raSunpShjISWfnaKc2qEbmJyVUhuSTtwRzduRTNxRzJnRTSHdW3QycLO0MrEy8fDzcrC + y8vDysnHy8rJzMrIy8fHy8jFy8vFy8rDycjEysnGzMvHzczIzszK0M/N0tHL0NDIy8fFwru3saqtopqf + kIaPe3GLc2eCZltvVEhbPzNSNypUNCVaMiBdMyBgOCVjOihiOShiOCliOClfNiZbNSNVMyBUNiNaPCth + QzNvUUGCY1aVdWmtjYO3m5DBppvOtavZwrnjy8Tpz8zn0tDjz9DizM7gzMvdzMnbzMnk19TQyMbDw8G9 + xMO+x8a9xMO8wsHO0tHo6urq6urx8PDy8PDw7u7v7Oze2drc2NjY1dbf3t7IyMnBw8Pg5OT5/Pz+///9 + /v7+/v///v7//////////v7///7+//7///7////////+///+///+//////////////////////8AAP// + ///////////////////////////////////////////+/v3///3//+339L7j3q7n46zs66Xr7KHr7Z/q + 7J/p7Z7o8Jbo6JLh3Jbc257i6Zzl5pnk3Jvi3J3i25PUzZ3LxuHv7P3///v///3////////+///+//// + //7+/v///v///9jY27W9vcPRzsbRzMrNy8vJy8zPz8nMy5CKg3FZTHdVRXJQPnRKOnFGN25IOZd5aYtr + WHFINXlNOHlNN3ZLNW1IM2JHOZ+OgdPOxcnNyMXOzMHKy8PLzMbJy8nKy8rLysjMysbNzMfOzdDU09PW + 1NTU0dLOyszHwbiwq6KYkYyAeH1tZHReUG9VRXBPP3hQP4ZZR5FiT6NzYJxtW2tALF41ImM7KGM6J144 + JFo4JVUyIVQxH1gxI182KWtEN3dWSYdtXp2EeLWakMiupNO7tNvGwODLxuLOyuPQzOfV0OfU0OTRzeDN + yd/Myd3LyN3LyN/MyeDNyt/Nyt7Myt7Qz9zU0sbCwcHEw7rFw7vEw7/FxL/Ew9rd3Ojp6e3s7PLx8fDw + 8PDw8Ofk5NjS1NXP0OPg4OTk5MnKy7u+v93f4Pj5+v7///79//38/f/////////+/f/+/f7//f///v// + //////3///3///7//////////////////////wAA//////////////////////////////////////// + //////7//f/+/P/+7/n3xevnte7qrO3sqO/xpO7wo+7wo+3yoO3znOPkSH99QHBwm9rjou3unuvjoevl + pOjgquXetd3Z4e/s/P//+////P7+//////7///7//////v7+/v7+////2dzerLi3wtLPxNDNyMzLzczO + ycvMz9LRraWfZ09GbEc2d041eU41eEw1b0gye15IkXdgbVA5cUw3dE05dVE+dVpJc2BVkIF4z8W/087M + 0M7Qzc7Rzc/SzM7Rz8/S0dDRyszKxMXBu7i1rqejn5SMi3xygGpeb1JGaEU4dk09flFBiVxLmWpZp3hm + rXtpp3Nfu4VxwIx4vIp1rYFsiV9MYzwqXDYjZT8taUc0cFJCfmVVnYZ6tZ+WuKGZybKr3sjC6tbQ69bQ + 6tTN6NPM59LN49DK3svI3MrH2MfF0MC9y7q31MTB3s3K3s3K3s7L3s/J38/J4c7L4M7L3szK287M3tbT + 087NwMLBvcTDvsXEwcfGvcLBxcrJ4+bm6uvr7+7u8PDw8fDw8O7u2tbW2NPU5eLi5OPj5eXlysnLvby+ + 3t3f+fj5/v3+//7//v7+/v7+///////////+///+/////////////f///v////////////////////// + AAD//////////////////////////////////////////////v7+//7+///t9/XC6OS07emt7u6q8fOk + 7vCk7vCi7fGh7fORzM4jQ0QyTlGd2+Gg7e2h7eej7Oep6eOv5uC9497p8/H+///7///8/v7//////v// + /v/////////+/v7////09/e0vr2ywb7I1NHKzs3LzM3Kzc/Lzs7Y09Cjj4hsTD1uSC9xSzF0TTd6VEF7 + WUmFbF2Kd2qUgXelkoyup6G1uLPCycfP1NPV1dXU0tLSzMzJw8LDvbe1rqWnnJKWhXyHcWV6X1FqSz9d + PS9VNSZTMSFWMiBYMR9oPSyXaVfDk4G9jHnEj3u7hXK0f2ujbVqea1ieblyYbVybdGSceWqVdWekh3q3 + mpDJraPVvbXcy8P06OH///358end0c3ez8zgzcvdycXax8LSwLvLurbIt7TQwL7Asa6+rqzAsa/JurjZ + ycfg0c7czcrezsvez8rez8nfz8ngzsri0czf0c7d1M/j3NnKyMfAxMS/xMPBx8a/xcS8wcDR19bn6+rq + 6+vw8PDx7+/w7e3r6OjY1dbj3+Dl4OHk4eHl4eLLyMq9urza2dv19Pb//v/+/v/9/f3///////////// + //////////////////////////////////////////8AAP////////////////////////////////// + /////////////////v///+z39cPp5bXt667v76bv8KXv8qXu8aLt76rz+IGythoxMkliZJ/g557r7Kbs + 6afp56vn5K/n4brj3Onz8f3//vz//v3////////+///+//////////7+/v/+/v///+Xp6au0ssDIxs/S + 0szO0MjN0cjPz9HT0NTKxJ6Kgox1a5qIfquckbyrosq3sc7Cvc/MyNfW097b29vd3dDU08TDwLeyrqWZ + lJSDfoFuZXReU2pURl5HNlk+LFg6KFk2Il40IGE3JGE5JmI6KGI5J2E4JWI5Jl0zIHZLOKF1YpZrWZFq + WZNtXJx2ZqmFdbOShLyfkrGWi7aelMKso72pod7KxOrU0efQzuTPzdvLydjOy+/q5vv389vTz7OjotrE + wuXPzMe4tMS1ssm7uc7AvdXHxdHDwdjJyNnKyNTFw8q7udPEweHSz9/Qzd/RzeDRzOLSzOTRzOXTzuDR + ztzQzOHY1N/a2MPCwsLDxMDFxMDGxb/GxbzDwtje3efr6uzt7e/s7O/t7e7t7eTi4t3Z2ubg4eji4+ji + 4+Pd387LzLu5utXU1fb29/79/v////3+/v7///7///7///7//////////v///v///v////////////// + /////wAA///////////////////////////////////////////////////+////6/f1vuThrubko+Xl + l+Hjo+rvp+/ypfDyp+/0eKWoFi4uVHV2m+HpnevtpunorOjpqujlq+fhuuTe6PTx/////f/+/f7+//// + //7///7//////////v/+//7+//7/////297dsLOzzs/QzdHTyM/RxtHRx9DP09TP19LP2NPX29re3Nvc + 2tnW2NTPz8zHxcK9ubKsoJONi3lzfmRdc1JGZEAxXDkpWjYlWTUjWzUjXTckYDsnYDomXzomYDsmXzkk + WjYiWTckWTgmWjgoY0IzZ0Y3b00/gl5RoXttspOGsZySwKujwK2kw7Goy7uz08S9xrixy7y51sfF08XE + 28vK4MzK4MrJ4czL38zK2MrI3NPR+vPw+O/tuqustaCf2cTD2MzI2MzI2MzI08bFyby6vK+twbOwvK2r + wrOxxLWz1MXC4tPQ4NHO4NDO4dHO49PO5dPN5dLO5NTR4tXR4NXR5Nza09HRwsDAxMXFwMbGvsbFusLB + xMvK4OXk5+jo7u3t7Ozs7+/v7+7t3tra4Nvc6eLj5+Hi5d/g5eDg0s/Purm40dDR8vHz/v3//f7//f// + /P7+/f///v/////////+///+///+////////////////////AAD///////////////////////////// + /////////////////v7///7////m9PO+5eOz6umo6uqT3uCj6u6o8POj7/Gh6e57qasYNjRGcXGQ2eCV + 5eml6uyo5+ul6Oio6eW85uHt9vT+//79//3//v7//////v///v/////////+//7//v7//f/////9/f3J + zMu3urvO09TK0tPG0dHI0tHM0s/Nz86+vL60qqupmpaXh36Dc2Z3YlR5W058VUeEWUmPYE6fa1mVXkt5 + RTFmOiRjPCRiOyViOSNhNyNjOCVfNSNdNyZhPy1rTDh2WESMb1+ljX6ijICch321oJrKtbHHr6zLsrDS + vLrJtbTUwb/Ww8HWxMLVxMLTwsDTwr/Ou7nXwsLm0dLizszizsfjzsfmzsjkzcjhzcvazcrl3dr79PXt + 5uiwpaefkZHKvrrPw7/EuLTHu7fNvbrQwb7VxsPZysff0M3j1NHl1dLk09Hj1NHj1NHj1dHk1dLl1dLn + 19To19Tk1tPk2NXh2djh3d3KyMjBwsLAxcS9xcS9xcS7wsHS2Nfl6Ofq6+vt7u7t7u7w8PDq5+fc19jn + 4eLp4eLl3+Dm4OHm4uPU0NG+u7zU0tTw7vD9/f7////8/v79///+//////////7///7///7///////// + //////////8AAP////////////////////////////////////////////7+/v////z//+P08sHp57bu + 7anr7ZLe4KHp7ajv857s7p7s8HyvsRo9OUp5d47X3oLW3I/d4pbe5JTi46Dm4r3l4vD49/////39/v7+ + /v/////+///+//////////////7+/v79/f3+/v3///D09Lm9vr7Cw87V1c3U08zR0dDU1M/NynhvZmlK + P3xURIJcR4hqU5VzXaZ6ZraAb8ONesSSfMSPebJ3YJhkTWlAKFg3H2BBLG5MO3dTRoReU5l0aqyLg7ye + mMmuqNS8t+bRzP/38/ju6bOmobuuq9rOytHCvtXEv9PCvtLAv8y5udPBwMOzscOzscKzsMa3s869u9vJ + xuLQzeHQy9/RyODQyOPQyeXRyuPQyt7RzNvQze3o5fr29drW1bOrqc3Bvd7SzdPHw9rNyubX1OfY1efY + 1eTV0uHU0OLV0eTW0+XW0+TV0+TX1eTY1eXY1eXY1ebX1eXX1ePX1eLW1t/X2Obh4trZ2cDBwb/Dwr/F + xL7GxbzDwsDGxd7j4efp6evt7e3v7+7u7uvq6t3Z2t3Y2efg4uTd3eXf3+fi4ufi4dzY2dPQ0dfU1e7t + 7v39/f7+/v3///7//////////////v///v///////////////////wAA//////////////////////// + ////////////////////////////+//+4fPxv+jmtu7uqOztkODhoertp+7xmOjpmOrufLS1Gjw5R3Jy + lNvmf9jhftbdgtTdhdnclt3cuODe8vn3/////f3+/v7+//////7///7//////////////////P7++v7+ + +v///f//6O3tsra2xsnK0dPT0tLT0tPU29nWtKmfdFBDll9PwYx3x5qBs4Vwsn5rsXlpo3Fgl3Fckm9a + mm9fnHZnk3ZnmoR1rZuNuqWby7Oqy7Kq2sK76dXO6NPQ5tHR5NDS3s7P7ODh//j56N/fvLKxzcLA3tLN + x7iyv6+qzLu5yra11cTB1MTB2czH283H28vF1MbA2svF49TN4dTO3dPP39PO4NPO4tPO4tLN4NLM39LN + 4dnT9/Ls+fbw2dPOqJ2ayLy52s7KzcC94NHP283K49TR5dnW5NjU5NfW5djX5NfV49bV4dfW4tnX4tnX + 49jX5drZ5dvb6eDh7OTm7unq6ufn7u3tzc7OvcDAwcfFwMbFv8bFu8HAxsvK5unp6Orq6+zs7u7u1NTU + 1NLS29bX39ra5N/e5uHg5+Hg5uHg6ePj5uHiysbHzMrK8fDw/v3//v///v/////////////+///+//// + ////////////////AAD////////////////////////////////////////////8/v7+/v78///g9PK/ + 6Oaz7Oyj6eqQ4eSk7PCp7/KV5eeP4OR+trcdOzpBZWeO1+F+2+V51+B61OGE2OCS2tyz3d7x+ff///7/ + /////////////v///v/////////////////8///8///7/v78/v79///Y29q0trXR0dHU1NTQ1NTS1NXe + 29iqlI+FXVSicWOodWWldGejc2ildm6mf3anjn+ql4m7pJ/Cq6nQvrvWycXPxMC+sa3Qw73WyMHZzMPd + 0sfdz8biz8rgzsrczcvd0c/16+r/9vbOxsasoKDJu7zSxMPZycfdzMnayMXTwr/Mu7jOvrrLurbGtbHE + tLDTw77l1dHk1NLe0dLg0tLf09Hf09Dh1dHj1NDi08/j1tHs49369/Ht5+LNwsDXy8no29nRxMK9sK+/ + srHTx8Xbz8/RyMfb0tLl2trl29vn3Nzl39/m4eHp5OTt6Ojw6+v38vPu6uzOy867ubmura2/vr7q6+vG + yMi/xMO/xMO/xcTAxsW5v77U2tnk6Ofs6+zr6urQ0NDR0dHf3d3b2Nbj393n4eHo4ODq4eHq4ODp4ODe + 19jHw8PY1tf39fj//v////////////////////////////////////////8AAP////////////////// + //////////////////////////z+/v7+/vv//9zx77rm5K/p6Z/m5o7g4qPs8Kft8Zfn6Zjm6oS5uiA8 + Oz9eYYzW4H7c5nrY4nnV5YbZ5JTb4LHg4vL6+v/+/v7+/v////7//v/+///+///////////////////+ + /v/+/v/+/v39/vz+/vz+/svPzby/vdLW1czU08zT1NHU1czLyKSbkaWQhK2OhMSooMevq72mps20tdS8 + u9XBvd3KxdbDv93Jx9vGxt/KyuHOzuLPz+PR0OPRzuLPy+TRyuTTyuHTyt7Sy9nPyt7W0vz08fry8se8 + vKCSkbampdfJxsK2ssa6uMy/vc/AvtXGxNrLyt7PzuLT0uPU0+PU0+XT0urT0+nU0+XX1OTY1OXZ1enb + 2Orb2Oja2uXb3PLu7vz19vDk5eTY2ePX2ODU1MS4uMS4udDHx9HJytXOz+bf4fHo6fTs7fjx8PXy8fXy + 8v38/Pv6+v37/P38/uvr77K0uKepqZycnJSTk8rLy9vc3L/Dwr/Ew8DFxMLHxr/FxL/FxNzg3+jo6Ofn + 587Q0Nnc29jZ19za2d3Z2Onj4+vh4ezh4evh4enf4Ovk5N/b293Z2vb09f/////+///+//////////// + /////////////////////wAA//////////////////////////////////////////////79//7++v// + 3fHvu+fkse3sn+jnjeHfoO3vpO7vm+jopu3ukL6+HDg2OFpakNXbhdzmfdTie9Tig9jhktnftuLl8vr7 + //7//v3+//7//v7+/v7//v7//v///f//+////P///v39/v7+///+/v3+/v7+////9fb2u7++wMTE0tfY + zdTVztPU0NbVz9HO1c/LsKKewLGu3s/O18jI3MrK28fGz7270MC82szHybe0xrKw38zK6tbW5NHQ49HQ + 49DP5NHP5dLO4tPL4tPL4dTN3tPN3NLN7OHe//bz8+jmxLe1v7Kw3tHO283K39HO5tfV59jW5tjV5NXU + 59jY5NbV5dbW5NbW5tfV69fW6tfV6drY6Nza4dXV18zL08jIzMLDsqqsxsDC+PL19u/x5t/h6ODi7ebo + 6uLk7Obo8evt9vHy9/P0/Pj5+/b3+vb1//v6+/j38e/u0tHQ3t3dwsHAj42NwL/AyMjKwsXF0dXUnZ6e + bm1u5OTlz9HSv8PDv8XDwsXFw8bGvL/Cys3Q5Ofn4ePjyszM4OHh2drZ1NPS2NbV5OHg5+Hh6uTj5+Hf + 6OLg5+Lf6eTi6eTk9vT0/////////v//////////////////////////////////AAD///////////// + //////////////////////////////////7+//73//7f8fDB6ue17eyf4uOP3t2f6umi6Oee4+Kp6emR + vLs4VlJYgn2i5OOZ5+6P3uqL2+SP3OCb29294uP0+vr////+/v/+/f7+/f7////+///+///9///7/v76 + /v/9/////////////////////v7////m6OiwtLXHzMzS19jP1dTQ1dTS09POzczb1dTGu7vSxcXi09HK + uLXHtrLIuLTKvbrXy8fOwL3XycbdzsvaysfYx8Tgz8zk09Dk08/l1NHl1c/k1M7k1M/j1dDg1NDf09D0 + 6ef/9vTr4d/g19Xj19Xm19XUxcHezsvdzsvh0tDp29nm2dbm2dfl2dfk2Nbk2Nbk2Nfn29rLwL+soqKl + nJ27s7Ozra3Hw8PMx8fa1NXu6uv39Pb08vX29PX39fb49/f49vf39fX49/b08/LW1dTg3t7b2dmXlpaq + qanp6emUlJSmpqbX19ebm5uTk5TBwcP3+Pji5eN8e3yalpjW09bi4+S+xMLAxsTAxcTDxsbCxMe8v8La + 397l6ejN0NDNzs7Z2dnS0dHh39/Y1tXn4+Lm4eHn4+Hm4t7o4+Do4eDo4+L38/L////////+//////// + //////////////////////////8AAP////////////////////////////////////////////7+/vz/ + //f//93w78Pn5rnp6qrk56Hi5p3c3qDa26bh46rm6XaenjlZVYOzrK3t7Kft86Lp8KPr7qrp5q3h2sfm + 4PL19Pz6+vv6+fz7+v37+/78+/78/P39/f7+/P3//f3+/v7+/v////////////////7+/v////v9/djc + 3LW6uc/V1NLY19DW1NTW1tLR0dPOzcvDwresq8y+vNbFwt/NyuDPzNbGw8y9usq7uMy+u8u8ucu7t828 + ud/Oy+nY1eXU0efW0ufX0ebW0ObV0eXW0+TY1OLW0+fb2fvx7/rx8eXb3OLX1uba1tjMyMi8ucK2tNHF + w9vQzdPIxtzSz+Ta2OXd2ufe3Oni4u7n5uHb2s3JyNnV1O/r6/j19tvY2LSysrazs7OxseTj4/r6+vX1 + 9fX19PT08/Lz8vP18+nq6eDg36ampZKSk97d4Kusrp6gorCys87Q0nl6fdba2/P3+JOWmoeKjvb2+fn1 + 9cnExb24utnT1fby8s/S0LrDvrrHwrzIxb/Gxb3CwsHGxeTp6ODk48bIyMfHx9rY2PLw79rX1uDc2+Xh + 4Obj4Ofj4Orl4ujh4Oji4fby8f////////7//////////////////////////////////wAA//////// + /////////////////////////////////////f7//P//9///1uvrwN/htuPlrOfptPT4p+nrldfXnt/g + sOntcZKTJTw5d5uYsOXnpOHqo+Xvpejto+DgqdzYw+Pe3N/c497b4t/b5eLf5+Pg6ubj6+fj6unl6+nl + 6+vn6+ro6+rp7evr7u3s8O7t8e/u8vHw6urq3t/f293dxsvKusC/0tfW0dfV09fW1NXW0M/P1dHRxL68 + mo+Mu6yp28rHxrWyzr261cTB28rH3M7L3s/M5NXR5dXS59fU59fU5tfU6NjV6tnV6NnV6NnV6NnW5tnX + 5djW5NnX6uDh/fT09Ozs4trZ4trW49vXzsXCvra0zcbF0srK1M3M49va8uzr9fDv9vLx9fHy+PT1/fr6 + +vr6/f39////8/T03NvdzczNsbCymJWXx8PF+/f59/T19/T19vP09/X29PLzv72+wb/A7evscnFysLCx + 9/b3pqanc3Jz19fYx8fI2djZ8/Pz3Nrc4+Hk8fDx7O3t8fLz8u3w9ezu9ers7Obmw8fEuMXBuMfFusbG + wMfHub69xszL6ezr19nZtba24+Pj9fTz6+no3NjX5+Pi5eLf5+Pf6eTh6OHg5+Hh9PDv///+/////v// + ////////////////////////////////AAD////////////////////////////////////////////+ + /v/////4/v3a7O3H4uS96Ouz7e+6+vuw+feO29mY3Ne+7eKHoI5NXEeOp5W55+Cc2t2e4uml6Ouj29q7 + 4eDR4uHY2dfY1dPZ1tTe2tjh3Nrj3tzj39zk4N3k4N3k4N7i4N3g3t3h397i397j4N/j4N/j4eDi4ODc + 29vY2Njm6OjAw8PFyMfX29rR1tXS1tXS1dXOzs3d2djFvrvBtLLm2NXj09Dq2tfr29jg0M7m19Xr29nn + 2Nbp29jo2tfm2NXp29jn2dfo2tfo2tfm2tbl2tbm29jk29nj2tnk3Nzx7Ov/+fjt6Ofn4+Hs5+Xs5+Xp + 5OPy7u369vX69/b69/f59vb69/bz8vLy8vTz8/Tk5eX19/fm6OnFyMjN0NCbnZ+wr7GMi42FhIZycHHZ + 19j7+fr29PX19PX29ffz8/X09fb4+Pr09Pa9vr+4urnt7+3X1tXo5eX39PP59fX28fDx6+r27+707Ozq + 5eXo6Ojn6Ojp5+jt5+nw6On17u/g4N/AxMS6w8S8xcm9w8bAxcW5vr3Z3dzo6+vd39/s7e3y8vHy8O/k + 4N/m4eHo4+Hn5ODo5ODq4+Ln4+Lz7+7///7////+//////////////////////////////////8AAP// + ///////////////////////////////////////////+/v////j8++Lv7tHj5MXm6MDw8bvv77Dv7J7i + 3qng07PMqaatfpuZapWddZ/FrKrn26ns567r5a/d18/k4ebm5+Xl5OPi4uTi4ubk4+nl5Ovn5uvn5uvn + 5+zo5+zo5+zo5+ro5+ro5+zp6O3p6O3q6ezq6e7s6+7t6+vr6/Dx8eXn57i5ucrOzdXb2tLY19HX1tHU + 08vKyeTf3ujf3efa1+zd2urb2uHT0c2/vdXHxevd2+jb2eba1+fb2Oba2Obb2eXa1+Xa2OXc2eng3u3m + 4+3n5Ozn5u7q6evn5ufl5Ozp6fj29vj29vb09Pj29vv5+Pn49/b19Pf39vP09Pf39+/v77m6uqeoqqep + qr/Cw+Dj5J2holNVVpOVlpOUlXFwcXFvcYODhHN1c5KUk/j5+PT29fT29fL09PH09PL19PDy8u7x8fv9 + /fb19e7t7fXz8/Hu7u3o6Ozo5+zn5e3o5e7n5fDp5+/p6PHs7Pbx8vr09fvz8/vy8fzw7fHk4c3BwMbD + w8DFxbvDw8DGxb7Ew8PIx+Ln5uzv7/Dw8fHw7+/t7Ojk4+fi4ufj4efk4Ojj4Orj4ujj4vHt7P///v// + //7//////////////////////////////////wAA//////////////////////////////////////// + ///////+///++/376/Hv6vDw3u3v1e7vz+nrxObkwujlxN/Nu7qGvq5ouKJfn5Jbo7SRzvbkxPXrwu3k + yeng3Onm5uTl5ujo6Orq6urq7Ozs7u3t7+7u7+7t7+3t7+3t7+3t7uzs7uzr7uzr7uzr7evq7evq7uvq + 7ezr7O3r7Ozs7Ozs8vLy293dtrq5z9XU1dzb0tjX0tjX0dPS0M3N5uDd593a6t/c6NvZ1MfFzsPAz8TB + 3NHO6d7b5t3a5t3a6eDd6+Tg7efl7+no8Orp7Ojn3trZvbq5w8C/w8PBsK+vpqSkyMnJ+/v79/f39PT0 + 9PT09PX18/T08vT08fPz8/X18vT07vDw293du7q8dXZ4zc/Q7e/vubq7lZSWcnFzsa+xs6+xrKmr3Nra + yMjG0tLQ9fXy9vX09PPy8O/t7ezq7Ovp7Onm7Orn6+fn7ujr7ujq7efp7unr8evs8evs8+7u9vHv+vXz + /Pf2+/Ty9urn6tjX2MTBwa2orpmRpouBk3Jog2JZuKeey9DGvMfAwMbFv8XEusC/0dfW5Ono6Orq8fDv + 7evp6OTj5+Li5uLg5+Tf6OPg6eLh5+Lh8Ozr/v38/////f////////////////////////////////// + AAD///////////////////////////////////////////////7////8/Pvw8e/18/Py9Pbw9vju8/Xo + 8fDj7+7Z4NDBvIe7qWS1nlqfkFi5t5jq9Orh8vHc7Onf6ebj5+jf4ebk5+rm6uvo6+zr7e7r7e7t7u/u + 7u/t7e/t7u/s7e/u7e3v7+3v7+3u7uzt7uzt7uzt7Ovs7Ozs7Ozs7Ozs7Ozs6+v09fXS1NS9wsLV29rU + 2tnT2djV2dfS09HW0tHo4+Lf19fJv7/OxMTKw8LKwsHXz87u5+Xz7ez38/L59PL++ff/+/r////w7u6p + p6efnp6QkJCgoJ+1t7fGyMeho6Olp6fX2dn29vf19fb09PX09fTz8/Pz9PTz9PTz8/Pz9PT19vb8/P3P + zc96eHusqqz////+/P729PXj4eL18vP17/D48/T28vP08fPy8PLv6+348/T79vf17+/v6Ojx6unz7Or1 + 7Ov17u308O728u/48u/68e767+v27ejx49/o08/SvLWznJeeg3eOald9VEFvSDVhQS5YPSlaOiZiOChc + LyR8X1fHxL3Dy8fAxsXAxsW/xcS+xMPg5eTm6Ojt7ezq5+bp5eTn4uHn4+Dn5ODo4+Dp4uHo4uHv6+r+ + /fz////9//////////////////////////////////8AAP////////////////////////////////// + /////////////v////78/PLx8PDw7/Hv8Pb09/n2+Pf29vP29eTk1MK5ibelZK+cWp2SXsfBpu/t6uLm + 6t7k4+Tj4t/h5Njg5eTp6+br6+js7Ovt7uzu7+3v8O3v8Ozu7+zu7+zv7+vu7u3u7u3v7e3u7ezu7Ozu + 7Ozt7e3t7ezt7ezs7Ovs7Ozt7e3t7e7v78THx8TKydXb2tPZ2NLX1tja2c7OzN7c2u7q6eTf3+vn5/Pv + 7/fz8/v39/v49/36+f/+/f78/Pf19Ofm5u3u7trb28XGxrS1teXm5p2eno2PkJKTlLi5uYuMjZKSk/Xz + 9ff1+PX09fX09fX19ff29vj39/Tz8/X19fX09Pb09eXh49jT1fDt7/Pw8vDt7vXx8vXx8fDr6/Ls7fDp + 6e3n6O7q7unn6svIyreytefg4v////719f/19f3x8Pbq5/Lj3enXzdjEusWxprSdkaGJfJB1aH5hU25M + PmVCMl47K1s2I183Hmk5Im48JWtBKGhEKnRNM4FPOX9LO2tEN5mJfcrKw8DHxsDHxsHHxrrAv8fMy+fq + 6ujq6ebk4+jk4+fi4ejk4efk3+jj4Oni4eji4e7q6f38+/////7///////////////////////////// + /////wAA/////////////////////////////////////////////////////Pz88/Py7vLy7O3v8e/z + 8/T28/P08vX04uLTxLSFuaNirJlXn5Rex8Kn6Orm3eTn3uXh4+bf3OPh1+Lk5err5+zr6e3s7O7u7O7u + 7e/v7e/v7e/v7e/v7PDv6/Dv7O7u7O7u6+7u6+3t6+3t7O7u7O7u6+3t6+3t6uzs6uzs7Ozs7vDw5Ofn + ur++zdLR1tva1NnY1NbW1djWzdDO7e3s/////Pr6/vz9+/r7+fn5+/z86enps7S05OXlra2tlpeXpKam + wMLC6Orqu729ra+vkZOUbm9viYiK1tTWi4qMkpCS0s/R+/j6+PX3+PX39/X19vT08/Hx9PLy8e7v8O3t + 7uvr8+7v9vHy7urr6+jp7+rr7Ojo7+rq7unp8Ozr9e/u+vPz//j4/PT0ubCupJmX3M7L69/a1cS+vami + qpWNl4B3h2tfgl1PdU8/aEEwYjooYDklYDgiYTgjZjwma0EqcEQtcko1eVM/g1NBiFI/i1dAiFpClGdO + mWlQnGtWjGVTe2RUr6mgxszKv8fGv8bFwsjHu8HA1NjX6uzr5+bk5uHg6eTj5+Pg5+Tg6OPg6eLh6OLi + 7Ojn/Pv5///+/v//////////////////////////////////AAD///////////////////////////// + /////////////////v/+///4+/zx8vPv9fXv8PPz7/Xx9Pbw8fHv8fHd283CsYC4pGCwm1imk13Fu6Hq + 7Obi6Ojl6OXi5+Ha4uDa4+Xl6uvo6+vq7Ozs7u7s7u7t7+/t7+/t7+/t7+/s8O/r8O/t7+/t7+/s7+/q + 7+7q7+7r8O/q7+7p7u3r7e7q7O7r7e3s7Ozp6+vw8vLe4OC2uLnT19fW3NvS19bV2tjN0tDMz87x9PT5 + +vz29/n4+vv4+vv5+vvu7/CfoqOws7SvsrOOkJGanJ2lpKb////q6eucm51/fX+xsLHEwsTSz9Hm5Obc + 2dzs6ev38/X79vn38vTw6+zz7u/18PHx7O3u6Ort6ert6eju6uvv6+z07+/07+328fD48/H89/X79fP4 + 8e3v5+Th2NPWwbjDqZ+jin6Pc2eDZld1VURqSDZmQS5kPChkOiZgOSVdOCVgOidnPitsQS50RjF6SjWA + TjiHVD6PWEKRWkOWY02fb1umblumaVijalehdF+mgm2ukHy2nIu2opi0p6K2tLHCyMfAyMfAyMfByMe/ + xcTFysnm6Obl5uPl4eDo4+Ln4+Dn5ODo4+Dp4+Lo4+Lr5+b8+vj///7///////////////////////// + //////////8AAP/////////////////////////////////////////////+//////r7/fLy9fL09/X1 + +Pb09/b2+Pb29vb2+OHd0cSyhMCnaLmeX6uVY8e/qu7u6+fr6ePp5eHo5dng4drg5ebq6+jr7Ons7Ovv + 7uzv7+zu7u3v7+3v7+3w7u3w7uzw7u3v7+3v7+3v7+zv7+zv7+zv7+zv7+zv7+3v7+zu7+3v7+zt7ers + 7Ovt7fHz89DT07zBwNXb2dXa2dPY19Ta2MrNzdjW1/n6+/f8/fX4+fj3+fz3+//+/+jo6oGEh9PU2L+/ + wpqXmbe2uP38/uzr7dTR0+fh5P33+f36+vb19e/y8vDx8vHt7fTt7vn09fv29vDs7MfFxJiWlc7Ly/j2 + 9/bz9Pr29fnx7/bu6/Ln5PDh3ObUzNfCusaupbKWip6Ac4dnWXZSQ2dAL102I102I2E7JmI7JmM7JWc9 + Jm5BK3NCLHZELntLM3xQNYBSOYdWP41aQ5JdSJdgTZhlUptpV55vXaJ1ZKWAcamOgrWZj76gmMSpocy4 + r82/t9HHwNXNx8/Kx8vIyMfJycDGx73FxMDIx8LIx8DFxMPGxePl4+Pj4uXi4efj4ufi4efj4Onk4unj + 4ufi4ern5vz5+f/////+/v///////////////////////////////wAA//////////////////////// + /////////////////////v/+////+/n88/H18/L29vT39fX2+fn59/j39/f56+fb0sKVya50vaJmsp5u + 3NbH7e3r5+nm3+fh4+jl297h29/j5urr5uvr6O3t6e7t7O7u7e/v7e/v7e/v7fDu7fDu7fDu7e/v7e/v + 7e/v7e/v7e/v7e/v7e/v7e/v7e/v7e/v7e/v6+3t7e/v6uzs6+3t7vPyxcrJxcrJ1tva1tva0tjX1dnY + z8/R4OLj9fr79fj5+Pr7+vn7+/n6/Pr83Nrd5eTn+/j56+no7Ovq7e3s9PPz+/j4+PT08ezt8Orq7erp + 6uvp7e7t5eLkrKiqop6g8Ozs////y8XEoZeTv7Gt7NzX2sfCyLOrt6CToYp7kHdoiGxceVpKbUo6ZUEv + XzclWzEeXjMeXDQgYTwpbUY0dkw5eEs2gE44g085h1M8iVU+j1tEkF1GkmBJlWZPmWtXnXJfpXxqrIZ1 + sI6AtZqOvaedv6yiyLauy765zsbFz8nJz8vLzcrKxMPDwsLCubq6qKmqoKGhmpubsbS0w8rKwsnJwsjH + xMnIwsbE0tXT6urp4+Pi5OLh5+Pi6OPi6OLi6OPj6OLh6OTj6uXk+/j4//////7+/////f///v////// + ////////////////AAD///////////////////////////////////////////////7+/v/8+/319Pj0 + 8/f29fjz8/Tz8/Py8/Hu7+/i4NPRxZfIsna9pGi6p3jh28zr6eno6ebk6uPm6eTh4d/f4eHk6Onn6+zo + 7e3q7+7t7u7t7+/t7+/t7+/t7+/t7+/t7+/t7+/t7+/t7+/t7+/t7+/t7+/t7+/t7+/t7+/t7+/t7+/r + 7e3q7Ozp6+vt8PDw9fTn7eu5vr3L0M/Y3dzT2NfS2NjP1tbKzs7u7e77+vrz9/Xw9/Ts8u7j5ODt6ujv + 7enQz8zT0tDNzMrd2tno5uXl4uDk4uDv7ev59PL98/H/9vL/+vfy7+66tbS3rqzUycXHu7awmZOeg3mO + bGCDW016Tj5vRDFmPidgOSJeOCFdNyBcNyJeOSVmQi9uSjh6V0aOa1ulhXaninu4l4fAmImaaluSXEyZ + YlCdaFWhcFyleWWuhnG5lYW9npPCqaDFs6vFvLTFw7zFx8HGzMfK0M7IzMvHysrBwMG1sLC0rq6npKSk + o6ScnZ2bnZ2XmpqgoqKbnZ2pqqq7vr/CycnDyMnEycnDx8bS1NTp6urn5uXm5OPl4+Ln5OPo4+Lo4+Lq + 5eTm4uHn4+Lq5uX59vf///////7+/v79///+//////////////////////8AAP////////////////// + //////////////////////////z+/vz+//n6++fp6+Tl6e3s7/b19vT09O/w7ufp59nXx8u/jMu1dcKo + asm1heHbzejn6OXm5eHl4Ofo5Ovt6ejr6ubs6+fs6+nt7ezu7+zu7+7w8e3v8O3v8O3v8O3v8O3v8O3v + 8O3v8O3v8O3v8O3v8O3v8O3v8O3v8O3v8O3v8Ozu7+zu7uvt7evt7e3v7+zx8PH39dvf3rW6udDV1Nbb + 2tPZ2NDX1tDR0djR0fbv7vLw7u/y7s/Rzr++utLPyvDs593b2NPQ1NbQ1dbO0eDU197U1eHY1eXa1evb + 1eXNx9a4r76glaGIeJF3ZoVnVHFQPWQ/LF84JV82JGI4KGA2J2A3KWhAMm5IOnlTRYRfUJJuXaF7a6F7 + a7+Zh8GbicSdjMOdi7+WhruPgbOJe7GMf6yNgKqShbGflbutpcG1r8S7t8rCwM7Jxs7NyMzNx8rOycjN + ysnNy8jMzLi7u6Kho6OfoqOboJqUl5iWlaelpKmoqLOys7u8vbu9vsHDxMbIycbIyMvMzMbKysTKy8jM + zc/T1d7h4unr69na2tbV1ePh4dbU1ODd3Onk4+fi4ejj4unk4+fi4ejk4/j09f////////7+/v3///7/ + /////////////////////wAA/////////////////////////////////////////v///f7++vz94+Xm + 0tTV2tvd7e7x9/f69vX29vf18/X03NnGxbh7w6pgu59Zspxp39nK9fP25ufo1dvZ19za4+jo7fPz6u7u + 6Ovr6Ovq7e/w7O7v7e/w7e/w7e/w7e7x7e7x7e7x7e/w7e/w7e/w7e/w7e/w7e/w7e/w7e/w7e/w7e/w + 7e/w7vDw6uzs7O7u7O7u7fDv6/Du8vj30dbVu8C/1drZ09jX1NrX1djXzcvK2tfX9fDw+fX19O/v5t/f + 5tra9+jp8+Tj287L0sPA0r660Le0wqijtJuTnIN5g2dbbEw+ZD8xYTknXjYfXjYfYDciZTsob0UzelBA + eU9BeVBCk2pepn90tIx/uY1+vpOFwpmLvZaItpKDs5GErY6CqY6DqI6FrZWMspqTvaSgxa+rybe0z8TA + zsnFzczKyMzKxczMxs7OxM3Owc3Mvs7IvszGwcvHxcvHx8rHzs3NsbGxkpKTqaqruru8tLS1v8C/x8nJ + ysvMxsjKyMzNys7Pys7PzM/Q0tTU1dbW19ra29/g3uHi3N/g4+bm5+fn4ODg0M/P1dLS1NLSzMfH4dzb + 7ejn5uHg5+Lh6OPi6OTj9vLz/////////v7+/f///v//////////////////////AAD///////////// + ///////////////////////////////+///o6uvV19jo6ury9PTz9ffz9Pj19fb29/X3+fbc2cLIt3HE + p1Wzlkiii1Pb0cL++/7v8fTd5+fW3d/U2t/d5Ofl6enh4+PU1tfl5+ju8PHt7/Dt7/Dt7/Dt7vLt7vLt + 7vLt7/Dt7/Dt7/Dt7/Dt7/Dt7/Dt7/Dt7/Dt7/Dt7/Ds7u/t7+/u8PDt7+/t7+/r7e3s8PDr8O/v9PPI + zczAxcTX3NvT2tjQ2tfP2NbMzc3j2tzu5Obl1tjLvL64p6m0n6KWfnuTfG6gh3eafG6Mal13U0ZwSj5k + PjJdNyxYMyVjPzB0TT2EXEqSaVekemu1in28k4fHn5K1joKOal21kYTHpJa0koSqiXutjoC1mIy3nZO6 + pJu+rKbBsrDDuLjJwcLOyMnKy83Hzs/FzM7Hzc7KzM3Ky8zKy8rKzMzHy8vGzcvEzMrCzMnBzsrBzMnF + y8jIy8nKzMrKy8nHysnBxcTBysjAzMrFzszLzs3O0NDR1NXV2tvc4OHg5OXl6ero7Ozt7+/x8vLu8fHm + 6erY2drHycnY2drm5eXm5ubj4uLX1dXe3Nza1dbIw8Td2Nfs5+bq5eTo4+Lo5OP18fL////////+/v79 + ///+//////////////////////8AAP////////////////////////////////////////////n7/Nzf + 3+jq6vj6+vX3+PL09vPz9/b29/j39fX28dzYvci1bMKmULCTQqWQVuDXx/36/fHz9uDp6ebs7erv8eHm + 6Obo6Ors7OXn6Onr7Ozu7+3v8O3v8O3v8O3u8u3u8+3u8u3v8O3v8O3v8O3v8O3v8O3v8O3v8O3v8O3v + 8O3v8O3v8O3v7+3v7+3v7+3v7+3v7+vw7+nu7e3y8ejt7L/Ew8vR0NDc2cza2M7Y19vb2si6uoNra3xg + YIVraYNwbIh6dGZSSHRSQn9cTGZENWZENW5JPHtSRohdU5twaKJ7crWRh8WimcWfmM+ooNConbuShrKL + fK+Ke7KRgqmMfbCZiruml7yxqLy8ur/CwcXGxsjJyc3Oz87Q0c7Q0c7P0c3O0MvMzsbNzMLRy8DOycPO + y8fOy8fMycnNy8nMy8jLy8fMy8fMy8fKzMjJzMjJzMjKzcfKzMjLy8nMzc3P0NHT09XX2Nvc3eHj5Obr + 6uzx8O/z8/D09fH19vP3+PX5+vb4+ff5+fb4+O3v793e3s7Ozr+/v9HR0ebl5eXj4+jm5ubk5ODe3uTf + 4NrW1sbCwdvX1urm5ebi4ejk4/Xv8P/+//////////////7+/v///////////////////wAA//////// + /////////////////////////////////////Pz97u/w5ejn7e/v8vX19vj79vf79/b5+fj39vbx2dW6 + xLJsv6RRrZBDpI9W49vM/fr88vT14+nn6e3r9vf29vf38/Pz9PX07/Dw7e/w7e/w7O7v7e/w7O7v7e/w + 7vDx7vDx7e/w7e/w7e/w7e/w7e/w7e/w7e/w7e/w7e/w7e/w7e/w7e/v7e/v7e/v7e/v7e/v7e/v7PDv + 6e7t7/Tz3eLhubu70tLU19ra0dbW2Nza2dXRmouGYkU+eFRKe1dLdlhIfVhHfEc4ilhLrYN0t5GCuJOE + wJqMvJOGwJiLwp2QxqSWspeJo5GIrp6WsqKataWfwLKuxbm1ysC71MvH1tDL2dLO0M/NytDPydDPytDP + ys/Oyc/Ox83Mx83Mx83LyM/Kyc/Kxs3Kxs3Mx87Mx87Mx83LxcvKxcvKxcvLw8vKw83KxM7Ly8/P09HV + 1tXZ19ne2t/i3uXn4unr5+zu7PDx8fP19/b5+Pj59vn49fj49vn69fj58vT18PP07/Hy7e3u6urq5ebl + 4OHg2NnZ1NLSy8rK0dDQ5OLi5+Xl5eTk5OLi49/g497f5ODg2tbVxsLB3trZ6eXk5uLh8+7v//////// + /////////v7+////////////////////AAD///////////////////////////////////////////// + /f/5+fvv8vHp7Orl6Obu7/H19fr59/v8+ff29e/X07jBsW29o1KqjUKkjVjl3876+fn09fbv8u7x8ez0 + 8e7z8PD29fb29vfw8PHr7O3t7+/t7+/t7/Dt7/Dt7/Dt7/Dt7+/t7/Dt7/Dt7/Dt7/Dt7/Dt7/Dt7/Dt + 7/Dt7/Dt7/Dt7/Dt7+/t7+/t7+/t7+/t7+/s7u7u8fDq8O/s8fDw9vTU1tbBvsDW1dfU2dnR2tfa39nc + 1c6Nc2twRTqcaly1hnSpd2eWYFKZal66lIe3mYyqk4eumo6umpG5pZ3BsajEtazJwLjNycPNzcbS0s3S + 1NDQ1NHN0tHM0tLK0dHJ0NHHzs/K0tHKz87Kz8zL0MzKz83Jz8vJzcvKzs3Kzs3Lz8zLz8zKzM3Kyc3J + yc7Hys3KzdHO0dXP1NXR2NjW3N3b4uDg5uTn6urr7+/t8vLw9fXy9/jz+Pn0+vr2+vv4+vr2+Pj09fXz + 9PTw8fHt7u7q6+zo6enm6Ojo5ufm5eXm5eTm5eXm5uTn5uXk4+Lh39/k4uHh39/f3d3k4uLl4+Ll4uLk + 39/j3+Dl4ODl4eDQzMvY1NPp5eTl4eDy7e7//v////////////////////////////////////8AAP// + //////////////////////////////////////////79//79/v7+/vf59+7x8OXl6OTh5+vo7PXy7vPy + 6tXPtMOwa8CjUamMQKeSWurj0P39/fn7+/D18u/w7fHv7vTz8/z7/f/+//v5+/Pz8+3v7+zu7u3v7+3v + 7+7w8O3v7+3v7+3v7+3v7+3v7+3v7+3v7+3v7+3v7+3v7+3v7+3v7+3v7+3v7+3v7+3v7+3v7+3v7+3v + 7+3v7+vw7+rv7uvw7/D29MzQ0MDFxdTc29DZ19Pa1uLf29fEwIdpYpVwZruUib6Zj72glsevpsq3r83A + udLJxdHNy9LS0tTV1dLU1NHT1M7P0MnIyMHBwLO0sqOmo7m+udDW0srSz8jRz8jRz8jS0MjQz8rRzsrQ + zsjOzcjOzcrPzsvQzs3Qz8zNz8zNzs3P0NHS1NfW2d3e4ePk6efp7ejr8Ozv8vDx9PT09vf29/n29/f6 + +fb9+vX7+fb6+fb49/T18/Dx7+7t7Ozp6enn5+fn5+bm5ubm5ufn5+bm5ubm5ujm5ujm5ujl5ejm5ejm + 5efk4+fl4+jm5efl5Ofl5Ojm5efl5ODe3eXi4efj4uTg3+Xh4ebi4ufj4s7KydPPzurm5efj4vDq6//9 + /v/////+/v///////////////////////////wAA//////////////////////////////////////// + //////3///3//v79/f78/f7++vr89/X68+/z8e7r7u3l1c6xxa9nw6RNq4s8p5BV5t7L////9/r67PPy + 8vX1+Pn8/Pz///7//v3+//7/////+vr68vPz7/Hx7e/v7O/t7PDt7fDu7e/v7e/v7e/v7e/v7e/v7e/v + 7e/v7e/v7e/v7e/v7e/v7+/v7e/v7e/v7e/v7e/v7e7u7O/u7PHw6vDu6/Hw7fHw6uzrvsPCx8/P1dzc + 1NjX19fX2tjZvLq6uri10czI1tHO1tnW19rX19XU1NDQzcfJxcHDwb/Bube6uLW2q6WnpZ2eo5ydraao + r6qsrq2uvr6/0dTUz9LSzNDPz9DQz8/PzM7Oys/OzNHQztPS0tfW1dva1NrZ2d7d3uPi4ufm6e7t7vPw + 8Pbx8fjz9Pr39/v39/r59/j5+Pj4+Pf49/f39fX18vLy7vDw7Ovr6ejo6Obm5+Xl5ePj5uTk6OXl6ebn + 6Obo6Obm5+Xm6Obm6Obm6ebm6uXm5+Lj4t7e4t7d5ODf6OXh6ufk6OTk6eXk6+fm7Ojn6+fm6OTj4t7d + 49/e5eHg5+Li5uLh5eHg19PSyMTD2tbV6eTj8Ovr//3+//////7+//////////////////////////// + AAD//////////////////////////////////////////////v/////+/v3+//7///////7//v7//f// + ///8+vPYzq/HsWbFpUmqiDarklvv59j////8/f76/v78///+///////////+/v/////////////9/f36 + +vr09fXv8PDt7u7u7+/s7u7t7+/u8PDu8PDu8PDt7+/t7+/s7u7t7+/t7+/t7+/u7+/t7+/t7+/t7+/t + 7+/t7+/t7+/t8O/t8O/r7u7s7u7w8vHh5uW9w8LN0tLX29vS1tbU2dnT2trV29rU2djAwsKxsLCurKyl + oKKfmZublZejnJ+vq6y3tLXAvb3AvL3Bvb7IxsfRz9DQ0NHS09PQ0tLM0M/O0tLQ1NPU1dXa29rd397f + 4uLj5ubo6+vs7+/u8vLx9PTz+Pf3+vr2+vn3+/v6/fv5+/f4+/b2+PXz9fHx8u/u7ezs6+rq6ejp6Ofo + 5+bn5uXn5uXn5eTo5uXm5OPp5+fp5+bn5eXn5eXn5ebn5eXn5eXn5eTn5eTn5eXo5uXp5eXk4eHh3t3h + 3t3f3Nvf3dvi4N7n4+Lo5OPp5eTr5+bs6Ofq5uXm4uHj397k4N/m4uHl4eDk4N/d2djf2tnSzs3Sz87r + 6Oj+/f3//////v7///////////////////////////8AAP////////////////////////////////// + ///////////+/////////v7//////////f///f7///z///z59N3Sssq0Z8inSKyINq6VYvTt4f////// + //3///3//v///v///v////////////////////////////7+/vv7+/X19fDx8e3v7+vt7evt7e3v7+3v + 7+3v7+3v7+3v7+3v7+3v7+zu7u3v7+3v7+3v7+3v7+3v7+3v7+3v7+3v7+3v7+3v7+3v7+3u7/Dz89/k + 477DwsjNzNLY19Xa2dbZ2NXX19bY2LGxsZmQkrGnqb62t8W/v83IydHNzc7OzdLT09HU1NHU1NHV1NHV + 1NPX1tba2dnd3Nzh4ODl5OXp6erv7u7y8fD09PP29fj5+ff4+Pj6+vn6+vv8/Pv8/fj5+fb39/P09O/x + 8e/u7u3q6ero5+jm5efl5Ojm5Ojm5Ofl5Ofl5Ojm5ejm5efl5OTi4N7c29rY19jW1eXj4ujm5efl5Ofl + 5Ofl5Ofl5Ofl5Obk4+bk4+fl5Obk4+bl4+Pi4ODf3uTi4eHf3t3b2t3a2uTg3+bi4ejk4+nl5Onl5Ojk + 4+fj4ubi4ebi4ebi4eTg3+bi4dzY1+fj4unm5dDPztfV1fn4+P////39/f////////////////////// + /////wAA//////////////////////////////////////////////7////+///+/v/////////+///+ + /v///f///fr16Ny8zbZoxaRFqYYzuaFt9/Lm/////////P///f/+///+//////////////////////// + /////v7+/////////////Pz89ff38PLy7e/v7O7u7O7u7O7u7e/v7O7u7O7u7e/v7e/v7e/v7e/v7e/v + 7e/v7e/v7e/v7e/v7e/v7e/v7e/v7e/v7e/v7O7u8PPy5+zry9DPyM3Mz9PS0tPU09XV1NbW09PT0tHR + 3Nna3dzc2dnZ2NnZ2Nvb1tza1tzb2N7d2eDf4Ofl5+rq7O7u7/Hx8vT09ff39vj49/j49/n59/n5+Pr6 + +fn5+fj4+Pj49vb28fHx7e3t6+vr6enp5eXl5OTk5eXl5eTk5+Tj5+Xk6efm6Obl5+Xk5+Xk5+Xk5+Xk + 5+Xk5+Xk5OLh3dva19XU0M7N0M7N4+Hg6Obl5uTj5uTj5uTj5uTj5uTj5uTj5uTj5uTj5+Xk5+Xk4+Hg + 4N7d4+Hg5OLh4uDf4N3c4Nva4t7d5+Pi6OTj6OTj6OTj6OTj5+Pi5eHg5eHg5uLh5ODf3trZ4t7d6ufm + 5uTj393d+fj4/////v7+/v7+////////////////////////AAD///////////////////////////// + //////////////////////7///7+//////////7//v79/v/9///9+vXs4L/Qt2fFo0KnhDDBqXT79en/ + //////78///9//7///7////////////////////////+/v7////////////+/v7+/v7////7/Pz4+Pj1 + 9fXw8fHu7u7u7u7v7+/v7+/u7u7u7u7t7+/t7+/t7+/t7+/t7+/t7+/t7+/t7+/t7+/t7+/t7+/t7+/t + 7+/s7u3v8vLt8vHg5eTZ3dzb3N3Z3Nzb3d3f39/i4+Ph4uLf4eHg4+Pb3t7Z3t3d4+Lo7+3t8/Lu9fTy + +fj5+vr6+vr4+fn29vb19fX09PTz8/Px8fHw8PDt7u7r6+vp6enn5+fm5ubl5eXl5eXl5eXl5eXk5OTi + 4uLj4+Pn5ubp5+bn5eTm5OPm5OPn5eTn5eTm5OPn5eTn5eTn5eTl4+Lf3dzZ19bU0tHS0M/k4uHn5eTm + 5OPm5OPm5OPm5OPm5OPm5OPm5OPm5OPm5OPm5OPj4eDg3t3k4uHl4+Lk4uHj4N/h3dzg3Nvm4uHp5eTo + 5OPo5OPo5OPn4+Ll4eDk4N/l4eDk4N/d2dji3t3o5eTn5eTv7e3//v7+/v7////////+/v7///////// + //////////8AAP///////////////////////////////////////////////////v///v7///////// + /v///v7+//7///v59OrdvNK3ZMelQaaDLr+nc/r06P///////vz//vv//v7//v/+//////////////// + //////////////7+/v7+/v7+/v7+/v7+/v////////7+/vz8/Pj4+PX09PHx8e/v7/Dw8O/v7+zu7uzv + 7+3v7+3v7+3v7+3v7+3v7+3v7+3v7+3v7+3v7+7w8Ovt7e7w8O3v7+7x8e3w8O/y8urs7eXm5uLi4uPj + 4+Hg4ODe39jX19LS0svLy8HCws7Pz+rt7fDy8vHz8+/x8ezs7Ozs7Onp6ejo6Onp6ejo6Obm5ubm5ubm + 5ubm5ufm5ujm5ufm5ujm5+fm5ufm5uTj493c3NjW1tLR0dnY2Obk5Ofl5Ofl5Ojm5ejm5efl5Ofl5Ofl + 5Obk4+bk4+bk4+Ti4d/d3NnX1tXT0tPR0OTi4efl5OXj4uXj4uXj4uXj4uXj4uXj4uXj4uXj4uXj4uXj + 4uLg3+Hf3uXj4uXj4uTi4eTh4OTg3+Le3ebi4erm5ejk4+fj4ufj4ufj4ubi4eTg3+Tg3+bi4eDc2+bi + 4ebi4eXj4u/t7f/+/v////39/f///////////////////////////wAA//////////////////////// + ///////////////////////////+///+/v////////79//7+/f3//v///Pr06Ny50bdix6M+poItwqp2 + +vTq///////+/P/++//+/P/+//7//////////////////////v7+/v7+/////////v7+/v7+//////// + /////////////////v7+/Pz8+vr69vb28vPz7/Dw7vDw7u/v7e/v7e7u7e7u7e/v7e/v7e/v7e/v7e7u + 7u/v7/Dw7/Dw7e/v7e7u7O7u7u/v6evr3d3d2dnZ1tPT1NDQ0czMzsnJy8bGysbGwr+/y8jH4t7e4d7d + 4t/f4d/f4uHh5OTj5eXl5eXl5uXl5ubl5ubm5+bm5uXl5ubl5+Xl6Obm5+Xl5+Tk5+Xl6Obl5OLh3NnZ + 19TU0M7O2NbW6Obl5+Xk5+Xk5+Xk5+Xk5+Xk5uTj5uTj5uTj5uTj5ePi5ePi393c29nY19XU09HQ4uDf + 5+Xk5ePi5ePi5ePi5ePi5ePi5ePi5ePi5ePi5uTj5uTj4+Hg4N7d5OLh5OLh5ePi5eLh5uLh5eHg5uLh + 6eXk5+Pi5+Pi5uLh5+Pi5+Pi5eHg5ODf5ODf5eHg5+Pi6OTj5eTj8e/v//7+/v7+/v7+//////////// + ////////////////AAD///////////////////////////////////////////////////7///7+//// + //////7///78/f/9///8+vPl2bXQtl/GojykgCzFr3z69uz////////+//77//78//79//////////// + ///////////////////////////////////////////////////////////////////////////+/v77 + +/v6+vr39/f19PTz8/Px8fHw8PDv7+/v7u7t7e3t7e3t7e3v7+/v7+/t7+/t7+/t7+/u7+/r6+vf39/Z + 2NjX1NTW0tHUz87RzMvOycjLxsXGwsDIwsHa1tXm4eDq5eTq5+bo5uXn5eTn5eTj4eDk4uHm5OPn5eTn + 5eTn5eTn5eTn5eTn5eTn5eTn5eTo5uXm5OPj4eDe3NvY1tXS0M/Z19bn5eTm5OPm5OPm5OPm5OPm5OPm + 5OPl4+Ll4+Lm5OPl4+Lj4eDf3dza2NfX1dTV09Li4N/n5eTl4+Ll4+Ll4+Ll4+Ll4+Ll4+Ll4+Lm5OPl + 4+Ll4+Li4N/g3t3l4+Ll4+Lk4+Lm5OPn4+Lm4uHl4eDo5OPp5eTn4+Lm4uHn4+Ln4+Lm4uHk4N/k4N/l + 4eDm4uHn4+Lm5OPy8PD////////+/v7///////////////////////////8AAP////////////////// + /////////////////////////////////v///v7////+/////v///v3+//7///v58+PYstC1XMahPKOB + LcaxgPr37/////////7//v3//v3//v3///////////////////////////////////////////////// + //////////////////////////////////////7+/v////////7+/v7+/v7+/vv7+/n5+fj4+Pb29vX1 + 9fPz8/Dw8O/v7+7u7u3u7u3u7u7u7u/v7+vr6+Lh4dza2tbU1NTS0dLPzs/My8zJyMjFxMTBwMTBwNzZ + 2Ojl5Obj4ubj4+Xk4+Xj4uTi4eLg3+Ti4efl5Ofl5Ofl5Ofl5Ofl5Ofl5Ofl5Ofl5Ofl5Ojm5ebk4+Lg + 393b2tnX1tPR0NjW1efl5Obk4+bk4+bk4+bk4+bk4+bk4+Xj4uXj4uXj4uXj4uPh4N/d3NrY19fV1NXT + 0uHf3ubk4+Xj4uXj4uXj4uXj4uXj4uXj4uXj4uXj4uXj4uXj4uLg3+De3eXj4uXj4uTj4ubj4ufj4uXh + 4OTg3+jk4+nl5Ojk4+jk4+fj4ubi4ebi4ebi4ebi4ebi4enk4+jl5Obk4/Lw8P////////7+/v////// + /////////////////////wAA//////////////////////////////////////////////////////// + /v7///7///7////+/f3//v//+vnx4tew0bZcxaE8o4EvyLOF+/fx/v7////////+/f/+/f/+/f////// + //////////////////////////////////////////////////////////////////////////////// + /////v7+/v7+/////////v7+/////////////////////v7+/f39+/v7+fn59/f39fX18/Pz9PT07e3t + 4d/f3NnZ2NbW1NLR0c/OzszLysjHxsTDw8PBwMC/2dnX5ubk4uHg4+Ph5OLh5ePi5ePi5ePi5+Xk5+Xk + 5+Xk5+Xk5+Xk5+Xk5+Xk5+Xk5uTj5+Xk5+Xk5uTj4uDf3dva2dfW1NLR2NbV5+Xk5+Xk5+Xk5uTj5uTj + 5uTj5uTj5ePi5ePi5ePi5ePi4+Hg3tzb29nY19XU1NLR4N7d5uTj5ePi5ePi5ePi5ePi5ePi5ePi5ePi + 5ePi5ePi5ePi4uDf4N7d5ePi5ePi5OPi5eLh5+Lh5eHg5ODf5+Pi6OTj6eXk6eXk6OTj5uLh5uLh5+Pi + 5uLh5+Pi6OTj6OXk5uXk8/Hx/////////v7+////////////////////////////AAD///////////// + /////////////////////////////////v/////////+/v///v///////v/8/f79//76+e/h1q/Os1vC + nzqjgjHLtYn9+PP//v///v////3+//39///9//////////////////////////////////////////// + ///////////////////////////////////////////////////////////////+/v7////////+/v7/ + ///+/v7+/v7////////////////+/v7+/v7+/v708/Pi4ODc2trZ19fW1NPT0M/PzMvLyMfHxMPDwsDA + wL7Z2Nfn5eTi4N/i4d/j4eDk4uHj4eDj4eDl4+Lm5OPm5OPm5OPm5OPm5OPm5OPm5OPm5OPm5OPn5eTl + 4+Lh397d29rb2djV09LY1tXm5OPl4+Ll4+Ll4+Ll4+Ll4+Ll4+Ll4+Ll4+Ll4+Ll4+Lj4eDe3Nvb2djY + 1tXU0tHg3t3m5OPl4+Ll4+Ll4+Ll4+Lm4+Lm4+Ll4+Ll4+Ll4+Ll4+Lh397f3dzk4uHl4+Lk4uHl4uHo + 4+Lm4uHl4eDn4+Lp5eTp5eTp5eTo5OPn4+Ln4+Ln4+Ln4+Ln4+Ln4+Ln5OPo5uX18/P////+///+/v7/ + //////////////////////////8AAP/////////////////////////////////////////////+//// + //////7+///+/////////v3+//3///n57uDVrM6yWMKfOqWDM8m1ifv39P/+///+/////f///P///v/+ + //////////////////////////////////////////////////////////////////////////////// + //////////7+/v////////////////////////////////7+/v7+/v////////////////////////// + //f19eTh4d3b29rX19nV1NbR0NHNzM3Ix8nEw8XBwMS/vtvX1unk5OXg3+Pf3uHf3uLg3+Hf3uLg3+Ti + 4ebk4+bk4+bk4+bk4+bk4+bk4+bk4+bk4+bk4+fl5OXj4uDe3dza2dvZ2NXT0tjW1ebk4+Xj4uXj4uXj + 4uXj4uXj4uXj4uXj4uXj4uXj4uXj4uPh4N3c2tvZ2NjW1dTS0eDe3efk5OXj4uXj4uXj4+Tj5OTk5OTk + 4+Tk4+Tj4uXj4uXj4uHf3t/d3OTi4eXj4uTi4eXi4ejk4+fj4ubi4ejk4+rm5erm5enl5Ojk4+jk4+fj + 4ubi4efj4ufj4unl5Onm5ejm5fb08/////7///7+/v///////////////////////////wAA//////// + /////////////////////////////////////v///v7///7////////////+/////f7//f//+vjs4tWm + 0LJVwp03pIM3zbmV/vv0/////////v/+///+//7///////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////9fT04+Li3dzc2dfX19TT1NDQ0MzNzMjIyMPE + xcDBw76+2tXV6eXk5eDf49/e4t7d49/e5OHg5eHg5ePi5uTj5ePi5uTj5uTj5uXj5eXj5uTj5uTj5uTj + 5uTj5ePi4N7d3dvZ2tjY1tTT2NbW5uPj5uPi5uPi5uPi5OPi5OPh5uTj5+Pj5+Ti5uPi5uPi4OHg2dvb + 29nZ2tXV1NHQ3t3a5+Xj5ePj4+Lm3eDo0dzmy9vkytrh0t7j2+Ll4+Tl5OPi4t7d4d7d5OLh4+Pi4+Pi + 5+Tj6eXk6OTj5+Pi6OTj6ubl6eXk6eXk6eXk6eXk6OTj5uLh5uLh5+Pi6eXk6ebl6Ofm9vT0//////// + /////////v7+////////////////////AAD////////////////////////////////////////////+ + //79/////v////7+///+//7////9/f/9///8+evk1KLPsVO/mzOjhDvSv6H//vT////9//79//7//v// + /v////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////09PTi4uLc3d3Y19fW1NPS0NDPzc3KyMjGxMTEwMHBvL7Z1NXp5eTk4N/j397i3t3j397m4uHn + 4uHm5OPn5eTm5OPl4+Ll4+Ll5OPk5OLl4+Ll4+Lm5OPm5OPl4+Lg3t3d29na2NjW1NTY1tbm5OTl5OPk + 4+Ll4+Lk4+Pj4+Pl4+Po4+To4+Pl4uHi5OLd4uDZ3Nvc2dna1tbW0tDe3Njn5uTj5OXY3uTL2OK70eGz + 0eKz0eG+1ODN2+Pd4uXi4+Li3t3i3t3m4uHj4+Lj5OHn5OPp5eTo5OPn4+Lo5OPq5uXp5eTp5eTp5eTp + 5eTo5OPm4uHm4uHn4+Lp5eTo5eTo5+b39fX////////////////+/v7///////////////////8AAP// + /////////////////////////////////////////////v7////+/////v7///7//v////7+//3///z4 + 6ePSoM2vUcCcNKeHPdTAof/98/////3//v3//v/+///+//////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////T09OPj497e3tnY2NfV1NPR0dDOzsvJ + ycbExMXBwcG8vdjT1Ojk4+Tg3+Pf3uPf3uTg3+bi4efj4ufl5OXj4uXj4ubk4+Xj4uXj4uXj4uXj4uXj + 4ubk4+bk4+Xj4uHf3tza2dvZ2NfV1NjW1uTk5OHk4uLj4uPk5t/i5dzg5Nze4+Hg5OTi5ePj49/l4t3i + 393b29vZ2NjW1dbS0ODc2OXk4tzi5MjY37nS3bLP4a/Q5a/Q5rXP4cLT4NXe4+Hi5OHe3uLe3ebj4uXj + 4uTj4Ofk4unk5Onl5Ofj4ujk4+rm5erm5enl5Orm5erm5ejk4+fj4ubi4ejk4+rm5enm5enn5vj29v// + //////7+/v7+/v///////////////////////wAA//////////////////////////////////////// + ///////+/v////7////+/v///v/+//////7//f7/+/fo49GfzK1QwJs0qYlA1sKk//3z/////f/+/f/+ + //7///7///////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////8/Pz4+Pj3t7e2tnZ2NbV1NLS0M7Oy8nJxsTExcHBwby919LT6OTj5ODf49/e49/e5ODf + 5uHg6OTj5+Xk5ePi5ePi5ePj5OLi5ePj5eTj5ePj5ePj5uTj5uTj5uTj4d/e3NrZ29nY19XU2NbW5OPj + 5OPi4uHk3OHnz9rkxNbgw9PfytXf19vh4uLl4+Xj4eDe4Nrc2tjX1dfT1dTP39zY5uTj1uDhvdTbsNHf + rNDkqc7nqs7pss/kvtLg09zk4OLl4d7e4t7d5+Ph5+Tg5+Tg6OXi6OTk6eXk5+Pi6OTj6ubl6ubl6ubl + 6ubl6ubl6OTj5+Pi5+Pi6OTj6ubl6ebl6efm+Pb2/////////v7+//////////////////////////// + AAD///////////////////////////////////////////////7+/////v////7+///+//7+/v7//v/9 + //789ufhzJvMqk69ljKpikLayKn//vT////9//79//7//v///v/+//////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////////////////////////z8/Pj4+Pf39/a2trY1tXV09PQ + zs7LycnGxMTFwcLAu7vV0dHo5OPl4eDj397k4N/l4eDm4eDo5OPn5eTl4+Ll4+Ll4+Pn5OXm5OXl4uPk + 4eLm4+Tm5OTl4+Pk4uHf3dzd29rb2djX1dTX1dXo4+To5OXc3+TL1uG60OCvzuCxzOC5zt/H1N/Z3uPl + 4uTm4N/h29ra2NfW1tPW1NDe29fk4+LR3N+509qu0uGp0OalzuinzeawzuTA0uDV3+bg4uTg3t7i3tzm + 5ODn5ODn5eDn5OLn5OTo5eTm5OPn5OPp5uXp5uXp5uXp5uXp5uXn5OPm4+Ln4+Lo5OPq5uXp5uXp5+b5 + +Pf////////+/v7+/v7///////////////////////8AAP////////////////////////////////// + /////////////v7////+/////v7///7//v///v/+//////z05dnEksKeRLiRLqiJQ9fGqf/99P////// + /v3//v/+///+//7///////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////Pz8+Tk5OHh4dza2trY19XT09HPz8zKysbExMXBwsC7utXR0Ojk4+Xh4OPf3uPg + 3+Th4OXh4Ofl5Ojm5ebj4uXi4ufk5eXh49zZ29bS1dTR09vX2uTi4ufk5OTi4eDe3d3b2tvZ2NfV1NjV + 1efi4+jk5tPb4brP3K/N4KvL46zJ47LL47zR4NDb4eTj5Obh4d/b2tvY19jW1NbU0dzb1+Lk49Xe4cHV + 3bPR4a3O5azP56/P5LXP4cbW4Nvj5uLj4+He3eLe3Ofk4Ofk4ebl4ebk4ufl5Ofl5Obk4+bk4+jm5ejn + 5ujm5ejm5ejm5ebk4+bj4ufj4ujk4+rm5enm5ero5/r5+P////////7+/v7+/v////////////////// + /////wAA/////////////////////////////////////////////v/9/f///v/////+/P///f79/v/9 + //7/////+/PiybKAp4IsqoIjq41I3c6y//74///+//7+/f/+/v3///3//f7+/v///v7+/v7+/v7+/v7+ + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////8vLy5ubm4uLi3dzc29nY + 1tTU0tDQzcvLx8XFxMDBvbi508/O6OTj5uHg4t/e4d/e4+Hg5OPi5uTj6ubl6eTk6OPk5eDj2NLWy8XL + x8HGx8HHy8XJ2tXW5+Lj5ePi4eDc29rX2tjX19XU2NbV5OHi4+Pmx9Xdtc/er8zkr8jksMfks8rkuNDg + ytvi3+Lk4t/f3NrZ3dnY3NfW2NXT2trW4OPi3eLlzdffv8/etc7hs8/hutHfw9Xf097j3+Tl4+Lh4t/b + 49/c5uPi5ePi5uTj5ePi5+Xk5uTj5uTj5uTj6Obl6Obl6Obl6Obl6Obl5uTj5eLh5+Pi6eXk6ubl6OXk + 6+no+vj4/////v///v7+/v7+////////////////////////AAD///////////////////////////// + //////////////////7+///9///////8///9//7////////+/f398uK7oXCXcR2jeh+rjEvg0rj///r/ + ///////9//3//f7//v/9//7+///9/f3+/v7////+/v7+/v7///////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////y8vLm5ubi4uLd3Nzb2djW1NTRz8/MysrGxMTEwMC9uLnSzc7p5eTm4uHi + 397h397j4eDk4+Lm5OPq5uXp5OTo4+Ta1NfKxMnHwMfFvsXGv8XHwcbNyMvi3d7n5OPg3tvb2tfa2NfX + 1dTX1tXm4uPj4ubG0tu2z96wzOKxyOO1yeW1y+K70eDO3eTh5OXh4N7a29nd2djc19bY1NPa2tjh5OLh + 4+Pb3uPR1uHF1OHF1uHN2uDV3+Pf5OTk5ePm4+Di3tzh3t7l4+Pl4+Pl5OPm4+Lp5eTo5OPo5OPo5OPq + 5uXq5uXp5uXq5uXq5uXo5OPm4uHn4+Lp5eTq5uXp5eTr6ej6+fn////+///+/v7+/v7///////////// + //////////8AAP/////////////////////////////////////////////+/v7///7///////v+/vv9 + /Pz7/Pr5+v/9/Pzw3rWaaZdwIKB4IaKERtvNt/n48/f3+Pv8/P////////////////7+/vz8/P7+/v// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////Ly8ufn5+Pj497d + 3drY19XT09HPz8zKysbExMTAwb24udDLzOnl5ebi4eLe3eLg3+Lg3+Xj4ejm5Onl5Ojk5OPe4NDLzcbA + xcjAyMfAyMa/x8a/xcvGyd/a2+fj49/e2tzb2NvY19jW1djW1uXh4ubi5NDW3bzO2rTN3bTN4bbM4brO + 38bV4Njg5ebl5eTh3tvb2NzZ2NzX19nV1Nra2eTk4uXj4uXj5ODg5dnf5tri5t3i5N/j4+Tj4ebj4Ofj + 4OHe3eDe3uTj4+Xj4+bk4+fk4unk4+jk4+jk4+jk4+vn5urm5enl5Orl5Orm5ejk4+fj4ufj4ujk4+rm + 5enl5Ovp6Pv5+f////7+/v////7+/v///////////////////////wAA//////////////////////// + ///////////////////////+/f3++/v9+vj58vX27/Ly8/Hz29nb3tva9ejVrZBemG4goHUgm31B1sq0 + 3dvYyMjLy8rM0dDQ29fZ6Obo9vj3/////////////v7+//////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////8vLy6Ojo4+Tk3t7e2tjX1dPT0c/Py8nJxcPDw7/Avbi5zsnK6eXk + 5uLh49/e4uDf4uDf5eTh6Ofj6eXk6eTl4NvczMfLx8DHx7/Ixr7Jxr7Ixb7FysTJ4dvd5+Li393a3NvX + 29rW2dfW2NbW4uDg5uTl397jy9LZv8/bt8/du9DdyNbh2d3l5ePl6OTh5N/c39vY29nY2djY1tbW3NjZ + 6OPj5uLh5uPh5eTj5OPj4+Tj4uPh5OLh5+Th6OTh5eLh4N7e397e4+Pj5ePi6OXh5+Th6OTj6OTj6OTj + 6eXk6+fm6ubl6eXk6eXk6ubl6OTj5+Pi5+Pi6OTj6ubl6ebl7Orq/Pr6/////v7+//////////////// + ////////////////AAD////////////////////////////////////////////8/Pv29/jy8/Xz8fLu + 8PDt7+/x8PHQzc6jnpzm2siojV+OZyCYcSSLcDrPxLDQ0c+2t7qxsLKsqqqqpqerqaq2ubfP0NDs6+v9 + /f3///////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////////////////////////////////////////y8vLn5+fk + 5OTf3t7a2NfV09PRz8/LycnFw8PCvr+9uLnOycrp5eTm4eDj397i4eDk4uHl5OHm5eDq5uXq5eXj3t/N + x8vHwMbHv8fIv8nHvsjIwMfWz9Tm4OLo4+Pg3tvc29fb2tbZ19bY1tbf4eDh5ePl4+Tf3ePU2uLL2uLQ + 3eXc3+bn4eTq4+Ll5d/i4dzg2tjb2tjX2djV1tfc2Nnp5OPp5OLl5d/m5t/o5d/n4+Dl4+Ln4+Lo5OPm + 4+Lj4eHf3d7e3d/k4+Pl4+Lo5eHo4+Ho5OPo5OPo5OPp5eTr5+bq5uXp5eTp5eTq5uXo5OPn4+Ln4+Lo + 5OPq5uXq5uXs6ur8+vr////+/v7///////////////////////////////8AAP////////////////// + //7+/v////////////7+/vn5+fT09PHz8/Dy8/Dx8u/x8vDx8fLy8s/My5mUkbGqn4+Aa4ZyUYt3VHxu + VcG5r9PQzri3ubOytK2rrailqaOipKGipKSmprS1tc/Q0Ovs7Pz8/P////7+/v7+/v3///3///3///// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////7+/vHx8ejo6OXl5d/f39vZ2NXT09DOzsrIyMXDw8G/v7y5uM7K + yenl5OXh4OPg3+Th4Obi4efk4ujl4+rm5ejl5OXi4tbS1cjEx8TBxMfCxsfCxtHMz+Lf4Obj4+Ti4uDe + 3dza2NvZ19rY19jW1eHg3+Pl4uXj4ubk5OPj5d/i5ODj5eTk5efi4ufj4uXk4OLg3d7Z2NvZ2NnZ2NfX + 1dza2efj4ufj4uTj3+Xk4Obj4Obi4eXj4ubk4+bj4ubj4ufj4uPg3+Lg4Obi4ufk4unl4+jk4+jk4+nl + 5Onl5Onl5Ovn5unl5Onl5Onl5Onl5Ojk4+fj4ubi4ejk4+rl5Onl5O3r6v38/P////7+/v////////// + /////////////////////wAA/////////////////////////////v7+////+fn58vLy8fPz8fPz8PPz + 7fHy7fDx7e/v8vHxzMnIiISBVFBLdm9pk4qClIyEgXt1urWy09DOuLe3s7KzqqqspaWnpaSmpKWmpaio + q6+vtLe3xMXG4uLi+/v7/v7+/////v///P7+/f////////////////////////////////////////// + /////////////////////////////////////////////////////////////////////////v7+8fHx + 6Ojo5eXl39/f29nZ1dPT0M7OysjIxcPDwsC/vLm4zcnI6eXk5uLh5ODf5eHg5uLh6OTj6eXk6ubl6OXl + 5uXk4uDg2NbW0M/O0M7O1tTU393d5+Xl5uTk5OLi393c29nY29nY2tjX2dfW4+Hg5+Xj5ePi5ePi5uTi + 5eLh5ePi5uTj5ePi5ePi5OLh4d7d3dva3NrZ3NrZ2tjX3t3b5eLh5uTj5uTj5uTj5+Xk5+Xk5+Xk5+Xk + 5+Xk5+Tj6OTj5uLh5uLh5uPi5+Pi6OPj6OTj6OTj6eXk6ubl6ubl6eXk6eXk6ubl6ubl6eXk6OTj5+Pi + 5uLh6OTj6uXk6eXk7uzr/vz8/////v7+////////////////////////////////AAD///////////// + ///////////////////+/v719fXx8vLz9fXy9PTx8/Pu8vPu8PHs7u/u8O/Ix8Z7eHY4NTFoY16Lgn2G + fXltZmOzrqzSz8+3uLixsrKoqqqlpaWkpKSlp6emqamssrG5vby/wcHNzc3r6+v+/v7////////9/v79 + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////+/v7x8fHo6Ojj5OTf3t7b2dnU0tLPzc3Jx8fFw8PBv7+7 + uLfLx8bo5OPm4uHk4N/k4N/m4uHo5OPp5eTq5uXo5eTm5OPm5OTm5OTk4uLi4ODl4+Pn5eXn5eXm5OTk + 4uHf3dzc2tnc2tnb2dfZ19bi4N/n5eTm5OPl4+Ll4+Ll4+Lk4uHk4uHk4uHm5OPl4+Lh397d29rd29rc + 2tnb2dje3Nvk4uHn5eTo5uXn5eTn5eTn5eTm5eTl4+Ll4+Ll4+Lm5OPl4+Ll4+Ll5OPn5OPn5OPm4uHk + 4N/j397k4N/n4+Lp5eTq5uXq5uXq5uXq5uXo5OPn4+Ln4+Lo5OPp5eTp5eTv7ez+/fz////+/v7///// + //////////////////////////8AAP////////////////////////7+/v////7+/vX19fP09PP19fL0 + 9PHz8+7y8+zw8e3w8ezt7sLCwXRycjo4N2hkYnFraWZfXmBaW7i2tsrKy7S2tq2vr6iqqqSnpqOlo6Wn + paerqq2ysbi8u8LExMrMzODh4fz8/P////7+/v7+/v7+/v////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////7+ + /vHx8ejo6OPj497e3tvZ2dTS0s/NzcnHx8XDw8G/v7q3tsnFxOjk4+bi4ePg3uTi3ebj3+jk4unl5Orm + 5ejl5OXj4uTi4eXj4+fl5Ofl5Ofl5Obk4+Ti4ebk4+Ti4d/d3Nza2dva2Nva1trZ1eHg3ebk4+bk4+Xj + 4uXj4uXj4uXj4ubk4+bk4+bk4+bk4+Ti4eHf3uDe3d3b2tvZ2NvZ2OHf3uTi4eXj4uTi4eXj4uXk4+Pj + 4+Pj4+Tk5OXl5ejm5ujm5unn5+nn5+nn5+rn5+nm5ujk4+fj4ufj4ujj4urm5enl5Orm5erm5enl5Ojk + 4+fj4ujk4+jk4+nl5Onl5O/t7P79/f///////////////////////////////////////wAA//////// + /////////////////////////v7+9vb28vLy8fPz8fPz8PPz7vLz7fHy7PDx7O7vu7y9Z2doZWVklJKS + iYWFdnFye3d6ycnLzM7Ps7a3q66vo6emn6OhoKKfpKakqK2srrOyuLy7wsbGy87O3+Dg/f39//////7+ + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////f398fHx6Ojo4uLi3t3d2tjY1dPT0M7OycfHxMLC + wL69uba1yMTD5+Pi5+Pi5ODe5OHd5uPf6OXh6ebj6ufk6OXk5eTj5ePj5ePi5+Tk5uTk5uTj5uTj5uTj + 5uTj5eLi3tza29rX29rX3dzY3NvX4uDd6Obl5+Xk5uTj5uTj5+Xj5uTj5uTj5uTj5uTj5ePi5OLh5OLh + 4+Hg4N7d3dva3tzb4uDf5OLh5OLh5uTj5+Xl5+bm5+fn5+fn6Ojo6Onp6unp6+rq6+rq6+rq6+rq6urq + 6+rp7erp7erp7Ono6ufm6OXk5+Tj5+Xk6OXk6OXk5+Tj5+Tj6OTj6OTj6eTj6eXk8O7t//39//////// + ////////////////////////////////AAD////////////////////////////////+/v729vbx8fHx + 8/Px8/Px8/Tw9PXu8vPt8fLu8vO4u7xrbW6SlZWUlZSGg4R2dHVsbG6lqKno7O3c4OHM0dK+w8OvsrGk + pqWgo6Kip6autLO5vr3BxsXN0NDn6Oj////////////////////////+/v7///////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///9/f3w8PDn5+fi4uLe3d3a2NjV09PQzs7Jx8fEwsLAvr25t7XHw8Ln4+Ln4+Lk4N7k4d7m49/o5eHp + 5uLq5+Po5uTl5OLm5OLm5OLm5OPn5ePm5OLn5ePo5uTm5ePl5OLh393e3drd3Nje3drd29jg3tzm4+Pm + 5OPl4+Ll4+Ll4+Pl4+Lk4uHk4uHm5OPm5OPl4+Ll4+Lm5OPl4+Ll4+Lm5OTo5uXo5uXp5+bq6Ofr6enr + 6erq6urq6urr6+vr6+vq6urq6urq6urq6+vq6+vr6+vr6+rs6uns6+rt7Ovs6unq6Ofn5eTm5eTm5OPm + 5OPm5OPn5OPo5OPo5OPp5OPp5eTw7u7//f3///////////////////////////////////////8AAP// + //////////////////7+/v////////////X19fLy8vP19fP19O/x8uvv8Orv8Ozw8ent7qqur46Sk5yg + oZCSkoSCgnV0dGtsbGltbKSqqtvh4uzx8uzw8efq69vc3cnLy7W6ubG2tbi9vMLHxtHT09vd3enq6vr6 + +v////////////39/f39/f7+/v////7+/v////////////////////////////////////////////// + //////////////////////////////////////////////39/e/v7+bm5uLj497d3drY2NXT09DOzsrI + yMTCwr+9vLq3tsTAv+fj4ubi4ePf3uXh4Obi4ejk4+nl5Orm5ejn4+fm4ujn4+jn4+fm4ejn4+fm4ufm + 4ubl4ebl4ebl4eXj4uLg39/d3N7c29za2d3b2uLg4OTi4uTi4ubk5Obk5OXj5Ofl5efl5efl5efl5ejm + 5enn5unn5unn5ujm5ejm5ejm5ejm5ero5+vp6evp6evp6erq6urq6urq6urq6urq6uvr6+rq6urq6urq + 6uvr6+vr6u3r6u7r6uzq6ezq6e3r6uzq6ejm5eXj4uXj4uXj4ufk4+jk4+jk4+nl5Ojl5PHv7/////// + /////////////////////////////////////wAA/////////////////////////////////v7+9vb2 + 8/Pz8fPz7vDw7/Lz7vLz7fHy7PDx5enqsra3pKipnaKjkJOTg4GBcXFvaGtpcXV0Y2lokJaWz9TV29/g + 5+ns7O3w7+/w5Ofn1NnYyM7MxcvJ09XVztDQvL29xsbG3Nra7+3t/v39/////v7+/v7+/v7+/v7+//// + //////////////////////////////////////////////////////////////////////////////// + /////////f397+/v5ubm4uLi3t3d29nZ1NLSz83NycfHw8HBvry7uLa1w7++5uLh5eHg5ODf5ODf5eHg + 5+Pi6OTj6eXk5+Tj5uTj6Obk6Ofj5uXh5uXh5uXh5uXh5ePg5ePi5ePi5uTj5uTj5OLh4uDf4d/e4uDf + 4+Hi5ePj5uTk6Obm6Obm6efn6ujo6ujo6ujo6ujo6ujn6efm6efm6efm6efm6Obl6Obm6Obm6Obm6efn + 6+np6+np6urq6urq6urq6urq6urq6urq6urq6urq6urq6urq6+rq7uvq7urp7urp7urp7+vq7eno6+jn + 6eXk5uLh5uPi5+Tj6OTj6OTj6eXk6ebl8vDv//////////////////////////////////////////// + AAD////////////////////////////////9/f339/fx8fHu8PHu8fLl6Onh5ebp7e7r7/Du8vPa3t+u + srOhpKaSlZaFhIRwb25jZWNvc3KEioikqam2u7uyt7e0t7e9vb/IyMnV19fd4ODd4eDW2dnX2dnKzMyy + tLSwsbGys7O6uLjQzs719fX////+/v79/f3///////////////////////////////////////////// + ///////////////////////////////////////////////////9/f3u7u7m5ubi4uLd3d3a2NjT0dHN + y8vHxcXBv7+8urm2s7LAvLvl4eDl4eDj39/k4ODl4eHn4+Po5OTp5eTm4+Ll4+Ll4+Ll5OHl5OHl5OHm + 5OLl5OHk4uHl4+Lm5OPl4+Ln5eTn5eXm5OTm5OTn5eTn5eXo5ubo5ubp5+fq6Ojq6Ojq6Ojq6Ojq6Ojq + 6Ojq6Ojp6efp6efp6efp6efo6Obo5+jn5ubm5eXn5ubp6Ojp6Ojq6urp6enq6urq6urq6urq6urq6urq + 6urr6+vr7Ozt6+vu6unu6unv6unv6unu6unu6unt6ejs6Ofq5uXn4+Ll4eDm4uHo5OPr5uXq5+by8O// + //////////////////////////////////////////8AAP////////////////////////7+/v////// + //39/fL09Ofq7Onu787S08LGx+Dj5Ojs7e3x8d3h4q+zs6GlppSXmIOCg3Btb2FhYmhra46Skbm+vZ2i + oIqPjoiLipKTkqqrq7e4uLi6urm7u8rMzNbY2MbIyLGzs6+xsbCxsa+vr66trcbGxvb29v////7+/v39 + /f////////////////////////////////////////////////////////////////////////////// + //////////////z8/O7u7ufn5+Pj493c3NrY2NPR0c3Ly8fFxcG/v727urWysb+7uubi4ebi4eTg3+Tf + 4OXg4efi4+jj5Ojk4+fl5Ofl5OXj4uXj4ufl5Ofl5Ojm5ejm5ejm5ejm5ejm5ejm5ejm5ujm5ujm5ujm + 5ufl5ebk5Ofl5efl5ejm5uro6Oro6Oro6Oro6Oro6Oro6Ono6Ojp5+jp5+jp5+jp5+nq6Ojo6Ofn6Ofn + 5+fn5+jo6Ojo6Ojo6Onp6erq6urq6urq6urq6urq6urq6urq6urq6uzq6+/r6u/r6u/r6u/r6u7q6e/r + 6u7q6e7q6e7q6erm5ebi4efj4ujk4+rm5ern5vPx8P////////////////////////////////////// + /////wAA/////////////////////////v7+////////////9vj35ejp5+vs0tTVyMrL5Obn7e/v8fPz + 3N3dsLSzoqinlZiZhYGDbmtuYV9iZGZnjpKS0NXUrLCvio2Mi42LmZqXq6uqrq6uqKqqjY+PpKamxcfH + wcPDra+vq62tr6+vr6+vrq2tq6qqzMzM/v7+/v7+/f39//////////////////////////////////// + /////////////////////////////////////////////////////////Pz87u7u5+fn4+Pj3Nzc2NbW + 09HRzcvLxsTEv729vLq5s7Cvvbm45eHg5eHg49/f5uDi5uHi6OPk6eTl6uTm6ebl6efm6Obl6Obl6efm + 6Obm6efm6efm6ujn6ujm6efm6efn6efn6Obm6efn6efn5+Xl5+Xl5+Xl5ePj5+Xl6efn6ujo6ujo6efn + 6efn6efn6ejo6Onn6Onn6Onn6Onn6enp6enp6erp6Ono6Ono6Ojo5+jn5+fm6Ono6erp6uvq6evr6uvr + 7ezs8O3t8u7u8+7u9u/u9u7u8+zr8Ovq7+vq8Ovr7+vq7uvq7erp7Ono6+fm6ubl6OXk5uPi5+Pi6ebl + 9PLx////////////////////////////////////////////AAD///////////////////////////// + /////////v/5/Pvr8/Dq8O/h4+Pb293l5efv8PHz9vbY2tuxs7OipqeVl5mFg4RvbWxhXl9jZGWPlJTi + 5+jb4OK9v8Kvr7Gxr7C2tbSys7OvsrKmq6qvs7K5vb22urqtsbCsrq6urq6vrq6urq6rrKytrq7k5OT/ + ///+/v7///////////////////////////////////////////////////////////////////////// + ///////////////////8/Pzt7e3m5ubj4+Pd3NzZ19fU0tLOzMzHxcXAvr66uLixr6+5trbh39/l4uLl + 4uLo5eXn5eXq6Ojq5+jq5+fr6ejs6unr6ejr6ejq6eXp6OXq6Ofp5+fq6Ojq6Ojp5+fp5+fp5+fp5+fp + 5+fp5+fp5+fo5ubo5ubm5OTm5OTm5OTo5ubo5ubq6Ojq6Ojq6Ojq6Ofr6ejp6Ofp6ejp6ujp6ujp6ujo + 6ufo6eXq6+fn6OTq6+fo6ebn6+jh5+Pc5uDf7OTh6+Xm6ePt5uDq2dXq0c7jyMXexsXMtrXYycf06ujy + 7ert6+rq7Oro6+nl6ejm6ejm6Ojp6Ojm5uXm5eTn5eX18/P////////////////9///+//////////// + //////////8AAP////////////////////////////////////////3///f8++/08+3v7/Hw8u7u8e3u + 8PDy89fZ2bKztKepqZiYmYV/gG5oaGBbWmRiYpWVl+3x8/L2+eru8ubp7OHk5N3g39rc29XZ2NHW1czR + 0LrAv660s62xsKywr62urq6urq6urqyvr6aoqMLDw/v7+/7+/v7+/v////////////////////////// + //////////////////////////////////////////////////////////////v7++3t7efn5+Pj493c + 3NnX19TS0s7MzMfFxcC+vrm3t7Sysq+urtHPz+jm5ujm5ujm5ufl5enn6Oro6Orp5+vp6Ovp6Ovp6Ovp + 6Orp5urp5uro5+nn5+ro6Oro6Onn5+nn5+nn5+nn5+nn5+nn5+nn5+nn5+nn5+fl5ebk5OXj4+Xj4+jm + 5uro6Ovp6ero6Oro5+jn5uvo5+zq6enm5e3q6e/r6fHu6vDr6PLt6fPu6fHp5e3l4dzd2NPd1M/i18rg + 1NHm2bbFuKaroKynncG1rMG2rszDvNjRzOLe2uvs5uvt6Ons6ert6uvs6urp6evp6uvr6unr6+np6efn + 5+Tj4/Xz8/////////////////3///7//////////////////////wAA//////////////////////// + /////////////////////v7/+vz89/n58/X27vLz7vHx8PLx09TSqqqomZqYiIaFenR1amNkZF1eaWRl + mZaW8vT0+Pz87PHx6O3s6u/u5uvp5+np4ubl3uPi2t/excvKr7W0qq+uqq+urK6ura6urq6urK6uqqys + r7Gx6+vr//////////////////////////////////////////////////////////////////////// + ////////////////////////+/v77e3t5+fn4+Pj3d3d2dfX1NLSzszMx8XFwL6+u7m5tbOzq6mps7Gx + zszM4uDg6Obm6ujo6efn6efn6efm6ujn6+no6+no6+no6+no6+no6ujn6ujo6ujo6ujo6efn6efn6efn + 6efn6efn6efn6efn6Obm6efn6Obm6Obm6Obm5uTk5uTk6Obm6Obm6ujo6ejo5+nm6efm6efm8Ovq7eXk + 4djW1svI2s7M3tHP08fDyby4wLWwr62lx9LIyN7RttHEr82+rMe4scm7yN3O1ebY2ere1ejc1+ng1ujf + 1OXc1+be3Ofh4efi5efj6eXk7Obl6+nn5ujo6enp6enp5uXl9vT0/////////////////f///v////// + ////////////////AAD////////////////////////////////////////+/v7//v/////8/v/5/f33 + +/r4+/ru8O6/wL2mpaGampeKiol7fH1sbG5jYWNgX16EgoHh4N/5+fjv7+7v8O7x8u/y8/Hv8fHt7+/p + 7ezn7Ovf5eS6wL+nq6qorayrra2trq6srKyrra2qrKyur6/g39////////////////////////////// + ///////////////////////////////////////////////////////////////////7+/vt7e3n5+fj + 4+Pd3d3Z19fU0tLOzMzHxcXAvr65t7ezsbGwrq6pp6eysLDLycnf3d3n5eXo5ubq6Ojr6ejq6Ofq6Ofr + 6ejr6ejr6ejr6ejr6ejr6ejq6Ofq6Ofp5+fp5+fp5+fp5+fp5+fp5+fq6Ojp5+fp5+fp5+fp5+fp5+fo + 5ubm5OTm5OTn5eXp5+fq6Ojn6Obq6ejt6ujw6+ro39/FuLe6ravJvLrZzMrTx8TRzcjN1MvN2M3O3dLH + 3M+/28y008S01MXE4dLO5dfV5tnU49fS49fQ4tbS5NrR4tnQ4djR4djS4NrS4NrS4NnU4Nra4N7g4uLl + 5eXp6eny8fH9/Pz////////////////9///+//////////////////////8AAP////////////////// + ///////////////////////////9//////z//vr//f3//v///9jY2LGysK+xsKCjoZWWlYKChGxtb2Fh + Y19dXmtpaaqop/Py8Pr5+Pj6+Pr8+vv+/fv9/fn7+/L19Ovw7+Pp6LvAv6Wqqaesq6qsrKytra6urqyu + rqmrq66vr9ra2v////7+/v////////////////////////////////////////////////////////// + //////////////////////////////r6+u3t7efn5+Li4t3d3dnY2NPS0s3MzMXExL++vri3t7Kysqyr + q6qqqrCvr7++vtHQ0ODe3uTh4ejm5uvp6Oro6Ovp6Ozq6ezq6ezq6evp6Ovp6Ovp6Oro5+nn5unn5unn + 5+nn5+nn5+nn5+ro6Oro6Oro6Oro6Oro6Onn5+nn5+ro6Onn5+fl5efl5ejm5ujo5+nq6Ovo5+zp6O3o + 5/Dp6e7l5PLp6PHr6u7r5uTj39/j3trk3Nfk2tPi2c7h1s3j183k2M3j18/i19Li2Nfj2dTg19Pi2dLh + 2NPh2dbh29bi29rk3d7n4uHr5+Tv6+jz7+308vT29fn5+fv7+//+/v/+/v////////////////3///7/ + /////////////////////wAA/////////////////////v7+//////////////////////7//////P/9 + /P/9///+//7+z87PsLS0qa6uoKWkkpSSg4GBbmxuYmBjYF9hbWtsnZyb9PLy/////f/++///+////v// + +/z88fTz6e7t3+Xktbq5paqpqK2sqq2trK2tq6ysq62tq62trK2t2tra//////////////////////// + ////////////////////////////////////////////////////////////////////////+vr67Ozs + 5+fn4uLi3d3d2NjY0tLSzMzMxMTEvr6+tre3srKyq6urq6ursLCwvb290NDQ4d/f5+bm6ejo6Obm6ujn + 6+no7Orp7Orp6+no6+no6+no7Orp6+no6efm6efm6efn6efn6efn6efn6ujo6efn6efn6efn6ujo6ujo + 6ujo6ujo6ujo6efn6efn6Obm5eXk5+jm6enn6+no6+jn6+jn7+rq7Orp6uzp5+3o5e3p5uzo6Orl5Ojj + 3uji2+fh2uXf2eTd2OHb2+Ld2uLd2+Xg3ujj3urk4+zn6O/r7/Pw8/f0+Pr4+vz7/P79/P/+/P///v// + //////////////////7+/////////////////v///v//////////////////////AAD///////////// + ///////////////////////////////////+//79//3+//3//v///P/Py8+0t7qrsbKgpKSTk5CHgn50 + cG5kY2RgYWRub3GhoaH08vL//////v79///8/v/////8/f3u8fHm6+re4+KwtrWjqaiprq2rrq6srq6q + ra2rra2rra2sra3c3Nz///////////////////////////////////////////////////////////// + ///////////////////////////////////5+fnr6+vn5+fi4uLe3t7Y2NjS0tLLy8vExMS+vr63t7ew + sLCqqqqpqamvr6+9vb3R0dHg4ODz8/P29vbt6+vo5uXq6Ofs6uns6uns6uns6unr6ejs6uns6uns6unr + 6ejr6ejq6Ofq6Ojq6Ojp5+fp5+fq6Ojq6Ojq6Ojq6Ojq6Ojq6Ojq6Ojq6Ojq6Ojo5+fn5+bm6efn6efq + 6ejq6Ofs6unt6unr6+np6+nm6+nk7Ono7Orw7Ovw7Ovw7+3x8e/x8vDx8/Hw8/Lx8/Py9vXz+ff3+/r7 + /vv+//7//////////////v////////////////////////////////////////////////////////// + //////////////////////////8AAP////////////////////////////////////////////////3/ + /v3//v7//v/////6/sXBx5OXmnh8fHVwbW9iW15USVNMREhFQkZHSVlcX5ydnvXz9P/+/v/9/v/+///9 + //////v8/O3w8OTq6drf3q6zsqOpqKmuraqtrautrautrayurqutra2urt/f3/////////////////// + //////////////////////////////////////////////////////////////////////////////r6 + +urq6ubm5uLi4t7e3tjY2NLS0svLy8TExL6+vra2trCwsKqqqqmpqa+vr729vdHR0d/f3/T09P////z8 + /PPx8efl5ejm5ezq6evp6Ozq6ezq6ezq6ezq6ezq6e3r6uvp6Ovp6Oro6Onn5+nn5+ro6Oro6Oro6Oro + 6Oro6Ovp6evp6ero6Ovp6ero6Ono6Obm5ebp5vP18/Lx8O3q6e7q6e/s6/Ds6/Pv7fPx8PPz8vX29ff4 + +fr5+f77+//8/f/+/v////3///3///////////////7///3///3////+///+///9///9///+///+///+ + ///+/////////////////////////////////////////////////////////////////wAA//////// + /////////////////////////////////////v///P/+/P/+///+//////v+ubi9jZOSmpiQm4Z8fFpM + Y0YzWUM1V0lDUkxMTExOiYyN8fLz/v///v/+/v3//v3/////+vv77O/u4+no1tvaq7Gwo6moqa6tqays + qq2sq62tq62tqqysrq+v4+Pj//////////////////////////////////////////////////////// + ////////////////////////////////////////+fn56urq5+fn4uLi3t7e2NjY0tLSzMzMxMTEvr6+ + tra2sbGxqqqqqqqqsbGxvLy80NDQ4eHh8/Pz//////////7+9vb16ujn6Obl6+no7evq7evq7evq7Orp + 7Orp7Orp7Orp6+no6ujn6ujo6ujo6ujo6ujo6ujo6ujo6efn6efn6efn6ujo7Orq7Orq7uvr7+7t6Ojm + rq6suLa18/Hw9/X1+vj3/fr6//z8//7+/////////////////v///v7///7///7//v7//v7//v7//P7/ + /P7//v///f///f7+/v///v///f7//v///v7///7///7///7///////////////////////////////// + ////////////////////////////////AAD///////////////////////////////////////////// + ///9///7//7+//7////6+/y/xcWyt7KyqJuJZFJ5QStxQCdlPSlhSD1rXlp4c3Wkpqby9vb+///9//78 + /v/7/v/////5+/vr7e3k6OfT2depr66kqqmprq2orayprayrrK2rra2pq6uur6/n5+f///////////// + //////////////////////////////////////////////////////////////////////////////// + ///4+Pjq6urn5+fj4+Pd3d3Y2NjS0tLMzMzFxcW+vr62traxsbGrq6urq6uxsbG+vr7R0NHf39/19fX/ + ///+/v7+/v/////8+vnw7uzp5uXq6Ofs6unt6+ru7Ovt6+rt6+rr6ejp5+bp5+bq6Ofp5+fo5ubq6Ojq + 6Ojt6+vv7e3x7u7z8PD08vL29PT59/f6+fn+/v3h3d00MC9qaGf9+/v////////////+/////v///v// + /v///v/+/v/+/v/9///+/v///f7//v///v/+/v/7///9///////////////+///9///9///9///9///+ + //////////////////////////////////////////////////////////////////////////8AAP// + ///////////////////////////////////////////+//3///z///7//v////T397rCwLG1rp6KeXlG + Lo5LLn1GJ2s+JV4+L2laVHl1daqsrPP29f///v/////+///+//////r6+uzs7OXm5tHW1aiuraSqqait + rKitrKmsrKurrKutramsrK+wsOrq6v////////////////////////////////////////////////// + //////////////////////////////////////////////j4+Orq6ufn5+Pj493d3djY2NLS0szMzMXF + xb+/v7a2trGxsaqqqqqqqrGxsb6+v9DP0d7e3vb29v7+/v7+/v/+///+/v///v79/Pb08+zq6enn5uzq + 6e3r6uzq6ero5+jm5enn5u3r6vDu7fTy8fb09Pj29vn39/r5+fz6+v38/P/+/v/+/v////////////// + /9nU1C0nJnRxcf/+/v////z///v///v///z///z+/v3+/v3//v///v///v///v///v////////////// + ///+///+///9/v/+/v////7///z+/v3///7///////////////////////////////////////////// + /////////////////////////////////////wAA//////////////////////////////////////// + //7///3///3//v7/+//+/f//9Pf3ucDAsrSvpX9rgkQlhUood0IhcDwjZD0salpSeHV0rKus9vX3/f// + /P7///3///z/////+Pn56uzs5efn0NXUqKyrpquqqK2sp6yrqa2tqKysqa6tqKursbOz6+zs//////// + //////////////////////////////////////////////////////////////////////////////// + ////////9/f36enp5+fn4+Pj3d3d19fX0tLSy8vLxMTEv7+/tra2sLCwqqqqq6ursbGxvr6+0NDQ4eHh + 9/f3/////v7+/v7+////////////////+/r69vX18PDv7ezs7u7u8vHx9/b2+fj4+/v6/f38//////// + /////////////////////////////////////v7+////0s7MLScmf318/////////v///f///f///f// + /v///v///v///////////////////////////////////////////////////////////v////////// + //////////////////////////////////////////////////////////////////////////////// + AAD//////////////////////////////////////////v///f///f/+/v/7//7+///z9fe4vcGztLOo + emaDQyJ/SiZzQiFwOyJnPS1oW1F1dHOxrq/6+Pr8///7/////f///P/////2+Pjp6+vk5ubP1NOmq6qm + q6qoraynrKuorayorayorq2oq6uztLXs7u7///////////////////////////////////////////// + ///////////////////////////////////////////////////29vbp6enm5ubj4+Pd3d3Y2NjS0tLL + y8vDw8O9vb21tbWvr6+pqamqqqqvr6+9vb3R0dHg4OD29vb////////////////////////+//////// + ///+///+/v7+/v7////////////////////////////////////////////////////////////////+ + /v7////PzMosJyaIhYT///////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////8AAP////////////////////////////////// + //////////3///7+//////7//v////Ty9rq9wrOys6F0YYJCI35HJHFBIGs5IGQ+LmldVHV1dLSwsv34 + +/7///v///7+/v////////b4+Onr6+Pl5c3S0aWqqaarqqitrKesq6itrKitrKitrKirq7W3t/Dy8v// + //////////////////////////////////////////////////////////////////////////////// + //////////////b29unp6efn5+Pj493d3djY2NHR0cnJycHBwbq6urS0tK+vr6ioqKmpqbCwsL6+vtDQ + 0N/f3/b29v////////////////////////////////7+/v7+/v7+/v////////7+/v////////////// + //////////////////////////////////////////7+/v///8bCwComJJGOjf////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////wAA/////////////////////////////////////////f//+////P/////////+////8vDzubzA + sa+wmW5bhEMkgEUjcT8fajgfYj8vaV5WdnZ1uLS2/vv9/////f/9/f/8/v/9////9vj46evr5Obmy9DP + paqppquqqK2sp6yrp6yrqK2sqK6tqKqquLq68/X1//////////////////////////////////////// + ////////////////////////////////////////////////////////9/f36enp5ubm4ODg29vb09PT + y8vLw8PDurq6s7Ozq6urpqamoqGho6Wlq62tury8zs7O4ODg9/f3//////////////////////////// + /////////////////////////v7+/v7+//////////////////////////////////////////////// + /////v/+////ura0KCMimJWU//////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////AAD///////////////////////////// + ///////////9///6//79//////////7////v7u+3uryyr6yTalSGRCOERCJ2PhxrOR9iQTFnYVh1eHa7 + ubv//f/////+//z9//v8//z////29/fo6+vj5eXJzs2kqaimq6qorayoraynrKuorayorayoq6q6vLz1 + 9/f///////////////////////////////////////////////////////////////////////////// + ///////////////////29vbo6Ojk5OTf39/Z2dnV1dXPz8/IyMjBwcG7u7uxsrKpq6ujpaWjpaWpq6u4 + ubnNzc3d3d329vb////////////////////////////////////+/v7+/v7+/v7+/v7///////////// + /////////////////////////////////////////////////v7///+xrqsqJiWioJ////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////8AAP////////////////////////////////////////3///r//v7//////////v///+rs + 7LS5uLKvqo5mTodFJIlEI3s/HWw4HmNDMmZiWHR6d729vv/9/////////f7//f3//v7+/vX29ujr6+Ll + 5cjNzKSpqKarqqitrKitrKesq6itrKitrKeqqby+vvf5+f////////////////////////////////// + //////////////////////////////////////////////////////////7+/vT09Ofn5+Xl5eDg4Nzc + 3NbW1tDQ0MnJycLCwru7u7GysqqtraWnp6epqa6wsLy+vs/Pz93d3ff39/////////////////////// + //////////////////////////7+/v////////////////////////////////////////////////// + /////////////v///6qmpCsmJaeko/////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////wAA//////////////////////// + /////////////////v///f///v7///7//v/+////4+nmsrq1sK6oiGRNhEcnhkMkeTwfajchYUQ0ZmRc + dXt6v8LD/v///////////////v//////9Pb25+rq4+bmx8zLo6inpaqpp6yrqK2sqK2sqK2sp62spqmo + wMLC+vz8//////////////////////////////////////////////////////////////////////// + ////////////////////////9PT06Ojo5eXl4eHh3d3d1tbWz8/PycnJwcHBurq6sLKyqaurpKampqio + rrCwvb+/0dHR4eHh+Pj4//////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////op+dKyYlq6in//////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////AAD////////////////////////////////////////////+/////v///v/9//7+ + ///e5eGvtrOxsKqcgm18TDF2PydqOCJiOCZjSz9mZF92fHzAxMb8///8/////v///f///v///v709fXo + 6urk5ubGy8qjqKemq6qnrKuorayorayorayoraynqanCxMT7/f3///////////////////////////// + ///////////////////////////////////////////////////////////////////z8/Po6Ojk5OTg + 4ODc3NzV1dXPz8/JycnCwsK7u7uwsrKpq6ukp6akqaissbC9v7/S0dLh4eH4+Pj///////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////+bmJYsKCa0srH///////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////8AAP////////////////// + //////////////////////////7////+//7+//v//f7//9zj4auysq6trraomp2Bb39dTnNURW5VSmlb + VmVkY3d7fMXIyf7///z////+///9///+//7+/vL08+jq6uPl5cTJyKGmpaesq6itrKitrKesq6itrKmu + raapqcfIyP3///////////////////////////////////////////////////////////////////// + //////////////////////////7+/vLy8ufn5+Tk5N/f39vb29bU1M7OzsnJycHCwrq7u7CysqirqqOm + pqWqqayysbzAv9LS0uLi4vn5+f////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////5WRjy4pKLi2tP// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////wAA/////////////////////////////////////////////v////7//v7+ + /P/9////2dzcqK2xp6mxrKulpZ+VkYeDfnZvdG1oamdnZWdqe3uAzs3Q/////v/+//7+/v7+/f///v7+ + 8vPz6Orq4+bmwsfGoaalp6yrqK2sqK2sqK2sqa6tqa6tpqmpy83N//////////////////////////// + /////////////////////////////////////////////////////////////////////v7+8vLy5ubm + 4+Pj39/f29ra1tTUzs7OyMjIwMHBt7q6r7GxqKuqoqempaqprLKxvcDA09PT4+Pj+fn5//////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////kIuJLiopuri2//////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////AAD///////////// + ///////////////////////////////9//7+/v///v78/vz////c3d2foaeVmaOJkpB4gH5kaW1RWFhI + S0xNUFRcX2Ryb3bOyc3///////3//vz9/v37//78/v7x8vLo6urj5ubBxsWhpqWnrKuorayorayprq2p + rq2qr66mqanN0ND////+/v7///////////////////////////////////////////////////////// + ///////////////////////////////+/v7x8fHm5ubj4+Pe3t7a2trU09PMzMzGxsa+v761t7eur7Cl + qqmhp6akqaissbC8wL/S09Pj4+P5+fn///////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////+LhoQwLCvB + vr3///////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////8AAP////////////////////////////////////////////////// + //7///3//v////Dy8rC0tpygpJGYmISLjXV7f2Zqa1hcXFdZW2VmaomJjePi5f///////v///////v7/ + /v3+/vHz8+nr6+Tm5r/Ew6Knpqesq6itrKitrKmuraqvrqqvrqeqqtLU1P////7+/v////////////// + //////////////////////////////////////////////////////////////////////////////Hw + 8Obm5uDi4tze3tfZ2NLU1czP0MXIycPFyLzAwre6vbO2ua6ytK2xsrG1trzAwNHT0+Lj4/n6+v////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////4WAfzItLMjFxf////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////////wAA//////// + /////////////////////////////////////////////v///f//////4ublrrOyqq6uoaanlZqdgYaJ + cHJzYWNkXmBhZmhpk5WW7O/w///////////////+///+/v7+8fPz6evr5ObmvsPCoqemp6yrqK2sqa6t + qa6tqq+uqq+uqayr1tjY/////v7+//////////////////////////////////////////////////// + ////////////////////////////////////////7u7u5eXl3uHh2tzcztDQxMfIwsfIvsPEwMTHwsbJ + wcfJw8jLyMrNxsvMxcnKx8vL09XV4+Xl9/j4//////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////////gHt6 + NTAvzMfI/////v7+//////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////AAD///////////////////////////////////////////// + ///////+///9///////f4+KssbCorK6hpqiSl5p/hIZwc3RhZGVbXl9sbm+OkJHl6Oj///////////// + //7///7+/v7x8vLp6+vk5ua7wL+ip6aorayprq2prq2qr66qr66qsK+qra3b3d3///////////////// + ///////////////////////////////////////////////////////////////////////////////+ + /v7u7u7k5OTe4ODb3dzBxMStsbKzuLm2vLy2vL22u763vcC2vb+5vr+8wcK/xcbDx8jMz87d39/4+fn/ + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////+CfXszLi3JxcX///////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////8AAP// + //////////////////////////////////////////////////7///z//////+Pn562ysqisrKOoqpKX + moGGiG1xcl9kZF9jZG9xcpudnvLy8////////////////v///v7+/vHy8unr6+Tm5rq/vqOop6itrKmu + ramuraqvrquwr6qvrqyurt/g4f////////////////////////////////////////////////////// + //////////////////////////////////////////7+/vDw8OPj497e3tzc27m7vJqfoKGmp6qwsbG4 + uLK6vba9wbK6vKy0tKmxsamxsa2zs7W4tsrMzPn6+v////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /4N+fTEtK8fDw/////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////wAA//////////////////////////////////////// + /////////////////f7+////5ejprbGyqq6upamrkZeafYKGam9wXWBhXmFicHN0qaus+/z8//////// + /////////////v7+8PLy6uzs5ObmuL28o6inqa6tqa6tqq+uq7Cvq7Cvqq+urrGx4+Xl//////////// + //////////////////////////////////////////////////////////////////////////////// + ////////9vb25OTk3t7e2tratbe4j5SVkJSVlJmamp+gpKmtq7K2rbO2r7W1sLa3rrS1rLGxqKyry83N + +/z8//////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////gHt6My4tzMjH/////v7+//////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + AAD////////////////////////////////////////////////////////+/v7////s7u+xtLWqrrGp + rrGXnaGCiYxudHZeYmNdYmN1enu4urr////////////////////////+/v7w8vLq7Ozk5ua2u7qkqaip + rq2qr66rsK+rsK+rsK+qr66xtLTn6en////+//////////////////////////////////////////// + ///////////////////////////////////////////////////4+Pjj4+Pb29vX19e1traRlJSKjo6J + jY6Sl5ian6Geo6Wfo6WkqKqrsLGxtra2ubq2uLjm6Oj////////+/v7+/v7///////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////99eHc0Ly7Qy8v////+/v7///////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////8AAP////////////////////////////////// + //////////////////////7+/v////Lz87m8vrC0uK2zt56kqYiOk3N4emJoaGdsbYGFhsnKyv////// + //////////////////39/fDy8uvt7eXn57W6uaWqqamuramuramuraqvrqyxsKqvrrK0tOnr6/////// + //////////////////////////////////////////////////////////////////////////////// + //////7+/v////b29uHh4djY2NbW1rKysouNjZKUlaGkpaOnqJ+jpJygoZufoJufoJicnaKmprK0s7m7 + u+nr6/////////////////////7+/v7+/v////7+/v////////////////7+/v7+/v////7+/v7+/v7+ + /v7+/v////////////////////////////////7+/v///////3t2dTQvLs/LzP////7+/v////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////wAA/////////////////////////////////////////////////////////v7+////+fr6wMTF + sra5r7S5nKOog4uPbnV4YGVna3BxjpKT4OLi/////////////////////////f398PHx7O7u5OfntLm4 + pKqorrOyq7Cvqq+uq7CvrLGwqa+usrW07e/v//////////////////////////////////////////// + /////////////////////////////////////v7+/v7+/////v7+////+Pj43t7e1tbW1dXVq6urmpqa + tra3ra+wn6GinqChmZucmZucmJqbkpSVpaans7W1uLq6zdDQ2tvb4+Li7u7u+fn5//////////////// + /////////////v7+/v7+/v7+/v7+/v7+/f39/v7+//////////////////////////////////////// + /v7+////////eXNyNDAu0MvM/////v7+//////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////AAD///////////////////////////// + ///////////////////////////////////+///JzM6xtbiutLiboqeBio5udXhhZWduc3SkqKn1+Pj/ + ///////////////////////8/Pzw8fHt7+/k5uayt7amq6qeo6KZnp2lqqmrsK+rsK+prq20t7bx8/P/ + ///+/v7////////////////////////////////////////////////////////////////+///9/v79 + ///+///////////////z8/Pd3d3X1dXT0tK3t7e8vLy6urygoaKbnp+anZ6VmJmVmJmRlJWVmJqwsrO4 + ubm7vb3Dxsa+v7+9vb3BwcHKysrV1dXk5OTy8vL7+/v////////////////////////////+/v7///// + ///////+/v7////////////////////////////////+/v7///////93cnE1MTDRzc3////+/v7///// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////8AAP////////////////////////////////////////////////////////////////// + /9bZ27K2uq+1uZ2kqoKLkGtzd2FnaHl9fsHFxv3///////////////////////////v7+/Dx8e3v7+Pl + 5bC0s5+lpJ2ioZ+ko5idnKOop6yxsKmurba5ufX39/7///////////////////////////////////// + //////////////////////////////////7///z+/v3///7///7+/v////r6+uTk5NnZ2dXT09LPz8zM + zcTHx6irrJyfoJmdnpOXmJOXmJSYmY+UlZ2hora6ure5uby+vsnLy8HCwr28vLy8vLm5ubm5uby8vMPD + w8vLy9fW1uTk5PDw8Pj5+f39/f////////////////////////////////////////////////////// + //////7+/v///////3ZxcDYyMNPOzv////7+/v////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////wAA//////////////////////// + ////////////////////////////////////////////5ObouLzAtLm+oaeugouQaXJ1YmprjZKT3OHi + /v//////////////////////////+/v77/Hx7e/v4uTkrbKxo6moqK2ssLW0p6yrlpuaqK2sqq6uuby7 + +Pr6/v////////////////////////////////////////////////////////////////////////// + /f///P7+/f7+/f39/v7+6enp2dnZ2NjY09HR0tDQzc3NvcHAoaall5yclpqbk5eYkZeYj5SVkJWVqa6t + ub69s7e2wcPDy87OxcbGwMDAv7+/vb29u7u7vLy8vb29u7u7urq6vLy8wsLCzMzM1tbW4eHh7e3t9/b2 + /f39/////////////////////////////////////////////v7+////////c25tNjEw087O//////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////AAD////////////////////////////////////////////9///9///+//////// + ///////w8PLBxMW5vcCmrLCDiY5qcXRqcXOnq63w8/T///////////7///7///7+//79///6+vvv8PLu + 8fLg4uOrr7Ckqamprq+qr7Cus7San6ChpqWssbC9wL/5+vv+///////////////////////+///9//// + ///////////////////////////////////////////////+///+/v7////39vbc2trZ19fX1tbT0dHQ + zs7Hx8e3u7qboKCWm5yUmZqSl5iOlJWNkZKXmpuztba3uruytrbCx8bL0M/Hysq/wMC+wMC8vr68vb29 + vb29vb2+vr69vr68vr68vLy8u7u9u7u8urq/u7zBvb7GwsPU0dLl4eH29PT59/f08PHy7u/08fH49/f/ + //////////////////////9ybWs2MS7U0c/////////9///+//////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////8AAP////////////////// + //////////////////////////3///3///7///////////////j4+cnMzbq+wamusoSKj2ducXl+gcHG + yPv9/v/+/v///v///v///v///v7//v3//vr6+vDw8u/x8t7g4KqurqOoqKmurqqvr7C1tZ6jo6Gmpayy + sMPGxfv9/v7///////////////////////7///7///////////////////////////////////////// + //////////7+/v///////+7s7NrY2NnX19PR0c7MzMvJycLCwrO3t5menpSbm5CYmI+VlY2RkpCTlKSl + prm7vLO2t7S5ucTKycvQz8rOzcDEw72/v7u9vby9vb29vb29vb69vb2+vru9vb6+vr69vbu4uLawsa2o + qaeio6KdnqGcna+pqsfCw83IycfCw8fBwsrFxs/Nzd3b2+/u7vr6+v///////////3BraTUxLdXT0f// + //7+/v3///7///////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////wAA/////////////////////////////////////////////f///f///v// + //////////7//P3+1NjZtru+payvfoaKZWptiY2Q3eDi/////Pz9///////////+///+/v/+/v//+vr6 + 8PHx7/Hx3N/fqq+uo6mno6inq7Cvqq+ump+eqK2sq7CvxsnI/f///f///v7+//////////////////// + /////////////////////////////////////////////////////v7+////////5+bm2dfX19XVzcvL + x8XFw8HBvLy8sbS2l5ydkJiYjpaWjJSUi5GSlJeYsbS1ub2+q6+wuLy9yM3Myc7NzNHQxMjIvL6+u729 + vL29vr6+vr6+vb29vb29u729urq6u7q6srCwq6anpJ+gm5aXo56ftrGywr2+wby9wby8w7+/xsHCx8LD + xsTExMLCy8rJ19fX6+zr/f38////amZiNzQv2dbU/////////f///v////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////AAD///////////// + ///////////////////////////////9///+///////////////+/v7+///f5OW3vL6gqKt1foFhZ2qd + oaPy9vb////9/f3///////////7////+///+///6+vrv8PDv8fHb3d2nq6qjqKelqqmhpqWdn5+lp6ex + s7Orra3JzMz9///////+/v7///////////////////////////////////////////////////////// + ///////////////////////+/v7i4uLV1tbS0dHJx8fCwMC+vLy5ubmxtbaWnZ2MlJSMlZWLk5OLkZGc + oKG3u7y0uLmqr7C8wcLHzMvHzMvN0tHHy8u8vr67vb28vb2+vr69vb28vb29vb27u7u7u7uzsrKpqKif + nZ2XkpOln6C6tbbDvr/Cvb7Dvr7EwL/GwsHHw8LIxMPHxsXIxsXHx8XHyMbMzcvi4+H49/RjXls2My7X + 1dL////9/f3///////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////8AAP////////////////////////////////////////////3///7/ + //////////////7//////+nu7rq/wJ2mqHF5fGNna7a6vP3///7///7+/v7+/v////////////////// + //b4+O7w8PDy8tfZ2Zyenpeampmbm5yfn6Wnp62vr6+xsautrc7Q0P7////+/v7+/v7+/v////////// + //////////////////////////////////////////////////////////////////39/d/f39bW1tDQ + 0MTExLu6urm3uLa2trK3uZqho4uTlYqUlomSko+Ulaitrre7vKuvsLC0tcDFxcPIx8bLysvRz8jMzLy+ + vru9vbu9vbu8vLy8vLy8vLy8vLq6ura2tqinp56cnJaUlKSfoL24ucK8vcC7vMG8vcO/v8XBv8bCwcXC + wcbEw8fFxMjGxcrIx8vKyMjJx8zNy93b2XVxbTs3NdbU0/////7+/v7+/v////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////////wAA//////// + /////////////////////////////////////v///v///////////////f7+/v//7vLzvcLDnKSlcHd4 + am5wzdHS/////f///////v7+////////////////////9/n57vDw8PLy09XVkpSUhoeHh4mJjpCQn6Gh + qqysrrCwra+v0NLS/////////////v7+/////////////v7+//////////////////////////////// + /////////////////v7+/////////f7+4ODg1dbW0NDQwsLCt7e3tLSztLW2s7e7oaerjJSXipOWh5GS + l52fsre4s7e5pqustbq7wcbGwcbFxMnIytDOx8zLvL++u729u729ury8vLy8vLy8u7u7ubi4rKyspKKi + mJaWnpycubW1wLu8vLm5wby9wr2+wr6+xcHAxcHAxcLBxsTDyMbFycfGysjHy8nHy8rJysvK0tLQwb67 + e3h329jX/////f39/v7+//////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////AAD///////////////////////////////////////////// + ///////////////////9/v7+///z9vfAxseZn59pb29xc3Ti4+T////8/v3+/v7////////+/v7+/v7/ + ///////2+Pjt7+/x8/PNz8+Ji4uFh4eZm5uqrKyusLCtr6+wsrKvsbG4urrT1dXs7u79///////////+ + /v7////+/v7+/v7+/v7+/v7+/v7+/v7////////////////////////////////+/v7////////l5+fT + 1tbR09PGxsazs7Oura2wsbG0t7qvtbiQmJqJkZSKkpWlqq22u76qr7Knra66wcK9xMTAxsXDyMfIzczF + ysm6wL66vb26vLy6vLy8vLy8vLy7urqzsbGopqabmZmZl5exr6+8urq8urq9u7vAu7zCvb7Dvr7EwL/D + wcDFw8LGxMPGxMPHxcTJx8bLycjLycjMzMrNzcvS0dDOzMvu7Oz////+/v7///////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////8AAP// + ///////////////////////////////////////////+//////////////////////3+/vX4+MLGxqCl + pnF1d4CBgu7t7/////7+/v7+/v////////7+/v////////7///T29u/x8fHz88XHx4uNjamrq6+xsa6w + sK2ysa2xsKyxsK6wsKytra2vr7W3t8vNzefp6fj6+v////////////7+/v39/f39/f////////7+/v// + ///////////////////////////+/v7///7//+3u79TV1tXX18jJybOzs6WlpaioqK6wsba7vJ6lpomQ + k5Scn7C1uLS5vKasr660t7rBxLi/wL7Ew8PIx8fMy8PIx7q/vrq8vLq8vLq8vLq8vLq7u7i3t62rq6Oh + oZORkaimprm3t7q4uLu6ur27u8C7vMK9vsK+vsLAv8PBwMTCwcXDwsfFw8fFxMnHxsvJyMvJyM3Lys/N + zNDNzNPR0ePi4v39/f/////+///+//////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////wAA//////////////////////////////////////// + //////7//////////////////v7+/////Pz8x8rJcHNzVFdYmJeZ+vn7/////////v7+/v7+//////// + //////7//v//9ff38PLy7/HxwcPCsLKytri3rK+vrLGwrLKwq7Gwqq+trbGwsLSzq6+uq6+uqa2srrKx + wsXF3d/f8vPz/v///////////f39/////////v7+/////////////////////////////////f7+/P7+ + 9vr51NjX09bWycvLuLm5oKCgnp2epqeosLO0sLS2lJqcn6aptLm8rLG0qa6yuL7Ctb7BuL/BvcLCwsfG + yM3MwMXEub69u769vL6+u729u729uLq6tbW1qaamm5mZmpiYuLa2uri4vLq6u7m5vLq6wLu8wby9wr6/ + wsDAw8HBxMLCxcPDxsTEx8XFyMbGysjIysjIzMrKzczLzs7Nz87Ozs7O7Ozs//////7///////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + AAD//////////////////////////////////////////////v/////////////////////+/v7////l + 5+dGR0cRERKXlpj////////+/v7+/v7////+/v7////+/v7////5+Prt7/Dw8vPs7u7S1NXGx8itr7Cs + sLCssbCqsK+rsbCssrKtsrGtsrGts7KtsrGts7GrsK+qrq2vsrK8vr7T1dXq6+v7+/v//////////v7+ + /v7+/v7////////////////////////////8/f37/v77///h5+XO09HP0tHAwsKnp6eWlZadnJ6pq6yz + uLmwtre1u76/xMezt7uzt7y8wsi0vcK4wcO9xMPDyMfFysm8wcC5vr28vr69v7+8vr67vb24urqxsbGm + oqKYlJStqqq7urq7ubm7ubm7ubm8urq/urvBvL3Cvr/CwMDCwMDEwsLFw8PGxMTHxcXIxsbKyMjKyMjM + ysrMy8rNzs3Ozs3Nzc3W1tf29ff///////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////8AAP////////////////////////////////// + ///////////+///////////////////////+/v/////+/3d3eAkICoKBgv////////7+/v7+/v7+/v39 + /f////79/v79/uPk5dze3/L09ers7eLk5cHDxKqtrquwsa2xsquwsaqwsauxsrC2ta+0s62ysauysaux + sK6zsq2ysayxsK2wsK+ysra4uMjIyOPj4/n5+f////////7+/v/////////////////////+/v////7/ + //z///z///X7+dXa2c7T0srNzba3t5ybm46MjJiZmqerrLW6u7vBxL/FycHGy77DyLa9xLO8xLe/w8DH + xsnOzcHGxbvAv7vAv7y+vry+vru9vbq8vLa4uK+vr5+cnJqVlrWys7e2trq4uLq4uLu5uby6ur+6u8G8 + vcK+v8LAwMLAwMTCwsXDw8bExMbExMjGxsnHx8rIyMvJyczKysvMzM/Pz8/Qz87NzuXk5v7+/v////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////wAA//////////////////////////////////////////////////////////////////////// + ////////paSlFBQUW1lZ9/f2/////////v7+/v7+/////v7+/v//+/z9y87P0tXW8vb36u7v4uXmur6/ + q7Cwq7CvrbKxrLGwr7SzoKSkkpWVqKurrrCwsLS0sLOzrrKyrrOyrbKxr7OysLSzr7SyrrGxsLKyw8XF + 293d8PLy/v7+//////////7+//////7+//7+/////////v///f//////7O7u0tXU0dHRxMXFpKSjiIaF + jIyMkpWWoqmrsLm8tb/Dw8zQvMXJs7zBtr/Ev8fKyc7OyM3Mu8C/ur6+vL6+u729vb+/vr6+vLy8t7i4 + q6urmJiYmpmZtbS0uLa2u7i4u7m5u7m5vLq6vbu7v7u8wb2+wb+/wb+/w8HBxMLCxsTExsTEyMbGycfH + ysjIy8nJzcvLzszM0c/P0M/P0c/P2tnZ9/b2/////////v7+//////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////AAD///////////////////////////// + ///////////////////////////////////////+/v7////////MzMxEREMqKCfLycj////+/v7+/v7+ + /v7////+/v79///2+Pm9v8DR1dby9vfp7e7h5ea4vL2qr66rsK+rsK+tsrCwtbOTl5Z5e3uDhYWRk5Og + oqKsrq6ztravs7OutLOvtLOvtLOwtLOwtLOvsrKusLCusLC7vb3S09Pp6en7+/v////////+/v7+/v7/ + /////v7////8/v79/v77/f3m5+fW1tbIycmop6aSjo2VlJSgo6OXn6CKlJebpamwuL24v8S8xMi8xcjE + y8vDyMi8wcC6v766v725vby7vr69vr69vr27u7u1tbWmpqaXl5efn5+3t7e3t7e4tra6uLi7ubm8urq9 + u7u+u7zAvb7Bv7/Bv7/DwcHEwsLFw8PGxMTHxcXJx8fJx8fLycnNy8vOy8vQzs7Rz8/Rz8/S0NDo6Oj/ + ///+/v7////+/v7///////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////8AAP////////////////////////////////////////////////////////////////// + //7+/v39/f///+jo6ICAgCQiIX57ev////////39/f7+/v7+/v////3///P19ra4udfb3PT5+uzw8ePn + 6Lq+v6murq2ysauwr62ysbC1tJGVlHZ4eGxtbXt8fH1/f3+BgYSGhqiqqrW6ua+0s66ysq+0s7CysrO0 + tLK0tLK0tK6wsLCxsbm5ucjJyd3d3fP09P////////////7+/v3+/vz+/vv9/f3+/vz7++zs7MjIyKOh + oZWRkJiXl6OmppWdnYuUl42WmpigpaGnrKqwtK+3ure/wbvDwrzCwbrAv7vAwLvAv7u/v7u+vrq9vbm7 + u7K0tKSkpJWWlqKiori4uLe3t7e3t7q4uLu5uby7u768vL68vL+9vcG/v8G/v8PBwcTCwsXDw8XDw8fF + xcnHx8nHx8vJyczKys3Ly87MzNHPz9HPz8/NzdnY2Pr6+v////////7+/v////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////wAA//////////////////////// + /////////////////////////////////////////////v7+/f39/v7++/v7srGxQD49MjAv29nZ//// + /f39/////v7+/////f//9Pb3ury9wsbH8PT18/f46OztvsLDqq6urrOyrLGwrLGwsba1i5CPbGxsbm5u + dnd3eXx8b3Fxa21tlZeXm52dqqystLa2srS0s7W1sbOzsbOzs7W1srS0srS0sbOzsLKyrrCwvsDA2tzc + 8PDw+vv7/////v///f//+vz8/f7+/////v7+zMvLnpubi4iHgYB/oKOjqa+wpq6xpK2wqbG0qK+yo6qt + oKeqoamrpq6urLS0srm5tbq7uL2+usDBu7/AvMDBub2+sLS1oKOkk5WVoqSktba2t7e3ubm5ubm5ubm5 + u7u7vry8v729wL6+wL6+wb+/w8HBxMLCxMLCxcPDx8XFycfHycfHysjIy8nJzcvLz83N0M7O0c/P09HR + 0M/P7u7u/////v7+/////v7+//////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////AAD///////////////////////////////////////////////////////////// + ///////////////9/f3////b2tpcWlkbGRiMior////////9/f3//////////v/4+PrEx8izt7jl6ers + 8PHo7O3Lz9Cqr6+tsrCtsrGssbCvtbR5fX1nZ2eEg4Nvb292dnZzc3Ocnp6kpqZ2eHinqamkpqaanJyw + srKztbW2uLixs7OytLSytLSxtLSwtbSwtbSusrGusbG7vLzOz8/i5OT19/f+///9///8/f3//v7////d + 29udmpqMiYiNi4yqra2nrK2krKylrbCmrbGwtbiyt7mvtbautLWosLCjq6ukq6yiqqqgqKihp6ejqKmn + rK2qr7Cprq+foqOTlJSlp6e0tra1t7e3uLi5ubm6urq7u7u8vLy9vb2+vr7Avr7Bv7/DwcHEwsLFw8PF + w8PHxcXJx8fJx8fKyMjLycnMysrOzMzQzs7S0NDT0dHPz8/h4uL+/v7////+/v7+/v7///////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////8AAP////////////////// + //////////////////////////////////////////////7+/v7+/v7+/v7+/v////z7+4uJiBgWFUA+ + Pt3b2/////7+/v////7+/v/+//z7/c3P0MbKy/H19vH19u7y89XZ2q+0tKuwr6yxsKuwr6+0s3+Dg3p8 + fJCRkWFiYnd3d2xuboCCgpydnX1+fq6vr5OUlISFhZeYmIGCgqOlpbW3t7e5ubO0tLK1tbC1tK+0s6+1 + tLK2trCysrCysrW3t8TGxtvd3fP19f7//////////9fW1pmWlpSQkJ+dna6xsauxsbW8vLS6vKyxs62x + s7K3uLS4ubK4ubG5ubG5ua20tauysqSrrJqgoI+UlYKHiH6DhH2Cg3R4eW9xcZudnbW3t7O2tra5ubm6 + urq5ubu7u7u8vL29vb6+vr++vsC/v8LBwcPCwsTDw8TDw8bFxcfGxsjHx8nIyMrJyczKys3Ly9DOztLQ + 0NHPz9HQ0NjZ2fn5+f////39/f7+/v////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////wAA//////////////////////////////////////////////////////// + /////////////////////////v7+////1tTTOjc2Dw0Ne3l5//7+/////v/+/f39/v3+//3/4uTlzdDR + 9/v88vb38fX25OjpuL29qq+urLGwrbKxrLGwqa2sq62tn6Gha21tcnR0dnl5p6ionJycg4ODtLS0i4uL + jo6OhoaGZGZmenx8enx8mZubtLa2s7a1sba1sba1sLa1sLSzs7W1s7W1srS0tLa2s7W1ury80NLS7u7u + /v7+ubi4i4mJk4+QmJiYr7Oysbe2tbq7uL29sLS1qq2utLe4sre3tbm6s7q6s7m5tLm6sba3r7S1qa6v + nqOkkJWWhouMeH1+WV1dPkBAioyMt7m5s7W1trm5uLm5ubq6urq6u7u7vb29vr6+vb29vr6+wcHBwcHB + w8PDw8PDxMTExcXFxsbGyMjIycnJzMrKzcvLz83N0c/P0tDQ0tLS0tPT8/Pz/////v7+/v7+//////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////AAD///////////// + ///////////////////////////////////////////////////////////////////+/v7///////+g + np0fHBwfHR2qqKj////////////9/P7+/f/z9PbN0NHs8PH2+vvw9PXs7/HM0dGssbCrsK+rsK+tsrGw + tLOxsrKvsbGmqKiRk5N2eHiEhoZ5enp+gICzs7OHh4eTkpJ9fX2QkJCSk5Npa2t7fX2Ljo6nqamsr6+t + srGvtLOxtbS0traztbW1t7eztbW1t7eztbWztbW7vb3Q0NCvsLCRkZGLiYmMi4utsLCxt7a1u7q4vr2z + t7aprKy2uLi1uLi1urq0ubq0uLm1ubq0uLmwtLWtsbKmqquXm5yLj5B7f4BfY2M8Pj6ChIS3ubmytLS2 + uLi5ubm6ubm6urq7u7u9vb29vr69vb2+vr7BwcHBwcHDw8PDw8PExMTFxcXGxsbIyMjJyMjMysrNy8vP + zc3Rz8/S0NDS0dHR0dHr6+v///////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////8AAP////////////////////////////////////////////////// + /////////////////////////////////////v////r6+Ht4eBUTEzAuLrOysv////////z8/f38/vz9 + /ePm59zg4fX5+vL29/Dz9eDl5bzBwKmurayxsK2ysauwr62xsKywr7G1tLK2tqirq5qcnH6AgHFzc4GC + gnBxcZOUlHl5eZycnI2Ojn5/f6SlpX+AgIWHh3p8fKmsrLW4t7S2trm5ubW3t7S2trO1tbS2tra4uLa4 + uLS2trW2tre4uLSzs6Wjo4uLi5+iorK3trO5uLq+vq2vrq2trbW2trW2tre6ura5ubW4uLO2tq6xsa2v + sKmsrZWYmHV4eFteXkJERDk6OjM1NXl7e7m6urW2tre3t7m5ubm5ubq6uru7u769vb69vb29vb6+vsHB + wcHBwcPDw8LCwsPDw8XFxcXFxcfHx8nIyMvJyczKys7MzNDOztHPz9HQ0NHR0eXl5f////7+/v////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////////wAA//////// + //////////////////////////////////////////////////////////////////////////////// + ///+////5OPiWVdXDw0NLy8vq6ys/////////v3//P3+8vX21NjZ5+vs9fn68vb37vPz2t/etbq5rLGw + qa6trLGwrLGwrbKxrrOyrbKxsbS0tLe3srS0pqiojI6Oamxsc3V1cHBwo6OjiIiIbW1th4eHc3R0ZGZm + lJaWtre3tba2ra6unZ2dtba2ubq6uLq6tri4tbe3ubu7t7m5t7m5t7i4urm5vr29tbW1rrGxs7i3r7Sz + qayspaamtLOzuLi4sbOzrrCwq62ssrOzu729wMLB0NHR3N3djY+PQ0VFQ0NCMzMzISIiGBoaYmNjvb29 + uLi4ubm5ubm5ubm5u7q6vLu7vr29v729vb29vr6+wcHBwcHBw8PDwsLCw8PDxcXFxcXFx8fHycjIy8nJ + zMrKzszM0M7O0c/P0NDQ0dLS4+Pj/////v7+//////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////AAD///////////////////////////////////////////// + /////////////////////////////////////////////v3//v3////e3NxbWVkSERElJSWLjIzq6en/ + ///////9///k5+jO0tPm6uv1+fr1+fnu8/LU2dizuLeoraytsrGvtLOtsrGtsrGvtLOvtLOws7KztbWz + tbW2uLirra2XmJiHh4enp6d+fn6Li4uWlpZycnJxcXGenp66ubm5uLigoKB6enqurq6cnZ2kpqa3ubm5 + u7u3ubm3ubm3ubm3ubm5urq5uLi7u7u5vLy4vby1urmsr6+oqamfn5+hoaGrrKy7vLzNzc3e3t7s7Oz2 + 9vb7+/v4+PilpaVVVVVWVlZbW1tUVVVBQ0NnaGi5ubm5ubm4uLi4uLi6urq8urq9u7u/vb2+vb29vb2+ + vr7BwcHBwcHDw8PCwsLDw8PExMTFxcXHx8fIx8fLycnMysrOzMzPzc3Rz8/R0dHQ0NDh4eH+/v7///// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////8AAP// + //////////////////////////////////////////////////////////////////////////////// + //////7+/v39/f7+/v///+Hg4G9tbR0cHBkWFlxYWbGtru7r7P///////+nq69DS0tnb2+nt7PP49/H2 + 9djf3bvBwKerqqyvrre5ubGzs7CysrCzsrK0tLK0tLK0tLK0tLO0tLW2trS0tLKyspCPj4B/f4iIiHt7 + e319fYODg7a2trq5uZeXl4KAgJSSknR0dH5+fqOjo6epqa2vr7q8vLm7u7i6uri7u7i7u7a7ure7uri7 + uri7u7y9vbe4uKmpqbi2tsrJydDPz9XV1dTU1NDQ0M3NzcnJycjIyL29vbKysrS0tLS0tK+wsJ2fn42P + j7S1tbm7u7W3t7e5ubi5ubq6uru7u769vb++vr6+vr+/v8DAwMHBwcLCwsLCwsPDw8XFxcXFxcfHx8fH + x8nIyMvLy8zMzM7Ozs/Pz8/Pz9DQ0ODg4P39/f7+/v////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////wAA//////////////////////////////////////// + //////////////////////////////////////////////////7+/v7+/f39/v7+////8fDwnJqaMi8v + FxITKSQlVVBRjoyMxsXF8e/v7+7u2NjYzc7O1djY4uTkzdLRnqOid3p6d3l5m52dv8DBvb+/sbOzsbOz + rrGxsLSzr7Oyr7OysrW0s7S0srOzsrOzrK2tnp+ffH19amtrlJWVuLm5ubu7j4+PgH9/gYCAnZyck5OT + hYWFeHh4dnd3np+frrCwubu7u729t7u7t7q6t7m5uLq6u7u7u7u7vb29vb29wL6+wb6+vby8urq6u7u7 + u7u7vLy8vLy8vb29wMDAwcHBwcHBvr6+t7i4pqiojI6Oq62tvb+/tbe3trm5uLm5urq6u7u7vr29v76+ + vr6+v7+/wMDAwcHBwsLCwsLCw8PDxcXFxsbGx8fHx8fHycnJysrKy8vLzc3Nzs7Oz8/P0NDQ39/f/f39 + /////v7+//////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + AAD///////////////////////////////////////////////////////////////////////////// + ///////////+///+/v78/Pz9/f39/Pz////////OzMxxbG04NDUdGRkZFxcrKSlHRUVoZmZ6eXl/f391 + dXVoaGhaWlpNTk5CQ0M7PT04OjpZW1ugoqLExsbCxcW1uLersK+us7KvtbOusrGytLSztbWxs7O0tra0 + trausLCkpqaxs7O1t7eipaVzdHSBgYGDg4Ourq6bm5t3d3d5eXmXl5eDgoJtbm6goqKsrq63uLi6vLy3 + ubm7vLy6urq9vb27u7u8vLy9u7u/vb2+vLy8vLy8vLy9vb2+vr6+vr69vb29vb2+vr69vb28vLy4ubmq + rKyRk5OWmJi+wMC2uLi1uLi3uLi6urq7u7u+vb2/vb2+vr6/v7/AwMDBwcHCwsLCwsLDw8PFxcXGxsbH + x8fIyMjJycnKysrLy8vMzMzOzs7Pz8/Q0NDf39/9/f3////+/v7///////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////8AAP////////////////////////////////// + //////////////////////////////////////////////////7///z+/vv8/P79/f////z8/P7+/v// + //////v6+s3Ly5KQkF9dXT89PSclJSAeHh8dHSEfHyIgICQiIiYkJCknJyopKSstLSkrKycpKUNFRXZ4 + eKSop8fMy8nOzbvAv660s6yysbGzs7K0tLGzs7Gzs7O1tbW3t7a3t7S2trS2tp6goHFzc3l4eHp6eqKi + ooqKinFxcYaGhry8vIeHh46OjqCgoHV1dYeHh7i4uMDAwL+/v76+vry8vL29vby8vLu7u76+vr6+vr29 + vby8vL6+vr+/v76+vr29vb6+vr6+vr+/v729vbu8vLCysp6goIaIiLO2tbi9vLS3tra4uLi6uru7u769 + vb+9vb+/v7+/v8DAwMHBwcLCwsLCwsPDw8XFxcbGxsfHx8jIyMnJycnJycvLy8vLy87Ozs/Pz8/Pz+Pj + 4/7+/v////7+/v////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////wAA//////////////////////////////////////////////////////////////////////// + /////////////////P7+/P7+/f7+/v7+/v7+/f39/v7+////////////////7+3t0tHRtbOznJqai4mJ + f3x8d3V1cW9vcWxteXR1f3x9gICBfXx+Z2dpVlhZUlRUV1tcen5/pKipw8jI0dbXxMnKsLW0rbGxsLSz + sLW0sba1sba1sbW0sLS0sra1sba1q66uo6Skk5WVdHV1eHh4goKCi4uLt7a2fHp6jIqKnZubhIKChYSE + pKKiqqiojIqKs7Gxv76+vr6+vb29vLy8vb29vr6+vr6+vr6+vr6+vb29vr6+vb29vr6+v7+/v7+/vb29 + vLy8tri4qaqri4+Om5+eu8C/s7i3tbi4uLq6u7u7vb29vb29v7+/v7+/wMDAwcHBwsLCwsLCw8PDxcXF + xsbGx8fHyMjIycnJycnJy8vLy8vLzc3Nz8/P0NDQ6Ojo//////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////AAD///////////////////////////// + ///////////////////////////////////////////////////////////9///9///+/v7////+/v7/ + ///+/v7+/v7+/v7//////////////////////////////////////////P3//v7////////9+/3h4eKw + srOHiYpucXJiZmdgZGVqb3CYnZ7Cx8jU2djHzMu2u7qwtbSvtLOvtbSxtrWzuLewtbSxtrWzt7e3ubm3 + urqgoqKpqamUlJSUlJSysbF7enqQjo6PjY2XlZWjoaGFg4OCgIB6eHiQjY2/vr6+vr68vLy+vr6+vr6+ + vr69vb2/v7++vr6+vr6+vr6+vr6+vr6/v7++vr6+vr6+vr67vLyvsbGZnJyMkZC1urm3vLu1ubm4ubm7 + u7u8vLy9vb2/v7+/v7/AwMDBwcHBwcHCwsLDw8PFxcXGxsbHx8fIyMjIyMjJycnKysrLy8vNzc3Pz8/P + z8/s7Oz///////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////8AAP////////////////////////////////////////////////////////////////// + //////////////////////3///7///////////////////////////////////////z+/vz+/v3///7/ + //////////////////////////////////////////z+/+Tm5sDExJyfoH6Cgmlubl1iY2lubomOjamu + rb/Ew8jMzL3CwbK3tq2ysrC1tLO4t7O4t7O3t7S2tre5ubm8u7u9va6urrGxsa6urnp6ep6cnI+NjZWU + lJqYmHd1dYeFha2srIaEhLOzs8DAwL29vb6+vr6+vr+/v7+/v7+/v7+/v7+/v7+/v76+vr+/v7+/v7+/ + v7+/v7+/v76+vra4uKapqYuRj6KnprzBwLe7ure5ubu8vL29vb29vb+/v7+/v8DAwMHBwcHBwcLCwsTE + xMXFxcbGxsfHx8jIyMnJycrKysrKysvLy87Ozs3NzdTU1Pf39/////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////wAA//////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////P///P///f///f///f///f///f///////////////////v7+/v7/ + /v7+/////////v//8vT01tnZsre2jJGQbnNzX2NkXGBhaGxtvsLD7fHy19vcw8fItLi5r7O0sLS2s7e3 + s7i3tbq5tLi3tri4t7q6uru7uLi4paWln5+fiIiId3Z2e3l5h4WFjoyMs7KygoKCsbGxwcHBvLy8vr6+ + vr6+vr6+v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/vr6+vr+/u7y8sbW0mJ2cipCPtbu6uL28 + tru6ubu7vL29v7+/v7+/v7+/wMDAwcHBwsLCwsLCxMTExsbGxsbGx8fHyMjIysrKy8vLysrKy8vLzs7O + zc3N3t7e/v7+/v7+/v7+//////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////AAD///////////////////////////////////////////////////////////// + ///////////////////////////////////////////////////////////////////////9///9///9 + ///9///+///+///+///////////////////////9/f3////+/v7+/v7////////////8/v7q7e3Kzc2e + oqN4fH5fY2SeoqPu8vP0+Pnv8/Ti5ufS19e/w8S2uru0ubixtrW1ubi2ubm2uLi3uLi4ubq8vb28vr6v + sbGYmZmgn5+qqqqHhoaVlZWBgYG5ubm/v7+8vLy+vr69vr69vr6/v7+/v7+/v7+/v7+/v7+/v7+/v7+/ + v7+/v7+/v7+/v7/Av7++vr66vb2tsrGLkZCWnJu/xMO4vLu5u7u8vb2/v7+/v7+/v7/BwcHBwcHCwsLC + wsLExMTGxsbGxsbHx8fIyMjKysrKysrJycnMzMzOzs7Pz8/s7Oz////////////+/v7///////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////8AAP////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////7///7///7///7///////////////////////////////7+ + /v////////7+/v////7+/v/+/v////////////////T4+djc3q+ytYuPkY+SlbG1t9XZ2+Pn6c7R1Lm9 + v8TIycjNy8DFxLS6ubG3tba5uLa5uba5uba5ube6uru9vb2/v8C/v76+vpSVlXR0dJqamsDAwL6+vr29 + vb6+vr2+vr6/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v8DAwMLAwL+/v73AwLW5uKSrqYaM + i6arqsDEw7u9vb29vb6+vr+/v7+/v8HBwcHBwcLCwsPDw8TExMbGxsbGxsfHx8nJycrKysrKysnJycvL + y87OztnZ2fr6+v////7+/v7+/v////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////wAA//////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////7/ + //7///7///7///7///7///7///7///7///7///7//////////////////v7+/v7+/////v7+//////// + /v///v///f//+Pr94+XovL/CnJ6ijI+SgoWIY2dpRUhLWl5fhomJur291NfWy87OuLy7s7i3s7i2t7m5 + t7m5t7m5ubq6vLy8vLy8urq6r6+vurq6vr6+vb29vr6+vr6+vr6+wMDAv7+/v7+/v7+/v7+/v7+/v7+/ + v7+/v7+/v7+/v7+/v7+/wL6+v7+/vr+/ub69tbq5n6WkipCPr7OzwcTDu7y8vb6+v7+/v7+/wcHBwcHB + wsLCw8PDxMTExsbGxsbGx8fHycjIysrKysrKycnJzc3N0NDQ6+vr/////v7+/v7+/////v7+//////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////AAD///////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////////////////9/v79/v/////////////19vfV19eqrKx8 + fn9VV1gzNTUpJyc0MzNsbGy4ubna2tvP0dG7vb22uLi0ubi1urm3u7q6u7u5u7u8vr69v7+7vb27vb27 + vb28vr6+vr6+vr6/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7/AwMC/v7+/v7+/v7+/v7+9vr68vr67 + v761u7qfpKOPk5W4vb3EyMm7v7+9vr7AwMDBwcHDw8PFw8PGxMTHxcXIxsbJx8fJx8fKyMjKysrLy8vK + ysrLy8vd3d38/Pz///////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////8AAP////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////7+/v////////7+/v////////////7//+jq6r/BwYyNjVlXVzIvLxMSEh4fH2RkZLGystjZ + 2dHT08THx7u+vra5ubi6urm7u7m7u7u9vbq8vLu9vbq8vLy9vb+/v76+vr6+vr+/v7+/v7+/v7+/v7+/ + v7+/v7+/v8DAwMDAwL+/v7+/v8DAwMDAwL6/v72+vr2/v7q+vbe8u5+kpJKXmLW6u8TJyr7Dwr7BwcDB + wcLDw8TExMbExMbFxcfGxsnIyMnIyMrJycrKysrKys3NzdbW1vX19f////7+/v////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////////wAA//////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////////////////////v7+/v7+/v7+ + /v//////////8/X10dDQmJaWXFtbJCUlDg4OLCwscXJyra6uxsfHzs/Pz9HRv8DAt7m5t7m5uby8uby7 + u76+u729u729vb6+vr6+v7+/vr6+v7+/v7+/v7+/v7+/v7+/v7+/wMDAwMDAwMDAv7+/wMDAwMDAv8DA + vb+/vb+/u8C/ub69ub69pquslpudsbe3xcvKwsjGvMHAv8PCwcTDwMLCxsfHxcXFx8jIx8fHycnJyMjI + yMjI2NjY8/Pz/////v7+/v7+//////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////AAD///////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////+/v7//v7////8/v78///////////7+/vj4+OxsbFUVFQV + FRUYGBg6OjpgYGCEhISlpaXb29vW2Ni/wcG3ubm3vLu2vby5vLy7vb27vb27vb29vr6+vr6+vr6+vr6+ + vr6+vr6/v7+/v7/AwMDAwMDAwMDAwMDAwMC+wMC+wMC+wMC+wMC7wL+7wL+6v766v76zuLimq6yqsrHC + ycjL0tHBxsW+w8LAxMTDx8fGyMjJy8vLzc3Ky8vMzMzg4OD29vb+/v7+/v7+/v7///////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////8AAP// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////7+ + /v////7+/v7+/v3+/v7///7+/v///////////+Xl5YWDgzAvLxkXFyUjIz89PUpJSZeXl+7u7unq6tTW + 1sXHx7vBwLe9u7e7u7i9vLm9vby9vb6+vr6+vr6+vr6+vr6+vr+/v7+/v8DAwMDAwMDAwMDAwMDAwL7A + wL7AwL7AwL7AwLy/v7zAv7vAv7vAv7zBwLm/v662tay0s8DHxs7U08vQz8vNzcrNzdHT08zOzr/BwcvM + zOvr6/v7+/////7+/v39/f////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////wAA//////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////v7+/////////////////////////////////v7+/////v7+/v7+//////// + ////////x8XFbGpqKykpHRsbJCIiMjIydXR0qaqq0NLS5OXl3uPi0tfWwsbFub28uLu7u7y8vb29vr6+ + vr6+vr6+vr6+vr6+vr6+vr6+vr6+v7+/v7+/vr6+vb6+vr+/vr+/vb+/vL6+u769ur69vMC/vcHAvMHA + usC/ur++t728vsLBz9LR29zczs/PjY6OYmNjbG1t1NXV/////////////////v7+//////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + AAD///////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////////////////////////z8fGwrq5YVlYmJCQWFhYgICAz + NDRUVVWBgoKwtLPU2Nfm6Ojh4uLS09PKzMzExMS/v7/AwMC9vb3AwMDCwsLDw8PGxsbJycnLy8vNzc3M + zMzMzMzMzMzLzMzJy8vKy8vLzc3LzMzHyMjCxMTGyMjO0dHV2Njd39/l5ubd3N2ysrJbWloaGho8Ozux + sbH9/f3///////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////8AAP////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////+/v////////Xz86alpVFRUSUlJRoaGhobGx4gICgqKkVHR3d6eqSkpLu7u8jIyMvL + y8nJycnJycfHx8TExMHBwcDAwLq6urOzs6ysrKqqqq2vrbS0tLu7u8HBwcfHx8jIyM7OzsfHx7a2tri4 + uMbGxtXV1czMzLa2tpqZmVpYWCQhIiUiImNhYczKyv////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////wAA//////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////v///v///////////////v7+/f39////////////////6+vr + qKiobm5uRUVFKysrHR4eFBQUFBUVHh0dLSsrOzo6SEZGUlFRW1lZWllZU1FRS0pKRUNDOzo6MS8vKScn + JSQkKikoLy4tNDMzODc3PTs7QD4+Q0FBREJCSEdHTkxMT01NSUdHNTQ0IR4eGBMUJB8gTUhJkIyN3tzc + //////////7+//////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////AAD///////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////////////////////////////////////////////+///+ + ///////////////+/v7+/v7+/v7+/v7+/v7////////////29vba2tqzs7OFhYVgYGBDQkItKyshHh4b + GBgZGBgZFxcXFRUbGBgaGBgbGRkeHBwlIiIvLS07ODg/PT09Ojk8Ojk5NzY1MzIzMTEvLS0vLS0uLCwq + KCgpJiYmJCQrKSk6ODhTT09zbm+moKHW0tP49vb////////+/v7//v7///////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////8AAP////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////7+/v7+/v7+/v7+/v7+/v7+ + /v/+/v7+/v////////////////f29ufm5tTS0sXBwrSwsJ+enpyamqWjo62rq7a0tMPBwcvJydPR0d3c + 3OPj4+bm5eXk4+Tj4uLi4eDg39/f397c3N3b29zb29nX19bU1NfV1dza2uTi4vTy8//8/f////////// + //////39/f39/f7+/v////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////////////////////////wAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + + + \ No newline at end of file diff --git a/SERemoteControl/LogWrittenEventArgs.cs b/SERemoteControl/LogWrittenEventArgs.cs new file mode 100644 index 0000000..1aeee51 --- /dev/null +++ b/SERemoteControl/LogWrittenEventArgs.cs @@ -0,0 +1,16 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace Client +{ + /// + /// Event argument passing logging text. + /// + public class LogWrittenEventArgs : EventArgs + { + public string Text { get; set; } + } + +} diff --git a/SERemoteControl/Program.cs b/SERemoteControl/Program.cs new file mode 100644 index 0000000..87c77d3 --- /dev/null +++ b/SERemoteControl/Program.cs @@ -0,0 +1,22 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using System.Windows.Forms; + +namespace SERemoteControl +{ + static class Program + { + /// + /// The main entry point for the application. + /// + [STAThread] + static void Main() + { + Application.EnableVisualStyles(); + Application.SetCompatibleTextRenderingDefault(false); + Application.Run(new FormMain()); + } + } +} diff --git a/SERemoteControl/Properties/AssemblyInfo.cs b/SERemoteControl/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..364269b --- /dev/null +++ b/SERemoteControl/Properties/AssemblyInfo.cs @@ -0,0 +1,37 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("SERemoteControl")] +[assembly: AssemblyDescription("SevenExcellence Remote Control\r\nSevenExcellence™ is the modular benchtop meter for precise analysis of pH, conductivity, dissolved oxygen and ions, and stands for unmatched compliance and efficiency. Automate your pH analysis with innovative remote control functionalities.\r\nSevenExcellence was built on Lance Platform")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("Mettler Toledo Gmbh")] +[assembly: AssemblyProduct("SERemoteControl")] +[assembly: AssemblyCopyright("Copyright © 2016")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("cc4759d9-332e-4d51-a4ec-bd004486aaf9")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("0.9.0.0")] +[assembly: AssemblyFileVersion("0.9.0.0")] +[assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net.config", Watch = true)] \ No newline at end of file diff --git a/SERemoteControl/Properties/Icon1.ico b/SERemoteControl/Properties/Icon1.ico new file mode 100644 index 0000000000000000000000000000000000000000..b0b060ba828a849a6738c004c606ebeec9dd492d GIT binary patch literal 91182 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 +// 此代码由工具生成。 +// 运行时版本:4.0.30319.42000 +// +// 对此文件的更改可能会导致不正确的行为,并且如果 +// 重新生成代码,这些更改将会丢失。 +// +//------------------------------------------------------------------------------ + +namespace SERemoteControl.Properties { + using System; + + + ///

+ /// 一个强类型的资源类,用于查找本地化的字符串等。 + /// + // 此类是由 StronglyTypedResourceBuilder + // 类通过类似于 ResGen 或 Visual Studio 的工具自动生成的。 + // 若要添加或移除成员,请编辑 .ResX 文件,然后重新运行 ResGen + // (以 /str 作为命令选项),或重新生成 VS 项目。 + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "17.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Resources { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Resources() { + } + + /// + /// 返回此类使用的缓存的 ResourceManager 实例。 + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager { + get { + if (object.ReferenceEquals(resourceMan, null)) { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("SERemoteControl.Properties.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// 重写当前线程的 CurrentUICulture 属性,对 + /// 使用此强类型资源类的所有资源查找执行重写。 + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture { + get { + return resourceCulture; + } + set { + resourceCulture = value; + } + } + + /// + /// 查找类似于 (图标) 的 System.Drawing.Icon 类型的本地化资源。 + /// + internal static System.Drawing.Icon Icon1 { + get { + object obj = ResourceManager.GetObject("Icon1", resourceCulture); + return ((System.Drawing.Icon)(obj)); + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap SevenExcellence { + get { + object obj = ResourceManager.GetObject("SevenExcellence", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + } +} diff --git a/SERemoteControl/Properties/Resources.resx b/SERemoteControl/Properties/Resources.resx new file mode 100644 index 0000000..e198790 --- /dev/null +++ b/SERemoteControl/Properties/Resources.resx @@ -0,0 +1,127 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + icon1.ico;System.Drawing.Icon, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\SevenExcellence.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + \ No newline at end of file diff --git a/SERemoteControl/Properties/Settings.Designer.cs b/SERemoteControl/Properties/Settings.Designer.cs new file mode 100644 index 0000000..a41cf94 --- /dev/null +++ b/SERemoteControl/Properties/Settings.Designer.cs @@ -0,0 +1,50 @@ +//------------------------------------------------------------------------------ +// +// 此代码由工具生成。 +// 运行时版本:4.0.30319.42000 +// +// 对此文件的更改可能会导致不正确的行为,并且如果 +// 重新生成代码,这些更改将会丢失。 +// +//------------------------------------------------------------------------------ + +namespace SERemoteControl.Properties { + + + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "17.5.0.0")] + internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase { + + private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); + + public static Settings Default { + get { + return defaultInstance; + } + } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("http://192.168.1.101:8088;")] + public string AddressHistory { + get { + return ((string)(this["AddressHistory"])); + } + set { + this["AddressHistory"] = value; + } + } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("")] + public string CurrentAddress { + get { + return ((string)(this["CurrentAddress"])); + } + set { + this["CurrentAddress"] = value; + } + } + } +} diff --git a/SERemoteControl/Properties/Settings.settings b/SERemoteControl/Properties/Settings.settings new file mode 100644 index 0000000..4206524 --- /dev/null +++ b/SERemoteControl/Properties/Settings.settings @@ -0,0 +1,12 @@ + + + + + + http://192.168.1.101:8088; + + + + + + \ No newline at end of file diff --git a/SERemoteControl/Properties/app.manifest b/SERemoteControl/Properties/app.manifest new file mode 100644 index 0000000..c7d2b13 --- /dev/null +++ b/SERemoteControl/Properties/app.manifest @@ -0,0 +1,73 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/SERemoteControl/SERemoteControl.csproj b/SERemoteControl/SERemoteControl.csproj new file mode 100644 index 0000000..0e453fb --- /dev/null +++ b/SERemoteControl/SERemoteControl.csproj @@ -0,0 +1,177 @@ + + + + + Debug + AnyCPU + {038E7505-59C6-4800-B91B-97A432233BF1} + WinExe + Properties + SERemoteControl + SERemoteControl + v4.8 + 512 + false + + \\Ch03sf003\mtpdk%24\publish\SERemoteControl\ + true + Unc + false + Foreground + 7 + Days + false + false + true + true + publish.htm + 2 + 1.0.0.%2a + false + true + true + + + AnyCPU + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + AnyCPU + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + 0267358EC216934A81E085AF36477DC499C5AE1B + + + SERemoteControl_TemporaryKey.pfx + + + false + + + false + + + LocalIntranet + + + Properties\app.manifest + + + + ..\packages\log4net.3.0.3-preview.1\lib\net462\log4net.dll + + + + + + + + + + + + + + + + + Form + + + AboutBox.cs + + + Form + + + FormMain.cs + + + + + + + AboutBox.cs + + + FormMain.cs + + + ResXFileCodeGenerator + Resources.Designer.cs + Designer + + + True + Resources.resx + True + + + + + SettingsSingleFileGenerator + Settings.Designer.cs + + + True + Settings.settings + True + + + + + + + + {5222f720-4e4f-4932-b01d-e4b8dbd8cc5f} + SEClient + + + + + + + + + + + + False + Microsoft .NET Framework 4.5 %28x86 and x64%29 + true + + + False + .NET Framework 3.5 SP1 Client Profile + false + + + False + .NET Framework 3.5 SP1 + false + + + + + + + + \ No newline at end of file diff --git a/SERemoteControl/SERemoteControl_TemporaryKey.pfx b/SERemoteControl/SERemoteControl_TemporaryKey.pfx new file mode 100644 index 0000000000000000000000000000000000000000..f544de38253f8ed8a97b7608cc408b1b32d9e21a GIT binary patch literal 1660 zcmY+Ddpy%!9LLWtezRy%l9XC5g<><8xs@nsVX?vrEsI)2a(SXqR!!()Qasj$8X1z5 zmAi>Y3XNnUxfEieP%4+6pI*;Xum1R+^ZC5b_j_LFkMkk2p)e!@MPx%p5LTD7l`}aX zfkC9PAuTi;S_NY@A{!8O8v`xrv z7FKo;)AKurVlM?P3MBhho!7{ywUlwmPsPa;R*yamZA$l+U9$g>1Tq^LGrbgqWqP^+f&PAo5tcA-l{jUm0zZdnN{>kw{n{kK}{dO z9&`Zy%6^KBhD({j>1zXPpi3Ckind)it)umvHJ^Iy&H~H+ zL*DHH4z?C&7JBXt)h{-;T`e4FCa`No#bnK%YN}V=1ln23v+K?tPt=co6H~iTBlB%z z`gq9mnq)hhGSLz4KJ#zOXMNq9N}g)xkdj@mvSfG{KEAAbPGY7|Yc`<5-3AAC6n$|H zYzyj}eU;(YP&IvAD}uLo!{LgW={Hk%pY%Sg2>04k@+NV45w$g9*@HXrsMHA!bp0l! zk+{0+_<%d+^%`YdhM^L#{A)H%sQ8>|XoRo0tJA7pRq!RWYv}VK;0O+aeIN)N2ElOc2O$6t zcEIZ#2>=IRw+YtaAP{DUVIKs%V9okDg$GVQ`~HHRH}C;La1t56UXOv`a5}-r0f_+c zX8ZdD@kd;txww|_&We07`jol2o@66c-kJLj;?zIQrgbasB*{MUh*RLO$4Xr6lKCOV ziMba3h`1aYgQq=!J@TDgle-|kE%!n|#(<+R%L|k7nEAlzovS0d!C(xz`+VNU#b(ZY zaSg4%;7Q~d$>)TMh}`o6p~`(em?%89T`#h(H$FO3hN+_|?GF7Gl~nZIUd0-v zM;I07&EoDWx(_S3KW$GS1SIrlQkbn1vrr!W+(@yA(wF~c9+!e+svob zKsB_khof`#@Gf0(pHM2^rt76Cn{vl7Z+oL$D2SL^UGG_$dgWO8!jpRM6RpOHOe3!5l4YXD>`-U%ni)US!b)-}_p0%Q zHyC`H8fD!4oo=aM2W=>)g)iRRs3Ora9=*@COg2X!DYRFAHSHr$v>>h|Vj!8dI22M9 zt#q3vAXm(P@{hiWex&Q?4ybU3^#!ezzc1Me|9-@Kh+yy9eF|q9V_y1j?qmH6Rj<(N literal 0 HcmV?d00001 diff --git a/SERemoteControl/Settings.cs b/SERemoteControl/Settings.cs new file mode 100644 index 0000000..c726d9d --- /dev/null +++ b/SERemoteControl/Settings.cs @@ -0,0 +1,28 @@ +namespace SERemoteControl.Properties { + + + // This class allows you to handle specific events on the settings class: + // The SettingChanging event is raised before a setting's value is changed. + // The PropertyChanged event is raised after a setting's value is changed. + // The SettingsLoaded event is raised after the setting values are loaded. + // The SettingsSaving event is raised before the setting values are saved. + internal sealed partial class Settings { + + public Settings() { + // // To add event handlers for saving and changing settings, uncomment the lines below: + // + // this.SettingChanging += this.SettingChangingEventHandler; + // + // this.SettingsSaving += this.SettingsSavingEventHandler; + // + } + + private void SettingChangingEventHandler(object sender, System.Configuration.SettingChangingEventArgs e) { + // Add code to handle the SettingChangingEvent event here. + } + + private void SettingsSavingEventHandler(object sender, System.ComponentModel.CancelEventArgs e) { + // Add code to handle the SettingsSaving event here. + } + } +} diff --git a/SERemoteControl/SevenExcellence.png b/SERemoteControl/SevenExcellence.png new file mode 100644 index 0000000000000000000000000000000000000000..61f49c2c2c551896be21ef4e16fcc0194e2ddcda GIT binary patch literal 93409 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

2#0kF$MfoNYtnR7w@b7$z%}YtNpU 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 A{r~^~ literal 0 HcmV?d00001 diff --git a/SERemoteControl/bin/Debug/SERemoteControl.exe.config b/SERemoteControl/bin/Debug/SERemoteControl.exe.config new file mode 100644 index 0000000..141774c --- /dev/null +++ b/SERemoteControl/bin/Debug/SERemoteControl.exe.config @@ -0,0 +1,21 @@ + + + + +

+ + + + + + + + + http://192.168.1.101:8088; + + + + + + + diff --git a/SERemoteControl/bin/Debug/log4net.xml b/SERemoteControl/bin/Debug/log4net.xml new file mode 100644 index 0000000..987015b --- /dev/null +++ b/SERemoteControl/bin/Debug/log4net.xml @@ -0,0 +1,28271 @@ + + + + log4net + + + + + Appender that logs to a database. + + + + appends logging events to a table within a + database. The appender can be configured to specify the connection + string by setting the property. + The connection type (provider) can be specified by setting the + property. For more information on database connection strings for + your specific database see http://www.connectionstrings.com/. + + + Records are written into the database either using a prepared + statement or a stored procedure. The property + is set to (System.Data.CommandType.Text) to specify a prepared statement + or to (System.Data.CommandType.StoredProcedure) to specify a stored + procedure. + + + The prepared statement text or the name of the stored procedure + must be set in the property. + + + The prepared statement or stored procedure can take a number + of parameters. Parameters are added using the + method. This adds a single to the + ordered list of parameters. The + type may be subclassed if required to provide database specific + functionality. The specifies + the parameter name, database type, size, and how the value should + be generated using a . + + + + An example of a SQL Server table that could be logged to: + + CREATE TABLE [dbo].[Log] ( + [ID] [int] IDENTITY (1, 1) NOT NULL , + [Date] [datetime] NOT NULL , + [Thread] [varchar] (255) NOT NULL , + [Level] [varchar] (20) NOT NULL , + [Logger] [varchar] (255) NOT NULL , + [Message] [varchar] (4000) NOT NULL + ) ON [PRIMARY] + + + + An example configuration to log to the above table: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Julian Biddle + Nicko Cadell + Gert Driesen + Lance Nehring + + + + Initializes a new instance of the class. + + + Public default constructor to initialize a new instance of this class. + + + + + Gets or sets the database connection string that is used to connect to + the database. + + + The database connection string used to connect to the database. + + + + The connections string is specific to the connection type. + See for more information. + + + Connection string for MS Access via ODBC: + "DSN=MS Access Database;UID=admin;PWD=;SystemDB=C:\data\System.mdw;SafeTransactions = 0;FIL=MS Access;DriverID = 25;DBQ=C:\data\train33.mdb" + + Another connection string for MS Access via ODBC: + "Driver={Microsoft Access Driver (*.mdb)};DBQ=C:\Work\cvs_root\log4net-1.2\access.mdb;UID=;PWD=;" + + Connection string for MS Access via OLE DB: + "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Work\cvs_root\log4net-1.2\access.mdb;User Id=;Password=;" + + + + + The appSettings key from App.Config that contains the connection string. + + + + + The connectionStrings key from App.Config that contains the connection string. + + + + + Gets or sets the type name of the connection + that should be created. + + + The type name of the connection. + + + + The type name of the ADO.NET provider to use. + + + The default is to use the OLE DB provider. + + + Use the OLE DB Provider. This is the default value. + System.Data.OleDb.OleDbConnection, System.Data, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + Use the MS SQL Server Provider. + System.Data.SqlClient.SqlConnection, System.Data, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + Use the ODBC Provider. + Microsoft.Data.Odbc.OdbcConnection,Microsoft.Data.Odbc,version=1.0.3300.0,publicKeyToken=b77a5c561934e089,culture=neutral + This is an optional package that you can download from + http://msdn.microsoft.com/downloads + search for ODBC .NET Data Provider. + + Use the Oracle Provider. + System.Data.OracleClient.OracleConnection, System.Data.OracleClient, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + This is an optional package that you can download from + http://msdn.microsoft.com/downloads + search for .NET Managed Provider for Oracle. + + + + + Gets or sets the command text that is used to insert logging events + into the database. + + + The command text used to insert logging events into the database. + + + + Either the text of the prepared statement or the + name of the stored procedure to execute to write into + the database. + + + The property determines if + this text is a prepared statement or a stored procedure. + + + If this property is not set, the command text is retrieved by invoking + . + + + + + + Gets or sets the command type to execute. + + + The command type to execute. + + + + This value may be either (System.Data.CommandType.Text) to specify + that the is a prepared statement to execute, + or (System.Data.CommandType.StoredProcedure) to specify that the + property is the name of a stored procedure + to execute. + + + The default value is (System.Data.CommandType.Text). + + + + + + Should transactions be used to insert logging events in the database. + + + true if transactions should be used to insert logging events in + the database, otherwise false. The default value is true. + + + + Gets or sets a value that indicates whether transactions should be used + to insert logging events in the database. + + + When set a single transaction will be used to insert the buffered events + into the database. Otherwise each event will be inserted without using + an explicit transaction. + + + + + + Gets or sets the used to call the NetSend method. + + + The used to call the NetSend method. + + + + Unless a specified here for this appender + the is queried for the + security context to use. The default behavior is to use the security context + of the current thread. + + + + + + Should this appender try to reconnect to the database on error. + + + true if the appender should try to reconnect to the database after an + error has occurred, otherwise false. The default value is false, + i.e. not to try to reconnect. + + + + The default behaviour is for the appender not to try to reconnect to the + database if an error occurs. Subsequent logging events are discarded. + + + To force the appender to attempt to reconnect to the database set this + property to true. + + + When the appender attempts to connect to the database there may be a + delay of up to the connection timeout specified in the connection string. + This delay will block the calling application's thread. + Until the connection can be reestablished this potential delay may occur multiple times. + + + + + + Gets or sets the underlying . + + + The underlying . + + + creates a to insert + logging events into a database. Classes deriving from + can use this property to get or set this . Use the + underlying returned from if + you require access beyond that which provides. + + + + + Initialize the appender based on the options set + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Override the parent method to close the database + + + + Closes the database command and database connection. + + + + + + Inserts the events into the database. + + The events to insert into the database. + + + Insert all the events specified in the + array into the database. + + + + + + Adds a parameter to the command. + + The parameter to add to the command. + + + Adds a parameter to the ordered list of command parameters. + + + + + + Writes the events to the database using the transaction specified. + + The transaction that the events will be executed under. + The array of events to insert into the database. + + + The transaction argument can be null if the appender has been + configured not to use transactions. See + property for more information. + + + + + + Prepare entire database command object to be executed. + + The command to prepare. + + + + Formats the log message into database statement text. + + The event being logged. + + This method can be overridden by subclasses to provide + more control over the format of the database statement. + + + Text that can be passed to a . + + + + + Creates an instance used to connect to the database. + + + This method is called whenever a new IDbConnection is needed (i.e. when a reconnect is necessary). + + The of the object. + The connectionString output from the ResolveConnectionString method. + An instance with a valid connection string. + + + + Resolves the connection string from the ConnectionString, ConnectionStringName, or AppSettingsKey + property. + + Additional information describing the connection string. + A connection string used to connect to the database. + + + + Retrieves the class type of the ADO.NET provider. + + + + Gets the Type of the ADO.NET provider to use to connect to the + database. This method resolves the type specified in the + property. + + + Subclasses can override this method to return a different type + if necessary. + + + The of the ADO.NET provider + + + + Connects to the database. + + + + + Cleanup the existing connection. + + + Calls the IDbConnection's method. + + + + + The list of objects. + + + + The list of objects. + + + + + + The fully qualified type of the AdoNetAppender class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Parameter type used by the . + + + + This class provides the basic database parameter properties + as defined by the interface. + + This type can be subclassed to provide database specific + functionality. The two methods that are called externally are + and . + + + + + + Initializes a new instance of the class. + + + Default constructor for the AdoNetAppenderParameter class. + + + + + Gets or sets the name of this parameter. + + + The name of this parameter. + + + + The name of this parameter. The parameter name + must match up to a named parameter to the SQL stored procedure + or prepared statement. + + + + + + Gets or sets the database type for this parameter. + + + The database type for this parameter. + + + + The database type for this parameter. This property should + be set to the database type from the + enumeration. See . + + + This property is optional. If not specified the ADO.NET provider + will attempt to infer the type from the value. + + + + + + + Gets or sets the precision for this parameter. + + + The precision for this parameter. + + + + The maximum number of digits used to represent the Value. + + + This property is optional. If not specified the ADO.NET provider + will attempt to infer the precision from the value. + + + + + + + Gets or sets the scale for this parameter. + + + The scale for this parameter. + + + + The number of decimal places to which Value is resolved. + + + This property is optional. If not specified the ADO.NET provider + will attempt to infer the scale from the value. + + + + + + + Gets or sets the size for this parameter. + + + The size for this parameter. + + + + The maximum size, in bytes, of the data within the column. + + + This property is optional. If not specified the ADO.NET provider + will attempt to infer the size from the value. + + + For BLOB data types like VARCHAR(max) it may be impossible to infer the value automatically, use -1 as the size in this case. + + + + + + + Gets or sets the to use to + render the logging event into an object for this + parameter. + + + The used to render the + logging event into an object for this parameter. + + + + The that renders the value for this + parameter. + + + The can be used to adapt + any into a + for use in the property. + + + + + + Prepare the specified database command object. + + The command to prepare. + + + Prepares the database command object by adding + this parameter to its collection of parameters. + + + + + + Renders the logging event and set the parameter value in the command. + + The command containing the parameter. + The event to be rendered. + + + Renders the logging event using this parameters layout + object. Sets the value of the parameter on the command object. + + + + + + The database type for this parameter. + + + + + Flag to infer type rather than use the DbType + + + + + Appends logging events to the terminal using ANSI color escape sequences. + + + + AnsiColorTerminalAppender appends log events to the standard output stream + or the error output stream using a layout specified by the + user. It also allows the color of a specific level of message to be set. + + + This appender expects the terminal to understand the VT100 control set + in order to interpret the color codes. If the terminal or console does not + understand the control codes the behavior is not defined. + + + By default, all output is written to the console's standard output stream. + The property can be set to direct the output to the + error stream. + + + NOTE: This appender writes each message to the System.Console.Out or + System.Console.Error that is set at the time the event is appended. + Therefore it is possible to programmatically redirect the output of this appender + (for example NUnit does this to capture program output). While this is the desired + behavior of this appender it may have security implications in your application. + + + When configuring the ANSI colored terminal appender, a mapping should be + specified to map a logging level to a color. For example: + + + + + + + + + + + + + + + The Level is the standard log4net logging level and ForeColor and BackColor can be any + of the following values: + + Blue + Green + Red + White + Yellow + Purple + Cyan + + These color values cannot be combined to make new colors. + + + The attributes can be any combination of the following: + + Brightforeground is brighter + Dimforeground is dimmer + Underscoremessage is underlined + Blinkforeground is blinking (does not work on all terminals) + Reverseforeground and background are reversed + Hiddenoutput is hidden + Strikethroughmessage has a line through it + + While any of these attributes may be combined not all combinations + work well together, for example setting both Bright and Dim attributes makes + no sense. + + + Patrick Wagstrom + Nicko Cadell + + + + The enum of possible display attributes that can be combined to form the ANSI color attributes. + + + + + + text is bright + + + + + text is dim + + + + + text is underlined + + + + + text is blinking + + + Not all terminals support this attribute + + + + + text and background colors are reversed + + + + + text is hidden + + + + + text is displayed with a strikethrough + + + + + text color is light + + + + + The enum of possible foreground or background color values for + use with the color mapping method + + + + + + color is black + + + + + color is red + + + + + color is green + + + + + color is yellow + + + + + color is blue + + + + + color is magenta + + + + + color is cyan + + + + + color is white + + + + + Initializes a new instance of the class. + + + The instance of the class is set up to write + to the standard output stream. + + + + + Gets the console output stream, one of "Console.Out" or "Console.Error". + + + + + Adds a mapping of level to foreground and background colors. + + The mapping to add + + + + Writes the event to the console. + + The event to log. + + + This method is called by the method. + + + The format of the output will depend on the appender layout. + + + + + + This appender requires a to be set. + + + + + Initializes the level to color mappings set on this appender. + + + + + The to use when writing to the Console + standard output stream. + + + + + The to use when writing to the Console + standard error output stream. + + + + + Flag to write output to the error stream rather than the standard output stream + + + + + Mapping from level object to color value + + + + + Ansi code to reset terminal + + + + + A class to act as a mapping between the level that a logging call is made at and + the color it should be displayed as. + + + + Defines the mapping between a level and the color it should be displayed in. + + + + + + The mapped foreground color for the specified level + + + + Required property. + The mapped foreground color for the specified level + + + + + + The mapped background color for the specified level. Required property. + + + + + The color attributes for the specified level. + + + + + Initializes the options for the object + + + + Combines the and together + and appends the attributes. + + + + + + The combined , and + suitable for setting the ansi terminal color. + + + + + A strongly-typed collection of objects. + + Nicko Cadell + + + + Supports type-safe iteration over a . + + + + + Creates a read-only wrapper for a instance. + + list to create a readonly wrapper around + + An wrapper that is read-only. + + + + + An empty readonly static AppenderCollection + + + + + Initializes a new instance of the class + that is empty and has the default initial capacity. + + + + + Initializes a new instance of the class + that has the specified initial capacity. + + + The number of elements that the new is initially capable of storing. + + + + + Initializes a new instance of the class + that contains elements copied from the specified . + + The whose elements are copied to the new collection. + + + + Initializes a new instance of the class + that contains elements copied from the specified array. + + The array whose elements are copied to the new list. + + + + Initializes a new instance of the class + that contains elements copied from the specified collection. + + The collection whose elements are copied to the new list. + + + + Type visible only to our subclasses + Used to access protected constructor + + + + + + A value + + + + + Allow subclasses to avoid our default constructors + + + + + + Gets the number of elements actually contained in the . + + + + + Copies the entire to a one-dimensional + array. + + The one-dimensional array to copy to. + + + + Copies the entire to a one-dimensional + array, starting at the specified index of the target array. + + The one-dimensional array to copy to. + The zero-based index in at which copying begins. + + + + Gets a value indicating whether access to the collection is synchronized (thread-safe). + + false, because the backing type is an array, which is never thread-safe. + + + + Gets an object that can be used to synchronize access to the collection. + + + + + Gets or sets the at the specified index. + + The zero-based index of the element to get or set. + + is less than zero + -or- + is equal to or greater than . + + + + + Adds a to the end of the . + + The to be added to the end of the . + The new + + + + Removes all elements from the . + + + + + Creates a shallow copy of the . + + A new with a shallow copy of the collection data. + + + + Determines whether a given is in the . + + The to check for. + if is found in the ; otherwise, . + + + + Returns the zero-based index of the first occurrence of a + in the . + + The to locate in the . + + The zero-based index of the first occurrence of + in the entire , if found; otherwise, -1. + + + + + Inserts an element into the at the specified index. + + The zero-based index at which should be inserted. + The to insert. + + is less than zero + -or- + is equal to or greater than . + + + + + Removes the first occurrence of a specific from the . + + The to remove from the . + True if the item was removed. + + The specified was not found in the . + + + + + Removes the element at the specified index of the . + + The zero-based index of the element to remove. + + is less than zero + -or- + is equal to or greater than . + + + + + Gets a value indicating whether the collection has a fixed size. + + true if the collection has a fixed size; otherwise, false. The default is false + + + + Gets a value indicating whether the IList is read-only. + + true if the collection is read-only; otherwise, false. The default is false + + + + Returns an enumerator that can iterate through the . + + An for the entire . + + + + Gets or sets the number of elements the can contain. + + + + + Adds the elements of another to the current . + + The whose elements should be added to the end of the current . + The new of the . + + + + Adds the elements of a array to the current . + + The array whose elements should be added to the end of the . + The new of the . + + + + Adds the elements of a collection to the current . + + The collection whose elements should be added to the end of the . + The new of the . + + + + Sets the capacity to the actual number of elements. + + + + + Return the collection elements as an array + + the array + + + + is less than zero + -or- + is equal to or greater than . + + + + + Supports simple iteration over a . + + + + + + Initializes a new instance of the class. + + + + + Gets the current element in the collection. + + + + + Advances the enumerator to the next element in the collection. + + + if the enumerator was successfully advanced to the next element; + if the enumerator has passed the end of the collection. + + + The collection was modified after the enumerator was created. + + + + + Sets the enumerator to its initial position, before the first element in the collection. + + + + + + + + Abstract base class implementation of . + + + + This class provides the code for common functionality, such + as support for threshold filtering and support for general filters. + + + Appenders can also implement the interface. Therefore + they would require that the method + be called after the appenders properties have been configured. + + + Nicko Cadell + Gert Driesen + + + + Default constructor + + + Empty default constructor + + + + + Finalizes this appender by calling the implementation's + method. + + + + If this appender has not been closed then the Finalize method + will call . + + + + + + Gets or sets the threshold of this appender. + Defaults to . + + + The threshold of the appender. + + + + All log events with lower level than the threshold level are ignored + by the appender. + + + In configuration files this option is specified by setting the + value of the option to a level + string, such as "DEBUG", "INFO" and so on. + + + + + + Gets or sets the for this appender. + + The of the appender + + + The provides a default + implementation for the property. + + + + + + The filter chain. + + The head of the filter chain. + + + Returns the head Filter. The Filters are organized in a linked list + and so all Filters on this Appender are available through the result. + + + + + + Gets or sets the for this appender. + + The layout of the appender. + + + See for more information. + + + + + + + Initialize the appender based on the options set + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Gets or sets the name that uniquely identifies this appender. + + + + + Closes the appender and releases resources. + + + + Release any resources allocated within the appender such as file handles, + network connections, etc. + + + It is a programming error to append to a closed appender. + + + This method cannot be overridden by subclasses. This method + delegates the closing of the appender to the + method which must be overridden in the subclass. + + + + + + Performs threshold checks and invokes filters before + delegating actual logging to the subclasses specific + method. + + The event to log. + + + This method cannot be overridden by derived classes. A + derived class should override the method + which is called by this method. + + + The implementation of this method is as follows: + + + + + + Checks that the severity of the + is greater than or equal to the of this + appender. + + + + Checks that the chain accepts the + . + + + + + Calls and checks that + it returns true. + + + + + If all of the above steps succeed then the + will be passed to the abstract method. + + + + + + Performs threshold checks and invokes filters before + delegating actual logging to the subclasses specific + method. + + The array of events to log. + + + This method cannot be overridden by derived classes. A + derived class should override the method + which is called by this method. + + + The implementation of this method is as follows: + + + + + + Checks that the severity of the + is greater than or equal to the of this + appender. + + + + Checks that the chain accepts the + . + + + + + Calls and checks that + it returns true. + + + + + If all of the above steps succeed then the + will be passed to the method. + + + + + + Test if the logging event should we output by this appender + + the event to test + true if the event should be output, false if the event should be ignored + + + This method checks the logging event against the threshold level set + on this appender and also against the filters specified on this + appender. + + + The implementation of this method is as follows: + + + + + + Checks that the severity of the + is greater than or equal to the of this + appender. + + + + Checks that the chain accepts the + . + + + + + + + + + Adds a filter to the end of the filter chain. + + the filter to add to this appender + + + The Filters are organized in a linked list. + + + Setting this property causes the new filter to be pushed onto the + back of the filter chain. + + + + + + Clears the filter list for this appender. + + + + Clears the filter list for this appender. + + + + + + Checks if the message level is below this appender's threshold. + + to test against. + + true if the meets the + requirements of this appender. A null level always maps to true, + the equivalent of . + + + + + Is called when the appender is closed. Derived classes should override + this method if resources need to be released. + + + + Releases any resources allocated within the appender such as file handles, + network connections, etc. + + + It is a programming error to append to a closed appender. + + + + + + Subclasses of should implement this method + to perform actual logging. + + The event to append. + + + A subclass must implement this method to perform + logging of the . + + This method will be called by + if all the conditions listed for that method are met. + + + To restrict the logging of events in the appender + override the method. + + + + + + Append a bulk array of logging events. + + the array of logging events + + + This base class implementation calls the + method for each element in the bulk array. + + + A subclass that can better process a bulk array of events should + override this method in addition to . + + + + + + Appends logging events. + + The logging events + + + This base class implementation calls the + method for each element in the bulk array. + + + A subclass that can better process a bulk array of events should + override this method in addition to . + + + + + + Called before as a precondition. + + + + This method is called by + before the call to the abstract method. + + + This method can be overridden in a subclass to extend the checks + made before the event is passed to the method. + + + A subclass should ensure that they delegate this call to + this base class if it is overridden. + + + true if the call to should proceed. + + + + Renders the to a string. + + The event to render. + The event rendered as a string. + + + Helper method to render a to + a string. This appender must have a + set to render the to + a string. + + If there is exception data in the logging event and + the layout does not process the exception, this method + will append the exception text to the rendered string. + + + Where possible use the alternative version of this method + . + That method streams the rendering onto an existing Writer + which can give better performance if the caller already has + a open and ready for writing. + + + + + + Renders the to a string. + + The event to render. + The TextWriter to write the formatted event to + + + Helper method to render a to + a string. This appender must have a + set to render the to + a string. + + If there is exception data in the logging event and + the layout does not process the exception, this method + will append the exception text to the rendered string. + + + Use this method in preference to + where possible. If, however, the caller needs to render the event + to a string then does + provide an efficient mechanism for doing so. + + + + + + Tests if this appender requires a to be set. + + + + In the rather exceptional case, where the appender + implementation admits a layout but can also work without it, + then the appender should return true. + + + This default implementation always returns false. + + + + true if the appender requires a layout object, otherwise false. + + + + + Flushes any buffered log data. + + + This implementation doesn't flush anything and always returns true + + True if all logging events were flushed successfully, else false. + + + + It is assumed and enforced that errorHandler is never null. + + + + See for more information. + + + + + + The last filter in the filter chain. + + + See for more information. + + + + + Flag indicating if this appender is closed. + + + See for more information. + + + + + The guard prevents an appender from repeatedly calling its own DoAppend method + + + + + Used for locking actions by this appender. + + + + + StringWriter used to render events + + + + + Initial buffer size + + + + + Maximum buffer size before it is recycled + + + + + The fully qualified type of the AppenderSkeleton class. + + + Used by the internal logger to record the Type of the + log message. + + + + + + Appends log events to the ASP.NET system. + + + + + Diagnostic information and tracing messages that you specify are appended to the output + of the page that is sent to the requesting browser. Optionally, you can view this information + from a separate trace viewer (Trace.axd) that displays trace information for every page in a + given application. + + + Trace statements are processed and displayed only when tracing is enabled. You can control + whether tracing is displayed to a page, to the trace viewer, or both. + + + The logging event is passed to the or + method depending on the level of the logging event. + The event's logger name is the default value for the category parameter of the Write/Warn method. + + + Nicko Cadell + Gert Driesen + Ron Grabowski + + + + Write the logging event to the ASP.NET trace HttpContext.Current.Trace. + + the event to log + + + + This appender requires a to be set. + + + + + The category parameter sent to the Trace method. + + + + Defaults to %logger which will use the logger name of the current + as the category parameter. + + + + + + Abstract base class implementation of that + buffers events in a fixed size buffer. + + + + This base class should be used by appenders that need to buffer a + number of events before logging them. + For example the + buffers events and then submits the entire contents of the buffer to + the underlying database in one go. + + + Subclasses should override the + method to deliver the buffered events. + + The BufferingAppenderSkeleton maintains a fixed size cyclic + buffer of events. The size of the buffer is set using + the property. + + A is used to inspect + each event as it arrives in the appender. If the + triggers, then the current buffer is sent immediately + (see ). Otherwise the event + is stored in the buffer. For example, an evaluator can be used to + deliver the events immediately when an ERROR event arrives. + + + The buffering appender can be configured in a mode. + By default the appender is NOT lossy. When the buffer is full all + the buffered events are sent with . + If the property is set to true then the + buffer will not be sent when it is full, and new events arriving + in the appender will overwrite the oldest event in the buffer. + In lossy mode the buffer will only be sent when the + triggers. This can be useful behavior when you need to know about + ERROR events but not about events with a lower level, configure an + evaluator that will trigger when an ERROR event arrives, the whole + buffer will be sent which gives a history of events leading up to + the ERROR event. + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + + Protected default constructor to allow subclassing. + + + + + + Initializes a new instance of the class. + + the events passed through this appender must be + fixed by the time that they arrive in the derived class' SendBuffer method. + + + Protected constructor to allow subclassing. + + + The should be set if the subclass + expects the events delivered to be fixed even if the + is set to zero, i.e. when no buffering occurs. + + + + + + Gets or sets a value that indicates whether the appender is lossy. + + + true if the appender is lossy, otherwise false. The default is false. + + + + This appender uses a buffer to store logging events before + delivering them. A triggering event causes the whole buffer + to be sent to the remote sink. If the buffer overruns before + a triggering event then logging events could be lost. Set + to false to prevent logging events + from being lost. + + If is set to true then an + must be specified. + + + + + Gets or sets the size of the cyclic buffer used to hold the + logging events. + + + The size of the cyclic buffer used to hold the logging events. + + + + The option takes a positive integer + representing the maximum number of logging events to collect in + a cyclic buffer. When the is reached, + oldest events are deleted as new events are added to the + buffer. By default the size of the cyclic buffer is 512 events. + + + If the is set to a value less than + or equal to 1 then no buffering will occur. The logging event + will be delivered synchronously (depending on the + and properties). Otherwise the event will + be buffered. + + + + + + Gets or sets the that causes the + buffer to be sent immediately. + + + The that causes the buffer to be + sent immediately. + + + + The evaluator will be called for each event that is appended to this + appender. If the evaluator triggers then the current buffer will + immediately be sent (see ). + + If is set to true then an + must be specified. + + + + + Gets or sets the value of the to use. + + + The value of the to use. + + + + The evaluator will be called for each event that is discarded from this + appender. If the evaluator triggers then the current buffer will immediately + be sent (see ). + + + + + + Gets or sets the fields that will be fixed in the event. + + + The event fields that will be fixed before the event is buffered + + + + The logging event needs to have certain thread specific values + captured before it can be buffered. See + for details. + + + + + + + Flushes any buffered log data. + + The maximum time to wait for logging events to be flushed. + True if all logging events were flushed successfully, else false. + + + + Flush the currently buffered events + + + + Flushes any events that have been buffered. + + + If the appender is buffering in mode then the contents + of the buffer will NOT be flushed to the appender. + + + + + + Flush the currently buffered events + + set to true to flush the buffer of lossy events + + + Flushes events that have been buffered. If is + false then events will only be flushed if this buffer is non-lossy mode. + + + If the appender is buffering in mode then the contents + of the buffer will only be flushed if is true. + In this case the contents of the buffer will be tested against the + and if triggering will be output. All other buffered + events will be discarded. + + + If is true then the buffer will always + be emptied by calling this method. + + + + + + Initialize the appender based on the options set + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Close this appender instance. + + + + Close this appender instance. If this appender is marked + as not then the remaining events in + the buffer must be sent when the appender is closed. + + + + + + This method is called by the method. + + the event to log + + + Stores the in the cyclic buffer. + + + The buffer will be sent (i.e. passed to the + method) if one of the following conditions is met: + + + + The cyclic buffer is full and this appender is + marked as not lossy (see ) + + + An is set and + it is triggered for the + specified. + + + + Before the event is stored in the buffer it is fixed + (see ) to ensure that + any data referenced by the event will be valid when the buffer + is processed. + + + + + + Sends the contents of the buffer. + + The first logging event. + The buffer containing the events that need to be sent. + + + The subclass must override . + + + + + + Sends the events. + + The events that need to be sent. + + + The subclass must override this method to process the buffered events. + + + + + + The default buffer size. + + + The default size of the cyclic buffer used to store events. + This is set to 512 by default. + + + + + The cyclic buffer used to store the logging events. + + + + + The events delivered to the subclass must be fixed. + + + + + Buffers events and then forwards them to attached appenders. + + + + The events are buffered in this appender until conditions are + met to allow the appender to deliver the events to the attached + appenders. See for the + conditions that cause the buffer to be sent. + + The forwarding appender can be used to specify different + thresholds and filters for the same appender at different locations + within the hierarchy. + + + Nicko Cadell + Gert Driesen + + + + Closes the appender and releases resources. + + + + Releases any resources allocated within the appender such as file handles, + network connections, etc. + + + It is a programming error to append to a closed appender. + + + + + + Send the events. + + The events that need to be sent. + + + Forwards the events to the attached appenders. + + + + + + Adds an to the list of appenders of this + instance. + + The to add to this appender. + + + If the specified is already in the list of + appenders, then it won't be added again. + + + + + + Gets the appenders contained in this appender as an + . + + + If no appenders can be found, then an + is returned. + + + A collection of the appenders in this appender. + + + + + Looks for the appender with the specified name. + + The name of the appender to lookup. + + The appender with the specified name, or null. + + + + + Removes all previously added appenders from this appender. + + + + This is useful when re-reading configuration information. + + + + + + Removes the specified appender from the list of appenders. + + The appender to remove. + The appender removed from the list + + The appender removed is not closed. + If you are discarding the appender you must call + on the appender removed. + + + + + Removes the appender with the specified name from the list of appenders. + + The name of the appender to remove. + The appender removed from the list + + The appender removed is not closed. + If you are discarding the appender you must call + on the appender removed. + + + + + Implementation of the interface + + + + + Appends logging events to the console. + + + + ColoredConsoleAppender appends log events to the standard output stream + or the error output stream using a layout specified by the + user. It also allows the color of a specific type of message to be set. + + + By default, all output is written to the console's standard output stream. + The property can be set to direct the output to the + error stream. + + + NOTE: This appender writes directly to the application's attached console + not to the System.Console.Out or System.Console.Error TextWriter. + The System.Console.Out and System.Console.Error streams can be + programmatically redirected (for example NUnit does this to capture program output). + This appender will ignore these redirections because it needs to use Win32 + API calls to colorize the output. To respect these redirections the + must be used. + + + When configuring the colored console appender, mapping should be + specified to map a logging level to a color. For example: + + + + + + + + + + + + + + The Level is the standard log4net logging level and ForeColor and BackColor can be any + combination of the following values: + + Blue + Green + Red + White + Yellow + Purple + Cyan + HighIntensity + + + + Rick Hobbs + Nicko Cadell + + + + The enum of possible color values for use with the color mapping method + + + + The following flags can be combined to form the colors. + + + + + + + color is blue + + + + + color is green + + + + + color is red + + + + + color is white + + + + + color is yellow + + + + + color is purple + + + + + color is cyan + + + + + color is intensified + + + + + Initializes a new instance of the class. + + + The instance of the class is set up to write + to the standard output stream. + + + + + Target is the value of the console output stream. + This is either "Console.Out" or "Console.Error". + + + Target is the value of the console output stream. + This is either "Console.Out" or "Console.Error". + + + + Target is the value of the console output stream. + This is either "Console.Out" or "Console.Error". + + + + + + Add a mapping of level to color - done by the config file + + The mapping to add + + + Add a mapping to this appender. + Each mapping defines the foreground and background colors + for a level. + + + + + + This method is called by the method. + + The event to log. + + + Writes the event to the console. + + + The format of the output will depend on the appender's layout. + + + + + + This appender requires a to be set. + + + + + Initializes the options for this appender. + + + + + The to use when writing to the Console + standard output stream. + + + + + The to use when writing to the Console + standard error output stream. + + + + + Flag to write output to the error stream rather than the standard output stream + + + + + Mapping from level object to color value + + + + + The console output stream writer to write to + + + + This writer is not thread safe. + + + + + + A class to act as a mapping between the level that a logging call is made at and + the color it should be displayed as. + + + + Defines the mapping between a level and the color it should be displayed in. + + + + + + The mapped foreground color for the specified level + + + + + The mapped background color for the specified level + + + + + Initialize the options for the object + + + + Combine the and together. + + + + + + The combined and suitable for + setting the console color. + + + + + Appends logging events to the console. + + + + ConsoleAppender appends log events to the standard output stream + or the error output stream using a layout specified by the + user. + + + By default, all output is written to the console's standard output stream. + The property can be set to direct the output to the + error stream. + + + NOTE: This appender writes each message to the System.Console.Out or + System.Console.Error that is set at the time the event is appended. + Therefore it is possible to programmatically redirect the output of this appender + (for example NUnit does this to capture program output). While this is the desired + behavior of this appender it may have security implications in your application. + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + The instance of the class is set up to write + to the standard output stream. + + + + + Target is the value of the console output stream. + This is either "Console.Out" or "Console.Error". + + + Target is the value of the console output stream. + This is either "Console.Out" or "Console.Error". + + + + Target is the value of the console output stream. + This is either "Console.Out" or "Console.Error". + + + + + + This method is called by the method. + + The event to log. + + + Writes the event to the console. + + + The format of the output will depend on the appender's layout. + + + + + + This appender requires a to be set. + + + + + The to use when writing to the Console standard output stream. + + + + + The to use when writing to the Console standard error output stream. + + + + + Appends log events to the system. + + + + The application configuration file can be used to control what listeners + are actually used. See the MSDN documentation for the + class for details on configuring the + debug system. + + + Events are written using the + method. The event's logger name is passed as the value for the category name to the Write method. + + + Nicko Cadell + + + + Gets or sets a value that indicates whether the appender will + flush at the end of each write. + + + The default behavior is to flush at the end of each + write. If the option is set tofalse, then the underlying + stream can defer writing to physical medium to a later time. + + + Avoiding the flush operation at the end of each append results + in a performance gain of 10 to 20 percent. However, there is safety + trade-off involved in skipping flushing. Indeed, when flushing is + skipped, then it is likely that the last few log events will not + be recorded on disk when the application exits. This is a high + price to pay even for a 20% performance gain. + + + + + + Formats the category parameter sent to the Debug method. + + + + Defaults to a with %logger as the pattern which will use the logger name of the current + as the category parameter. + + + + + + Flushes any buffered log data. + + The maximum time to wait for logging events to be flushed. + True if all logging events were flushed successfully, else false. + + + + Writes the logging event to the system. + + The event to log. + + + Writes the logging event to the system. + If is true then the + is called. + + + + + + This appender requires a to be set. + + + + + Writes events to the system event log. + + + + The appender will fail if you try to write using an event source that doesn't exist unless it is running with local administrator privileges. + See also http://logging.apache.org/log4net/release/faq.html#trouble-EventLog + + + The EventID of the event log entry can be + set using the EventID property () + on the . + + + The Category of the event log entry can be + set using the Category property () + on the . + + + There is a limit of 32K characters for an event log message + + + When configuring the EventLogAppender a mapping can be + specified to map a logging level to an event log entry type. For example: + + + <mapping> + <level value="ERROR" /> + <eventLogEntryType value="Error" /> + </mapping> + <mapping> + <level value="DEBUG" /> + <eventLogEntryType value="Information" /> + </mapping> + + + The Level is the standard log4net logging level and eventLogEntryType can be any value + from the enum, i.e.: + + Erroran error event + Warninga warning event + Informationan informational event + + + + Aspi Havewala + Douglas de la Torre + Nicko Cadell + Gert Driesen + Thomas Voss + + + + Initializes a new instance of the class. + + + + Default constructor. + + + + + + The name of the log where messages will be stored. + + + The string name of the log where messages will be stored. + + + This is the name of the log as it appears in the Event Viewer + tree. The default value is to log into the Application + log, this is where most applications write their events. However + if you need a separate log for your application (or applications) + then you should set the appropriately. + This should not be used to distinguish your event log messages + from those of other applications, the + property should be used to distinguish events. This property should be + used to group together events into a single log. + + + + + + Property used to set the Application name. This appears in the + event logs when logging. + + + The string used to distinguish events from different sources. + + + Sets the event log source property. + + + + + This property is used to return the name of the computer to use + when accessing the event logs. Currently, this is the current + computer, denoted by a dot "." + + + The string name of the machine holding the event log that + will be logged into. + + + This property cannot be changed. It is currently set to '.' + i.e. the local machine. This may be changed in future. + + + + + Add a mapping of level to - done by the config file + + The mapping to add + + + Add a mapping to this appender. + Each mapping defines the event log entry type for a level. + + + + + + Gets or sets the used to write to the EventLog. + + + The used to write to the EventLog. + + + + The system security context used to write to the EventLog. + + + Unless a specified here for this appender + the is queried for the + security context to use. The default behavior is to use the security context + of the current thread. + + + + + + Gets or sets the EventId to use unless one is explicitly specified via the LoggingEvent's properties. + + + + The EventID of the event log entry will normally be + set using the EventID property () + on the . + This property provides the fallback value which defaults to 0. + + + + + + Gets or sets the Category to use unless one is explicitly specified via the LoggingEvent's properties. + + + + The Category of the event log entry will normally be + set using the Category property () + on the . + This property provides the fallback value which defaults to 0. + + + + + + Initialize the appender based on the options set + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Create an event log source + + + + + This method is called by the + method. + + the event to log + + Writes the event to the system event log using the + . + + If the event has an EventID property (see ) + set then this integer will be used as the event log event id. + + + There is a limit of 32K characters for an event log message + + + + + + This appender requires a to be set. + + true + + + + Get the equivalent for a + + the Level to convert to an EventLogEntryType + The equivalent for a + + Because there are fewer applicable + values to use in logging levels than there are in the + this is a one way mapping. There is + a loss of information during the conversion. + + + + + Mapping from level object to EventLogEntryType + + + + + A class to act as a mapping between the level that a logging call is made at and + the color it should be displayed as. + + + + Defines the mapping between a level and its event log entry type. + + + + + + The for this entry + + + + + The fully qualified type of the EventLogAppender class. + + + Used by the internal logger to record the Type of the + log message. + + + + + The maximum size supported by default. + + + http://msdn.microsoft.com/en-us/library/xzwc042w(v=vs.100).aspx + The 32766 documented max size is two bytes shy of 32K (I'm assuming 32766 + may leave space for a two byte null terminator of #0#0). The 32766 max + length is what the .NET 4.0 source code checks for, but this is WRONG! + Strings with a length > 31839 on Windows Vista or higher can CORRUPT + the event log! See: System.Diagnostics.EventLogInternal.InternalWriteEvent() + for the use of the 32766 max size. + + + + + The maximum size supported by a windows operating system that is vista + or newer. + + + See ReportEvent API: + http://msdn.microsoft.com/en-us/library/aa363679(VS.85).aspx + ReportEvent's lpStrings parameter: + "A pointer to a buffer containing an array of + null-terminated strings that are merged into the message before Event Viewer + displays the string to the user. This parameter must be a valid pointer + (or NULL), even if wNumStrings is zero. Each string is limited to 31,839 characters." + + Going beyond the size of 31839 will (at some point) corrupt the event log on Windows + Vista or higher! It may succeed for a while...but you will eventually run into the + error: "System.ComponentModel.Win32Exception : A device attached to the system is + not functioning", and the event log will then be corrupt (I was able to corrupt + an event log using a length of 31877 on Windows 7). + + The max size for Windows Vista or higher is documented here: + http://msdn.microsoft.com/en-us/library/xzwc042w(v=vs.100).aspx. + Going over this size may succeed a few times but the buffer will overrun and + eventually corrupt the log (based on testing). + + The maxEventMsgSize size is based on the max buffer size of the lpStrings parameter of the ReportEvent API. + The documented max size for EventLog.WriteEntry for Windows Vista and higher is 31839, but I'm leaving room for a + terminator of #0#0, as we cannot see the source of ReportEvent (though we could use an API monitor to examine the + buffer, given enough time). + + + + + The maximum size that the operating system supports for + a event log message. + + + Used to determine the maximum string length that can be written + to the operating system event log and eventually truncate a string + that exceeds the limits. + + + + + This method determines the maximum event log message size allowed for + the current environment. + + + + + + Appends logging events to a file. + + + + Logging events are sent to the file specified by the property. + + + The file can be opened in either append or overwrite mode + by specifying the property. + If the file path is relative it is taken as relative from + the application base directory. The file encoding can be + specified by setting the property. + + + The layout's and + values will be written each time the file is opened and closed + respectively. If the property is + then the file may contain multiple copies of the header and footer. + + + This appender will first try to open the file for writing when + is called. This will typically be during configuration. + If the file cannot be opened for writing the appender will attempt + to open the file again each time a message is logged to the appender. + If the file cannot be opened for writing when a message is logged then + the message will be discarded by this appender. + + + The supports pluggable file locking models via + the property. + The default behavior, implemented by + is to obtain an exclusive write lock on the file until this appender is closed. + The alternative models only hold a + write lock while the appender is writing a logging event () + or synchronize by using a named system-wide Mutex (). + + + All locking strategies have issues and you should seriously consider using a different strategy that + avoids having multiple processes logging to the same file. + + + Nicko Cadell + Gert Driesen + Rodrigo B. de Oliveira + Douglas de la Torre + Niall Daley + + + + Write only that uses the + to manage access to an underlying resource. + + + + + Write only that uses the + to manage access to an underlying resource. + + + + + Locking model base class + + + + Base class for the locking models available to the derived loggers. + + + + + + Open the output file + + The filename to use + Whether to append to the file, or overwrite + The encoding to use + + + Open the file specified and prepare for logging. + No writes will be made until is called. + Must be called before any calls to , + and . + + + + + + Close the file + + + + Close the file. No further writes will be made. + + + + + + Initializes all resources used by this locking model. + + + + + Disposes all resources that were initialized by this locking model. + + + + + Acquire the lock on the file + + A stream that is ready to be written to, or null if there is no active stream because uninitialized or error. + + + Acquire the lock on the file in preparation for writing to it. + Returns a stream pointing to the file. + must be called to release the lock on the output file when the return + value is not null. + + + + + + Releases the lock on the file + + + + No further writes will be made to the stream until is called again. + + + + + + Gets or sets the for this LockingModel + + + The for this LockingModel + + + + The file appender this locking model is attached to and working on + behalf of. + + + The file appender is used to locate the security context and the error handler to use. + + + The value of this property will be set before is + called. + + + + + + Helper method that creates a FileStream under CurrentAppender's SecurityContext. + + + + Typically called during OpenFile or AcquireLock. + + + If the directory portion of the does not exist, it is created + via Directory.CreateDirectory. + + + + + + + + + + Helper method to close under CurrentAppender's SecurityContext. + + + Does not set to null. + + + + + + Hold an exclusive lock on the output file + + + + Open the file once for writing and hold it open until is called. + Maintains an exclusive lock on the file during this time. + + + + + + Open the file specified and prepare for logging. + + The filename to use + Whether to append to the file, or overwrite + The encoding to use + + + Open the file specified and prepare for logging. + No writes will be made until is called. + Must be called before any calls to , + and . + + + + + + Close the file + + + + Close the file. No further writes will be made. + + + + + + Acquire the lock on the file + + A stream that is ready to be written to. + + + Does nothing. The lock is already taken + + + + + + Release the lock on the file + + + + Does nothing. The lock will be released when the file is closed. + + + + + + Initializes all resources used by this locking model. + + + + + Disposes all resources that were initialized by this locking model. + + + + + Acquires the file lock for each write + + + + Opens the file once for each / cycle, + thus holding the lock for the minimal amount of time. This method of locking + is considerably slower than but allows + other processes to move/delete the log file whilst logging continues. + + + + + + Prepares to open the file when the first message is logged. + + The filename to use + Whether to append to the file, or overwrite + The encoding to use + + + Open the file specified and prepare for logging. + No writes will be made until is called. + Must be called before any calls to , + and . + + + + + + Close the file + + + + Close the file. No further writes will be made. + + + + + + Acquire the lock on the file + + A stream that is ready to be written to. + + + Acquire the lock on the file in preparation for writing to it. + Return a stream pointing to the file. + must be called to release the lock on the output file. + + + + + + Release the lock on the file + + + + Release the lock on the file. No further writes will be made to the + stream until is called again. + + + + + + Initializes all resources used by this locking model. + + + + + Disposes all resources that were initialized by this locking model. + + + + + Provides cross-process file locking. + + Ron Grabowski + Steve Wranovsky + + + + Open the file specified and prepare for logging. + + The filename to use + Whether to append to the file, or overwrite + The encoding to use + + + Open the file specified and prepare for logging. + No writes will be made until is called. + Must be called before any calls to , + - and . + + + + + + Close the file + + + + Close the file. No further writes will be made. + + + + + + Acquire the lock on the file + + A stream that is ready to be written to. + + + Does nothing. The lock is already taken + + + + + + Releases the lock and allows others to acquire a lock. + + + + + Initializes all resources used by this locking model. + + + + + Disposes all resources that were initialized by this locking model. + + + + + Hold no lock on the output file + + + + Open the file once and hold it open until is called. + Maintains no lock on the file during this time. + + + + + + Open the file specified and prepare for logging. + + The filename to use + Whether to append to the file, or overwrite + The encoding to use + + + Open the file specified and prepare for logging. + No writes will be made until is called. + Must be called before any calls to , + and . + + + + + + Close the file + + + + Close the file. No further writes will be made. + + + + + + Acquire the lock on the file + + A stream that is ready to be written to. + + + Does nothing. The lock is already taken + + + + + + Release the lock on the file + + + + Does nothing. The lock will be released when the file is closed. + + + + + + Initializes all resources used by this locking model. + + + + + Disposes all resources that were initialized by this locking model. + + + + + Default locking model (when no locking model was configured) + + + + + Specify default locking model + + Type of LockingModel + + + + Gets or sets the path to the file that logging will be written to. + + + The path to the file that logging will be written to. + + + + If the path is relative it is taken as relative from + the application base directory. + + + + + + Gets or sets a flag that indicates whether the file should be + appended to or overwritten. + + + Indicates whether the file should be appended to or overwritten. + + + + If the value is set to false then the file will be overwritten, if + it is set to true then the file will be appended to. + + The default value is true. + + + + + Gets or sets used to write to the file. + + + The used to write to the file. + + + + The default encoding set is + which is the encoding for the system's current ANSI code page. + + + + + + Gets or sets the used to write to the file. + + + The used to write to the file. + + + + Unless a specified here for this appender + the is queried for the + security context to use. The default behavior is to use the security context + of the current thread. + + + + + + Gets or sets the used to handle locking of the file. + + + The used to lock the file. + + + + Gets or sets the used to handle locking of the file. + + + There are three built in locking models, , and . + The first locks the file from the start of logging to the end, the + second locks only for the minimal amount of time when logging each message + and the last synchronizes processes using a named system-wide Mutex. + + + The default locking model is the . + + + + + + Activate the options on the file appender. + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + This will cause the file to be opened. + + + + + + Closes any previously opened file and calls the parent's . + + + + Resets the filename and the file stream. + + + + + + Close this appender instance. The underlying stream or writer is also closed. + + + + + Called to initialize the file writer + + + + Will be called for each logged message until the file is + successfully opened. + + + + + + This method is called by the + method. + + The event to log. + + + Writes a log statement to the output stream if the output stream exists + and is writable. + + + The format of the output will depend on the appender's layout. + + + + + + This method is called by the + method. + + The array of events to log. + + + Acquires the output file locks once before writing all the events to + the stream. + + + + + + Writes a footer as produced by the embedded layout's property. + + + + Writes a footer as produced by the embedded layout's property. + + + + + + Writes a header produced by the embedded layout's property. + + + + Writes a header produced by the embedded layout's property. + + + + + + Closes the underlying . + + + + Closes the underlying . + + + + + + Closes the previously opened file. + + + + Writes the to the file and then + closes the file. + + + + + + Sets and opens the file where the log output will go. The specified file must be writable. + + The path to the log file. Must be a fully qualified path. + If true will append to fileName. Otherwise will truncate fileName + + + Calls but guarantees not to throw an exception. + Errors are passed to the . + + + + + + Sets and opens the file where the log output will go. The specified file must be writable. + + The path to the log file. Must be a fully qualified path. + If true will append to fileName. Otherwise will truncate fileName + + + If there was already an opened file, then the previous file + is closed first. + + + This method will ensure that the directory structure + for the specified exists. + + + + + + Sets the quiet writer used for file output + + the file stream that has been opened for writing + + + This implementation of creates a + over the and passes it to the + method. + + + This method can be overridden by subclasses that want to wrap the + in some way, for example to encrypt the output + data using a System.Security.Cryptography.CryptoStream. + + + + + + Sets the quiet writer being used. + + the writer over the file stream that has been opened for writing + + + This method can be overridden by subclasses that want to + wrap the in some way. + + + + + + Convert a path into a fully qualified path. + + The path to convert. + The fully qualified path. + + + Converts the path specified to a fully + qualified path. If the path is relative it is + taken as relative from the application base + directory. + + + + + + The name of the log file. + + + + + The stream to log to. Has added locking semantics + + + + + The fully qualified type of the FileAppender class. + + + Used by the internal logger to record the Type of the + log message. + + + + + This appender forwards logging events to attached appenders. + + + + The forwarding appender can be used to specify different thresholds + and filters for the same appender at different locations within the hierarchy. + + + Nicko Cadell + Gert Driesen + + + + Closes the appender and releases resources. + + + + Releases any resources allocated within the appender such as file handles, + network connections, etc. + + + It is a programming error to append to a closed appender. + + + + + + Forward the logging event to the attached appenders + + The event to log. + + + Delivers the logging event to all the attached appenders. + + + + + + Forward the logging events to the attached appenders + + The array of events to log. + + + Delivers the logging events to all the attached appenders. + + + + + + Adds an to the list of appenders of this + instance. + + The to add to this appender. + + + If the specified is already in the list of + appenders, then it won't be added again. + + + + + + Gets the appenders contained in this appender as an + . + + + If no appenders can be found, then an + is returned. + + + A collection of the appenders in this appender. + + + + + Looks for the appender with the specified name. + + The name of the appender to lookup. + + The appender with the specified name, or null. + + + + Get the named appender attached to this appender. + + + + + + Removes all previously added appenders from this appender. + + + + This is useful when re-reading configuration information. + + + + + + Removes the specified appender from the list of appenders. + + The appender to remove. + The appender removed from the list + + The appender removed is not closed. + If you are discarding the appender you must call + on the appender removed. + + + + + Removes the appender with the specified name from the list of appenders. + + The name of the appender to remove. + The appender removed from the list + + The appender removed is not closed. + If you are discarding the appender you must call + on the appender removed. + + + + + Implementation of the interface + + + + + Implement this interface for your own strategies for printing log statements. + + + + Implementors should consider extending the + class which provides a default implementation of this interface. + + + Appenders can also implement the interface. Therefore + they would require that the method + be called after the appenders properties have been configured. + + + Nicko Cadell + Gert Driesen + + + + Closes the appender and releases resources. + + + + Releases any resources allocated within the appender such as file handles, + network connections, etc. + + + It is a programming error to append to a closed appender. + + + + + + Log the logging event in Appender specific way. + + The event to log + + + This method is called to log a message into this appender. + + + + + + Gets or sets the name of this appender. + + The name of the appender. + + The name uniquely identifies the appender. + + + + + Interface for appenders that support bulk logging. + + + + This interface extends the interface to + support bulk logging of objects. Appenders + should only implement this interface if they can bulk log efficiently. + + + Nicko Cadell + + + + Log the array of logging events in Appender specific way. + + The events to log + + + This method is called to log an array of events into this appender. + + + + + + Interface that can be implemented by Appenders that buffer logging data and expose a method. + + + + + Flushes any buffered log data. + + + Appenders that implement the method must do so in a thread-safe manner: it can be called concurrently with + the method. + + Typically this is done by locking on the Appender instance, e.g.: + + + + + + The parameter is only relevant for appenders that process logging events asynchronously, + such as RemotingAppender. + + + The maximum time to wait for logging events to be flushed. + True if all logging events were flushed successfully, else false. + + + + Logs events to a local syslog service. + + + + This appender uses the POSIX libc library functions openlog, syslog, and closelog. + If these functions are not available on the local system then this appender will not work! + + + The functions openlog, syslog, and closelog are specified in SUSv2 and + POSIX 1003.1-2001 standards. These are used to log messages to the local syslog service. + + + This appender talks to a local syslog service. If you need to log to a remote syslog + daemon and you cannot configure your local syslog service to do this you may be + able to use the to log via UDP. + + + Syslog messages must have a facility and and a severity. The severity + is derived from the Level of the logging event. + The facility must be chosen from the set of defined syslog + values. The facilities list is predefined + and cannot be extended. + + + An identifier is specified with each log message. This can be specified + by setting the property. The identity (also know + as the tag) must not contain white space. The default value for the + identity is the application name (from ). + + + Rob Lyon + Nicko Cadell + + + + syslog severities + + + + The log4net Level maps to a syslog severity using the + method and the + class. The severity is set on . + + + + + + system is unusable + + + + + action must be taken immediately + + + + + critical conditions + + + + + error conditions + + + + + warning conditions + + + + + normal but significant condition + + + + + informational + + + + + debug-level messages + + + + + syslog facilities + + + + The syslog facility defines which subsystem the logging comes from. + This is set on the property. + + + + + + kernel messages + + + + + random user-level messages + + + + + mail system + + + + + system daemons + + + + + security/authorization messages + + + + + messages generated internally by syslogd + + + + + line printer subsystem + + + + + network news subsystem + + + + + UUCP subsystem + + + + + clock (cron/at) daemon + + + + + security/authorization messages (private) + + + + + ftp daemon + + + + + NTP subsystem + + + + + log audit + + + + + log alert + + + + + clock daemon + + + + + reserved for local use + + + + + reserved for local use + + + + + reserved for local use + + + + + reserved for local use + + + + + reserved for local use + + + + + reserved for local use + + + + + reserved for local use + + + + + reserved for local use + + + + + Message identity + + + + An identifier is specified with each log message. This can be specified + by setting the property. The identity (also known + as the tag) must not contain white space. The default value for the + identity is the application name (from ). + + + + + + Syslog facility + + + Set to one of the values. The list of + facilities is predefined and cannot be extended. The default value + is . + + + + + Add a mapping of level to severity + + The mapping to add + + + Adds a to this appender. + + + + + + Initialize the appender based on the options set. + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + This method is called by the method. + + The event to log. + + + Writes the event to a remote syslog daemon. + + + The format of the output will depend on the appender's layout. + + + + + + Close the syslog when the appender is closed + + + + Close the syslog when the appender is closed + + + + + + This appender requires a to be set. + + + + + Translates a log4net level to a syslog severity. + + A log4net level. + A syslog severity. + + + + Generate a syslog priority. + + The syslog facility. + The syslog severity. + A syslog priority. + + + + Marshaled handle to the identity string. We have to hold on to the + string as the openlog and syslog APIs just hold the + pointer to the ident and dereference it for each log message. + + + + + Mapping from level object to syslog severity + + + + + A class to act as a mapping between the level that a logging call is made at and + the syslog severity that is should be logged at. + + + + + The mapped syslog severity for the specified level + + + + + Appends colorful logging events to the console, using .NET built-in capabilities. + + + + ManagedColoredConsoleAppender appends log events to the standard output stream + or the error output stream using a layout specified by the + user. It also allows the color of a specific type of message to be set. + + + By default, all output is written to the console's standard output stream. + The property can be set to direct the output to the + error stream. + + + When configuring the colored console appender, mappings should be + specified to map logging levels to colors. For example: + + + + + + + + + + + + + + + + + + + + + + The Level is the standard log4net logging level while + ForeColor and BackColor are the values of + enumeration. + + + Based on the ColoredConsoleAppender + + + Rick Hobbs + Nicko Cadell + Pavlos Touboulidis + + + + Gets or sets the console output stream. + This is either "Console.Out" or "Console.Error". + + + + + Add a mapping of level to color - done by the config file + + The mapping to add + + + Each mapping defines the foreground and background colors + for a level. + + + + + + Writes the event to the console. + + The event to log. + + + This method is called by the method. + + + The format of the output will depend on the appender's layout. + + + + + + This appender requires a to be set. + + + + + Initializes the options for this appender. + + + + + The to use when writing to the Console + standard output stream. + + + + + The to use when writing to the Console + standard error output stream. + + + + + Flag to write output to the error stream rather than the standard output stream + + + + + Mapping from level object to color value + + + + + A class to act as a mapping between the level that a logging call is made at and + the color it should be displayed as. + + + + + The mapped foreground color for the specified level + + + + + Gets or sets the mapped background color for the specified level + + + + + Stores logging events in an array. + + + + The memory appender stores all the logging events + that are appended in an in-memory array. + + + Use the method to get + and clear the current list of events that have been appended. + + + Use the method to get the current + list of events that have been appended. Note there is a + race-condition when calling and + in pairs, you better use in that case. + + + Use the method to clear the + current list of events. Note there is a + race-condition when calling and + in pairs, you better use in that case. + + + Julian Biddle + Nicko Cadell + Gert Driesen + + + + Gets the events that have been logged. + + The events that have been logged + + + + Gets or sets the fields that will be fixed in the event + + + + The logging event needs to have certain thread specific values + captured before it can be buffered. See + for details. + + + + + + This method is called by the method. + + the event to log + + Stores the in the events list. + + + + + Clear the list of events + + + Clear the list of events + + + + + Gets the events that have been logged and clears the list of events. + + The events that have been logged + + + + The list of events that have been appended. + + + + + Appends log events to the OutputDebugString system. + + Nicko Cadell + Gert Driesen + + + + Writes the logging event to the output debug string API + + the event to log + + + + This appender requires a to be set. + + + + + Logs events to a remote syslog daemon. + + + + The BSD syslog protocol is used to remotely log to + a syslog daemon. The syslogd listens for messages + on UDP port 514. + + + The syslog UDP protocol is not authenticated. Most syslog daemons + do not accept remote log messages because of the security implications. + You may be able to use the LocalSyslogAppender to talk to a local + syslog service. + + + There is an RFC 3164 that claims to document the BSD Syslog Protocol. + This RFC can be seen here: http://www.faqs.org/rfcs/rfc3164.html. + This appender generates what the RFC calls an "Original Device Message", + i.e. does not include the TIMESTAMP or HOSTNAME fields. By observation + this format of message will be accepted by all current syslog daemon + implementations. The daemon will attach the current time and the source + hostname or IP address to any messages received. + + + Syslog messages must have a facility and a severity. The severity + is derived from the Level of the logging event. + The facility must be chosen from the set of defined syslog + values. The facilities list is predefined + and cannot be extended. + + + An identifier is specified with each log message. This can be specified + by setting the property. The identity (also known + as the tag) must not contain white space. The default value for the + identity is the application name (from ). + + + Rob Lyon + Nicko Cadell + + + + Syslog port 514 + + + + + syslog severities + + + + The syslog severities. + + + + + + system is unusable + + + + + action must be taken immediately + + + + + critical conditions + + + + + error conditions + + + + + warning conditions + + + + + normal but significant condition + + + + + informational + + + + + debug-level messages + + + + + syslog facilities + + + + The syslog facilities + + + + + + kernel messages + + + + + random user-level messages + + + + + mail system + + + + + system daemons + + + + + security/authorization messages + + + + + messages generated internally by syslogd + + + + + line printer subsystem + + + + + network news subsystem + + + + + UUCP subsystem + + + + + clock (cron/at) daemon + + + + + security/authorization messages (private) + + + + + ftp daemon + + + + + NTP subsystem + + + + + log audit + + + + + log alert + + + + + clock daemon + + + + + reserved for local use + + + + + reserved for local use + + + + + reserved for local use + + + + + reserved for local use + + + + + reserved for local use + + + + + reserved for local use + + + + + reserved for local use + + + + + reserved for local use + + + + + Initializes a new instance of the class. + + + This instance of the class is set up to write + to a remote syslog daemon. + + + + + Message identity + + + + An identifier is specified with each log message. This can be specified + by setting the property. The identity (also known + as the tag) must not contain white space. The default value for the + identity is the application name (from ). + + + + + + Syslog facility + + + Set to one of the values. The list of + facilities is predefined and cannot be extended. The default value + is . + + + + + Add a mapping of level to severity + + The mapping to add + + + Add a mapping to this appender. + + + + + + Writes the event to a remote syslog daemon. + + The event to log. + + + This method is called by the method. + + + The format of the output will depend on the appender's layout. + + + + + + Appends the rendered message to the buffer + + rendered message + index of the current character in the message + buffer + + + + Initialize the options for this appender + + + + Initialize the level to syslog severity mappings set on this appender. + + + + + + Translates a log4net level to a syslog severity. + + A log4net level. + A syslog severity. + + + + Generate a syslog priority. + + The syslog facility. + The syslog severity. + A syslog priority. + + + Generate a syslog priority. + + + + + + Mapping from level object to syslog severity + + + + + A class to act as a mapping between the level that a logging call is made at and + the syslog severity that it should be logged at. + + + + A class to act as a mapping between the level that a logging call is made at and + the syslog severity that it should be logged at. + + + + + + The mapped syslog severity for the specified level + + + + Required property. + + + + + + Appender that rolls log files based on size or date or both. + + + + RollingFileAppender can roll log files based on size or date or both + depending on the setting of the property. + When set to the log file will be rolled + once its size exceeds the . + When set to the log file will be rolled + once the date boundary specified in the property + is crossed. + When set to the log file will be + rolled once the date boundary specified in the property + is crossed, but within a date boundary the file will also be rolled + once its size exceeds the . + When set to the log file will be rolled when + the appender is configured. This effectively means that the log file can be + rolled once per program execution. + + + A of few additional optional features have been added: + + Attach date pattern for current log file + Backup number increments for newer files + Infinite number of backups by file size + + + + + + For large or infinite numbers of backup files a + greater than zero is highly recommended, otherwise all the backup files need + to be renamed each time a new backup is created. + + + When Date/Time based rolling is used setting + to will reduce the number of file renamings to few or none. + + + + + + Changing or without clearing + the log file directory of backup files will cause unexpected and unwanted side effects. + + + + + If Date/Time based rolling is enabled this appender will attempt to roll existing files + in the directory without a Date/Time tag based on the last write date of the base log file. + The appender only rolls the log file when a message is logged. If Date/Time based rolling + is enabled then the appender will not roll the log file at the Date/Time boundary but + at the point when the next message is logged after the boundary has been crossed. + + + + The extends the and + has the same behavior when opening the log file. + The appender will first try to open the file for writing when + is called. This will typically be during configuration. + If the file cannot be opened for writing the appender will attempt + to open the file again each time a message is logged to the appender. + If the file cannot be opened for writing when a message is logged then + the message will be discarded by this appender. + + + When rolling a backup file necessitates deleting an older backup file the + file to be deleted is moved to a temporary name before being deleted. + + + + + A maximum number of backup files when rolling on date/time boundaries is not supported. + + + + Nicko Cadell + Gert Driesen + Aspi Havewala + Douglas de la Torre + Edward Smit + + + + Style of rolling to use + + + + + Roll files once per program execution + + + + Roll files once per program execution. + Well really once each time this appender is configured. + + + Setting this option also sets AppendToFile to on the + , otherwise this appender would just be a normal file appender. + + + + + + Roll files based only on the size of the file + + + + + Roll files based only on the date + + + + + Roll files based on both the size and date of the file + + + + + The code assumes that the following 'time' constants are in a increasing sequence. + + + + + + + Roll the log not based on the date + + + + + Roll the log for each minute + + + + + Roll the log for each hour + + + + + Roll the log twice a day (midday and midnight) + + + + + Roll the log each day (midnight) + + + + + Roll the log each week + + + + + Roll the log each month + + + + + Initializes a new instance of the class. + + + + + Cleans up all resources used by this appender. + + + + + Gets or sets the strategy for determining the current date and time. The default + implementation is to use LocalDateTime which internally calls through to DateTime.Now. + DateTime.UtcNow may be used on frameworks newer than .NET 1.0 by specifying + . + + + An implementation of the interface which returns the current date and time. + + + + Gets or sets the used to return the current date and time. + + + There are two built strategies for determining the current date and time, + + and . + + + The default strategy is . + + + + + + Gets or sets the date pattern to be used for generating file names + when rolling over on date. + + + The date pattern to be used for generating file names when rolling + over on date. + + + + Takes a string in the same format as expected by + . + May be set to null to disable date formatting. + + + This property determines the rollover schedule when rolling over + on date. + + + + + + Gets or sets the maximum number of backup files that are kept before + the oldest is erased. + + + The maximum number of backup files that are kept before the oldest is + erased. + + + + If set to zero, then there will be no backup files and the log file + will be truncated when it reaches . + + + If a negative number is supplied then no deletions will be made. Note + that this could result in very slow performance as a large number of + files are rolled over unless is used. + + + The maximum applies to each time based group of files and + not the total. + + + + + + Gets or sets the maximum size that the output file is allowed to reach + before being rolled over to backup files. + + + The maximum size in bytes that the output file is allowed to reach before being + rolled over to backup files. + + + + This property is equivalent to except + that it is required for differentiating the setter taking a + argument from the setter taking a + argument. + + + The default maximum file size is 10MB (10*1024*1024). + + + + + + Gets or sets the maximum size that the output file is allowed to reach + before being rolled over to backup files. + + + The maximum size that the output file is allowed to reach before being + rolled over to backup files. + + + + This property allows you to specify the maximum size with the + suffixes "KB", "MB" or "GB" so that the size is interpreted being + expressed respectively in kilobytes, megabytes or gigabytes. + + + For example, the value "10KB" will be interpreted as 10240 bytes. + + + The default maximum file size is 10MB. + + + If you have the option to set the maximum file size programmatically + consider using the property instead as this + allows you to set the size in bytes as a . + + + + + + Gets or sets the rolling file count direction. + + + The rolling file count direction. + + + + Indicates if the current file is the lowest numbered file or the + highest numbered file. + + + By default newer files have lower numbers ( < 0), + i.e. log.1 is most recent, log.5 is the 5th backup, etc... + + + >= 0 does the opposite i.e. + log.1 is the first backup made, log.5 is the 5th backup made, etc. + For infinite backups use >= 0 to reduce + rollover costs. + + The default file count direction is -1. + + + + + Gets or sets the rolling style. + + The rolling style. + + + The default rolling style is . + + + When set to this appender's + property is set to , otherwise + the appender would append to a single file rather than rolling + the file each time it is opened. + + + + + + Gets or sets a value indicating whether to preserve the file name extension when rolling. + + + if the file name extension should be preserved. + + + + By default file.log is rolled to file.log.yyyy-MM-dd or file.log.curSizeRollBackup. + However, under Windows the new file name will lose any program associations as the + extension is changed. Optionally file.log can be renamed to file.yyyy-MM-dd.log or + file.curSizeRollBackup.log to maintain any program associations. + + + + + + Gets or sets a value indicating whether to always log to + the same file. + + + if always should be logged to the same file, otherwise . + + + + By default file.log is always the current file. Optionally + file.log.yyyy-mm-dd for current formatted datePattern can by the currently + logging file (or file.log.curSizeRollBackup or even + file.log.yyyy-mm-dd.curSizeRollBackup). + + + This will make time based rollovers with a large number of backups + much faster as the appender it won't have to rename all the backups! + + + + + + The fully qualified type of the RollingFileAppender class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Sets the quiet writer being used. + + + This method can be overridden by subclasses. + + the writer to set + + + + Write out a logging event. + + the event to write to file. + + + Handles append time behavior for RollingFileAppender. This checks + if a roll over either by date (checked first) or time (checked second) + is need and then appends to the file last. + + + + + + Write out an array of logging events. + + the events to write to file. + + + Handles append time behavior for RollingFileAppender. This checks + if a roll over either by date (checked first) or time (checked second) + is need and then appends to the file last. + + + + + + Performs any required rolling before outputting the next event + + + + Handles append time behavior for RollingFileAppender. This checks + if a roll over either by date (checked first) or time (checked second) + is need and then appends to the file last. + + + + + + Creates and opens the file for logging. If + is false then the fully qualified name is determined and used. + + the name of the file to open + true to append to existing file + + This method will ensure that the directory structure + for the specified exists. + + + + + Get the current output file name + + the base file name + the output file name + + The output file name is based on the base fileName specified. + If is set then the output + file name is the same as the base file passed in. Otherwise + the output file depends on the date pattern, on the count + direction or both. + + + + + Determines curSizeRollBackups (only within the current roll point) + + + + + Generates a wildcard pattern that can be used to find all files + that are similar to the base file name. + + + + + Builds a list of filenames for all files matching the base filename plus a file pattern. + + + + + Initiates a roll over if needed for crossing a date boundary since the last run. + + + + + Initializes based on existing conditions at time of . + + + + Initializes based on existing conditions at time of . + The following is done + + determine curSizeRollBackups (only within the current roll point) + initiates a roll over if needed for crossing a date boundary since the last run. + + + + + + + Does the work of bumping the 'current' file counter higher + to the highest count when an incremental file name is seen. + The highest count is either the first file (when count direction + is greater than 0) or the last file (when count direction less than 0). + In either case, we want to know the highest count that is present. + + + + + + + Attempts to extract a number from the end of the file name that indicates + the number of the times the file has been rolled over. + + + Certain date pattern extensions like yyyyMMdd will be parsed as valid backup indexes. + + + + + Takes a list of files and a base file name, and looks for 'incremented' versions of the base file. + Bumps the max count up to the highest count seen. + + + + + Calculates the RollPoint for the datePattern supplied. + + the date pattern to calculate the check period for + The RollPoint that is most accurate for the date pattern supplied + + Essentially the date pattern is examined to determine what the + most suitable roll point is. The roll point chosen is the roll point + with the smallest period that can be detected using the date pattern + supplied. i.e. if the date pattern only outputs the year, month, day + and hour then the smallest roll point that can be detected would be + and hourly roll point as minutes could not be detected. + + + + + Initialize the appender based on the options set + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + Sets initial conditions including date/time roll over information, first check, + scheduledFilename, and calls to initialize + the current number of backups. + + + + + + CombinePath + + + .1, .2, .3, etc. + + + + + Rollover the file(s) to date/time tagged file(s). + + set to true if the file to be rolled is currently open + + + Rollover the file(s) to date/time tagged file(s). + Resets curSizeRollBackups. + If fileIsOpen is set then the new file is opened (through SafeOpenFile). + + + + + + Renames file to file . + + Name of existing file to roll. + New name for file. + + + Renames file to file . It + also checks for existence of target file and deletes if it does. + + + + + + Test if a file exists at a specified path + + the path to the file + true if the file exists + + + Test if a file exists at a specified path + + + + + + Deletes the specified file if it exists. + + The file to delete. + + + Delete a file if it exists. + The file is first moved to a new filename then deleted. + This allows the file to be removed even when it cannot + be deleted, but it still can be moved. + + + + + + Implements file roll base on file size. + + + + If the maximum number of size based backups is reached + (curSizeRollBackups == maxSizeRollBackups) then the oldest + file is deleted -- its index determined by the sign of countDirection. + If countDirection < 0, then files + {File.1, ..., File.curSizeRollBackups -1} + are renamed to {File.2, ..., + File.curSizeRollBackups}. Moreover, File is + renamed File.1 and closed. + + + A new file is created to receive further log output. + + + If maxSizeRollBackups is equal to zero, then the + File is truncated with no backup files created. + + + If maxSizeRollBackups < 0, then File is + renamed if needed and no files are deleted. + + + + + + Implements file roll. + + the base name to rename + + + If the maximum number of size based backups is reached + (curSizeRollBackups == maxSizeRollBackups) then the oldest + file is deleted -- its index determined by the sign of countDirection. + If countDirection < 0, then files + {File.1, ..., File.curSizeRollBackups -1} + are renamed to {File.2, ..., + File.curSizeRollBackups}. + + + If maxSizeRollBackups is equal to zero, then the + File is truncated with no backup files created. + + + If maxSizeRollBackups < 0, then File is + renamed if needed and no files are deleted. + + + This is called by to rename the files. + + + + + + Get the start time of the next window for the current rollpoint + + the current date + the type of roll point we are working with + the start time for the next roll point an interval after the currentDateTime date + + + Returns the date of the next roll point after the currentDateTime date passed to the method. + + + The basic strategy is to subtract the time parts that are less significant + than the rollpoint from the current time. This should roll the time back to + the start of the time window for the current rollpoint. Then we add 1 window + worth of time and get the start time of the next window for the rollpoint. + + + + + + The actual formatted filename that is currently being written to + or will be the file transferred to on roll over + (based on staticLogFileName). + + + + + The timestamp when we shall next recompute the filename. + + + + + Holds date of last roll over + + + + + The type of rolling done + + + + + How many sized based backups have been made so far + + + + + The rolling mode used in this appender. + + + + + Cache flag set if we are rolling by date. + + + + + Cache flag set if we are rolling by size. + + + + + FileName provided in configuration. Used for rolling properly + + + + + A mutex that is used to lock rolling of files. + + + + + The 1st of January 1970 in UTC + + + + + This interface is used to supply Date/Time information to the . + + + This interface is used to supply Date/Time information to the . + Used primarily to allow test classes to plug themselves in so they can + supply test date/times. + + + + + Gets the current time. + + The current time. + + + Gets the current time. + + + + + + Default implementation of that returns the current time. + + + + + Gets the current time. + + The current time. + + + Gets the current time. + + + + + + Implementation of that returns the current time as the coordinated universal time (UTC). + + + + + Gets the current time. + + The current time. + + + Gets the current time. + + + + + + Send an e-mail when a specific logging event occurs, typically on errors + or fatal errors. + + + + The number of logging events delivered in this e-mail depend on + the value of option. The + keeps only the last + logging events in its + cyclic buffer. This keeps memory requirements at a reasonable level while + still delivering useful application context. + + + Authentication is supported by setting the property to + either or . + If using authentication then the + and properties must also be set. + + + To set the SMTP server port use the property. The default port is 25. + + + Nicko Cadell + Gert Driesen + + + + Default constructor + + + + Default constructor + + + + + + Gets or sets a comma-delimited list of recipient e-mail addresses. + + + + + Gets or sets a comma-delimited list of recipient e-mail addresses + that will be carbon copied. + + + + + Gets or sets a semicolon-delimited list of recipient e-mail addresses + that will be blind carbon copied. + + + A semicolon-delimited list of e-mail addresses. + + + + A semicolon-delimited list of recipient e-mail addresses. + + + + + + Gets or sets the e-mail address of the sender. + + + The e-mail address of the sender. + + + + The e-mail address of the sender. + + + + + + Gets or sets the subject line of the e-mail message. + + + The subject line of the e-mail message. + + + + The subject line of the e-mail message. + + + + + + Gets or sets the name of the SMTP relay mail server to use to send + the e-mail messages. + + + The name of the e-mail relay server. If SmtpServer is not set, the + name of the local SMTP server is used. + + + + The name of the e-mail relay server. If SmtpServer is not set, the + name of the local SMTP server is used. + + + + + + The mode to use to authentication with the SMTP server + + + + Valid Authentication mode values are: , + , and . + The default value is . When using + you must specify the + and to use to authenticate. + When using the Windows credentials for the current + thread, if impersonating, or the process will be used to authenticate. + + + + + + The username to use to authenticate with the SMTP server + + + + A and must be specified when + is set to , + otherwise the username will be ignored. + + + + + + The password to use to authenticate with the SMTP server + + + + A and must be specified when + is set to , + otherwise the password will be ignored. + + + + + + The port on which the SMTP server is listening + + + + The port on which the SMTP server is listening. The default + port is 25. + + + + + + Gets or sets the priority of the e-mail message + + + One of the values. + + + + Sets the priority of the e-mails generated by this + appender. The default priority is . + + + If you are using this appender to report errors then + you may want to set the priority to . + + + + + + Enable or disable use of SSL when sending e-mail message + + + This is available on MS .NET 2.0 runtime and higher + + + + + Gets or sets the reply-to e-mail address. + + + + + Gets or sets the subject encoding to be used. + + + The default encoding is the operating system's current ANSI codepage. + + + + + Gets or sets the body encoding to be used. + + + The default encoding is the operating system's current ANSI codepage. + + + + + Sends the contents of the cyclic buffer as an e-mail message. + + The logging events to send. + + + + This appender requires a to be set. + + + + + Send the email message + + the body text to include in the mail + + + + Values for the property. + + + + SMTP authentication modes. + + + + + + No authentication + + + + + Basic authentication. + + + Requires a username and password to be supplied + + + + + Integrated authentication + + + Uses the Windows credentials from the current thread or process to authenticate. + + + + + Trims leading and trailing commas or semicolons + + + + + Send an email when a specific logging event occurs, typically on errors + or fatal errors. Rather than sending via smtp it writes a file into the + directory specified by . This allows services such + as the IIS SMTP agent to manage sending the messages. + + + + The configuration for this appender is identical to that of the SMTPAppender, + except that instead of specifying the SMTPAppender.SMTPHost you specify + . + + + The number of logging events delivered in this e-mail depend on + the value of option. The + keeps only the last + logging events in its + cyclic buffer. This keeps memory requirements at a reasonable level while + still delivering useful application context. + + + Niall Daley + Nicko Cadell + + + + Gets or sets a semicolon-delimited list of recipient e-mail addresses. + + + + + Gets or sets the e-mail address of the sender. + + + + + Gets or sets the subject line of the e-mail message. + + + + + Gets or sets the path to write the messages to. + + + + Gets or sets the path to write the messages to. This should be the same + as that used by the agent sending the messages. + + + + + + Gets or sets the file extension for the generated files + + + + + Gets or sets the used to write to the pickup directory. + + + The used to write to the pickup directory. + + + + Unless a specified here for this appender + the is queried for the + security context to use. The default behavior is to use the security context + of the current thread. + + + + + + Sends the contents of the cyclic buffer as an e-mail message. + + The logging events to send. + + + Sends the contents of the cyclic buffer as an e-mail message. + + + + + + Activate the options on this appender. + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + This appender requires a to be set. + + + + + Convert a path into a fully qualified path. + + The path to convert. + The fully qualified path. + + + Converts the path specified to a fully + qualified path. If the path is relative it is + taken as relative from the application base + directory. + + + + + + Appender that allows clients to connect via Telnet to receive log messages + + + + The TelnetAppender accepts socket connections and streams logging messages back to the client. + The output is provided in a telnet-friendly way so that a log can be monitored over a TCP/IP socket. + This allows simple remote monitoring of application logging. + + + The default is 23 (the telnet port). + + + Keith Long + Nicko Cadell + + + + The fully qualified type of the TelnetAppender class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Gets or sets the TCP port number on which this will listen for connections. + + + An integer value in the range to + indicating the TCP port number on which this will listen for connections. + + + + The default value is 23 (the telnet port). + + + The value specified is less than + or greater than . + + + + Overrides the parent method to close the socket handler + + + + Closes all the outstanding connections. + + + + + + This appender requires a to be set. + + + + + Create the socket handler and wait for connections + + + + + Writes the logging event to each connected client. + + The event to log. + + + + Helper class to manage connected clients + + + + The SocketHandler class is used to accept connections from clients. + It is threaded so that clients can connect/disconnect asynchronously. + + + + + + Class that represents a client connected to this handler + + + + + Create this for the specified + + the client's socket + + + Opens a stream writer on the socket. + + + + + + Writes a string to the client. + + string to send + + + + Cleans up the client connection. + + + + + Opens a new server port on + + the local port to listen on for connections + + + Creates a socket handler on the specified local server port. + + + + + + Sends a string message to each of the connected clients. + + the text to send + + + + Add a client to the internal clients list + + client to add + + + + Remove a client from the internal clients list + + client to remove + + + + Test if this handler has active connections + + + + + Callback used to accept a connection on the server socket + + The result of the asynchronous operation + + + On connection adds to the list of connections + if there are too many open connections you will be disconnected + + + + + + Closes all network connections + + + + + Sends logging events to a . + + + + An Appender that writes to a . + + + This appender may be used stand alone if initialized with an appropriate + writer, however it is typically used as a base class for an appender that + can open a to write to. + + + Nicko Cadell + Gert Driesen + Douglas de la Torre + + + + Gets or set whether the appender will flush at the end + of each append operation. + + + + The default behavior is to flush at the end of each + append operation. + + + If this option is set to false, then the underlying + stream can defer persisting the logging event to a later + time. + + + + Avoiding the flush operation at the end of each append results in + a performance gain of 10 to 20 percent. However, there is a safety + trade-off involved in skipping flushing. Indeed, when flushing is + skipped, then it is likely that the last few log events will not + be recorded on disk when the application exits. This is a high + price to pay even for a 20% performance gain. + + + + + Sets the where the log output will go. + + + + The specified must be open and writable. + + + The will be closed when the appender + instance is closed. + + + Note: Logging to an unopened will fail. + + + + + + This method determines if there is a sense in attempting to append. + + + + This method checks if an output target has been set and if a + layout has been set. + + + false if any of the preconditions fail. + + + + This method is called by the + method. + + The event to log. + + + Writes a log statement to the output stream if the output stream exists + and is writable. + + + The format of the output will depend on the appender's layout. + + + + + + This method is called by the + method. + + The array of events to log. + + + This method writes all the bulk logged events to the output writer + before flushing the stream. + + + + + + Close this appender instance. The underlying stream or writer is also closed. + + + Closed appenders cannot be reused. + + + + + Gets or set the and the underlying + , if any, for this appender. + + + The for this appender. + + + + + This appender requires a to be set. + + + + + Writes the footer and closes the underlying . + + + + + Closes the underlying . + + + + + Clears internal references to the underlying + and other variables. + + + + Subclasses can override this method for an alternate closing behavior. + + + + + + Writes a footer as produced by the embedded layout's property. + + + + Writes a footer as produced by the embedded layout's property. + + + + + + Writes a header produced by the embedded layout's property. + + + + Writes a header produced by the embedded layout's property. + + + + + + Called to allow a subclass to lazily initialize the writer + + + + This method is called when an event is logged and the or + have not been set. This allows a subclass to + attempt to initialize the writer multiple times. + + + + + + Gets or sets the where logging events + will be written to. + + + The where logging events are written. + + + + This is the where logging events + will be written to. + + + + + + The fully qualified type of the TextWriterAppender class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Flushes any buffered log data. + + The maximum time to wait for logging events to be flushed. + True if all logging events were flushed successfully, else false. + + + + Appends log events to the system. + + + + The application configuration file can be used to control what listeners + are actually used. See the MSDN documentation for the + class for details on configuring the + trace system. + + + Events are written using the System.Diagnostics.Trace.Write(string,string) + method. The event's logger name is the default value for the category parameter + of the Write method. + + + Compact Framework
+ The Compact Framework does not support the + class for any operation except Assert. When using the Compact Framework this + appender will write to the system rather than + the Trace system. This appender will therefore behave like the . +
+
+ Douglas de la Torre + Nicko Cadell + Gert Driesen + Ron Grabowski +
+ + + Gets or sets a value that indicates whether the appender will + flush at the end of each write. + + + The default behavior is to flush at the end of each + write. If the option is set tofalse, then the underlying + stream can defer writing to physical medium to a later time. + + + Avoiding the flush operation at the end of each append results + in a performance gain of 10 to 20 percent. However, there is safety + trade-off involved in skipping flushing. Indeed, when flushing is + skipped, then it is likely that the last few log events will not + be recorded on disk when the application exits. This is a high + price to pay even for a 20% performance gain. + + + + + + The category parameter sent to the Trace method. + + + + Defaults to %logger which will use the logger name of the current + as the category parameter. + + + + + + Writes the logging event to the system. + + The event to log. + + + + This appender requires a to be set. + + + + + Flushes any buffered log data. + + The maximum time to wait for logging events to be flushed. + True if all logging events were flushed successfully, else false. + + + + Sends logging events as connectionless UDP datagrams to a remote host or a + multicast group using an . + + + + UDP guarantees neither that messages arrive, nor that they arrive in the correct order. + + + To view the logging results, a custom application can be developed that listens for logging + events. + + + When decoding events send via this appender remember to use the same encoding + to decode the events as was used to send the events. See the + property to specify the encoding to use. + + + + This example shows how to log receive logging events that are sent + on IP address 244.0.0.1 and port 8080 to the console. The event is + encoded in the packet as a unicode string and it is decoded as such. + + IPEndPoint remoteEndPoint = new IPEndPoint(IPAddress.Any, 0); + UdpClient udpClient; + byte[] buffer; + string loggingEvent; + + try + { + udpClient = new UdpClient(8080); + + while(true) + { + buffer = udpClient.Receive(ref remoteEndPoint); + loggingEvent = System.Text.Encoding.Unicode.GetString(buffer); + Console.WriteLine(loggingEvent); + } + } + catch(Exception e) + { + Console.WriteLine(e.ToString()); + } + + + Dim remoteEndPoint as IPEndPoint + Dim udpClient as UdpClient + Dim buffer as Byte() + Dim loggingEvent as String + + Try + remoteEndPoint = new IPEndPoint(IPAddress.Any, 0) + udpClient = new UdpClient(8080) + + While True + buffer = udpClient.Receive(ByRef remoteEndPoint) + loggingEvent = System.Text.Encoding.Unicode.GetString(buffer) + Console.WriteLine(loggingEvent) + Wend + Catch e As Exception + Console.WriteLine(e.ToString()) + End Try + + + An example configuration section to log information using this appender to the + IP 224.0.0.1 on port 8080: + + + + + + + + + + Gert Driesen + Nicko Cadell + + + + Initializes a new instance of the class. + + + The default constructor initializes all fields to their default values. + + + + + Gets or sets the IP address of the remote host or multicast group to which + the underlying should sent the logging event. + + + The IP address of the remote host or multicast group to which the logging event + will be sent. + + + + Multicast addresses are identified by IP class D addresses (in the range 224.0.0.0 to + 239.255.255.255). Multicast packets can pass across different networks through routers, so + it is possible to use multicasts in an Internet scenario as long as your network provider + supports multicasting. + + + Hosts that want to receive particular multicast messages must register their interest by joining + the multicast group. Multicast messages are not sent to networks where no host has joined + the multicast group. Class D IP addresses are used for multicast groups, to differentiate + them from normal host addresses, allowing nodes to easily detect if a message is of interest. + + + Static multicast addresses that are needed globally are assigned by IANA. A few examples are listed in the table below: + + + + + IP Address + Description + + + 224.0.0.1 + + + Sends a message to all system on the subnet. + + + + + 224.0.0.2 + + + Sends a message to all routers on the subnet. + + + + + 224.0.0.12 + + + The DHCP server answers messages on the IP address 224.0.0.12, but only on a subnet. + + + + + + + A complete list of actually reserved multicast addresses and their owners in the ranges + defined by RFC 3171 can be found at the IANA web site. + + + The address range 239.0.0.0 to 239.255.255.255 is reserved for administrative scope-relative + addresses. These addresses can be reused with other local groups. Routers are typically + configured with filters to prevent multicast traffic in this range from flowing outside + of the local network. + + + + + + Gets or sets the TCP port number of the remote host or multicast group to which + the underlying should sent the logging event. + + + An integer value in the range to + indicating the TCP port number of the remote host or multicast group to which the logging event + will be sent. + + + The underlying will send messages to this TCP port number + on the remote host or multicast group. + + The value specified is less than or greater than . + + + + Gets or sets the TCP port number from which the underlying will communicate. + + + An integer value in the range to + indicating the TCP port number from which the underlying will communicate. + + + + The underlying will bind to this port for sending messages. + + + Setting the value to 0 (the default) will cause the udp client not to bind to + a local port. + + + The value specified is less than or greater than . + + + + Gets or sets used to write the packets. + + + The used to write the packets. + + + + The used to write the packets. + + + + + + Gets or sets the underlying . + + + The underlying . + + + creates a to send logging events + over a network. Classes deriving from can use this + property to get or set this . Use the underlying + returned from if you require access beyond that which + provides. + + + + + Gets or sets the cached remote endpoint to which the logging events should be sent. + + + The method will initialize the remote endpoint + with the values of the and + properties. + + + + + Initialize the appender based on the options set. + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + The appender will be ignored if no was specified or + an invalid remote or local TCP port number was specified. + + + The required property was not specified. + The TCP port number assigned to or is less than or greater than . + + + + This method is called by the method. + + The event to log. + + + Sends the event using an UDP datagram. + + + Exceptions are passed to the . + + + + + + This appender requires a to be set. + + + + + Closes the UDP connection and releases all resources associated with + this instance. + + + + Disables the underlying and releases all managed + and unmanaged resources associated with the . + + + + + + Initializes the underlying connection. + + + + The underlying is initialized and binds to the + port number from which you intend to communicate. + + + Exceptions are passed to the . + + + + + + The TCP port number of the remote host or multicast group to + which the logging event will be sent. + + + + + The TCP port number from which the will communicate. + + + + + Assembly level attribute that specifies a repository to alias to this assembly's repository. + + + + An assembly's logger repository is defined by its , + however this can be overridden by an assembly loaded before the target assembly. + + + An assembly can alias another assembly's repository to its repository by + specifying this attribute with the name of the target repository. + + + This attribute can only be specified on the assembly and may be used + as many times as necessary to alias all the required repositories. + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class with + the specified repository to alias to this assembly's repository. + + The repository to alias to this assemby's repository. + + + + Gets or sets the repository to alias to this assemby's repository. + + + + + Use this class to quickly configure a . + + + + Allows very simple programmatic configuration of log4net. + + + Only one appender can be configured using this configurator. + The appender is set at the root of the hierarchy and all logging + events will be delivered to that appender. + + + Appenders can also implement the interface. Therefore + they would require that the method + be called after the appenders properties have been configured. + + + Nicko Cadell + Gert Driesen + + + + The fully qualified type of the BasicConfigurator class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Initializes the log4net system with a default configuration. + + + + Initializes the log4net logging system using a + that will write to Console.Out. The log messages are + formatted using the layout object + with the + layout style. + + + + + + Initializes the log4net system using the specified appenders. + + The appenders to use to log all logging events. + + + Initializes the log4net system using the specified appenders. + + + + + + Initializes the with a default configuration. + + The repository to configure. + + + Initializes the specified repository using a + that will write to Console.Out. The log messages are + formatted using the layout object + with the + layout style. + + + + + + Initializes the using the specified appenders. + + The repository to configure. + The appenders to use to log all logging events. + + + Initializes the using the specified appender. + + + + + + Base class for all log4net configuration attributes. + + + This is an abstract class that must be extended by + specific configurators. This attribute allows the + configurator to be parameterized by an assembly level + attribute. + + Nicko Cadell + Gert Driesen + + + + Constructor used by subclasses. + + the ordering priority for this configurator + + + The is used to order the configurator + attributes before they are invoked. Higher priority configurators are executed + before lower priority ones. + + + + + + Configures the for the specified assembly. + + The assembly that this attribute was defined on. + The repository to configure. + + + Abstract method implemented by a subclass. When this method is called + the subclass should configure the . + + + + + + Compare this instance to another ConfiguratorAttribute + + the object to compare to + see + + + Compares the priorities of the two instances. + Sorts by priority in descending order. Objects with the same priority are + randomly ordered. + + + + + + Class to register for the log4net section of the configuration file + + + The log4net section of the configuration file needs to have a section + handler registered. This is the section handler used. It simply returns + the XML element that is the root of the section. + + + Example of registering the log4net section handler : + + + +
+ + + log4net configuration XML goes here + + + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + + Default constructor. + + + + + + Parses the configuration section. + + The configuration settings in a corresponding parent configuration section. + The configuration context when called from the ASP.NET configuration system. Otherwise, this parameter is reserved and is a null reference. + The for the log4net section. + The for the log4net section. + + + Returns the containing the configuration data, + + + + + + Assembly level attribute that specifies a plugin to attach to + the repository. + + + + Specifies the type of a plugin to create and attach to the + assembly's repository. The plugin type must implement the + interface. + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class + with the specified type. + + The type name of plugin to create. + + + Create the attribute with the plugin type specified. + + + Where possible use the constructor that takes a . + + + + + + Initializes a new instance of the class + with the specified type. + + The type of plugin to create. + + + Create the attribute with the plugin type specified. + + + + + + Gets or sets the type for the plugin. + + + + + Gets or sets the type name for the plugin. + + + + Where possible use the property instead. + + + + + + Creates the plugin object defined by this attribute. + + The plugin object. + + + + + + + Assembly level attribute that specifies the logging repository for the assembly. + + + + Assemblies are mapped to logging repository. This attribute specified + on the assembly controls + the configuration of the repository. The property specifies the name + of the repository that this assembly is a part of. The + specifies the type of the object + to create for the assembly. If this attribute is not specified or a + is not specified then the assembly will be part of the default shared logging repository. + + + This attribute can only be specified on the assembly and may only be used + once per assembly. + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + + Default constructor. + + + + + + Initialize a new instance of the class + with the name of the repository. + + The name of the repository. + + + Initialize the attribute with the name for the assembly's repository. + + + + + + Gets or sets the name of the logging repository. + + + The string name to use as the name of the repository associated with this + assembly. + + + + This value does not have to be unique. Several assemblies can share the + same repository. They will share the logging configuration of the repository. + + + + + + Gets or sets the type of repository to create for this assembly. + + + The type of repository to create for this assembly. + + + + The type of the repository to create for the assembly. + The type must implement the + interface. + + + This will be the type of repository created when + the repository is created. If multiple assemblies reference the + same repository then the repository is only created once using the + of the first assembly to call into the + repository. + + + + + + Assembly level attribute to configure the . + + the type of the provider to use + + + This attribute may only be used at the assembly scope and can only + be used once per assembly. + + + Use this attribute to configure the + without calling one of the + methods. + + + Nicko Cadell + + + + Assembly level attribute to configure the . + + the type of the provider to use + + + This attribute may only be used at the assembly scope and can only + be used once per assembly. + + + Use this attribute to configure the + without calling one of the + methods. + + + Nicko Cadell + + + + Gets or sets the type of the provider to use. + + + + The provider specified must subclass the + class. + + + + + + Configures the SecurityContextProvider + + The assembly that this attribute was defined on. + The repository to configure. + + + Creates a provider instance from the specified. + Sets this as the default security context provider . + + + + + + The fully qualified type of the SecurityContextProviderAttribute class. + + + Used by the internal logger to record the Type of the log message. + + + + + Configures a using an XML tree. + + Nicko Cadell + Gert Driesen + + + + Automatically configures the using settings + stored in the application's configuration file. + + + + Each application has a configuration file. This has the + same name as the application with '.config' appended. + This file is XML and calling this function prompts the + configurator to look in that file for a section called + log4net that contains the configuration data. + + + To use this method to configure log4net you must specify + the section + handler for the log4net configuration section. See the + for an example. + + + The repository to configure. + + + + Automatically configures the log4net system based on the + application's configuration settings. + + + + Each application has a configuration file. This has the + same name as the application with '.config' appended. + This file is XML and calling this function prompts the + configurator to look in that file for a section called + log4net that contains the configuration data. + + + To use this method to configure log4net you must specify + the section + handler for the log4net configuration section. See the + for an example. + + + + + + + Configures log4net using a log4net element + + + + Loads the log4net configuration from the XML element + supplied as . + + + The element to parse. + + + + Configures log4net using the specified configuration file. + + The XML file to load the configuration from. + + + The configuration file must be valid XML. It must contain + at least one element called log4net that holds + the log4net configuration data. + + + The log4net configuration file can possibly be specified in the application's + configuration file (either MyAppName.exe.config for a + normal application on Web.config for an ASP.NET application). + + + The first element matching <configuration> will be read as the + configuration. If this file is also a .NET .config file then you must specify + a configuration section for the log4net element otherwise .NET will + complain. Set the type for the section handler to , for example: + + +
+ + + + + The following example configures log4net using a configuration file, of which the + location is stored in the application's configuration file : + + + using log4net.Config; + using System.IO; + using System.Configuration; + + ... + + XmlConfigurator.Configure(new FileInfo(ConfigurationSettings.AppSettings["log4net-config-file"])); + + + In the .config file, the path to the log4net can be specified like this : + + + + + + + + + + + + + Configures log4net using the specified configuration URI. + + A URI to load the XML configuration from. + + + The configuration data must be valid XML. It must contain + at least one element called log4net that holds + the log4net configuration data. + + + The must support the URI scheme specified. + + + + + + Configures log4net using the specified configuration data stream. + + A stream to load the XML configuration from. + + + The configuration data must be valid XML. It must contain + at least one element called log4net that holds + the log4net configuration data. + + + Note that this method will NOT close the stream parameter. + + + + + + Configures the using the specified XML + element. + + + Loads the log4net configuration from the XML element + supplied as . + + The repository to configure. + The element to parse. + + + + Configures the using the specified configuration + file. + + The repository to configure. + The XML file to load the configuration from. + + + The configuration file must be valid XML. It must contain + at least one element called log4net that holds + the configuration data. + + + The log4net configuration file can possibly be specified in the application's + configuration file (either MyAppName.exe.config for a + normal application on Web.config for an ASP.NET application). + + + The first element matching <configuration> will be read as the + configuration. If this file is also a .NET .config file then you must specify + a configuration section for the log4net element otherwise .NET will + complain. Set the type for the section handler to , for example: + + +
+ + + + + The following example configures log4net using a configuration file, of which the + location is stored in the application's configuration file : + + + using log4net.Config; + using System.IO; + using System.Configuration; + + ... + + XmlConfigurator.Configure(new FileInfo(ConfigurationSettings.AppSettings["log4net-config-file"])); + + + In the .config file, the path to the log4net can be specified like this : + + + + + + + + + + + + + Configures the using the specified configuration + URI. + + The repository to configure. + A URI to load the XML configuration from. + + + The configuration data must be valid XML. It must contain + at least one element called log4net that holds + the configuration data. + + + The must support the URI scheme specified. + + + + + + Configures the using the specified configuration + file. + + The repository to configure. + The stream to load the XML configuration from. + + + The configuration data must be valid XML. It must contain + at least one element called log4net that holds + the configuration data. + + + Note that this method will NOT close the stream parameter. + + + + + + Configures log4net using the file specified, monitors the file for changes + and reloads the configuration if a change is detected. + + The XML file to load the configuration from. + + + The configuration file must be valid XML. It must contain + at least one element called log4net that holds + the configuration data. + + + The configuration file will be monitored using a + and depends on the behavior of that class. + + + For more information on how to configure log4net using + a separate configuration file, see . + + + + + + + Configures the using the file specified, + monitors the file for changes and reloads the configuration if a change + is detected. + + The repository to configure. + The XML file to load the configuration from. + + + The configuration file must be valid XML. It must contain + at least one element called log4net that holds + the configuration data. + + + The configuration file will be monitored using a + and depends on the behavior of that class. + + + For more information on how to configure log4net using + a separate configuration file, see . + + + + + + + Class used to watch config files. + + + + Uses the to monitor + changes to a specified file. Because multiple change notifications + may be raised when the file is modified, a timer is used to + compress the notifications into a single event. The timer + waits for time before delivering + the event notification. If any further + change notifications arrive while the timer is waiting it + is reset and waits again for to + elapse. + + + + + + Holds the FileInfo used to configure the XmlConfigurator + + + + + Holds the repository being configured. + + + + + The timer used to compress the notification events. + + + + + The default amount of time to wait after receiving notification + before reloading the config file. + + + + + Watches file for changes. This object should be disposed when no longer + needed to free system handles on the watched resources. + + + + + Initializes a new instance of the class to + watch a specified config file used to configure a repository. + + The repository to configure. + The configuration file to watch. + + + Initializes a new instance of the class. + + + + + + Event handler used by . + + The firing the event. + The argument indicates the file that caused the event to be fired. + + + This handler reloads the configuration from the file when the event is fired. + + + + + + Event handler used by . + + The firing the event. + The argument indicates the file that caused the event to be fired. + + + This handler reloads the configuration from the file when the event is fired. + + + + + + Called by the timer when the configuration has been updated. + + null + + + + Release the handles held by the watcher and timer. + + + + + Configures the specified repository using a log4net element. + + The hierarchy to configure. + The element to parse. + + + Loads the log4net configuration from the XML element + supplied as . + + + This method is ultimately called by one of the Configure methods + to load the configuration from an . + + + + + + Maps repository names to ConfigAndWatchHandler instances to allow a particular + ConfigAndWatchHandler to dispose of its FileSystemWatcher when a repository is + reconfigured. + + + + + The fully qualified type of the XmlConfigurator class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Assembly level attribute to configure the . + + + + This attribute may only be used at the assembly scope and can only + be used once per assembly. + + + Use this attribute to configure the + without calling one of the + methods. + + + If neither of the or + properties are set the configuration is loaded from the application's .config file. + If set the property takes priority over the + property. The property + specifies a path to a file to load the config from. The path is relative to the + application's base directory; . + The property is used as a postfix to the assembly file name. + The config file must be located in the application's base directory; . + For example in a console application setting the to + config has the same effect as not specifying the or + properties. + + + The property can be set to cause the + to watch the configuration file for changes. + + + + Log4net will only look for assembly level configuration attributes once. + When using the log4net assembly level attributes to control the configuration + of log4net you must ensure that the first call to any of the + methods is made from the assembly with the configuration + attributes. + + + If you cannot guarantee the order in which log4net calls will be made from + different assemblies you must use programmatic configuration instead, i.e. + call the method directly. + + + + Nicko Cadell + Gert Driesen + + + + Default constructor + + + + Default constructor + + + + + + Gets or sets the filename of the configuration file. + + + The filename of the configuration file. + + + + If specified, this is the name of the configuration file to use with + the . This file path is relative to the + application base directory (). + + + The takes priority over the . + + + + + + Gets or sets the extension of the configuration file. + + + + If specified this is the extension for the configuration file. + The path to the config file is built by using the application + base directory (), + the assembly file name and the config file extension. + + + If the is set to MyExt then + possible config file names would be: MyConsoleApp.exe.MyExt or + MyClassLibrary.dll.MyExt. + + + The takes priority over the . + + + + + + Gets or sets a value indicating whether to watch the configuration file. + + + true if the configuration should be watched, false otherwise. + + + + If this flag is specified and set to true then the framework + will watch the configuration file and will reload the config each time + the file is modified. + + + The config file can only be watched if it is loaded from local disk. + In a No-Touch (Smart Client) deployment where the application is downloaded + from a web server the config file may not reside on the local disk + and therefore it may not be able to watch it. + + + Watching configuration is not supported on the SSCLI. + + + + + + Configures the for the specified assembly. + + The assembly that this attribute was defined on. + The repository to configure. + + + Configure the repository using the . + The specified must extend the + class otherwise the will not be able to + configure it. + + + The does not extend . + + + + Attempt to load configuration from the local file system + + The assembly that this attribute was defined on. + The repository to configure. + + + + Configure the specified repository using a + + The repository to configure. + the FileInfo pointing to the config file + + + + Attempt to load configuration from a URI + + The repository to configure. + + + + The fully qualified type of the XmlConfiguratorAttribute class. + + + Used by the internal logger to record the Type of the + log message. + + + + + The default implementation of the interface. + + + + Uses attributes defined on the calling assembly to determine how to + configure the hierarchy for the repository. + + + Nicko Cadell + Gert Driesen + + + + Event to notify that a logger repository has been created. + + + Event to notify that a logger repository has been created. + + + + Event raised when a new repository is created. + The event source will be this selector. The event args will + be a which + holds the newly created . + + + + + + Creates a new repository selector. + + The type of the repositories to create, must implement + + + Create a new repository selector. + The default type for repositories must be specified, + an appropriate value would be . + + + is . + does not implement . + + + + Gets the for the specified assembly. + + The assembly use to look up the . + + + The type of the created and the repository + to create can be overridden by specifying the + attribute on the . + + + The default values are to use the + implementation of the interface and to use the + as the name of the repository. + + + The created will be automatically configured using + any attributes defined on + the . + + + The for the assembly + is . + + + + Gets the for the specified repository. + + The repository to use to look up the . + The for the specified repository. + + + Returns the named repository. If is null + a is thrown. If the repository + does not exist a is thrown. + + + Use to create a repository. + + + is . + does not exist. + + + + Creates a new repository for the assembly specified + + the assembly to use to create the repository to associate with the . + The type of repository to create, must implement . + The repository created. + + + The created will be associated with the repository + specified such that a call to with the + same assembly specified will return the same repository instance. + + + The type of the created and + the repository to create can be overridden by specifying the + attribute on the + . The default values are to use the + implementation of the + interface and to use the + as the name of the repository. + + + The created will be automatically + configured using any + attributes defined on the . + + + If a repository for the already exists + that repository will be returned. An error will not be raised and that + repository may be of a different type to that specified in . + Also the attribute on the + assembly may be used to override the repository type specified in + . + + + is . + + + + Creates a new repository for the assembly specified. + + the assembly to use to create the repository to associate with the . + The type of repository to create, must implement . + The name to assign to the created repository + Set to true to read and apply the assembly attributes + The repository created. + + + The created will be associated with the repository + specified such that a call to with the + same assembly specified will return the same repository instance. + + + The type of the created and + the repository to create can be overridden by specifying the + attribute on the + . The default values are to use the + implementation of the + interface and to use the + as the name of the repository. + + + The created will be automatically + configured using any + attributes defined on the . + + + If a repository for the already exists + that repository will be returned. An error will not be raised and that + repository may be of a different type to that specified in . + Also the attribute on the + assembly may be used to override the repository type specified in + . + + + is . + + + + Creates a new repository for the specified repository. + + The repository to associate with the . + The type of repository to create, must implement . + If this param is then the default repository type is used. + The new repository. + + + The created will be associated with the repository + specified such that a call to with the + same repository specified will return the same repository instance. + + + is . + already exists. + + + + Test if a named repository exists + + the named repository to check + true if the repository exists + + + Test if a named repository exists. Use + to create a new repository and to retrieve + a repository. + + + + + + Gets a list of objects + + an array of all known objects + + + Gets an array of all repositories created by this selector. + + + + + + Aliases a repository to an existing repository. + + The repository to alias. + The repository that the repository is aliased to. + + + The repository specified will be aliased to the repository when created. + The repository must not already exist. + + + When the repository is created it must utilize the same repository type as + the repository it is aliased to, otherwise the aliasing will fail. + + + + is . + -or- + is . + + + + + Notifies the registered listeners that the repository has been created. + + The repository that has been created. + + + Raises the event. + + + + + + Gets the repository name and repository type for the specified assembly. + + The assembly that has a . + in/out param to hold the repository name to use for the assembly, caller should set this to the default value before calling. + in/out param to hold the type of the repository to create for the assembly, caller should set this to the default value before calling. + is . + + + + Configures the repository using information from the assembly. + + The assembly containing + attributes which define the configuration for the repository. + The repository to configure. + + is . + -or- + is . + + + + + Loads the attribute defined plugins on the assembly. + + The assembly that contains the attributes. + The repository to add the plugins to. + + is . + -or- + is . + + + + + Loads the attribute defined aliases on the assembly. + + The assembly that contains the attributes. + The repository to alias to. + + is . + -or- + is . + + + + + The fully qualified type of the DefaultRepositorySelector class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Defined error codes that can be passed to the method. + + + + Values passed to the method. + + + Nicko Cadell + + + + A general error + + + + + Error while writing output + + + + + Failed to flush file + + + + + Failed to close file + + + + + Unable to open output file + + + + + No layout specified + + + + + Failed to parse address + + + + + An evaluator that triggers on an Exception type + + + + This evaluator will trigger if the type of the Exception + passed to + is equal to a Type in . /// + + + Drew Schaeffer + + + + Default ctor to allow dynamic creation through a configurator. + + + + + Constructs an evaluator and initializes to trigger on + + the type that triggers this evaluator. + If true, this evaluator will trigger on subclasses of . + + + + The type that triggers this evaluator. + + + + + If true, this evaluator will trigger on subclasses of . + + + + + Is this the triggering event? + + The event to check + This method returns true, if the logging event Exception + Type is . + Otherwise it returns false + + + This evaluator will trigger if the Exception Type of the event + passed to + is . + + + + + + Flags passed to the property + + Nicko Cadell + + + + Fix the MDC + + + + + Fix the NDC + + + + + Fix the rendered message + + + + + Fix the thread name + + + + + Fix the callers location information + + + CAUTION: Very slow to generate + + + + + Fix the callers windows user name + + + CAUTION: Slow to generate + + + + + Fix the domain friendly name + + + + + Fix the callers principal name + + + CAUTION: May be slow to generate + + + + + Fix the exception text + + + + + Fix the event properties. Active properties must implement in order to be eligible for fixing. + + + + + No fields fixed + + + + + All fields fixed + + + + + Partial fields fixed + + + + This set of partial fields gives good performance. The following fields are fixed: + + + + + + + + + + + + + Interface for attaching appenders to objects. + + + + Interface for attaching, removing and retrieving appenders. + + + Nicko Cadell + Gert Driesen + + + + Attaches an appender. + + The appender to add. + + + Add the specified appender. The implementation may + choose to allow or deny duplicate appenders. + + + + + + Gets all attached appenders. + + + A collection of attached appenders. + + + + Gets a collection of attached appenders. + If there are no attached appenders the + implementation should return an empty + collection rather than null. + + + + + + Gets an attached appender with the specified name. + + The name of the appender to get. + + The appender with the name specified, or null if no appender with the + specified name is found. + + + + Returns an attached appender with the specified. + If no appender with the specified name is found null will be + returned. + + + + + + Removes all attached appenders. + + + + Removes and closes all attached appenders + + + + + + Removes the specified appender from the list of attached appenders. + + The appender to remove. + The appender removed from the list + + + The appender removed is not closed. + If you are discarding the appender you must call + on the appender removed. + + + + + + Removes the appender with the specified name from the list of appenders. + + The name of the appender to remove. + The appender removed from the list + + + The appender removed is not closed. + If you are discarding the appender you must call + on the appender removed. + + + + + + Appenders may delegate their error handling to an . + + + + Error handling is a particularly tedious to get right because by + definition errors are hard to predict and to reproduce. + + + Nicko Cadell + Gert Driesen + + + + Handles the error and information about the error condition is passed as + a parameter. + + The message associated with the error. + The that was thrown when the error occurred. + The error code associated with the error. + + + Handles the error and information about the error condition is passed as + a parameter. + + + + + + Prints the error message passed as a parameter. + + The message associated with the error. + The that was thrown when the error occurred. + + + See . + + + + + + Prints the error message passed as a parameter. + + The message associated with the error. + + + See . + + + + + + Interface for objects that require fixing. + + + + Interface that indicates that the object requires fixing before it + can be taken outside the context of the appender's + method. + + + When objects that implement this interface are stored + in the context properties maps + and + are fixed + (see ) the + method will be called. + + + Nicko Cadell + + + + Get a portable version of this object + + the portable instance of this object + + + Get a portable instance object that represents the current + state of this object. The portable object can be stored + and logged from any thread with identical results. + + + + + + Interface that all loggers implement to support logging events and testing if a level + is enabled for logging. + + + + These methods will not throw exceptions. Note to implementers, ensure + that the implementation of these methods cannot allow an exception + to be thrown to the caller. + + + Nicko Cadell + Gert Driesen + + + + Gets the name of the logger. + + + + + Generates a logging event for the specified using + the and . + + The declaring type of the method that is + the stack boundary into the logging system for this call. + The level of the message to be logged. + The message object to log. + the exception to log, including its stack trace. Pass null to not log an exception. + + + This generic form is intended to be used by wrappers. + + + + + + Logs the specified logging event through this logger. + + The event being logged. + + + This is the most generic printing method that is intended to be used + by wrappers. + + + + + + Checks if this logger is enabled for a given passed as parameter. + + The level to check. + + true if this logger is enabled for level, otherwise false. + + + + + Gets the where this + Logger instance is attached to. + + + + + Base interface for all wrappers + + + + Base interface for all wrappers. + + + All wrappers must implement this interface. + + + Nicko Cadell + + + + Gets the object that implements this object. + + + + + + The Logger object may not be the same object as this object because of logger decorators. + This gets the actual underlying objects that is used to process the log events. + + + + + + Interface used to delay activate a configured object. + + + + This allows an object to defer activation of its options until all + options have been set. This is required for components which have + related options that remain ambiguous until all are set. + + + If a component implements this interface then the method + must be called by the container after its all the configured properties have been set + and before the component can be used. + + + Nicko Cadell + + + + Activate the options that were previously set with calls to properties. + + + + This allows an object to defer activation of its options until all + options have been set. This is required for components which have + related options that remain ambiguous until all are set. + + + If a component implements this interface then this method must be called + after its properties have been set before the component can be used. + + + + + + Delegate used to handle logger repository creation event notifications + + The which created the repository. + The event args + that holds the instance that has been created. + + + Delegate used to handle logger repository creation event notifications. + + + + + + Provides data for the event. + + the that has been created + + + A + event is raised every time a is created. + + + + + + Provides data for the event. + + the that has been created + + + A + event is raised every time a is created. + + + + + + The that has been created + + + The that has been created + + + + The that has been created + + + + + + Interface used by the to select the . + + + + The uses a + to specify the policy for selecting the correct + to return to the caller. + + + Nicko Cadell + Gert Driesen + + + + Gets the for the specified assembly. + + The assembly to use to look up to the + The for the assembly. + + + Gets the for the specified assembly. + + + How the association between and + is made is not defined. The implementation may choose any method for + this association. The results of this method must be repeatable, i.e. + when called again with the same arguments the result must be the + save value. + + + + + + Gets the named . + + The name to use to look up to the . + The named + + Lookup a named . This is the repository created by + calling . + + + + + Creates a new repository for the assembly specified. + + The assembly to use to create the domain to associate with the . + The type of repository to create, must implement . + The repository created. + + + The created will be associated with the domain + specified such that a call to with the + same assembly specified will return the same repository instance. + + + How the association between and + is made is not defined. The implementation may choose any method for + this association. + + + + + + Creates a new repository with the name specified. + + The name to associate with the . + The type of repository to create, must implement . + The repository created. + + + The created will be associated with the name + specified such that a call to with the + same name will return the same repository instance. + + + + + + Test if a named repository exists + + the named repository to check + true if the repository exists + + + Test if a named repository exists. Use + to create a new repository and to retrieve + a repository. + + + + + + Gets an array of all currently defined repositories. + + + An array of the instances created by + this . + + + Gets an array of all repositories created by this selector. + + + + + + Event to notify that a logger repository has been created. + + + Event to notify that a logger repository has been created. + + + + Event raised when a new repository is created. + The event source will be this selector. The event args will + be a which + holds the newly created . + + + + + + Test if an triggers an action + + + + Implementations of this interface allow certain appenders to decide + when to perform an appender specific action. + + + The action or behavior triggered is defined by the implementation. + + + Nicko Cadell + + + + Test if this event triggers the action + + The event to check + true if this event triggers the action, otherwise false + + + Return true if this event triggers the action + + + + + + Defines the default set of levels recognized by the system. + + + + Each has an associated . + + + Levels have a numeric that defines the relative + ordering between levels. Two Levels with the same + are deemed to be equivalent. + + + The levels that are recognized by log4net are set for each + and each repository can have different levels defined. The levels are stored + in the on the repository. Levels are + looked up by name from the . + + + When logging at level INFO the actual level used is not but + the value of LoggerRepository.LevelMap["INFO"]. The default value for this is + , but this can be changed by reconfiguring the level map. + + + Each level has a in addition to its . The + is the string that is written into the output log. By default + the display name is the same as the level name, but this can be used to alias levels + or to localize the log output. + + + Some of the predefined levels recognized by the system are: + + + + . + + + . + + + . + + + . + + + . + + + . + + + . + + + + Nicko Cadell + Gert Driesen + + + + Constructor + + Integer value for this level, higher values represent more severe levels. + The string name of this level. + The display name for this level. This may be localized or otherwise different from the name + + + Initializes a new instance of the class with + the specified level name and value. + + + + + + Constructor + + Integer value for this level, higher values represent more severe levels. + The string name of this level. + + + Initializes a new instance of the class with + the specified level name and value. + + + + + + Serialization constructor + + The that holds the serialized object data. + The that contains contextual information about the source or destination. + + + Initializes a new instance of the class + with serialized data. + + + + + + Gets the name of this level. + + + The name of this level. + + + + Gets the name of this level. + + + + + + Gets the value of this level. + + + + + Gets the display name of this level. + + + + + Returns the representation of the current + . + + + A representation of the current . + + + + Returns the level . + + + + + + + + + Compares levels. + + The object to compare against. + if the objects are equal. + + + + Returns a hash code + + A hash code for the current . + + + Returns a hash code suitable for use in hashing algorithms and data + structures like a hash table. + + + Returns the hash code of the level . + + + + + + + + + Compares this instance to a specified object and returns an + indication of their relative values. + + A instance or to compare with this instance. + + A 32-bit signed integer that indicates the relative order of the + values compared. The return value has these meanings: + + + Value + Meaning + + + Less than zero + This instance is less than . + + + Zero + This instance is equal to . + + + Greater than zero + + This instance is greater than . + -or- + is . + + + + + + + must be an instance of + or ; otherwise, an exception is thrown. + + + + + + Serializes this object into the provided. + + The to populate with data. + The destination for this serialization. + + + + Returns a value indicating whether a specified + is greater than another specified . + + A + A + + if is greater than + ; otherwise, . + + + + + Returns a value indicating whether a specified + is less than another specified . + + A + A + + if is less than + ; otherwise, . + + + + + Returns a value indicating whether a specified + is greater than or equal to another specified . + + A + A + + if is greater than or equal to + ; otherwise, . + + + + + Returns a value indicating whether a specified + is less than or equal to another specified . + + A + A + + if is less than or equal to + ; otherwise, . + + + + + Returns a value indicating whether two specified + objects have the same value. + + A or . + A or . + + if the value of is the same as the + value of ; otherwise, . + + + + + Returns a value indicating whether two specified + objects have different values. + + A or . + A or . + + if the value of is different from + the value of ; otherwise, . + + + + + Compares two specified instances. + + The first to compare. + The second to compare. + + A 32-bit signed integer that indicates the relative order of the + two values compared. The return value has these meanings: + + + Value + Meaning + + + Less than zero + is less than . + + + Zero + is equal to . + + + Greater than zero + is greater than . + + + + + + + The level designates a higher level than all the rest. + + + + + The level designates very severe error events. + System unusable, emergencies. + + + + + The level designates very severe error events. + System unusable, emergencies. + + + + + The level designates very severe error events + that will presumably lead the application to abort. + + + + + The level designates very severe error events. + Take immediate action, alerts. + + + + + The level designates very severe error events. + Critical condition, critical. + + + + + The level designates very severe error events. + + + + + The level designates error events that might + still allow the application to continue running. + + + + + The level designates potentially harmful + situations. + + + + + The level designates informational messages + that highlight the progress of the application at the highest level. + + + + + The level designates informational messages that + highlight the progress of the application at coarse-grained level. + + + + + The level designates fine-grained informational + events that are most useful to debug an application. + + + + + The level designates fine-grained informational + events that are most useful to debug an application. + + + + + The level designates fine-grained informational + events that are most useful to debug an application. + + + + + The level designates fine-grained informational + events that are most useful to debug an application. + + + + + The level designates fine-grained informational + events that are most useful to debug an application. + + + + + The level designates fine-grained informational + events that are most useful to debug an application. + + + + + The level designates the lowest level possible. + + + + + A strongly-typed collection of objects. + + Nicko Cadell + + + + Supports type-safe iteration over a . + + + + + Gets the current element in the collection. + + + + + Advances the enumerator to the next element in the collection. + + + true if the enumerator was successfully advanced to the next element; + false if the enumerator has passed the end of the collection. + + + The collection was modified after the enumerator was created. + + + + + Sets the enumerator to its initial position, before the first element in the collection. + + + + + Creates a read-only wrapper for a LevelCollection instance. + + list to create a readonly wrapper arround + + A LevelCollection wrapper that is read-only. + + + + + Initializes a new instance of the LevelCollection class + that is empty and has the default initial capacity. + + + + + Initializes a new instance of the LevelCollection class + that has the specified initial capacity. + + + The number of elements that the new LevelCollection is initially capable of storing. + + + + + Initializes a new instance of the LevelCollection class + that contains elements copied from the specified LevelCollection. + + The LevelCollection whose elements are copied to the new collection. + + + + Initializes a new instance of the LevelCollection class + that contains elements copied from the specified array. + + The array whose elements are copied to the new list. + + + + Initializes a new instance of the LevelCollection class + that contains elements copied from the specified collection. + + The collection whose elements are copied to the new list. + + + + Initializes a new instance of the LevelCollection class + that contains elements copied from the specified collection. + + The collection whose elements are copied to the new list. + + + + Type visible only to our subclasses + Used to access protected constructor + + + + + A value + + + + + Allow subclasses to avoid our default constructors + + + + + Gets the number of elements actually contained in the LevelCollection. + + + + + Copies the entire LevelCollection to a one-dimensional + array. + + The one-dimensional array to copy to. + + + + Copies the entire LevelCollection to a one-dimensional + array, starting at the specified index of the target array. + + The one-dimensional array to copy to. + The zero-based index in at which copying begins. + + + + Gets a value indicating whether access to the collection is synchronized (thread-safe). + + false, because the backing type is an array, which is never thread-safe. + + + + Gets an object that can be used to synchronize access to the collection. + + + + + Gets or sets the at the specified index. + + The zero-based index of the element to get or set. + + is less than zero + -or- + is equal to or greater than . + + + + + Adds a to the end of the LevelCollection. + + The to be added to the end of the LevelCollection. + The index at which the value has been added. + + + + Removes all elements from the LevelCollection. + + + + + Creates a shallow copy of the . + + A new with a shallow copy of the collection data. + + + + Determines whether a given is in the LevelCollection. + + The to check for. + true if is found in the LevelCollection; otherwise, false. + + + + Returns the zero-based index of the first occurrence of a + in the LevelCollection. + + The to locate in the LevelCollection. + + The zero-based index of the first occurrence of + in the entire LevelCollection, if found; otherwise, -1. + + + + + Inserts an element into the LevelCollection at the specified index. + + The zero-based index at which should be inserted. + The to insert. + + is less than zero + -or- + is equal to or greater than . + + + + + Removes the first occurrence of a specific from the LevelCollection. + + The to remove from the LevelCollection. + + The specified was not found in the LevelCollection. + + + + + Removes the element at the specified index of the LevelCollection. + + The zero-based index of the element to remove. + + is less than zero + -or- + is equal to or greater than . + + + + + Gets a value indicating whether the collection has a fixed size. + + true if the collection has a fixed size; otherwise, false. The default is false + + + + Gets a value indicating whether the IList is read-only. + + true if the collection is read-only; otherwise, false. The default is false + + + + Returns an enumerator that can iterate through the LevelCollection. + + An for the entire LevelCollection. + + + + Gets or sets the number of elements the LevelCollection can contain. + + + + + Adds the elements of another LevelCollection to the current LevelCollection. + + The LevelCollection whose elements should be added to the end of the current LevelCollection. + The new of the LevelCollection. + + + + Adds the elements of a array to the current LevelCollection. + + The array whose elements should be added to the end of the LevelCollection. + The new of the LevelCollection. + + + + Adds the elements of a collection to the current LevelCollection. + + The collection whose elements should be added to the end of the LevelCollection. + The new of the LevelCollection. + + + + Sets the capacity to the actual number of elements. + + + + + is less than zero + -or- + is equal to or greater than . + + + + + is less than zero + -or- + is equal to or greater than . + + + + + Supports simple iteration over a . + + + + + Initializes a new instance of the Enumerator class. + + + + + + Gets the current element in the collection. + + + + + Advances the enumerator to the next element in the collection. + + + true if the enumerator was successfully advanced to the next element; + false if the enumerator has passed the end of the collection. + + + The collection was modified after the enumerator was created. + + + + + Sets the enumerator to its initial position, before the first element in the collection. + + + + + An evaluator that triggers at a threshold level + + the threshold to trigger at + + + This evaluator will trigger if the level of the event + passed to + is equal to or greater than the + level. + + + Nicko Cadell + + + + An evaluator that triggers at a threshold level + + the threshold to trigger at + + + This evaluator will trigger if the level of the event + passed to + is equal to or greater than the + level. + + + Nicko Cadell + + + + Create a new evaluator using the threshold. + + + + This evaluator will trigger if the level of the event + passed to + is equal to or greater than the + level. + + + + + + the threshold to trigger at + + + The that will cause this evaluator to trigger + + + + This evaluator will trigger if the level of the event + passed to + is equal to or greater than the + level. + + + + + + Is this the triggering event? + + The event to check + This method returns true, if the event level + is equal or higher than the . + Otherwise it returns false + + + + Maps between string name and Level object. + + + + This mapping is held separately for each . + The level name is case-insensitive. + + + Nicko Cadell + + + + Mapping from level name to Level object. The + level name is case-insensitive + + + + + Clear the internal maps of all levels + + + + Clear the internal maps of all levels + + + + + + Looks up a by name + + The name of the Level to look up. + A Level from the map with the name specified, or null if none is found. + + + + Creates a new Level and adds it to the map. + + the string to display for the Level + the level value to give to the Level + + + + + Creates a new Level and adds it to the map. + + the string to display for the Level + the level value to give to the Level + the display name to give to the Level + + + + Adds a Level to the map. + + the Level to add + + + + Gets all possible levels as a collection of Level objects. + + + + + Looks up a named level from the map. + + + The name of the level to look up is taken from this level. + If the level is not set in the map then this level is added. + If no level with the specified name is found then the + argument is added to the level map + and returned. + + the level in the map with the name specified + + + + The internal representation of caller location information. + + + + This class uses the System.Diagnostics.StackTrace class to generate + a call stack. The caller's information is then extracted from this stack. + + + The System.Diagnostics.StackTrace class is not supported on the + .NET Compact Framework 1.0 therefore caller location information is not + available on that framework. + + + The System.Diagnostics.StackTrace class has this to say about Release builds: + + + "StackTrace information will be most informative with Debug build configurations. + By default, Debug builds include debug symbols, while Release builds do not. The + debug symbols contain most of the file, method name, line number, and column + information used in constructing StackFrame and StackTrace objects. StackTrace + might not report as many method calls as expected, due to code transformations + that occur during optimization." + + + This means that in a Release build the caller information may be incomplete or may + not exist at all! Therefore caller location information cannot be relied upon in a Release build. + + + Nicko Cadell + Gert Driesen + + + + Constructor + + The declaring type of the method that is + the stack boundary into the logging system for this call. + + + Initializes a new instance of the + class based on the current thread. + + + + + + Constructor + + The fully qualified class name. + The method name. + The file name. + The line number of the method within the file. + + + Initializes a new instance of the + class with the specified data. + + + + + + Serialization constructor + + The that holds the serialized object data. + The that contains contextual information about the source or destination. + + + Initializes a new instance of the class + with serialized data. + + + + + + Gets the fully qualified class name of the caller making the logging + request. + + + + + Gets the file name of the caller. + + + + + Gets the line number of the caller. + + + + + Gets the method name of the caller. + + + + + Gets all available caller information + + + All available caller information, in the format + fully.qualified.classname.of.caller.methodName(Filename:line) + + + + + Gets the stack frames from the stack trace of the caller making the log request + + + + + Serializes this object into the provided. + + The to populate with data. + The destination for this serialization. + + + + The fully qualified type of the LocationInfo class. + + + Used by the internal logger to record the Type of the + log message. + + + + + When location information is not available the constant + NA is returned. Current value of this string + constant is ?. + + + + + Exception base type for log4net. + + + + This type extends . It + does not add any new functionality but does differentiate the + type of exception being thrown. + + + Nicko Cadell + Gert Driesen + + + + Constructor + + + + Initializes a new instance of the class. + + + + + + Constructor + + A message to include with the exception. + + + Initializes a new instance of the class with + the specified message. + + + + + + Constructor + + A message to include with the exception. + A nested exception to include. + + + Initializes a new instance of the class + with the specified message and inner exception. + + + + + + Serialization constructor + + The that holds the serialized object data about the exception being thrown. + The that contains contextual information about the source or destination. + + + Initializes a new instance of the class + with serialized data. + + + + + + Static manager that controls the creation of repositories + + + + Static manager that controls the creation of repositories + + + This class is used by the wrapper managers (e.g. ) + to provide access to the objects. + + + This manager also holds the that is used to + lookup and create repositories. The selector can be set either programmatically using + the property, or by setting the log4net.RepositorySelector + AppSetting in the applications config file to the fully qualified type name of the + selector to use. + + + Nicko Cadell + Gert Driesen + + + + Hook the shutdown event + + + + On the full .NET runtime, the static constructor hooks up the + AppDomain.ProcessExit and AppDomain.DomainUnload> events. + These are used to shut down the log4net system as the application exits. + + + + + + Register for ProcessExit and DomainUnload events on the AppDomain + + + + This needs to be in a separate method because the events make + a LinkDemand for the ControlAppDomain SecurityPermission. Because + this is a LinkDemand it is demanded at JIT time. Therefore we cannot + catch the exception in the method itself, we have to catch it in the + caller. + + + + + + Return the default instance. + + the repository to lookup in + Return the default instance + + + Gets the for the repository specified + by the argument. + + + + + + Returns the default instance. + + The assembly to use to look up the repository. + The default instance. + + + Returns the default instance. + + + + + + Returns the named logger if it exists. + + The repository to lookup in. + The fully qualified logger name to look for. + + The logger found, or null if the named logger does not exist in the + specified repository. + + + + If the named logger exists (in the specified repository) then it + returns a reference to the logger, otherwise it returns + null. + + + + + + Returns the named logger if it exists. + + The assembly to use to look up the repository. + The fully qualified logger name to look for. + + The logger found, or null if the named logger does not exist in the + specified assembly's repository. + + + + If the named logger exists (in the specified assembly's repository) then it + returns a reference to the logger, otherwise it returns + null. + + + + + + Returns all the currently defined loggers in the specified repository. + + The repository to lookup in. + All the defined loggers. + + + The root logger is not included in the returned array. + + + + + + Returns all the currently defined loggers in the specified assembly's repository. + + The assembly to use to look up the repository. + All the defined loggers. + + + The root logger is not included in the returned array. + + + + + + Retrieves or creates a named logger. + + The repository to lookup in. + The name of the logger to retrieve. + The logger with the name specified. + + + Retrieves a logger named as the + parameter. If the named logger already exists, then the + existing instance will be returned. Otherwise, a new instance is + created. + + + By default, loggers do not have a set level but inherit + it from the hierarchy. This is one of the central features of + log4net. + + + + + + Retrieves or creates a named logger. + + The assembly to use to look up the repository. + The name of the logger to retrieve. + The logger with the name specified. + + + Retrieves a logger named as the + parameter. If the named logger already exists, then the + existing instance will be returned. Otherwise, a new instance is + created. + + + By default, loggers do not have a set level but inherit + it from the hierarchy. This is one of the central features of + log4net. + + + + + + Shorthand for . + + The repository to lookup in. + The of which the fullname will be used as the name of the logger to retrieve. + The logger with the name specified. + + + Gets the logger for the fully qualified name of the type specified. + + + + + + Shorthand for . + + the assembly to use to look up the repository + The of which the fullname will be used as the name of the logger to retrieve. + The logger with the name specified. + + + Gets the logger for the fully qualified name of the type specified. + + + + + + Shuts down the log4net system. + + + + Calling this method will safely close and remove all + appenders in all the loggers including root contained in all the + default repositories. + + + Some appenders need to be closed before the application exists. + Otherwise, pending logging events might be lost. + + + The shutdown method is careful to close nested + appenders before closing regular appenders. This allows + configurations where a regular appender is attached to a logger + and again to a nested appender. + + + + + + Shuts down the repository for the repository specified. + + The repository to shut down. + + + Calling this method will safely close and remove all + appenders in all the loggers including root contained in the + repository for the specified. + + + Some appenders need to be closed before the application exists. + Otherwise, pending logging events might be lost. + + + The shutdown method is careful to close nested + appenders before closing regular appenders. This allows + configurations where a regular appender is attached to a logger + and again to a nested appender. + + + + + + Shuts down the repository for the repository specified. + + The assembly to use to look up the repository. + + + Calling this method will safely close and remove all + appenders in all the loggers including root contained in the + repository for the repository. The repository is looked up using + the specified. + + + Some appenders need to be closed before the application exists. + Otherwise, pending logging events might be lost. + + + The shutdown method is careful to close nested + appenders before closing regular appenders. This allows + configurations where a regular appender is attached to a logger + and again to a nested appender. + + + + + + Resets all values contained in this repository instance to their defaults. + + The repository to reset. + + + Resets all values contained in the repository instance to their + defaults. This removes all appenders from all loggers, sets + the level of all non-root loggers to null, + sets their additivity flag to true and sets the level + of the root logger to . Moreover, + message disabling is set its default "off" value. + + + + + + Resets all values contained in this repository instance to their defaults. + + The assembly to use to look up the repository to reset. + + + Resets all values contained in the repository instance to their + defaults. This removes all appenders from all loggers, sets + the level of all non-root loggers to null, + sets their additivity flag to true and sets the level + of the root logger to . Moreover, + message disabling is set its default "off" value. + + + + + + Creates a repository with the specified name. + + The name of the repository, this must be unique amongst repositories. + The created for the repository. + + + Creates the default type of which is a + object. + + + The name must be unique. Repositories cannot be redefined. + An will be thrown if the repository already exists. + + + The specified repository already exists. + + + + Creates a repository with the specified name and repository type. + + The name of the repository, this must be unique to the repository. + A that implements + and has a no arg constructor. An instance of this type will be created to act + as the for the repository specified. + The created for the repository. + + + The name must be unique. Repositories cannot be redefined. + An Exception will be thrown if the repository already exists. + + + The specified repository already exists. + + + + Creates a repository for the specified assembly and repository type. + + The assembly to use to get the name of the repository. + A that implements + and has a no arg constructor. An instance of this type will be created to act + as the for the repository specified. + The created for the repository. + + + The created will be associated with the repository + specified such that a call to with the + same assembly specified will return the same repository instance. + + + + + + Gets an array of all currently defined repositories. + + An array of all the known objects. + + + Gets an array of all currently defined repositories. + + + + + + Gets or sets the repository selector used by the . + + + The repository selector used by the . + + + + The repository selector () is used by + the to create and select repositories + (). + + + The caller to supplies either a string name + or an assembly (if not supplied the assembly is inferred using + ). + + + This context is used by the selector to look up a specific repository. + + + + + + Internal method to get pertinent version info. + + A string of version info. + + + + Called when the event fires + + the that is exiting + null + + + Called when the event fires. + + + When the event is triggered the log4net system is . + + + + + + Called when the event fires + + the that is exiting + null + + + Called when the event fires. + + + When the event is triggered the log4net system is . + + + + + + The fully qualified type of the LoggerManager class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Implementation of the interface. + + The logger to wrap. + + + This class should be used as the base for all wrapper implementations. + + + Nicko Cadell + Gert Driesen + + + + Implementation of the interface. + + The logger to wrap. + + + This class should be used as the base for all wrapper implementations. + + + Nicko Cadell + Gert Driesen + + + + Gets the implementation behind this wrapper object. + + + The object that this object is implementing. + + + + The Logger object may not be the same object as this object + because of logger decorators. + + + This gets the actual underlying objects that is used to process + the log events. + + + + + + Portable data structure used by + + Nicko Cadell + + + + The logger name. + + + + + Level of logging event. + + + + A null level produces varying results depending on the appenders in use. + In many cases it is equivalent of , other times + it is mapped to Debug or Info defaults. + + + Level cannot be Serializable because it is a flyweight. + Due to its special serialization it cannot be declared final either. + + + + + + The application supplied message. + + + + + Gets or sets the name of the thread in which this logging event was generated. + + + + + Gets or sets the UTC time the event was logged. + + + + + Location information for the caller. + + + + Location information for the caller. + + + + + + String representation of the user + + + + String representation of the user's windows name, like DOMAIN\username + + + + + + String representation of the identity. + + + + String representation of the current thread's principal identity. + + + + + + The string representation of the exception + + + + The string representation of the exception + + + + + + String representation of the AppDomain. + + + + String representation of the AppDomain. + + + + + + Additional event specific properties + + + + A logger or an appender may attach additional + properties to specific events. These properties + have a string key and an object value. + + + + + + The internal representation of logging events. + + + + When an affirmative decision is made to log then a + instance is created. This instance + is passed around to the different log4net components. + + + This class is of concern to those wishing to extend log4net. + + + Some of the values in instances of + are considered volatile, that is the values are correct at the + time the event is delivered to appenders, but will not be consistent + at any time afterward. If an event is to be stored and then processed + at a later time these volatile values must be fixed by setting + . There is a performance penalty + for incurred by calling but it + is essential to maintain data consistency. + + + Nicko Cadell + Gert Driesen + Douglas de la Torre + Daniel Cazzulino + + + + Initializes a new instance of the class + from the supplied parameters. + + The declaring type of the method that is + the stack boundary into the logging system for this call. + The repository this event is logged in. + The name of the logger of this event. + + The level of this event. + A null level produces varying results depending on the appenders in use. + In many cases it is equivalent of , other times + it is mapped to Debug or Info defaults. + + The message of this event. + The exception for this event. + + + Except , and , + all fields of are lazily filled when actually needed. Set + to cache all data locally to prevent inconsistencies. + + This method is called by the log4net framework + to create a logging event. + + + + + + Initializes a new instance of the class + using specific data. + + The declaring type of the method that is + the stack boundary into the logging system for this call. + The repository this event is logged in. + Data used to initialize the logging event. + The fields in the struct that have already been fixed. + + + This constructor is provided to allow a + to be created independently of the log4net framework. This can + be useful if you require a custom serialization scheme. + + + Use the method to obtain an + instance of the class. + + + The parameter should be used to specify which fields in the + struct have been preset. Fields not specified in the + will be captured from the environment if requested or fixed. + + + + + + Initializes a new instance of the class + using specific data. + + The declaring type of the method that is + the stack boundary into the logging system for this call. + The repository this event is logged in. + Data used to initialize the logging event. + + + This constructor is provided to allow a + to be created independently of the log4net framework. This can + be useful if you require a custom serialization scheme. + + + Use the method to obtain an + instance of the class. + + + This constructor sets this objects flags to , + this assumes that all the data relating to this event is passed in via the + parameter and no other data should be captured from the environment. + + + + + + Initializes a new instance of the class + using specific data. + + Data used to initialize the logging event. + + + This constructor is provided to allow a + to be created independently of the log4net framework. This can + be useful if you require a custom serialization scheme. + + + Use the method to obtain an + instance of the class. + + + This constructor sets this objects flags to , + this assumes that all the data relating to this event is passed in via the + parameter and no other data should be captured from the environment. + + + + + + Initializes a new instance of the class. + + + + This constructor is provided to allow deserialization using System.Text.Json + or Newtonsoft.Json. + + + Use the method to obtain an + instance of the class. + + + This constructor sets this objects flags to . + + + + + + Serialization constructor + + The that holds the serialized object data. + The that contains contextual information about the source or destination. + + + Initializes a new instance of the class + with serialized data. + + + + + + Gets the time when the current process started. + + + This is the time when this process started. + + + + The TimeStamp is stored internally in UTC and converted to the local time zone for this computer. + + + Tries to get the start time for the current process. + Failing that it returns the time of the first call to + this property. + + + Note that AppDomains may be loaded and unloaded within the + same process without the process terminating and therefore + without the process start time being reset. + + + + + + Gets the UTC time when the current process started. + + + This is the UTC time when this process started. + + + + Tries to get the start time for the current process. + Failing that it returns the time of the first call to + this property. + + + Note that AppDomains may be loaded and unloaded within the + same process without the process terminating and therefore + without the process start time being reset. + + + + + + Gets the of the logging event. + A null level produces varying results depending on the appenders in use. + In many cases it is equivalent of , other times + it is mapped to Debug or Info defaults. + + + + + Gets the time of the logging event. + + + The time of the logging event. + + + + The TimeStamp is stored in UTC and converted to the local time zone for this computer. + + + + + + Gets UTC the time of the logging event. + + + The UTC time of the logging event. + + + + + Gets the name of the logger that logged the event. + + + + + Gets the location information for this logging event. + + + + The collected information is cached for future use. + + + See the class for more information on + supported frameworks and the different behavior in Debug and + Release builds. + + + + + + Gets the message object used to initialize this event. + + + The message object used to initialize this event. + + + + Gets the message object used to initialize this event. + Note that this event may not have a valid message object. + If the event is serialized the message object will not + be transferred. To get the text of the message the + property must be used + not this property. + + + If there is no defined message object for this event then + null will be returned. + + + + + + Gets the exception object used to initialize this event. + + + The exception object used to initialize this event. + + + + Gets the exception object used to initialize this event. + Note that this event may not have a valid exception object. + If the event is serialized the exception object will not + be transferred. To get the text of the exception the + method must be used + not this property. + + + If there is no defined exception object for this event then + null will be returned. + + + + + + The that this event was created in. + + + + The that this event was created in. + + + + + + Ensure that the repository is set. + + the value for the repository + + + + Gets the message, rendered through the . + + + The message rendered through the . + + + + The collected information is cached for future use. + + + + + + Write the rendered message to a TextWriter + + the writer to write the message to + + + Unlike the property this method + does store the message data in the internal cache. Therefore + if called only once this method should be faster than the + property, however if the message is + to be accessed multiple times then the property will be more efficient. + + + + + + Gets the name of the current thread. + + + The name of the current thread, or the thread ID when + the name is not available. + + + + The collected information is cached for future use. + + + + + + Returns a 'meaningful' name for the thread (or its Id) + + Name + Meaningful name + + + + Gets the name of the current user. + + + The name of the current user, or NOT AVAILABLE when the + underlying runtime has no support for retrieving the name of the + current user. + + + + Calls WindowsIdentity.GetCurrent().Name to get the name of + the current windows user. + + + To improve performance, we could cache the string representation of + the name, and reuse that as long as the identity stayed constant. + Once the identity changed, we would need to re-assign and re-render + the string. + + + However, the WindowsIdentity.GetCurrent() call seems to + return different objects every time, so the current implementation + doesn't do this type of caching. + + + Timing for these operations: + + + + Method + Results + + + WindowsIdentity.GetCurrent() + 10000 loops, 00:00:00.2031250 seconds + + + WindowsIdentity.GetCurrent().Name + 10000 loops, 00:00:08.0468750 seconds + + + + This means we could speed things up almost 40 times by caching the + value of the WindowsIdentity.GetCurrent().Name property, since + this takes (8.04-0.20) = 7.84375 seconds. + + + + + + Gets the identity of the current thread principal. + + + + Calls System.Threading.Thread.CurrentPrincipal.Identity.Name to get + the name of the current thread principal. + + + + + + Gets the AppDomain friendly name. + + + + + Additional event specific properties. + + + Additional event specific properties. + + + + A logger or an appender may attach additional + properties to specific events. These properties + have a string key and an object value. + + + This property is for events that have been added directly to + this event. The aggregate properties (which include these + event properties) can be retrieved using + and . + + + Once the properties have been fixed this property + returns the combined cached properties. This ensures that updates to + this property are always reflected in the underlying storage. When + returning the combined properties there may be more keys in the + Dictionary than expected. + + + + + + Gets the fixed fields in this event, or on set, fixes fields specified in the value. + + + + Fields will not be fixed if they have previously been fixed. + It is not possible to 'unfix' a field. + + + + + + Serializes this object into the provided. + + The to populate with data. + The destination for this serialization. + + + The data in this event must be fixed before it can be serialized. + + + The property must be set during the + method call if this event + is to be used outside that method. + + + + + + Gets the portable data for this . + + The for this event. + + + A new can be constructed using a + instance. + + + Does a fix of the data + in the logging event before returning the event data. + + + + + + Gets the portable data for this . + + The set of data to ensure is fixed in the LoggingEventData + The for this event. + + + A new can be constructed using a + instance. + + + + + + Returns this event's exception's rendered using the + . + + + This event's exception's rendered using the . + + + + Returns this event's exception's rendered using the + . + + + + + + Fix the fields specified by the parameter + + the fields to fix + + + Only fields specified in the will be fixed. + Fields will not be fixed if they have previously been fixed. + It is not possible to 'unfix' a field. + + + + + + Looks up a composite property in this event + + the key for the property to lookup + the value for the property + + + This event has composite properties that combine properties from + several different contexts in the following order: + + + this event's properties + + This event has that can be set. These + properties are specific to this event only. + + + + the thread properties + + The that are set on the current + thread. These properties are shared by all events logged on this thread. + + + + the global properties + + The that are set globally. These + properties are shared by all the threads in the AppDomain. + + + + + + + + + Get all the composite properties in this event + + the containing all the properties + + + See for details of the composite properties + stored by the event. + + + This method returns a single containing all the + properties defined for this event. + + + + + + The internal logging event data. + + + + + Location information for the caller. + + + + + The internal logging event data. + + + + + The internal logging event data. + + + + + The fully qualified Type of the calling + logger class in the stack frame (i.e. the declaring type of the method). + + + + + The fix state for this event + + + These flags indicate which fields have been fixed. + Not serialized. + + + + + Indicated that the internal cache is updateable (ie not fixed) + + + This is a separate flag to fixFlags as it allows incremental fixing and simpler + changes in the caching strategy. + + + + + The key into the Properties map for the host name value. + + + + + The key into the Properties map for the thread identity value. + + + + + The key into the Properties map for the user name value. + + + + + Implementation of wrapper interface. + + + + This implementation of the interface + forwards to the held by the base class. + + + This logger has methods to allow the caller to log at the following + levels: + + + + DEBUG + + The and methods log messages + at the DEBUG level. That is the level with that name defined in the + repositories . The default value + for this level is . The + property tests if this level is enabled for logging. + + + + INFO + + The and methods log messages + at the INFO level. That is the level with that name defined in the + repositories . The default value + for this level is . The + property tests if this level is enabled for logging. + + + + WARN + + The and methods log messages + at the WARN level. That is the level with that name defined in the + repositories . The default value + for this level is . The + property tests if this level is enabled for logging. + + + + ERROR + + The and methods log messages + at the ERROR level. That is the level with that name defined in the + repositories . The default value + for this level is . The + property tests if this level is enabled for logging. + + + + FATAL + + The and methods log messages + at the FATAL level. That is the level with that name defined in the + repositories . The default value + for this level is . The + property tests if this level is enabled for logging. + + + + + The values for these levels and their semantic meanings can be changed by + configuring the for the repository. + + + Nicko Cadell + Gert Driesen + + + + Construct a new wrapper for the specified logger. + + The logger to wrap. + + + Construct a new wrapper for the specified logger. + + + + + + Virtual method called when the configuration of the repository changes + + the repository holding the levels + + + Virtual method called when the configuration of the repository changes + + + + + + Logs a message object with the DEBUG level. + + The message object to log. + + + This method first checks if this logger is DEBUG + enabled by comparing the level of this logger with the + DEBUG level. If this logger is + DEBUG enabled, then it converts the message object + (passed as parameter) to a string by invoking the appropriate + . It then + proceeds to call all the registered appenders in this logger + and also higher in the hierarchy depending on the value of the + additivity flag. + + + WARNING Note that passing an + to this method will print the name of the + but no stack trace. To print a stack trace use the + form instead. + + + + + + Logs a message object with the DEBUG level + + The message object to log. + The exception to log, including its stack trace. + + + Logs a message object with the DEBUG level including + the stack trace of the passed + as a parameter. + + + See the form for more detailed information. + + + + + + + Logs a formatted message string with the DEBUG level. + + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the DEBUG level. + + A String containing zero or more format items + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the DEBUG level. + + A String containing zero or more format items + An Object to format + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the DEBUG level. + + A String containing zero or more format items + An Object to format + An Object to format + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the DEBUG level. + + An that supplies culture-specific formatting information + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a message object with the INFO level. + + The message object to log. + + + This method first checks if this logger is INFO + enabled by comparing the level of this logger with the + INFO level. If this logger is + INFO enabled, then it converts the message object + (passed as parameter) to a string by invoking the appropriate + . It then + proceeds to call all the registered appenders in this logger + and also higher in the hierarchy depending on the value of + the additivity flag. + + + WARNING Note that passing an + to this method will print the name of the + but no stack trace. To print a stack trace use the + form instead. + + + + + + Logs a message object with the INFO level. + + The message object to log. + The exception to log, including its stack trace. + + + Logs a message object with the INFO level including + the stack trace of the + passed as a parameter. + + + See the form for more detailed information. + + + + + + + Logs a formatted message string with the INFO level. + + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the INFO level. + + A String containing zero or more format items + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the INFO level. + + A String containing zero or more format items + An Object to format + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the INFO level. + + A String containing zero or more format items + An Object to format + An Object to format + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the INFO level. + + An that supplies culture-specific formatting information + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a message object with the WARN level. + + the message object to log + + + This method first checks if this logger is WARN + enabled by comparing the level of this logger with the + WARN level. If this logger is + WARN enabled, then it converts the message object + (passed as parameter) to a string by invoking the appropriate + . It then + proceeds to call all the registered appenders in this logger and + also higher in the hierarchy depending on the value of the + additivity flag. + + + WARNING Note that passing an to this + method will print the name of the but no + stack trace. To print a stack trace use the + form instead. + + + + + + Logs a message object with the WARN level + + The message object to log. + The exception to log, including its stack trace. + + + Logs a message object with the WARN level including + the stack trace of the + passed as a parameter. + + + See the form for more detailed information. + + + + + + + Logs a formatted message string with the WARN level. + + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the WARN level. + + A String containing zero or more format items + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the WARN level. + + A String containing zero or more format items + An Object to format + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the WARN level. + + A String containing zero or more format items + An Object to format + An Object to format + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the WARN level. + + An that supplies culture-specific formatting information + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a message object with the ERROR level. + + The message object to log. + + + This method first checks if this logger is ERROR + enabled by comparing the level of this logger with the + ERROR level. If this logger is + ERROR enabled, then it converts the message object + (passed as parameter) to a string by invoking the appropriate + . It then + proceeds to call all the registered appenders in this logger and + also higher in the hierarchy depending on the value of the + additivity flag. + + + WARNING Note that passing an to this + method will print the name of the but no + stack trace. To print a stack trace use the + form instead. + + + + + + Logs a message object with the ERROR level + + The message object to log. + The exception to log, including its stack trace. + + + Logs a message object with the ERROR level including + the stack trace of the + passed as a parameter. + + + See the form for more detailed information. + + + + + + + Logs a formatted message string with the ERROR level. + + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the ERROR level. + + A String containing zero or more format items + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the ERROR level. + + A String containing zero or more format items + An Object to format + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the ERROR level. + + A String containing zero or more format items + An Object to format + An Object to format + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the ERROR level. + + An that supplies culture-specific formatting information + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a message object with the FATAL level. + + The message object to log. + + + This method first checks if this logger is FATAL + enabled by comparing the level of this logger with the + FATAL level. If this logger is + FATAL enabled, then it converts the message object + (passed as parameter) to a string by invoking the appropriate + . It then + proceeds to call all the registered appenders in this logger and + also higher in the hierarchy depending on the value of the + additivity flag. + + + WARNING Note that passing an to this + method will print the name of the but no + stack trace. To print a stack trace use the + form instead. + + + + + + Logs a message object with the FATAL level + + The message object to log. + The exception to log, including its stack trace. + + + Logs a message object with the FATAL level including + the stack trace of the + passed as a parameter. + + + See the form for more detailed information. + + + + + + + Logs a formatted message string with the FATAL level. + + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the FATAL level. + + A String containing zero or more format items + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the FATAL level. + + A String containing zero or more format items + An Object to format + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the FATAL level. + + A String containing zero or more format items + An Object to format + An Object to format + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the FATAL level. + + An that supplies culture-specific formatting information + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Checks if this logger is enabled for the DEBUG + level. + + + true if this logger is enabled for DEBUG events, + false otherwise. + + + + This function is intended to lessen the computational cost of + disabled log debug statements. + + + For some log Logger object, when you write: + + + log.Debug("This is entry number: " + i ); + + + You incur the cost constructing the message, concatenation in + this case, regardless of whether the message is logged or not. + + + If you are worried about speed, then you should write: + + + if (log.IsDebugEnabled()) + { + log.Debug("This is entry number: " + i ); + } + + + This way you will not incur the cost of parameter + construction if debugging is disabled for log. On + the other hand, if the log is debug enabled, you + will incur the cost of evaluating whether the logger is debug + enabled twice. Once in IsDebugEnabled and once in + the Debug. This is an insignificant overhead + since evaluating a logger takes about 1% of the time it + takes to actually log. + + + + + + Checks if this logger is enabled for the INFO level. + + + true if this logger is enabled for INFO events, + false otherwise. + + + + See for more information and examples + of using this method. + + + + + + + Checks if this logger is enabled for the WARN level. + + + true if this logger is enabled for WARN events, + false otherwise. + + + + See for more information and examples + of using this method. + + + + + + + Checks if this logger is enabled for the ERROR level. + + + true if this logger is enabled for ERROR events, + false otherwise. + + + + See for more information and examples of using this method. + + + + + + + Checks if this logger is enabled for the FATAL level. + + + true if this logger is enabled for FATAL events, + false otherwise. + + + + See for more information and examples of using this method. + + + + + + + Event handler for the event + + the repository + Empty + + + + The fully qualified name of this declaring type not the type of any subclass. + + + + + Used to ensure 'params object?[]?' arguments that receive a null are converted + to an array of one null value so that 'XxxFormat("{0}", null)' will work correctly. + Overloads like 'XxxFormat(message, object? arg0)' are not matched by the compiler in this case. + + + + + provides method information without actually referencing a System.Reflection.MethodBase + as that would require that the containing assembly is loaded. + + + + + + constructs a method item for an unknown method. + + + + + constructs a method item from the name of the method. + + + + + + constructs a method item from the name of the method and its parameters. + + + + + + + constructs a method item from a method base by determining the method name and its parameters. + + + + + + Gets the method name of the caller making the logging request. + + + + + Gets the method parameters of the caller making the logging request. + + + + + The fully qualified type of the StackFrameItem class. + + + Used by the internal logger to record the Type of the + log message. + + + + + When location information is not available the constant + NA is returned. Current value of this string + constant is ?. + + + + + A SecurityContext used by log4net when interacting with protected resources + + + + A SecurityContext used by log4net when interacting with protected resources + for example with operating system services. This can be used to impersonate + a principal that has been granted privileges on the system resources. + + + Nicko Cadell + + + + Impersonate this SecurityContext + + State supplied by the caller + An instance that will + revoke the impersonation of this SecurityContext, or null + + + Impersonate this security context. Further calls on the current + thread should now be made in the security context provided + by this object. When the result + method is called the security + context of the thread should be reverted to the state it was in + before was called. + + + + + + The providers default instances. + + + + A configured component that interacts with potentially protected system + resources uses a to provide the elevated + privileges required. If the object has + been not been explicitly provided to the component then the component + will request one from this . + + + By default the is + an instance of which returns only + objects. This is a reasonable default + where the privileges required are not know by the system. + + + This default behavior can be overridden by subclassing the + and overriding the method to return + the desired objects. The default provider + can be replaced by programmatically setting the value of the + property. + + + An alternative is to use the log4net.Config.SecurityContextProviderAttribute + This attribute can be applied to an assembly in the same way as the + log4net.Config.XmlConfiguratorAttribute". The attribute takes + the type to use as the as an argument. + + + Nicko Cadell + + + + The default provider + + + + + Gets or sets the default SecurityContextProvider + + + The default SecurityContextProvider + + + + The default provider is used by configured components that + require a and have not had one + given to them. + + + By default this is an instance of + that returns objects. + + + The default provider can be set programmatically by setting + the value of this property to a sub class of + that has the desired behavior. + + + + + + Protected default constructor to allow subclassing + + + + Protected default constructor to allow subclassing + + + + + + Create a SecurityContext for a consumer + + The consumer requesting the SecurityContext + An impersonation context + + + The default implementation is to return a . + + + Subclasses should override this method to provide their own + behavior. + + + + + + Provides stack frame information without actually referencing a System.Diagnostics.StackFrame + as that would require that the containing assembly is loaded. + + + + + Creates a stack frame item from a stack frame. + + + + + + Gets the fully qualified class name of the caller making the logging + request. + + + + + Gets the file name of the caller. + + + + + Gets the line number of the caller. + + + + + Gets the method name of the caller. + + + + + Gets all available caller information in the format + fully.qualified.classname.of.caller.methodName(Filename:line) + + + + + The fully qualified type of the StackFrameItem class. + + + Used by the internal logger to record the Type of the + log message. + + + + + When location information is not available the constant + NA is returned. Current value of this string + constant is ?. + + + + + An evaluator that triggers after specified number of seconds. + + + The time threshold in seconds to trigger after. + Zero means it won't trigger at all. + + + + This evaluator will trigger if the specified time period + has passed since last check. + + + Robert Sevcik + + + + An evaluator that triggers after specified number of seconds. + + + The time threshold in seconds to trigger after. + Zero means it won't trigger at all. + + + + This evaluator will trigger if the specified time period + has passed since last check. + + + Robert Sevcik + + + + The UTC time of last check. This gets updated when the object is created and when the evaluator triggers. + + + + + The default time threshold for triggering in seconds. Zero means it won't trigger at all. + + + + + Create a new evaluator using the time threshold in seconds. + + + + Create a new evaluator using the time threshold in seconds. + + + This evaluator will trigger if the specified time period + has passed since last check. + + + + + + The time threshold in seconds to trigger after + + + The time threshold in seconds to trigger after. + Zero means it won't trigger at all. + + + + This evaluator will trigger if the specified time period + has passed since last check. + + + + + + Is this the triggering event? + + The event to check + This method returns true, if the specified time period + has passed since last check.. + Otherwise it returns false + + + This evaluator will trigger if the specified time period + has passed since last check. + + + + + + Delegate used to handle creation of new wrappers. + + The logger to wrap in a wrapper. + + + Delegate used to handle creation of new wrappers. This delegate + is called from the + method to construct the wrapper for the specified logger. + + + The delegate to use is supplied to the + constructor. + + + + + + Maps between logger objects and wrapper objects. + + + + This class maintains a mapping between objects and + objects. Use the method to + look up the for the specified . + + + New wrapper instances are created by the + method. The default behavior is for this method to delegate construction + of the wrapper to the delegate supplied + to the constructor. This allows specialization of the behavior without + requiring subclassing of this type. + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the + + The handler to use to create the wrapper objects. + + + Initializes a new instance of the class with + the specified handler to create the wrapper objects. + + + + + + Gets the wrapper object for the specified logger. + + The wrapper object for the specified logger + + + If the logger is null then the corresponding wrapper is null. + + + Looks up the wrapper it has previously been requested and + returns it. If the wrapper has never been requested before then + the virtual method is + called. + + + + + + Gets the map of logger repositories. + + + Map of logger repositories. + + + + Gets the hashtable that is keyed on . The + values are hashtables keyed on with the + value being the corresponding . + + + + + + Creates the wrapper object for the specified logger. + + The logger to wrap in a wrapper. + The wrapper object for the logger. + + + This implementation uses the + passed to the constructor to create the wrapper. This method + can be overridden in a subclass. + + + + + + Called when a monitored repository shutdown event is received. + + The that is shutting down + + + This method is called when a that this + is holding loggers for has signaled its shutdown + event . The default + behavior of this method is to release the references to the loggers + and their wrappers generated for this repository. + + + + + + Event handler for repository shutdown event. + + The sender of the event. + The event args. + + + + The handler to use to create the extension wrapper objects. + + + + + Internal reference to the delegate used to register for repository shutdown events. + + + + + Formats a as "HH:mm:ss,fff". + + + + Formats a in the format "HH:mm:ss,fff" for example, "15:49:37,459". + + + Nicko Cadell + Gert Driesen + + + + Renders the date into a string. Format is "HH:mm:ss". + + The date to render into a string. + The string builder to write to. + + + Subclasses should override this method to render the date + into a string using a precision up to the second. This method + will be called at most once per second and the result will be + reused if it is needed again during the same second. + + + + + + Renders the date into a string. Format is "HH:mm:ss,fff". + + The date to render into a string. + The writer to write to. + + + Uses the method to generate the + time string up to the seconds and then appends the current + milliseconds. The results from are + cached and is called at most once + per second. + + + Subclasses should override + rather than . + + + + + + String constant used to specify AbsoluteTimeDateFormat in layouts. Current value is ABSOLUTE. + + + + + String constant used to specify DateTimeDateFormat in layouts. Current value is DATE. + + + + + String constant used to specify ISO8601DateFormat in layouts. Current value is ISO8601. + + + + + Last stored time with precision up to the second. + + + + + Last stored time with precision up to the second, formatted + as a string. + + + + + Formats a as "dd MMM yyyy HH:mm:ss,fff" + + + + Formats a in the format + "dd MMM yyyy HH:mm:ss,fff" for example, + "06 Nov 1994 15:49:37,459". + + + Nicko Cadell + Gert Driesen + Angelika Schnagl + + + + Formats the date without the milliseconds part + + The date to format. + The string builder to write to. + + + Formats a DateTime in the format "dd MMM yyyy HH:mm:ss" + for example, "06 Nov 1994 15:49:37". + + + The base class will append the ",fff" milliseconds section. + This method will only be called at most once per second. + + + + + + Render a as a string. + + + + Interface to abstract the rendering of a + instance into a string. + + + The method is used to render the + date to a text writer. + + + Nicko Cadell + Gert Driesen + + + + Formats the specified date as a string. + + The date to format. + The writer to write to. + + + Format the as a string and write it + to the provided. + + + + + + Formats the as "yyyy-MM-dd HH:mm:ss,fff". + + + + Formats the specified as a string: "yyyy-MM-dd HH:mm:ss,fff". + + + Nicko Cadell + Gert Driesen + + + + Formats the date without the milliseconds part + + The date to format. + The string builder to write to. + + + Formats the date specified as a string: "yyyy-MM-dd HH:mm:ss". + + + The base class will append the ",fff" milliseconds section. + This method will only be called at most once per second. + + + + + + Formats the using the method. + + + + Formats the using the method. + + + Nicko Cadell + Gert Driesen + The format string. + + + + Formats the using the method. + + + + Formats the using the method. + + + Nicko Cadell + Gert Driesen + The format string. + + + + Formats the date using . + + The date to convert to a string. + The writer to write to. + + + Uses the date format string supplied to the constructor to call + the method to format the date. + + + + + + This filter drops all . + + + + You can add this filter to the end of a filter chain to + switch from the default "accept all unless instructed otherwise" + filtering behavior to a "deny all unless instructed otherwise" + behavior. + + + Nicko Cadell + Gert Driesen + + + + Always returns . + + the LoggingEvent to filter + Always returns + + + Ignores the event being logged and just returns + . This can be used to change the default filter + chain behavior from to . This filter + should only be used as the last filter in the chain + as any further filters will be ignored! + + + + + + The return result from + + + + The return result from + + + + + + The log event must be dropped immediately without + consulting with the remaining filters, if any, in the chain. + + + + + This filter is neutral with respect to the log event. + The remaining filters, if any, should be consulted for a final decision. + + + + + The log event must be logged immediately without + consulting with the remaining filters, if any, in the chain. + + + + + Subclass this type to implement customized logging event filtering + + + + Users should extend this class to implement customized logging + event filtering. Note that and + , the parent class of all standard + appenders, have built-in filtering rules. It is suggested that you + first use and understand the built-in rules before rushing to write + your own custom filters. + + + This abstract class assumes and also imposes that filters be + organized in a linear chain. The + method of each filter is called sequentially, in the order of their + addition to the chain. + + + The method must return one + of the integer constants , + or . + + + If the value is returned, then the log event is dropped + immediately without consulting with the remaining filters. + + + If the value is returned, then the next filter + in the chain is consulted. If there are no more filters in the + chain, then the log event is logged. Thus, in the presence of no + filters, the default behavior is to log all logging events. + + + If the value is returned, then the log + event is logged without consulting the remaining filters. + + + The philosophy of log4net filters is largely inspired from the + Linux ipchains. + + + Nicko Cadell + Gert Driesen + + + + Initialize the filter with the options set + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + Typically filter's options become active immediately on set, + however this method must still be called. + + + + + + Decide if the should be logged through an appender. + + The to decide upon + The decision of the filter + + + If the decision is , then the event will be + dropped. If the decision is , then the next + filter, if any, will be invoked. If the decision is then + the event will be logged without consulting with other filters in + the chain. + + + This method is marked abstract and must be implemented + in a subclass. + + + + + + Gets or sets the next filter in the filter chain. + + + + Filters are typically composed into chains. This property allows the next filter in + the chain to be accessed. + + + + + + Implement this interface to provide customized logging event filtering + + + + Users should implement this interface to implement customized logging + event filtering. Note that and + , the parent class of all standard + appenders, have built-in filtering rules. It is suggested that you + first use and understand the built-in rules before rushing to write + your own custom filters. + + + This abstract class assumes and also imposes that filters be + organized in a linear chain. The + method of each filter is called sequentially, in the order of their + addition to the chain. + + + The method must return one + of the integer constants , + or . + + + If the value is returned, then the log event is dropped + immediately without consulting with the remaining filters. + + + If the value is returned, then the next filter + in the chain is consulted. If there are no more filters in the + chain, then the log event is logged. Thus, in the presence of no + filters, the default behavior is to log all logging events. + + + If the value is returned, then the log + event is logged without consulting the remaining filters. + + + The philosophy of log4net filters is largely inspired from the + Linux ipchains. + + + Nicko Cadell + Gert Driesen + + + + Decide if the logging event should be logged through an appender. + + The LoggingEvent to decide upon + The decision of the filter + + + If the decision is , then the event will be + dropped. If the decision is , then the next + filter, if any, will be invoked. If the decision is then + the event will be logged without consulting with other filters in + the chain. + + + + + + Gets or sets the next filter in the chain. + + + + Filters are typically composed into chains. This property allows the next filter in + the chain to be accessed. + + + + + + This is a very simple filter based on matching. + + + + The filter admits two options and + . If there is an exact match between the value + of the option and the of the + , then the method returns in + case the option value is set + to true, if it is false then + is returned. If the does not match then + the result will be . + + + Nicko Cadell + Gert Driesen + + + + when matching + + + + The property is a flag that determines + the behavior when a matching is found. If the + flag is set to true then the filter will the + logging event, otherwise it will the event. + + + The default is true i.e. to the event. + + + + + + The that the filter will match + + + + The level that this filter will attempt to match against the + level. If a match is found then + the result depends on the value of . + + + + + + Tests if the of the logging event matches that of the filter + + the event to filter + see remarks + + + If the of the event matches the level of the + filter then the result of the function depends on the + value of . If it is true then + the function will return , it it is false then it + will return . If the does not match then + the result will be . + + + + + + This is a simple filter based on matching. + + + + The filter admits three options and + that determine the range of priorities that are matched, and + . If there is a match between the range + of priorities and the of the , then the + method returns in case the + option value is set to true, if it is false + then is returned. If there is no match, is returned. + + + Nicko Cadell + Gert Driesen + + + + when matching and + + + + The property is a flag that determines + the behavior when a matching is found. If the + flag is set to true then the filter will the + logging event, otherwise it will the event. + + + The default is true i.e. to the event. + + + + + + Set the minimum matched + + + + The minimum level that this filter will attempt to match against the + level. If a match is found then + the result depends on the value of . + + + + + + Sets the maximum matched + + + + The maximum level that this filter will attempt to match against the + level. If a match is found then + the result depends on the value of . + + + + + + Check if the event should be logged. + + the logging event to check + see remarks + + + If the of the logging event is outside the range + matched by this filter then + is returned. If the is matched then the value of + is checked. If it is true then + is returned, otherwise + is returned. + + + + + + Simple filter to match a string in the event's logger name. + + + + The works very similar to the . It admits two + options and . If the + of the starts + with the value of the option, then the + method returns in + case the option value is set to true, + if it is false then is returned. + + + Daniel Cazzulino + + + + when matching + + + + The property is a flag that determines + the behavior when a matching is found. If the + flag is set to true then the filter will the + logging event, otherwise it will the event. + + + The default is true i.e. to the event. + + + + + + The that the filter will match + + + + This filter will attempt to match this value against logger name in + the following way. The match will be done against the beginning of the + logger name (using ). The match is + case sensitive. If a match is found then + the result depends on the value of . + + + + + + Check if this filter should allow the event to be logged + + the event being logged + see remarks + + + The rendered message is matched against the . + If the equals the beginning of + the incoming () + then a match will have occurred. If no match occurs + this function will return + allowing other filters to check the event. If a match occurs then + the value of is checked. If it is + true then is returned otherwise + is returned. + + + + + + Simple filter to match a keyed string in the + + + + Simple filter to match a keyed string in the + + + As the MDC has been replaced with layered properties the + should be used instead. + + + Nicko Cadell + Gert Driesen + + + + Simple filter to match a string in the + + + + Simple filter to match a string in the + + + As the NDC has been replaced with named stacks stored in the + properties collections the should + be used instead. + + + Nicko Cadell + Gert Driesen + + + + Default constructor + + + + Sets the to "NDC". + + + + + + Simple filter to match a string an event property + + + + Simple filter to match a string in the value for a + specific event property + + + Nicko Cadell + + + + The key to lookup in the event properties and then match against. + + + + The key name to use to lookup in the properties map of the + . The match will be performed against + the value of this property if it exists. + + + + + + Check if this filter should allow the event to be logged + + the event being logged + see remarks + + + The event property for the is matched against + the . + If the occurs as a substring within + the property value then a match will have occurred. If no match occurs + this function will return + allowing other filters to check the event. If a match occurs then + the value of is checked. If it is + true then is returned otherwise + is returned. + + + + + + Simple filter to match a string in the rendered message. + + Nicko Cadell + Gert Driesen + + + + A regex object to match (generated from m_stringRegexToMatch) + + + + + Initialize and precompile the Regex if required + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + when matching or + + + + The property is a flag that determines + the behavior when a matching is found. If the + flag is set to true then the filter will the + logging event, otherwise it will the event. + + + The default is true i.e. to the event. + + + + + + Sets the static string to match + + + + The string that will be substring matched against + the rendered message. If the message contains this + string then the filter will match. If a match is found then + the result depends on the value of . + + + One of or + must be specified. + + + + + + Sets the regular expression to match + + + + The regular expression pattern that will be matched against + the rendered message. If the message matches this + pattern then the filter will match. If a match is found then + the result depends on the value of . + + + One of or + must be specified. + + + + + + Check if this filter should allow the event to be logged + + the event being logged + see remarks + + + The rendered message is matched against the . + If the occurs as a substring within + the message then a match will have occurred. If no match occurs + this function will return + allowing other filters to check the event. If a match occurs then + the value of is checked. If it is + true then is returned otherwise + is returned. + + + + + + The log4net Global Context. + + + + The GlobalContext provides a location for global debugging + information to be stored. + + + The global context has a properties map and these properties can + be included in the output of log messages. The + supports selecting and outputing these properties. + + + By default the log4net:HostName property is set to the name of + the current machine. + + + + + GlobalContext.Properties["hostname"] = Environment.MachineName; + + + + Nicko Cadell + + + + The global properties map. + + + + + The ILog interface is use by application to log messages into + the log4net framework. + + + + Use the to obtain logger instances + that implement this interface. The + static method is used to get logger instances. + + + This class contains methods for logging at different levels and also + has properties for determining if those logging levels are + enabled in the current configuration. + + + This interface can be implemented in different ways. This documentation + specifies reasonable behavior that a caller can expect from the actual + implementation, however different implementations reserve the right to + do things differently. + + + Simple example of logging messages + + ILog log = LogManager.GetLogger("application-log"); + + log.Info("Application Start"); + log.Debug("This is a debug message"); + + if (log.IsDebugEnabled) + { + log.Debug("This is another debug message"); + } + + + + + Nicko Cadell + Gert Driesen + + + Log a message object with the level. + + Logs a message object with the level. + + The message object to log. + + + This method first checks if this logger is DEBUG + enabled by comparing the level of this logger with the + level. If this logger is + DEBUG enabled, then it converts the message object + (passed as parameter) to a string by invoking the appropriate + . It then + proceeds to call all the registered appenders in this logger + and also higher in the hierarchy depending on the value of + the additivity flag. + + WARNING Note that passing an + to this method will print the name of the + but no stack trace. To print a stack trace use the + form instead. + + + + + + + + Log a message object with the level including + the stack trace of the passed + as a parameter. + + The message object to log. + The exception to log, including its stack trace. + + + See the form for more detailed information. + + + + + + + Log a formatted string with the level. + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + An that supplies culture-specific formatting information + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + Log a message object with the level. + + Logs a message object with the level. + + + + This method first checks if this logger is INFO + enabled by comparing the level of this logger with the + level. If this logger is + INFO enabled, then it converts the message object + (passed as parameter) to a string by invoking the appropriate + . It then + proceeds to call all the registered appenders in this logger + and also higher in the hierarchy depending on the value of the + additivity flag. + + WARNING Note that passing an + to this method will print the name of the + but no stack trace. To print a stack trace use the + form instead. + + + The message object to log. + + + + + + Logs a message object with the INFO level including + the stack trace of the passed + as a parameter. + + The message object to log. + The exception to log, including its stack trace. + + + See the form for more detailed information. + + + + + + + Log a formatted message string with the level. + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + An that supplies culture-specific formatting information + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + Log a message object with the level. + + Log a message object with the level. + + + + This method first checks if this logger is WARN + enabled by comparing the level of this logger with the + level. If this logger is + WARN enabled, then it converts the message object + (passed as parameter) to a string by invoking the appropriate + . It then + proceeds to call all the registered appenders in this logger + and also higher in the hierarchy depending on the value of the + additivity flag. + + WARNING Note that passing an + to this method will print the name of the + but no stack trace. To print a stack trace use the + form instead. + + + The message object to log. + + + + + + Log a message object with the level including + the stack trace of the passed + as a parameter. + + The message object to log. + The exception to log, including its stack trace. + + + See the form for more detailed information. + + + + + + + Log a formatted message string with the level. + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + An that supplies culture-specific formatting information + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + Log a message object with the level. + + Logs a message object with the level. + + The message object to log. + + + This method first checks if this logger is ERROR + enabled by comparing the level of this logger with the + level. If this logger is + ERROR enabled, then it converts the message object + (passed as parameter) to a string by invoking the appropriate + . It then + proceeds to call all the registered appenders in this logger + and also higher in the hierarchy depending on the value of the + additivity flag. + + WARNING Note that passing an + to this method will print the name of the + but no stack trace. To print a stack trace use the + form instead. + + + + + + + + Log a message object with the level including + the stack trace of the passed + as a parameter. + + The message object to log. + The exception to log, including its stack trace. + + + See the form for more detailed information. + + + + + + + Log a formatted message string with the level. + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + An that supplies culture-specific formatting information + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + Log a message object with the level. + + Log a message object with the level. + + + + This method first checks if this logger is FATAL + enabled by comparing the level of this logger with the + level. If this logger is + FATAL enabled, then it converts the message object + (passed as parameter) to a string by invoking the appropriate + . It then + proceeds to call all the registered appenders in this logger + and also higher in the hierarchy depending on the value of the + additivity flag. + + WARNING Note that passing an + to this method will print the name of the + but no stack trace. To print a stack trace use the + form instead. + + + The message object to log. + + + + + + Log a message object with the level including + the stack trace of the passed + as a parameter. + + The message object to log. + The exception to log, including its stack trace. + + + See the form for more detailed information. + + + + + + + Log a formatted message string with the level. + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + An that supplies culture-specific formatting information + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Checks if this logger is enabled for the level. + + + true if this logger is enabled for events, false otherwise. + + + + This function is intended to lessen the computational cost of + disabled log debug statements. + + For some ILog interface log, when you write: + + log.Debug("This is entry number: " + i ); + + + You incur the cost constructing the message, string construction and concatenation in + this case, regardless of whether the message is logged or not. + + + If you are worried about speed (who isn't), then you should write: + + + if (log.IsDebugEnabled) + { + log.Debug("This is entry number: " + i ); + } + + + This way you will not incur the cost of parameter + construction if debugging is disabled for log. On + the other hand, if the log is debug enabled, you + will incur the cost of evaluating whether the logger is debug + enabled twice. Once in and once in + the . This is an insignificant overhead + since evaluating a logger takes about 1% of the time it + takes to actually log. This is the preferred style of logging. + + Alternatively if your logger is available statically then the is debug + enabled state can be stored in a static variable like this: + + + private static readonly bool isDebugEnabled = log.IsDebugEnabled; + + + Then when you come to log you can write: + + + if (isDebugEnabled) + { + log.Debug("This is entry number: " + i ); + } + + + This way the debug enabled state is only queried once + when the class is loaded. Using a private static readonly + variable is the most efficient because it is a run time constant + and can be heavily optimized by the JIT compiler. + + + Of course if you use a static readonly variable to + hold the enabled state of the logger then you cannot + change the enabled state at runtime to vary the logging + that is produced. You have to decide if you need absolute + speed or runtime flexibility. + + + + + + + + Checks if this logger is enabled for the level. + + + true if this logger is enabled for events, false otherwise. + + + For more information see . + + + + + + + + Checks if this logger is enabled for the level. + + + true if this logger is enabled for events, false otherwise. + + + For more information see . + + + + + + + + Checks if this logger is enabled for the level. + + + true if this logger is enabled for events, false otherwise. + + + For more information see . + + + + + + + + Checks if this logger is enabled for the level. + + + true if this logger is enabled for events, false otherwise. + + + For more information see . + + + + + + + + A flexible layout configurable with pattern string that re-evaluates on each call. + + + This class is built on and provides all the + features and capabilities of PatternLayout. PatternLayout is a 'static' class + in that its layout is done once at configuration time. This class will recreate + the layout on each reference. + One important difference between PatternLayout and DynamicPatternLayout is the + treatment of the Header and Footer parameters in the configuration. The Header and Footer + parameters for DynamicPatternLayout must be syntactically in the form of a PatternString, + but should not be marked as type log4net.Util.PatternString. Doing so causes the + pattern to be statically converted at configuration time and causes DynamicPatternLayout + to perform the same as PatternLayout. + Please see for complete documentation. + + <layout type="log4net.Layout.DynamicPatternLayout"> + <param name="Header" value="%newline**** Trace Opened Local: %date{yyyy-MM-dd HH:mm:ss.fff} UTC: %utcdate{yyyy-MM-dd HH:mm:ss.fff} ****%newline" /> + <param name="Footer" value="**** Trace Closed %date{yyyy-MM-dd HH:mm:ss.fff} ****%newline" /> + </layout> + + + + + + The header PatternString + + + + + The footer PatternString + + + + + Constructs a DynamicPatternLayout using the DefaultConversionPattern + + + + The default pattern just produces the application supplied message. + + + + + + Constructs a DynamicPatternLayout using the supplied conversion pattern. + + The pattern to use. + + + + Gets or sets the header for the layout format. + + the layout header + + + The Header text will be appended before any logging events + are formatted and appended. + + The pattern will be formatted on each get operation. + + + + + Gets or sets the footer for the layout format. + + the layout footer + + + The Footer text will be appended after all the logging events + have been formatted and appended. + + The pattern will be formatted on each get operation. + + + + + A Layout that renders only the Exception text from the logging event + + + + This Layout should only be used with appenders that utilize multiple + layouts (e.g. ). + + + Nicko Cadell + Gert Driesen + + + + Constructs an ExceptionLayout. + + + + + Activates component options. + + + + Part of the component activation + framework. + + + This method does nothing as options become effective immediately. + + + + + + Gets the exception text from the logging event + + The TextWriter to write the formatted event to + the event being logged + + + Write the exception string to the . + The exception string is retrieved from . + + + + + + Interface implemented by layout objects + + + + An object is used to format a + as text. The method is called by an + appender to transform the into a string. + + + The layout can also supply and + text that is appender before any events and after all the events respectively. + + + Nicko Cadell + Gert Driesen + + + + Implement this method to create your own layout format. + + The TextWriter to write the formatted event to + The event to format + + + This method is called by an appender to format + the as text and output to a writer. + + + If the caller does not have a and prefers the + event to be formatted as a then the following + code can be used to format the event into a . + + + StringWriter writer = new StringWriter(); + Layout.Format(writer, loggingEvent); + string formattedEvent = writer.ToString(); + + + + + + The content type output by this layout. + + The content type + + + The content type output by this layout. + + + This is a MIME type e.g. "text/plain". + + + + + + The header for the layout format. + + the layout header + + + The Header text will be appended before any logging events + are formatted and appended. + + + + + + The footer for the layout format. + + the layout footer + + + The Footer text will be appended after all the logging events + have been formatted and appended. + + + + + + Flag indicating if this layout handle exceptions + + false if this layout handles exceptions + + + If this layout handles the exception object contained within + , then the layout should return + false. Otherwise, if the layout ignores the exception + object, then the layout should return true. + + + + + + Extensions for + + Jan Friedrich + + + + writes the specified start tag and associates it with the given namespace and prefix + + Writer + The full name of the element + The namespace prefix of the element + The local name of the element + The namespace URI to associate with the element + + + + Creates an XmlWriter + + TextWriter + XmlWriter + + + + Interface for raw layout objects + + + + Interface used to format a + to an object. + + + This interface should not be confused with the + interface. This interface is used in + only certain specialized situations where a raw object is + required rather than a formatted string. The + is not generally useful than this interface. + + + Nicko Cadell + Gert Driesen + + + + Implement this method to create your own layout format. + + The event to format + returns the formatted event + + + Implement this method to create your own layout format. + + + + + + Adapts any to a + + + + Where an is required this adapter + allows a to be specified. + + + Nicko Cadell + Gert Driesen + + + + The layout to adapt + + + + + Construct a new adapter + + the layout to adapt + + + Create the adapter for the specified . + + + + + + Formats the logging event as an object. + + The event to format + returns the formatted event + + + Uses the object supplied to + the constructor to perform the formatting. + + + + + + Extend this abstract class to create your own log layout format. + + + + This is the base implementation of the + interface. Most layout objects should extend this class. + + + + + + Subclasses must implement the + method. + + + Subclasses should set the in their default + constructor. + + + + Nicko Cadell + Gert Driesen + + + + Empty default constructor + + + + Empty default constructor + + + + + + Activate component options + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + This method must be implemented by the subclass. + + + + + + Implement this method to create your own layout format. + + The TextWriter to write the formatted event to + The event to format + + + This method is called by an appender to format + the as text. + + + + + + Convenience method for easily formatting the logging event into a string variable. + + + + Creates a new StringWriter instance to store the formatted logging event. + + + + + The content type output by this layout. + + The content type is "text/plain" + + + The content type output by this layout. + + + This base class uses the value "text/plain". + To change this value a subclass must override this + property. + + + + + + The header for the layout format. + + the layout header + + + The Header text will be appended before any logging events + are formatted and appended. + + + + + + The footer for the layout format. + + the layout footer + + + The Footer text will be appended after all the logging events + have been formatted and appended. + + + + + + Flag indicating if this layout handles exceptions. + + false if this layout handles exceptions + + + If this layout handles the exception object contained within + , then the layout should return + false. Otherwise, if the layout ignores the exception + object, then the layout should return true. + + + Set this value to override the default setting. The default + value is true, this layout does not handle the exception. + + + + + + A flexible layout configurable with pattern string. + + + + The goal of this class is to a + as a string. The results + depend on the conversion pattern. + + + The conversion pattern is closely related to the conversion + pattern of the printf function in C. A conversion pattern is + composed of literal text and format control expressions called + conversion specifiers. + + + You are free to insert any literal text within the conversion + pattern. + + + Each conversion specifier starts with a percent sign (%) and is + followed by optional format modifiers and a conversion + pattern name. The conversion pattern name specifies the type of + data, e.g. logger, level, date, thread name. The format + modifiers control such things as field width, padding, left and + right justification. The following is a simple example. + + + Let the conversion pattern be "%-5level [%thread]: %message%newline" and assume + that the log4net environment was set to use a PatternLayout. Then the + statements + + + ILog log = LogManager.GetLogger(typeof(TestApp)); + log.Debug("Message 1"); + log.Warn("Message 2"); + + would yield the output + + DEBUG [main]: Message 1 + WARN [main]: Message 2 + + + Note that there is no explicit separator between text and + conversion specifiers. The pattern parser knows when it has reached + the end of a conversion specifier when it reads a conversion + character. In the example above the conversion specifier + %-5level means the level of the logging event should be left + justified to a width of five characters. + + + The recognized conversion pattern names are: + + + + Conversion Pattern Name + Effect + + + a + Equivalent to appdomain + + + appdomain + + Used to output the friendly name of the AppDomain where the + logging event was generated. + + + + aspnet-cache + + + Used to output all cache items in the case of %aspnet-cache or just one named item if used as %aspnet-cache{key} + + + This pattern is not available for Compact Framework or Client Profile assemblies. + + + + + aspnet-context + + + Used to output all context items in the case of %aspnet-context or just one named item if used as %aspnet-context{key} + + + This pattern is not available for Compact Framework or Client Profile assemblies. + + + + + aspnet-request + + + Used to output all request parameters in the case of %aspnet-request or just one named param if used as %aspnet-request{key} + + + This pattern is not available for Compact Framework or Client Profile assemblies. + + + + + aspnet-session + + + Used to output all session items in the case of %aspnet-session or just one named item if used as %aspnet-session{key} + + + This pattern is not available for Compact Framework or Client Profile assemblies. + + + + + c + Equivalent to logger + + + C + Equivalent to type + + + class + Equivalent to type + + + d + Equivalent to date + + + date + + + Used to output the date of the logging event in the local time zone. + To output the date in universal time use the %utcdate pattern. + The date conversion + specifier may be followed by a date format specifier enclosed + between braces. For example, %date{HH:mm:ss,fff} or + %date{dd MMM yyyy HH:mm:ss,fff}. If no date format specifier is + given then ISO8601 format is + assumed (). + + + The date format specifier admits the same syntax as the + time pattern string of the . + + + For better results it is recommended to use the log4net date + formatters. These can be specified using one of the strings + "ABSOLUTE", "DATE" and "ISO8601" for specifying + , + and respectively + . For example, + %date{ISO8601} or %date{ABSOLUTE}. + + + These dedicated date formatters perform significantly + better than . + + + + + exception + + + Used to output the exception passed in with the log message. + + + If an exception object is stored in the logging event + it will be rendered into the pattern output with a + trailing newline. + If there is no exception then nothing will be output + and no trailing newline will be appended. + It is typical to put a newline before the exception + and to have the exception as the last data in the pattern. + + + + + F + Equivalent to file + + + file + + + Used to output the file name where the logging request was + issued. + + + WARNING Generating caller location information is + extremely slow. Its use should be avoided unless execution speed + is not an issue. + + + See the note below on the availability of caller location information. + + + + + identity + + + Used to output the user name for the currently active user + (Principal.Identity.Name). + + + WARNING Generating caller information is + extremely slow. Its use should be avoided unless execution speed + is not an issue. + + + + + l + Equivalent to location + + + L + Equivalent to line + + + location + + + Used to output location information of the caller which generated + the logging event. + + + The location information depends on the CLI implementation but + usually consists of the fully qualified name of the calling + method followed by the callers source the file name and line + number between parentheses. + + + The location information can be very useful. However, its + generation is extremely slow. Its use should be avoided + unless execution speed is not an issue. + + + See the note below on the availability of caller location information. + + + + + level + + + Used to output the level of the logging event. + + + + + line + + + Used to output the line number from where the logging request + was issued. + + + WARNING Generating caller location information is + extremely slow. Its use should be avoided unless execution speed + is not an issue. + + + See the note below on the availability of caller location information. + + + + + logger + + + Used to output the logger of the logging event. The + logger conversion specifier can be optionally followed by + precision specifier, that is a decimal constant in + brackets. + + + If a precision specifier is given, then only the corresponding + number of right most components of the logger name will be + printed. By default the logger name is printed in full. + + + For example, for the logger name "a.b.c" the pattern + %logger{2} will output "b.c". + + + + + m + Equivalent to message + + + M + Equivalent to method + + + message + + + Used to output the application supplied message associated with + the logging event. + + + + + mdc + + + The MDC (old name for the ThreadContext.Properties) is now part of the + combined event properties. This pattern is supported for compatibility + but is equivalent to property. + + + + + method + + + Used to output the method name where the logging request was + issued. + + + WARNING Generating caller location information is + extremely slow. Its use should be avoided unless execution speed + is not an issue. + + + See the note below on the availability of caller location information. + + + + + n + Equivalent to newline + + + newline + + + Outputs the platform dependent line separator character or + characters. + + + This conversion pattern offers the same performance as using + non-portable line separator strings such as "\n", or "\r\n". + Thus, it is the preferred way of specifying a line separator. + + + + + ndc + + + Used to output the NDC (nested diagnostic context) associated + with the thread that generated the logging event. + + + + + p + Equivalent to level + + + P + Equivalent to property + + + properties + Equivalent to property + + + property + + + Used to output the an event specific property. The key to + lookup must be specified within braces and directly following the + pattern specifier, e.g. %property{user} would include the value + from the property that is keyed by the string 'user'. Each property value + that is to be included in the log must be specified separately. + Properties are added to events by loggers or appenders. By default + the log4net:HostName property is set to the name of machine on + which the event was originally logged. + + + If no key is specified, e.g. %property then all the keys and their + values are printed in a comma separated list. + + + The properties of an event are combined from a number of different + contexts. These are listed below in the order in which they are searched. + + + + the event properties + + The event has that can be set. These + properties are specific to this event only. + + + + the thread properties + + The that are set on the current + thread. These properties are shared by all events logged on this thread. + + + + the global properties + + The that are set globally. These + properties are shared by all the threads in the AppDomain. + + + + + + + + r + Equivalent to timestamp + + + stacktrace + + + Used to output the stack trace of the logging event + The stack trace level specifier may be enclosed + between braces. For example, %stacktrace{level}. + If no stack trace level specifier is given then 1 is assumed + + + Output uses the format: + type3.MethodCall3 > type2.MethodCall2 > type1.MethodCall1 + + + This pattern is not available for Compact Framework assemblies. + + + + + stacktracedetail + + + Used to output the stack trace of the logging event + The stack trace level specifier may be enclosed + between braces. For example, %stacktracedetail{level}. + If no stack trace level specifier is given then 1 is assumed + + + Output uses the format: + type3.MethodCall3(type param,...) > type2.MethodCall2(type param,...) > type1.MethodCall1(type param,...) + + + This pattern is not available for Compact Framework assemblies. + + + + + t + Equivalent to thread + + + timestamp + + + Used to output the number of milliseconds elapsed since the start + of the application until the creation of the logging event. + + + + + thread + + + Used to output the name of the thread that generated the + logging event. Uses the thread number if no name is available. + + + + + type + + + Used to output the fully qualified type name of the caller + issuing the logging request. This conversion specifier + can be optionally followed by precision specifier, that + is a decimal constant in brackets. + + + If a precision specifier is given, then only the corresponding + number of right most components of the class name will be + printed. By default the class name is output in fully qualified form. + + + For example, for the class name "log4net.Layout.PatternLayout", the + pattern %type{1} will output "PatternLayout". + + + WARNING Generating the caller class information is + slow. Thus, its use should be avoided unless execution speed is + not an issue. + + + See the note below on the availability of caller location information. + + + + + u + Equivalent to identity + + + username + + + Used to output the WindowsIdentity for the currently + active user. + + + WARNING Generating caller WindowsIdentity information is + extremely slow. Its use should be avoided unless execution speed + is not an issue. + + + + + utcdate + + + Used to output the date of the logging event in universal time. + The date conversion + specifier may be followed by a date format specifier enclosed + between braces. For example, %utcdate{HH:mm:ss,fff} or + %utcdate{dd MMM yyyy HH:mm:ss,fff}. If no date format specifier is + given then ISO8601 format is + assumed (). + + + The date format specifier admits the same syntax as the + time pattern string of the . + + + For better results it is recommended to use the log4net date + formatters. These can be specified using one of the strings + "ABSOLUTE", "DATE" and "ISO8601" for specifying + , + and respectively + . For example, + %utcdate{ISO8601} or %utcdate{ABSOLUTE}. + + + These dedicated date formatters perform significantly + better than . + + + + + w + Equivalent to username + + + x + Equivalent to ndc + + + X + Equivalent to mdc + + + % + + + The sequence %% outputs a single percent sign. + + + + + + The single letter patterns are deprecated in favor of the + longer more descriptive pattern names. + + + By default the relevant information is output as is. However, + with the aid of format modifiers it is possible to change the + minimum field width, the maximum field width and justification. + + + The optional format modifier is placed between the percent sign + and the conversion pattern name. + + + The first optional format modifier is the left justification + flag which is just the minus (-) character. Then comes the + optional minimum field width modifier. This is a decimal + constant that represents the minimum number of characters to + output. If the data item requires fewer characters, it is padded on + either the left or the right until the minimum width is + reached. The default is to pad on the left (right justify) but you + can specify right padding with the left justification flag. The + padding character is space. If the data item is larger than the + minimum field width, the field is expanded to accommodate the + data. The value is never truncated. + + + This behavior can be changed using the maximum field + width modifier which is designated by a period followed by a + decimal constant. If the data item is longer than the maximum + field, then the extra characters are removed from the + beginning of the data item and not from the end. For + example, it the maximum field width is eight and the data item is + ten characters long, then the first two characters of the data item + are dropped. This behavior deviates from the printf function in C + where truncation is done from the end. + + + Below are various format modifier examples for the logger + conversion specifier. + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Format modifierleft justifyminimum widthmaximum widthcomment
%20loggerfalse20none + + Left pad with spaces if the logger name is less than 20 + characters long. + +
%-20loggertrue20none + + Right pad with spaces if the logger + name is less than 20 characters long. + +
%.30loggerNAnone30 + + Truncate from the beginning if the logger + name is longer than 30 characters. + +
%20.30loggerfalse2030 + + Left pad with spaces if the logger name is shorter than 20 + characters. However, if logger name is longer than 30 characters, + then truncate from the beginning. + +
%-20.30loggertrue2030 + + Right pad with spaces if the logger name is shorter than 20 + characters. However, if logger name is longer than 30 characters, + then truncate from the beginning. + +
+
+ + Note about caller location information.
+ The following patterns %type %file %line %method %location %class %C %F %L %l %M + all generate caller location information. + Location information uses the System.Diagnostics.StackTrace class to generate + a call stack. The caller's information is then extracted from this stack. +
+ + + The System.Diagnostics.StackTrace class is not supported on the + .NET Compact Framework 1.0 therefore caller location information is not + available on that framework. + + + + + The System.Diagnostics.StackTrace class has this to say about Release builds: + + + "StackTrace information will be most informative with Debug build configurations. + By default, Debug builds include debug symbols, while Release builds do not. The + debug symbols contain most of the file, method name, line number, and column + information used in constructing StackFrame and StackTrace objects. StackTrace + might not report as many method calls as expected, due to code transformations + that occur during optimization." + + + This means that in a Release build the caller information may be incomplete or may + not exist at all! Therefore caller location information cannot be relied upon in a Release build. + + + + Additional pattern converters may be registered with a specific + instance using the method. + +
+ + This is a more detailed pattern. + %timestamp [%thread] %level %logger %ndc - %message%newline + + + A similar pattern except that the relative time is + right padded if less than 6 digits, thread name is right padded if + less than 15 characters and truncated if longer and the logger + name is left padded if shorter than 30 characters and truncated if + longer. + %-6timestamp [%15.15thread] %-5level %30.30logger %ndc - %message%newline + + Nicko Cadell + Gert Driesen + Douglas de la Torre + Daniel Cazzulino +
+ + + Default pattern string for log output. + + + + Default pattern string for log output. + Currently set to the string "%message%newline" + which just prints the application supplied message. + + + + + + A detailed conversion pattern + + + + A conversion pattern which includes Time, Thread, Logger, and Nested Context. + Current value is %timestamp [%thread] %level %logger %ndc - %message%newline. + + + + + + Internal map of converter identifiers to converter types. + + + + This static map is overridden by the converterRegistry instance map + + + + + + the head of the pattern converter chain + + + + + patterns defined on this PatternLayout only + + + + + Constructs a PatternLayout using the DefaultConversionPattern + + + + The default pattern just produces the application supplied message. + + + Note to Inheritors: This constructor calls the virtual method + . If you override this method be + aware that it will be called before your is called constructor. + + + As per the contract the + method must be called after the properties on this object have been + configured. + + + + + + Constructs a PatternLayout using the supplied conversion pattern + + the pattern to use + + + Note to Inheritors: This constructor calls the virtual method + . If you override this method be + aware that it will be called before your is called constructor. + + + When using this constructor the method + need not be called. This may not be the case when using a subclass. + + + + + + Gets or sets the pattern formatting string. + + + + The ConversionPattern option. This is the string which + controls formatting and consists of a mix of literal content and + conversion specifiers. + + + + + + Create the pattern parser instance + + the pattern to parse + The that will format the event + + + Creates the used to parse the conversion string. Sets the + global and instance rules on the . + + + + + + Initializes layout options. + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Produces a formatted string as specified by the conversion pattern. + + The event being logged. + The TextWriter to write the formatted event to. + + + Parses the using the patter format + specified in the property. + + + + + + Add a converter to this PatternLayout + + the converter info + + + This version of the method is used by the configurator. + Programmatic users should use the alternative method. + + + + + + Adds a named pattern converter to this PatternLayout. + + the name of the conversion pattern for this converter + the type of the converter + + + This converter will be used in the formatting of the event. + This method must be called before . + + + The specified must extend the + type. + + + + + + Write the event appdomain name to the output + + + + Writes the to the output writer. + + + Daniel Cazzulino + Nicko Cadell + + + + Write the event appdomain name to the output + + that will receive the formatted result. + the event being logged + + + Writes the to the output . + + + + + + Converter for items in the ASP.Net Cache. + + + + Outputs an item from the . + + + Ron Grabowski + + + + Write the ASP.Net Cache item to the output + + that will receive the formatted result. + The on which the pattern converter should be executed. + The under which the ASP.Net request is running. + + + Writes out the value of a named property. The property name + should be set in the + property. If no property has been set, all key value pairs from the Cache will + be written to the output. + + + + + + Converter for items in the . + + + + Outputs an item from the . + + + Ron Grabowski + + + + Write the ASP.Net HttpContext item to the output + + that will receive the formatted result. + The on which the pattern converter should be executed. + The under which the ASP.Net request is running. + + + Writes out the value of a named property. The property name + should be set in the + property. + + + + + + Abstract class that provides access to the current HttpContext () that + derived classes need. + + + This class handles the case when HttpContext.Current is null by writing + to the writer. + + Ron Grabowski + + + + Derived pattern converters must override this method in order to + convert conversion specifiers in the correct way. + + that will receive the formatted result. + The on which the pattern converter should be executed. + The under which the ASP.Net request is running. + + + + Converter for items in the ASP.Net Cache. + + + + Outputs an item from the . + + + Ron Grabowski + + + + Write the ASP.Net Cache item to the output + + that will receive the formatted result. + The on which the pattern converter should be executed. + The under which the ASP.Net request is running. + + + Writes out the value of a named property. The property name + should be set in the + property. + + + + + + Converter for items in the ASP.Net Cache. + + + + Outputs an item from the . + + + Ron Grabowski + + + + Write the ASP.Net Cache item to the output + + that will receive the formatted result. + The on which the pattern converter should be executed. + The under which the ASP.Net request is running. + + + Writes out the value of a named property. The property name + should be set in the + property. If no property has been set, all key value pairs from the Session will + be written to the output. + + + + + + Date pattern converter, uses a to format + the date of a . + + + + Render the to the writer as a string. + + + The value of the determines + the formatting of the date. The following values are allowed: + + + Option value + Output + + + ISO8601 + + Uses the formatter. + Formats using the "yyyy-MM-dd HH:mm:ss,fff" pattern. + + + + DATE + + Uses the formatter. + Formats using the "dd MMM yyyy HH:mm:ss,fff" for example, "06 Nov 1994 15:49:37,459". + + + + ABSOLUTE + + Uses the formatter. + Formats using the "HH:mm:ss,yyyy" for example, "15:49:37,459". + + + + other + + Any other pattern string uses the formatter. + This formatter passes the pattern string to the + method. + For details on valid patterns see + DateTimeFormatInfo Class. + + + + + + The is in the local time zone and is rendered in that zone. + To output the time in Universal time see . + + + Nicko Cadell + + + + The used to render the date to a string + + + + + Initialize the converter pattern based on the property. + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Converts the pattern into the rendered message. + + that will receive the formatted result. + the event being logged + + + Pass the to the + for it to render it to the writer. + + + The passed is in the local time zone. + + + + + + Write the exception text to the output + + + + If an exception object is stored in the logging event + it will be rendered into the pattern output with a + trailing newline. + + + If there is no exception then nothing will be output + and no trailing newline will be appended. + It is typical to put a newline before the exception + and to have the exception as the last data in the pattern. + + + Nicko Cadell + + + + Default constructor + + + + + Write the exception text to the output + + that will receive the formatted result. + the event being logged + + + If an exception object is stored in the logging event + it will be rendered into the pattern output with a + trailing newline. + + + If there is no exception or the exception property specified + by the Option value does not exist then nothing will be output + and no trailing newline will be appended. + It is typical to put a newline before the exception + and to have the exception as the last data in the pattern. + + + Recognized values for the Option parameter are: + + + + Message + + + Source + + + StackTrace + + + TargetSite + + + HelpLink + + + + + + + Writes the value of the for + the event to the output writer. + + Nicko Cadell + + + + Writes the value of the for + the to the output . + + that will receive the formatted result. + the event being logged + + + + Write the caller location info to the output + + + + Writes the to the output writer. + + + Nicko Cadell + + + + Write the caller location info to the output + + that will receive the formatted result. + the event being logged + + + Writes the to the output writer. + + + + + + Writes the event identity to the output + + + + Writes the value of the to + the output writer. + + + Daniel Cazzulino + Nicko Cadell + + + + Writes the event identity to the output + + that will receive the formatted result. + the event being logged + + + Writes the value of the + to + the output . + + + + + + Write the event level to the output + + + + Writes the display name of the event + to the writer. + + + Nicko Cadell + + + + Write the event level to the output + + that will receive the formatted result. + the event being logged + + + Writes the of the + to the . + + + + + + Write the caller location line number to the output + + + + Writes the value of the for + the event to the output writer. + + + Nicko Cadell + + + + Write the caller location line number to the output + + that will receive the formatted result. + the event being logged + + + Writes the value of the for + the to the output . + + + + + + Converter for logger name + + + + Outputs the of the event. + + + Nicko Cadell + + + + Gets the fully qualified name of the logger + + the event being logged + The fully qualified logger name + + + Returns the of the . + + + + + + Writes the event message to the output + + + + Uses the method + to write out the event message. + + + Nicko Cadell + + + + Writes the event message to the output + + that will receive the formatted result. + the event being logged + + + Uses the method + to write out the event message. + + + + + + Write the method name to the output + + + + Writes the caller location to + the output. + + + Nicko Cadell + + + + Write the method name to the output + + that will receive the formatted result. + the event being logged + + + Writes the caller location to + the output. + + + + + + Converter to output and truncate '.' separated strings + + + + This abstract class supports truncating a '.' separated string + to show a specified number of elements from the right hand side. + This is used to truncate class names that are fully qualified. + + + Subclasses should override the method to + return the fully qualified string. + + + Nicko Cadell + + + + Initialize the converter + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Gets the fully qualified '.' (dot/period) separated name for an event. + + the event being logged + the fully qualified name + + + Overridden by subclasses to get the fully qualified name before the + precision is applied to it. + + + + + + Converts the pattern to the rendered message + + that will receive the formatted result. + the event being logged + + Render the to the precision + specified by the property. + + + + + The fully qualified type of the NamedPatternConverter class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Converter to include event NDC + + + + Outputs the value of the event property named NDC. + + + The should be used instead. + + + Nicko Cadell + + + + Write the event NDC to the output + + that will receive the formatted result. + the event being logged + + + As the thread context stacks are now stored in named event properties + this converter simply looks up the value of the NDC property. + + + The should be used instead. + + + + + + Abstract class that provides the formatting functionality that + derived classes need. + + + Conversion specifiers in a conversion patterns are parsed to + individual PatternConverters. Each of which is responsible for + converting a logging event in a converter specific manner. + + Nicko Cadell + + + + Initializes a new instance of the class. + + + + + Flag indicating if this converter handles the logging event exception + + false if this converter handles the logging event exception + + + If this converter handles the exception object contained within + , then this property should be set to + false. Otherwise, if the layout ignores the exception + object, then the property should be set to true. + + + Set this value to override a this default setting. The default + value is true, this converter does not handle the exception. + + + + + + Derived pattern converters must override this method in order to + convert conversion specifiers in the correct way. + + that will receive the formatted result. + The on which the pattern converter should be executed. + + + + Derived pattern converters must override this method in order to + convert conversion specifiers in the correct way. + + that will receive the formatted result. + The state object on which the pattern converter should be executed. + + + + Property pattern converter + + + + Writes out the value of a named property. The property name + should be set in the + property. + + + If the is set to null + then all the properties are written as key value pairs. + + + Nicko Cadell + + + + Write the property value to the output + + that will receive the formatted result. + the event being logged + + + Writes out the value of a named property. The property name + should be set in the + property. + + + If the is set to null + then all the properties are written as key value pairs. + + + + + + Converter to output the relative time of the event + + + + Converter to output the time of the event relative to the start of the program. + + + Nicko Cadell + + + + Write the relative time to the output + + that will receive the formatted result. + the event being logged + + + Writes out the relative time of the event in milliseconds. + That is the number of milliseconds between the event + and the . + + + + + + Helper method to get the time difference between two DateTime objects + + start time (in the current local time zone) + end time (in the current local time zone) + the time difference in milliseconds + + + + Writes the to the output writer, using format: + type3.MethodCall3(type param,...) > type2.MethodCall2(type param,...) > type1.MethodCall1(type param,...) + + Adam Davies + + + + + + + The fully qualified type of the StackTraceDetailPatternConverter class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Write the caller stack frames to the output + + + + Writes the to the output writer, using format: + type3.MethodCall3 > type2.MethodCall2 > type1.MethodCall1 + + + Michael Cromwell + + + + Initialize the converter + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Write the strack frames to the output + + that will receive the formatted result. + the event being logged + + + Writes the to the output writer. + + + + + + Returns the Name of the method + + + This method was created, so this class could be used as a base class for StackTraceDetailPatternConverter + string + + + + The fully qualified type of the StackTracePatternConverter class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Converter to include event thread name + + + + Writes the to the output. + + + Nicko Cadell + + + + Write the ThreadName to the output + + that will receive the formatted result. + the event being logged + + + Writes the to the . + + + + + + Pattern converter for the class name + + + + Outputs the of the event. + + + Nicko Cadell + + + + Gets the fully qualified name of the class + + the event being logged + The fully qualified type name for the caller location + + + Returns the of the . + + + + + + Converter to include event user name + + Douglas de la Torre + Nicko Cadell + + + + Convert the pattern to the rendered message + + that will receive the formatted result. + the event being logged + + + + Writes the TimeStamp to the output. + + + + Date pattern converter, uses a to format + the date of a . + + + Uses a to format the + in Universal time. + + + See the for details on the date pattern syntax. + + + + Nicko Cadell + + + + Writes the TimeStamp to the output. + + that will receive the formatted result. + the event being logged + + + Pass the to the + for it to render it to the writer. + + + The passed is in the local time zone, this is converted + to Universal time before it is rendered. + + + + + + + The fully qualified type of the UtcDatePatternConverter class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Type converter for the interface. + + + + Supports converting from the interface to + the interface using the . + + + Nicko Cadell + Gert Driesen + + + + Can the sourceType be converted to an + + the source to be to be converted + true if the source type can be converted to + + + Test if the can be converted to a + . Only is supported + as the . + + + + + + Converts the value to a object. + + the value to convert + the object + + + If the object is an then the + is used to adapt between the two interfaces, + otherwise an exception is thrown. + + + + + + Extracts the value of a property from the . + + Nicko Cadell + + + + The name of the value to look up in the LoggingEvent Properties collection. + + + + + Looks up the property for . + + The event to format + returns property value + + + Looks up and returns the object value of the property + named . If there is no property defined + with than name then null will be returned. + + + + + + Extracts the date from the . + + Nicko Cadell + Gert Driesen + + + + Gets the as a . + + The event to format + returns the time stamp + + + The time stamp is in local time. To format the time stamp + in universal time use . + + + + + + Extracts the date from the . + + Nicko Cadell + Gert Driesen + + + + Gets the as a . + + The event to format + returns the time stamp + + + The time stamp is in universal time. To format the time stamp + in local time use . + + + + + + A very simple layout + + + + SimpleLayout consists of the level of the log statement, + followed by " - " and then the log message itself. For example, + + DEBUG - Hello world + + + + Nicko Cadell + Gert Driesen + + + + Constructs a SimpleLayout + + + + + Initialize layout options + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Produces a simple formatted output. + + the event being logged + The TextWriter to write the formatted event to + + + Formats the event as the level of the event, + followed by " - " and then the log message itself. The + output is terminated by a newline. + + + + + + Layout that formats the log events as XML elements. + + + + The output of the consists of a series of + log4net:event elements. It does not output a complete well-formed XML + file. The output is designed to be included as an external entity + in a separate file to form a correct XML file. + + + For example, if abc is the name of the file where + the output goes, then a well-formed XML file would + be: + + + <?xml version="1.0" ?> + + <!DOCTYPE log4net:events SYSTEM "log4net-events.dtd" [<!ENTITY data SYSTEM "abc">]> + + <log4net:events version="1.2" xmlns:log4net="http://logging.apache.org/log4net/schemas/log4net-events-1.2> + &data; + </log4net:events> + + + This approach enforces the independence of the + and the appender where it is embedded. + + + The version attribute helps components to correctly + interpret output generated by . The value of + this attribute should be "1.2" for release 1.2 and later. + + + Alternatively the Header and Footer properties can be + configured to output the correct XML header, open tag and close tag. + When setting the Header and Footer properties it is essential + that the underlying data store not be appendable otherwise the data + will become invalid XML. + + + Nicko Cadell + Gert Driesen + + + + Constructs an XmlLayout + + + + + Constructs an XmlLayout. + + + + The LocationInfo option takes a boolean value. By + default, it is set to false which means there will be no location + information output by this layout. If the option is set to + true, then the file name and line number of the statement + at the origin of the log statement will be output. + + + If you are embedding this layout within an SmtpAppender + then make sure to set the LocationInfo option of that + appender as well. + + + + + + The prefix to use for all element names + + + + The default prefix is log4net. Set this property + to change the prefix. If the prefix is set to an empty string + then no prefix will be written. + + + + + + Set whether to base64 encode the message. + + + + By default the log message will be written as text to the xml + output. This can cause problems when the message contains binary + data. By setting this to true the contents of the message will be + base64 encoded. If this is set then invalid character replacement + (see ) will not be performed + on the log message. + + + + + + Set whether to base64 encode the property values. + + + + By default the properties will be written as text to the xml + output. This can cause problems when one or more properties contain + binary data. By setting this to true the values of the properties + will be base64 encoded. If this is set then invalid character replacement + (see ) will not be performed + on the property values. + + + + + + Initialize layout options + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + Builds a cache of the element names + + + + + + Does the actual writing of the XML. + + The writer to use to output the event to. + The event to write. + + + Override the base class method + to write the to the . + + + + + + Layout that formats the log events as XML elements. + + + + This is an abstract class that must be subclassed by an implementation + to conform to a specific schema. + + + Deriving classes must implement the method. + + + Nicko Cadell + Gert Driesen + + + + Protected constructor to support subclasses + + + + Initializes a new instance of the class + with no location info. + + + + + + Protected constructor to support subclasses + + + + The parameter determines whether + location information will be output by the layout. If + is set to true, then the + file name and line number of the statement at the origin of the log + statement will be output. + + + If you are embedding this layout within an SMTPAppender + then make sure to set the LocationInfo option of that + appender as well. + + + + + + Gets a value indicating whether to include location information in + the XML events. + + + true if location information should be included in the XML + events; otherwise, false. + + + + If is set to true, then the file + name and line number of the statement at the origin of the log + statement will be output. + + + If you are embedding this layout within an SMTPAppender + then make sure to set the LocationInfo option of that + appender as well. + + + + + + The string to replace characters that can not be expressed in XML with. + + + Not all characters may be expressed in XML. This property contains the + string to replace those that can not with. This defaults to a ?. Set it + to the empty string to simply remove offending characters. For more + details on the allowed character ranges see http://www.w3.org/TR/REC-xml/#charsets + Character replacement will occur in the log message, the property names + and the property values. + + + + + + + Initialize layout options + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Gets the content type output by this layout. + + + As this is the XML layout, the value is always "text/xml". + + + + As this is the XML layout, the value is always "text/xml". + + + + + + Produces a formatted string. + + The event being logged. + The TextWriter to write the formatted event to + + + Format the and write it to the . + + + This method creates an that writes to the + . The is passed + to the method. Subclasses should override the + method rather than this method. + + + + + + Does the actual writing of the XML. + + The writer to use to output the event to. + The event to write. + + + Subclasses should override this method to format the as XML. + + + + + + Layout that formats the log events as XML elements compatible with the log4j schema + + + + Formats the log events according to the http://logging.apache.org/log4j schema. + + + Nicko Cadell + + + + The 1st of January 1970 in UTC + + + + + Constructs an XMLLayoutSchemaLog4j + + + + + Constructs an XMLLayoutSchemaLog4j. + + + + The LocationInfo option takes a boolean value. By + default, it is set to false which means there will be no location + information output by this layout. If the option is set to + true, then the file name and line number of the statement + at the origin of the log statement will be output. + + + If you are embedding this layout within an SMTPAppender + then make sure to set the LocationInfo option of that + appender as well. + + + + + + The version of the log4j schema to use. + + + + Only version 1.2 of the log4j schema is supported. + + + + + + Actually do the writing of the xml + + the writer to use + the event to write + + + Generate XML that is compatible with the log4j schema. + + + + + + The log4net Logical Thread Context. + + + + The LogicalThreadContext provides a location for specific debugging + information to be stored. + The LogicalThreadContext properties override any or + properties with the same name. + + + For .NET Standard this class uses System.Threading.AsyncLocal rather than . + + + The Logical Thread Context has a properties map and a stack. + The properties and stack can + be included in the output of log messages. The + supports selecting and outputting these properties. + + + The Logical Thread Context provides a diagnostic context for the current call context. + This is an instrument for distinguishing interleaved log + output from different sources. Log output is typically interleaved + when a server handles multiple clients near-simultaneously. + + + The Logical Thread Context is managed on a per basis. + + + The requires a link time + for the + . + If the calling code does not have this permission then this context will be disabled. + It will not store any property values set on it. + + + Example of using the thread context properties to store a username. + + LogicalThreadContext.Properties["user"] = userName; + log.Info("This log message has a LogicalThreadContext Property called 'user'"); + + + Example of how to push a message into the context stack + + using(LogicalThreadContext.Stacks["LDC"].Push("my context message")) + { + log.Info("This log message has a LogicalThreadContext Stack message that includes 'my context message'"); + + } // at the end of the using block the message is automatically popped + + + + Nicko Cadell + + + + The thread properties map + + + + The LogicalThreadContext properties override any + or properties with the same name. + + + + + + The logical thread stacks. + + + + + This class is used by client applications to request logger instances. + + + + This class has static methods that are used by a client to request + a logger instance. The method is + used to retrieve a logger. + + + See the interface for more details. + + + Simple example of logging messages + + ILog log = LogManager.GetLogger("application-log"); + + log.Info("Application Start"); + log.Debug("This is a debug message"); + + if (log.IsDebugEnabled) + { + log.Debug("This is another debug message"); + } + + + + + Nicko Cadell + Gert Driesen + + + Returns the named logger if it exists. + + Returns the named logger if it exists. + + + + If the named logger exists (in the default repository) then it + returns a reference to the logger, otherwise it returns null. + + + The fully qualified logger name to look for. + The logger found, or null if no logger could be found. + + + Get the currently defined loggers. + + Returns all the currently defined loggers in the default repository. + + + The root logger is not included in the returned array. + + All the defined loggers. + + + Get or create a logger. + + Retrieves or creates a named logger. + + + + Retrieves a logger named as the + parameter. If the named logger already exists, then the + existing instance will be returned. Otherwise, a new instance is + created. + + By default, loggers do not have a set level but inherit + it from the hierarchy. This is one of the central features of + log4net. + + + The name of the logger to retrieve. + The logger with the name specified. + + + + Returns the named logger if it exists. + + + + If the named logger exists (in the specified repository) then it + returns a reference to the logger, otherwise it returns + null. + + + The repository to lookup in. + The fully qualified logger name to look for. + + The logger found, or null if the logger doesn't exist in the specified + repository. + + + + + Returns the named logger if it exists. + + + + If the named logger exists (in the repository for the specified assembly) then it + returns a reference to the logger, otherwise it returns + null. + + + The assembly to use to look up the repository. + The fully qualified logger name to look for. + + The logger, or null if the logger doesn't exist in the specified + assembly's repository. + + + + + Returns all the currently defined loggers in the specified repository. + + The repository to lookup in. + + The root logger is not included in the returned array. + + All the defined loggers. + + + + Returns all the currently defined loggers in the specified assembly's repository. + + The assembly to use to look up the repository. + + The root logger is not included in the returned array. + + All the defined loggers. + + + + Retrieves or creates a named logger. + + + + Retrieve a logger named as the + parameter. If the named logger already exists, then the + existing instance will be returned. Otherwise, a new instance is + created. + + + By default, loggers do not have a set level but inherit + it from the hierarchy. This is one of the central features of + log4net. + + + The repository to lookup in. + The name of the logger to retrieve. + The logger with the name specified. + + + + Retrieves or creates a named logger. + + + + Retrieve a logger named as the + parameter. If the named logger already exists, then the + existing instance will be returned. Otherwise, a new instance is + created. + + + By default, loggers do not have a set level but inherit + it from the hierarchy. This is one of the central features of + log4net. + + + The assembly to use to look up the repository. + The name of the logger to retrieve. + The logger with the name specified. + + + + Shorthand for . + + + Get the logger for the fully qualified name of the type specified. + + The full name of will be used as the name of the logger to retrieve. + The logger with the name specified. + + + + Shorthand for . + + + Gets the logger for the fully qualified name of the type specified. + + The repository to lookup in. + The full name of will be used as the name of the logger to retrieve. + The logger with the name specified. + + + + Shorthand for . + + + Gets the logger for the fully qualified name of the type specified. + + The assembly to use to look up the repository. + The full name of will be used as the name of the logger to retrieve. + The logger with the name specified. + + + + Shuts down the log4net system. + + + + Calling this method will safely close and remove all + appenders in all the loggers including root contained in all the + default repositories. + + + Some appenders need to be closed before the application exists. + Otherwise, pending logging events might be lost. + + The shutdown method is careful to close nested + appenders before closing regular appenders. This allows + configurations where a regular appender is attached to a logger + and again to a nested appender. + + + + + Shutdown a logger repository. + + Shuts down the default repository. + + + + Calling this method will safely close and remove all + appenders in all the loggers including root contained in the + default repository. + + Some appenders need to be closed before the application exists. + Otherwise, pending logging events might be lost. + + The shutdown method is careful to close nested + appenders before closing regular appenders. This allows + configurations where a regular appender is attached to a logger + and again to a nested appender. + + + + + + Shuts down the repository for the repository specified. + + + + Calling this method will safely close and remove all + appenders in all the loggers including root contained in the + specified. + + + Some appenders need to be closed before the application exists. + Otherwise, pending logging events might be lost. + + The shutdown method is careful to close nested + appenders before closing regular appenders. This allows + configurations where a regular appender is attached to a logger + and again to a nested appender. + + + The repository to shut down. + + + + Shuts down the repository specified. + + + + Calling this method will safely close and remove all + appenders in all the loggers including root contained in the + repository. The repository is looked up using + the specified. + + + Some appenders need to be closed before the application exists. + Otherwise, pending logging events might be lost. + + + The shutdown method is careful to close nested + appenders before closing regular appenders. This allows + configurations where a regular appender is attached to a logger + and again to a nested appender. + + + The assembly to use to look up the repository. + + + Reset the configuration of a repository + + Resets all values contained in this repository instance to their defaults. + + + + Resets all values contained in the repository instance to their + defaults. This removes all appenders from all loggers, sets + the level of all non-root loggers to null, + sets their additivity flag to true and sets the level + of the root logger to . Moreover, + message disabling is set to its default "off" value. + + + + + + Resets all values contained in this repository instance to their defaults. + + + + Reset all values contained in the repository instance to their + defaults. This removes all appenders from all loggers, sets + the level of all non-root loggers to null, + sets their additivity flag to true and sets the level + of the root logger to . Moreover, + message disabling is set to its default "off" value. + + + The repository to reset. + + + + Resets all values contained in this repository instance to their defaults. + + + + Reset all values contained in the repository instance to their + defaults. This removes all appenders from all loggers, sets + the level of all non-root loggers to null, + sets their additivity flag to true and sets the level + of the root logger to . Moreover, + message disabling is set to its default "off" value. + + + The assembly to use to look up the repository to reset. + + + Get a logger repository. + + Returns the default instance. + + + + Gets the for the repository specified + by the callers assembly (). + + + The instance for the default repository. + + + + Returns the default instance. + + The default instance. + + + Gets the for the repository specified + by the argument. + + + The repository to lookup in. + + + + Returns the default instance. + + The default instance. + + + Gets the for the repository specified + by the argument. + + + The assembly to use to look up the repository. + + + Create a logger repository. + + Creates a repository with the specified repository type. + + A that implements + and has a no arg constructor. An instance of this type will be created to act + as the for the repository specified. + The created for the repository. + + + The created will be associated with the repository + specified such that a call to will return + the same repository instance. + + + + + + Creates a repository with the specified name. + + + + Creates the default type of which is a + object. + + + The name must be unique. Repositories cannot be redefined. + An will be thrown if the repository already exists. + + + The name of the repository, this must be unique amongst repositories. + The created for the repository. + The specified repository already exists. + + + + Creates a repository with the specified name and repository type. + + + + The name must be unique. Repositories cannot be redefined. + An will be thrown if the repository already exists. + + + The name of the repository, this must be unique to the repository. + A that implements + and has a no arg constructor. An instance of this type will be created to act + as the for the repository specified. + The created for the repository. + The specified repository already exists. + + + + Creates a repository for the specified assembly and repository type. + + + + The created will be associated with the repository + specified such that a call to with the + same assembly specified will return the same repository instance. + + + The assembly to use to get the name of the repository. + A that implements + and has a no arg constructor. An instance of this type will be created to act + as the for the repository specified. + The created for the repository. + + + + Gets the list of currently defined repositories. + + + + Get an array of all the objects that have been created. + + + An array of all the known objects. + + + + Flushes logging events buffered in all configured appenders in the default repository. + + The maximum time in milliseconds to wait for logging events from asynchronous appenders to be flushed. + True if all logging events were flushed successfully, else false. + + + + Looks up the wrapper object for the logger specified. + + The logger to get the wrapper for. + The wrapper for the logger specified. + + + + Looks up the wrapper objects for the loggers specified. + + The loggers to get the wrappers for. + The wrapper objects for the loggers specified. + + + + Create the objects used by + this manager. + + The logger to wrap. + The wrapper for the logger specified. + + + + The wrapper map to use to hold the objects. + + + + + Implementation of Mapped Diagnostic Contexts. + + + + + The MDC is deprecated and has been replaced by the . + The current MDC implementation forwards to the ThreadContext.Properties. + + + + The MDC class is similar to the class except that it is + based on a map instead of a stack. It provides mapped + diagnostic contexts. A Mapped Diagnostic Context, or + MDC in short, is an instrument for distinguishing interleaved log + output from different sources. Log output is typically interleaved + when a server handles multiple clients near-simultaneously. + + + The MDC is managed on a per thread basis. + + + + Nicko Cadell + Gert Driesen + + + + Gets the context value identified by the parameter. + + The key to lookup in the MDC. + The string value held for the key, or a null reference if no corresponding value is found. + + + + The MDC is deprecated and has been replaced by the . + The current MDC implementation forwards to the ThreadContext.Properties. + + + + If the parameter does not look up to a + previously defined context then null will be returned. + + + + + + Add an entry to the MDC + + The key to store the value under. + The value to store. + + + + The MDC is deprecated and has been replaced by the . + The current MDC implementation forwards to the ThreadContext.Properties. + + + + Puts a context value (the parameter) as identified + with the parameter into the current thread's + context map. + + + If a value is already defined for the + specified then the value will be replaced. If the + is specified as null then the key value mapping will be removed. + + + + + + Removes the key value mapping for the key specified. + + The key to remove. + + + + The MDC is deprecated and has been replaced by the . + The current MDC implementation forwards to the ThreadContext.Properties. + + + + Remove the specified entry from this thread's MDC + + + + + + Clear all entries in the MDC + + + + + The MDC is deprecated and has been replaced by the . + The current MDC implementation forwards to the ThreadContext.Properties. + + + + Remove all the entries from this thread's MDC + + + + + + Implementation of Nested Diagnostic Contexts. + + + + + The NDC is deprecated and has been replaced by the . + The current NDC implementation forwards to the ThreadContext.Stacks["NDC"]. + + + + A Nested Diagnostic Context, or NDC in short, is an instrument + to distinguish interleaved log output from different sources. Log + output is typically interleaved when a server handles multiple + clients near-simultaneously. + + + Interleaved log output can still be meaningful if each log entry + from different contexts had a distinctive stamp. This is where NDCs + come into play. + + + Note that NDCs are managed on a per-thread basis. The NDC class + is made up of static methods that operate on the context of the + calling thread. + + + How to push a message into the context + + using (NDC.Push("my context message")) + { + ... all log calls will have 'my context message' included ... + + } // at the end of the using block the message is automatically removed + + + + Nicko Cadell + Gert Driesen + + + + Gets the current context depth. + + The current context depth. + + + + The NDC is deprecated and has been replaced by the . + The current NDC implementation forwards to the ThreadContext.Stacks["NDC"]. + + + + The number of context values pushed onto the context stack. + + + Used to record the current depth of the context. This can then + be restored using the method. + + + + + + + Clears all the contextual information held on the current thread. + + + + + The NDC is deprecated and has been replaced by the . + The current NDC implementation forwards to the ThreadContext.Stacks["NDC"]. + + + + Clears the stack of NDC data held on the current thread. + + + + + + Creates a clone of the stack of context information. + + A clone of the context info for this thread. + + + + The NDC is deprecated and has been replaced by the . + The current NDC implementation forwards to the ThreadContext.Stacks["NDC"]. + + + + The results of this method can be passed to the + method to allow child threads to inherit the context of their + parent thread. + + + + + + Inherits the contextual information from another thread. + + The context stack to inherit. + + + + The NDC is deprecated and has been replaced by the . + The current NDC implementation forwards to the ThreadContext.Stacks["NDC"]. + + + + This thread will use the context information from the stack + supplied. This can be used to initialize child threads with + the same contextual information as their parent threads. These + contexts will NOT be shared. Any further contexts that + are pushed onto the stack will not be visible to the other. + Call to obtain a stack to pass to + this method. + + + + + + Removes the top context from the stack. + + + The message in the context that was removed from the top + of the stack. + + + + + The NDC is deprecated and has been replaced by the . + The current NDC implementation forwards to the ThreadContext.Stacks["NDC"]. + + + + Remove the top context from the stack, and return + it to the caller. If the stack is empty then an + empty string (not null) is returned. + + + + + + Pushes a new context message. + + The new context message. + + An that can be used to clean up + the context stack. + + + + + The NDC is deprecated and has been replaced by the . + The current NDC implementation forwards to the ThreadContext.Stacks["NDC"]. + + + + Pushes a new context onto the context stack. An + is returned that can be used to clean up the context stack. This + can be easily combined with the using keyword to scope the + context. + + + Simple example of using the Push method with the using keyword. + + using(log4net.NDC.Push("NDC_Message")) + { + log.Warn("This should have an NDC message"); + } + + + + + + Pushes a new context message. + + The new context message string format. + Arguments to be passed into messageFormat. + + An that can be used to clean up + the context stack. + + + + + The NDC is deprecated and has been replaced by the . + The current NDC implementation forwards to the ThreadContext.Stacks["NDC"]. + + + + Pushes a new context onto the context stack. An + is returned that can be used to clean up the context stack. This + can be easily combined with the using keyword to scope the + context. + + + Simple example of using the Push method with the using keyword. + + var someValue = "ExampleContext" + using(log4net.NDC.PushFormat("NDC_Message {0}", someValue)) + { + log.Warn("This should have an NDC message"); + } + + + + + + Removes the context information for this thread. It is + not required to call this method. + + + + + The NDC is deprecated and has been replaced by the . + The current NDC implementation forwards to the ThreadContext.Stacks["NDC"]. + + + + This method is not implemented. + + + + + + Forces the stack depth to be at most . + + The maximum depth of the stack + + + + The NDC is deprecated and has been replaced by the . + The current NDC implementation forwards to the ThreadContext.Stacks["NDC"]. + + + + Forces the stack depth to be at most . + This may truncate the head of the stack. This only affects the + stack in the current thread. Also it does not prevent it from + growing, it only sets the maximum depth at the time of the + call. This can be used to return to a known context depth. + + + + + + The default object Renderer. + + + + The default renderer supports rendering objects and collections to strings. + + + See the method for details of the output. + + + Nicko Cadell + Gert Driesen + + + + Renders the object to a string. + + The map used to lookup renderers + The object to render + The writer to render to + + + Render the object to a string. + + + The parameter is + provided to lookup and render other objects. This is + very useful where contains + nested objects of unknown type. The + method can be used to render these objects. + + + The default renderer supports rendering objects to strings as follows: + + + + Value + Rendered String + + + null + + "(null)" + + + + + + + For a one dimensional array this is the + array type name, an open brace, followed by a comma + separated list of the elements (using the appropriate + renderer), followed by a close brace. + + + For example: int[] {1, 2, 3}. + + + If the array is not one dimensional the + Array.ToString() is returned. + + + + + , & + + + Rendered as an open brace, followed by a comma + separated list of the elements (using the appropriate + renderer), followed by a close brace. + + + For example: {a, b, c}. + + + All collection classes that implement its subclasses, + or generic equivalents all implement the interface. + + + + + + + + Rendered as the key, an equals sign ('='), and the value (using the appropriate + renderer). + + + For example: key=value. + + + + + other + + Object.ToString() + + + + + + + + Render the array argument into a string + + The map used to lookup renderers + the array to render + The writer to render to + + + For a one dimensional array this is the + array type name, an open brace, followed by a comma + separated list of the elements (using the appropriate + renderer), followed by a close brace. For example: + int[] {1, 2, 3}. + + + If the array is not one dimensional the + Array.ToString() is returned. + + + + + + Render the enumerator argument into a string + + The map used to lookup renderers + the enumerator to render + The writer to render to + + + Rendered as an open brace, followed by a comma + separated list of the elements (using the appropriate + renderer), followed by a close brace. For example: + {a, b, c}. + + + + + + Renders the DictionaryEntry argument into a string. + + The map used to lookup renderers + the DictionaryEntry to render + The writer to render to + + + Render the key, an equals sign ('='), and the value (using the appropriate + renderer). For example: key=value. + + + + + + Implement this interface in order to render objects as strings + + + + Certain types require special case conversion to + string form. This conversion is done by an object renderer. + Object renderers implement the + interface. + + + Nicko Cadell + Gert Driesen + + + + Render the object to a string + + The map used to lookup renderers + The object to render + The writer to render to + + + Render the object to a + string. + + + The parameter is + provided to lookup and render other objects. This is + very useful where contains + nested objects of unknown type. The + method can be used to render these objects. + + + + + + Maps types to instances for types that require custom + rendering. + + + + The method is used to render an + object using the appropriate renderers defined in this map, + using a default renderer if no custom renderer is defined for a type. + + + Nicko Cadell + Gert Driesen + + + + Renders using the appropriate renderer. + + the object to render to a string + The object rendered as a string. + + + This is a convenience method used to render an object to a string. + The alternative method + should be used when streaming output to a . + + + + + + Render using the appropriate renderer. + + the object to render to a string + The writer to render to + + + Find the appropriate renderer for the type of the + parameter. This is accomplished by calling the + method. Once a renderer is found, it is + applied on the object and the result is returned + as a . + + + + + + Gets the renderer for the specified object type. + + The object for which to look up the renderer. + the renderer for + + + Gets the renderer for the specified object type. + + + Syntactic sugar method that calls + with the type of the object parameter. + + + + + + Gets the renderer for the specified type + + the type to look up the renderer for + The renderer for the specified type, or if no specific renderer has been defined. + + + + Recursively searches interfaces. + + The type for which to look up the renderer. + The renderer for the specified type, or null if not found. + + + + Gets the default renderer instance + + + + + Clears the map of custom renderers. The + is not removed. + + + + + Registers an for . + + The type that will be rendered by . + The renderer for . + + + + Interface implemented by logger repository plugins. + + + + Plugins define additional behavior that can be associated + with a . + The held by the + property is used to store the plugins for a repository. + + + The log4net.Config.PluginAttribute can be used to + attach plugins to repositories created using configuration + attributes. + + + Nicko Cadell + Gert Driesen + + + + Gets the name of the plugin. + + + The name of the plugin. + + + + Plugins are stored in the + keyed by name. Each plugin instance attached to a + repository must be a unique name. + + + + + + Attaches the plugin to the specified . + + The that this plugin should be attached to. + + + A plugin may only be attached to a single repository. + + + This method is called when the plugin is attached to the repository. + + + + + + Is called when the plugin is to shutdown. + + + + This method is called to notify the plugin that + it should stop operating and should detach from + the repository. + + + + + + Interface used to create plugins. + + + + Interface used to create a plugin. + + + Nicko Cadell + Gert Driesen + + + + Creates the plugin object. + + the new plugin instance + + + Create and return a new plugin instance. + + + + + + A strongly-typed collection of objects. + + Nicko Cadell + + + + Supports type-safe iteration over a . + + + + + + Gets the current element in the collection. + + + + + Advances the enumerator to the next element in the collection. + + + true if the enumerator was successfully advanced to the next element; + false if the enumerator has passed the end of the collection. + + + The collection was modified after the enumerator was created. + + + + + Sets the enumerator to its initial position, before the first element in the collection. + + + + + Creates a read-only wrapper for a PluginCollection instance. + + list to create a readonly wrapper arround + + A PluginCollection wrapper that is read-only. + + + + + Initializes a new instance of the PluginCollection class + that is empty and has the default initial capacity. + + + + + Initializes a new instance of the PluginCollection class + that has the specified initial capacity. + + + The number of elements that the new PluginCollection is initially capable of storing. + + + + + Initializes a new instance of the PluginCollection class + that contains elements copied from the specified PluginCollection. + + The PluginCollection whose elements are copied to the new collection. + + + + Initializes a new instance of the PluginCollection class + that contains elements copied from the specified array. + + The array whose elements are copied to the new list. + + + + Initializes a new instance of the PluginCollection class + that contains elements copied from the specified collection. + + The collection whose elements are copied to the new list. + + + + Initializes a new instance of the PluginCollection class + that contains elements copied from the specified collection. + + The collection whose elements are copied to the new list. + + + + Type visible only to our subclasses + Used to access protected constructor + + + + + + A value + + + + + Allow subclasses to avoid our default constructors + + + + + + Gets the number of elements actually contained in the PluginCollection. + + + + + Copies the entire PluginCollection to a one-dimensional + array. + + The one-dimensional array to copy to. + + + + Copies the entire PluginCollection to a one-dimensional + array, starting at the specified index of the target array. + + The one-dimensional array to copy to. + The zero-based index in at which copying begins. + + + + Gets a value indicating whether access to the collection is synchronized (thread-safe). + + false, because the backing type is an array, which is never thread-safe. + + + + Gets an object that can be used to synchronize access to the collection. + + + + + Gets or sets the at the specified index. + + + The at the specified index. + + The zero-based index of the element to get or set. + + is less than zero. + -or- + is equal to or greater than . + + + + + Adds a to the end of the PluginCollection. + + The to be added to the end of the PluginCollection. + The index at which the value has been added. + + + + Removes all elements from the PluginCollection. + + + + + Creates a shallow copy of the . + + A new with a shallow copy of the collection data. + + + + Determines whether a given is in the PluginCollection. + + The to check for. + true if is found in the PluginCollection; otherwise, false. + + + + Returns the zero-based index of the first occurrence of a + in the PluginCollection. + + The to locate in the PluginCollection. + + The zero-based index of the first occurrence of + in the entire PluginCollection, if found; otherwise, -1. + + + + + Inserts an element into the PluginCollection at the specified index. + + The zero-based index at which should be inserted. + The to insert. + + is less than zero + -or- + is equal to or greater than . + + + + + Removes the first occurrence of a specific from the PluginCollection. + + The to remove from the PluginCollection. + + The specified was not found in the PluginCollection. + + + + + Removes the element at the specified index of the PluginCollection. + + The zero-based index of the element to remove. + + is less than zero. + -or- + is equal to or greater than . + + + + + Gets a value indicating whether the collection has a fixed size. + + true if the collection has a fixed size; otherwise, false. The default is false. + + + + Gets a value indicating whether the IList is read-only. + + true if the collection is read-only; otherwise, false. The default is false. + + + + Returns an enumerator that can iterate through the PluginCollection. + + An for the entire PluginCollection. + + + + Gets or sets the number of elements the PluginCollection can contain. + + + The number of elements the PluginCollection can contain. + + + + + Adds the elements of another PluginCollection to the current PluginCollection. + + The PluginCollection whose elements should be added to the end of the current PluginCollection. + The new of the PluginCollection. + + + + Adds the elements of a array to the current PluginCollection. + + The array whose elements should be added to the end of the PluginCollection. + The new of the PluginCollection. + + + + Adds the elements of a collection to the current PluginCollection. + + The collection whose elements should be added to the end of the PluginCollection. + The new of the PluginCollection. + + + + Adds the elements of a collection to the current PluginCollection. + + The collection whose elements should be added to the end of the PluginCollection. + The new of the PluginCollection. + + + + Sets the capacity to the actual number of elements. + + + + + is less than zero. + -or- + is equal to or greater than . + + + + + is less than zero. + -or- + is equal to or greater than . + + + + + Supports simple iteration over a . + + + + + + Initializes a new instance of the Enumerator class. + + + + + + Gets the current element in the collection. + + + + + Advances the enumerator to the next element in the collection. + + + true if the enumerator was successfully advanced to the next element; + false if the enumerator has passed the end of the collection. + + + The collection was modified after the enumerator was created. + + + + + Sets the enumerator to its initial position, before the first element in the collection. + + + + + + + + Map of repository plugins. + + The repository that the plugins should be attached to. + + + This class is a name keyed map of the plugins that are + attached to a repository. + + + Nicko Cadell + Gert Driesen + + + + Map of repository plugins. + + The repository that the plugins should be attached to. + + + This class is a name keyed map of the plugins that are + attached to a repository. + + + Nicko Cadell + Gert Driesen + + + + Gets a by name. + + The name of the to lookup. + + The from the map with the name specified, or + null if no plugin is found. + + + + + Gets all possible plugins as a list of objects. + + All possible plugins as a list of objects. + + + + Adds a to the map. + + The to add to the map. + + + The will be attached to the repository when added. + + + If there already exists a plugin with the same name + attached to the repository then the old plugin will + be and replaced with + the new plugin. + + + + + + Removes an from the map. + + The to remove from the map. + + + + Base implementation of + + + + Default abstract implementation of the + interface. This base class can be used by implementors + of the interface. + + + Nicko Cadell + Gert Driesen + + + + Constructor + + the name of the plugin + + Initializes a new Plugin with the specified name. + + + + + Gets or sets the name of the plugin. + + + The name of the plugin. + + + + Plugins are stored in the + keyed by name. Each plugin instance attached to a + repository must be a unique name. + + + The name of the plugin must not change once the + plugin has been attached to a repository. + + + + + + Attaches this plugin to a . + + The that this plugin should be attached to. + + + A plugin may only be attached to a single repository. + + + This method is called when the plugin is attached to the repository. + + + + + + Is called when the plugin is to shutdown. + + + + This method is called to notify the plugin that + it should stop operating and should detach from + the repository. + + + + + + The repository for this plugin + + + The that this plugin is attached to. + + + + Gets or sets the that this plugin is + attached to. + + + + + + + + + + + + + + + + + + + + + + Default implementation of + + + + This default implementation of the + interface is used to create the default subclass + of the object. + + + Nicko Cadell + Gert Driesen + + + + Create a new instance with the specified name. + + The that will own the . + The name of the . If null, the root logger is returned. + The instance for the specified name. + + + Called by the to create + new named instances. + + + + + + Default internal subclass of + + + + This subclass has no additional behavior over the + class but does allow instances + to be created. + + + + + + Initializes a new instance of the class + with the specified name. + + the name of the logger + + + + Delegate used to handle logger creation event notifications. + + The in which the has been created. + The event args that hold the instance that has been created. + + + + Provides data for the event. + + + + A event is raised every time a is created. + + + The that has been created. + + + + Provides data for the event. + + + + A event is raised every time a is created. + + + The that has been created. + + + + Gets the that has been created. + + + + + Hierarchical organization of loggers + + + + The casual user should not have to deal with this class directly. + + + This class is specialized in retrieving loggers by name and also maintaining the logger + hierarchy. Implements the interface. + + + The structure of the logger hierarchy is maintained by the + method. The hierarchy is such that children + link to their parent but parents do not have any references to their + children. Moreover, loggers can be instantiated in any order, in + particular descendant before ancestor. + + + In case a descendant is created before a particular ancestor, then it creates a provision node + for the ancestor and adds itself to the provision node. Other descendants of the same ancestor + add themselves to the previously created provision node. + + + Nicko Cadell + Gert Driesen + The properties to pass to this repository. + The factory to use to create new logger instances. + + + + Hierarchical organization of loggers + + + + The casual user should not have to deal with this class directly. + + + This class is specialized in retrieving loggers by name and also maintaining the logger + hierarchy. Implements the interface. + + + The structure of the logger hierarchy is maintained by the + method. The hierarchy is such that children + link to their parent but parents do not have any references to their + children. Moreover, loggers can be instantiated in any order, in + particular descendant before ancestor. + + + In case a descendant is created before a particular ancestor, then it creates a provision node + for the ancestor and adds itself to the provision node. Other descendants of the same ancestor + add themselves to the previously created provision node. + + + Nicko Cadell + Gert Driesen + The properties to pass to this repository. + The factory to use to create new logger instances. + + + + The fully qualified type of the Hierarchy class. + + + Used by the internal logger to record the type of the log message. + + + + + Event used to notify that a logger has been created. + + + + + Default constructor + + + + + Construct with properties + + The properties to pass to this repository. + + + + Construct with a logger factory + + The factory to use to create new logger instances. + + + + Has no appender warning been emitted + + + Flag to indicate if we have already issued a warning about not having an appender warning. + + + + + Get the root of this hierarchy + + + + + Gets or sets the default instance. + + + + The logger factory is used to create logger instances. + + + + + + Test if a logger exists + + The name of the logger to lookup + The Logger object with the name specified + + + Check if the named logger exists in the hierarchy. If so return + its reference, otherwise returns . + + + + + + Returns all the currently defined loggers in the hierarchy as an Array + + All the defined loggers + + + Returns all the currently defined loggers in the hierarchy as an Array. + The root logger is not included in the returned + enumeration. + + + + + + Return a new logger instance named as the first parameter using + the default factory. + + + If a logger of that name already exists, then it will be + returned. Otherwise, a new logger will be instantiated and + then linked with its existing ancestors as well as children. + + The name of the logger to retrieve + The logger object with the name specified + + + + Shutting down a hierarchy will safely close and remove + all appenders in all loggers including the root logger. + + + + Shutting down a hierarchy will safely close and remove + all appenders in all loggers including the root logger. + + + Some appenders need to be closed before the + application exists. Otherwise, pending logging events might be + lost. + + + The method is careful to close nested + appenders before closing regular appenders. This allows + configurations where a regular appender is attached to a logger + and again to a nested appender. + + + + + + Reset all values contained in this hierarchy instance to their default. + + + + Reset all values contained in this hierarchy instance to their + default. This removes all appenders from all loggers, sets + the level of all non-root loggers to , + sets their additivity flag to and sets the level + of the root logger to . Moreover, + message disabling is set its default "off" value. + + + Existing loggers are not removed. They are just reset. + + + This method should be used sparingly and with care as it will + block all logging until it is completed. + + + + + + Log the logEvent through this hierarchy. + + the event to log + + + This method should not normally be used to log. + The interface should be used + for routine logging. This interface can be obtained + using the method. + + + The is delivered to the appropriate logger and + that logger is then responsible for logging the event. + + + + + + Returns all the Appenders that are currently configured + + An array containing all the currently configured appenders + + + Returns all the instances that are currently configured. + All the loggers are searched for appenders. The appenders may also be containers + for appenders and these are also searched for additional loggers. + + + The list returned is unordered but does not contain duplicates. + + + + + + Collect the appenders from an . + The appender may also be a container. + + + + + Collect the appenders from an container + + + + + Initialize the log4net system using the specified appender + + the appender to use to log all logging events + + + + Initialize the log4net system using the specified appenders + + the appenders to use to log all logging events + + + + Initialize the log4net system using the specified appenders + + the appenders to use to log all logging events + + + This method provides the same functionality as the + method implemented + on this object, but it is protected and therefore can be called by subclasses. + + + + + + Initialize the log4net system using the specified config + + the element containing the root of the config + + + + Initialize the log4net system using the specified config + + the element containing the root of the config + + + This method provides the same functionality as the + method implemented + on this object, but it is protected and therefore can be called by subclasses. + + + + + + Test if this hierarchy is disabled for the specified . + + The level to check against. + + if the repository is disabled for the level argument, otherwise. + + + If this hierarchy has not been configured then this method will always return . + See also the property. + + + + + Clear all logger definitions from the internal hashtable + + + + This call will clear all logger definitions from the internal + hashtable. Invoking this method will irrevocably mess up the + logger hierarchy. + + + You should really know what you are doing before invoking this method. + + + + + + Returns a new logger instance named as the first parameter using + . + + The name of the logger to retrieve + The factory that will make the new logger instance + The logger object with the name specified + + + If a logger of that name already exists, then it will be + returned. Otherwise, a new logger will be instantiated by the + parameter and linked with its existing + ancestors as well as children. + + + + + + Sends a logger creation event to all registered listeners + + The newly created logger + + Raises the logger creation event. + + + + + Updates all the parents of the specified logger + + The logger to update the parents for + + + This method loops through all the potential parents of + . There 3 possible cases: + + + + No entry for the potential parent of exists + + We create a ProvisionNode for this potential + parent and insert in that provision node. + + + + The entry is of type Logger for the potential parent. + + The entry is 's nearest existing parent. We + update 's parent field with this entry. We also break from + the loop because updating our parent's parent is our parent's + responsibility. + + + + The entry is of type ProvisionNode for this potential parent. + + We add to the list of children for this potential parent. + + + + + + + + Replace a with a in the hierarchy. + + + + We update the links for all the children that placed themselves + in the provision node 'pn'. The second argument 'log' is a + reference for the newly created Logger, parent of all the + children in 'pn'. + + + We loop on all the children 'c' in 'pn'. + + + If the child 'c' has been already linked to a child of + 'log' then there is no need to update 'c'. + + + Otherwise, we set log's parent field to c's parent and set + c's parent field to log. + + + + + + Define or redefine a Level using the values in the argument + + the level values + + Supports setting levels via the configuration file. + + + + + A class to hold the value, name and display name for a level + + + + + Value of the level + + + If the value is not set (defaults to -1) the value will be looked + up for the current level with the same name. + + + + + Name of the level + + + + + Display name for the level + + + + + Override Object.ToString to return sensible debug info + + string info about this object + + + + Set a Property using the values in the argument + + the property value + + Supports setting property values via the configuration file. + + + + + Interface abstracts creation of instances + + + + This interface is used by the to + create new objects. + + + The method is called + to create a named . + + + Implement this interface to create new subclasses of . + + + Nicko Cadell + Gert Driesen + + + + Create a new instance + + The that will own the . + The name of the . + The instance for the specified name. + + + Create a new instance with the + specified name. + + + Called by the to create + new named instances. + + + If the is null then the root logger + must be returned. + + + + + + Implementation of used by + + The name of the . + + + Internal class used to provide implementation of + interface. Applications should use to get + logger instances. + + + This is one of the central classes in the log4net implementation. One of the + distinctive features of log4net are hierarchical loggers and their + evaluation. The organizes the + instances into a rooted tree hierarchy. + + + The class is abstract. Only concrete subclasses of + can be created. The + is used to create instances of this type for the . + + + Nicko Cadell + Gert Driesen + Aspi Havewala + Douglas de la Torre + + + + Implementation of used by + + The name of the . + + + Internal class used to provide implementation of + interface. Applications should use to get + logger instances. + + + This is one of the central classes in the log4net implementation. One of the + distinctive features of log4net are hierarchical loggers and their + evaluation. The organizes the + instances into a rooted tree hierarchy. + + + The class is abstract. Only concrete subclasses of + can be created. The + is used to create instances of this type for the . + + + Nicko Cadell + Gert Driesen + Aspi Havewala + Douglas de la Torre + + + + The fully qualified type of the Logger class. + + + + + The parent of this logger. + + + + All loggers have at least one ancestor which is the root logger. + + + + + + Loggers need to know what Hierarchy they are in. + + + + + Helper implementation of the interface + + + + + Lock to protect AppenderAttachedImpl variable appenderAttachedImpl + + + + + Gets or sets the parent logger in the hierarchy. + + + The parent logger in the hierarchy. + + + + Part of the Composite pattern that makes the hierarchy. + The hierarchy is parent linked rather than child linked. + + + + + + Gets or sets a value indicating if child loggers inherit their parent's appenders. + + + if child loggers inherit their parent's appenders. + + + + Additivity is set to by default, that is children inherit + the appenders of their ancestors by default. If this variable is + set to then the appenders found in the + ancestors of this logger are not used. However, the children + of this logger will inherit its appenders, unless the children + have their additivity flag set to too. See + the user manual for more details. + + + + + + Gets the effective level for this logger. + + The nearest level in the logger hierarchy. + + + Starting from this logger, searches the logger hierarchy for a + non-null level and returns it. Otherwise, returns the level of the + root logger. + + The Logger class is designed so that this method executes as + quickly as possible. + + + + + Gets or sets the where this instance is attached to. + + + + + Gets or sets the assigned for this Logger. + + + + + Add to the list of appenders of this + Logger instance. + + An appender to add to this logger + + + If is already in the list of + appenders, then it won't be added again. + + + + + + Get the appenders contained in this logger as an + . + + + A collection of the appenders in this logger. If no appenders + can be found, then a is returned. + + + + + Look for the appender named as + + The name of the appender to lookup + The appender with the name specified, or . + + + + Removes all previously added appenders from this Logger instance. + + + + This is useful when re-reading configuration information. + + + + + + Remove the appender passed as parameter form the list of appenders. + + The appender to remove + The appender removed from the list + + + The appender removed is not closed. + If you are discarding the appender you must call + on the appender removed. + + + + + + Remove the appender passed as parameter form the list of appenders. + + The name of the appender to remove + The appender removed from the list + + + The appender removed is not closed. + If you are discarding the appender you must call + on the appender removed. + + + + + + Gets the logger name. + + + + + Generates a logging event for the specified using + the and . + + The declaring type of the method that is + the stack boundary into the logging system for this call. + The level of the message to be logged. + The message object to log. + The exception to log, including its stack trace. + + + This generic form is intended to be used by wrappers. + + + This method must not throw any exception to the caller. + + + + + + Logs the specified logging event through this logger. + + The event being logged. + + + This is the most generic printing method that is intended to be used + by wrappers. + + + This method must not throw any exception to the caller. + + + + + + Checks if this logger is enabled for a given passed as parameter. + + The level to check. + + if this logger is enabled for , + otherwise . + + + + This method must not throw any exception to the caller. + + + + + + Gets the where this + instance is attached to. + + + + + Deliver the to the attached appenders. + + The event to log. + + + Call the appenders in the hierarchy starting at . + If no appenders could be found, emit a warning. + + + This method calls all the appenders inherited from the + hierarchy circumventing any evaluation of whether to log or not + to log the particular log request. + + + + + + Closes all attached appenders implementing the interface. + + + + Used to ensure that the appenders are correctly shutdown. + + + + + + This is the most generic printing method. This generic form is intended to be used by wrappers + + The level of the message to be logged. + The message object to log. + The exception to log, including its stack trace. + + + Generate a logging event for the specified using + the . + + + + + + Creates a new logging event and logs the event without further checks. + + The declaring type of the method that is + the stack boundary into the logging system for this call. + The level of the message to be logged. + The message object to log. + The exception to log, including its stack trace. + + + Generates a logging event and delivers it to the attached + appenders. + + + + + + Creates a new logging event and logs the event without further checks. + + The event being logged. + + + Delivers the logging event to the attached appenders. + + + + + + Used internally to accelerate hash table searches. + + + + Internal class used to improve performance of + string keyed hashtables. + + + The hashcode of the string is cached for reuse. + The string is stored as an interned value. + When comparing two objects for equality + the reference equality of the interned strings is compared. + + + Nicko Cadell + Gert Driesen + + + + Construct key with string name + + + + Initializes a new instance of the class + with the specified name. + + + Stores the hashcode of the string and interns + the string key to optimize comparisons. + + + The Compact Framework 1.0 the + method does not work. On the Compact Framework + the string keys are not interned nor are they + compared by reference. + + + The name of the logger. + + + + Returns a hash code for the current instance. + + A hash code for the current instance. + + + Returns the cached hashcode. + + + + + + Name of the Logger + + + + + Provision nodes are used where no logger instance has been specified + + + + instances are used in the + when there is no specified + for that node. + + + A provision node holds a list of child loggers on behalf of a logger that does not exist. + + + Nicko Cadell + Gert Driesen + + + + Create a new provision node with child node + + A child logger to add to this node. + + + + Add a to the internal List + + Logger + + + + Calls for each logger in the internal list + + Callback to execute + Parant logger + + + + The sits at the root of the logger hierarchy tree. + + + + The is a regular except + that it provides several guarantees. + + + First, it cannot be assigned a null + level. Second, since the root logger cannot have a parent, the + property always returns the value of the + level field without walking the hierarchy. + + + Nicko Cadell + Gert Driesen + + + + Construct a + + The level to assign to the root logger. + + + Initializes a new instance of the class with + the specified logging level. + + + The root logger names itself as "root". However, the root + logger cannot be retrieved by name. + + + + + + Gets the assigned level value without walking the logger hierarchy. + + The assigned level value without walking the logger hierarchy. + + + Because the root logger cannot have a parent and its level + must not be null this property just returns the + value of . + + + + + + Gets or sets the assigned for the root logger. + + + The of the root logger. + + + + Setting the level of the root logger to a null reference + may have catastrophic results. We prevent this here. + + + + + + The fully qualified type of the RootLogger class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Initializes the log4net environment using an XML DOM. + + The hierarchy to build. + Nicko Cadell + Gert Driesen + + + + Initializes the log4net environment using an XML DOM. + + The hierarchy to build. + Nicko Cadell + Gert Driesen + + + + Configure the hierarchy by parsing a DOM tree of XML elements. + + The root element to parse. + + + Configure the hierarchy by parsing a DOM tree of XML elements. + + + + + + Parse appenders by IDREF. + + The appender ref element. + The instance of the appender that the ref refers to. + + + Parse an XML element that represents an appender and return + the appender. + + + + + + Parses an appender element. + + The appender element. + The appender instance or null when parsing failed. + + + Parse an XML element that represents an appender and return + the appender instance. + + + + + + Parses a logger element. + + The logger element. + + + Parse an XML element that represents a logger. + + + + + + Parses the root logger element. + + The root element. + + + Parse an XML element that represents the root logger. + + + + + + Parses the children of a logger element. + + The category element. + The logger instance. + Flag to indicate if the logger is the root logger. + + + Parse the child elements of a <logger> element. + + + + + + Parses an object renderer. + + The renderer element. + + + Parse an XML element that represents a renderer. + + + + + + Parses a level element. + + The level element. + The logger object to set the level on. + Flag to indicate if the logger is the root logger. + + + Parse an XML element that represents a level. + + + + + + Sets a parameter on an object. + + The parameter element. + The object to set the parameter on. + + The parameter name must correspond to a writable property + on the object. The value of the parameter is a string, + therefore this function will attempt to set a string + property first. If unable to set a string property it + will inspect the property and its argument type. It will + attempt to call a static method called Parse on the + type of the property. This method will take a single + string argument and return a value that can be used to + set the property. + + + + + Test if an element has no attributes or child elements + + the element to inspect + true if the element has any attributes or child elements, false otherwise + + + + Test if a is constructible with Activator.CreateInstance. + + the type to inspect + true if the type is creatable using a default constructor, false otherwise + + + + Look for a method on the that matches the supplied + + the type that has the method + the name of the method + the method info found + + + The method must be a public instance method on the . + The method must be named or "Add" followed by . + The method must take a single parameter. + + + + + + Converts a string value to a target type. + + The type of object to convert the string to. + The string value to use as the value of the object. + + + An object of type with value or + null when the conversion could not be performed. + + + + + + Creates an object as specified in XML. + + The XML element that contains the definition of the object. + The object type to use if not explicitly specified. + The type that the returned object must be or must inherit from. + The object or null + + + Parse an XML element and create an object instance based on the configuration + data. + + + The type of the instance may be specified in the XML. If not + specified then the is used + as the type. However the type is specified it must support the + type. + + + + + + key: appenderName, value: appender. + + + + + The fully qualified type of the XmlHierarchyConfigurator class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Basic Configurator interface for repositories + + + + Interface used by basic configurator to configure a + with a default . + + + A should implement this interface to support + configuration by the . + + + Nicko Cadell + Gert Driesen + + + + Initialize the repository using the specified appender + + the appender to use to log all logging events + + + Configure the repository to route all logging events to the + specified appender. + + + + + + Initialize the repository using the specified appenders + + the appenders to use to log all logging events + + + Configure the repository to route all logging events to the + specified appenders. + + + + + + Delegate used to handle logger repository shutdown event notifications. + + The that is shutting down. + Empty event args + + + + Delegate used to handle logger repository configuration reset event notifications. + + The that has had its configuration reset. + Empty event args + + + + Delegate used to handle event notifications for logger repository configuration changes. + + The that has had its configuration changed. + Empty event arguments. + + + + Interface implemented by logger repositories, e.g. , and used by the + to obtain instances. + + Nicko Cadell + Gert Driesen + + + + Gets or sets the name of the repository. + + + + + Gets the map from types to instances for custom rendering. + + + + + Gets the map from plugin name to plugin value for plugins attacked to this repository. + + + + + Gets the map from level names and values for this repository. + + + + + Gets or sets the threshold for all events in this repository. + + + + + Gets the named logger, or null. + + The name of the logger to look up. + The logger if found, or null. + + + + Gets all the currently defined loggers. + + + + + Returns a named logger instance + + The name of the logger to retrieve + The logger object with the name specified + + + Returns a named logger instance. + + + If a logger of that name already exists, then it will be + returned. Otherwise, a new logger will be instantiated and + then linked with its existing ancestors as well as children. + + + + + + Shuts down the repository, safely closing and removing + all appenders in all loggers including the root logger. + + + + Some appenders need to be closed before the + application exists. Otherwise, pending logging events might be + lost. + + + The method is careful to close nested + appenders before closing regular appenders. This allows + configurations where a regular appender is attached to a logger + and again to a nested appender. + + + + + + Resets the repository configuration to a default state. Loggers are reset but not removed. + + + + This method should be used sparingly and with care as it will + block all logging until it is completed. + + + + + + Logs a through this repository. + + The event to log. + + + This method should not normally be used to log. + The interface should be used + for routine logging. This interface can be obtained + using the method. + + + The logEvent is delivered to the appropriate logger and + that logger is then responsible for logging the event. + + + + + + Gets or sets a value that indicates whether this repository has been configured. + + + + + Collection of internal messages captured during the most + recent configuration process. + + + + + Event to notify that the repository has been shut down. + + + + + Event to notify that the repository has had its configuration reset to default. + + + + + Event to notify that the repository's configuration has changed. + + + + + Repository specific properties. + + + + + Gets all Appenders that are configured for this repository. + + + + + Configure repository using XML + + + + Interface used by Xml configurator to configure a . + + + A should implement this interface to support + configuration by the . + + + Nicko Cadell + Gert Driesen + + + + Initialize the repository using the specified config + + the element containing the root of the config + + + The schema for the XML configuration data is defined by + the implementation. + + + + + + Base implementation of + + + + Default abstract implementation of the interface. + + + Skeleton implementation of the interface. + All types can extend this type. + + + Nicko Cadell + Gert Driesen + + + + Default Constructor + + + + Initializes the repository with default (empty) properties. + + + + + + Construct the repository using specific properties + + the properties to set for this repository + + + Initializes the repository with specified properties. + + + + + + The name of the repository + + + The string name of the repository + + + + The name of this repository. The name is + used to store and lookup the repositories + stored by the . + + + + + + The threshold for all events in this repository + + + The threshold for all events in this repository + + + + The threshold for all events in this repository + + + + + + RendererMap accesses the object renderer map for this repository. + + + RendererMap accesses the object renderer map for this repository. + + + + RendererMap accesses the object renderer map for this repository. + + + The RendererMap holds a mapping between types and + objects. + + + + + + The plugin map for this repository. + + + The plugin map for this repository. + + + + The plugin map holds the instances + that have been attached to this repository. + + + + + + Get the level map for the Repository. + + + + Get the level map for the Repository. + + + The level map defines the mappings between + level names and objects in + this repository. + + + + + + Test if logger exists + + The name of the logger to lookup + The Logger object with the name specified + + + Check if the named logger exists in the repository. If so return + its reference, otherwise returns null. + + + + + + Returns all the currently defined loggers in the repository + + All the defined loggers + + + Returns all the currently defined loggers in the repository as an Array. + + + + + + Return a new logger instance + + The name of the logger to retrieve + The logger object with the name specified + + + Return a new logger instance. + + + If a logger of that name already exists, then it will be + returned. Otherwise, a new logger will be instantiated and + then linked with its existing ancestors as well as children. + + + + + + Shutdown the repository + + + + Shutdown the repository. Can be overridden in a subclass. + This base class implementation notifies the + listeners and all attached plugins of the shutdown event. + + + + + + Reset the repositories configuration to a default state + + + + Reset all values contained in this instance to their + default state. + + + Existing loggers are not removed. They are just reset. + + + This method should be used sparingly and with care as it will + block all logging until it is completed. + + + + + + Log the logEvent through this repository. + + the event to log + + + This method should not normally be used to log. + The interface should be used + for routine logging. This interface can be obtained + using the method. + + + The logEvent is delivered to the appropriate logger and + that logger is then responsible for logging the event. + + + + + + Flag indicates if this repository has been configured. + + + + + Contains a list of internal messages captured during the + last configuration. + + + + + Event to notify that the repository has been shutdown. + + + Event to notify that the repository has been shutdown. + + + + Event raised when the repository has been shutdown. + + + + + + Event to notify that the repository has had its configuration reset. + + + Event to notify that the repository has had its configuration reset. + + + + Event raised when the repository's configuration has been + reset to default. + + + + + + Event to notify that the repository has had its configuration changed. + + + Event to notify that the repository has had its configuration changed. + + + + Event raised when the repository's configuration has been changed. + + + + + + Repository specific properties + + + Repository specific properties + + + These properties can be specified on a repository specific basis + + + + + Returns all the Appenders that are configured as an Array. + + All the Appenders + + + Returns all the Appenders that are configured as an Array. + + + + + + The fully qualified type of the LoggerRepositorySkeleton class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Adds an object renderer for a specific class. + + The type that will be rendered by the renderer supplied. + The object renderer used to render the object. + + + Adds an object renderer for a specific class. + + + + + + Notify the registered listeners that the repository is shutting down + + Empty EventArgs + + + Notify any listeners that this repository is shutting down. + + + + + + Notify the registered listeners that the repository has had its configuration reset + + Empty EventArgs + + + Notify any listeners that this repository's configuration has been reset. + + + + + + Notify the registered listeners that the repository has had its configuration changed + + Empty EventArgs + + + + Raise a configuration changed event on this repository + + EventArgs.Empty + + + Applications that programmatically change the configuration of the repository should + raise this event notification to notify listeners. + + + + + + Flushes all configured Appenders that implement . + + The maximum time in milliseconds to wait for logging events from asynchronous appenders to be flushed, + or to wait indefinitely. + True if all logging events were flushed successfully, else false. + + + + The log4net Thread Context. + + + + The ThreadContext provides a location for thread specific debugging + information to be stored. + The ThreadContext properties override any + properties with the same name. + + + The thread context has a properties map and a stack. + The properties and stack can + be included in the output of log messages. The + supports selecting and outputting these properties. + + + The Thread Context provides a diagnostic context for the current thread. + This is an instrument for distinguishing interleaved log + output from different sources. Log output is typically interleaved + when a server handles multiple clients near-simultaneously. + + + The Thread Context is managed on a per thread basis. + + + Example of using the thread context properties to store a username. + + ThreadContext.Properties["user"] = userName; + log.Info("This log message has a ThreadContext Property called 'user'"); + + + Example of how to push a message into the context stack + + using(ThreadContext.Stacks["NDC"].Push("my context message")) + { + log.Info("This log message has a ThreadContext Stack message that includes 'my context message'"); + + } // at the end of the using block the message is automatically popped + + + + Nicko Cadell + + + + The thread properties map + + + The thread properties map + + + + The ThreadContext properties override any + properties with the same name. + + + + + + The thread stacks + + + stack map + + + + The thread local stacks. + + + + + + A straightforward implementation of the interface. + + + + This is the default implementation of the + interface. Implementors of the interface + should aggregate an instance of this type. + + + Nicko Cadell + Gert Driesen + + + + Constructor + + + + Initializes a new instance of the class. + + + + + + Append on on all attached appenders. + + The event being logged. + The number of appenders called. + + + Calls the method on all + attached appenders. + + + + + + Append on on all attached appenders. + + The array of events being logged. + The number of appenders called. + + + Calls the method on all + attached appenders. + + + + + + Calls the DoAppende method on the with + the objects supplied. + + The appender + The events + + + If the supports the + interface then the will be passed + through using that interface. Otherwise the + objects in the array will be passed one at a time. + + + + + + Attaches an appender. + + The appender to add. + + + If the appender is already in the list it won't be added again. + + + + + + Gets all attached appenders. + + + A collection of attached appenders, or null if there + are no attached appenders. + + + + The read only collection of all currently attached appenders. + + + + + + Gets an attached appender with the specified name. + + The name of the appender to get. + + The appender with the name specified, or null if no appender with the + specified name is found. + + + + Lookup an attached appender by name. + + + + + + Removes all attached appenders. + + + + Removes and closes all attached appenders + + + + + + Removes the specified appender from the list of attached appenders. + + The appender to remove. + The appender removed from the list + + + The appender removed is not closed. + If you are discarding the appender you must call + on the appender removed. + + + + + + Removes the appender with the specified name from the list of appenders. + + The name of the appender to remove. + The appender removed from the list + + + The appender removed is not closed. + If you are discarding the appender you must call + on the appender removed. + + + + + + List of appenders + + + + + Array of appenders, used to cache the appenderList + + + + + The fully qualified type of the AppenderAttachedImpl class. + + + Used by the internal logger to record the Type of the + log message. + + + + + This class aggregates several PropertiesDictionary collections together. + + + + Provides a dictionary style lookup over an ordered list of + collections. + + + Nicko Cadell + + + + Constructor + + + + Initializes a new instance of the class. + + + + + + Gets the value of a property + + + The value for the property with the specified key + + + + Looks up the value for the specified. + The collections are searched + in the order in which they were added to this collection. The value + returned is the value held by the first collection that contains + the specified key. + + + If none of the collections contain the specified key then + null is returned. + + + + + + Add a Properties Dictionary to this composite collection + + the properties to add + + + Properties dictionaries added first take precedence over dictionaries added + later. + + + + + + Flatten this composite collection into a single properties dictionary + + the flattened dictionary + + + Reduces the collection of ordered dictionaries to a single dictionary + containing the resultant values for the keys. + + + + + + Base class for Context Properties implementations + + Nicko Cadell + + + + Gets or sets the value of a property. + + + + + Wrapper class used to map converter names to converter types + + + + Pattern converter info class used during configuration by custom + PatternString and PatternLayer converters. + + + + + + Gets or sets the name of the conversion pattern in the format string. + + + + + Gets or sets the type of the converter. The type must extend . + + + + + + + + + + + + + + + + Subclass of that maintains a count of + the number of bytes written. + + + + This writer counts the number of bytes written. + + + Nicko Cadell + Gert Driesen + + + + Constructor + + The to actually write to. + The to report errors to. + + + Creates a new instance of the class + with the specified and . + + + + + + Writes a character to the underlying writer and counts the number of bytes written. + + the char to write + + + Overrides implementation of . Counts + the number of bytes written. + + + + + + Writes a buffer to the underlying writer and counts the number of bytes written. + + the buffer to write + the start index to write from + the number of characters to write + + + Overrides implementation of . Counts + the number of bytes written. + + + + + + Writes a string to the output and counts the number of bytes written. + + The string data to write to the output. + + + Overrides implementation of . Counts + the number of bytes written. + + + + + + Gets or sets the total number of bytes written. + + + The total number of bytes written. + + + + Gets or sets the total number of bytes written. + + + + + + A fixed size rolling buffer of logging events. + + + + An array backed fixed size leaky bucket. + + + Nicko Cadell + Gert Driesen + + + + Constructor + + The maximum number of logging events in the buffer. + + + Initializes a new instance of the class with + the specified maximum number of buffered logging events. + + + The argument is not a positive integer. + + + + Appends a to the buffer. + + The event to append to the buffer. + The event discarded from the buffer, if the buffer is full, otherwise null. + + + Append an event to the buffer. If the buffer still contains free space then + null is returned. If the buffer is full then an event will be dropped + to make space for the new event, the dropped event is returned. + + + + + + Get and remove the oldest event in the buffer. + + The oldest logging event in the buffer + + + Gets the oldest (first) logging event in the buffer and removes it + from the buffer. + + + + + + Pops all the logging events from the buffer into an array. + + An array of all the logging events in the buffer. + + + Get all the events in the buffer and clear the buffer. + + + + + + Clear the buffer + + + + Clear the buffer of all events. The events in the buffer are lost. + + + + + + Gets the th oldest event currently in the buffer. + + + + If is outside the range 0 to the number of events + currently in the buffer, then null is returned. + + + + + + Gets the maximum size of the buffer. + + The maximum size of the buffer. + + + Gets the maximum size of the buffer + + + + + + Gets the number of logging events in the buffer. + + The number of logging events in the buffer. + + + This number is guaranteed to be in the range 0 to + (inclusive). + + + + + + An always empty . + + + + A singleton implementation of the + interface that always represents an empty collection. + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + + Uses a private access modifier to enforce the singleton pattern. + + + + + + Gets the singleton instance of the empty collection. + + The singleton instance of the empty collection. + + + Gets the singleton instance of the empty collection. + + + + + + Copies the elements of the to an + , starting at a particular Array index. + + The one-dimensional + that is the destination of the elements copied from + . The Array must have zero-based + indexing. + The zero-based index in array at which + copying begins. + + + As the collection is empty no values are copied into the array. + + + + + + Gets a value indicating if access to the is synchronized (thread-safe). + + + true if access to the is synchronized (thread-safe); otherwise, false. + + + + For the this property is always true. + + + + + + Gets the number of elements contained in the . + + + The number of elements contained in the . + + + + As the collection is empty the is always 0. + + + + + + Gets an object that can be used to synchronize access to the . + + + An object that can be used to synchronize access to the . + + + + As the collection is empty and thread safe and synchronized this instance is also + the object. + + + + + + Returns an enumerator that can iterate through a collection. + + + An that can be used to + iterate through the collection. + + + + As the collection is empty a is returned. + + + + + + An always empty . + + + + A singleton implementation of the + interface that always represents an empty collection. + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + + Uses a private access modifier to enforce the singleton pattern. + + + + + + Gets the singleton instance of the . + + The singleton instance of the . + + + Gets the singleton instance of the . + + + + + + Copies the elements of the to an + , starting at a particular Array index. + + The one-dimensional + that is the destination of the elements copied from + . The Array must have zero-based + indexing. + The zero-based index in array at which + copying begins. + + + As the collection is empty no values are copied into the array. + + + + + + Gets a value indicating if access to the is synchronized (thread-safe). + + + true if access to the is synchronized (thread-safe); otherwise, false. + + + + For the this property is always true. + + + + + + Gets the number of elements contained in the + + + The number of elements contained in the . + + + + As the collection is empty the is always 0. + + + + + + Gets an object that can be used to synchronize access to the . + + + An object that can be used to synchronize access to the . + + + + As the collection is empty and thread safe and synchronized this instance is also + the object. + + + + + + Returns an enumerator that can iterate through a collection. + + + An that can be used to + iterate through the collection. + + + + As the collection is empty a is returned. + + + + + + Adds an element with the provided key and value to the + . + + The to use as the key of the element to add. + The to use as the value of the element to add. + + + As the collection is empty no new values can be added. A + is thrown if this method is called. + + + This dictionary is always empty and cannot be modified. + + + + Removes all elements from the . + + + + As the collection is empty no values can be removed. A + is thrown if this method is called. + + + This dictionary is always empty and cannot be modified. + + + + Determines whether the contains an element + with the specified key. + + The key to locate in the . + false + + + As the collection is empty the method always returns false. + + + + + + Returns an enumerator that can iterate through a collection. + + + An that can be used to + iterate through the collection. + + + + As the collection is empty a is returned. + + + + + + Removes the element with the specified key from the . + + The key of the element to remove. + + + As the collection is empty no values can be removed. A + is thrown if this method is called. + + + This dictionary is always empty and cannot be modified. + + + + Gets a value indicating whether the has a fixed size. + + true + + + As the collection is empty always returns true. + + + + + + Gets a value indicating whether the is read-only. + + true + + + As the collection is empty always returns true. + + + + + + Gets an containing the keys of the . + + An containing the keys of the . + + + As the collection is empty a is returned. + + + + + + Gets an containing the values of the . + + An containing the values of the . + + + As the collection is empty a is returned. + + + + + + Gets or sets the element with the specified key. + + The key of the element to get or set. + null + + + As the collection is empty no values can be looked up or stored. + If the index getter is called then null is returned. + A is thrown if the setter is called. + + + This dictionary is always empty and cannot be modified. + + + + Wrapper for an + + acts like the wrapped encoding, but without a preamble + + + + + + + wraps the in case it has a preamble + + Encoding to check + encoding without preamble + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Contain the information obtained when parsing formatting modifiers + in conversion modifiers. + + + + Holds the formatting information extracted from the format string by + the . This is used by the + objects when rendering the output. + + + Nicko Cadell + Gert Driesen + + + + Defaut Constructor + + + + Initializes a new instance of the class. + + + + + + Constructor + + + + Initializes a new instance of the class + with the specified parameters. + + + + + + Gets or sets the minimum value. + + + + + Gets or sets the maximum value. + + + + + Gets or sets a flag indicating whether left align is enabled. + or not. + + + + + Implementation of Properties collection for the + + + + This class implements a properties collection that is thread safe and supports both + storing properties and capturing a read only copy of the current propertied. + + + This class is optimized to the scenario where the properties are read frequently + and are modified infrequently. + + + Nicko Cadell + + + + The read only copy of the properties. + + + + This variable is declared volatile to prevent the compiler and JIT from + reordering reads and writes of this thread performed on different threads. + + + + + + Lock object used to synchronize updates within this instance + + + + + Constructor + + + + Initializes a new instance of the class. + + + + + + Gets or sets the value of a property + + + The value for the property with the specified key + + + + Reading the value for a key is faster than setting the value. + When the value is written a new read only copy of + the properties is created. + + + + + + Remove a property from the global context + + the key for the entry to remove + + + Removing an entry from the global context properties is relatively expensive compared + with reading a value. + + + + + + Clear the global context properties + + + + + Get a readonly immutable copy of the properties + + the current global context properties + + + This implementation is fast because the GlobalContextProperties class + stores a readonly copy of the properties. + + + + + + The static class ILogExtensions contains a set of widely used + methods that ease the interaction with the ILog interface implementations. + + + + This class contains methods for logging at different levels and checks the + properties for determining if those logging levels are enabled in the current + configuration. + + + Simple example of logging messages + + using log4net.Util; + + ILog log = LogManager.GetLogger("application-log"); + + log.InfoExt("Application Start"); + log.DebugExt("This is a debug message"); + + + + + + The fully qualified type of the Logger class. + + + + + Log a message object with the level. + + The logger on which the message is logged. + The lambda expression that gets the object to log. + + + This method first checks if this logger is INFO + enabled by reading the value property. + This check happens always and does not depend on the + implementation. If this logger is INFO enabled, then it converts + the message object (retrieved by invocation of the provided callback) to a + string by invoking the appropriate . + It then proceeds to call all the registered appenders in this logger + and also higher in the hierarchy depending on the value of + the additivity flag. + + WARNING Note that passing an + to this method will print the name of the + but no stack trace. To print a stack trace use the + form instead. + + + + + + + + Log a message object with the level including + the stack trace of the passed + as a parameter. + + The logger on which the message is logged. + The lambda expression that gets the object to log. + The exception to log, including its stack trace. + + + See the form for more detailed information. + + + + + + + Log a message object with the level. //TODO + + Log a message object with the level. + + The logger on which the message is logged. + The message object to log. + + + This method first checks if this logger is INFO + enabled by reading the value property. + This check happens always and does not depend on the + implementation. If this logger is INFO enabled, then it converts + the message object (passed as parameter) to a string by invoking the appropriate + . It then + proceeds to call all the registered appenders in this logger + and also higher in the hierarchy depending on the value of + the additivity flag. + + WARNING Note that passing an + to this method will print the name of the + but no stack trace. To print a stack trace use the + form instead. + + + + + + + + Log a message object with the level including + the stack trace of the passed + as a parameter. + + The logger on which the message is logged. + The message object to log. + The exception to log, including its stack trace. + + + See the form for more detailed information. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + An that supplies culture-specific formatting information + The logger on which the message is logged. + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object to format + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Log a message object with the level. + + The logger on which the message is logged. + The lambda expression that gets the object to log. + + + This method first checks if this logger is INFO + enabled by reading the value property. + This check happens always and does not depend on the + implementation. If this logger is INFO enabled, then it converts + the message object (retrieved by invocation of the provided callback) to a + string by invoking the appropriate . + It then proceeds to call all the registered appenders in this logger + and also higher in the hierarchy depending on the value of + the additivity flag. + + WARNING Note that passing an + to this method will print the name of the + but no stack trace. To print a stack trace use the + form instead. + + + + + + + + Log a message object with the level including + the stack trace of the passed + as a parameter. + + The logger on which the message is logged. + The lambda expression that gets the object to log. + The exception to log, including its stack trace. + + + See the form for more detailed information. + + + + + + + Log a message object with the level. //TODO + + Log a message object with the level. + + The logger on which the message is logged. + The message object to log. + + + This method first checks if this logger is INFO + enabled by reading the value property. + This check happens always and does not depend on the + implementation. If this logger is INFO enabled, then it converts + the message object (passed as parameter) to a string by invoking the appropriate + . It then + proceeds to call all the registered appenders in this logger + and also higher in the hierarchy depending on the value of + the additivity flag. + + WARNING Note that passing an + to this method will print the name of the + but no stack trace. To print a stack trace use the + form instead. + + + + + + + + Log a message object with the level including + the stack trace of the passed + as a parameter. + + The logger on which the message is logged. + The message object to log. + The exception to log, including its stack trace. + + + See the form for more detailed information. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + An that supplies culture-specific formatting information + The logger on which the message is logged. + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object to format + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Log a message object with the level. + + The logger on which the message is logged. + The lambda expression that gets the object to log. + + + This method first checks if this logger is WARN + enabled by reading the value property. + This check happens always and does not depend on the + implementation. If this logger is WARN enabled, then it converts + the message object (retrieved by invocation of the provided callback) to a + string by invoking the appropriate . + It then proceeds to call all the registered appenders in this logger + and also higher in the hierarchy depending on the value of + the additivity flag. + + WARNING Note that passing an + to this method will print the name of the + but no stack trace. To print a stack trace use the + form instead. + + + + + + + + Log a message object with the level including + the stack trace of the passed + as a parameter. + + The logger on which the message is logged. + The lambda expression that gets the object to log. + The exception to log, including its stack trace. + + + See the form for more detailed information. + + + + + + + Log a message object with the level. //TODO + + Log a message object with the level. + + The logger on which the message is logged. + The message object to log. + + + This method first checks if this logger is WARN + enabled by reading the value property. + This check happens always and does not depend on the + implementation. If this logger is WARN enabled, then it converts + the message object (passed as parameter) to a string by invoking the appropriate + . It then + proceeds to call all the registered appenders in this logger + and also higher in the hierarchy depending on the value of + the additivity flag. + + WARNING Note that passing an + to this method will print the name of the + but no stack trace. To print a stack trace use the + form instead. + + + + + + + + Log a message object with the level including + the stack trace of the passed + as a parameter. + + The logger on which the message is logged. + The message object to log. + The exception to log, including its stack trace. + + + See the form for more detailed information. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + An that supplies culture-specific formatting information + The logger on which the message is logged. + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object to format + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Log a message object with the level. + + The logger on which the message is logged. + The lambda expression that gets the object to log. + + + This method first checks if this logger is ERROR + enabled by reading the value property. + This check happens always and does not depend on the + implementation. If this logger is ERROR enabled, then it converts + the message object (retrieved by invocation of the provided callback) to a + string by invoking the appropriate . + It then proceeds to call all the registered appenders in this logger + and also higher in the hierarchy depending on the value of + the additivity flag. + + WARNING Note that passing an + to this method will print the name of the + but no stack trace. To print a stack trace use the + form instead. + + + + + + + + Log a message object with the level including + the stack trace of the passed + as a parameter. + + The logger on which the message is logged. + The lambda expression that gets the object to log. + The exception to log, including its stack trace. + + + See the form for more detailed information. + + + + + + + Log a message object with the level. //TODO + + Log a message object with the level. + + The logger on which the message is logged. + The message object to log. + + + This method first checks if this logger is ERROR + enabled by reading the value property. + This check happens always and does not depend on the + implementation. If this logger is ERROR enabled, then it converts + the message object (passed as parameter) to a string by invoking the appropriate + . It then + proceeds to call all the registered appenders in this logger + and also higher in the hierarchy depending on the value of + the additivity flag. + + WARNING Note that passing an + to this method will print the name of the + but no stack trace. To print a stack trace use the + form instead. + + + + + + + + Log a message object with the level including + the stack trace of the passed + as a parameter. + + The logger on which the message is logged. + The message object to log. + The exception to log, including its stack trace. + + + See the form for more detailed information. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + An that supplies culture-specific formatting information + The logger on which the message is logged. + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object to format + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Log a message object with the level. + + The logger on which the message is logged. + The lambda expression that gets the object to log. + + + This method first checks if this logger is FATAL + enabled by reading the value property. + This check happens always and does not depend on the + implementation. If this logger is FATAL enabled, then it converts + the message object (retrieved by invocation of the provided callback) to a + string by invoking the appropriate . + It then proceeds to call all the registered appenders in this logger + and also higher in the hierarchy depending on the value of + the additivity flag. + + WARNING Note that passing an + to this method will print the name of the + but no stack trace. To print a stack trace use the + form instead. + + + + + + + + Log a message object with the level including + the stack trace of the passed + as a parameter. + + The logger on which the message is logged. + The lambda expression that gets the object to log. + The exception to log, including its stack trace. + + + See the form for more detailed information. + + + + + + + Log a message object with the level. //TODO + + Log a message object with the level. + + The logger on which the message is logged. + The message object to log. + + + This method first checks if this logger is FATAL + enabled by reading the value property. + This check happens always and does not depend on the + implementation. If this logger is FATAL enabled, then it converts + the message object (passed as parameter) to a string by invoking the appropriate + . It then + proceeds to call all the registered appenders in this logger + and also higher in the hierarchy depending on the value of + the additivity flag. + + WARNING Note that passing an + to this method will print the name of the + but no stack trace. To print a stack trace use the + form instead. + + + + + + + + Log a message object with the level including + the stack trace of the passed + as a parameter. + + The logger on which the message is logged. + The message object to log. + The exception to log, including its stack trace. + + + See the form for more detailed information. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + An that supplies culture-specific formatting information + The logger on which the message is logged. + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object to format + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Manages an ordered mapping from instances + to subclasses. + + Nicko Cadell + + + + Add a to this mapping + + the entry to add + + + If a has previously been added + for the same then that entry will be + overwritten. + + + + + + Looks up the value for the specified level. Finds the nearest + mapping value for the level that is equal to or less than the + specified. + + the level to look up. + The for the level or if no mapping found + + + + Initialize options + + + Caches the sorted list of + + + + + An abstract base class for types that are stored in the + object. + + Nicko Cadell + + + + Default protected constructor + + + + + Gets or sets the level that is the key for this mapping. + + + + + Initialize any options defined on this entry + + + + Should be overridden by any classes that need to initialize based on their options + + + + + + Class for assertions + + + + + Ensures that is not and returns the validated value + + Type of + Value to validate + Name of the value + Error message (optional) + Value (when not null) + + + + + Ensures that is not null and an instance of + and returns the validated value + + Type to check for + Value to validate + Name of the value + Error message (optional) + Value (when not null and of the required type) + + + + + + Determines whether this is a fatal exception that should not be handled + + Exception + , if it is a fatal exception, otherwise + + + + Implementation of Properties collection for the + + + + Class implements a collection of properties that is specific to each thread. + The class is not synchronized as each thread has its own . + + + This class stores its properties in a slot on the named + for .net4x, + otherwise System.Threading.AsyncLocal + + + Nicko Cadell + + + + Flag used to disable this context if we don't have permission to access the CallContext. + + + + + Constructor + + + + Initializes a new instance of the class. + + + + + + + + + Remove a property + + the key for the entry to remove + + + Remove the value for the specified from the context. + + + + + + Clear all the context properties + + + + Clear all the context properties + + + + + + Get the PropertiesDictionary stored in the LocalDataStoreSlot for this thread. + + create the dictionary if it does not exist, otherwise return null if it does not exist + the properties for this thread + + + The collection returned is only to be used on the calling thread. If the + caller needs to share the collection between different threads then the + caller must clone the collection before doings so. + + + + + + Gets the call context get data. + + The properties dictionary stored in the call context + + The method GetData security link demand, therefore we must + put the method call in a separate method that we can wrap in an exception handler. + + + + + Sets the call context data. + + The properties. + + The method SetData has a security link demand, therefore we must + put the method call in a separate method that we can wrap in an exception handler. + + + + + The fully qualified type of the LogicalThreadContextProperties class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Delegate type used for LogicalThreadContextStack's callbacks. + + + + + Implementation of Stack for the + + Nicko Cadell + + + + The stack store. + + + + + The name of this within the + . + + + + + The callback used to let the register a + new instance of a . + + + + + Internal constructor + + + + Initializes a new instance of the class. + + + + + + Gets the number of messages in the stack. + + + + The current number of messages in the stack. That is + the number of times has been called + minus the number of times has been called. + + + + + + Clears all the contextual information held in this stack. + + + + Clears all the contextual information held in this stack. + Only call this if you think that this thread is being reused after + a previous call execution which may not have completed correctly. + You do not need to use this method if you always guarantee to call + the method of the + returned from even in exceptional circumstances, + for example by using the using(log4net.LogicalThreadContext.Stacks["NDC"].Push("Stack_Message")) + syntax. + + + + + + Removes the top context from this stack. + + The message in the context that was removed from the top of this stack. + + + Remove the top context from this stack, and return + it to the caller. If this stack is empty then an + empty string (not ) is returned. + + + + + + Pushes a new context message into this stack. + + The new context message. + + An that can be used to clean up the context stack. + + + + Pushes a new context onto this stack. An + is returned that can be used to clean up this stack. This + can be easily combined with the using keyword to scope the + context. + + + Simple example of using the Push method with the using keyword. + + using(log4net.LogicalThreadContext.Stacks["NDC"].Push("Stack_Message")) + { + log.Warn("This should have an ThreadContext Stack message"); + } + + + + + + Returns the top context from this stack. + + The message in the context from the top of this stack. + + + Returns the top context from this stack. If this stack is empty then an + empty string (not ) is returned. + + + + + + Gets the current context information for this stack. + + The current context information. + + + + Gets the current context information for this stack. + + Gets the current context information + + + + Gets a cross-thread portable version of this object + + + + + Inner class used to represent a single context frame in the stack. + + + + + Constructor + + The message for this context. + The parent context in the chain. + + + Initializes a new instance of the class + with the specified message and parent context. + + + + + + Get the message. + + The message. + + + Get the message. + + + + + + Gets the full text of the context down to the root level. + + + The full text of the context down to the root level. + + + + Gets the full text of the context down to the root level. + + + + + + Struct returned from the method. + + + + This struct implements the and is designed to be used + with the pattern to remove the stack frame at the end of the scope. + + + + + + The depth to trim the stack to when this instance is disposed + + + + + The outer LogicalThreadContextStack. + + + + + Constructor + + The internal stack used by the ThreadContextStack. + The depth to return the stack to when this object is disposed. + + + Initializes a new instance of the class with + the specified stack and return depth. + + + + + + Returns the stack to the correct depth. + + + + Returns the stack to the correct depth. + + + + + + Implementation of Stacks collection for the + + Nicko Cadell + + + + Internal constructor + + + + Initializes a new instance of the class. + + + + + + Gets the named thread context stack + + + The named stack + + + + Gets the named thread context stack + + + + + + The fully qualified type of the ThreadContextStacks class. + + + Used by the internal logger to record the Type of the + log message. + + + + + LogReceivedEventHandler + + + + + Outputs log statements from within the log4net assembly. + + + + Log4net components cannot make log4net logging calls. However, it is + sometimes useful for the user to learn about what log4net is + doing. + + + All log4net internal debug calls go to the standard output stream + whereas internal error messages are sent to the standard error output + stream. + + + Nicko Cadell + Gert Driesen + + + + The event raised when an internal message has been received. + + + + + The Type that generated the internal message. + + + + + The DateTime stamp of when the internal message was received. + + + + + The UTC DateTime stamp of when the internal message was received. + + + + + A string indicating the severity of the internal message. + + + "log4net: ", + "log4net:ERROR ", + "log4net:WARN " + + + + + The internal log message. + + + + + The Exception related to the message. + + + Optional. Will be null if no Exception was passed. + + + + + Formats Prefix, Source, and Message in the same format as the value + sent to Console.Out and Trace.Write. + + + + + + Initializes a new instance of the class. + + + + + Static constructor that initializes logging by reading + settings from the application configuration file. + + + + The log4net.Internal.Debug application setting + controls internal debugging. This setting should be set + to true to enable debugging. + + + The log4net.Internal.Quiet application setting + suppresses all internal logging including error messages. + This setting should be set to true to enable message + suppression. + + + + + + Gets or sets a value indicating whether log4net internal logging + is enabled or disabled. + + + true if log4net internal logging is enabled, otherwise + false. + + + + When set to true, internal debug level logging will be + displayed. + + + This value can be set by setting the application setting + log4net.Internal.Debug in the application configuration + file. + + + The default value is false, i.e. debugging is + disabled. + + + + + The following example enables internal debugging using the + application configuration file : + + + + + + + + + + + + + Gets or sets a value indicating whether log4net should generate no output + from internal logging, not even for errors. + + + true if log4net should generate no output at all from internal + logging, otherwise false. + + + + When set to true will cause internal logging at all levels to be + suppressed. This means that no warning or error reports will be logged. + This option overrides the setting and + disables all debug also. + + This value can be set by setting the application setting + log4net.Internal.Quiet in the application configuration file. + + + The default value is false, i.e. internal logging is not + disabled. + + + + The following example disables internal logging using the + application configuration file : + + + + + + + + + + + + + + + + + Raises the LogReceived event when an internal messages is received. + + + + + + + + + Test if LogLog.Debug is enabled for output. + + + true if Debug is enabled + + + + Test if LogLog.Debug is enabled for output. + + + + + + Writes log4net internal debug messages to the + standard output stream. + + + The message to log. + + + All internal debug messages are prepended with + the string "log4net: ". + + + + + + Writes log4net internal debug messages to the + standard output stream. + + The Type that generated this message. + The message to log. + An exception to log. + + + All internal debug messages are prepended with + the string "log4net: ". + + + + + + Test if LogLog.Warn is enabled for output. + + + true if Warn is enabled + + + + + Writes log4net internal warning messages to the + standard error stream. + + The Type that generated this message. + The message to log. + + + All internal warning messages are prepended with + the string "log4net:WARN ". + + + + + + Writes log4net internal warning messages to the + standard error stream. + + The Type that generated this message. + The message to log. + An exception to log. + + + All internal warning messages are prepended with + the string "log4net:WARN ". + + + + + + Test if LogLog.Error is enabled for output. + + + true if Error is enabled + + + + Test if LogLog.Error is enabled for output. + + + + + + Writes log4net internal error messages to the + standard error stream. + + The Type that generated this message. + The message to log. + + + All internal error messages are prepended with + the string "log4net:ERROR ". + + + + + + Writes log4net internal error messages to the + standard error stream. + + The Type that generated this message. + The message to log. + An exception to log. + + + All internal debug messages are prepended with + the string "log4net:ERROR ". + + + + + + Writes output to the standard output stream. + + The message to log. + + + Writes to both Console.Out and System.Diagnostics.Trace. + + + If the AppDomain is not configured with a config file then + the call to System.Diagnostics.Trace may fail. This is only + an issue if you are programmatically creating your own AppDomains. + + + + + + Writes output to the standard error stream. + + The message to log. + + + Writes to both Console.Error and System.Diagnostics.Trace. + Note that the System.Diagnostics.Trace is not supported + on the Compact Framework. + + + If the AppDomain is not configured with a config file then + the call to System.Diagnostics.Trace may fail. This is only + an issue if you are programmatically creating your own AppDomains. + + + + + + Subscribes to the LogLog.LogReceived event and stores messages + to the supplied IList instance. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Represents a Win32 native error code and message. + + Nicko Cadell + Gert Driesen + + + + Create an instance of the class with the specified + error number and message. + + The number of the native error. + The message of the native error. + + + + Gets the number of the native error. + + + The number of the native error. + + + + Gets the number of the native error. + + + + + + Gets the message of the native error. + + + + + Creates a new instance of the class for the last Windows error. + + + An instance of the class for the last windows error. + + + + The message for the error number is lookup up using the + native Win32 FormatMessage function. + + + + + + Create a new instance of the class. + + the error number for the native error + + An instance of the class for the specified + error number. + + + + The message for the specified error number is lookup up using the + native Win32 FormatMessage function. + + + + + + Retrieves the message corresponding with a Win32 message identifier. + + Message identifier for the requested message. + + The message corresponding with the specified message identifier. + + + + The message will be searched for in system message-table resource(s) + using the native FormatMessage function. + + + + + + Return error information string + + error information string + + + Return error information string + + + + + + Native Methods + + Jan Friedrich + + + + Formats a message string. + + Formatting options, and how to interpret the parameter. + Location of the message definition. + Message identifier for the requested message. + Language identifier for the requested message. + If includes FORMAT_MESSAGE_ALLOCATE_BUFFER, the function allocates a buffer using the LocalAlloc function, and places the pointer to the buffer at the address specified in . + If the FORMAT_MESSAGE_ALLOCATE_BUFFER flag is not set, this parameter specifies the maximum number of TCHARs that can be stored in the output buffer. If FORMAT_MESSAGE_ALLOCATE_BUFFER is set, this parameter specifies the minimum number of TCHARs to allocate for an output buffer. + Pointer to an array of values that are used as insert values in the formatted message. + + + The function requires a message definition as input. The message definition can come from a + buffer passed into the function. It can come from a message table resource in an + already-loaded module. Or the caller can ask the function to search the system's message + table resource(s) for the message definition. The function finds the message definition + in a message table resource based on a message identifier and a language identifier. + The function copies the formatted message text to an output buffer, processing any embedded + insert sequences if requested. + + + To prevent the usage of unsafe code, this stub does not support inserting values in the formatted message. + + + + + If the function succeeds, the return value is the number of TCHARs stored in the output + buffer, excluding the terminating null character. + + + If the function fails, the return value is zero. To get extended error information, + call . + + + + + + Stub for OutputDebugString native method + + the string to output + + + + Open connection to system logger. + + + + + Generate a log message. + + + + The libc syslog method takes a format string and a variable argument list similar + to the classic printf function. As this type of vararg list is not supported + by C# we need to specify the arguments explicitly. Here we have specified the + format string with a single message argument. The caller must set the format + string to "%s". + + + + + + Close descriptor used to write to system logger. + + + + + An always empty . + + + + A singleton implementation of the over a collection + that is empty and not modifiable. + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + + Uses a private access modifier to enforce the singleton pattern. + + + + + + Gets the singleton instance of the . + + The singleton instance of the . + + + + Gets the current object from the enumerator. + + + Throws an because the + never has a current value. + + + + As the enumerator is over an empty collection its + value cannot be moved over a valid position, therefore + will throw an . + + + The collection is empty and + cannot be positioned over a valid location. + + + + Test if the enumerator can advance, if so advance. + + false as the cannot advance. + + + As the enumerator is over an empty collection its + value cannot be moved over a valid position, therefore + will always return false. + + + + + + Resets the enumerator back to the start. + + + + As the enumerator is over an empty collection does nothing. + + + + + + Gets the current key from the enumerator. + + + Throws an exception because the + never has a current value. + + + + As the enumerator is over an empty collection its + value cannot be moved over a valid position, therefore + will throw an . + + + The collection is empty and + cannot be positioned over a valid location. + + + + Gets the current value from the enumerator. + + The current value from the enumerator. + + Throws an because the + never has a current value. + + + + As the enumerator is over an empty collection its + value cannot be moved over a valid position, therefore + will throw an . + + + The collection is empty and + cannot be positioned over a valid location. + + + + Gets the current entry from the enumerator. + + + Throws an because the + never has a current entry. + + + + As the enumerator is over an empty collection its + value cannot be moved over a valid position, therefore + will throw an . + + + The collection is empty and + cannot be positioned over a valid location. + + + + An always empty . + + + + A singleton implementation of the over a collection + that is empty and not modifiable. + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + + Uses a private access modifier to enforce the singleton pattern. + + + + + + Get the singleton instance of the . + + The singleton instance of the . + + + + Gets the current object from the enumerator. + + + Throws an because the + never has a current value. + + + + As the enumerator is over an empty collection its + value cannot be moved over a valid position, therefore + will throw an . + + + The collection is empty and + cannot be positioned over a valid location. + + + + Test if the enumerator can advance, if so advance + + false as the cannot advance. + + + As the enumerator is over an empty collection its + value cannot be moved over a valid position, therefore + will always return false. + + + + + + Resets the enumerator back to the start. + + + + As the enumerator is over an empty collection does nothing. + + + + + + A SecurityContext used when a SecurityContext is not required + + + + The is a no-op implementation of the + base class. It is used where a + is required but one has not been provided. + + + Nicko Cadell + + + + Singleton instance of + + + + Singleton instance of + + + + + + Private constructor + + + + Private constructor for singleton pattern. + + + + + + Impersonate this SecurityContext + + State supplied by the caller + null + + + No impersonation is done and null is always returned. + + + + + + Implements log4net's default error handling policy which consists + of emitting a message for the first error in an appender and + ignoring all subsequent errors. + + + + The error message is processed using the LogLog sub-system by default. + + + This policy aims at protecting an otherwise working application + from being flooded with error messages when logging fails. + + + Nicko Cadell + Gert Driesen + Ron Grabowski + + + + Default Constructor + + + + Initializes a new instance of the class. + + + + + + Constructor + + The prefix to use for each message. + + + Initializes a new instance of the class + with the specified prefix. + + + + + + Reset the error handler back to its initial disabled state. + + + + + Log an Error + + The error message. + The exception. + The internal error code. + + + Invokes if and only if this is the first error or the first error after has been called. + + + + + + Log the very first error + + The error message. + The exception. + The internal error code. + + + Sends the error information to 's Error method. + + + + + + Log an Error + + The error message. + The exception. + + + Invokes if and only if this is the first error or the first error after has been called. + + + + + + Log an error + + The error message. + + + Invokes if and only if this is the first error or the first error after has been called. + + + + + + Is error logging enabled + + + + Logging is only enabled for the first error delivered to the . + + + + + + The date the first error that triggered this error handler occurred, or if it has not been triggered. + + + + + The UTC date the first error that triggered this error handler occured, or if it has not been triggered. + + + + + The message from the first error that triggered this error handler. + + + + + The exception from the first error that triggered this error handler. + + + May be . + + + + + The error code from the first error that triggered this error handler. + + + Defaults to + + + + + String to prefix each message with + + + + + The fully qualified type of the OnlyOnceErrorHandler class. + + + Used by the internal logger to record the Type of the + log message. + + + + + A convenience class to convert property values to specific types. + + + + Utility functions for converting types and parsing values. + + + Nicko Cadell + Gert Driesen + + + + Converts a string to a value. + + String to convert. + The default value. + The value of . + + + If is "true", then true is returned. + If is "false", then false is returned. + Otherwise, is returned. + + + + + + Parses a file size into a number. + + String to parse. + The default value. + The value of . + + + Parses a file size of the form: number[KB|MB|GB] into a + long value. It is scaled with the appropriate multiplier. + + + is returned when + cannot be converted to a value. + + + + + + Converts a string to an object. + + The target type to convert to. + The string to convert to an object. + + The object converted from a string or null when the + conversion failed. + + + + Converts a string to an object. Uses the converter registry to try + to convert the string value into the specified target type. + + + + + + Checks if there is an appropriate type conversion from the source type to the target type. + + The type to convert from. + The type to convert to. + true if there is a conversion from the source type to the target type. + + Checks if there is an appropriate type conversion from the source type to the target type. + + + + + + + Converts an object to the target type. + + The object to convert to the target type. + The type to convert to. + The converted object. + + + Converts an object to the target type. + + + + + + Instantiates an object given a class name. + + The fully qualified class name of the object to instantiate. + The class to which the new object should belong. + The object to return in case of non-fulfillment. + + An instance of the or + if the object could not be instantiated. + + + + Checks that the is a subclass of + . If that test fails or the object could + not be instantiated, then is returned. + + + + + + Performs variable substitution in string from the + values of keys found in . + + The string on which variable substitution is performed. + The dictionary to use to lookup variables. + The result of the substitutions. + + + The variable substitution delimiters are ${ and }. + + + For example, if props contains key=value, then the call + + + + string s = OptionConverter.SubstituteVariables("Value of key is ${key}."); + + + + will set the variable s to "Value of key is value.". + + + If no value could be found for the specified key, then substitution + defaults to an empty string. + + + For example, if system properties contains no value for the key + "nonExistentKey", then the call + + + + string s = OptionConverter.SubstituteVariables("Value of nonExistentKey is [${nonExistentKey}]"); + + + + will set s to "Value of nonExistentKey is []". + + + An Exception is thrown if contains a start + delimiter "${" which is not balanced by a stop delimiter "}". + + + + + + Converts the string representation of the name or numeric value of one or + more enumerated constants to an equivalent enumerated object. + + The type to convert to. + The enum string value. + If true, ignore case; otherwise, regard case. + An object of type whose value is represented by . + + + + The fully qualified type of the OptionConverter class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Abstract class that provides the formatting functionality that + derived classes need. + + + + Conversion specifiers in a conversion patterns are parsed to + individual PatternConverters. Each of which is responsible for + converting a logging event in a converter specific manner. + + + Nicko Cadell + Gert Driesen + + + + Protected constructor + + + + Initializes a new instance of the class. + + + + + + Gets the next pattern converter in the chain. + + + + + Gets or sets the formatting info for this converter + + + The formatting info for this converter + + + + Gets or sets the formatting info for this converter + + + + + + Gets or sets the option value for this converter + + + The option for this converter + + + + Gets or sets the option value for this converter + + + + + + Evaluate this pattern converter and write the output to a writer. + + that will receive the formatted result. + The state object on which the pattern converter should be executed. + + + Derived pattern converters must override this method in order to + convert conversion specifiers in the appropriate way. + + + + + + Set the next pattern converter in the chains + + the pattern converter that should follow this converter in the chain + the next converter + + + The PatternConverter can merge with its neighbor during this method (or a subclass). + Therefore the return value may or may not be the value of the argument passed in. + + + + + + Write the pattern converter to the writer with appropriate formatting + + that will receive the formatted result. + The state object on which the pattern converter should be executed. + + + This method calls to allow the subclass to perform + appropriate conversion of the pattern converter. If formatting options have + been specified via the then this method will + apply those formattings before writing the output. + + + + + + Fast space padding method. + + to which the spaces will be appended. + The number of spaces to be padded. + + + Fast space padding method. + + + + + + Initial buffer size + + + + + Maximum buffer size before it is recycled + + + + + Write an dictionary to a + + the writer to write to + a to use for object conversion + the value to write to the writer + + + Writes the to a writer in the form: + + + {key1=value1, key2=value2, key3=value3} + + + If the specified + is not null then it is used to render the key and value to text, otherwise + the object's ToString method is called. + + + + + + Writes a dictionary to a + + the writer to write to + a to use for object conversion + the value to write to the writer + + + Writes the to a writer in the form: + + + {key1=value1, key2=value2, key3=value3} + + + If the specified + is not null then it is used to render the key and value to text, otherwise + the object's ToString method is called. + + + + + + Write an object to a + + the writer to write to + a to use for object conversion + the value to write to the writer + + + Writes the Object to a writer. If the specified + is not null then it is used to render the object to text, otherwise + the object's ToString method is called. + + + + + + + + + + + Most of the work of the class + is delegated to the PatternParser class. + + + + The PatternParser processes a pattern string and + returns a chain of objects. + + + Nicko Cadell + Gert Driesen + + + + Constructor + + The pattern to parse. + + + Initializes a new instance of the class + with the specified pattern string. + + + + + + Parses the pattern into a chain of pattern converters. + + The head of a chain of pattern converters. + + + + Gets the converter registry used by this parser. + + + + + Build the unified cache of converters from the static and instance maps + + the list of all the converter names + + + + Sort strings by length + + + + that orders strings by string length. + The longest strings are placed first + + + + + + Internal method to parse the specified pattern to find specified matches + + the pattern to parse + the converter names to match in the pattern + + + The matches param must be sorted such that longer strings come before shorter ones. + + + + + + Process a parsed literal + + the literal text + + + + Process a parsed converter pattern + + the name of the converter + the optional option for the converter + the formatting info for the converter + + + + Resets the internal state of the parser and adds the specified pattern converter + to the chain. + + The pattern converter to add. + + + + The first pattern converter in the chain + + + + + the last pattern converter in the chain + + + + + The pattern + + + + + The fully qualified type of the PatternParser class. + + + Used by the internal logger to record the Type of the + log message. + + + + + This class implements a patterned string. + + + + This string has embedded patterns that are resolved and expanded + when the string is formatted. + + + This class functions similarly to the + in that it accepts a pattern and renders it to a string. Unlike the + however the PatternString + does not render the properties of a specific but + of the process in general. + + + The recognized conversion pattern names are: + + + + Conversion Pattern Name + Effect + + + appdomain + + + Used to output the friendly name of the current AppDomain. + + + + + appsetting + + + Used to output the value of a specific appSetting key in the application + configuration file. + + + + + date + + + Used to output the current date and time in the local time zone. + To output the date in universal time use the %utcdate pattern. + The date conversion + specifier may be followed by a date format specifier enclosed + between braces. For example, %date{HH:mm:ss,fff} or + %date{dd MMM yyyy HH:mm:ss,fff}. If no date format specifier is + given then ISO8601 format is + assumed (). + + + The date format specifier admits the same syntax as the + time pattern string of the . + + + For better results it is recommended to use the log4net date + formatters. These can be specified using one of the strings + "ABSOLUTE", "DATE" and "ISO8601" for specifying + , + and respectively + . For example, + %date{ISO8601} or %date{ABSOLUTE}. + + + These dedicated date formatters perform significantly + better than . + + + + + env + + + Used to output the a specific environment variable. The key to + lookup must be specified within braces and directly following the + pattern specifier, e.g. %env{COMPUTERNAME} would include the value + of the COMPUTERNAME environment variable. + + + The env pattern is not supported on the .NET Compact Framework. + + + + + identity + + + Used to output the user name for the currently active user + (Principal.Identity.Name). + + + + + newline + + + Outputs the platform dependent line separator character or + characters. + + + This conversion pattern name offers the same performance as using + non-portable line separator strings such as "\n", or "\r\n". + Thus, it is the preferred way of specifying a line separator. + + + + + processid + + + Used to output the system process ID for the current process. + + + + + property + + + Used to output a specific context property. The key to + lookup must be specified within braces and directly following the + pattern specifier, e.g. %property{user} would include the value + from the property that is keyed by the string 'user'. Each property value + that is to be included in the log must be specified separately. + Properties are stored in logging contexts. By default + the log4net:HostName property is set to the name of machine on + which the event was originally logged. + + + If no key is specified, e.g. %property then all the keys and their + values are printed in a comma separated list. + + + The properties of an event are combined from a number of different + contexts. These are listed below in the order in which they are searched. + + + + the thread properties + + The that are set on the current + thread. These properties are shared by all events logged on this thread. + + + + the global properties + + The that are set globally. These + properties are shared by all the threads in the AppDomain. + + + + + + + random + + + Used to output a random string of characters. The string is made up of + uppercase letters and numbers. By default the string is 4 characters long. + The length of the string can be specified within braces directly following the + pattern specifier, e.g. %random{8} would output an 8 character string. + + + + + username + + + Used to output the WindowsIdentity for the currently + active user. + + + + + utcdate + + + Used to output the date of the logging event in universal time. + The date conversion + specifier may be followed by a date format specifier enclosed + between braces. For example, %utcdate{HH:mm:ss,fff} or + %utcdate{dd MMM yyyy HH:mm:ss,fff}. If no date format specifier is + given then ISO8601 format is + assumed (). + + + The date format specifier admits the same syntax as the + time pattern string of the . + + + For better results it is recommended to use the log4net date + formatters. These can be specified using one of the strings + "ABSOLUTE", "DATE" and "ISO8601" for specifying + , + and respectively + . For example, + %utcdate{ISO8601} or %utcdate{ABSOLUTE}. + + + These dedicated date formatters perform significantly + better than . + + + + + % + + + The sequence %% outputs a single percent sign. + + + + + + Additional pattern converters may be registered with a specific + instance using or + . + + + See the for details on the + format modifiers supported by the patterns. + + + Nicko Cadell + + + + Internal map of converter identifiers to converter types. + + + + + the head of the pattern converter chain + + + + + patterns defined on this PatternString only + + + + + Default constructor + + + + Initialize a new instance of + + + + + + Constructs a PatternString + + The pattern to use with this PatternString + + + Initialize a new instance of with the pattern specified. + + + + + + Gets or sets the pattern formatting string + + + The pattern formatting string + + + + The ConversionPattern option. This is the string which + controls formatting and consists of a mix of literal content and + conversion specifiers. + + + + + + Initialize object options + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Create the used to parse the pattern + + the pattern to parse + The + + + Returns PatternParser used to parse the conversion string. Subclasses + may override this to return a subclass of PatternParser which recognize + custom conversion pattern name. + + + + + + Produces a formatted string as specified by the conversion pattern. + + The TextWriter to write the formatted event to + + + Format the pattern to the . + + + + + + Format the pattern as a string + + the pattern formatted as a string + + + Format the pattern to a string. + + + + + + Adds a converter to this PatternString. + + the converter info + + + This version of the method is used by the configurator. + Programmatic users should use the alternative method. + The converter name is case-insensitive. + + + + + + Add a converter to this PatternString + + the name of the conversion pattern for this converter + the type of the converter + + + + Write the name of the current AppDomain to the output writer + + Nicko Cadell + + + + Write the name of the current AppDomain to the output + + the writer to write to + null, state is not set + + + Writes name of the current AppDomain to the output . + + + + + + AppSetting pattern converter + + + + This pattern converter reads appSettings from the application configuration file. + + + If the is specified then that will be used to + lookup a single appSettings value. If no is specified + then all appSettings will be dumped as a list of key value pairs. + + + A typical use is to specify a base directory for log files, e.g. + + + + + ... + + + ]]> + + + + + + + Write the property value to the output + + that will receive the formatted result. + null, state is not set + + + Writes out the value of a named property. The property name + should be set in the + property. + + + If the is set to null + then all the properties are written as key value pairs. + + + + + + Write the current date to the output + + + + Date pattern converter, uses a to format + the current date and time to the writer as a string. + + + The value of the determines + the formatting of the date. The following values are allowed: + + + Option value + Output + + + ISO8601 + + Uses the formatter. + Formats using the "yyyy-MM-dd HH:mm:ss,fff" pattern. + + + + DATE + + Uses the formatter. + Formats using the "dd MMM yyyy HH:mm:ss,fff" for example, "06 Nov 1994 15:49:37,459". + + + + ABSOLUTE + + Uses the formatter. + Formats using the "HH:mm:ss,fff" for example, "15:49:37,459". + + + + other + + Any other pattern string uses the formatter. + This formatter passes the pattern string to the + method. + For details on valid patterns see + DateTimeFormatInfo Class. + + + + + + The date and time is in the local time zone and is rendered in that zone. + To output the time in Universal time see . + + + Nicko Cadell + + + + The used to render the date to a string + + + + + Initialize the converter options + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Write the current date to the output + + that will receive the formatted result. + null, state is not set + + + Pass the current date and time to the + for it to render it to the writer. + + + The date and time passed is in the local time zone. + + + + + + The fully qualified type of the DatePatternConverter class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Write an folder path to the output + + + + The value of the determines + the name of the variable to output. + should be a value in the enumeration. + + + Ron Grabowski + + + + Writes a special path environment folder path to the output + + the writer to write to + null, state is not set + + + Writes the special path environment folder path to the output . + The name of the special path environment folder path to output must be set + using the + property. + + + + + + The fully qualified type of the EnvironmentFolderPathPatternConverter class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Write an environment variable to the output + + + + Write an environment variable to the output writer. + The value of the determines + the name of the variable to output. + + + Nicko Cadell + + + + Write an environment variable to the output + + the writer to write to + null, state is not set + + + Writes the environment variable to the output . + The name of the environment variable to output must be set + using the + property. + + + + + + The fully qualified type of the EnvironmentPatternConverter class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Write the current thread identity to the output + + + + Write the current thread identity to the output writer + + + Nicko Cadell + + + + Write the current thread identity to the output + + the writer to write to + null, state is not set + + + Writes the current thread identity to the output . + + + + + + The fully qualified type of the IdentityPatternConverter class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Pattern converter for literal string instances in the pattern + + + + Writes the literal string value specified in the + property to + the output. + + + Nicko Cadell + + + + Set the next converter in the chain + + The next pattern converter in the chain + The next pattern converter + + + Special case the building of the pattern converter chain + for instances. Two adjacent + literals in the pattern can be represented by a single combined + pattern converter. This implementation detects when a + is added to the chain + after this converter and combines its value with this converter's + literal value. + + + + + + Write the literal to the output + + the writer to write to + null, not set + + + Override the formatting behavior to ignore the FormattingInfo + because we have a literal instead. + + + Writes the value of + to the output . + + + + + + Convert this pattern into the rendered message + + that will receive the formatted result. + null, not set + + + This method is not used. + + + + + + Writes a newline to the output + + + + Writes the system dependent line terminator to the output. + This behavior can be overridden by setting the : + + + + Option Value + Output + + + DOS + DOS or Windows line terminator "\r\n" + + + UNIX + UNIX line terminator "\n" + + + + Nicko Cadell + + + + Initialize the converter + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Write the current process ID to the output + + + + Write the current process ID to the output writer + + + Nicko Cadell + + + + Write the current process ID to the output + + the writer to write to + null, state is not set + + + Write the current process ID to the output . + + + + + + The fully qualified type of the ProcessIdPatternConverter class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Property pattern converter + + + + This pattern converter reads the thread and global properties. + The thread properties take priority over global properties. + See for details of the + thread properties. See for + details of the global properties. + + + If the is specified then that will be used to + lookup a single property. If no is specified + then all properties will be dumped as a list of key value pairs. + + + Nicko Cadell + + + + Write the property value to the output + + that will receive the formatted result. + null, state is not set + + + Writes out the value of a named property. The property name + should be set in the + property. + + + If the is set to null + then all the properties are written as key value pairs. + + + + + + A Pattern converter that generates a string of random characters + + + + The converter generates a string of random characters. By default + the string is length 4. This can be changed by setting the + to the string value of the length required. + + + The random characters in the string are limited to uppercase letters and numbers only. + + + The random number generator used by this class is not cryptographically secure. + + + Nicko Cadell + + + + Shared random number generator + + + + + Length of random string to generate. Default length 4. + + + + + Initialize the converter options + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Writes a random string to the output + + the writer to write to + null, state is not set + + + + The fully qualified type of the RandomStringPatternConverter class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Write the current threads username to the output + + + + Write the current threads username to the output writer + + + Nicko Cadell + + + + Write the current threads username to the output + + the writer to write to + null, state is not set + + + Write the current threads username to the output . + + + + + + The fully qualified type of the UserNamePatternConverter class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Write the UTC date time to the output + + + + Date pattern converter, uses a to format + the current date and time in Universal time. + + + See the for details on the date pattern syntax. + + + + Nicko Cadell + + + + Write the current date and time to the output + + that will receive the formatted result. + null, state is not set + + + Pass the current date and time to the + for it to render it to the writer. + + + The date is in Universal time when it is rendered. + + + + + + + The fully qualified type of the UtcDatePatternConverter class. + + + Used by the internal logger to record the Type of the + log message. + + + + + String keyed object map. + + + + While this collection is serializable, only member objects that are serializable + will be serialized along with this collection. + + + Nicko Cadell + Gert Driesen + + + + Constructor + + + + Initializes a new instance of the class. + + + + + + Constructor + + properties to copy + + + Initializes a new instance of the class. + + + + + + Initializes a new instance of the class + with serialized data. + + The that holds the serialized object data. + The that contains contextual information about the source or destination. + + + Because this class is sealed the serialization constructor is private. + + + + + + Gets or sets the value of the property with the specified key. + + + The value of the property with the specified key. + + The key of the property to get or set. + + + The property value will only be serialized if it is serializable. + If it cannot be serialized it will be silently ignored if + a serialization operation is performed. + + + + + + See . + + + + + Remove the entry with the specified key from this dictionary + + the key for the entry to remove + + + Remove the entry with the specified key from this dictionary + + + + + + See + + an enumerator + + + Returns a over the contest of this collection. + + + + + + See + + the key to remove + + + Remove the entry with the specified key from this dictionary + + + + + + Remove all properties from the properties collection + + + + Remove all properties from the properties collection + + + + + + See + + the key + the value to store for the key + + + Store a value for the specified . + + + Thrown if the is not a string + + + + See + + + false + + + + This collection is modifiable. This property always + returns false. + + + + + + See + + + The value for the key specified. + + + + Get or set a value for the specified . + + + Thrown if the is not a string + + + + A class to hold the key and data for a property set in the config file + + + + + Property Key + + + + + Property Value + + + + + Override Object.ToString to return sensible debug info + + string info about this object + + + + A that ignores the message + + + This writer is used in special cases where it is necessary + to protect a writer from being closed by a client. + + Nicko Cadell + + + + Constructor + + the writer to actually write to + + Create a new ProtectCloseTextWriter using a writer + + + + + Attaches this instance to a different underlying . + + the writer to attach to + + + + Does not close the underlying output writer. + + + + + that does not leak exceptions + + + + does not throw exceptions when things go wrong. + Instead, it delegates error handling to its . + + + Nicko Cadell + Gert Driesen + + + + Constructor + + the writer to actually write to + the error handler to report error to + + + Create a new QuietTextWriter using a writer and error handler + + + + + + Gets or sets the error handler that all errors are passed to. + + + The error handler that all errors are passed to. + + + + Gets or sets the error handler that all errors are passed to. + + + + + + Gets a value indicating whether this writer is closed. + + + true if this writer is closed, otherwise false. + + + + Gets a value indicating whether this writer is closed. + + + + + + Writes a character to the underlying writer + + the char to write + + + Writes a character to the underlying writer + + + + + + Writes a buffer to the underlying writer + + the buffer to write + the start index to write from + the number of characters to write + + + Writes a buffer to the underlying writer + + + + + + Writes a string to the output. + + The string data to write to the output. + + + + Closes the underlying output writer. + + + + Closes the underlying output writer. + + + + + + The error handler instance to pass all errors to + + + + + Defines a lock that supports single writers and multiple readers + + + + ReaderWriterLock is used to synchronize access to a resource. + At any given time, it allows either concurrent read access for + multiple threads, or write access for a single thread. In a + situation where a resource is changed infrequently, a + ReaderWriterLock provides better throughput than a simple + one-at-a-time lock, such as . + + + If a platform does not support a System.Threading.ReaderWriterLock + implementation then all readers and writers are serialized. Therefore + the caller must not rely on multiple simultaneous readers. + + + Nicko Cadell + + + + Acquires a reader lock + + + + blocks if a different thread has the writer + lock, or if at least one thread is waiting for the writer lock. + + + + + + Decrements the lock count + + + + decrements the lock count. When the count + reaches zero, the lock is released. + + + + + + Acquires the writer lock + + + + This method blocks if another thread has a reader lock or writer lock. + + + + + + Decrements the lock count on the writer lock + + + + ReleaseWriterLock decrements the writer lock count. + When the count reaches zero, the writer lock is released. + + + + + + String keyed object map that is read only. + + + + This collection is readonly and cannot be modified. It is not thread-safe. + + + While this collection is serializable, only member + objects that are serializable will + be serialized along with this collection. + + + Nicko Cadell + Gert Driesen + + + + Constructor + + + + Initializes a new instance of the class. + + + + + + Copy Constructor + + properties to copy + + + Initializes a new instance of the class. + + + + + + Deserialization constructor + + The that holds the serialized object data. + The that contains contextual information about the source or destination. + + + Initializes a new instance of the class + with serialized data. + + + + + + Gets the key names. + + An array of all the keys. + + + Gets the key names. + + + + + + See . + + + + + See . + + + + + See . + + + + + See . + + + + + Gets or sets the value of the property with the specified key. + + + The value of the property with the specified key, or null if a property is not present in the dictionary. + Note this is the semantic, not that of . + + The key of the property to get or set. + + + The property value will only be serialized if it is serializable. + If it cannot be serialized it will be silently ignored if + a serialization operation is performed. + + + + + + Test if the dictionary contains a specified key + + the key to look for + true if the dictionary contains the specified key + + + Test if the dictionary contains a specified key + + + + + + The hashtable used to store the properties + + + The internal collection used to store the properties + + + + The hashtable used to store the properties + + + + + + Serializes this object into the provided. + + The to populate with data. + The destination for this serialization. + + + Serializes this object into the provided. + + + + + + See + + + + + See + + + + + See + + + + + + See + + + + + See . + + + + + Removes all properties from the properties collection + + + + + See . + + + + + See . + + + + + See . + + + + + See . + + + + + See . + + + + + See + + + + + See . + + + + + See . + + + + + See + + + + + See + + + + + See + + + + + See + + + + + See + + + + + The number of properties in this collection + + + + + See . + + + + + See + + + + + See + + + + + A that can be and reused + + + + This uses a single buffer for string operations. + + + Nicko Cadell + + + + Creates an instance of + + the format provider to use + + + + Override Dispose to prevent closing of writer + + flag + + + + Reset this string writer so that it can be reused. + + the maximum buffer capacity before it is trimmed + the default size to make the buffer + + + Reset this string writer so that it can be reused. + The internal buffers are cleared and reset. + + + + + + Utility class for system specific information. + + Nicko Cadell + Gert Driesen + Alexey Solofnenko + + + + Initialize default values for private static fields. + + + + Only static methods are exposed from this type. + + + + + + Gets the system dependent line terminator. + + + + + Gets the base directory for this . + + + + The value returned may be either a local file path or a URI. + + + + + + Gets the path to the configuration file for the current . + + + + The value returned may be either a local file path or a URI. + + + + + + Gets the path to the file that first executed in the current . + + + + + Gets the ID of the current thread. + + + + + Gets the host name or machine name for the current machine. + + + + The host name () or + the machine name () for + the current machine, or if neither of these are available + then NOT AVAILABLE is returned. + + + + + + Gets this application's friendly name. + + + + If available the name of the application is retrieved from + the AppDomain using AppDomain.CurrentDomain.FriendlyName. + + + Otherwise the file name of the entry assembly is used. + + + + + + Get the UTC start time for the current process. + + + + This is the UTC time at which the log4net library was loaded into the + AppDomain. Due to reports of a hang in the call to System.Diagnostics.Process.StartTime + this is not the start time for the current process. + + + The log4net library should be loaded by an application early during its + startup, therefore this start time should be a good approximation for + the actual start time. + + + Note that AppDomains may be loaded and unloaded within the + same process without the process terminating, however this start time + will be set per AppDomain. + + + + + + Text to output when a null is encountered. + + + + Use this value to indicate a null has been encountered while + outputting a string representation of an item. + + + The default value is (null). This value can be overridden by specifying + a value for the log4net.NullText appSetting in the application's + .config file. + + + + + + Text to output when an unsupported feature is requested. + + + + Use this value when an unsupported feature is requested. + + + The default value is NOT AVAILABLE. This value can be overridden by specifying + a value for the log4net.NotAvailableText appSetting in the application's + .config file. + + + + + + Gets the assembly location path for the specified assembly. + + The assembly to get the location for. + The location of the assembly. + + + This method does not guarantee to return the correct path + to the assembly. If only tries to give an indication as to + where the assembly was loaded from. + + + + + + Gets the short name of the . + + The to get the name for. + The short name of the . + + + The short name of the assembly is the + without the version, culture, or public key. i.e. it is just the + assembly's file name without the extension. + + + Because of a FileIOPermission security demand we cannot do + the obvious Assembly.GetName().Name. We are allowed to get + the of the assembly so we + start from there and strip out just the assembly name. + + + + + + Gets the file name portion of the , including the extension. + + The to get the file name for. + The file name of the assembly. + + + Gets the file name portion of the , including the extension. + + + + + + Loads the type specified in the type string. + + A sibling type to use to load the type. + The name of the type to load. + Flag set to true to throw an exception if the type cannot be loaded. + true to ignore the case of the type name; otherwise, false + The type loaded or null if it could not be loaded. + + + If the type name is fully qualified, i.e. if contains an assembly name in + the type name, the type will be loaded from the system using + . + + + If the type name is not fully qualified, it will be loaded from the assembly + containing the specified relative type. If the type is not found in the assembly + then all the loaded assemblies will be searched for the type. + + + + + + Loads the type specified in the type string. + + The name of the type to load. + Flag set to true to throw an exception if the type cannot be loaded. + true to ignore the case of the type name; otherwise, false + The type loaded or null if it could not be loaded. + + + If the type name is fully qualified, i.e. if contains an assembly name in + the type name, the type will be loaded from the system using + . + + + If the type name is not fully qualified it will be loaded from the + assembly that is directly calling this method. If the type is not found + in the assembly then all the loaded assemblies will be searched for the type. + + + + + + Loads the type specified in the type string. + + An assembly to load the type from. + The name of the type to load. + Flag set to true to throw an exception if the type cannot be loaded. + true to ignore the case of the type name; otherwise, false + The type loaded or null if it could not be loaded. + + + If the type name is fully qualified, i.e. if contains an assembly name in + the type name, the type will be loaded from the system using + . + + + If the type name is not fully qualified it will be loaded from the specified + assembly. If the type is not found in the assembly then all the loaded assemblies + will be searched for the type. + + + + + + Creates an + + The name of the parameter that caused the exception + The value of the argument that causes this exception + The message that describes the error + + A new instance of the class + with the specified error message, parameter name, and value + of the argument. + + + + + Creates a for read-only collection modification calls. + + The NotSupportedException object + + + + Parse a string into an value + + the string to parse + out param where the parsed value is placed + true if the string was parsed into an integer + + + Attempts to parse the string into an integer. If the string cannot + be parsed then this method returns false. The method does not throw an exception. + + + + + + Parse a string into an value + + the string to parse + out param where the parsed value is placed + true if the string was parsed into an integer + + + Attempts to parse the string into an integer. If the string cannot + be parsed then this method returns false. The method does not throw an exception. + + + + + + Parse a string into an value + + the string to parse + out param where the parsed value is placed + true if the string was parsed into an integer + + + Attempts to parse the string into an integer. If the string cannot + be parsed then this method returns false. The method does not throw an exception. + + + + + + Lookup an application setting + + the application settings key to lookup + the value for the key, or null + + + + Convert a path into a fully qualified local file path. + + The path to convert. + The fully qualified path. + + + Converts the path specified to a fully + qualified path. If the path is relative it is + taken as relative from the application base + directory. + + + The path specified must be a local file path, a URI is not supported. + + + + + + Creates a new case-insensitive instance of the class with the default initial capacity. + + A new case-insensitive instance of the class with the default initial capacity + + + The new Hashtable instance uses the default load factor, the CaseInsensitiveHashCodeProvider, and the CaseInsensitiveComparer. + + + + + + Tests two strings for equality, the ignoring case. + + + If the platform permits, culture information is ignored completely (ordinal comparison). + The aim of this method is to provide a fast comparison that deals with null and ignores different casing. + It is not supposed to deal with various, culture-specific habits. + Use it to compare against pure ASCII constants, like keywords etc. + + The one string. + The other string. + true if the strings are equal, false otherwise. + + + + The fully qualified type of the SystemInfo class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Cache the host name for the current machine + + + + + Cache the application friendly name + + + + + Utility class that represents a format string. + + Nicko Cadell + An that supplies culture-specific formatting information. + A containing zero or more format items. + An array containing zero or more objects to format. + + + + Utility class that represents a format string. + + Nicko Cadell + An that supplies culture-specific formatting information. + A containing zero or more format items. + An array containing zero or more objects to format. + + + + Format + + + + + Args + + + + + Format the string and arguments + + the formatted string + + + + Replaces the format item in a specified with the text equivalent + of the value of a corresponding instance in a specified array. + A specified parameter supplies culture-specific formatting information. + + An that supplies culture-specific formatting information. + A containing zero or more format items. + An array containing zero or more objects to format. + + A copy of format in which the format items have been replaced by the + equivalent of the corresponding instances of in args. + + + + This method does not throw exceptions. If an exception thrown while formatting the result the + exception and arguments are returned in the result string. + + + + + + Process an error during StringFormat + + + + + Dump the contents of an array into a string builder + + + + + Dump an object to a string + + + + + The fully qualified type of the SystemStringFormat class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Adapter that extends and forwards all + messages to an instance of . + + Nicko Cadell + + + + Creates an instance of that forwards all + messages to a . + + The to forward to + + + + Gets or sets the underlying . + + + + + The in which the output is written + + + + + Gets an object that controls formatting + + + + + Gets or sets the line terminator string used by the TextWriter. + + + + + Closes the writer and releases any system resources associated with the writer + + + + + + + + + Dispose this writer + + flag indicating if we are being disposed + + + Dispose this writer + + + + + + Flushes any buffered output + + + + Clears all buffers for the writer and causes any buffered data to be written + to the underlying device + + + + + + Writes a character to the wrapped TextWriter + + the value to write to the TextWriter + + + Writes a character to the wrapped TextWriter + + + + + + Writes a character buffer to the wrapped TextWriter + + the data buffer + the start index + the number of characters to write + + + Writes a character buffer to the wrapped TextWriter + + + + + + Writes a string to the wrapped TextWriter + + the value to write to the TextWriter + + + Writes a string to the wrapped TextWriter + + + + + + Implementation of Properties collection for the + + + + Class implements a collection of properties that is specific to each thread. + The class is not synchronized as each thread has its own . + + + Nicko Cadell + + + + Each thread will automatically have its instance. + + + + + Internal constructor + + + + Initializes a new instance of the class. + + + + + + Gets or sets the value of a property + + + The value for the property with the specified key + + + + Gets or sets the value of a property + + + + + + Remove a property + + the key for the entry to remove + + + Remove a property + + + + + + Get the keys stored in the properties. + + + Gets the keys stored in the properties. + + a set of the defined keys + + + + Clear all properties + + + + Clear all properties + + + + + + Get the PropertiesDictionary for this thread. + + create the dictionary if it does not exist, otherwise return null if it does not exist + the properties for this thread + + + The collection returned is only to be used on the calling thread. If the + caller needs to share the collection between different threads then the + caller must clone the collection before doing so. + + + + + + Implementation of Stack for the + + + + Implementation of Stack for the + + + Nicko Cadell + + + + The stack store. + + + + + Internal constructor + + + + Initializes a new instance of the class. + + + + + + The number of messages in the stack + + + The current number of messages in the stack + + + + The current number of messages in the stack. That is + the number of times has been called + minus the number of times has been called. + + + + + + Clears all the contextual information held in this stack. + + + + Clears all the contextual information held in this stack. + Only call this if you think that this tread is being reused after + a previous call execution which may not have completed correctly. + You do not need to use this method if you always guarantee to call + the method of the + returned from even in exceptional circumstances, + for example by using the using(log4net.ThreadContext.Stacks["NDC"].Push("Stack_Message")) + syntax. + + + + + + Removes the top context from this stack. + + The message in the context that was removed from the top of this stack. + + + Remove the top context from this stack, and return + it to the caller. If this stack is empty then an + empty string (not ) is returned. + + + + + + Pushes a new context message into this stack. + + The new context message. + + An that can be used to clean up the context stack. + + + + Pushes a new context onto this stack. An + is returned that can be used to clean up this stack. This + can be easily combined with the using keyword to scope the + context. + + + Simple example of using the Push method with the using keyword. + + using(log4net.ThreadContext.Stacks["NDC"].Push("Stack_Message")) + { + log.Warn("This should have an ThreadContext Stack message"); + } + + + + + + Returns the top context from this stack. + + The message in the context from the top of this stack. + + + Returns the top context from this stack. If this stack is empty then an + empty string (not ) is returned. + + + + + + Gets the current context information for this stack. + + The current context information. + + + + Gets and sets the internal stack used by this + + The internal storage stack + + + This property is provided only to support backward compatibility + of the . Typically the internal stack should not + be modified. + + + + + + Gets the current context information for this stack. + + + + + Get a portable version of this object + + + + + Inner class used to represent a single context frame in the stack. + + + + + Constructor + + The message for this context. + The parent context in the chain. + + + Initializes a new instance of the class + with the specified message and parent context. + + + + + + Get the message. + + + + + Gets the full text of the context down to the root level. + + + + + Struct returned from the method. + + + + This struct implements the and is designed to be used + with the pattern to remove the stack frame at the end of the scope. + + + + + + The ThreadContextStack internal stack + + + + + The depth to trim the stack to when this instance is disposed + + + + + Initializes a new instance of the class with + the specified stack and return depth. + + The internal stack used by the ThreadContextStack. + The depth to return the stack to when this object is disposed. + + + + Returns the stack to the correct depth. + + + + + Implementation of Stacks collection for the + + Nicko Cadell + + + + Initializes a new instance of the class. + + + + + Gets the named thread context stack. + + + + + The fully qualified type of the ThreadContextStacks class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Utility class for transforming strings. + + + + Utility class for transforming strings. + + + Nicko Cadell + Gert Driesen + + + + Write a string to an + + the writer to write to + the string to write + The string to replace non XML compliant chars with + + + The test is escaped either using XML escape entities + or using CDATA sections. + + + + + + Replace invalid XML characters in text string + + the XML text input string + the string to use in place of invalid characters + A string that does not contain invalid XML characters. + + + Certain Unicode code points are not allowed in the XML InfoSet, for + details see: http://www.w3.org/TR/REC-xml/#charsets. + + + This method replaces any illegal characters in the input string + with the mask string specified. + + + + + + Count the number of times that the substring occurs in the text + + the text to search + the substring to find + the number of times the substring occurs in the text + + + The substring is assumed to be non repeating within itself. + + + + + + Characters illegal in XML 1.0 + + + + + Type converter for Boolean. + + + + Supports conversion from string to bool type. + + + + + + Nicko Cadell + Gert Driesen + + + + Can the source type be converted to the type supported by this object + + the type to convert + + True if the is + the type. + + + + + Converts the source object to the type supported by this object + + the object to convert + the converted object + + + Uses the method to convert the + argument to a . + + + + The object cannot be converted to the + target type. To check for this condition use the + method. + + + + + Exception base type for conversion errors. + + + + This type extends . It + does not add any new functionality but does differentiate the + type of exception being thrown. + + + Nicko Cadell + Gert Driesen + + + + Constructor + + + + Initializes a new instance of the class. + + + + + + Constructor + + A message to include with the exception. + + + Initializes a new instance of the class + with the specified message. + + + + + + Constructor + + A message to include with the exception. + A nested exception to include. + + + Initializes a new instance of the class + with the specified message and inner exception. + + + + + + Serialization constructor + + The that holds the serialized object data about the exception being thrown. + The that contains contextual information about the source or destination. + + + Initializes a new instance of the class + with serialized data. + + + + + + Creates a new instance of the class. + + The conversion destination type. + The value to convert. + An instance of the . + + + Creates a new instance of the class. + + + + + + Creates a new instance of the class. + + The conversion destination type. + The value to convert. + A nested exception to include. + An instance of the . + + + Creates a new instance of the class. + + + + + + Register of type converters for specific types. + + + + Maintains a registry of type converters used to convert between types. + + + Use the and + methods to register new converters. + The and methods + lookup appropriate converters to use. + + + + + Nicko Cadell + Gert Driesen + + + + This class constructor adds the intrinsic type converters + + + + + Adds a converter for a specific type. + + The type being converted to. + The type converter to use to convert to the destination type. + + + + Adds a converter for a specific type. + + The type being converted to. + The type of the type converter to use to convert to the destination type. + + + + Gets the type converter to use to convert values to the destination type. + + The type being converted from. + The type being converted to. + + The type converter instance to use for type conversions or null + if no type converter is found. + + + + + Gets the type converter to use to convert values to the destination type. + + The type being converted to. + + The type converter instance to use for type conversions or null + if no type converter is found. + + + + + Lookups the type converter to use as specified by the attributes on the + destination type. + + The type being converted to. + + The type converter instance to use for type conversions or null + if no type converter is found. + + + + + Creates the instance of the type converter. + + The type of the type converter. + + The type converter instance to use for type conversions or null + if no type converter is found. + + + + The type specified for the type converter must implement + the or interfaces + and must have a public default (no argument) constructor. + + + + + + The fully qualified type of the ConverterRegistry class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Supports conversion from string to type. + + + + + Nicko Cadell + Gert Driesen + + + + Can the source type be converted to the type supported by this object + + the type to convert + + True if the is + the type. + + + + + Overrides the ConvertFrom method of IConvertFrom. + + the object to convert to an encoding + the encoding + + + Uses the method to + convert the argument to an . + + + + The object cannot be converted to the + target type. To check for this condition use the + method. + + + + + Interface supported by type converters + + + + This interface supports conversion from arbitrary types + to a single target type. See . + + + Nicko Cadell + Gert Driesen + + + + Can the source type be converted to the type supported by this object + + the type to convert + true if the conversion is possible + + + Test if the can be converted to the + type supported by this converter. + + + + + + Convert the source object to the type supported by this object + + the object to convert + the converted object + + + Converts the to the type supported + by this converter. + + + + + + Interface supported by type converters + + + + This interface supports conversion from a single type to arbitrary types. + See . + + + Nicko Cadell + + + + Returns whether this converter can convert the object to the specified type + + A Type that represents the type you want to convert to + true if the conversion is possible + + + Test if the type supported by this converter can be converted to the + . + + + + + + Converts the given value object to the specified type, using the arguments + + the object to convert + The Type to convert the value parameter to + the converted object + + + Converts the (which must be of the type supported + by this converter) to the specified.. + + + + + + Supports conversion from string to type. + + + + Supports conversion from string to type. + + + + + Nicko Cadell + + + + Can the source type be converted to the type supported by this object + + the type to convert + true if the conversion is possible + + + Returns true if the is + the type. + + + + + + Overrides the ConvertFrom method of IConvertFrom. + + the object to convert to an IPAddress + the IPAddress + + + Uses the method to convert the + argument to an . + If that fails then the string is resolved as a DNS hostname. + + + + The object cannot be converted to the + target type. To check for this condition use the + method. + + + + + Supports conversion from string to type. + + + + The string is used as the + of the . + + + + + + Nicko Cadell + + + + Can the source type be converted to the type supported by this object + + the type to convert + + True if the is + the type. + + + + + Overrides the ConvertFrom method of IConvertFrom. + + the object to convert to a PatternLayout + the PatternLayout + + + Creates and returns a new using + the as the + . + + + + The object cannot be converted to the + target type. To check for this condition use the + method. + + + + + Convert between string and + + + + Supports conversion from string to type, + and from a type to a string. + + + The string is used as the + of the . + + + + + + Nicko Cadell + + + + Can the target type be converted to the type supported by this object + + A that represents the type you want to convert to + true if the conversion is possible + + + Returns true if the is + assignable from a type. + + + + + + Converts the given value object to the specified type, using the arguments + + the object to convert + The Type to convert the value parameter to + the converted object + + + Uses the method to convert the + argument to a . + + + + The object cannot be converted to the + . To check for this condition use the + method. + + + + + Can the source type be converted to the type supported by this object + + the type to convert + + True if the is + the type. + + + + + Overrides the ConvertFrom method of IConvertFrom. + + the object to convert to a PatternString + the PatternString + + + Creates and returns a new using + the as the + . + + + + The object cannot be converted to the + target type. To check for this condition use the + method. + + + + + Supports conversion from string to type. + + + + + Nicko Cadell + + + + Can the source type be converted to the type supported by this object + + the type to convert + + True if the is + the type. + + + + + Overrides the ConvertFrom method of IConvertFrom. + + the object to convert to a Type + the Type + + + Uses the method to convert the + argument to a . + Additional effort is made to locate partially specified types + by searching the loaded assemblies. + + + + The object cannot be converted to the + target type. To check for this condition use the + method. + + + + + Attribute used to associate a type converter + + + + Class and Interface level attribute that specifies a type converter + to use with the associated type. + + + To associate a type converter with a target type apply a + TypeConverterAttribute to the target type. Specify the + type of the type converter on the attribute. + + + Nicko Cadell + Gert Driesen + + + + Creates a new type converter attribute for the specified type name + + The string type name of the type converter + + + The type specified must implement the + or the interfaces. + + + + + + Creates a new type converter attribute for the specified type + + The type of the type converter + + + The type specified must implement the + or the interfaces. + + + + + + The string type name of the type converter + + + + The type specified must implement the + or the interfaces. + + + + + + Impersonate a Windows Account + + + + This impersonates a Windows account. + + + How the impersonation is done depends on the value of . + This allows the context to either impersonate a set of user credentials specified + using username, domain name and password or to revert to the process credentials. + + + + + + The impersonation modes for the + + + + See the property for + details. + + + + + + Impersonate a user using the credentials supplied + + + + + Revert this the thread to the credentials of the process + + + + + Gets or sets the impersonation mode for this security context + + + The impersonation mode for this security context + + + + Impersonate either a user with user credentials or + revert this thread to the credentials of the process. + The value is one of the + enum. + + + The default value is + + + When the mode is set to + the user's credentials are established using the + , and + values. + + + When the mode is set to + no other properties need to be set. If the calling thread is + impersonating then it will be reverted back to the process credentials. + + + + + + Gets or sets the Windows username for this security context + + + The Windows username for this security context + + + + This property must be set if + is set to (the default setting). + + + + + + Gets or sets the Windows domain name for this security context + + + The Windows domain name for this security context + + + + The default value for is the local machine name + taken from the property. + + + This property must be set if + is set to (the default setting). + + + + + + Sets the password for the Windows account specified by the and properties. + + + The password for the Windows account specified by the and properties. + + + + This property must be set if + is set to (the default setting). + + + + + + Initialize the SecurityContext based on the options set. + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + The security context will try to Logon the specified user account and + capture a primary token for impersonation. + + + The required , + or properties were not specified. + + + + Impersonate the Windows account specified by the and properties. + + caller provided state + + An instance that will revoke the impersonation of this SecurityContext + + + + Depending on the property either + impersonate a user using credentials supplied or revert + to the process credentials. + + + + + + Create a given the userName, domainName and password. + + the user name + the domain name + the password + the for the account specified + + + Uses the Windows API call LogonUser to get a principal token for the account. This + token is used to initialize the WindowsIdentity. + + + + + + Adds to + + the impersonation context being wrapped + + + Helper class to expose the + through the interface. + + + + + + Adds to + + the impersonation context being wrapped + + + Helper class to expose the + through the interface. + + + + + + Revert the impersonation + + + + + Specifies that null is allowed as an input even if the corresponding type disallows it. + + + + + Initializes a new instance of the System.Diagnostics.CodeAnalysis.AllowNullAttribute class. + + + + + Specifies that null is disallowed as an input even if the corresponding type allows it. + + + + + Initializes a new instance of the System.Diagnostics.CodeAnalysis.DisallowNullAttribute class. + + + + + Specifies that a method that will never return under any circumstance. + + + + + Initializes a new instance of the System.Diagnostics.CodeAnalysis.DoesNotReturnAttribute class. + + + + + Specifies that the method will not return if the associated System.Boolean parameter is passed the specified value. + + + + + Initializes a new instance of the System.Diagnostics.CodeAnalysis.DoesNotReturnIfAttribute class + with the specified parameter value. + + + The condition parameter value. + Code after the method is considered unreachable by diagnostics if the argument to the associated parameter + matches this value. + + + + + Gets the condition parameter value. + + The condition parameter value. Code after the method is considered unreachable + by diagnostics if the argument to the associated parameter matches this value. + + + + + Specifies that an output may be null even if the corresponding type disallows it. + + + + + Specifies that when a method returns System.Diagnostics.CodeAnalysis.MaybeNullWhenAttribute.ReturnValue, + the parameter may be null even if the corresponding type disallows it. + + + + + Initializes the attribute with the specified return value condition. + + The return value condition. If the method returns this value, the associated parameter may be null. + + + + Gets the return value condition. + + + + + Specifies that the method or property will ensure that the listed field and property members have values that aren't null. + + + + + Initializes the attribute with list of field or property members. + + The list of field and property members that are promised to be non-null. + + + + Initializes the attribute with a field or property member. + + The field or property member that is promised to be non-null. + + + + Gets field or property member names. + + + + + Specifies that the method or property will ensure that the listed field and property members have non-null values + when returning with the specified return value condition. + + + + + Initializes the attribute with the specified return value condition and a field or property member. + + The return value condition. If the method returns this value, the associated parameter will not be null. + The list of field and property members that are promised to be non-null. + + + + Initializes the attribute with the specified return value condition and a field or property member. + + The return value condition. If the method returns this value, the associated parameter will not be null. + The field or property member that is promised to be non-null. + + + + Gets field or property member names. + + + + + Gets the return value condition. + + + + + Specifies that an output is not even if the corresponding type allows it. + Specifies that an input argument was not when the call returns. + + + + + Specifies that the output will be non-null if the named parameter is non-null. + + + + + Initializes the attribute with the associated parameter name. + + + The associated parameter name. + The output will be non-null if the argument to the parameter specified is non-null. + + + + + Gets the associated parameter name. + + + + + Specifies that when a method returns ReturnValue, + the parameter will not be null even if the corresponding type allows it. + + + + + Initializes the attribute with the specified return value condition. + + + The return value condition. + If the method returns this value, the associated parameter will not be null. + + + + Gets the return value condition. + + + + + Specifies that this constructor sets all required members for the current type, + and callers do not need to set any required members themselves. + + + + + Attribute to tell Roslyn-Analyzers that a parameter will be checked for + + + + + Indicates that a parameter captures the expression passed for another parameter as a string. + + + + + Name of the parameter whose expression should be captured as a string + + + + + + + + Indicates that compiler support for a particular feature is required for the location where this attribute is applied + + + + + The used for the ref structs C# feature + + + + + The used for the required members C# feature + + + + + The name of the compiler feature + + + + + Gets a value that indicates whether the compiler can choose to allow access to the location + where this attribute is applied if it does not understand + + + + + Initializes a instance for the passed in compiler feature + + The name of the compiler feature + + + + + + + + + + + + + + + + + + + + + + + + + + + + Specifies that a type has required members or that a member is required + + + + diff --git a/SERemoteControl/obj/Debug/.NETFramework,Version=v4.8.AssemblyAttributes.cs b/SERemoteControl/obj/Debug/.NETFramework,Version=v4.8.AssemblyAttributes.cs new file mode 100644 index 0000000..15efebf --- /dev/null +++ b/SERemoteControl/obj/Debug/.NETFramework,Version=v4.8.AssemblyAttributes.cs @@ -0,0 +1,4 @@ +// +using System; +using System.Reflection; +[assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(".NETFramework,Version=v4.8", FrameworkDisplayName = ".NET Framework 4.8")] diff --git a/SERemoteControl/obj/Debug/SERemoteControl.AboutBox.resources b/SERemoteControl/obj/Debug/SERemoteControl.AboutBox.resources new file mode 100644 index 0000000000000000000000000000000000000000..6c05a9776bd7cbae976fdcec7e3a254e93018279 GIT binary patch literal 180 zcmX?i>is@O1_p+SK%5g?SzMBus~417oL^d$oLUTL1*ImYq!#HYR*8GxXUf^%t3Noi54ZC+|=Nl{{sjzU0bQch;FcWPxwes*e}ZIZcpqG__J onW3ezNveT`r81^vrFkWpxv4PQgHubGfR2KJ07n-P+5+SQ04Y>DD*ylh literal 0 HcmV?d00001 diff --git a/SERemoteControl/obj/Debug/SERemoteControl.FormMain.resources b/SERemoteControl/obj/Debug/SERemoteControl.FormMain.resources new file mode 100644 index 0000000000000000000000000000000000000000..d218d1f552eba8b1e9ebf8ce5714ac7b1f799eef GIT binary patch literal 91748 zcmeFaca#)YnlGq%Z)f-IIeX6jv3uT`GiTq7re#{)tyZ@jM&5h1yo3ZiAVlO{ylu}%j>^fw|>pSXICyf=u={Nt3V_uctr>sPK@x?t7ey62y8=)dEwhwvYV?)exuO^)AfBjfg;+g~^W zH*VaZKS6h}r#mB;q29y};0|5CIe6pd!1Wu0!`E+IzdrVW%!q(h;I$Lq7%?MAcN zU^1I67Ps4-P9}#22g#s;f+!-oejV2%J!<#wJ)HlE|6NA>PBefKSaf^?dko*35uNMY~GKIcqD(wq}Ee@wfXAp`dT?}Sj zQ*%XibxCP?adBx$adA~eMMZH*`PJgK`UU}m$!D_IOeTxT1v3MK~yV;~wDx@M2kICw4Yj108YHes_clYR3>R2dzeVCYl zGzt9ZJ^W1%{+;0ezNEdr96Ok+q{A7+RW>#>c6N4hSZuLCtWqcqI=$6o zwp*=ePKN{9-tBavIczqAR;!Z9gd8rjvkTx?msgZsxq7X*q^G^ZX|oLu42;|XMTU1H z#&LJ~i*^44;eW?(9s?JhJMpJRk(@%=Y?SUE`@q$}_9gdDa?D$%P{7K7etwE#dD&~{;SVgu?PkH_cp z`ThO?{`-7**QC>{r7|&(54LY_YHqHpuc^3p_2Q+==P%S%Rhf;(>$Fiw-PpgUEciRY ze+-bjbjFaQ%`d#Xwb3sCGu7xbVNw&1ikRd?Z{Io}bTE8_0Ny{C&E#Uyc)%aDT5L)H zE|zrmK%_U<)YVtl)Kyp2*3~w&HMg<486uuQDU};^I*Z9a z902HEZy-QWAK9oQz~89TDWp>HKdY-7{NI2tsI02JRtYM&R#MtnUmx`QM}8501tHp7 zw|wiD{tbHnG4a0*QVQN77-ypm`jn;udc0`241j~flZlky2f*zLxst~dbanPLHZ;}M z*4Nh5HPttCwzl+a5x+~tyV6R3AkKX2QBpt^;OkS0cfBCh=cCVPCl2L&1C)t0RO}# z|AXK^_A6*$X|ATJfIc!jD&TPteFR(j1_rbFLL!m!`GbH@qf!e6!k+G)mZp|Euy##t zeO-NPODmJX6bVIYr4lS^H=ALuL1R;b9E#gvcM^f_B7pmY!62}uH%NBCO!t8}pvDFs z#u1!EUIYR-?(+vgEC>Op)M|-D!sT$fIy#yg8tSU5t6(#hmep2PwKX*Ze5G6tV{ybI z82hz<`_A7p{xq`V_v6L`hsWa&aX-{Q*qbXP;z{tJ#cWlo)I5Q(o5^f#?`UjpZfR=j zXl(_jfxX2-A&hgg!2rw5X}3F}@qx62k?r(OYdn~ zAUIRZ585EKK)ob?K@oufYydR3&x@;TbULX_#%8nIT3TwWt1HVZh|f@32139Qkw5?) zfjfzWLPU#E^8epQ1^hkXKlY19I?(8p2EQ{hiW7#fU+?elFBA%hs09N-v(>6lD)~G< zgTd&)*474L&gkfb%Ow>E)pEH}uZQ-g0moo_T`n}RI`%#f@FpA%0BIHnyrDnH zKL8S-kC1byZHyM^4y6YO0eGPha6&j7j>n?uWH=FrbbuVO*lZ@VMWfLm1W;35U0PgR zURqjTQv-=0mr8LF5E@7zpUwXN9)GBBU_JsnG2e-9AGki;H$0T@?M);S7%dEyL9J

X@o#1rU%i{UF>l(@Q%jgiBu|?PDeqK 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 T(h_$70000 + + + \ No newline at end of file diff --git a/UnitTestProject/Properties/AssemblyInfo.cs b/UnitTestProject/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..81af0c4 --- /dev/null +++ b/UnitTestProject/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("UnitTestProject")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("UnitTestProject")] +[assembly: AssemblyCopyright("Copyright © 2016")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("ceaebdda-2557-4402-834f-75815e6ae7a3")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/UnitTestProject/UnitTest1.cs b/UnitTestProject/UnitTest1.cs new file mode 100644 index 0000000..59e0df2 --- /dev/null +++ b/UnitTestProject/UnitTest1.cs @@ -0,0 +1,235 @@ +using System; +using System.IO; +using System.Xml; +using System.Xml.Serialization; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using MT.pHLab.SE.V1; +using SERemoteLib; + + + + +namespace UnitTestProject +{ + internal static class PhInstrumentSerializationHelper + { + + ///

+ /// Tries do deserialize the given xml data to the given type. + /// + /// + /// An object of the given type if the data could be deserialized, null + /// otherwise. + /// + public static T DeserializeDeviceData(this string xml) + { + object deviceData = null; + try + { + using (TextReader reader = new StringReader(xml)) + { + XmlRootAttribute xmlRoot = new XmlRootAttribute(); + xmlRoot.Namespace = "tf"; + xmlRoot.IsNullable = true; + + var serializer = new XmlSerializer(typeof(T), xmlRoot); + deviceData = serializer.Deserialize(reader); + } + } + catch (XmlException ) + { + } + catch (InvalidOperationException ) + { + } + return (T)deviceData; + } + } + + + [TestClass] + public class UnitTestResultMessage + { + [TestMethod] + public void Test01() + { + string telegram = "2016-02-03T12:29:08.46701"; + + StringReader stringReader = new StringReader(telegram); + XmlTextReader reader = new XMLSerializationCustomization.PdkXmlTextReader(stringReader); + + { + XmlRootAttribute xmlRoot = new XmlRootAttribute(); + xmlRoot.Namespace = "tf"; + xmlRoot.IsNullable = true; + + IntegerResult objResultMessage = new IntegerResult(); + XmlSerializer xmlser = new XmlSerializer(objResultMessage.GetType(), xmlRoot); + objResultMessage = (IntegerResult)xmlser.Deserialize(reader); + } + } + + [TestMethod] + public void Test01StringResult() + { + string telegram = "2016-02-04T09:27:32.7300Hello world, here I am"; + + StringReader stringReader = new StringReader(telegram); + XmlTextReader reader = new XMLSerializationCustomization.PdkXmlTextReader(stringReader); + + { + StringResult objResultMessage = new StringResult(); + + XmlRootAttribute xmlRoot = new XmlRootAttribute(); + xmlRoot.Namespace = "tf"; + xmlRoot.IsNullable = true; + + XmlSerializer xmlser = new XmlSerializer(objResultMessage.GetType(), xmlRoot); + objResultMessage = (StringResult)xmlser.Deserialize(reader); + } + } + + [TestMethod] + public void Test01Decfloat() + { + //string telegram = "2016-02-04T09:27:32.7300eDecimalResultState_Valid1.034"; + string telegram = "2016-02-04T09:27:32.730001.034"; + + StringReader stringReader = new StringReader(telegram); + XmlTextReader reader = new XMLSerializationCustomization.PdkXmlTextReader(stringReader); + + { + DecimalResult objResultMessage = new DecimalResult(); + + XmlRootAttribute xmlRoot = new XmlRootAttribute(); + xmlRoot.Namespace = "tf"; + xmlRoot.IsNullable = true; + + XmlSerializer xmlser = new XmlSerializer(objResultMessage.GetType(), xmlRoot); + objResultMessage = (DecimalResult)xmlser.Deserialize(reader); + } + } + + + [TestMethod] + public void Test02_ResultMessage() + { + //string BAD telegram = "MeasType1:Measure100-235.023.43110.9910202016-02-04 14:56:54"; + //string telegram = "MeasType1:Measure1002016-02-04T09:27:32.7300eDecimalResultState_Valid1.034"; + // OK string telegram = "TIMESTAMPS002016-02-04T09:27:32.73001"; + // OK string telegram = "ABTIMESTAMPS002016-02-03T12:29:08.46701"; + // OK string telegram = "ABTIMESTAMPS002016-02-03T12:29:08.46701"; + //string telegram = "ABTIMESTAMPS002016-02-03T12:29:08.46701"; + string telegram = "HalloEchoMeasType1:Measure100174.524.5314.0410202016-02-05 17:54:07"; + + StringReader stringReader= new StringReader(telegram); + XmlTextReader reader = new XMLSerializationCustomization.PdkXmlTextReader(stringReader); + + reader.ReadToFollowing("ResultMessage"); + + { + ResultMessage objResultMessage = new ResultMessage(); + + //var resultMessage = PhInstrumentSerializationHelper.DeserializeDeviceData(telegram); + XmlRootAttribute xmlRoot = new XmlRootAttribute(); + xmlRoot.Namespace = "tf"; + xmlRoot.IsNullable = true; + + XmlSerializer xmlser = new XmlSerializer(typeof(ResultMessage), xmlRoot); + objResultMessage = (ResultMessage)xmlser.Deserialize(reader); + } + } + + [TestMethod] + public void Test03() + { + string xmlstring; + + { + StringWriter stream = new StringWriter(); + + ResultMessage message = new ResultMessage(); + message.groupid = "GroupId"; + message.rackid = "RackId"; + message.slotid = "SlotId"; + message.result = new TreasureFleetAnyResult(); + message.result.Item = new DecimalResult(); + ((DecimalResult)message.result.Item).value = 4712.4m; + + XmlSerializer serializer = new XmlSerializer(message.GetType()); + serializer.Serialize(stream, message); + + xmlstring = stream.ToString(); + } + + + { + StringReader xmlStream = new StringReader(xmlstring); + ResultMessage message = new ResultMessage(); + + XmlRootAttribute xmlRoot = new XmlRootAttribute(); + //xmlRoot.Namespace = "tf"; + xmlRoot.ElementName = "Telegram"; + xmlRoot.IsNullable = true; + + XmlSerializer xmlser = new XmlSerializer(message.GetType()); + message = (ResultMessage)xmlser.Deserialize(xmlStream); + } + } + + [TestMethod] + public void Test04() + { + string xmlstring; + { + StringWriter stream = new StringWriter(); + + ResultMessage message = new ResultMessage(); + message.groupid = "GroupId"; + message.rackid = "RackId"; + message.slotid = "SlotId"; + message.result = new TreasureFleetAnyResult(); + message.result.Item = new DecimalResult(); + ((DecimalResult)message.result.Item).value = 4712.4m; + + XmlRootAttribute xmlRoot = new XmlRootAttribute(); + xmlRoot.Namespace = "tf"; + xmlRoot.IsNullable = true; + XmlSerializer serializer = new XmlSerializer(message.GetType(), xmlRoot); + serializer.Serialize(stream, message); + + xmlstring = stream.ToString(); + } + + + { + StringReader xmlStream = new StringReader(xmlstring); + ResultMessage message = new ResultMessage(); + + XmlRootAttribute xmlRoot = new XmlRootAttribute(); + xmlRoot.Namespace = "tf"; + xmlRoot.IsNullable = true; + + XmlSerializer xmlser = new XmlSerializer(message.GetType(), xmlRoot); + message = (ResultMessage)xmlser.Deserialize(xmlStream); + } + } + + + [TestMethod] + public void Test05_Response() + { + string telegram= "M001M002M003M004M005M006M007M008M009M010M011M012M013M014M015M016M017M018M019M020M021"; + { + XmlReader reader = XmlReader.Create(new StringReader(telegram)); + MT.pHLab.SE.V1.SEResponse response = MT.pHLab.SE.V1.SEResponse.CreateFromXml(reader); + + if (response.GetRecordType() == typeof(MT.pHLab.SE.V1.Response_setupGetItemListRecord)) + { + var record = new MT.pHLab.SE.V1.Response_setupGetItemListRecord(); + record.ReadXml(reader); + } + } + } + } +} diff --git a/UnitTestProject/UnitTestProject.csproj b/UnitTestProject/UnitTestProject.csproj new file mode 100644 index 0000000..5edb01c --- /dev/null +++ b/UnitTestProject/UnitTestProject.csproj @@ -0,0 +1,95 @@ + + + + Debug + AnyCPU + {80352D19-F394-4627-BACE-6AC5FC8BF7F8} + Library + Properties + UnitTestProject + UnitTestProject + v4.8 + 512 + {3AC096D0-A1C2-E12C-1390-A8335801FDAB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + 10.0 + $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) + $(ProgramFiles)\Common Files\microsoft shared\VSTT\$(VisualStudioVersion)\UITestExtensionPackages + False + UnitTest + + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + + + + + + + + + + + + + + + + + + + + + + + + + {5222f720-4e4f-4932-b01d-e4b8dbd8cc5f} + SEClient + + + + + + + False + + + False + + + False + + + False + + + + + + + + \ No newline at end of file diff --git a/UnitTestProject/obj/Debug/.NETFramework,Version=v4.8.AssemblyAttributes.cs b/UnitTestProject/obj/Debug/.NETFramework,Version=v4.8.AssemblyAttributes.cs new file mode 100644 index 0000000..15efebf --- /dev/null +++ b/UnitTestProject/obj/Debug/.NETFramework,Version=v4.8.AssemblyAttributes.cs @@ -0,0 +1,4 @@ +// +using System; +using System.Reflection; +[assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(".NETFramework,Version=v4.8", FrameworkDisplayName = ".NET Framework 4.8")] diff --git a/packages/log4net.3.0.3-preview.1/.signature.p7s b/packages/log4net.3.0.3-preview.1/.signature.p7s new file mode 100644 index 0000000000000000000000000000000000000000..b196798d99f4bdf10c5ddb3cf5e56fb01c099bdf GIT binary patch literal 12917 zcmeHtXH-*L+btoX_ue6ZbcCJIL8J=^Nbg;G??t2~(h=!ZsnVMi1*M9DB3+awhzJPM z1Oe&D4JsZz=X~#b?vH!MxMO_$A#3locUF@1%sHPqH-LnDVB&B`C`IfNfUwZ>knpPj z5^jbL0>g*^0!$o>2qlmW7=jMMKm)A*m2$?)YJ>>T85JiVdHu2wJ_fa>%x9vQKppC6w!>Xa4g z6rYuw3yc|HIz0s@qyBk?j;D{8w~aMa%gxOjswfCBQW3xe08s!2g9E5PBPs%c(}B>B z;lHv5Bs$BlA073RfRX4#XaEu&7afTXLTg`0@Uow7o;SUG0bl_f1XiDvu<^ZMmfVaP zH+=G*t3=YE!Z)kG`Z`@0K_|epMOP?FxuW+h-G!l|?%HM#$?&}SD8>aXA}yw8ITS^~ zZMkLol!m&V_w1A1pVT$^WIB4mQ(h9w6Z5@8ZefKjcuTl=%$~=m`ve_%0cEh_IzO;# zcBMOckJ<9J;0newvsGi-mX#NS{gr~!=CuK~pZvO&N^SM^b9D@E;qx@AmjDxbpL(vF z&Q-loH~S#82{R|+X-=)e3pQ8JNB57a^aJOvOK%Dg&ZyU>S7N_ z45)U`nOusu-tBOR^3Cv-G&GgeKjL=DIqP#^#XCk(=(kG8W~vR@CyT zw7yq^cS36pKUxqObDTbkgtx-A%{IotySOg*-0%nWmMA>ssFmmPz8qCWgxU>%ZZ>e=QgU& zM7pQ>1!!?|*7ihtgMQWS`^QuooOCsV#uu%l1c~O1Ob4gu9VMmqg&b4a`yACk_@f;=HSvq_hGHz*@+;k@ z;GQ*&fS{|)xS`!%wlDKAEX+R^-7mRUy6YlzC(tNnv_Ld-%RhEoZ5WC-4f%BQwj#ol z;4wLT9Wdmpp7Ge!n|DliOVV&ji?a{NsuLy;z}!6d2!}*t47>JWbU+xZr7YKnyZr@F znX#95tS6S)^JB@!RB7roWIQCL)ZAGk@GnmxhWp?tVFcJX>GbN4KRH3Yf#Df3LE>;` z3J~^3UHG(z@&qT9hT1}#+Do6xp`JsThjK;bubyJatMdxqo;{dVc*v^ljOk{l8*=G^ zs+23I(KYtr!qThh!;G_Qmt$M#jukHxytA_nt}~Vyl9=C?*oIgwtv}I0)69$Eelg(R zH?kZFp{^geryO-}D=D*~e!-GxI2>(JgLa-SHJc{?(Vg1cwP=j%LqzJb&M$CVKFJ-3 zdlYr6u@?y)N1L{UUuA#~=ke&QW$AZJ9uN=GG{#=0iw8Auq-uX`h;}h!nZ2;FfJLfW)i;kdTZYn2cQ| zU1u?TM>W^1zpOR6dg4!8=3l`>6eh!AfFNA#6p_DUvM_2W3KtL(6B0859De5oDuCh? z<#EXf&rqKClotqW;QXZkuY1@y-75h#jq#I$^&4QB-C}Vjlv0QO*6Fb$#3{c939@YN$S` zlU!EjW|suh=6bK95m~WnJqXISMf@tZ?htz;W+ofwu}#TAMyRq-q@*Uz#{_171-|@T z-uKi`X#2W8B`dqj!s8F0Ez@t=*e4dKsUk^~wCtyeTgmlJKT?y~bcNKZhw~~G>V*l7 z?(^L#N27Qt@|6}dJ6IJJ z>+^|R?^d{EVBVl>bhJA^+$v9-M2v{9k-!;yej9G|WrDd=Esk# zxFt1Up2RxgYi+w#*o;2KHhs-=N*Y^!iL_rQH3}|uTN-412}Gy7aD%f-EMoO_BZ2nN zp5lTJ5Vr~>`;r$MtC)IQs!5S1`cAhS^m-C=$!v^txv=}%lgN-6WKFU2fVQL63@7~u z5tlDYE1JJRXn2Javoaf6#8~Te^fA+Z6r~BYrSJC_RRA*8Pps5co68BXwPgYgBo*rq z8dh(@anSpmFW~Eue1~Qv$Phq+bOF*+^!*0U*Z?L9lu_{d3nJT#%&as>?3t599DcRD zjvZyQeMR=0Kw)5oPy>{qe-GJzM)*?=#J~o@2XHa5c`!j37+7F1;CJ>K1cEpL4#2sy zF#w97w)ggS7w6}9v+{EPO&$RqC4WqGQeyndU=e^x#}s^?TYDGKsgd3pnK zr>kLtTmZxY(LCWi!3g--eLS57{@G2O0s7OMKp`l72Vh}h*dg#iU;rBv^YjG-^d|uN z##!R5@{)1bzMtY-#4}&%&7jj3?I{Uv@ir`Y+wP`#)}r;?a|SrbNOKb8b5)LW?gp}t zh_r~CD!HVNNGWe~G*coJG>-4IHiXak28(#~vg{g_Ck%c`cAQ&*z8ulG7L^qf)6vkH zuS6X@H6BV!LPOnenTgQbc`@g^*f~#UF1L3v<-}J^GUs*X;N`cRE9UI^sRl|Tv|qd9_`bNB^udy)MA}IYd6P@2G_FnYL8`oyx?86Vt+D1=%mK;A9T%449DA27gN}iPY zus2)OB~Kg}kO?aVdr3&X1IdTCp;ZmBLig)GFkq=i)Xf zI0x1~Q|n=I^AmUCV_RPkh_B|nd7(Ex3Xh;&Vtat``mOZ`E4_^yeq;-aoKlsf)kXX) z&NBN*6AIftXTqMYh^IU30{B=ed9Se09UY|sB^AL^O=xo!T{!lvA%RN|h6c~_W%`_= zPXMJFDi=YIu2 zVqu^-Ywe7)%IodMs7X~SqoJf!XH_(@%G5kLs`le!Q$f9EbT zfCRPqA=qTN`lyx)#YEn2t}xocKp?Kul7c8@jcF8brIH@x%v0TgHQ)cfCJ>oft zX#wGCNL`_(PFiE-9*fv>&IKt-)($RFt(|K~zU7!Dus3Q^ulSIGTqGY}sw^H}_-OBl z@Va)huU3jaKwTlBweG%JRr)b^?(Wi!%jny8--!zJ3=xYl#ObCye;i!?%+7A?;=vwk z8^)2i;IbNYW=DX)HM)1%2u}Ix&2o8OVC^T(2wJ((Cw3(M~%%^%zGaUwUYxhdRl>LKObQk zq(78xKV6Ut0d;Vds;*HSv67MBj z*~O|C%E|fXVazHyzGfzE2?Vpl@qTs12`ytAHXtM8;>{OAV1R08Sod0@L!T-oK|LmrSl(Vk^ z#i58u01@^NS=8k0IsiRFd7qu4hMv;NIm$aYaYhCEj~nY@e9Syplb z$@deMwVvz4l$a5Yi%tBZ^NxyFQXfhU_qL@84UtY|V@^-{Z)a^K#eh{KJf=HT($5{O z>w4fd_0R2m&N*zNDJCTlrm$yK(4FvSvsAEXCR2YMLT4_$wU|g;)E1~L3nnR{Mh)z5pzB|Zi^fr1x z_?cSKF<;#6u=I2*PGR$9k090*X%S&^Je+_^6jC!zrn)p)iG~sAT#ZG{n_y5H+g>^v zZrkI&#m<4gX_RgxG-O>*P*&x9eBS^b099L&z@8oY}U{<^_2G!MP0V~4Wm9>b7~u>g`W5@qX!lK*YZ z|8Di=Awi`my9^&C93dd2hz>dkgbu?3Fz~^aUbX=BPx}oA48!|5zyhHZ+Lc4~<;Pzn%=c+UNBIY)??`O&7HQs%3$M2>pdadM>ha(( z`uM?)XqK>iM%@Ep^a)uhId>zyl@Vo4RVB}y_ zaw%t=8CH&#z<5SIvQ1~`epo743B+?T)3r{R)jXeYkpsesF|OU0146F#L8*TC{OKExLA+c;KA_(S%e;>p30Q6k=~O`H+Pj z*c5-2h?`wzK9Y_eK+;kFy3Gh-NIERkLGaH_e(JWK{CGM{vF#FhNXj;pN8gCDK5~EPYy8ET4^-oqzQ%vBIHKDC#C~NW43tlA^Lv&2 z-~06E0G3mE3nrsG>olPxw;qIY>p>v2Dng2ZdAU%N+Q_X&i+vB$qUtI3l&JFUfiF-oP6G@4z0fyh6sd5_ z3lC~J!(w8la&hr*PzA&%RK_e`(>8&Haqkdiz=eJLrr%yDEm(IvWZu-We3uIyW16j< z_)2X(OloYtZ$K^7qS&7=yzdn9x<>S32i?<~0u$r>)L%J?>Pv2nK6RCUY$=pR`PJ}F ztgp-1=K>W1o)bLJH#rtVw-SV&`RhhP^9Mh;;C3qq!ZHM$S(YM);6?>aWJr=VF{
    (bZCOEwz2N~KaM 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 literal 0 HcmV?d00001 diff --git a/packages/log4net.3.0.3-preview.1/README.md b/packages/log4net.3.0.3-preview.1/README.md new file mode 100644 index 0000000..34374d5 --- /dev/null +++ b/packages/log4net.3.0.3-preview.1/README.md @@ -0,0 +1,31 @@ +# log4net +[![NuGet package](https://img.shields.io/nuget/v/log4net.svg?logo=NuGet)](https://www.nuget.org/packages/log4net) +[![NuGet package](https://img.shields.io/nuget/dt/log4net?logo=NuGet)](https://www.nuget.org/packages/log4net) + +# Introduction + +Apache log4net is a sub project of the Apache Logging Services project. +Apache log4net graduated from the Apache Incubator in February 2007. +Web site: http://logging.apache.org/log4net + +# Documentation + +For the latest documentation see the log4net web site at: +http://logging.apache.org/log4net + +# Contributing + +log4net development happens on [Github](https://github.com/apache/logging-log4net) +and on our [mailing list](https://logging.apache.org/support.html). +Please join the mailing list and discuss bigger changes before working on them. + +For bigger changes we must ask you to sign a [Contributor License Agreement](http://www.apache.org/licenses/#clas). + +# Developing + +log4net targets net462 and netstandard2.0. + +Please see +- [CONTRIBUTING.md](doc/CONTRIBUTING.md) +- [BUILDING.md](doc/BUILDING.md) +- [RELEASING.md](doc/RELEASING.md) diff --git a/packages/log4net.3.0.3-preview.1/lib/net462/log4net.xml b/packages/log4net.3.0.3-preview.1/lib/net462/log4net.xml new file mode 100644 index 0000000..987015b --- /dev/null +++ b/packages/log4net.3.0.3-preview.1/lib/net462/log4net.xml @@ -0,0 +1,28271 @@ + + + + log4net + + + + + Appender that logs to a database. + + + + appends logging events to a table within a + database. The appender can be configured to specify the connection + string by setting the property. + The connection type (provider) can be specified by setting the + property. For more information on database connection strings for + your specific database see http://www.connectionstrings.com/. + + + Records are written into the database either using a prepared + statement or a stored procedure. The property + is set to (System.Data.CommandType.Text) to specify a prepared statement + or to (System.Data.CommandType.StoredProcedure) to specify a stored + procedure. + + + The prepared statement text or the name of the stored procedure + must be set in the property. + + + The prepared statement or stored procedure can take a number + of parameters. Parameters are added using the + method. This adds a single to the + ordered list of parameters. The + type may be subclassed if required to provide database specific + functionality. The specifies + the parameter name, database type, size, and how the value should + be generated using a . + + + + An example of a SQL Server table that could be logged to: + + CREATE TABLE [dbo].[Log] ( + [ID] [int] IDENTITY (1, 1) NOT NULL , + [Date] [datetime] NOT NULL , + [Thread] [varchar] (255) NOT NULL , + [Level] [varchar] (20) NOT NULL , + [Logger] [varchar] (255) NOT NULL , + [Message] [varchar] (4000) NOT NULL + ) ON [PRIMARY] + + + + An example configuration to log to the above table: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Julian Biddle + Nicko Cadell + Gert Driesen + Lance Nehring + + + + Initializes a new instance of the class. + + + Public default constructor to initialize a new instance of this class. + + + + + Gets or sets the database connection string that is used to connect to + the database. + + + The database connection string used to connect to the database. + + + + The connections string is specific to the connection type. + See for more information. + + + Connection string for MS Access via ODBC: + "DSN=MS Access Database;UID=admin;PWD=;SystemDB=C:\data\System.mdw;SafeTransactions = 0;FIL=MS Access;DriverID = 25;DBQ=C:\data\train33.mdb" + + Another connection string for MS Access via ODBC: + "Driver={Microsoft Access Driver (*.mdb)};DBQ=C:\Work\cvs_root\log4net-1.2\access.mdb;UID=;PWD=;" + + Connection string for MS Access via OLE DB: + "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Work\cvs_root\log4net-1.2\access.mdb;User Id=;Password=;" + + + + + The appSettings key from App.Config that contains the connection string. + + + + + The connectionStrings key from App.Config that contains the connection string. + + + + + Gets or sets the type name of the connection + that should be created. + + + The type name of the connection. + + + + The type name of the ADO.NET provider to use. + + + The default is to use the OLE DB provider. + + + Use the OLE DB Provider. This is the default value. + System.Data.OleDb.OleDbConnection, System.Data, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + Use the MS SQL Server Provider. + System.Data.SqlClient.SqlConnection, System.Data, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + Use the ODBC Provider. + Microsoft.Data.Odbc.OdbcConnection,Microsoft.Data.Odbc,version=1.0.3300.0,publicKeyToken=b77a5c561934e089,culture=neutral + This is an optional package that you can download from + http://msdn.microsoft.com/downloads + search for ODBC .NET Data Provider. + + Use the Oracle Provider. + System.Data.OracleClient.OracleConnection, System.Data.OracleClient, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + This is an optional package that you can download from + http://msdn.microsoft.com/downloads + search for .NET Managed Provider for Oracle. + + + + + Gets or sets the command text that is used to insert logging events + into the database. + + + The command text used to insert logging events into the database. + + + + Either the text of the prepared statement or the + name of the stored procedure to execute to write into + the database. + + + The property determines if + this text is a prepared statement or a stored procedure. + + + If this property is not set, the command text is retrieved by invoking + . + + + + + + Gets or sets the command type to execute. + + + The command type to execute. + + + + This value may be either (System.Data.CommandType.Text) to specify + that the is a prepared statement to execute, + or (System.Data.CommandType.StoredProcedure) to specify that the + property is the name of a stored procedure + to execute. + + + The default value is (System.Data.CommandType.Text). + + + + + + Should transactions be used to insert logging events in the database. + + + true if transactions should be used to insert logging events in + the database, otherwise false. The default value is true. + + + + Gets or sets a value that indicates whether transactions should be used + to insert logging events in the database. + + + When set a single transaction will be used to insert the buffered events + into the database. Otherwise each event will be inserted without using + an explicit transaction. + + + + + + Gets or sets the used to call the NetSend method. + + + The used to call the NetSend method. + + + + Unless a specified here for this appender + the is queried for the + security context to use. The default behavior is to use the security context + of the current thread. + + + + + + Should this appender try to reconnect to the database on error. + + + true if the appender should try to reconnect to the database after an + error has occurred, otherwise false. The default value is false, + i.e. not to try to reconnect. + + + + The default behaviour is for the appender not to try to reconnect to the + database if an error occurs. Subsequent logging events are discarded. + + + To force the appender to attempt to reconnect to the database set this + property to true. + + + When the appender attempts to connect to the database there may be a + delay of up to the connection timeout specified in the connection string. + This delay will block the calling application's thread. + Until the connection can be reestablished this potential delay may occur multiple times. + + + + + + Gets or sets the underlying . + + + The underlying . + + + creates a to insert + logging events into a database. Classes deriving from + can use this property to get or set this . Use the + underlying returned from if + you require access beyond that which provides. + + + + + Initialize the appender based on the options set + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Override the parent method to close the database + + + + Closes the database command and database connection. + + + + + + Inserts the events into the database. + + The events to insert into the database. + + + Insert all the events specified in the + array into the database. + + + + + + Adds a parameter to the command. + + The parameter to add to the command. + + + Adds a parameter to the ordered list of command parameters. + + + + + + Writes the events to the database using the transaction specified. + + The transaction that the events will be executed under. + The array of events to insert into the database. + + + The transaction argument can be null if the appender has been + configured not to use transactions. See + property for more information. + + + + + + Prepare entire database command object to be executed. + + The command to prepare. + + + + Formats the log message into database statement text. + + The event being logged. + + This method can be overridden by subclasses to provide + more control over the format of the database statement. + + + Text that can be passed to a . + + + + + Creates an instance used to connect to the database. + + + This method is called whenever a new IDbConnection is needed (i.e. when a reconnect is necessary). + + The of the object. + The connectionString output from the ResolveConnectionString method. + An instance with a valid connection string. + + + + Resolves the connection string from the ConnectionString, ConnectionStringName, or AppSettingsKey + property. + + Additional information describing the connection string. + A connection string used to connect to the database. + + + + Retrieves the class type of the ADO.NET provider. + + + + Gets the Type of the ADO.NET provider to use to connect to the + database. This method resolves the type specified in the + property. + + + Subclasses can override this method to return a different type + if necessary. + + + The of the ADO.NET provider + + + + Connects to the database. + + + + + Cleanup the existing connection. + + + Calls the IDbConnection's method. + + + + + The list of objects. + + + + The list of objects. + + + + + + The fully qualified type of the AdoNetAppender class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Parameter type used by the . + + + + This class provides the basic database parameter properties + as defined by the interface. + + This type can be subclassed to provide database specific + functionality. The two methods that are called externally are + and . + + + + + + Initializes a new instance of the class. + + + Default constructor for the AdoNetAppenderParameter class. + + + + + Gets or sets the name of this parameter. + + + The name of this parameter. + + + + The name of this parameter. The parameter name + must match up to a named parameter to the SQL stored procedure + or prepared statement. + + + + + + Gets or sets the database type for this parameter. + + + The database type for this parameter. + + + + The database type for this parameter. This property should + be set to the database type from the + enumeration. See . + + + This property is optional. If not specified the ADO.NET provider + will attempt to infer the type from the value. + + + + + + + Gets or sets the precision for this parameter. + + + The precision for this parameter. + + + + The maximum number of digits used to represent the Value. + + + This property is optional. If not specified the ADO.NET provider + will attempt to infer the precision from the value. + + + + + + + Gets or sets the scale for this parameter. + + + The scale for this parameter. + + + + The number of decimal places to which Value is resolved. + + + This property is optional. If not specified the ADO.NET provider + will attempt to infer the scale from the value. + + + + + + + Gets or sets the size for this parameter. + + + The size for this parameter. + + + + The maximum size, in bytes, of the data within the column. + + + This property is optional. If not specified the ADO.NET provider + will attempt to infer the size from the value. + + + For BLOB data types like VARCHAR(max) it may be impossible to infer the value automatically, use -1 as the size in this case. + + + + + + + Gets or sets the to use to + render the logging event into an object for this + parameter. + + + The used to render the + logging event into an object for this parameter. + + + + The that renders the value for this + parameter. + + + The can be used to adapt + any into a + for use in the property. + + + + + + Prepare the specified database command object. + + The command to prepare. + + + Prepares the database command object by adding + this parameter to its collection of parameters. + + + + + + Renders the logging event and set the parameter value in the command. + + The command containing the parameter. + The event to be rendered. + + + Renders the logging event using this parameters layout + object. Sets the value of the parameter on the command object. + + + + + + The database type for this parameter. + + + + + Flag to infer type rather than use the DbType + + + + + Appends logging events to the terminal using ANSI color escape sequences. + + + + AnsiColorTerminalAppender appends log events to the standard output stream + or the error output stream using a layout specified by the + user. It also allows the color of a specific level of message to be set. + + + This appender expects the terminal to understand the VT100 control set + in order to interpret the color codes. If the terminal or console does not + understand the control codes the behavior is not defined. + + + By default, all output is written to the console's standard output stream. + The property can be set to direct the output to the + error stream. + + + NOTE: This appender writes each message to the System.Console.Out or + System.Console.Error that is set at the time the event is appended. + Therefore it is possible to programmatically redirect the output of this appender + (for example NUnit does this to capture program output). While this is the desired + behavior of this appender it may have security implications in your application. + + + When configuring the ANSI colored terminal appender, a mapping should be + specified to map a logging level to a color. For example: + + + + + + + + + + + + + + + The Level is the standard log4net logging level and ForeColor and BackColor can be any + of the following values: + + Blue + Green + Red + White + Yellow + Purple + Cyan + + These color values cannot be combined to make new colors. + + + The attributes can be any combination of the following: + + Brightforeground is brighter + Dimforeground is dimmer + Underscoremessage is underlined + Blinkforeground is blinking (does not work on all terminals) + Reverseforeground and background are reversed + Hiddenoutput is hidden + Strikethroughmessage has a line through it + + While any of these attributes may be combined not all combinations + work well together, for example setting both Bright and Dim attributes makes + no sense. + + + Patrick Wagstrom + Nicko Cadell + + + + The enum of possible display attributes that can be combined to form the ANSI color attributes. + + + + + + text is bright + + + + + text is dim + + + + + text is underlined + + + + + text is blinking + + + Not all terminals support this attribute + + + + + text and background colors are reversed + + + + + text is hidden + + + + + text is displayed with a strikethrough + + + + + text color is light + + + + + The enum of possible foreground or background color values for + use with the color mapping method + + + + + + color is black + + + + + color is red + + + + + color is green + + + + + color is yellow + + + + + color is blue + + + + + color is magenta + + + + + color is cyan + + + + + color is white + + + + + Initializes a new instance of the class. + + + The instance of the class is set up to write + to the standard output stream. + + + + + Gets the console output stream, one of "Console.Out" or "Console.Error". + + + + + Adds a mapping of level to foreground and background colors. + + The mapping to add + + + + Writes the event to the console. + + The event to log. + + + This method is called by the method. + + + The format of the output will depend on the appender layout. + + + + + + This appender requires a to be set. + + + + + Initializes the level to color mappings set on this appender. + + + + + The to use when writing to the Console + standard output stream. + + + + + The to use when writing to the Console + standard error output stream. + + + + + Flag to write output to the error stream rather than the standard output stream + + + + + Mapping from level object to color value + + + + + Ansi code to reset terminal + + + + + A class to act as a mapping between the level that a logging call is made at and + the color it should be displayed as. + + + + Defines the mapping between a level and the color it should be displayed in. + + + + + + The mapped foreground color for the specified level + + + + Required property. + The mapped foreground color for the specified level + + + + + + The mapped background color for the specified level. Required property. + + + + + The color attributes for the specified level. + + + + + Initializes the options for the object + + + + Combines the and together + and appends the attributes. + + + + + + The combined , and + suitable for setting the ansi terminal color. + + + + + A strongly-typed collection of objects. + + Nicko Cadell + + + + Supports type-safe iteration over a . + + + + + Creates a read-only wrapper for a instance. + + list to create a readonly wrapper around + + An wrapper that is read-only. + + + + + An empty readonly static AppenderCollection + + + + + Initializes a new instance of the class + that is empty and has the default initial capacity. + + + + + Initializes a new instance of the class + that has the specified initial capacity. + + + The number of elements that the new is initially capable of storing. + + + + + Initializes a new instance of the class + that contains elements copied from the specified . + + The whose elements are copied to the new collection. + + + + Initializes a new instance of the class + that contains elements copied from the specified array. + + The array whose elements are copied to the new list. + + + + Initializes a new instance of the class + that contains elements copied from the specified collection. + + The collection whose elements are copied to the new list. + + + + Type visible only to our subclasses + Used to access protected constructor + + + + + + A value + + + + + Allow subclasses to avoid our default constructors + + + + + + Gets the number of elements actually contained in the . + + + + + Copies the entire to a one-dimensional + array. + + The one-dimensional array to copy to. + + + + Copies the entire to a one-dimensional + array, starting at the specified index of the target array. + + The one-dimensional array to copy to. + The zero-based index in at which copying begins. + + + + Gets a value indicating whether access to the collection is synchronized (thread-safe). + + false, because the backing type is an array, which is never thread-safe. + + + + Gets an object that can be used to synchronize access to the collection. + + + + + Gets or sets the at the specified index. + + The zero-based index of the element to get or set. + + is less than zero + -or- + is equal to or greater than . + + + + + Adds a to the end of the . + + The to be added to the end of the . + The new + + + + Removes all elements from the . + + + + + Creates a shallow copy of the . + + A new with a shallow copy of the collection data. + + + + Determines whether a given is in the . + + The to check for. + if is found in the ; otherwise, . + + + + Returns the zero-based index of the first occurrence of a + in the . + + The to locate in the . + + The zero-based index of the first occurrence of + in the entire , if found; otherwise, -1. + + + + + Inserts an element into the at the specified index. + + The zero-based index at which should be inserted. + The to insert. + + is less than zero + -or- + is equal to or greater than . + + + + + Removes the first occurrence of a specific from the . + + The to remove from the . + True if the item was removed. + + The specified was not found in the . + + + + + Removes the element at the specified index of the . + + The zero-based index of the element to remove. + + is less than zero + -or- + is equal to or greater than . + + + + + Gets a value indicating whether the collection has a fixed size. + + true if the collection has a fixed size; otherwise, false. The default is false + + + + Gets a value indicating whether the IList is read-only. + + true if the collection is read-only; otherwise, false. The default is false + + + + Returns an enumerator that can iterate through the . + + An for the entire . + + + + Gets or sets the number of elements the can contain. + + + + + Adds the elements of another to the current . + + The whose elements should be added to the end of the current . + The new of the . + + + + Adds the elements of a array to the current . + + The array whose elements should be added to the end of the . + The new of the . + + + + Adds the elements of a collection to the current . + + The collection whose elements should be added to the end of the . + The new of the . + + + + Sets the capacity to the actual number of elements. + + + + + Return the collection elements as an array + + the array + + + + is less than zero + -or- + is equal to or greater than . + + + + + Supports simple iteration over a . + + + + + + Initializes a new instance of the class. + + + + + Gets the current element in the collection. + + + + + Advances the enumerator to the next element in the collection. + + + if the enumerator was successfully advanced to the next element; + if the enumerator has passed the end of the collection. + + + The collection was modified after the enumerator was created. + + + + + Sets the enumerator to its initial position, before the first element in the collection. + + + + + + + + Abstract base class implementation of . + + + + This class provides the code for common functionality, such + as support for threshold filtering and support for general filters. + + + Appenders can also implement the interface. Therefore + they would require that the method + be called after the appenders properties have been configured. + + + Nicko Cadell + Gert Driesen + + + + Default constructor + + + Empty default constructor + + + + + Finalizes this appender by calling the implementation's + method. + + + + If this appender has not been closed then the Finalize method + will call . + + + + + + Gets or sets the threshold of this appender. + Defaults to . + + + The threshold of the appender. + + + + All log events with lower level than the threshold level are ignored + by the appender. + + + In configuration files this option is specified by setting the + value of the option to a level + string, such as "DEBUG", "INFO" and so on. + + + + + + Gets or sets the for this appender. + + The of the appender + + + The provides a default + implementation for the property. + + + + + + The filter chain. + + The head of the filter chain. + + + Returns the head Filter. The Filters are organized in a linked list + and so all Filters on this Appender are available through the result. + + + + + + Gets or sets the for this appender. + + The layout of the appender. + + + See for more information. + + + + + + + Initialize the appender based on the options set + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Gets or sets the name that uniquely identifies this appender. + + + + + Closes the appender and releases resources. + + + + Release any resources allocated within the appender such as file handles, + network connections, etc. + + + It is a programming error to append to a closed appender. + + + This method cannot be overridden by subclasses. This method + delegates the closing of the appender to the + method which must be overridden in the subclass. + + + + + + Performs threshold checks and invokes filters before + delegating actual logging to the subclasses specific + method. + + The event to log. + + + This method cannot be overridden by derived classes. A + derived class should override the method + which is called by this method. + + + The implementation of this method is as follows: + + + + + + Checks that the severity of the + is greater than or equal to the of this + appender. + + + + Checks that the chain accepts the + . + + + + + Calls and checks that + it returns true. + + + + + If all of the above steps succeed then the + will be passed to the abstract method. + + + + + + Performs threshold checks and invokes filters before + delegating actual logging to the subclasses specific + method. + + The array of events to log. + + + This method cannot be overridden by derived classes. A + derived class should override the method + which is called by this method. + + + The implementation of this method is as follows: + + + + + + Checks that the severity of the + is greater than or equal to the of this + appender. + + + + Checks that the chain accepts the + . + + + + + Calls and checks that + it returns true. + + + + + If all of the above steps succeed then the + will be passed to the method. + + + + + + Test if the logging event should we output by this appender + + the event to test + true if the event should be output, false if the event should be ignored + + + This method checks the logging event against the threshold level set + on this appender and also against the filters specified on this + appender. + + + The implementation of this method is as follows: + + + + + + Checks that the severity of the + is greater than or equal to the of this + appender. + + + + Checks that the chain accepts the + . + + + + + + + + + Adds a filter to the end of the filter chain. + + the filter to add to this appender + + + The Filters are organized in a linked list. + + + Setting this property causes the new filter to be pushed onto the + back of the filter chain. + + + + + + Clears the filter list for this appender. + + + + Clears the filter list for this appender. + + + + + + Checks if the message level is below this appender's threshold. + + to test against. + + true if the meets the + requirements of this appender. A null level always maps to true, + the equivalent of . + + + + + Is called when the appender is closed. Derived classes should override + this method if resources need to be released. + + + + Releases any resources allocated within the appender such as file handles, + network connections, etc. + + + It is a programming error to append to a closed appender. + + + + + + Subclasses of should implement this method + to perform actual logging. + + The event to append. + + + A subclass must implement this method to perform + logging of the . + + This method will be called by + if all the conditions listed for that method are met. + + + To restrict the logging of events in the appender + override the method. + + + + + + Append a bulk array of logging events. + + the array of logging events + + + This base class implementation calls the + method for each element in the bulk array. + + + A subclass that can better process a bulk array of events should + override this method in addition to . + + + + + + Appends logging events. + + The logging events + + + This base class implementation calls the + method for each element in the bulk array. + + + A subclass that can better process a bulk array of events should + override this method in addition to . + + + + + + Called before as a precondition. + + + + This method is called by + before the call to the abstract method. + + + This method can be overridden in a subclass to extend the checks + made before the event is passed to the method. + + + A subclass should ensure that they delegate this call to + this base class if it is overridden. + + + true if the call to should proceed. + + + + Renders the to a string. + + The event to render. + The event rendered as a string. + + + Helper method to render a to + a string. This appender must have a + set to render the to + a string. + + If there is exception data in the logging event and + the layout does not process the exception, this method + will append the exception text to the rendered string. + + + Where possible use the alternative version of this method + . + That method streams the rendering onto an existing Writer + which can give better performance if the caller already has + a open and ready for writing. + + + + + + Renders the to a string. + + The event to render. + The TextWriter to write the formatted event to + + + Helper method to render a to + a string. This appender must have a + set to render the to + a string. + + If there is exception data in the logging event and + the layout does not process the exception, this method + will append the exception text to the rendered string. + + + Use this method in preference to + where possible. If, however, the caller needs to render the event + to a string then does + provide an efficient mechanism for doing so. + + + + + + Tests if this appender requires a to be set. + + + + In the rather exceptional case, where the appender + implementation admits a layout but can also work without it, + then the appender should return true. + + + This default implementation always returns false. + + + + true if the appender requires a layout object, otherwise false. + + + + + Flushes any buffered log data. + + + This implementation doesn't flush anything and always returns true + + True if all logging events were flushed successfully, else false. + + + + It is assumed and enforced that errorHandler is never null. + + + + See for more information. + + + + + + The last filter in the filter chain. + + + See for more information. + + + + + Flag indicating if this appender is closed. + + + See for more information. + + + + + The guard prevents an appender from repeatedly calling its own DoAppend method + + + + + Used for locking actions by this appender. + + + + + StringWriter used to render events + + + + + Initial buffer size + + + + + Maximum buffer size before it is recycled + + + + + The fully qualified type of the AppenderSkeleton class. + + + Used by the internal logger to record the Type of the + log message. + + + + + + Appends log events to the ASP.NET system. + + + + + Diagnostic information and tracing messages that you specify are appended to the output + of the page that is sent to the requesting browser. Optionally, you can view this information + from a separate trace viewer (Trace.axd) that displays trace information for every page in a + given application. + + + Trace statements are processed and displayed only when tracing is enabled. You can control + whether tracing is displayed to a page, to the trace viewer, or both. + + + The logging event is passed to the or + method depending on the level of the logging event. + The event's logger name is the default value for the category parameter of the Write/Warn method. + + + Nicko Cadell + Gert Driesen + Ron Grabowski + + + + Write the logging event to the ASP.NET trace HttpContext.Current.Trace. + + the event to log + + + + This appender requires a to be set. + + + + + The category parameter sent to the Trace method. + + + + Defaults to %logger which will use the logger name of the current + as the category parameter. + + + + + + Abstract base class implementation of that + buffers events in a fixed size buffer. + + + + This base class should be used by appenders that need to buffer a + number of events before logging them. + For example the + buffers events and then submits the entire contents of the buffer to + the underlying database in one go. + + + Subclasses should override the + method to deliver the buffered events. + + The BufferingAppenderSkeleton maintains a fixed size cyclic + buffer of events. The size of the buffer is set using + the property. + + A is used to inspect + each event as it arrives in the appender. If the + triggers, then the current buffer is sent immediately + (see ). Otherwise the event + is stored in the buffer. For example, an evaluator can be used to + deliver the events immediately when an ERROR event arrives. + + + The buffering appender can be configured in a mode. + By default the appender is NOT lossy. When the buffer is full all + the buffered events are sent with . + If the property is set to true then the + buffer will not be sent when it is full, and new events arriving + in the appender will overwrite the oldest event in the buffer. + In lossy mode the buffer will only be sent when the + triggers. This can be useful behavior when you need to know about + ERROR events but not about events with a lower level, configure an + evaluator that will trigger when an ERROR event arrives, the whole + buffer will be sent which gives a history of events leading up to + the ERROR event. + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + + Protected default constructor to allow subclassing. + + + + + + Initializes a new instance of the class. + + the events passed through this appender must be + fixed by the time that they arrive in the derived class' SendBuffer method. + + + Protected constructor to allow subclassing. + + + The should be set if the subclass + expects the events delivered to be fixed even if the + is set to zero, i.e. when no buffering occurs. + + + + + + Gets or sets a value that indicates whether the appender is lossy. + + + true if the appender is lossy, otherwise false. The default is false. + + + + This appender uses a buffer to store logging events before + delivering them. A triggering event causes the whole buffer + to be sent to the remote sink. If the buffer overruns before + a triggering event then logging events could be lost. Set + to false to prevent logging events + from being lost. + + If is set to true then an + must be specified. + + + + + Gets or sets the size of the cyclic buffer used to hold the + logging events. + + + The size of the cyclic buffer used to hold the logging events. + + + + The option takes a positive integer + representing the maximum number of logging events to collect in + a cyclic buffer. When the is reached, + oldest events are deleted as new events are added to the + buffer. By default the size of the cyclic buffer is 512 events. + + + If the is set to a value less than + or equal to 1 then no buffering will occur. The logging event + will be delivered synchronously (depending on the + and properties). Otherwise the event will + be buffered. + + + + + + Gets or sets the that causes the + buffer to be sent immediately. + + + The that causes the buffer to be + sent immediately. + + + + The evaluator will be called for each event that is appended to this + appender. If the evaluator triggers then the current buffer will + immediately be sent (see ). + + If is set to true then an + must be specified. + + + + + Gets or sets the value of the to use. + + + The value of the to use. + + + + The evaluator will be called for each event that is discarded from this + appender. If the evaluator triggers then the current buffer will immediately + be sent (see ). + + + + + + Gets or sets the fields that will be fixed in the event. + + + The event fields that will be fixed before the event is buffered + + + + The logging event needs to have certain thread specific values + captured before it can be buffered. See + for details. + + + + + + + Flushes any buffered log data. + + The maximum time to wait for logging events to be flushed. + True if all logging events were flushed successfully, else false. + + + + Flush the currently buffered events + + + + Flushes any events that have been buffered. + + + If the appender is buffering in mode then the contents + of the buffer will NOT be flushed to the appender. + + + + + + Flush the currently buffered events + + set to true to flush the buffer of lossy events + + + Flushes events that have been buffered. If is + false then events will only be flushed if this buffer is non-lossy mode. + + + If the appender is buffering in mode then the contents + of the buffer will only be flushed if is true. + In this case the contents of the buffer will be tested against the + and if triggering will be output. All other buffered + events will be discarded. + + + If is true then the buffer will always + be emptied by calling this method. + + + + + + Initialize the appender based on the options set + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Close this appender instance. + + + + Close this appender instance. If this appender is marked + as not then the remaining events in + the buffer must be sent when the appender is closed. + + + + + + This method is called by the method. + + the event to log + + + Stores the in the cyclic buffer. + + + The buffer will be sent (i.e. passed to the + method) if one of the following conditions is met: + + + + The cyclic buffer is full and this appender is + marked as not lossy (see ) + + + An is set and + it is triggered for the + specified. + + + + Before the event is stored in the buffer it is fixed + (see ) to ensure that + any data referenced by the event will be valid when the buffer + is processed. + + + + + + Sends the contents of the buffer. + + The first logging event. + The buffer containing the events that need to be sent. + + + The subclass must override . + + + + + + Sends the events. + + The events that need to be sent. + + + The subclass must override this method to process the buffered events. + + + + + + The default buffer size. + + + The default size of the cyclic buffer used to store events. + This is set to 512 by default. + + + + + The cyclic buffer used to store the logging events. + + + + + The events delivered to the subclass must be fixed. + + + + + Buffers events and then forwards them to attached appenders. + + + + The events are buffered in this appender until conditions are + met to allow the appender to deliver the events to the attached + appenders. See for the + conditions that cause the buffer to be sent. + + The forwarding appender can be used to specify different + thresholds and filters for the same appender at different locations + within the hierarchy. + + + Nicko Cadell + Gert Driesen + + + + Closes the appender and releases resources. + + + + Releases any resources allocated within the appender such as file handles, + network connections, etc. + + + It is a programming error to append to a closed appender. + + + + + + Send the events. + + The events that need to be sent. + + + Forwards the events to the attached appenders. + + + + + + Adds an to the list of appenders of this + instance. + + The to add to this appender. + + + If the specified is already in the list of + appenders, then it won't be added again. + + + + + + Gets the appenders contained in this appender as an + . + + + If no appenders can be found, then an + is returned. + + + A collection of the appenders in this appender. + + + + + Looks for the appender with the specified name. + + The name of the appender to lookup. + + The appender with the specified name, or null. + + + + + Removes all previously added appenders from this appender. + + + + This is useful when re-reading configuration information. + + + + + + Removes the specified appender from the list of appenders. + + The appender to remove. + The appender removed from the list + + The appender removed is not closed. + If you are discarding the appender you must call + on the appender removed. + + + + + Removes the appender with the specified name from the list of appenders. + + The name of the appender to remove. + The appender removed from the list + + The appender removed is not closed. + If you are discarding the appender you must call + on the appender removed. + + + + + Implementation of the interface + + + + + Appends logging events to the console. + + + + ColoredConsoleAppender appends log events to the standard output stream + or the error output stream using a layout specified by the + user. It also allows the color of a specific type of message to be set. + + + By default, all output is written to the console's standard output stream. + The property can be set to direct the output to the + error stream. + + + NOTE: This appender writes directly to the application's attached console + not to the System.Console.Out or System.Console.Error TextWriter. + The System.Console.Out and System.Console.Error streams can be + programmatically redirected (for example NUnit does this to capture program output). + This appender will ignore these redirections because it needs to use Win32 + API calls to colorize the output. To respect these redirections the + must be used. + + + When configuring the colored console appender, mapping should be + specified to map a logging level to a color. For example: + + + + + + + + + + + + + + The Level is the standard log4net logging level and ForeColor and BackColor can be any + combination of the following values: + + Blue + Green + Red + White + Yellow + Purple + Cyan + HighIntensity + + + + Rick Hobbs + Nicko Cadell + + + + The enum of possible color values for use with the color mapping method + + + + The following flags can be combined to form the colors. + + + + + + + color is blue + + + + + color is green + + + + + color is red + + + + + color is white + + + + + color is yellow + + + + + color is purple + + + + + color is cyan + + + + + color is intensified + + + + + Initializes a new instance of the class. + + + The instance of the class is set up to write + to the standard output stream. + + + + + Target is the value of the console output stream. + This is either "Console.Out" or "Console.Error". + + + Target is the value of the console output stream. + This is either "Console.Out" or "Console.Error". + + + + Target is the value of the console output stream. + This is either "Console.Out" or "Console.Error". + + + + + + Add a mapping of level to color - done by the config file + + The mapping to add + + + Add a mapping to this appender. + Each mapping defines the foreground and background colors + for a level. + + + + + + This method is called by the method. + + The event to log. + + + Writes the event to the console. + + + The format of the output will depend on the appender's layout. + + + + + + This appender requires a to be set. + + + + + Initializes the options for this appender. + + + + + The to use when writing to the Console + standard output stream. + + + + + The to use when writing to the Console + standard error output stream. + + + + + Flag to write output to the error stream rather than the standard output stream + + + + + Mapping from level object to color value + + + + + The console output stream writer to write to + + + + This writer is not thread safe. + + + + + + A class to act as a mapping between the level that a logging call is made at and + the color it should be displayed as. + + + + Defines the mapping between a level and the color it should be displayed in. + + + + + + The mapped foreground color for the specified level + + + + + The mapped background color for the specified level + + + + + Initialize the options for the object + + + + Combine the and together. + + + + + + The combined and suitable for + setting the console color. + + + + + Appends logging events to the console. + + + + ConsoleAppender appends log events to the standard output stream + or the error output stream using a layout specified by the + user. + + + By default, all output is written to the console's standard output stream. + The property can be set to direct the output to the + error stream. + + + NOTE: This appender writes each message to the System.Console.Out or + System.Console.Error that is set at the time the event is appended. + Therefore it is possible to programmatically redirect the output of this appender + (for example NUnit does this to capture program output). While this is the desired + behavior of this appender it may have security implications in your application. + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + The instance of the class is set up to write + to the standard output stream. + + + + + Target is the value of the console output stream. + This is either "Console.Out" or "Console.Error". + + + Target is the value of the console output stream. + This is either "Console.Out" or "Console.Error". + + + + Target is the value of the console output stream. + This is either "Console.Out" or "Console.Error". + + + + + + This method is called by the method. + + The event to log. + + + Writes the event to the console. + + + The format of the output will depend on the appender's layout. + + + + + + This appender requires a to be set. + + + + + The to use when writing to the Console standard output stream. + + + + + The to use when writing to the Console standard error output stream. + + + + + Appends log events to the system. + + + + The application configuration file can be used to control what listeners + are actually used. See the MSDN documentation for the + class for details on configuring the + debug system. + + + Events are written using the + method. The event's logger name is passed as the value for the category name to the Write method. + + + Nicko Cadell + + + + Gets or sets a value that indicates whether the appender will + flush at the end of each write. + + + The default behavior is to flush at the end of each + write. If the option is set tofalse, then the underlying + stream can defer writing to physical medium to a later time. + + + Avoiding the flush operation at the end of each append results + in a performance gain of 10 to 20 percent. However, there is safety + trade-off involved in skipping flushing. Indeed, when flushing is + skipped, then it is likely that the last few log events will not + be recorded on disk when the application exits. This is a high + price to pay even for a 20% performance gain. + + + + + + Formats the category parameter sent to the Debug method. + + + + Defaults to a with %logger as the pattern which will use the logger name of the current + as the category parameter. + + + + + + Flushes any buffered log data. + + The maximum time to wait for logging events to be flushed. + True if all logging events were flushed successfully, else false. + + + + Writes the logging event to the system. + + The event to log. + + + Writes the logging event to the system. + If is true then the + is called. + + + + + + This appender requires a to be set. + + + + + Writes events to the system event log. + + + + The appender will fail if you try to write using an event source that doesn't exist unless it is running with local administrator privileges. + See also http://logging.apache.org/log4net/release/faq.html#trouble-EventLog + + + The EventID of the event log entry can be + set using the EventID property () + on the . + + + The Category of the event log entry can be + set using the Category property () + on the . + + + There is a limit of 32K characters for an event log message + + + When configuring the EventLogAppender a mapping can be + specified to map a logging level to an event log entry type. For example: + + + <mapping> + <level value="ERROR" /> + <eventLogEntryType value="Error" /> + </mapping> + <mapping> + <level value="DEBUG" /> + <eventLogEntryType value="Information" /> + </mapping> + + + The Level is the standard log4net logging level and eventLogEntryType can be any value + from the enum, i.e.: + + Erroran error event + Warninga warning event + Informationan informational event + + + + Aspi Havewala + Douglas de la Torre + Nicko Cadell + Gert Driesen + Thomas Voss + + + + Initializes a new instance of the class. + + + + Default constructor. + + + + + + The name of the log where messages will be stored. + + + The string name of the log where messages will be stored. + + + This is the name of the log as it appears in the Event Viewer + tree. The default value is to log into the Application + log, this is where most applications write their events. However + if you need a separate log for your application (or applications) + then you should set the appropriately. + This should not be used to distinguish your event log messages + from those of other applications, the + property should be used to distinguish events. This property should be + used to group together events into a single log. + + + + + + Property used to set the Application name. This appears in the + event logs when logging. + + + The string used to distinguish events from different sources. + + + Sets the event log source property. + + + + + This property is used to return the name of the computer to use + when accessing the event logs. Currently, this is the current + computer, denoted by a dot "." + + + The string name of the machine holding the event log that + will be logged into. + + + This property cannot be changed. It is currently set to '.' + i.e. the local machine. This may be changed in future. + + + + + Add a mapping of level to - done by the config file + + The mapping to add + + + Add a mapping to this appender. + Each mapping defines the event log entry type for a level. + + + + + + Gets or sets the used to write to the EventLog. + + + The used to write to the EventLog. + + + + The system security context used to write to the EventLog. + + + Unless a specified here for this appender + the is queried for the + security context to use. The default behavior is to use the security context + of the current thread. + + + + + + Gets or sets the EventId to use unless one is explicitly specified via the LoggingEvent's properties. + + + + The EventID of the event log entry will normally be + set using the EventID property () + on the . + This property provides the fallback value which defaults to 0. + + + + + + Gets or sets the Category to use unless one is explicitly specified via the LoggingEvent's properties. + + + + The Category of the event log entry will normally be + set using the Category property () + on the . + This property provides the fallback value which defaults to 0. + + + + + + Initialize the appender based on the options set + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Create an event log source + + + + + This method is called by the + method. + + the event to log + + Writes the event to the system event log using the + . + + If the event has an EventID property (see ) + set then this integer will be used as the event log event id. + + + There is a limit of 32K characters for an event log message + + + + + + This appender requires a to be set. + + true + + + + Get the equivalent for a + + the Level to convert to an EventLogEntryType + The equivalent for a + + Because there are fewer applicable + values to use in logging levels than there are in the + this is a one way mapping. There is + a loss of information during the conversion. + + + + + Mapping from level object to EventLogEntryType + + + + + A class to act as a mapping between the level that a logging call is made at and + the color it should be displayed as. + + + + Defines the mapping between a level and its event log entry type. + + + + + + The for this entry + + + + + The fully qualified type of the EventLogAppender class. + + + Used by the internal logger to record the Type of the + log message. + + + + + The maximum size supported by default. + + + http://msdn.microsoft.com/en-us/library/xzwc042w(v=vs.100).aspx + The 32766 documented max size is two bytes shy of 32K (I'm assuming 32766 + may leave space for a two byte null terminator of #0#0). The 32766 max + length is what the .NET 4.0 source code checks for, but this is WRONG! + Strings with a length > 31839 on Windows Vista or higher can CORRUPT + the event log! See: System.Diagnostics.EventLogInternal.InternalWriteEvent() + for the use of the 32766 max size. + + + + + The maximum size supported by a windows operating system that is vista + or newer. + + + See ReportEvent API: + http://msdn.microsoft.com/en-us/library/aa363679(VS.85).aspx + ReportEvent's lpStrings parameter: + "A pointer to a buffer containing an array of + null-terminated strings that are merged into the message before Event Viewer + displays the string to the user. This parameter must be a valid pointer + (or NULL), even if wNumStrings is zero. Each string is limited to 31,839 characters." + + Going beyond the size of 31839 will (at some point) corrupt the event log on Windows + Vista or higher! It may succeed for a while...but you will eventually run into the + error: "System.ComponentModel.Win32Exception : A device attached to the system is + not functioning", and the event log will then be corrupt (I was able to corrupt + an event log using a length of 31877 on Windows 7). + + The max size for Windows Vista or higher is documented here: + http://msdn.microsoft.com/en-us/library/xzwc042w(v=vs.100).aspx. + Going over this size may succeed a few times but the buffer will overrun and + eventually corrupt the log (based on testing). + + The maxEventMsgSize size is based on the max buffer size of the lpStrings parameter of the ReportEvent API. + The documented max size for EventLog.WriteEntry for Windows Vista and higher is 31839, but I'm leaving room for a + terminator of #0#0, as we cannot see the source of ReportEvent (though we could use an API monitor to examine the + buffer, given enough time). + + + + + The maximum size that the operating system supports for + a event log message. + + + Used to determine the maximum string length that can be written + to the operating system event log and eventually truncate a string + that exceeds the limits. + + + + + This method determines the maximum event log message size allowed for + the current environment. + + + + + + Appends logging events to a file. + + + + Logging events are sent to the file specified by the property. + + + The file can be opened in either append or overwrite mode + by specifying the property. + If the file path is relative it is taken as relative from + the application base directory. The file encoding can be + specified by setting the property. + + + The layout's and + values will be written each time the file is opened and closed + respectively. If the property is + then the file may contain multiple copies of the header and footer. + + + This appender will first try to open the file for writing when + is called. This will typically be during configuration. + If the file cannot be opened for writing the appender will attempt + to open the file again each time a message is logged to the appender. + If the file cannot be opened for writing when a message is logged then + the message will be discarded by this appender. + + + The supports pluggable file locking models via + the property. + The default behavior, implemented by + is to obtain an exclusive write lock on the file until this appender is closed. + The alternative models only hold a + write lock while the appender is writing a logging event () + or synchronize by using a named system-wide Mutex (). + + + All locking strategies have issues and you should seriously consider using a different strategy that + avoids having multiple processes logging to the same file. + + + Nicko Cadell + Gert Driesen + Rodrigo B. de Oliveira + Douglas de la Torre + Niall Daley + + + + Write only that uses the + to manage access to an underlying resource. + + + + + Write only that uses the + to manage access to an underlying resource. + + + + + Locking model base class + + + + Base class for the locking models available to the derived loggers. + + + + + + Open the output file + + The filename to use + Whether to append to the file, or overwrite + The encoding to use + + + Open the file specified and prepare for logging. + No writes will be made until is called. + Must be called before any calls to , + and . + + + + + + Close the file + + + + Close the file. No further writes will be made. + + + + + + Initializes all resources used by this locking model. + + + + + Disposes all resources that were initialized by this locking model. + + + + + Acquire the lock on the file + + A stream that is ready to be written to, or null if there is no active stream because uninitialized or error. + + + Acquire the lock on the file in preparation for writing to it. + Returns a stream pointing to the file. + must be called to release the lock on the output file when the return + value is not null. + + + + + + Releases the lock on the file + + + + No further writes will be made to the stream until is called again. + + + + + + Gets or sets the for this LockingModel + + + The for this LockingModel + + + + The file appender this locking model is attached to and working on + behalf of. + + + The file appender is used to locate the security context and the error handler to use. + + + The value of this property will be set before is + called. + + + + + + Helper method that creates a FileStream under CurrentAppender's SecurityContext. + + + + Typically called during OpenFile or AcquireLock. + + + If the directory portion of the does not exist, it is created + via Directory.CreateDirectory. + + + + + + + + + + Helper method to close under CurrentAppender's SecurityContext. + + + Does not set to null. + + + + + + Hold an exclusive lock on the output file + + + + Open the file once for writing and hold it open until is called. + Maintains an exclusive lock on the file during this time. + + + + + + Open the file specified and prepare for logging. + + The filename to use + Whether to append to the file, or overwrite + The encoding to use + + + Open the file specified and prepare for logging. + No writes will be made until is called. + Must be called before any calls to , + and . + + + + + + Close the file + + + + Close the file. No further writes will be made. + + + + + + Acquire the lock on the file + + A stream that is ready to be written to. + + + Does nothing. The lock is already taken + + + + + + Release the lock on the file + + + + Does nothing. The lock will be released when the file is closed. + + + + + + Initializes all resources used by this locking model. + + + + + Disposes all resources that were initialized by this locking model. + + + + + Acquires the file lock for each write + + + + Opens the file once for each / cycle, + thus holding the lock for the minimal amount of time. This method of locking + is considerably slower than but allows + other processes to move/delete the log file whilst logging continues. + + + + + + Prepares to open the file when the first message is logged. + + The filename to use + Whether to append to the file, or overwrite + The encoding to use + + + Open the file specified and prepare for logging. + No writes will be made until is called. + Must be called before any calls to , + and . + + + + + + Close the file + + + + Close the file. No further writes will be made. + + + + + + Acquire the lock on the file + + A stream that is ready to be written to. + + + Acquire the lock on the file in preparation for writing to it. + Return a stream pointing to the file. + must be called to release the lock on the output file. + + + + + + Release the lock on the file + + + + Release the lock on the file. No further writes will be made to the + stream until is called again. + + + + + + Initializes all resources used by this locking model. + + + + + Disposes all resources that were initialized by this locking model. + + + + + Provides cross-process file locking. + + Ron Grabowski + Steve Wranovsky + + + + Open the file specified and prepare for logging. + + The filename to use + Whether to append to the file, or overwrite + The encoding to use + + + Open the file specified and prepare for logging. + No writes will be made until is called. + Must be called before any calls to , + - and . + + + + + + Close the file + + + + Close the file. No further writes will be made. + + + + + + Acquire the lock on the file + + A stream that is ready to be written to. + + + Does nothing. The lock is already taken + + + + + + Releases the lock and allows others to acquire a lock. + + + + + Initializes all resources used by this locking model. + + + + + Disposes all resources that were initialized by this locking model. + + + + + Hold no lock on the output file + + + + Open the file once and hold it open until is called. + Maintains no lock on the file during this time. + + + + + + Open the file specified and prepare for logging. + + The filename to use + Whether to append to the file, or overwrite + The encoding to use + + + Open the file specified and prepare for logging. + No writes will be made until is called. + Must be called before any calls to , + and . + + + + + + Close the file + + + + Close the file. No further writes will be made. + + + + + + Acquire the lock on the file + + A stream that is ready to be written to. + + + Does nothing. The lock is already taken + + + + + + Release the lock on the file + + + + Does nothing. The lock will be released when the file is closed. + + + + + + Initializes all resources used by this locking model. + + + + + Disposes all resources that were initialized by this locking model. + + + + + Default locking model (when no locking model was configured) + + + + + Specify default locking model + + Type of LockingModel + + + + Gets or sets the path to the file that logging will be written to. + + + The path to the file that logging will be written to. + + + + If the path is relative it is taken as relative from + the application base directory. + + + + + + Gets or sets a flag that indicates whether the file should be + appended to or overwritten. + + + Indicates whether the file should be appended to or overwritten. + + + + If the value is set to false then the file will be overwritten, if + it is set to true then the file will be appended to. + + The default value is true. + + + + + Gets or sets used to write to the file. + + + The used to write to the file. + + + + The default encoding set is + which is the encoding for the system's current ANSI code page. + + + + + + Gets or sets the used to write to the file. + + + The used to write to the file. + + + + Unless a specified here for this appender + the is queried for the + security context to use. The default behavior is to use the security context + of the current thread. + + + + + + Gets or sets the used to handle locking of the file. + + + The used to lock the file. + + + + Gets or sets the used to handle locking of the file. + + + There are three built in locking models, , and . + The first locks the file from the start of logging to the end, the + second locks only for the minimal amount of time when logging each message + and the last synchronizes processes using a named system-wide Mutex. + + + The default locking model is the . + + + + + + Activate the options on the file appender. + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + This will cause the file to be opened. + + + + + + Closes any previously opened file and calls the parent's . + + + + Resets the filename and the file stream. + + + + + + Close this appender instance. The underlying stream or writer is also closed. + + + + + Called to initialize the file writer + + + + Will be called for each logged message until the file is + successfully opened. + + + + + + This method is called by the + method. + + The event to log. + + + Writes a log statement to the output stream if the output stream exists + and is writable. + + + The format of the output will depend on the appender's layout. + + + + + + This method is called by the + method. + + The array of events to log. + + + Acquires the output file locks once before writing all the events to + the stream. + + + + + + Writes a footer as produced by the embedded layout's property. + + + + Writes a footer as produced by the embedded layout's property. + + + + + + Writes a header produced by the embedded layout's property. + + + + Writes a header produced by the embedded layout's property. + + + + + + Closes the underlying . + + + + Closes the underlying . + + + + + + Closes the previously opened file. + + + + Writes the to the file and then + closes the file. + + + + + + Sets and opens the file where the log output will go. The specified file must be writable. + + The path to the log file. Must be a fully qualified path. + If true will append to fileName. Otherwise will truncate fileName + + + Calls but guarantees not to throw an exception. + Errors are passed to the . + + + + + + Sets and opens the file where the log output will go. The specified file must be writable. + + The path to the log file. Must be a fully qualified path. + If true will append to fileName. Otherwise will truncate fileName + + + If there was already an opened file, then the previous file + is closed first. + + + This method will ensure that the directory structure + for the specified exists. + + + + + + Sets the quiet writer used for file output + + the file stream that has been opened for writing + + + This implementation of creates a + over the and passes it to the + method. + + + This method can be overridden by subclasses that want to wrap the + in some way, for example to encrypt the output + data using a System.Security.Cryptography.CryptoStream. + + + + + + Sets the quiet writer being used. + + the writer over the file stream that has been opened for writing + + + This method can be overridden by subclasses that want to + wrap the in some way. + + + + + + Convert a path into a fully qualified path. + + The path to convert. + The fully qualified path. + + + Converts the path specified to a fully + qualified path. If the path is relative it is + taken as relative from the application base + directory. + + + + + + The name of the log file. + + + + + The stream to log to. Has added locking semantics + + + + + The fully qualified type of the FileAppender class. + + + Used by the internal logger to record the Type of the + log message. + + + + + This appender forwards logging events to attached appenders. + + + + The forwarding appender can be used to specify different thresholds + and filters for the same appender at different locations within the hierarchy. + + + Nicko Cadell + Gert Driesen + + + + Closes the appender and releases resources. + + + + Releases any resources allocated within the appender such as file handles, + network connections, etc. + + + It is a programming error to append to a closed appender. + + + + + + Forward the logging event to the attached appenders + + The event to log. + + + Delivers the logging event to all the attached appenders. + + + + + + Forward the logging events to the attached appenders + + The array of events to log. + + + Delivers the logging events to all the attached appenders. + + + + + + Adds an to the list of appenders of this + instance. + + The to add to this appender. + + + If the specified is already in the list of + appenders, then it won't be added again. + + + + + + Gets the appenders contained in this appender as an + . + + + If no appenders can be found, then an + is returned. + + + A collection of the appenders in this appender. + + + + + Looks for the appender with the specified name. + + The name of the appender to lookup. + + The appender with the specified name, or null. + + + + Get the named appender attached to this appender. + + + + + + Removes all previously added appenders from this appender. + + + + This is useful when re-reading configuration information. + + + + + + Removes the specified appender from the list of appenders. + + The appender to remove. + The appender removed from the list + + The appender removed is not closed. + If you are discarding the appender you must call + on the appender removed. + + + + + Removes the appender with the specified name from the list of appenders. + + The name of the appender to remove. + The appender removed from the list + + The appender removed is not closed. + If you are discarding the appender you must call + on the appender removed. + + + + + Implementation of the interface + + + + + Implement this interface for your own strategies for printing log statements. + + + + Implementors should consider extending the + class which provides a default implementation of this interface. + + + Appenders can also implement the interface. Therefore + they would require that the method + be called after the appenders properties have been configured. + + + Nicko Cadell + Gert Driesen + + + + Closes the appender and releases resources. + + + + Releases any resources allocated within the appender such as file handles, + network connections, etc. + + + It is a programming error to append to a closed appender. + + + + + + Log the logging event in Appender specific way. + + The event to log + + + This method is called to log a message into this appender. + + + + + + Gets or sets the name of this appender. + + The name of the appender. + + The name uniquely identifies the appender. + + + + + Interface for appenders that support bulk logging. + + + + This interface extends the interface to + support bulk logging of objects. Appenders + should only implement this interface if they can bulk log efficiently. + + + Nicko Cadell + + + + Log the array of logging events in Appender specific way. + + The events to log + + + This method is called to log an array of events into this appender. + + + + + + Interface that can be implemented by Appenders that buffer logging data and expose a method. + + + + + Flushes any buffered log data. + + + Appenders that implement the method must do so in a thread-safe manner: it can be called concurrently with + the method. + + Typically this is done by locking on the Appender instance, e.g.: + + + + + + The parameter is only relevant for appenders that process logging events asynchronously, + such as RemotingAppender. + + + The maximum time to wait for logging events to be flushed. + True if all logging events were flushed successfully, else false. + + + + Logs events to a local syslog service. + + + + This appender uses the POSIX libc library functions openlog, syslog, and closelog. + If these functions are not available on the local system then this appender will not work! + + + The functions openlog, syslog, and closelog are specified in SUSv2 and + POSIX 1003.1-2001 standards. These are used to log messages to the local syslog service. + + + This appender talks to a local syslog service. If you need to log to a remote syslog + daemon and you cannot configure your local syslog service to do this you may be + able to use the to log via UDP. + + + Syslog messages must have a facility and and a severity. The severity + is derived from the Level of the logging event. + The facility must be chosen from the set of defined syslog + values. The facilities list is predefined + and cannot be extended. + + + An identifier is specified with each log message. This can be specified + by setting the property. The identity (also know + as the tag) must not contain white space. The default value for the + identity is the application name (from ). + + + Rob Lyon + Nicko Cadell + + + + syslog severities + + + + The log4net Level maps to a syslog severity using the + method and the + class. The severity is set on . + + + + + + system is unusable + + + + + action must be taken immediately + + + + + critical conditions + + + + + error conditions + + + + + warning conditions + + + + + normal but significant condition + + + + + informational + + + + + debug-level messages + + + + + syslog facilities + + + + The syslog facility defines which subsystem the logging comes from. + This is set on the property. + + + + + + kernel messages + + + + + random user-level messages + + + + + mail system + + + + + system daemons + + + + + security/authorization messages + + + + + messages generated internally by syslogd + + + + + line printer subsystem + + + + + network news subsystem + + + + + UUCP subsystem + + + + + clock (cron/at) daemon + + + + + security/authorization messages (private) + + + + + ftp daemon + + + + + NTP subsystem + + + + + log audit + + + + + log alert + + + + + clock daemon + + + + + reserved for local use + + + + + reserved for local use + + + + + reserved for local use + + + + + reserved for local use + + + + + reserved for local use + + + + + reserved for local use + + + + + reserved for local use + + + + + reserved for local use + + + + + Message identity + + + + An identifier is specified with each log message. This can be specified + by setting the property. The identity (also known + as the tag) must not contain white space. The default value for the + identity is the application name (from ). + + + + + + Syslog facility + + + Set to one of the values. The list of + facilities is predefined and cannot be extended. The default value + is . + + + + + Add a mapping of level to severity + + The mapping to add + + + Adds a to this appender. + + + + + + Initialize the appender based on the options set. + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + This method is called by the method. + + The event to log. + + + Writes the event to a remote syslog daemon. + + + The format of the output will depend on the appender's layout. + + + + + + Close the syslog when the appender is closed + + + + Close the syslog when the appender is closed + + + + + + This appender requires a to be set. + + + + + Translates a log4net level to a syslog severity. + + A log4net level. + A syslog severity. + + + + Generate a syslog priority. + + The syslog facility. + The syslog severity. + A syslog priority. + + + + Marshaled handle to the identity string. We have to hold on to the + string as the openlog and syslog APIs just hold the + pointer to the ident and dereference it for each log message. + + + + + Mapping from level object to syslog severity + + + + + A class to act as a mapping between the level that a logging call is made at and + the syslog severity that is should be logged at. + + + + + The mapped syslog severity for the specified level + + + + + Appends colorful logging events to the console, using .NET built-in capabilities. + + + + ManagedColoredConsoleAppender appends log events to the standard output stream + or the error output stream using a layout specified by the + user. It also allows the color of a specific type of message to be set. + + + By default, all output is written to the console's standard output stream. + The property can be set to direct the output to the + error stream. + + + When configuring the colored console appender, mappings should be + specified to map logging levels to colors. For example: + + + + + + + + + + + + + + + + + + + + + + The Level is the standard log4net logging level while + ForeColor and BackColor are the values of + enumeration. + + + Based on the ColoredConsoleAppender + + + Rick Hobbs + Nicko Cadell + Pavlos Touboulidis + + + + Gets or sets the console output stream. + This is either "Console.Out" or "Console.Error". + + + + + Add a mapping of level to color - done by the config file + + The mapping to add + + + Each mapping defines the foreground and background colors + for a level. + + + + + + Writes the event to the console. + + The event to log. + + + This method is called by the method. + + + The format of the output will depend on the appender's layout. + + + + + + This appender requires a to be set. + + + + + Initializes the options for this appender. + + + + + The to use when writing to the Console + standard output stream. + + + + + The to use when writing to the Console + standard error output stream. + + + + + Flag to write output to the error stream rather than the standard output stream + + + + + Mapping from level object to color value + + + + + A class to act as a mapping between the level that a logging call is made at and + the color it should be displayed as. + + + + + The mapped foreground color for the specified level + + + + + Gets or sets the mapped background color for the specified level + + + + + Stores logging events in an array. + + + + The memory appender stores all the logging events + that are appended in an in-memory array. + + + Use the method to get + and clear the current list of events that have been appended. + + + Use the method to get the current + list of events that have been appended. Note there is a + race-condition when calling and + in pairs, you better use in that case. + + + Use the method to clear the + current list of events. Note there is a + race-condition when calling and + in pairs, you better use in that case. + + + Julian Biddle + Nicko Cadell + Gert Driesen + + + + Gets the events that have been logged. + + The events that have been logged + + + + Gets or sets the fields that will be fixed in the event + + + + The logging event needs to have certain thread specific values + captured before it can be buffered. See + for details. + + + + + + This method is called by the method. + + the event to log + + Stores the in the events list. + + + + + Clear the list of events + + + Clear the list of events + + + + + Gets the events that have been logged and clears the list of events. + + The events that have been logged + + + + The list of events that have been appended. + + + + + Appends log events to the OutputDebugString system. + + Nicko Cadell + Gert Driesen + + + + Writes the logging event to the output debug string API + + the event to log + + + + This appender requires a to be set. + + + + + Logs events to a remote syslog daemon. + + + + The BSD syslog protocol is used to remotely log to + a syslog daemon. The syslogd listens for messages + on UDP port 514. + + + The syslog UDP protocol is not authenticated. Most syslog daemons + do not accept remote log messages because of the security implications. + You may be able to use the LocalSyslogAppender to talk to a local + syslog service. + + + There is an RFC 3164 that claims to document the BSD Syslog Protocol. + This RFC can be seen here: http://www.faqs.org/rfcs/rfc3164.html. + This appender generates what the RFC calls an "Original Device Message", + i.e. does not include the TIMESTAMP or HOSTNAME fields. By observation + this format of message will be accepted by all current syslog daemon + implementations. The daemon will attach the current time and the source + hostname or IP address to any messages received. + + + Syslog messages must have a facility and a severity. The severity + is derived from the Level of the logging event. + The facility must be chosen from the set of defined syslog + values. The facilities list is predefined + and cannot be extended. + + + An identifier is specified with each log message. This can be specified + by setting the property. The identity (also known + as the tag) must not contain white space. The default value for the + identity is the application name (from ). + + + Rob Lyon + Nicko Cadell + + + + Syslog port 514 + + + + + syslog severities + + + + The syslog severities. + + + + + + system is unusable + + + + + action must be taken immediately + + + + + critical conditions + + + + + error conditions + + + + + warning conditions + + + + + normal but significant condition + + + + + informational + + + + + debug-level messages + + + + + syslog facilities + + + + The syslog facilities + + + + + + kernel messages + + + + + random user-level messages + + + + + mail system + + + + + system daemons + + + + + security/authorization messages + + + + + messages generated internally by syslogd + + + + + line printer subsystem + + + + + network news subsystem + + + + + UUCP subsystem + + + + + clock (cron/at) daemon + + + + + security/authorization messages (private) + + + + + ftp daemon + + + + + NTP subsystem + + + + + log audit + + + + + log alert + + + + + clock daemon + + + + + reserved for local use + + + + + reserved for local use + + + + + reserved for local use + + + + + reserved for local use + + + + + reserved for local use + + + + + reserved for local use + + + + + reserved for local use + + + + + reserved for local use + + + + + Initializes a new instance of the class. + + + This instance of the class is set up to write + to a remote syslog daemon. + + + + + Message identity + + + + An identifier is specified with each log message. This can be specified + by setting the property. The identity (also known + as the tag) must not contain white space. The default value for the + identity is the application name (from ). + + + + + + Syslog facility + + + Set to one of the values. The list of + facilities is predefined and cannot be extended. The default value + is . + + + + + Add a mapping of level to severity + + The mapping to add + + + Add a mapping to this appender. + + + + + + Writes the event to a remote syslog daemon. + + The event to log. + + + This method is called by the method. + + + The format of the output will depend on the appender's layout. + + + + + + Appends the rendered message to the buffer + + rendered message + index of the current character in the message + buffer + + + + Initialize the options for this appender + + + + Initialize the level to syslog severity mappings set on this appender. + + + + + + Translates a log4net level to a syslog severity. + + A log4net level. + A syslog severity. + + + + Generate a syslog priority. + + The syslog facility. + The syslog severity. + A syslog priority. + + + Generate a syslog priority. + + + + + + Mapping from level object to syslog severity + + + + + A class to act as a mapping between the level that a logging call is made at and + the syslog severity that it should be logged at. + + + + A class to act as a mapping between the level that a logging call is made at and + the syslog severity that it should be logged at. + + + + + + The mapped syslog severity for the specified level + + + + Required property. + + + + + + Appender that rolls log files based on size or date or both. + + + + RollingFileAppender can roll log files based on size or date or both + depending on the setting of the property. + When set to the log file will be rolled + once its size exceeds the . + When set to the log file will be rolled + once the date boundary specified in the property + is crossed. + When set to the log file will be + rolled once the date boundary specified in the property + is crossed, but within a date boundary the file will also be rolled + once its size exceeds the . + When set to the log file will be rolled when + the appender is configured. This effectively means that the log file can be + rolled once per program execution. + + + A of few additional optional features have been added: + + Attach date pattern for current log file + Backup number increments for newer files + Infinite number of backups by file size + + + + + + For large or infinite numbers of backup files a + greater than zero is highly recommended, otherwise all the backup files need + to be renamed each time a new backup is created. + + + When Date/Time based rolling is used setting + to will reduce the number of file renamings to few or none. + + + + + + Changing or without clearing + the log file directory of backup files will cause unexpected and unwanted side effects. + + + + + If Date/Time based rolling is enabled this appender will attempt to roll existing files + in the directory without a Date/Time tag based on the last write date of the base log file. + The appender only rolls the log file when a message is logged. If Date/Time based rolling + is enabled then the appender will not roll the log file at the Date/Time boundary but + at the point when the next message is logged after the boundary has been crossed. + + + + The extends the and + has the same behavior when opening the log file. + The appender will first try to open the file for writing when + is called. This will typically be during configuration. + If the file cannot be opened for writing the appender will attempt + to open the file again each time a message is logged to the appender. + If the file cannot be opened for writing when a message is logged then + the message will be discarded by this appender. + + + When rolling a backup file necessitates deleting an older backup file the + file to be deleted is moved to a temporary name before being deleted. + + + + + A maximum number of backup files when rolling on date/time boundaries is not supported. + + + + Nicko Cadell + Gert Driesen + Aspi Havewala + Douglas de la Torre + Edward Smit + + + + Style of rolling to use + + + + + Roll files once per program execution + + + + Roll files once per program execution. + Well really once each time this appender is configured. + + + Setting this option also sets AppendToFile to on the + , otherwise this appender would just be a normal file appender. + + + + + + Roll files based only on the size of the file + + + + + Roll files based only on the date + + + + + Roll files based on both the size and date of the file + + + + + The code assumes that the following 'time' constants are in a increasing sequence. + + + + + + + Roll the log not based on the date + + + + + Roll the log for each minute + + + + + Roll the log for each hour + + + + + Roll the log twice a day (midday and midnight) + + + + + Roll the log each day (midnight) + + + + + Roll the log each week + + + + + Roll the log each month + + + + + Initializes a new instance of the class. + + + + + Cleans up all resources used by this appender. + + + + + Gets or sets the strategy for determining the current date and time. The default + implementation is to use LocalDateTime which internally calls through to DateTime.Now. + DateTime.UtcNow may be used on frameworks newer than .NET 1.0 by specifying + . + + + An implementation of the interface which returns the current date and time. + + + + Gets or sets the used to return the current date and time. + + + There are two built strategies for determining the current date and time, + + and . + + + The default strategy is . + + + + + + Gets or sets the date pattern to be used for generating file names + when rolling over on date. + + + The date pattern to be used for generating file names when rolling + over on date. + + + + Takes a string in the same format as expected by + . + May be set to null to disable date formatting. + + + This property determines the rollover schedule when rolling over + on date. + + + + + + Gets or sets the maximum number of backup files that are kept before + the oldest is erased. + + + The maximum number of backup files that are kept before the oldest is + erased. + + + + If set to zero, then there will be no backup files and the log file + will be truncated when it reaches . + + + If a negative number is supplied then no deletions will be made. Note + that this could result in very slow performance as a large number of + files are rolled over unless is used. + + + The maximum applies to each time based group of files and + not the total. + + + + + + Gets or sets the maximum size that the output file is allowed to reach + before being rolled over to backup files. + + + The maximum size in bytes that the output file is allowed to reach before being + rolled over to backup files. + + + + This property is equivalent to except + that it is required for differentiating the setter taking a + argument from the setter taking a + argument. + + + The default maximum file size is 10MB (10*1024*1024). + + + + + + Gets or sets the maximum size that the output file is allowed to reach + before being rolled over to backup files. + + + The maximum size that the output file is allowed to reach before being + rolled over to backup files. + + + + This property allows you to specify the maximum size with the + suffixes "KB", "MB" or "GB" so that the size is interpreted being + expressed respectively in kilobytes, megabytes or gigabytes. + + + For example, the value "10KB" will be interpreted as 10240 bytes. + + + The default maximum file size is 10MB. + + + If you have the option to set the maximum file size programmatically + consider using the property instead as this + allows you to set the size in bytes as a . + + + + + + Gets or sets the rolling file count direction. + + + The rolling file count direction. + + + + Indicates if the current file is the lowest numbered file or the + highest numbered file. + + + By default newer files have lower numbers ( < 0), + i.e. log.1 is most recent, log.5 is the 5th backup, etc... + + + >= 0 does the opposite i.e. + log.1 is the first backup made, log.5 is the 5th backup made, etc. + For infinite backups use >= 0 to reduce + rollover costs. + + The default file count direction is -1. + + + + + Gets or sets the rolling style. + + The rolling style. + + + The default rolling style is . + + + When set to this appender's + property is set to , otherwise + the appender would append to a single file rather than rolling + the file each time it is opened. + + + + + + Gets or sets a value indicating whether to preserve the file name extension when rolling. + + + if the file name extension should be preserved. + + + + By default file.log is rolled to file.log.yyyy-MM-dd or file.log.curSizeRollBackup. + However, under Windows the new file name will lose any program associations as the + extension is changed. Optionally file.log can be renamed to file.yyyy-MM-dd.log or + file.curSizeRollBackup.log to maintain any program associations. + + + + + + Gets or sets a value indicating whether to always log to + the same file. + + + if always should be logged to the same file, otherwise . + + + + By default file.log is always the current file. Optionally + file.log.yyyy-mm-dd for current formatted datePattern can by the currently + logging file (or file.log.curSizeRollBackup or even + file.log.yyyy-mm-dd.curSizeRollBackup). + + + This will make time based rollovers with a large number of backups + much faster as the appender it won't have to rename all the backups! + + + + + + The fully qualified type of the RollingFileAppender class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Sets the quiet writer being used. + + + This method can be overridden by subclasses. + + the writer to set + + + + Write out a logging event. + + the event to write to file. + + + Handles append time behavior for RollingFileAppender. This checks + if a roll over either by date (checked first) or time (checked second) + is need and then appends to the file last. + + + + + + Write out an array of logging events. + + the events to write to file. + + + Handles append time behavior for RollingFileAppender. This checks + if a roll over either by date (checked first) or time (checked second) + is need and then appends to the file last. + + + + + + Performs any required rolling before outputting the next event + + + + Handles append time behavior for RollingFileAppender. This checks + if a roll over either by date (checked first) or time (checked second) + is need and then appends to the file last. + + + + + + Creates and opens the file for logging. If + is false then the fully qualified name is determined and used. + + the name of the file to open + true to append to existing file + + This method will ensure that the directory structure + for the specified exists. + + + + + Get the current output file name + + the base file name + the output file name + + The output file name is based on the base fileName specified. + If is set then the output + file name is the same as the base file passed in. Otherwise + the output file depends on the date pattern, on the count + direction or both. + + + + + Determines curSizeRollBackups (only within the current roll point) + + + + + Generates a wildcard pattern that can be used to find all files + that are similar to the base file name. + + + + + Builds a list of filenames for all files matching the base filename plus a file pattern. + + + + + Initiates a roll over if needed for crossing a date boundary since the last run. + + + + + Initializes based on existing conditions at time of . + + + + Initializes based on existing conditions at time of . + The following is done + + determine curSizeRollBackups (only within the current roll point) + initiates a roll over if needed for crossing a date boundary since the last run. + + + + + + + Does the work of bumping the 'current' file counter higher + to the highest count when an incremental file name is seen. + The highest count is either the first file (when count direction + is greater than 0) or the last file (when count direction less than 0). + In either case, we want to know the highest count that is present. + + + + + + + Attempts to extract a number from the end of the file name that indicates + the number of the times the file has been rolled over. + + + Certain date pattern extensions like yyyyMMdd will be parsed as valid backup indexes. + + + + + Takes a list of files and a base file name, and looks for 'incremented' versions of the base file. + Bumps the max count up to the highest count seen. + + + + + Calculates the RollPoint for the datePattern supplied. + + the date pattern to calculate the check period for + The RollPoint that is most accurate for the date pattern supplied + + Essentially the date pattern is examined to determine what the + most suitable roll point is. The roll point chosen is the roll point + with the smallest period that can be detected using the date pattern + supplied. i.e. if the date pattern only outputs the year, month, day + and hour then the smallest roll point that can be detected would be + and hourly roll point as minutes could not be detected. + + + + + Initialize the appender based on the options set + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + Sets initial conditions including date/time roll over information, first check, + scheduledFilename, and calls to initialize + the current number of backups. + + + + + + CombinePath + + + .1, .2, .3, etc. + + + + + Rollover the file(s) to date/time tagged file(s). + + set to true if the file to be rolled is currently open + + + Rollover the file(s) to date/time tagged file(s). + Resets curSizeRollBackups. + If fileIsOpen is set then the new file is opened (through SafeOpenFile). + + + + + + Renames file to file . + + Name of existing file to roll. + New name for file. + + + Renames file to file . It + also checks for existence of target file and deletes if it does. + + + + + + Test if a file exists at a specified path + + the path to the file + true if the file exists + + + Test if a file exists at a specified path + + + + + + Deletes the specified file if it exists. + + The file to delete. + + + Delete a file if it exists. + The file is first moved to a new filename then deleted. + This allows the file to be removed even when it cannot + be deleted, but it still can be moved. + + + + + + Implements file roll base on file size. + + + + If the maximum number of size based backups is reached + (curSizeRollBackups == maxSizeRollBackups) then the oldest + file is deleted -- its index determined by the sign of countDirection. + If countDirection < 0, then files + {File.1, ..., File.curSizeRollBackups -1} + are renamed to {File.2, ..., + File.curSizeRollBackups}. Moreover, File is + renamed File.1 and closed. + + + A new file is created to receive further log output. + + + If maxSizeRollBackups is equal to zero, then the + File is truncated with no backup files created. + + + If maxSizeRollBackups < 0, then File is + renamed if needed and no files are deleted. + + + + + + Implements file roll. + + the base name to rename + + + If the maximum number of size based backups is reached + (curSizeRollBackups == maxSizeRollBackups) then the oldest + file is deleted -- its index determined by the sign of countDirection. + If countDirection < 0, then files + {File.1, ..., File.curSizeRollBackups -1} + are renamed to {File.2, ..., + File.curSizeRollBackups}. + + + If maxSizeRollBackups is equal to zero, then the + File is truncated with no backup files created. + + + If maxSizeRollBackups < 0, then File is + renamed if needed and no files are deleted. + + + This is called by to rename the files. + + + + + + Get the start time of the next window for the current rollpoint + + the current date + the type of roll point we are working with + the start time for the next roll point an interval after the currentDateTime date + + + Returns the date of the next roll point after the currentDateTime date passed to the method. + + + The basic strategy is to subtract the time parts that are less significant + than the rollpoint from the current time. This should roll the time back to + the start of the time window for the current rollpoint. Then we add 1 window + worth of time and get the start time of the next window for the rollpoint. + + + + + + The actual formatted filename that is currently being written to + or will be the file transferred to on roll over + (based on staticLogFileName). + + + + + The timestamp when we shall next recompute the filename. + + + + + Holds date of last roll over + + + + + The type of rolling done + + + + + How many sized based backups have been made so far + + + + + The rolling mode used in this appender. + + + + + Cache flag set if we are rolling by date. + + + + + Cache flag set if we are rolling by size. + + + + + FileName provided in configuration. Used for rolling properly + + + + + A mutex that is used to lock rolling of files. + + + + + The 1st of January 1970 in UTC + + + + + This interface is used to supply Date/Time information to the . + + + This interface is used to supply Date/Time information to the . + Used primarily to allow test classes to plug themselves in so they can + supply test date/times. + + + + + Gets the current time. + + The current time. + + + Gets the current time. + + + + + + Default implementation of that returns the current time. + + + + + Gets the current time. + + The current time. + + + Gets the current time. + + + + + + Implementation of that returns the current time as the coordinated universal time (UTC). + + + + + Gets the current time. + + The current time. + + + Gets the current time. + + + + + + Send an e-mail when a specific logging event occurs, typically on errors + or fatal errors. + + + + The number of logging events delivered in this e-mail depend on + the value of option. The + keeps only the last + logging events in its + cyclic buffer. This keeps memory requirements at a reasonable level while + still delivering useful application context. + + + Authentication is supported by setting the property to + either or . + If using authentication then the + and properties must also be set. + + + To set the SMTP server port use the property. The default port is 25. + + + Nicko Cadell + Gert Driesen + + + + Default constructor + + + + Default constructor + + + + + + Gets or sets a comma-delimited list of recipient e-mail addresses. + + + + + Gets or sets a comma-delimited list of recipient e-mail addresses + that will be carbon copied. + + + + + Gets or sets a semicolon-delimited list of recipient e-mail addresses + that will be blind carbon copied. + + + A semicolon-delimited list of e-mail addresses. + + + + A semicolon-delimited list of recipient e-mail addresses. + + + + + + Gets or sets the e-mail address of the sender. + + + The e-mail address of the sender. + + + + The e-mail address of the sender. + + + + + + Gets or sets the subject line of the e-mail message. + + + The subject line of the e-mail message. + + + + The subject line of the e-mail message. + + + + + + Gets or sets the name of the SMTP relay mail server to use to send + the e-mail messages. + + + The name of the e-mail relay server. If SmtpServer is not set, the + name of the local SMTP server is used. + + + + The name of the e-mail relay server. If SmtpServer is not set, the + name of the local SMTP server is used. + + + + + + The mode to use to authentication with the SMTP server + + + + Valid Authentication mode values are: , + , and . + The default value is . When using + you must specify the + and to use to authenticate. + When using the Windows credentials for the current + thread, if impersonating, or the process will be used to authenticate. + + + + + + The username to use to authenticate with the SMTP server + + + + A and must be specified when + is set to , + otherwise the username will be ignored. + + + + + + The password to use to authenticate with the SMTP server + + + + A and must be specified when + is set to , + otherwise the password will be ignored. + + + + + + The port on which the SMTP server is listening + + + + The port on which the SMTP server is listening. The default + port is 25. + + + + + + Gets or sets the priority of the e-mail message + + + One of the values. + + + + Sets the priority of the e-mails generated by this + appender. The default priority is . + + + If you are using this appender to report errors then + you may want to set the priority to . + + + + + + Enable or disable use of SSL when sending e-mail message + + + This is available on MS .NET 2.0 runtime and higher + + + + + Gets or sets the reply-to e-mail address. + + + + + Gets or sets the subject encoding to be used. + + + The default encoding is the operating system's current ANSI codepage. + + + + + Gets or sets the body encoding to be used. + + + The default encoding is the operating system's current ANSI codepage. + + + + + Sends the contents of the cyclic buffer as an e-mail message. + + The logging events to send. + + + + This appender requires a to be set. + + + + + Send the email message + + the body text to include in the mail + + + + Values for the property. + + + + SMTP authentication modes. + + + + + + No authentication + + + + + Basic authentication. + + + Requires a username and password to be supplied + + + + + Integrated authentication + + + Uses the Windows credentials from the current thread or process to authenticate. + + + + + Trims leading and trailing commas or semicolons + + + + + Send an email when a specific logging event occurs, typically on errors + or fatal errors. Rather than sending via smtp it writes a file into the + directory specified by . This allows services such + as the IIS SMTP agent to manage sending the messages. + + + + The configuration for this appender is identical to that of the SMTPAppender, + except that instead of specifying the SMTPAppender.SMTPHost you specify + . + + + The number of logging events delivered in this e-mail depend on + the value of option. The + keeps only the last + logging events in its + cyclic buffer. This keeps memory requirements at a reasonable level while + still delivering useful application context. + + + Niall Daley + Nicko Cadell + + + + Gets or sets a semicolon-delimited list of recipient e-mail addresses. + + + + + Gets or sets the e-mail address of the sender. + + + + + Gets or sets the subject line of the e-mail message. + + + + + Gets or sets the path to write the messages to. + + + + Gets or sets the path to write the messages to. This should be the same + as that used by the agent sending the messages. + + + + + + Gets or sets the file extension for the generated files + + + + + Gets or sets the used to write to the pickup directory. + + + The used to write to the pickup directory. + + + + Unless a specified here for this appender + the is queried for the + security context to use. The default behavior is to use the security context + of the current thread. + + + + + + Sends the contents of the cyclic buffer as an e-mail message. + + The logging events to send. + + + Sends the contents of the cyclic buffer as an e-mail message. + + + + + + Activate the options on this appender. + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + This appender requires a to be set. + + + + + Convert a path into a fully qualified path. + + The path to convert. + The fully qualified path. + + + Converts the path specified to a fully + qualified path. If the path is relative it is + taken as relative from the application base + directory. + + + + + + Appender that allows clients to connect via Telnet to receive log messages + + + + The TelnetAppender accepts socket connections and streams logging messages back to the client. + The output is provided in a telnet-friendly way so that a log can be monitored over a TCP/IP socket. + This allows simple remote monitoring of application logging. + + + The default is 23 (the telnet port). + + + Keith Long + Nicko Cadell + + + + The fully qualified type of the TelnetAppender class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Gets or sets the TCP port number on which this will listen for connections. + + + An integer value in the range to + indicating the TCP port number on which this will listen for connections. + + + + The default value is 23 (the telnet port). + + + The value specified is less than + or greater than . + + + + Overrides the parent method to close the socket handler + + + + Closes all the outstanding connections. + + + + + + This appender requires a to be set. + + + + + Create the socket handler and wait for connections + + + + + Writes the logging event to each connected client. + + The event to log. + + + + Helper class to manage connected clients + + + + The SocketHandler class is used to accept connections from clients. + It is threaded so that clients can connect/disconnect asynchronously. + + + + + + Class that represents a client connected to this handler + + + + + Create this for the specified + + the client's socket + + + Opens a stream writer on the socket. + + + + + + Writes a string to the client. + + string to send + + + + Cleans up the client connection. + + + + + Opens a new server port on + + the local port to listen on for connections + + + Creates a socket handler on the specified local server port. + + + + + + Sends a string message to each of the connected clients. + + the text to send + + + + Add a client to the internal clients list + + client to add + + + + Remove a client from the internal clients list + + client to remove + + + + Test if this handler has active connections + + + + + Callback used to accept a connection on the server socket + + The result of the asynchronous operation + + + On connection adds to the list of connections + if there are too many open connections you will be disconnected + + + + + + Closes all network connections + + + + + Sends logging events to a . + + + + An Appender that writes to a . + + + This appender may be used stand alone if initialized with an appropriate + writer, however it is typically used as a base class for an appender that + can open a to write to. + + + Nicko Cadell + Gert Driesen + Douglas de la Torre + + + + Gets or set whether the appender will flush at the end + of each append operation. + + + + The default behavior is to flush at the end of each + append operation. + + + If this option is set to false, then the underlying + stream can defer persisting the logging event to a later + time. + + + + Avoiding the flush operation at the end of each append results in + a performance gain of 10 to 20 percent. However, there is a safety + trade-off involved in skipping flushing. Indeed, when flushing is + skipped, then it is likely that the last few log events will not + be recorded on disk when the application exits. This is a high + price to pay even for a 20% performance gain. + + + + + Sets the where the log output will go. + + + + The specified must be open and writable. + + + The will be closed when the appender + instance is closed. + + + Note: Logging to an unopened will fail. + + + + + + This method determines if there is a sense in attempting to append. + + + + This method checks if an output target has been set and if a + layout has been set. + + + false if any of the preconditions fail. + + + + This method is called by the + method. + + The event to log. + + + Writes a log statement to the output stream if the output stream exists + and is writable. + + + The format of the output will depend on the appender's layout. + + + + + + This method is called by the + method. + + The array of events to log. + + + This method writes all the bulk logged events to the output writer + before flushing the stream. + + + + + + Close this appender instance. The underlying stream or writer is also closed. + + + Closed appenders cannot be reused. + + + + + Gets or set the and the underlying + , if any, for this appender. + + + The for this appender. + + + + + This appender requires a to be set. + + + + + Writes the footer and closes the underlying . + + + + + Closes the underlying . + + + + + Clears internal references to the underlying + and other variables. + + + + Subclasses can override this method for an alternate closing behavior. + + + + + + Writes a footer as produced by the embedded layout's property. + + + + Writes a footer as produced by the embedded layout's property. + + + + + + Writes a header produced by the embedded layout's property. + + + + Writes a header produced by the embedded layout's property. + + + + + + Called to allow a subclass to lazily initialize the writer + + + + This method is called when an event is logged and the or + have not been set. This allows a subclass to + attempt to initialize the writer multiple times. + + + + + + Gets or sets the where logging events + will be written to. + + + The where logging events are written. + + + + This is the where logging events + will be written to. + + + + + + The fully qualified type of the TextWriterAppender class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Flushes any buffered log data. + + The maximum time to wait for logging events to be flushed. + True if all logging events were flushed successfully, else false. + + + + Appends log events to the system. + + + + The application configuration file can be used to control what listeners + are actually used. See the MSDN documentation for the + class for details on configuring the + trace system. + + + Events are written using the System.Diagnostics.Trace.Write(string,string) + method. The event's logger name is the default value for the category parameter + of the Write method. + + + Compact Framework
    + The Compact Framework does not support the + class for any operation except Assert. When using the Compact Framework this + appender will write to the system rather than + the Trace system. This appender will therefore behave like the . +
    +
    + Douglas de la Torre + Nicko Cadell + Gert Driesen + Ron Grabowski +
    + + + Gets or sets a value that indicates whether the appender will + flush at the end of each write. + + + The default behavior is to flush at the end of each + write. If the option is set tofalse, then the underlying + stream can defer writing to physical medium to a later time. + + + Avoiding the flush operation at the end of each append results + in a performance gain of 10 to 20 percent. However, there is safety + trade-off involved in skipping flushing. Indeed, when flushing is + skipped, then it is likely that the last few log events will not + be recorded on disk when the application exits. This is a high + price to pay even for a 20% performance gain. + + + + + + The category parameter sent to the Trace method. + + + + Defaults to %logger which will use the logger name of the current + as the category parameter. + + + + + + Writes the logging event to the system. + + The event to log. + + + + This appender requires a to be set. + + + + + Flushes any buffered log data. + + The maximum time to wait for logging events to be flushed. + True if all logging events were flushed successfully, else false. + + + + Sends logging events as connectionless UDP datagrams to a remote host or a + multicast group using an . + + + + UDP guarantees neither that messages arrive, nor that they arrive in the correct order. + + + To view the logging results, a custom application can be developed that listens for logging + events. + + + When decoding events send via this appender remember to use the same encoding + to decode the events as was used to send the events. See the + property to specify the encoding to use. + + + + This example shows how to log receive logging events that are sent + on IP address 244.0.0.1 and port 8080 to the console. The event is + encoded in the packet as a unicode string and it is decoded as such. + + IPEndPoint remoteEndPoint = new IPEndPoint(IPAddress.Any, 0); + UdpClient udpClient; + byte[] buffer; + string loggingEvent; + + try + { + udpClient = new UdpClient(8080); + + while(true) + { + buffer = udpClient.Receive(ref remoteEndPoint); + loggingEvent = System.Text.Encoding.Unicode.GetString(buffer); + Console.WriteLine(loggingEvent); + } + } + catch(Exception e) + { + Console.WriteLine(e.ToString()); + } + + + Dim remoteEndPoint as IPEndPoint + Dim udpClient as UdpClient + Dim buffer as Byte() + Dim loggingEvent as String + + Try + remoteEndPoint = new IPEndPoint(IPAddress.Any, 0) + udpClient = new UdpClient(8080) + + While True + buffer = udpClient.Receive(ByRef remoteEndPoint) + loggingEvent = System.Text.Encoding.Unicode.GetString(buffer) + Console.WriteLine(loggingEvent) + Wend + Catch e As Exception + Console.WriteLine(e.ToString()) + End Try + + + An example configuration section to log information using this appender to the + IP 224.0.0.1 on port 8080: + + + + + + + + + + Gert Driesen + Nicko Cadell + + + + Initializes a new instance of the class. + + + The default constructor initializes all fields to their default values. + + + + + Gets or sets the IP address of the remote host or multicast group to which + the underlying should sent the logging event. + + + The IP address of the remote host or multicast group to which the logging event + will be sent. + + + + Multicast addresses are identified by IP class D addresses (in the range 224.0.0.0 to + 239.255.255.255). Multicast packets can pass across different networks through routers, so + it is possible to use multicasts in an Internet scenario as long as your network provider + supports multicasting. + + + Hosts that want to receive particular multicast messages must register their interest by joining + the multicast group. Multicast messages are not sent to networks where no host has joined + the multicast group. Class D IP addresses are used for multicast groups, to differentiate + them from normal host addresses, allowing nodes to easily detect if a message is of interest. + + + Static multicast addresses that are needed globally are assigned by IANA. A few examples are listed in the table below: + + + + + IP Address + Description + + + 224.0.0.1 + + + Sends a message to all system on the subnet. + + + + + 224.0.0.2 + + + Sends a message to all routers on the subnet. + + + + + 224.0.0.12 + + + The DHCP server answers messages on the IP address 224.0.0.12, but only on a subnet. + + + + + + + A complete list of actually reserved multicast addresses and their owners in the ranges + defined by RFC 3171 can be found at the IANA web site. + + + The address range 239.0.0.0 to 239.255.255.255 is reserved for administrative scope-relative + addresses. These addresses can be reused with other local groups. Routers are typically + configured with filters to prevent multicast traffic in this range from flowing outside + of the local network. + + + + + + Gets or sets the TCP port number of the remote host or multicast group to which + the underlying should sent the logging event. + + + An integer value in the range to + indicating the TCP port number of the remote host or multicast group to which the logging event + will be sent. + + + The underlying will send messages to this TCP port number + on the remote host or multicast group. + + The value specified is less than or greater than . + + + + Gets or sets the TCP port number from which the underlying will communicate. + + + An integer value in the range to + indicating the TCP port number from which the underlying will communicate. + + + + The underlying will bind to this port for sending messages. + + + Setting the value to 0 (the default) will cause the udp client not to bind to + a local port. + + + The value specified is less than or greater than . + + + + Gets or sets used to write the packets. + + + The used to write the packets. + + + + The used to write the packets. + + + + + + Gets or sets the underlying . + + + The underlying . + + + creates a to send logging events + over a network. Classes deriving from can use this + property to get or set this . Use the underlying + returned from if you require access beyond that which + provides. + + + + + Gets or sets the cached remote endpoint to which the logging events should be sent. + + + The method will initialize the remote endpoint + with the values of the and + properties. + + + + + Initialize the appender based on the options set. + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + The appender will be ignored if no was specified or + an invalid remote or local TCP port number was specified. + + + The required property was not specified. + The TCP port number assigned to or is less than or greater than . + + + + This method is called by the method. + + The event to log. + + + Sends the event using an UDP datagram. + + + Exceptions are passed to the . + + + + + + This appender requires a to be set. + + + + + Closes the UDP connection and releases all resources associated with + this instance. + + + + Disables the underlying and releases all managed + and unmanaged resources associated with the . + + + + + + Initializes the underlying connection. + + + + The underlying is initialized and binds to the + port number from which you intend to communicate. + + + Exceptions are passed to the . + + + + + + The TCP port number of the remote host or multicast group to + which the logging event will be sent. + + + + + The TCP port number from which the will communicate. + + + + + Assembly level attribute that specifies a repository to alias to this assembly's repository. + + + + An assembly's logger repository is defined by its , + however this can be overridden by an assembly loaded before the target assembly. + + + An assembly can alias another assembly's repository to its repository by + specifying this attribute with the name of the target repository. + + + This attribute can only be specified on the assembly and may be used + as many times as necessary to alias all the required repositories. + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class with + the specified repository to alias to this assembly's repository. + + The repository to alias to this assemby's repository. + + + + Gets or sets the repository to alias to this assemby's repository. + + + + + Use this class to quickly configure a . + + + + Allows very simple programmatic configuration of log4net. + + + Only one appender can be configured using this configurator. + The appender is set at the root of the hierarchy and all logging + events will be delivered to that appender. + + + Appenders can also implement the interface. Therefore + they would require that the method + be called after the appenders properties have been configured. + + + Nicko Cadell + Gert Driesen + + + + The fully qualified type of the BasicConfigurator class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Initializes the log4net system with a default configuration. + + + + Initializes the log4net logging system using a + that will write to Console.Out. The log messages are + formatted using the layout object + with the + layout style. + + + + + + Initializes the log4net system using the specified appenders. + + The appenders to use to log all logging events. + + + Initializes the log4net system using the specified appenders. + + + + + + Initializes the with a default configuration. + + The repository to configure. + + + Initializes the specified repository using a + that will write to Console.Out. The log messages are + formatted using the layout object + with the + layout style. + + + + + + Initializes the using the specified appenders. + + The repository to configure. + The appenders to use to log all logging events. + + + Initializes the using the specified appender. + + + + + + Base class for all log4net configuration attributes. + + + This is an abstract class that must be extended by + specific configurators. This attribute allows the + configurator to be parameterized by an assembly level + attribute. + + Nicko Cadell + Gert Driesen + + + + Constructor used by subclasses. + + the ordering priority for this configurator + + + The is used to order the configurator + attributes before they are invoked. Higher priority configurators are executed + before lower priority ones. + + + + + + Configures the for the specified assembly. + + The assembly that this attribute was defined on. + The repository to configure. + + + Abstract method implemented by a subclass. When this method is called + the subclass should configure the . + + + + + + Compare this instance to another ConfiguratorAttribute + + the object to compare to + see + + + Compares the priorities of the two instances. + Sorts by priority in descending order. Objects with the same priority are + randomly ordered. + + + + + + Class to register for the log4net section of the configuration file + + + The log4net section of the configuration file needs to have a section + handler registered. This is the section handler used. It simply returns + the XML element that is the root of the section. + + + Example of registering the log4net section handler : + + + +
    + + + log4net configuration XML goes here + + + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + + Default constructor. + + + + + + Parses the configuration section. + + The configuration settings in a corresponding parent configuration section. + The configuration context when called from the ASP.NET configuration system. Otherwise, this parameter is reserved and is a null reference. + The for the log4net section. + The for the log4net section. + + + Returns the containing the configuration data, + + + + + + Assembly level attribute that specifies a plugin to attach to + the repository. + + + + Specifies the type of a plugin to create and attach to the + assembly's repository. The plugin type must implement the + interface. + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class + with the specified type. + + The type name of plugin to create. + + + Create the attribute with the plugin type specified. + + + Where possible use the constructor that takes a . + + + + + + Initializes a new instance of the class + with the specified type. + + The type of plugin to create. + + + Create the attribute with the plugin type specified. + + + + + + Gets or sets the type for the plugin. + + + + + Gets or sets the type name for the plugin. + + + + Where possible use the property instead. + + + + + + Creates the plugin object defined by this attribute. + + The plugin object. + + + + + + + Assembly level attribute that specifies the logging repository for the assembly. + + + + Assemblies are mapped to logging repository. This attribute specified + on the assembly controls + the configuration of the repository. The property specifies the name + of the repository that this assembly is a part of. The + specifies the type of the object + to create for the assembly. If this attribute is not specified or a + is not specified then the assembly will be part of the default shared logging repository. + + + This attribute can only be specified on the assembly and may only be used + once per assembly. + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + + Default constructor. + + + + + + Initialize a new instance of the class + with the name of the repository. + + The name of the repository. + + + Initialize the attribute with the name for the assembly's repository. + + + + + + Gets or sets the name of the logging repository. + + + The string name to use as the name of the repository associated with this + assembly. + + + + This value does not have to be unique. Several assemblies can share the + same repository. They will share the logging configuration of the repository. + + + + + + Gets or sets the type of repository to create for this assembly. + + + The type of repository to create for this assembly. + + + + The type of the repository to create for the assembly. + The type must implement the + interface. + + + This will be the type of repository created when + the repository is created. If multiple assemblies reference the + same repository then the repository is only created once using the + of the first assembly to call into the + repository. + + + + + + Assembly level attribute to configure the . + + the type of the provider to use + + + This attribute may only be used at the assembly scope and can only + be used once per assembly. + + + Use this attribute to configure the + without calling one of the + methods. + + + Nicko Cadell + + + + Assembly level attribute to configure the . + + the type of the provider to use + + + This attribute may only be used at the assembly scope and can only + be used once per assembly. + + + Use this attribute to configure the + without calling one of the + methods. + + + Nicko Cadell + + + + Gets or sets the type of the provider to use. + + + + The provider specified must subclass the + class. + + + + + + Configures the SecurityContextProvider + + The assembly that this attribute was defined on. + The repository to configure. + + + Creates a provider instance from the specified. + Sets this as the default security context provider . + + + + + + The fully qualified type of the SecurityContextProviderAttribute class. + + + Used by the internal logger to record the Type of the log message. + + + + + Configures a using an XML tree. + + Nicko Cadell + Gert Driesen + + + + Automatically configures the using settings + stored in the application's configuration file. + + + + Each application has a configuration file. This has the + same name as the application with '.config' appended. + This file is XML and calling this function prompts the + configurator to look in that file for a section called + log4net that contains the configuration data. + + + To use this method to configure log4net you must specify + the section + handler for the log4net configuration section. See the + for an example. + + + The repository to configure. + + + + Automatically configures the log4net system based on the + application's configuration settings. + + + + Each application has a configuration file. This has the + same name as the application with '.config' appended. + This file is XML and calling this function prompts the + configurator to look in that file for a section called + log4net that contains the configuration data. + + + To use this method to configure log4net you must specify + the section + handler for the log4net configuration section. See the + for an example. + + + + + + + Configures log4net using a log4net element + + + + Loads the log4net configuration from the XML element + supplied as . + + + The element to parse. + + + + Configures log4net using the specified configuration file. + + The XML file to load the configuration from. + + + The configuration file must be valid XML. It must contain + at least one element called log4net that holds + the log4net configuration data. + + + The log4net configuration file can possibly be specified in the application's + configuration file (either MyAppName.exe.config for a + normal application on Web.config for an ASP.NET application). + + + The first element matching <configuration> will be read as the + configuration. If this file is also a .NET .config file then you must specify + a configuration section for the log4net element otherwise .NET will + complain. Set the type for the section handler to , for example: + + +
    + + + + + The following example configures log4net using a configuration file, of which the + location is stored in the application's configuration file : + + + using log4net.Config; + using System.IO; + using System.Configuration; + + ... + + XmlConfigurator.Configure(new FileInfo(ConfigurationSettings.AppSettings["log4net-config-file"])); + + + In the .config file, the path to the log4net can be specified like this : + + + + + + + + + + + + + Configures log4net using the specified configuration URI. + + A URI to load the XML configuration from. + + + The configuration data must be valid XML. It must contain + at least one element called log4net that holds + the log4net configuration data. + + + The must support the URI scheme specified. + + + + + + Configures log4net using the specified configuration data stream. + + A stream to load the XML configuration from. + + + The configuration data must be valid XML. It must contain + at least one element called log4net that holds + the log4net configuration data. + + + Note that this method will NOT close the stream parameter. + + + + + + Configures the using the specified XML + element. + + + Loads the log4net configuration from the XML element + supplied as . + + The repository to configure. + The element to parse. + + + + Configures the using the specified configuration + file. + + The repository to configure. + The XML file to load the configuration from. + + + The configuration file must be valid XML. It must contain + at least one element called log4net that holds + the configuration data. + + + The log4net configuration file can possibly be specified in the application's + configuration file (either MyAppName.exe.config for a + normal application on Web.config for an ASP.NET application). + + + The first element matching <configuration> will be read as the + configuration. If this file is also a .NET .config file then you must specify + a configuration section for the log4net element otherwise .NET will + complain. Set the type for the section handler to , for example: + + +
    + + + + + The following example configures log4net using a configuration file, of which the + location is stored in the application's configuration file : + + + using log4net.Config; + using System.IO; + using System.Configuration; + + ... + + XmlConfigurator.Configure(new FileInfo(ConfigurationSettings.AppSettings["log4net-config-file"])); + + + In the .config file, the path to the log4net can be specified like this : + + + + + + + + + + + + + Configures the using the specified configuration + URI. + + The repository to configure. + A URI to load the XML configuration from. + + + The configuration data must be valid XML. It must contain + at least one element called log4net that holds + the configuration data. + + + The must support the URI scheme specified. + + + + + + Configures the using the specified configuration + file. + + The repository to configure. + The stream to load the XML configuration from. + + + The configuration data must be valid XML. It must contain + at least one element called log4net that holds + the configuration data. + + + Note that this method will NOT close the stream parameter. + + + + + + Configures log4net using the file specified, monitors the file for changes + and reloads the configuration if a change is detected. + + The XML file to load the configuration from. + + + The configuration file must be valid XML. It must contain + at least one element called log4net that holds + the configuration data. + + + The configuration file will be monitored using a + and depends on the behavior of that class. + + + For more information on how to configure log4net using + a separate configuration file, see . + + + + + + + Configures the using the file specified, + monitors the file for changes and reloads the configuration if a change + is detected. + + The repository to configure. + The XML file to load the configuration from. + + + The configuration file must be valid XML. It must contain + at least one element called log4net that holds + the configuration data. + + + The configuration file will be monitored using a + and depends on the behavior of that class. + + + For more information on how to configure log4net using + a separate configuration file, see . + + + + + + + Class used to watch config files. + + + + Uses the to monitor + changes to a specified file. Because multiple change notifications + may be raised when the file is modified, a timer is used to + compress the notifications into a single event. The timer + waits for time before delivering + the event notification. If any further + change notifications arrive while the timer is waiting it + is reset and waits again for to + elapse. + + + + + + Holds the FileInfo used to configure the XmlConfigurator + + + + + Holds the repository being configured. + + + + + The timer used to compress the notification events. + + + + + The default amount of time to wait after receiving notification + before reloading the config file. + + + + + Watches file for changes. This object should be disposed when no longer + needed to free system handles on the watched resources. + + + + + Initializes a new instance of the class to + watch a specified config file used to configure a repository. + + The repository to configure. + The configuration file to watch. + + + Initializes a new instance of the class. + + + + + + Event handler used by . + + The firing the event. + The argument indicates the file that caused the event to be fired. + + + This handler reloads the configuration from the file when the event is fired. + + + + + + Event handler used by . + + The firing the event. + The argument indicates the file that caused the event to be fired. + + + This handler reloads the configuration from the file when the event is fired. + + + + + + Called by the timer when the configuration has been updated. + + null + + + + Release the handles held by the watcher and timer. + + + + + Configures the specified repository using a log4net element. + + The hierarchy to configure. + The element to parse. + + + Loads the log4net configuration from the XML element + supplied as . + + + This method is ultimately called by one of the Configure methods + to load the configuration from an . + + + + + + Maps repository names to ConfigAndWatchHandler instances to allow a particular + ConfigAndWatchHandler to dispose of its FileSystemWatcher when a repository is + reconfigured. + + + + + The fully qualified type of the XmlConfigurator class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Assembly level attribute to configure the . + + + + This attribute may only be used at the assembly scope and can only + be used once per assembly. + + + Use this attribute to configure the + without calling one of the + methods. + + + If neither of the or + properties are set the configuration is loaded from the application's .config file. + If set the property takes priority over the + property. The property + specifies a path to a file to load the config from. The path is relative to the + application's base directory; . + The property is used as a postfix to the assembly file name. + The config file must be located in the application's base directory; . + For example in a console application setting the to + config has the same effect as not specifying the or + properties. + + + The property can be set to cause the + to watch the configuration file for changes. + + + + Log4net will only look for assembly level configuration attributes once. + When using the log4net assembly level attributes to control the configuration + of log4net you must ensure that the first call to any of the + methods is made from the assembly with the configuration + attributes. + + + If you cannot guarantee the order in which log4net calls will be made from + different assemblies you must use programmatic configuration instead, i.e. + call the method directly. + + + + Nicko Cadell + Gert Driesen + + + + Default constructor + + + + Default constructor + + + + + + Gets or sets the filename of the configuration file. + + + The filename of the configuration file. + + + + If specified, this is the name of the configuration file to use with + the . This file path is relative to the + application base directory (). + + + The takes priority over the . + + + + + + Gets or sets the extension of the configuration file. + + + + If specified this is the extension for the configuration file. + The path to the config file is built by using the application + base directory (), + the assembly file name and the config file extension. + + + If the is set to MyExt then + possible config file names would be: MyConsoleApp.exe.MyExt or + MyClassLibrary.dll.MyExt. + + + The takes priority over the . + + + + + + Gets or sets a value indicating whether to watch the configuration file. + + + true if the configuration should be watched, false otherwise. + + + + If this flag is specified and set to true then the framework + will watch the configuration file and will reload the config each time + the file is modified. + + + The config file can only be watched if it is loaded from local disk. + In a No-Touch (Smart Client) deployment where the application is downloaded + from a web server the config file may not reside on the local disk + and therefore it may not be able to watch it. + + + Watching configuration is not supported on the SSCLI. + + + + + + Configures the for the specified assembly. + + The assembly that this attribute was defined on. + The repository to configure. + + + Configure the repository using the . + The specified must extend the + class otherwise the will not be able to + configure it. + + + The does not extend . + + + + Attempt to load configuration from the local file system + + The assembly that this attribute was defined on. + The repository to configure. + + + + Configure the specified repository using a + + The repository to configure. + the FileInfo pointing to the config file + + + + Attempt to load configuration from a URI + + The repository to configure. + + + + The fully qualified type of the XmlConfiguratorAttribute class. + + + Used by the internal logger to record the Type of the + log message. + + + + + The default implementation of the interface. + + + + Uses attributes defined on the calling assembly to determine how to + configure the hierarchy for the repository. + + + Nicko Cadell + Gert Driesen + + + + Event to notify that a logger repository has been created. + + + Event to notify that a logger repository has been created. + + + + Event raised when a new repository is created. + The event source will be this selector. The event args will + be a which + holds the newly created . + + + + + + Creates a new repository selector. + + The type of the repositories to create, must implement + + + Create a new repository selector. + The default type for repositories must be specified, + an appropriate value would be . + + + is . + does not implement . + + + + Gets the for the specified assembly. + + The assembly use to look up the . + + + The type of the created and the repository + to create can be overridden by specifying the + attribute on the . + + + The default values are to use the + implementation of the interface and to use the + as the name of the repository. + + + The created will be automatically configured using + any attributes defined on + the . + + + The for the assembly + is . + + + + Gets the for the specified repository. + + The repository to use to look up the . + The for the specified repository. + + + Returns the named repository. If is null + a is thrown. If the repository + does not exist a is thrown. + + + Use to create a repository. + + + is . + does not exist. + + + + Creates a new repository for the assembly specified + + the assembly to use to create the repository to associate with the . + The type of repository to create, must implement . + The repository created. + + + The created will be associated with the repository + specified such that a call to with the + same assembly specified will return the same repository instance. + + + The type of the created and + the repository to create can be overridden by specifying the + attribute on the + . The default values are to use the + implementation of the + interface and to use the + as the name of the repository. + + + The created will be automatically + configured using any + attributes defined on the . + + + If a repository for the already exists + that repository will be returned. An error will not be raised and that + repository may be of a different type to that specified in . + Also the attribute on the + assembly may be used to override the repository type specified in + . + + + is . + + + + Creates a new repository for the assembly specified. + + the assembly to use to create the repository to associate with the . + The type of repository to create, must implement . + The name to assign to the created repository + Set to true to read and apply the assembly attributes + The repository created. + + + The created will be associated with the repository + specified such that a call to with the + same assembly specified will return the same repository instance. + + + The type of the created and + the repository to create can be overridden by specifying the + attribute on the + . The default values are to use the + implementation of the + interface and to use the + as the name of the repository. + + + The created will be automatically + configured using any + attributes defined on the . + + + If a repository for the already exists + that repository will be returned. An error will not be raised and that + repository may be of a different type to that specified in . + Also the attribute on the + assembly may be used to override the repository type specified in + . + + + is . + + + + Creates a new repository for the specified repository. + + The repository to associate with the . + The type of repository to create, must implement . + If this param is then the default repository type is used. + The new repository. + + + The created will be associated with the repository + specified such that a call to with the + same repository specified will return the same repository instance. + + + is . + already exists. + + + + Test if a named repository exists + + the named repository to check + true if the repository exists + + + Test if a named repository exists. Use + to create a new repository and to retrieve + a repository. + + + + + + Gets a list of objects + + an array of all known objects + + + Gets an array of all repositories created by this selector. + + + + + + Aliases a repository to an existing repository. + + The repository to alias. + The repository that the repository is aliased to. + + + The repository specified will be aliased to the repository when created. + The repository must not already exist. + + + When the repository is created it must utilize the same repository type as + the repository it is aliased to, otherwise the aliasing will fail. + + + + is . + -or- + is . + + + + + Notifies the registered listeners that the repository has been created. + + The repository that has been created. + + + Raises the event. + + + + + + Gets the repository name and repository type for the specified assembly. + + The assembly that has a . + in/out param to hold the repository name to use for the assembly, caller should set this to the default value before calling. + in/out param to hold the type of the repository to create for the assembly, caller should set this to the default value before calling. + is . + + + + Configures the repository using information from the assembly. + + The assembly containing + attributes which define the configuration for the repository. + The repository to configure. + + is . + -or- + is . + + + + + Loads the attribute defined plugins on the assembly. + + The assembly that contains the attributes. + The repository to add the plugins to. + + is . + -or- + is . + + + + + Loads the attribute defined aliases on the assembly. + + The assembly that contains the attributes. + The repository to alias to. + + is . + -or- + is . + + + + + The fully qualified type of the DefaultRepositorySelector class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Defined error codes that can be passed to the method. + + + + Values passed to the method. + + + Nicko Cadell + + + + A general error + + + + + Error while writing output + + + + + Failed to flush file + + + + + Failed to close file + + + + + Unable to open output file + + + + + No layout specified + + + + + Failed to parse address + + + + + An evaluator that triggers on an Exception type + + + + This evaluator will trigger if the type of the Exception + passed to + is equal to a Type in . /// + + + Drew Schaeffer + + + + Default ctor to allow dynamic creation through a configurator. + + + + + Constructs an evaluator and initializes to trigger on + + the type that triggers this evaluator. + If true, this evaluator will trigger on subclasses of . + + + + The type that triggers this evaluator. + + + + + If true, this evaluator will trigger on subclasses of . + + + + + Is this the triggering event? + + The event to check + This method returns true, if the logging event Exception + Type is . + Otherwise it returns false + + + This evaluator will trigger if the Exception Type of the event + passed to + is . + + + + + + Flags passed to the property + + Nicko Cadell + + + + Fix the MDC + + + + + Fix the NDC + + + + + Fix the rendered message + + + + + Fix the thread name + + + + + Fix the callers location information + + + CAUTION: Very slow to generate + + + + + Fix the callers windows user name + + + CAUTION: Slow to generate + + + + + Fix the domain friendly name + + + + + Fix the callers principal name + + + CAUTION: May be slow to generate + + + + + Fix the exception text + + + + + Fix the event properties. Active properties must implement in order to be eligible for fixing. + + + + + No fields fixed + + + + + All fields fixed + + + + + Partial fields fixed + + + + This set of partial fields gives good performance. The following fields are fixed: + + + + + + + + + + + + + Interface for attaching appenders to objects. + + + + Interface for attaching, removing and retrieving appenders. + + + Nicko Cadell + Gert Driesen + + + + Attaches an appender. + + The appender to add. + + + Add the specified appender. The implementation may + choose to allow or deny duplicate appenders. + + + + + + Gets all attached appenders. + + + A collection of attached appenders. + + + + Gets a collection of attached appenders. + If there are no attached appenders the + implementation should return an empty + collection rather than null. + + + + + + Gets an attached appender with the specified name. + + The name of the appender to get. + + The appender with the name specified, or null if no appender with the + specified name is found. + + + + Returns an attached appender with the specified. + If no appender with the specified name is found null will be + returned. + + + + + + Removes all attached appenders. + + + + Removes and closes all attached appenders + + + + + + Removes the specified appender from the list of attached appenders. + + The appender to remove. + The appender removed from the list + + + The appender removed is not closed. + If you are discarding the appender you must call + on the appender removed. + + + + + + Removes the appender with the specified name from the list of appenders. + + The name of the appender to remove. + The appender removed from the list + + + The appender removed is not closed. + If you are discarding the appender you must call + on the appender removed. + + + + + + Appenders may delegate their error handling to an . + + + + Error handling is a particularly tedious to get right because by + definition errors are hard to predict and to reproduce. + + + Nicko Cadell + Gert Driesen + + + + Handles the error and information about the error condition is passed as + a parameter. + + The message associated with the error. + The that was thrown when the error occurred. + The error code associated with the error. + + + Handles the error and information about the error condition is passed as + a parameter. + + + + + + Prints the error message passed as a parameter. + + The message associated with the error. + The that was thrown when the error occurred. + + + See . + + + + + + Prints the error message passed as a parameter. + + The message associated with the error. + + + See . + + + + + + Interface for objects that require fixing. + + + + Interface that indicates that the object requires fixing before it + can be taken outside the context of the appender's + method. + + + When objects that implement this interface are stored + in the context properties maps + and + are fixed + (see ) the + method will be called. + + + Nicko Cadell + + + + Get a portable version of this object + + the portable instance of this object + + + Get a portable instance object that represents the current + state of this object. The portable object can be stored + and logged from any thread with identical results. + + + + + + Interface that all loggers implement to support logging events and testing if a level + is enabled for logging. + + + + These methods will not throw exceptions. Note to implementers, ensure + that the implementation of these methods cannot allow an exception + to be thrown to the caller. + + + Nicko Cadell + Gert Driesen + + + + Gets the name of the logger. + + + + + Generates a logging event for the specified using + the and . + + The declaring type of the method that is + the stack boundary into the logging system for this call. + The level of the message to be logged. + The message object to log. + the exception to log, including its stack trace. Pass null to not log an exception. + + + This generic form is intended to be used by wrappers. + + + + + + Logs the specified logging event through this logger. + + The event being logged. + + + This is the most generic printing method that is intended to be used + by wrappers. + + + + + + Checks if this logger is enabled for a given passed as parameter. + + The level to check. + + true if this logger is enabled for level, otherwise false. + + + + + Gets the where this + Logger instance is attached to. + + + + + Base interface for all wrappers + + + + Base interface for all wrappers. + + + All wrappers must implement this interface. + + + Nicko Cadell + + + + Gets the object that implements this object. + + + + + + The Logger object may not be the same object as this object because of logger decorators. + This gets the actual underlying objects that is used to process the log events. + + + + + + Interface used to delay activate a configured object. + + + + This allows an object to defer activation of its options until all + options have been set. This is required for components which have + related options that remain ambiguous until all are set. + + + If a component implements this interface then the method + must be called by the container after its all the configured properties have been set + and before the component can be used. + + + Nicko Cadell + + + + Activate the options that were previously set with calls to properties. + + + + This allows an object to defer activation of its options until all + options have been set. This is required for components which have + related options that remain ambiguous until all are set. + + + If a component implements this interface then this method must be called + after its properties have been set before the component can be used. + + + + + + Delegate used to handle logger repository creation event notifications + + The which created the repository. + The event args + that holds the instance that has been created. + + + Delegate used to handle logger repository creation event notifications. + + + + + + Provides data for the event. + + the that has been created + + + A + event is raised every time a is created. + + + + + + Provides data for the event. + + the that has been created + + + A + event is raised every time a is created. + + + + + + The that has been created + + + The that has been created + + + + The that has been created + + + + + + Interface used by the to select the . + + + + The uses a + to specify the policy for selecting the correct + to return to the caller. + + + Nicko Cadell + Gert Driesen + + + + Gets the for the specified assembly. + + The assembly to use to look up to the + The for the assembly. + + + Gets the for the specified assembly. + + + How the association between and + is made is not defined. The implementation may choose any method for + this association. The results of this method must be repeatable, i.e. + when called again with the same arguments the result must be the + save value. + + + + + + Gets the named . + + The name to use to look up to the . + The named + + Lookup a named . This is the repository created by + calling . + + + + + Creates a new repository for the assembly specified. + + The assembly to use to create the domain to associate with the . + The type of repository to create, must implement . + The repository created. + + + The created will be associated with the domain + specified such that a call to with the + same assembly specified will return the same repository instance. + + + How the association between and + is made is not defined. The implementation may choose any method for + this association. + + + + + + Creates a new repository with the name specified. + + The name to associate with the . + The type of repository to create, must implement . + The repository created. + + + The created will be associated with the name + specified such that a call to with the + same name will return the same repository instance. + + + + + + Test if a named repository exists + + the named repository to check + true if the repository exists + + + Test if a named repository exists. Use + to create a new repository and to retrieve + a repository. + + + + + + Gets an array of all currently defined repositories. + + + An array of the instances created by + this . + + + Gets an array of all repositories created by this selector. + + + + + + Event to notify that a logger repository has been created. + + + Event to notify that a logger repository has been created. + + + + Event raised when a new repository is created. + The event source will be this selector. The event args will + be a which + holds the newly created . + + + + + + Test if an triggers an action + + + + Implementations of this interface allow certain appenders to decide + when to perform an appender specific action. + + + The action or behavior triggered is defined by the implementation. + + + Nicko Cadell + + + + Test if this event triggers the action + + The event to check + true if this event triggers the action, otherwise false + + + Return true if this event triggers the action + + + + + + Defines the default set of levels recognized by the system. + + + + Each has an associated . + + + Levels have a numeric that defines the relative + ordering between levels. Two Levels with the same + are deemed to be equivalent. + + + The levels that are recognized by log4net are set for each + and each repository can have different levels defined. The levels are stored + in the on the repository. Levels are + looked up by name from the . + + + When logging at level INFO the actual level used is not but + the value of LoggerRepository.LevelMap["INFO"]. The default value for this is + , but this can be changed by reconfiguring the level map. + + + Each level has a in addition to its . The + is the string that is written into the output log. By default + the display name is the same as the level name, but this can be used to alias levels + or to localize the log output. + + + Some of the predefined levels recognized by the system are: + + + + . + + + . + + + . + + + . + + + . + + + . + + + . + + + + Nicko Cadell + Gert Driesen + + + + Constructor + + Integer value for this level, higher values represent more severe levels. + The string name of this level. + The display name for this level. This may be localized or otherwise different from the name + + + Initializes a new instance of the class with + the specified level name and value. + + + + + + Constructor + + Integer value for this level, higher values represent more severe levels. + The string name of this level. + + + Initializes a new instance of the class with + the specified level name and value. + + + + + + Serialization constructor + + The that holds the serialized object data. + The that contains contextual information about the source or destination. + + + Initializes a new instance of the class + with serialized data. + + + + + + Gets the name of this level. + + + The name of this level. + + + + Gets the name of this level. + + + + + + Gets the value of this level. + + + + + Gets the display name of this level. + + + + + Returns the representation of the current + . + + + A representation of the current . + + + + Returns the level . + + + + + + + + + Compares levels. + + The object to compare against. + if the objects are equal. + + + + Returns a hash code + + A hash code for the current . + + + Returns a hash code suitable for use in hashing algorithms and data + structures like a hash table. + + + Returns the hash code of the level . + + + + + + + + + Compares this instance to a specified object and returns an + indication of their relative values. + + A instance or to compare with this instance. + + A 32-bit signed integer that indicates the relative order of the + values compared. The return value has these meanings: + + + Value + Meaning + + + Less than zero + This instance is less than . + + + Zero + This instance is equal to . + + + Greater than zero + + This instance is greater than . + -or- + is . + + + + + + + must be an instance of + or ; otherwise, an exception is thrown. + + + + + + Serializes this object into the provided. + + The to populate with data. + The destination for this serialization. + + + + Returns a value indicating whether a specified + is greater than another specified . + + A + A + + if is greater than + ; otherwise, . + + + + + Returns a value indicating whether a specified + is less than another specified . + + A + A + + if is less than + ; otherwise, . + + + + + Returns a value indicating whether a specified + is greater than or equal to another specified . + + A + A + + if is greater than or equal to + ; otherwise, . + + + + + Returns a value indicating whether a specified + is less than or equal to another specified . + + A + A + + if is less than or equal to + ; otherwise, . + + + + + Returns a value indicating whether two specified + objects have the same value. + + A or . + A or . + + if the value of is the same as the + value of ; otherwise, . + + + + + Returns a value indicating whether two specified + objects have different values. + + A or . + A or . + + if the value of is different from + the value of ; otherwise, . + + + + + Compares two specified instances. + + The first to compare. + The second to compare. + + A 32-bit signed integer that indicates the relative order of the + two values compared. The return value has these meanings: + + + Value + Meaning + + + Less than zero + is less than . + + + Zero + is equal to . + + + Greater than zero + is greater than . + + + + + + + The level designates a higher level than all the rest. + + + + + The level designates very severe error events. + System unusable, emergencies. + + + + + The level designates very severe error events. + System unusable, emergencies. + + + + + The level designates very severe error events + that will presumably lead the application to abort. + + + + + The level designates very severe error events. + Take immediate action, alerts. + + + + + The level designates very severe error events. + Critical condition, critical. + + + + + The level designates very severe error events. + + + + + The level designates error events that might + still allow the application to continue running. + + + + + The level designates potentially harmful + situations. + + + + + The level designates informational messages + that highlight the progress of the application at the highest level. + + + + + The level designates informational messages that + highlight the progress of the application at coarse-grained level. + + + + + The level designates fine-grained informational + events that are most useful to debug an application. + + + + + The level designates fine-grained informational + events that are most useful to debug an application. + + + + + The level designates fine-grained informational + events that are most useful to debug an application. + + + + + The level designates fine-grained informational + events that are most useful to debug an application. + + + + + The level designates fine-grained informational + events that are most useful to debug an application. + + + + + The level designates fine-grained informational + events that are most useful to debug an application. + + + + + The level designates the lowest level possible. + + + + + A strongly-typed collection of objects. + + Nicko Cadell + + + + Supports type-safe iteration over a . + + + + + Gets the current element in the collection. + + + + + Advances the enumerator to the next element in the collection. + + + true if the enumerator was successfully advanced to the next element; + false if the enumerator has passed the end of the collection. + + + The collection was modified after the enumerator was created. + + + + + Sets the enumerator to its initial position, before the first element in the collection. + + + + + Creates a read-only wrapper for a LevelCollection instance. + + list to create a readonly wrapper arround + + A LevelCollection wrapper that is read-only. + + + + + Initializes a new instance of the LevelCollection class + that is empty and has the default initial capacity. + + + + + Initializes a new instance of the LevelCollection class + that has the specified initial capacity. + + + The number of elements that the new LevelCollection is initially capable of storing. + + + + + Initializes a new instance of the LevelCollection class + that contains elements copied from the specified LevelCollection. + + The LevelCollection whose elements are copied to the new collection. + + + + Initializes a new instance of the LevelCollection class + that contains elements copied from the specified array. + + The array whose elements are copied to the new list. + + + + Initializes a new instance of the LevelCollection class + that contains elements copied from the specified collection. + + The collection whose elements are copied to the new list. + + + + Initializes a new instance of the LevelCollection class + that contains elements copied from the specified collection. + + The collection whose elements are copied to the new list. + + + + Type visible only to our subclasses + Used to access protected constructor + + + + + A value + + + + + Allow subclasses to avoid our default constructors + + + + + Gets the number of elements actually contained in the LevelCollection. + + + + + Copies the entire LevelCollection to a one-dimensional + array. + + The one-dimensional array to copy to. + + + + Copies the entire LevelCollection to a one-dimensional + array, starting at the specified index of the target array. + + The one-dimensional array to copy to. + The zero-based index in at which copying begins. + + + + Gets a value indicating whether access to the collection is synchronized (thread-safe). + + false, because the backing type is an array, which is never thread-safe. + + + + Gets an object that can be used to synchronize access to the collection. + + + + + Gets or sets the at the specified index. + + The zero-based index of the element to get or set. + + is less than zero + -or- + is equal to or greater than . + + + + + Adds a to the end of the LevelCollection. + + The to be added to the end of the LevelCollection. + The index at which the value has been added. + + + + Removes all elements from the LevelCollection. + + + + + Creates a shallow copy of the . + + A new with a shallow copy of the collection data. + + + + Determines whether a given is in the LevelCollection. + + The to check for. + true if is found in the LevelCollection; otherwise, false. + + + + Returns the zero-based index of the first occurrence of a + in the LevelCollection. + + The to locate in the LevelCollection. + + The zero-based index of the first occurrence of + in the entire LevelCollection, if found; otherwise, -1. + + + + + Inserts an element into the LevelCollection at the specified index. + + The zero-based index at which should be inserted. + The to insert. + + is less than zero + -or- + is equal to or greater than . + + + + + Removes the first occurrence of a specific from the LevelCollection. + + The to remove from the LevelCollection. + + The specified was not found in the LevelCollection. + + + + + Removes the element at the specified index of the LevelCollection. + + The zero-based index of the element to remove. + + is less than zero + -or- + is equal to or greater than . + + + + + Gets a value indicating whether the collection has a fixed size. + + true if the collection has a fixed size; otherwise, false. The default is false + + + + Gets a value indicating whether the IList is read-only. + + true if the collection is read-only; otherwise, false. The default is false + + + + Returns an enumerator that can iterate through the LevelCollection. + + An for the entire LevelCollection. + + + + Gets or sets the number of elements the LevelCollection can contain. + + + + + Adds the elements of another LevelCollection to the current LevelCollection. + + The LevelCollection whose elements should be added to the end of the current LevelCollection. + The new of the LevelCollection. + + + + Adds the elements of a array to the current LevelCollection. + + The array whose elements should be added to the end of the LevelCollection. + The new of the LevelCollection. + + + + Adds the elements of a collection to the current LevelCollection. + + The collection whose elements should be added to the end of the LevelCollection. + The new of the LevelCollection. + + + + Sets the capacity to the actual number of elements. + + + + + is less than zero + -or- + is equal to or greater than . + + + + + is less than zero + -or- + is equal to or greater than . + + + + + Supports simple iteration over a . + + + + + Initializes a new instance of the Enumerator class. + + + + + + Gets the current element in the collection. + + + + + Advances the enumerator to the next element in the collection. + + + true if the enumerator was successfully advanced to the next element; + false if the enumerator has passed the end of the collection. + + + The collection was modified after the enumerator was created. + + + + + Sets the enumerator to its initial position, before the first element in the collection. + + + + + An evaluator that triggers at a threshold level + + the threshold to trigger at + + + This evaluator will trigger if the level of the event + passed to + is equal to or greater than the + level. + + + Nicko Cadell + + + + An evaluator that triggers at a threshold level + + the threshold to trigger at + + + This evaluator will trigger if the level of the event + passed to + is equal to or greater than the + level. + + + Nicko Cadell + + + + Create a new evaluator using the threshold. + + + + This evaluator will trigger if the level of the event + passed to + is equal to or greater than the + level. + + + + + + the threshold to trigger at + + + The that will cause this evaluator to trigger + + + + This evaluator will trigger if the level of the event + passed to + is equal to or greater than the + level. + + + + + + Is this the triggering event? + + The event to check + This method returns true, if the event level + is equal or higher than the . + Otherwise it returns false + + + + Maps between string name and Level object. + + + + This mapping is held separately for each . + The level name is case-insensitive. + + + Nicko Cadell + + + + Mapping from level name to Level object. The + level name is case-insensitive + + + + + Clear the internal maps of all levels + + + + Clear the internal maps of all levels + + + + + + Looks up a by name + + The name of the Level to look up. + A Level from the map with the name specified, or null if none is found. + + + + Creates a new Level and adds it to the map. + + the string to display for the Level + the level value to give to the Level + + + + + Creates a new Level and adds it to the map. + + the string to display for the Level + the level value to give to the Level + the display name to give to the Level + + + + Adds a Level to the map. + + the Level to add + + + + Gets all possible levels as a collection of Level objects. + + + + + Looks up a named level from the map. + + + The name of the level to look up is taken from this level. + If the level is not set in the map then this level is added. + If no level with the specified name is found then the + argument is added to the level map + and returned. + + the level in the map with the name specified + + + + The internal representation of caller location information. + + + + This class uses the System.Diagnostics.StackTrace class to generate + a call stack. The caller's information is then extracted from this stack. + + + The System.Diagnostics.StackTrace class is not supported on the + .NET Compact Framework 1.0 therefore caller location information is not + available on that framework. + + + The System.Diagnostics.StackTrace class has this to say about Release builds: + + + "StackTrace information will be most informative with Debug build configurations. + By default, Debug builds include debug symbols, while Release builds do not. The + debug symbols contain most of the file, method name, line number, and column + information used in constructing StackFrame and StackTrace objects. StackTrace + might not report as many method calls as expected, due to code transformations + that occur during optimization." + + + This means that in a Release build the caller information may be incomplete or may + not exist at all! Therefore caller location information cannot be relied upon in a Release build. + + + Nicko Cadell + Gert Driesen + + + + Constructor + + The declaring type of the method that is + the stack boundary into the logging system for this call. + + + Initializes a new instance of the + class based on the current thread. + + + + + + Constructor + + The fully qualified class name. + The method name. + The file name. + The line number of the method within the file. + + + Initializes a new instance of the + class with the specified data. + + + + + + Serialization constructor + + The that holds the serialized object data. + The that contains contextual information about the source or destination. + + + Initializes a new instance of the class + with serialized data. + + + + + + Gets the fully qualified class name of the caller making the logging + request. + + + + + Gets the file name of the caller. + + + + + Gets the line number of the caller. + + + + + Gets the method name of the caller. + + + + + Gets all available caller information + + + All available caller information, in the format + fully.qualified.classname.of.caller.methodName(Filename:line) + + + + + Gets the stack frames from the stack trace of the caller making the log request + + + + + Serializes this object into the provided. + + The to populate with data. + The destination for this serialization. + + + + The fully qualified type of the LocationInfo class. + + + Used by the internal logger to record the Type of the + log message. + + + + + When location information is not available the constant + NA is returned. Current value of this string + constant is ?. + + + + + Exception base type for log4net. + + + + This type extends . It + does not add any new functionality but does differentiate the + type of exception being thrown. + + + Nicko Cadell + Gert Driesen + + + + Constructor + + + + Initializes a new instance of the class. + + + + + + Constructor + + A message to include with the exception. + + + Initializes a new instance of the class with + the specified message. + + + + + + Constructor + + A message to include with the exception. + A nested exception to include. + + + Initializes a new instance of the class + with the specified message and inner exception. + + + + + + Serialization constructor + + The that holds the serialized object data about the exception being thrown. + The that contains contextual information about the source or destination. + + + Initializes a new instance of the class + with serialized data. + + + + + + Static manager that controls the creation of repositories + + + + Static manager that controls the creation of repositories + + + This class is used by the wrapper managers (e.g. ) + to provide access to the objects. + + + This manager also holds the that is used to + lookup and create repositories. The selector can be set either programmatically using + the property, or by setting the log4net.RepositorySelector + AppSetting in the applications config file to the fully qualified type name of the + selector to use. + + + Nicko Cadell + Gert Driesen + + + + Hook the shutdown event + + + + On the full .NET runtime, the static constructor hooks up the + AppDomain.ProcessExit and AppDomain.DomainUnload> events. + These are used to shut down the log4net system as the application exits. + + + + + + Register for ProcessExit and DomainUnload events on the AppDomain + + + + This needs to be in a separate method because the events make + a LinkDemand for the ControlAppDomain SecurityPermission. Because + this is a LinkDemand it is demanded at JIT time. Therefore we cannot + catch the exception in the method itself, we have to catch it in the + caller. + + + + + + Return the default instance. + + the repository to lookup in + Return the default instance + + + Gets the for the repository specified + by the argument. + + + + + + Returns the default instance. + + The assembly to use to look up the repository. + The default instance. + + + Returns the default instance. + + + + + + Returns the named logger if it exists. + + The repository to lookup in. + The fully qualified logger name to look for. + + The logger found, or null if the named logger does not exist in the + specified repository. + + + + If the named logger exists (in the specified repository) then it + returns a reference to the logger, otherwise it returns + null. + + + + + + Returns the named logger if it exists. + + The assembly to use to look up the repository. + The fully qualified logger name to look for. + + The logger found, or null if the named logger does not exist in the + specified assembly's repository. + + + + If the named logger exists (in the specified assembly's repository) then it + returns a reference to the logger, otherwise it returns + null. + + + + + + Returns all the currently defined loggers in the specified repository. + + The repository to lookup in. + All the defined loggers. + + + The root logger is not included in the returned array. + + + + + + Returns all the currently defined loggers in the specified assembly's repository. + + The assembly to use to look up the repository. + All the defined loggers. + + + The root logger is not included in the returned array. + + + + + + Retrieves or creates a named logger. + + The repository to lookup in. + The name of the logger to retrieve. + The logger with the name specified. + + + Retrieves a logger named as the + parameter. If the named logger already exists, then the + existing instance will be returned. Otherwise, a new instance is + created. + + + By default, loggers do not have a set level but inherit + it from the hierarchy. This is one of the central features of + log4net. + + + + + + Retrieves or creates a named logger. + + The assembly to use to look up the repository. + The name of the logger to retrieve. + The logger with the name specified. + + + Retrieves a logger named as the + parameter. If the named logger already exists, then the + existing instance will be returned. Otherwise, a new instance is + created. + + + By default, loggers do not have a set level but inherit + it from the hierarchy. This is one of the central features of + log4net. + + + + + + Shorthand for . + + The repository to lookup in. + The of which the fullname will be used as the name of the logger to retrieve. + The logger with the name specified. + + + Gets the logger for the fully qualified name of the type specified. + + + + + + Shorthand for . + + the assembly to use to look up the repository + The of which the fullname will be used as the name of the logger to retrieve. + The logger with the name specified. + + + Gets the logger for the fully qualified name of the type specified. + + + + + + Shuts down the log4net system. + + + + Calling this method will safely close and remove all + appenders in all the loggers including root contained in all the + default repositories. + + + Some appenders need to be closed before the application exists. + Otherwise, pending logging events might be lost. + + + The shutdown method is careful to close nested + appenders before closing regular appenders. This allows + configurations where a regular appender is attached to a logger + and again to a nested appender. + + + + + + Shuts down the repository for the repository specified. + + The repository to shut down. + + + Calling this method will safely close and remove all + appenders in all the loggers including root contained in the + repository for the specified. + + + Some appenders need to be closed before the application exists. + Otherwise, pending logging events might be lost. + + + The shutdown method is careful to close nested + appenders before closing regular appenders. This allows + configurations where a regular appender is attached to a logger + and again to a nested appender. + + + + + + Shuts down the repository for the repository specified. + + The assembly to use to look up the repository. + + + Calling this method will safely close and remove all + appenders in all the loggers including root contained in the + repository for the repository. The repository is looked up using + the specified. + + + Some appenders need to be closed before the application exists. + Otherwise, pending logging events might be lost. + + + The shutdown method is careful to close nested + appenders before closing regular appenders. This allows + configurations where a regular appender is attached to a logger + and again to a nested appender. + + + + + + Resets all values contained in this repository instance to their defaults. + + The repository to reset. + + + Resets all values contained in the repository instance to their + defaults. This removes all appenders from all loggers, sets + the level of all non-root loggers to null, + sets their additivity flag to true and sets the level + of the root logger to . Moreover, + message disabling is set its default "off" value. + + + + + + Resets all values contained in this repository instance to their defaults. + + The assembly to use to look up the repository to reset. + + + Resets all values contained in the repository instance to their + defaults. This removes all appenders from all loggers, sets + the level of all non-root loggers to null, + sets their additivity flag to true and sets the level + of the root logger to . Moreover, + message disabling is set its default "off" value. + + + + + + Creates a repository with the specified name. + + The name of the repository, this must be unique amongst repositories. + The created for the repository. + + + Creates the default type of which is a + object. + + + The name must be unique. Repositories cannot be redefined. + An will be thrown if the repository already exists. + + + The specified repository already exists. + + + + Creates a repository with the specified name and repository type. + + The name of the repository, this must be unique to the repository. + A that implements + and has a no arg constructor. An instance of this type will be created to act + as the for the repository specified. + The created for the repository. + + + The name must be unique. Repositories cannot be redefined. + An Exception will be thrown if the repository already exists. + + + The specified repository already exists. + + + + Creates a repository for the specified assembly and repository type. + + The assembly to use to get the name of the repository. + A that implements + and has a no arg constructor. An instance of this type will be created to act + as the for the repository specified. + The created for the repository. + + + The created will be associated with the repository + specified such that a call to with the + same assembly specified will return the same repository instance. + + + + + + Gets an array of all currently defined repositories. + + An array of all the known objects. + + + Gets an array of all currently defined repositories. + + + + + + Gets or sets the repository selector used by the . + + + The repository selector used by the . + + + + The repository selector () is used by + the to create and select repositories + (). + + + The caller to supplies either a string name + or an assembly (if not supplied the assembly is inferred using + ). + + + This context is used by the selector to look up a specific repository. + + + + + + Internal method to get pertinent version info. + + A string of version info. + + + + Called when the event fires + + the that is exiting + null + + + Called when the event fires. + + + When the event is triggered the log4net system is . + + + + + + Called when the event fires + + the that is exiting + null + + + Called when the event fires. + + + When the event is triggered the log4net system is . + + + + + + The fully qualified type of the LoggerManager class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Implementation of the interface. + + The logger to wrap. + + + This class should be used as the base for all wrapper implementations. + + + Nicko Cadell + Gert Driesen + + + + Implementation of the interface. + + The logger to wrap. + + + This class should be used as the base for all wrapper implementations. + + + Nicko Cadell + Gert Driesen + + + + Gets the implementation behind this wrapper object. + + + The object that this object is implementing. + + + + The Logger object may not be the same object as this object + because of logger decorators. + + + This gets the actual underlying objects that is used to process + the log events. + + + + + + Portable data structure used by + + Nicko Cadell + + + + The logger name. + + + + + Level of logging event. + + + + A null level produces varying results depending on the appenders in use. + In many cases it is equivalent of , other times + it is mapped to Debug or Info defaults. + + + Level cannot be Serializable because it is a flyweight. + Due to its special serialization it cannot be declared final either. + + + + + + The application supplied message. + + + + + Gets or sets the name of the thread in which this logging event was generated. + + + + + Gets or sets the UTC time the event was logged. + + + + + Location information for the caller. + + + + Location information for the caller. + + + + + + String representation of the user + + + + String representation of the user's windows name, like DOMAIN\username + + + + + + String representation of the identity. + + + + String representation of the current thread's principal identity. + + + + + + The string representation of the exception + + + + The string representation of the exception + + + + + + String representation of the AppDomain. + + + + String representation of the AppDomain. + + + + + + Additional event specific properties + + + + A logger or an appender may attach additional + properties to specific events. These properties + have a string key and an object value. + + + + + + The internal representation of logging events. + + + + When an affirmative decision is made to log then a + instance is created. This instance + is passed around to the different log4net components. + + + This class is of concern to those wishing to extend log4net. + + + Some of the values in instances of + are considered volatile, that is the values are correct at the + time the event is delivered to appenders, but will not be consistent + at any time afterward. If an event is to be stored and then processed + at a later time these volatile values must be fixed by setting + . There is a performance penalty + for incurred by calling but it + is essential to maintain data consistency. + + + Nicko Cadell + Gert Driesen + Douglas de la Torre + Daniel Cazzulino + + + + Initializes a new instance of the class + from the supplied parameters. + + The declaring type of the method that is + the stack boundary into the logging system for this call. + The repository this event is logged in. + The name of the logger of this event. + + The level of this event. + A null level produces varying results depending on the appenders in use. + In many cases it is equivalent of , other times + it is mapped to Debug or Info defaults. + + The message of this event. + The exception for this event. + + + Except , and , + all fields of are lazily filled when actually needed. Set + to cache all data locally to prevent inconsistencies. + + This method is called by the log4net framework + to create a logging event. + + + + + + Initializes a new instance of the class + using specific data. + + The declaring type of the method that is + the stack boundary into the logging system for this call. + The repository this event is logged in. + Data used to initialize the logging event. + The fields in the struct that have already been fixed. + + + This constructor is provided to allow a + to be created independently of the log4net framework. This can + be useful if you require a custom serialization scheme. + + + Use the method to obtain an + instance of the class. + + + The parameter should be used to specify which fields in the + struct have been preset. Fields not specified in the + will be captured from the environment if requested or fixed. + + + + + + Initializes a new instance of the class + using specific data. + + The declaring type of the method that is + the stack boundary into the logging system for this call. + The repository this event is logged in. + Data used to initialize the logging event. + + + This constructor is provided to allow a + to be created independently of the log4net framework. This can + be useful if you require a custom serialization scheme. + + + Use the method to obtain an + instance of the class. + + + This constructor sets this objects flags to , + this assumes that all the data relating to this event is passed in via the + parameter and no other data should be captured from the environment. + + + + + + Initializes a new instance of the class + using specific data. + + Data used to initialize the logging event. + + + This constructor is provided to allow a + to be created independently of the log4net framework. This can + be useful if you require a custom serialization scheme. + + + Use the method to obtain an + instance of the class. + + + This constructor sets this objects flags to , + this assumes that all the data relating to this event is passed in via the + parameter and no other data should be captured from the environment. + + + + + + Initializes a new instance of the class. + + + + This constructor is provided to allow deserialization using System.Text.Json + or Newtonsoft.Json. + + + Use the method to obtain an + instance of the class. + + + This constructor sets this objects flags to . + + + + + + Serialization constructor + + The that holds the serialized object data. + The that contains contextual information about the source or destination. + + + Initializes a new instance of the class + with serialized data. + + + + + + Gets the time when the current process started. + + + This is the time when this process started. + + + + The TimeStamp is stored internally in UTC and converted to the local time zone for this computer. + + + Tries to get the start time for the current process. + Failing that it returns the time of the first call to + this property. + + + Note that AppDomains may be loaded and unloaded within the + same process without the process terminating and therefore + without the process start time being reset. + + + + + + Gets the UTC time when the current process started. + + + This is the UTC time when this process started. + + + + Tries to get the start time for the current process. + Failing that it returns the time of the first call to + this property. + + + Note that AppDomains may be loaded and unloaded within the + same process without the process terminating and therefore + without the process start time being reset. + + + + + + Gets the of the logging event. + A null level produces varying results depending on the appenders in use. + In many cases it is equivalent of , other times + it is mapped to Debug or Info defaults. + + + + + Gets the time of the logging event. + + + The time of the logging event. + + + + The TimeStamp is stored in UTC and converted to the local time zone for this computer. + + + + + + Gets UTC the time of the logging event. + + + The UTC time of the logging event. + + + + + Gets the name of the logger that logged the event. + + + + + Gets the location information for this logging event. + + + + The collected information is cached for future use. + + + See the class for more information on + supported frameworks and the different behavior in Debug and + Release builds. + + + + + + Gets the message object used to initialize this event. + + + The message object used to initialize this event. + + + + Gets the message object used to initialize this event. + Note that this event may not have a valid message object. + If the event is serialized the message object will not + be transferred. To get the text of the message the + property must be used + not this property. + + + If there is no defined message object for this event then + null will be returned. + + + + + + Gets the exception object used to initialize this event. + + + The exception object used to initialize this event. + + + + Gets the exception object used to initialize this event. + Note that this event may not have a valid exception object. + If the event is serialized the exception object will not + be transferred. To get the text of the exception the + method must be used + not this property. + + + If there is no defined exception object for this event then + null will be returned. + + + + + + The that this event was created in. + + + + The that this event was created in. + + + + + + Ensure that the repository is set. + + the value for the repository + + + + Gets the message, rendered through the . + + + The message rendered through the . + + + + The collected information is cached for future use. + + + + + + Write the rendered message to a TextWriter + + the writer to write the message to + + + Unlike the property this method + does store the message data in the internal cache. Therefore + if called only once this method should be faster than the + property, however if the message is + to be accessed multiple times then the property will be more efficient. + + + + + + Gets the name of the current thread. + + + The name of the current thread, or the thread ID when + the name is not available. + + + + The collected information is cached for future use. + + + + + + Returns a 'meaningful' name for the thread (or its Id) + + Name + Meaningful name + + + + Gets the name of the current user. + + + The name of the current user, or NOT AVAILABLE when the + underlying runtime has no support for retrieving the name of the + current user. + + + + Calls WindowsIdentity.GetCurrent().Name to get the name of + the current windows user. + + + To improve performance, we could cache the string representation of + the name, and reuse that as long as the identity stayed constant. + Once the identity changed, we would need to re-assign and re-render + the string. + + + However, the WindowsIdentity.GetCurrent() call seems to + return different objects every time, so the current implementation + doesn't do this type of caching. + + + Timing for these operations: + + + + Method + Results + + + WindowsIdentity.GetCurrent() + 10000 loops, 00:00:00.2031250 seconds + + + WindowsIdentity.GetCurrent().Name + 10000 loops, 00:00:08.0468750 seconds + + + + This means we could speed things up almost 40 times by caching the + value of the WindowsIdentity.GetCurrent().Name property, since + this takes (8.04-0.20) = 7.84375 seconds. + + + + + + Gets the identity of the current thread principal. + + + + Calls System.Threading.Thread.CurrentPrincipal.Identity.Name to get + the name of the current thread principal. + + + + + + Gets the AppDomain friendly name. + + + + + Additional event specific properties. + + + Additional event specific properties. + + + + A logger or an appender may attach additional + properties to specific events. These properties + have a string key and an object value. + + + This property is for events that have been added directly to + this event. The aggregate properties (which include these + event properties) can be retrieved using + and . + + + Once the properties have been fixed this property + returns the combined cached properties. This ensures that updates to + this property are always reflected in the underlying storage. When + returning the combined properties there may be more keys in the + Dictionary than expected. + + + + + + Gets the fixed fields in this event, or on set, fixes fields specified in the value. + + + + Fields will not be fixed if they have previously been fixed. + It is not possible to 'unfix' a field. + + + + + + Serializes this object into the provided. + + The to populate with data. + The destination for this serialization. + + + The data in this event must be fixed before it can be serialized. + + + The property must be set during the + method call if this event + is to be used outside that method. + + + + + + Gets the portable data for this . + + The for this event. + + + A new can be constructed using a + instance. + + + Does a fix of the data + in the logging event before returning the event data. + + + + + + Gets the portable data for this . + + The set of data to ensure is fixed in the LoggingEventData + The for this event. + + + A new can be constructed using a + instance. + + + + + + Returns this event's exception's rendered using the + . + + + This event's exception's rendered using the . + + + + Returns this event's exception's rendered using the + . + + + + + + Fix the fields specified by the parameter + + the fields to fix + + + Only fields specified in the will be fixed. + Fields will not be fixed if they have previously been fixed. + It is not possible to 'unfix' a field. + + + + + + Looks up a composite property in this event + + the key for the property to lookup + the value for the property + + + This event has composite properties that combine properties from + several different contexts in the following order: + + + this event's properties + + This event has that can be set. These + properties are specific to this event only. + + + + the thread properties + + The that are set on the current + thread. These properties are shared by all events logged on this thread. + + + + the global properties + + The that are set globally. These + properties are shared by all the threads in the AppDomain. + + + + + + + + + Get all the composite properties in this event + + the containing all the properties + + + See for details of the composite properties + stored by the event. + + + This method returns a single containing all the + properties defined for this event. + + + + + + The internal logging event data. + + + + + Location information for the caller. + + + + + The internal logging event data. + + + + + The internal logging event data. + + + + + The fully qualified Type of the calling + logger class in the stack frame (i.e. the declaring type of the method). + + + + + The fix state for this event + + + These flags indicate which fields have been fixed. + Not serialized. + + + + + Indicated that the internal cache is updateable (ie not fixed) + + + This is a separate flag to fixFlags as it allows incremental fixing and simpler + changes in the caching strategy. + + + + + The key into the Properties map for the host name value. + + + + + The key into the Properties map for the thread identity value. + + + + + The key into the Properties map for the user name value. + + + + + Implementation of wrapper interface. + + + + This implementation of the interface + forwards to the held by the base class. + + + This logger has methods to allow the caller to log at the following + levels: + + + + DEBUG + + The and methods log messages + at the DEBUG level. That is the level with that name defined in the + repositories . The default value + for this level is . The + property tests if this level is enabled for logging. + + + + INFO + + The and methods log messages + at the INFO level. That is the level with that name defined in the + repositories . The default value + for this level is . The + property tests if this level is enabled for logging. + + + + WARN + + The and methods log messages + at the WARN level. That is the level with that name defined in the + repositories . The default value + for this level is . The + property tests if this level is enabled for logging. + + + + ERROR + + The and methods log messages + at the ERROR level. That is the level with that name defined in the + repositories . The default value + for this level is . The + property tests if this level is enabled for logging. + + + + FATAL + + The and methods log messages + at the FATAL level. That is the level with that name defined in the + repositories . The default value + for this level is . The + property tests if this level is enabled for logging. + + + + + The values for these levels and their semantic meanings can be changed by + configuring the for the repository. + + + Nicko Cadell + Gert Driesen + + + + Construct a new wrapper for the specified logger. + + The logger to wrap. + + + Construct a new wrapper for the specified logger. + + + + + + Virtual method called when the configuration of the repository changes + + the repository holding the levels + + + Virtual method called when the configuration of the repository changes + + + + + + Logs a message object with the DEBUG level. + + The message object to log. + + + This method first checks if this logger is DEBUG + enabled by comparing the level of this logger with the + DEBUG level. If this logger is + DEBUG enabled, then it converts the message object + (passed as parameter) to a string by invoking the appropriate + . It then + proceeds to call all the registered appenders in this logger + and also higher in the hierarchy depending on the value of the + additivity flag. + + + WARNING Note that passing an + to this method will print the name of the + but no stack trace. To print a stack trace use the + form instead. + + + + + + Logs a message object with the DEBUG level + + The message object to log. + The exception to log, including its stack trace. + + + Logs a message object with the DEBUG level including + the stack trace of the passed + as a parameter. + + + See the form for more detailed information. + + + + + + + Logs a formatted message string with the DEBUG level. + + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the DEBUG level. + + A String containing zero or more format items + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the DEBUG level. + + A String containing zero or more format items + An Object to format + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the DEBUG level. + + A String containing zero or more format items + An Object to format + An Object to format + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the DEBUG level. + + An that supplies culture-specific formatting information + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a message object with the INFO level. + + The message object to log. + + + This method first checks if this logger is INFO + enabled by comparing the level of this logger with the + INFO level. If this logger is + INFO enabled, then it converts the message object + (passed as parameter) to a string by invoking the appropriate + . It then + proceeds to call all the registered appenders in this logger + and also higher in the hierarchy depending on the value of + the additivity flag. + + + WARNING Note that passing an + to this method will print the name of the + but no stack trace. To print a stack trace use the + form instead. + + + + + + Logs a message object with the INFO level. + + The message object to log. + The exception to log, including its stack trace. + + + Logs a message object with the INFO level including + the stack trace of the + passed as a parameter. + + + See the form for more detailed information. + + + + + + + Logs a formatted message string with the INFO level. + + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the INFO level. + + A String containing zero or more format items + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the INFO level. + + A String containing zero or more format items + An Object to format + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the INFO level. + + A String containing zero or more format items + An Object to format + An Object to format + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the INFO level. + + An that supplies culture-specific formatting information + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a message object with the WARN level. + + the message object to log + + + This method first checks if this logger is WARN + enabled by comparing the level of this logger with the + WARN level. If this logger is + WARN enabled, then it converts the message object + (passed as parameter) to a string by invoking the appropriate + . It then + proceeds to call all the registered appenders in this logger and + also higher in the hierarchy depending on the value of the + additivity flag. + + + WARNING Note that passing an to this + method will print the name of the but no + stack trace. To print a stack trace use the + form instead. + + + + + + Logs a message object with the WARN level + + The message object to log. + The exception to log, including its stack trace. + + + Logs a message object with the WARN level including + the stack trace of the + passed as a parameter. + + + See the form for more detailed information. + + + + + + + Logs a formatted message string with the WARN level. + + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the WARN level. + + A String containing zero or more format items + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the WARN level. + + A String containing zero or more format items + An Object to format + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the WARN level. + + A String containing zero or more format items + An Object to format + An Object to format + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the WARN level. + + An that supplies culture-specific formatting information + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a message object with the ERROR level. + + The message object to log. + + + This method first checks if this logger is ERROR + enabled by comparing the level of this logger with the + ERROR level. If this logger is + ERROR enabled, then it converts the message object + (passed as parameter) to a string by invoking the appropriate + . It then + proceeds to call all the registered appenders in this logger and + also higher in the hierarchy depending on the value of the + additivity flag. + + + WARNING Note that passing an to this + method will print the name of the but no + stack trace. To print a stack trace use the + form instead. + + + + + + Logs a message object with the ERROR level + + The message object to log. + The exception to log, including its stack trace. + + + Logs a message object with the ERROR level including + the stack trace of the + passed as a parameter. + + + See the form for more detailed information. + + + + + + + Logs a formatted message string with the ERROR level. + + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the ERROR level. + + A String containing zero or more format items + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the ERROR level. + + A String containing zero or more format items + An Object to format + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the ERROR level. + + A String containing zero or more format items + An Object to format + An Object to format + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the ERROR level. + + An that supplies culture-specific formatting information + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a message object with the FATAL level. + + The message object to log. + + + This method first checks if this logger is FATAL + enabled by comparing the level of this logger with the + FATAL level. If this logger is + FATAL enabled, then it converts the message object + (passed as parameter) to a string by invoking the appropriate + . It then + proceeds to call all the registered appenders in this logger and + also higher in the hierarchy depending on the value of the + additivity flag. + + + WARNING Note that passing an to this + method will print the name of the but no + stack trace. To print a stack trace use the + form instead. + + + + + + Logs a message object with the FATAL level + + The message object to log. + The exception to log, including its stack trace. + + + Logs a message object with the FATAL level including + the stack trace of the + passed as a parameter. + + + See the form for more detailed information. + + + + + + + Logs a formatted message string with the FATAL level. + + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the FATAL level. + + A String containing zero or more format items + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the FATAL level. + + A String containing zero or more format items + An Object to format + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the FATAL level. + + A String containing zero or more format items + An Object to format + An Object to format + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the FATAL level. + + An that supplies culture-specific formatting information + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Checks if this logger is enabled for the DEBUG + level. + + + true if this logger is enabled for DEBUG events, + false otherwise. + + + + This function is intended to lessen the computational cost of + disabled log debug statements. + + + For some log Logger object, when you write: + + + log.Debug("This is entry number: " + i ); + + + You incur the cost constructing the message, concatenation in + this case, regardless of whether the message is logged or not. + + + If you are worried about speed, then you should write: + + + if (log.IsDebugEnabled()) + { + log.Debug("This is entry number: " + i ); + } + + + This way you will not incur the cost of parameter + construction if debugging is disabled for log. On + the other hand, if the log is debug enabled, you + will incur the cost of evaluating whether the logger is debug + enabled twice. Once in IsDebugEnabled and once in + the Debug. This is an insignificant overhead + since evaluating a logger takes about 1% of the time it + takes to actually log. + + + + + + Checks if this logger is enabled for the INFO level. + + + true if this logger is enabled for INFO events, + false otherwise. + + + + See for more information and examples + of using this method. + + + + + + + Checks if this logger is enabled for the WARN level. + + + true if this logger is enabled for WARN events, + false otherwise. + + + + See for more information and examples + of using this method. + + + + + + + Checks if this logger is enabled for the ERROR level. + + + true if this logger is enabled for ERROR events, + false otherwise. + + + + See for more information and examples of using this method. + + + + + + + Checks if this logger is enabled for the FATAL level. + + + true if this logger is enabled for FATAL events, + false otherwise. + + + + See for more information and examples of using this method. + + + + + + + Event handler for the event + + the repository + Empty + + + + The fully qualified name of this declaring type not the type of any subclass. + + + + + Used to ensure 'params object?[]?' arguments that receive a null are converted + to an array of one null value so that 'XxxFormat("{0}", null)' will work correctly. + Overloads like 'XxxFormat(message, object? arg0)' are not matched by the compiler in this case. + + + + + provides method information without actually referencing a System.Reflection.MethodBase + as that would require that the containing assembly is loaded. + + + + + + constructs a method item for an unknown method. + + + + + constructs a method item from the name of the method. + + + + + + constructs a method item from the name of the method and its parameters. + + + + + + + constructs a method item from a method base by determining the method name and its parameters. + + + + + + Gets the method name of the caller making the logging request. + + + + + Gets the method parameters of the caller making the logging request. + + + + + The fully qualified type of the StackFrameItem class. + + + Used by the internal logger to record the Type of the + log message. + + + + + When location information is not available the constant + NA is returned. Current value of this string + constant is ?. + + + + + A SecurityContext used by log4net when interacting with protected resources + + + + A SecurityContext used by log4net when interacting with protected resources + for example with operating system services. This can be used to impersonate + a principal that has been granted privileges on the system resources. + + + Nicko Cadell + + + + Impersonate this SecurityContext + + State supplied by the caller + An instance that will + revoke the impersonation of this SecurityContext, or null + + + Impersonate this security context. Further calls on the current + thread should now be made in the security context provided + by this object. When the result + method is called the security + context of the thread should be reverted to the state it was in + before was called. + + + + + + The providers default instances. + + + + A configured component that interacts with potentially protected system + resources uses a to provide the elevated + privileges required. If the object has + been not been explicitly provided to the component then the component + will request one from this . + + + By default the is + an instance of which returns only + objects. This is a reasonable default + where the privileges required are not know by the system. + + + This default behavior can be overridden by subclassing the + and overriding the method to return + the desired objects. The default provider + can be replaced by programmatically setting the value of the + property. + + + An alternative is to use the log4net.Config.SecurityContextProviderAttribute + This attribute can be applied to an assembly in the same way as the + log4net.Config.XmlConfiguratorAttribute". The attribute takes + the type to use as the as an argument. + + + Nicko Cadell + + + + The default provider + + + + + Gets or sets the default SecurityContextProvider + + + The default SecurityContextProvider + + + + The default provider is used by configured components that + require a and have not had one + given to them. + + + By default this is an instance of + that returns objects. + + + The default provider can be set programmatically by setting + the value of this property to a sub class of + that has the desired behavior. + + + + + + Protected default constructor to allow subclassing + + + + Protected default constructor to allow subclassing + + + + + + Create a SecurityContext for a consumer + + The consumer requesting the SecurityContext + An impersonation context + + + The default implementation is to return a . + + + Subclasses should override this method to provide their own + behavior. + + + + + + Provides stack frame information without actually referencing a System.Diagnostics.StackFrame + as that would require that the containing assembly is loaded. + + + + + Creates a stack frame item from a stack frame. + + + + + + Gets the fully qualified class name of the caller making the logging + request. + + + + + Gets the file name of the caller. + + + + + Gets the line number of the caller. + + + + + Gets the method name of the caller. + + + + + Gets all available caller information in the format + fully.qualified.classname.of.caller.methodName(Filename:line) + + + + + The fully qualified type of the StackFrameItem class. + + + Used by the internal logger to record the Type of the + log message. + + + + + When location information is not available the constant + NA is returned. Current value of this string + constant is ?. + + + + + An evaluator that triggers after specified number of seconds. + + + The time threshold in seconds to trigger after. + Zero means it won't trigger at all. + + + + This evaluator will trigger if the specified time period + has passed since last check. + + + Robert Sevcik + + + + An evaluator that triggers after specified number of seconds. + + + The time threshold in seconds to trigger after. + Zero means it won't trigger at all. + + + + This evaluator will trigger if the specified time period + has passed since last check. + + + Robert Sevcik + + + + The UTC time of last check. This gets updated when the object is created and when the evaluator triggers. + + + + + The default time threshold for triggering in seconds. Zero means it won't trigger at all. + + + + + Create a new evaluator using the time threshold in seconds. + + + + Create a new evaluator using the time threshold in seconds. + + + This evaluator will trigger if the specified time period + has passed since last check. + + + + + + The time threshold in seconds to trigger after + + + The time threshold in seconds to trigger after. + Zero means it won't trigger at all. + + + + This evaluator will trigger if the specified time period + has passed since last check. + + + + + + Is this the triggering event? + + The event to check + This method returns true, if the specified time period + has passed since last check.. + Otherwise it returns false + + + This evaluator will trigger if the specified time period + has passed since last check. + + + + + + Delegate used to handle creation of new wrappers. + + The logger to wrap in a wrapper. + + + Delegate used to handle creation of new wrappers. This delegate + is called from the + method to construct the wrapper for the specified logger. + + + The delegate to use is supplied to the + constructor. + + + + + + Maps between logger objects and wrapper objects. + + + + This class maintains a mapping between objects and + objects. Use the method to + look up the for the specified . + + + New wrapper instances are created by the + method. The default behavior is for this method to delegate construction + of the wrapper to the delegate supplied + to the constructor. This allows specialization of the behavior without + requiring subclassing of this type. + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the + + The handler to use to create the wrapper objects. + + + Initializes a new instance of the class with + the specified handler to create the wrapper objects. + + + + + + Gets the wrapper object for the specified logger. + + The wrapper object for the specified logger + + + If the logger is null then the corresponding wrapper is null. + + + Looks up the wrapper it has previously been requested and + returns it. If the wrapper has never been requested before then + the virtual method is + called. + + + + + + Gets the map of logger repositories. + + + Map of logger repositories. + + + + Gets the hashtable that is keyed on . The + values are hashtables keyed on with the + value being the corresponding . + + + + + + Creates the wrapper object for the specified logger. + + The logger to wrap in a wrapper. + The wrapper object for the logger. + + + This implementation uses the + passed to the constructor to create the wrapper. This method + can be overridden in a subclass. + + + + + + Called when a monitored repository shutdown event is received. + + The that is shutting down + + + This method is called when a that this + is holding loggers for has signaled its shutdown + event . The default + behavior of this method is to release the references to the loggers + and their wrappers generated for this repository. + + + + + + Event handler for repository shutdown event. + + The sender of the event. + The event args. + + + + The handler to use to create the extension wrapper objects. + + + + + Internal reference to the delegate used to register for repository shutdown events. + + + + + Formats a as "HH:mm:ss,fff". + + + + Formats a in the format "HH:mm:ss,fff" for example, "15:49:37,459". + + + Nicko Cadell + Gert Driesen + + + + Renders the date into a string. Format is "HH:mm:ss". + + The date to render into a string. + The string builder to write to. + + + Subclasses should override this method to render the date + into a string using a precision up to the second. This method + will be called at most once per second and the result will be + reused if it is needed again during the same second. + + + + + + Renders the date into a string. Format is "HH:mm:ss,fff". + + The date to render into a string. + The writer to write to. + + + Uses the method to generate the + time string up to the seconds and then appends the current + milliseconds. The results from are + cached and is called at most once + per second. + + + Subclasses should override + rather than . + + + + + + String constant used to specify AbsoluteTimeDateFormat in layouts. Current value is ABSOLUTE. + + + + + String constant used to specify DateTimeDateFormat in layouts. Current value is DATE. + + + + + String constant used to specify ISO8601DateFormat in layouts. Current value is ISO8601. + + + + + Last stored time with precision up to the second. + + + + + Last stored time with precision up to the second, formatted + as a string. + + + + + Formats a as "dd MMM yyyy HH:mm:ss,fff" + + + + Formats a in the format + "dd MMM yyyy HH:mm:ss,fff" for example, + "06 Nov 1994 15:49:37,459". + + + Nicko Cadell + Gert Driesen + Angelika Schnagl + + + + Formats the date without the milliseconds part + + The date to format. + The string builder to write to. + + + Formats a DateTime in the format "dd MMM yyyy HH:mm:ss" + for example, "06 Nov 1994 15:49:37". + + + The base class will append the ",fff" milliseconds section. + This method will only be called at most once per second. + + + + + + Render a as a string. + + + + Interface to abstract the rendering of a + instance into a string. + + + The method is used to render the + date to a text writer. + + + Nicko Cadell + Gert Driesen + + + + Formats the specified date as a string. + + The date to format. + The writer to write to. + + + Format the as a string and write it + to the provided. + + + + + + Formats the as "yyyy-MM-dd HH:mm:ss,fff". + + + + Formats the specified as a string: "yyyy-MM-dd HH:mm:ss,fff". + + + Nicko Cadell + Gert Driesen + + + + Formats the date without the milliseconds part + + The date to format. + The string builder to write to. + + + Formats the date specified as a string: "yyyy-MM-dd HH:mm:ss". + + + The base class will append the ",fff" milliseconds section. + This method will only be called at most once per second. + + + + + + Formats the using the method. + + + + Formats the using the method. + + + Nicko Cadell + Gert Driesen + The format string. + + + + Formats the using the method. + + + + Formats the using the method. + + + Nicko Cadell + Gert Driesen + The format string. + + + + Formats the date using . + + The date to convert to a string. + The writer to write to. + + + Uses the date format string supplied to the constructor to call + the method to format the date. + + + + + + This filter drops all . + + + + You can add this filter to the end of a filter chain to + switch from the default "accept all unless instructed otherwise" + filtering behavior to a "deny all unless instructed otherwise" + behavior. + + + Nicko Cadell + Gert Driesen + + + + Always returns . + + the LoggingEvent to filter + Always returns + + + Ignores the event being logged and just returns + . This can be used to change the default filter + chain behavior from to . This filter + should only be used as the last filter in the chain + as any further filters will be ignored! + + + + + + The return result from + + + + The return result from + + + + + + The log event must be dropped immediately without + consulting with the remaining filters, if any, in the chain. + + + + + This filter is neutral with respect to the log event. + The remaining filters, if any, should be consulted for a final decision. + + + + + The log event must be logged immediately without + consulting with the remaining filters, if any, in the chain. + + + + + Subclass this type to implement customized logging event filtering + + + + Users should extend this class to implement customized logging + event filtering. Note that and + , the parent class of all standard + appenders, have built-in filtering rules. It is suggested that you + first use and understand the built-in rules before rushing to write + your own custom filters. + + + This abstract class assumes and also imposes that filters be + organized in a linear chain. The + method of each filter is called sequentially, in the order of their + addition to the chain. + + + The method must return one + of the integer constants , + or . + + + If the value is returned, then the log event is dropped + immediately without consulting with the remaining filters. + + + If the value is returned, then the next filter + in the chain is consulted. If there are no more filters in the + chain, then the log event is logged. Thus, in the presence of no + filters, the default behavior is to log all logging events. + + + If the value is returned, then the log + event is logged without consulting the remaining filters. + + + The philosophy of log4net filters is largely inspired from the + Linux ipchains. + + + Nicko Cadell + Gert Driesen + + + + Initialize the filter with the options set + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + Typically filter's options become active immediately on set, + however this method must still be called. + + + + + + Decide if the should be logged through an appender. + + The to decide upon + The decision of the filter + + + If the decision is , then the event will be + dropped. If the decision is , then the next + filter, if any, will be invoked. If the decision is then + the event will be logged without consulting with other filters in + the chain. + + + This method is marked abstract and must be implemented + in a subclass. + + + + + + Gets or sets the next filter in the filter chain. + + + + Filters are typically composed into chains. This property allows the next filter in + the chain to be accessed. + + + + + + Implement this interface to provide customized logging event filtering + + + + Users should implement this interface to implement customized logging + event filtering. Note that and + , the parent class of all standard + appenders, have built-in filtering rules. It is suggested that you + first use and understand the built-in rules before rushing to write + your own custom filters. + + + This abstract class assumes and also imposes that filters be + organized in a linear chain. The + method of each filter is called sequentially, in the order of their + addition to the chain. + + + The method must return one + of the integer constants , + or . + + + If the value is returned, then the log event is dropped + immediately without consulting with the remaining filters. + + + If the value is returned, then the next filter + in the chain is consulted. If there are no more filters in the + chain, then the log event is logged. Thus, in the presence of no + filters, the default behavior is to log all logging events. + + + If the value is returned, then the log + event is logged without consulting the remaining filters. + + + The philosophy of log4net filters is largely inspired from the + Linux ipchains. + + + Nicko Cadell + Gert Driesen + + + + Decide if the logging event should be logged through an appender. + + The LoggingEvent to decide upon + The decision of the filter + + + If the decision is , then the event will be + dropped. If the decision is , then the next + filter, if any, will be invoked. If the decision is then + the event will be logged without consulting with other filters in + the chain. + + + + + + Gets or sets the next filter in the chain. + + + + Filters are typically composed into chains. This property allows the next filter in + the chain to be accessed. + + + + + + This is a very simple filter based on matching. + + + + The filter admits two options and + . If there is an exact match between the value + of the option and the of the + , then the method returns in + case the option value is set + to true, if it is false then + is returned. If the does not match then + the result will be . + + + Nicko Cadell + Gert Driesen + + + + when matching + + + + The property is a flag that determines + the behavior when a matching is found. If the + flag is set to true then the filter will the + logging event, otherwise it will the event. + + + The default is true i.e. to the event. + + + + + + The that the filter will match + + + + The level that this filter will attempt to match against the + level. If a match is found then + the result depends on the value of . + + + + + + Tests if the of the logging event matches that of the filter + + the event to filter + see remarks + + + If the of the event matches the level of the + filter then the result of the function depends on the + value of . If it is true then + the function will return , it it is false then it + will return . If the does not match then + the result will be . + + + + + + This is a simple filter based on matching. + + + + The filter admits three options and + that determine the range of priorities that are matched, and + . If there is a match between the range + of priorities and the of the , then the + method returns in case the + option value is set to true, if it is false + then is returned. If there is no match, is returned. + + + Nicko Cadell + Gert Driesen + + + + when matching and + + + + The property is a flag that determines + the behavior when a matching is found. If the + flag is set to true then the filter will the + logging event, otherwise it will the event. + + + The default is true i.e. to the event. + + + + + + Set the minimum matched + + + + The minimum level that this filter will attempt to match against the + level. If a match is found then + the result depends on the value of . + + + + + + Sets the maximum matched + + + + The maximum level that this filter will attempt to match against the + level. If a match is found then + the result depends on the value of . + + + + + + Check if the event should be logged. + + the logging event to check + see remarks + + + If the of the logging event is outside the range + matched by this filter then + is returned. If the is matched then the value of + is checked. If it is true then + is returned, otherwise + is returned. + + + + + + Simple filter to match a string in the event's logger name. + + + + The works very similar to the . It admits two + options and . If the + of the starts + with the value of the option, then the + method returns in + case the option value is set to true, + if it is false then is returned. + + + Daniel Cazzulino + + + + when matching + + + + The property is a flag that determines + the behavior when a matching is found. If the + flag is set to true then the filter will the + logging event, otherwise it will the event. + + + The default is true i.e. to the event. + + + + + + The that the filter will match + + + + This filter will attempt to match this value against logger name in + the following way. The match will be done against the beginning of the + logger name (using ). The match is + case sensitive. If a match is found then + the result depends on the value of . + + + + + + Check if this filter should allow the event to be logged + + the event being logged + see remarks + + + The rendered message is matched against the . + If the equals the beginning of + the incoming () + then a match will have occurred. If no match occurs + this function will return + allowing other filters to check the event. If a match occurs then + the value of is checked. If it is + true then is returned otherwise + is returned. + + + + + + Simple filter to match a keyed string in the + + + + Simple filter to match a keyed string in the + + + As the MDC has been replaced with layered properties the + should be used instead. + + + Nicko Cadell + Gert Driesen + + + + Simple filter to match a string in the + + + + Simple filter to match a string in the + + + As the NDC has been replaced with named stacks stored in the + properties collections the should + be used instead. + + + Nicko Cadell + Gert Driesen + + + + Default constructor + + + + Sets the to "NDC". + + + + + + Simple filter to match a string an event property + + + + Simple filter to match a string in the value for a + specific event property + + + Nicko Cadell + + + + The key to lookup in the event properties and then match against. + + + + The key name to use to lookup in the properties map of the + . The match will be performed against + the value of this property if it exists. + + + + + + Check if this filter should allow the event to be logged + + the event being logged + see remarks + + + The event property for the is matched against + the . + If the occurs as a substring within + the property value then a match will have occurred. If no match occurs + this function will return + allowing other filters to check the event. If a match occurs then + the value of is checked. If it is + true then is returned otherwise + is returned. + + + + + + Simple filter to match a string in the rendered message. + + Nicko Cadell + Gert Driesen + + + + A regex object to match (generated from m_stringRegexToMatch) + + + + + Initialize and precompile the Regex if required + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + when matching or + + + + The property is a flag that determines + the behavior when a matching is found. If the + flag is set to true then the filter will the + logging event, otherwise it will the event. + + + The default is true i.e. to the event. + + + + + + Sets the static string to match + + + + The string that will be substring matched against + the rendered message. If the message contains this + string then the filter will match. If a match is found then + the result depends on the value of . + + + One of or + must be specified. + + + + + + Sets the regular expression to match + + + + The regular expression pattern that will be matched against + the rendered message. If the message matches this + pattern then the filter will match. If a match is found then + the result depends on the value of . + + + One of or + must be specified. + + + + + + Check if this filter should allow the event to be logged + + the event being logged + see remarks + + + The rendered message is matched against the . + If the occurs as a substring within + the message then a match will have occurred. If no match occurs + this function will return + allowing other filters to check the event. If a match occurs then + the value of is checked. If it is + true then is returned otherwise + is returned. + + + + + + The log4net Global Context. + + + + The GlobalContext provides a location for global debugging + information to be stored. + + + The global context has a properties map and these properties can + be included in the output of log messages. The + supports selecting and outputing these properties. + + + By default the log4net:HostName property is set to the name of + the current machine. + + + + + GlobalContext.Properties["hostname"] = Environment.MachineName; + + + + Nicko Cadell + + + + The global properties map. + + + + + The ILog interface is use by application to log messages into + the log4net framework. + + + + Use the to obtain logger instances + that implement this interface. The + static method is used to get logger instances. + + + This class contains methods for logging at different levels and also + has properties for determining if those logging levels are + enabled in the current configuration. + + + This interface can be implemented in different ways. This documentation + specifies reasonable behavior that a caller can expect from the actual + implementation, however different implementations reserve the right to + do things differently. + + + Simple example of logging messages + + ILog log = LogManager.GetLogger("application-log"); + + log.Info("Application Start"); + log.Debug("This is a debug message"); + + if (log.IsDebugEnabled) + { + log.Debug("This is another debug message"); + } + + + + + Nicko Cadell + Gert Driesen + + + Log a message object with the level. + + Logs a message object with the level. + + The message object to log. + + + This method first checks if this logger is DEBUG + enabled by comparing the level of this logger with the + level. If this logger is + DEBUG enabled, then it converts the message object + (passed as parameter) to a string by invoking the appropriate + . It then + proceeds to call all the registered appenders in this logger + and also higher in the hierarchy depending on the value of + the additivity flag. + + WARNING Note that passing an + to this method will print the name of the + but no stack trace. To print a stack trace use the + form instead. + + + + + + + + Log a message object with the level including + the stack trace of the passed + as a parameter. + + The message object to log. + The exception to log, including its stack trace. + + + See the form for more detailed information. + + + + + + + Log a formatted string with the level. + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + An that supplies culture-specific formatting information + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + Log a message object with the level. + + Logs a message object with the level. + + + + This method first checks if this logger is INFO + enabled by comparing the level of this logger with the + level. If this logger is + INFO enabled, then it converts the message object + (passed as parameter) to a string by invoking the appropriate + . It then + proceeds to call all the registered appenders in this logger + and also higher in the hierarchy depending on the value of the + additivity flag. + + WARNING Note that passing an + to this method will print the name of the + but no stack trace. To print a stack trace use the + form instead. + + + The message object to log. + + + + + + Logs a message object with the INFO level including + the stack trace of the passed + as a parameter. + + The message object to log. + The exception to log, including its stack trace. + + + See the form for more detailed information. + + + + + + + Log a formatted message string with the level. + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + An that supplies culture-specific formatting information + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + Log a message object with the level. + + Log a message object with the level. + + + + This method first checks if this logger is WARN + enabled by comparing the level of this logger with the + level. If this logger is + WARN enabled, then it converts the message object + (passed as parameter) to a string by invoking the appropriate + . It then + proceeds to call all the registered appenders in this logger + and also higher in the hierarchy depending on the value of the + additivity flag. + + WARNING Note that passing an + to this method will print the name of the + but no stack trace. To print a stack trace use the + form instead. + + + The message object to log. + + + + + + Log a message object with the level including + the stack trace of the passed + as a parameter. + + The message object to log. + The exception to log, including its stack trace. + + + See the form for more detailed information. + + + + + + + Log a formatted message string with the level. + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + An that supplies culture-specific formatting information + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + Log a message object with the level. + + Logs a message object with the level. + + The message object to log. + + + This method first checks if this logger is ERROR + enabled by comparing the level of this logger with the + level. If this logger is + ERROR enabled, then it converts the message object + (passed as parameter) to a string by invoking the appropriate + . It then + proceeds to call all the registered appenders in this logger + and also higher in the hierarchy depending on the value of the + additivity flag. + + WARNING Note that passing an + to this method will print the name of the + but no stack trace. To print a stack trace use the + form instead. + + + + + + + + Log a message object with the level including + the stack trace of the passed + as a parameter. + + The message object to log. + The exception to log, including its stack trace. + + + See the form for more detailed information. + + + + + + + Log a formatted message string with the level. + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + An that supplies culture-specific formatting information + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + Log a message object with the level. + + Log a message object with the level. + + + + This method first checks if this logger is FATAL + enabled by comparing the level of this logger with the + level. If this logger is + FATAL enabled, then it converts the message object + (passed as parameter) to a string by invoking the appropriate + . It then + proceeds to call all the registered appenders in this logger + and also higher in the hierarchy depending on the value of the + additivity flag. + + WARNING Note that passing an + to this method will print the name of the + but no stack trace. To print a stack trace use the + form instead. + + + The message object to log. + + + + + + Log a message object with the level including + the stack trace of the passed + as a parameter. + + The message object to log. + The exception to log, including its stack trace. + + + See the form for more detailed information. + + + + + + + Log a formatted message string with the level. + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + An that supplies culture-specific formatting information + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Checks if this logger is enabled for the level. + + + true if this logger is enabled for events, false otherwise. + + + + This function is intended to lessen the computational cost of + disabled log debug statements. + + For some ILog interface log, when you write: + + log.Debug("This is entry number: " + i ); + + + You incur the cost constructing the message, string construction and concatenation in + this case, regardless of whether the message is logged or not. + + + If you are worried about speed (who isn't), then you should write: + + + if (log.IsDebugEnabled) + { + log.Debug("This is entry number: " + i ); + } + + + This way you will not incur the cost of parameter + construction if debugging is disabled for log. On + the other hand, if the log is debug enabled, you + will incur the cost of evaluating whether the logger is debug + enabled twice. Once in and once in + the . This is an insignificant overhead + since evaluating a logger takes about 1% of the time it + takes to actually log. This is the preferred style of logging. + + Alternatively if your logger is available statically then the is debug + enabled state can be stored in a static variable like this: + + + private static readonly bool isDebugEnabled = log.IsDebugEnabled; + + + Then when you come to log you can write: + + + if (isDebugEnabled) + { + log.Debug("This is entry number: " + i ); + } + + + This way the debug enabled state is only queried once + when the class is loaded. Using a private static readonly + variable is the most efficient because it is a run time constant + and can be heavily optimized by the JIT compiler. + + + Of course if you use a static readonly variable to + hold the enabled state of the logger then you cannot + change the enabled state at runtime to vary the logging + that is produced. You have to decide if you need absolute + speed or runtime flexibility. + + + + + + + + Checks if this logger is enabled for the level. + + + true if this logger is enabled for events, false otherwise. + + + For more information see . + + + + + + + + Checks if this logger is enabled for the level. + + + true if this logger is enabled for events, false otherwise. + + + For more information see . + + + + + + + + Checks if this logger is enabled for the level. + + + true if this logger is enabled for events, false otherwise. + + + For more information see . + + + + + + + + Checks if this logger is enabled for the level. + + + true if this logger is enabled for events, false otherwise. + + + For more information see . + + + + + + + + A flexible layout configurable with pattern string that re-evaluates on each call. + + + This class is built on and provides all the + features and capabilities of PatternLayout. PatternLayout is a 'static' class + in that its layout is done once at configuration time. This class will recreate + the layout on each reference. + One important difference between PatternLayout and DynamicPatternLayout is the + treatment of the Header and Footer parameters in the configuration. The Header and Footer + parameters for DynamicPatternLayout must be syntactically in the form of a PatternString, + but should not be marked as type log4net.Util.PatternString. Doing so causes the + pattern to be statically converted at configuration time and causes DynamicPatternLayout + to perform the same as PatternLayout. + Please see for complete documentation. + + <layout type="log4net.Layout.DynamicPatternLayout"> + <param name="Header" value="%newline**** Trace Opened Local: %date{yyyy-MM-dd HH:mm:ss.fff} UTC: %utcdate{yyyy-MM-dd HH:mm:ss.fff} ****%newline" /> + <param name="Footer" value="**** Trace Closed %date{yyyy-MM-dd HH:mm:ss.fff} ****%newline" /> + </layout> + + + + + + The header PatternString + + + + + The footer PatternString + + + + + Constructs a DynamicPatternLayout using the DefaultConversionPattern + + + + The default pattern just produces the application supplied message. + + + + + + Constructs a DynamicPatternLayout using the supplied conversion pattern. + + The pattern to use. + + + + Gets or sets the header for the layout format. + + the layout header + + + The Header text will be appended before any logging events + are formatted and appended. + + The pattern will be formatted on each get operation. + + + + + Gets or sets the footer for the layout format. + + the layout footer + + + The Footer text will be appended after all the logging events + have been formatted and appended. + + The pattern will be formatted on each get operation. + + + + + A Layout that renders only the Exception text from the logging event + + + + This Layout should only be used with appenders that utilize multiple + layouts (e.g. ). + + + Nicko Cadell + Gert Driesen + + + + Constructs an ExceptionLayout. + + + + + Activates component options. + + + + Part of the component activation + framework. + + + This method does nothing as options become effective immediately. + + + + + + Gets the exception text from the logging event + + The TextWriter to write the formatted event to + the event being logged + + + Write the exception string to the . + The exception string is retrieved from . + + + + + + Interface implemented by layout objects + + + + An object is used to format a + as text. The method is called by an + appender to transform the into a string. + + + The layout can also supply and + text that is appender before any events and after all the events respectively. + + + Nicko Cadell + Gert Driesen + + + + Implement this method to create your own layout format. + + The TextWriter to write the formatted event to + The event to format + + + This method is called by an appender to format + the as text and output to a writer. + + + If the caller does not have a and prefers the + event to be formatted as a then the following + code can be used to format the event into a . + + + StringWriter writer = new StringWriter(); + Layout.Format(writer, loggingEvent); + string formattedEvent = writer.ToString(); + + + + + + The content type output by this layout. + + The content type + + + The content type output by this layout. + + + This is a MIME type e.g. "text/plain". + + + + + + The header for the layout format. + + the layout header + + + The Header text will be appended before any logging events + are formatted and appended. + + + + + + The footer for the layout format. + + the layout footer + + + The Footer text will be appended after all the logging events + have been formatted and appended. + + + + + + Flag indicating if this layout handle exceptions + + false if this layout handles exceptions + + + If this layout handles the exception object contained within + , then the layout should return + false. Otherwise, if the layout ignores the exception + object, then the layout should return true. + + + + + + Extensions for + + Jan Friedrich + + + + writes the specified start tag and associates it with the given namespace and prefix + + Writer + The full name of the element + The namespace prefix of the element + The local name of the element + The namespace URI to associate with the element + + + + Creates an XmlWriter + + TextWriter + XmlWriter + + + + Interface for raw layout objects + + + + Interface used to format a + to an object. + + + This interface should not be confused with the + interface. This interface is used in + only certain specialized situations where a raw object is + required rather than a formatted string. The + is not generally useful than this interface. + + + Nicko Cadell + Gert Driesen + + + + Implement this method to create your own layout format. + + The event to format + returns the formatted event + + + Implement this method to create your own layout format. + + + + + + Adapts any to a + + + + Where an is required this adapter + allows a to be specified. + + + Nicko Cadell + Gert Driesen + + + + The layout to adapt + + + + + Construct a new adapter + + the layout to adapt + + + Create the adapter for the specified . + + + + + + Formats the logging event as an object. + + The event to format + returns the formatted event + + + Uses the object supplied to + the constructor to perform the formatting. + + + + + + Extend this abstract class to create your own log layout format. + + + + This is the base implementation of the + interface. Most layout objects should extend this class. + + + + + + Subclasses must implement the + method. + + + Subclasses should set the in their default + constructor. + + + + Nicko Cadell + Gert Driesen + + + + Empty default constructor + + + + Empty default constructor + + + + + + Activate component options + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + This method must be implemented by the subclass. + + + + + + Implement this method to create your own layout format. + + The TextWriter to write the formatted event to + The event to format + + + This method is called by an appender to format + the as text. + + + + + + Convenience method for easily formatting the logging event into a string variable. + + + + Creates a new StringWriter instance to store the formatted logging event. + + + + + The content type output by this layout. + + The content type is "text/plain" + + + The content type output by this layout. + + + This base class uses the value "text/plain". + To change this value a subclass must override this + property. + + + + + + The header for the layout format. + + the layout header + + + The Header text will be appended before any logging events + are formatted and appended. + + + + + + The footer for the layout format. + + the layout footer + + + The Footer text will be appended after all the logging events + have been formatted and appended. + + + + + + Flag indicating if this layout handles exceptions. + + false if this layout handles exceptions + + + If this layout handles the exception object contained within + , then the layout should return + false. Otherwise, if the layout ignores the exception + object, then the layout should return true. + + + Set this value to override the default setting. The default + value is true, this layout does not handle the exception. + + + + + + A flexible layout configurable with pattern string. + + + + The goal of this class is to a + as a string. The results + depend on the conversion pattern. + + + The conversion pattern is closely related to the conversion + pattern of the printf function in C. A conversion pattern is + composed of literal text and format control expressions called + conversion specifiers. + + + You are free to insert any literal text within the conversion + pattern. + + + Each conversion specifier starts with a percent sign (%) and is + followed by optional format modifiers and a conversion + pattern name. The conversion pattern name specifies the type of + data, e.g. logger, level, date, thread name. The format + modifiers control such things as field width, padding, left and + right justification. The following is a simple example. + + + Let the conversion pattern be "%-5level [%thread]: %message%newline" and assume + that the log4net environment was set to use a PatternLayout. Then the + statements + + + ILog log = LogManager.GetLogger(typeof(TestApp)); + log.Debug("Message 1"); + log.Warn("Message 2"); + + would yield the output + + DEBUG [main]: Message 1 + WARN [main]: Message 2 + + + Note that there is no explicit separator between text and + conversion specifiers. The pattern parser knows when it has reached + the end of a conversion specifier when it reads a conversion + character. In the example above the conversion specifier + %-5level means the level of the logging event should be left + justified to a width of five characters. + + + The recognized conversion pattern names are: + + + + Conversion Pattern Name + Effect + + + a + Equivalent to appdomain + + + appdomain + + Used to output the friendly name of the AppDomain where the + logging event was generated. + + + + aspnet-cache + + + Used to output all cache items in the case of %aspnet-cache or just one named item if used as %aspnet-cache{key} + + + This pattern is not available for Compact Framework or Client Profile assemblies. + + + + + aspnet-context + + + Used to output all context items in the case of %aspnet-context or just one named item if used as %aspnet-context{key} + + + This pattern is not available for Compact Framework or Client Profile assemblies. + + + + + aspnet-request + + + Used to output all request parameters in the case of %aspnet-request or just one named param if used as %aspnet-request{key} + + + This pattern is not available for Compact Framework or Client Profile assemblies. + + + + + aspnet-session + + + Used to output all session items in the case of %aspnet-session or just one named item if used as %aspnet-session{key} + + + This pattern is not available for Compact Framework or Client Profile assemblies. + + + + + c + Equivalent to logger + + + C + Equivalent to type + + + class + Equivalent to type + + + d + Equivalent to date + + + date + + + Used to output the date of the logging event in the local time zone. + To output the date in universal time use the %utcdate pattern. + The date conversion + specifier may be followed by a date format specifier enclosed + between braces. For example, %date{HH:mm:ss,fff} or + %date{dd MMM yyyy HH:mm:ss,fff}. If no date format specifier is + given then ISO8601 format is + assumed (). + + + The date format specifier admits the same syntax as the + time pattern string of the . + + + For better results it is recommended to use the log4net date + formatters. These can be specified using one of the strings + "ABSOLUTE", "DATE" and "ISO8601" for specifying + , + and respectively + . For example, + %date{ISO8601} or %date{ABSOLUTE}. + + + These dedicated date formatters perform significantly + better than . + + + + + exception + + + Used to output the exception passed in with the log message. + + + If an exception object is stored in the logging event + it will be rendered into the pattern output with a + trailing newline. + If there is no exception then nothing will be output + and no trailing newline will be appended. + It is typical to put a newline before the exception + and to have the exception as the last data in the pattern. + + + + + F + Equivalent to file + + + file + + + Used to output the file name where the logging request was + issued. + + + WARNING Generating caller location information is + extremely slow. Its use should be avoided unless execution speed + is not an issue. + + + See the note below on the availability of caller location information. + + + + + identity + + + Used to output the user name for the currently active user + (Principal.Identity.Name). + + + WARNING Generating caller information is + extremely slow. Its use should be avoided unless execution speed + is not an issue. + + + + + l + Equivalent to location + + + L + Equivalent to line + + + location + + + Used to output location information of the caller which generated + the logging event. + + + The location information depends on the CLI implementation but + usually consists of the fully qualified name of the calling + method followed by the callers source the file name and line + number between parentheses. + + + The location information can be very useful. However, its + generation is extremely slow. Its use should be avoided + unless execution speed is not an issue. + + + See the note below on the availability of caller location information. + + + + + level + + + Used to output the level of the logging event. + + + + + line + + + Used to output the line number from where the logging request + was issued. + + + WARNING Generating caller location information is + extremely slow. Its use should be avoided unless execution speed + is not an issue. + + + See the note below on the availability of caller location information. + + + + + logger + + + Used to output the logger of the logging event. The + logger conversion specifier can be optionally followed by + precision specifier, that is a decimal constant in + brackets. + + + If a precision specifier is given, then only the corresponding + number of right most components of the logger name will be + printed. By default the logger name is printed in full. + + + For example, for the logger name "a.b.c" the pattern + %logger{2} will output "b.c". + + + + + m + Equivalent to message + + + M + Equivalent to method + + + message + + + Used to output the application supplied message associated with + the logging event. + + + + + mdc + + + The MDC (old name for the ThreadContext.Properties) is now part of the + combined event properties. This pattern is supported for compatibility + but is equivalent to property. + + + + + method + + + Used to output the method name where the logging request was + issued. + + + WARNING Generating caller location information is + extremely slow. Its use should be avoided unless execution speed + is not an issue. + + + See the note below on the availability of caller location information. + + + + + n + Equivalent to newline + + + newline + + + Outputs the platform dependent line separator character or + characters. + + + This conversion pattern offers the same performance as using + non-portable line separator strings such as "\n", or "\r\n". + Thus, it is the preferred way of specifying a line separator. + + + + + ndc + + + Used to output the NDC (nested diagnostic context) associated + with the thread that generated the logging event. + + + + + p + Equivalent to level + + + P + Equivalent to property + + + properties + Equivalent to property + + + property + + + Used to output the an event specific property. The key to + lookup must be specified within braces and directly following the + pattern specifier, e.g. %property{user} would include the value + from the property that is keyed by the string 'user'. Each property value + that is to be included in the log must be specified separately. + Properties are added to events by loggers or appenders. By default + the log4net:HostName property is set to the name of machine on + which the event was originally logged. + + + If no key is specified, e.g. %property then all the keys and their + values are printed in a comma separated list. + + + The properties of an event are combined from a number of different + contexts. These are listed below in the order in which they are searched. + + + + the event properties + + The event has that can be set. These + properties are specific to this event only. + + + + the thread properties + + The that are set on the current + thread. These properties are shared by all events logged on this thread. + + + + the global properties + + The that are set globally. These + properties are shared by all the threads in the AppDomain. + + + + + + + + r + Equivalent to timestamp + + + stacktrace + + + Used to output the stack trace of the logging event + The stack trace level specifier may be enclosed + between braces. For example, %stacktrace{level}. + If no stack trace level specifier is given then 1 is assumed + + + Output uses the format: + type3.MethodCall3 > type2.MethodCall2 > type1.MethodCall1 + + + This pattern is not available for Compact Framework assemblies. + + + + + stacktracedetail + + + Used to output the stack trace of the logging event + The stack trace level specifier may be enclosed + between braces. For example, %stacktracedetail{level}. + If no stack trace level specifier is given then 1 is assumed + + + Output uses the format: + type3.MethodCall3(type param,...) > type2.MethodCall2(type param,...) > type1.MethodCall1(type param,...) + + + This pattern is not available for Compact Framework assemblies. + + + + + t + Equivalent to thread + + + timestamp + + + Used to output the number of milliseconds elapsed since the start + of the application until the creation of the logging event. + + + + + thread + + + Used to output the name of the thread that generated the + logging event. Uses the thread number if no name is available. + + + + + type + + + Used to output the fully qualified type name of the caller + issuing the logging request. This conversion specifier + can be optionally followed by precision specifier, that + is a decimal constant in brackets. + + + If a precision specifier is given, then only the corresponding + number of right most components of the class name will be + printed. By default the class name is output in fully qualified form. + + + For example, for the class name "log4net.Layout.PatternLayout", the + pattern %type{1} will output "PatternLayout". + + + WARNING Generating the caller class information is + slow. Thus, its use should be avoided unless execution speed is + not an issue. + + + See the note below on the availability of caller location information. + + + + + u + Equivalent to identity + + + username + + + Used to output the WindowsIdentity for the currently + active user. + + + WARNING Generating caller WindowsIdentity information is + extremely slow. Its use should be avoided unless execution speed + is not an issue. + + + + + utcdate + + + Used to output the date of the logging event in universal time. + The date conversion + specifier may be followed by a date format specifier enclosed + between braces. For example, %utcdate{HH:mm:ss,fff} or + %utcdate{dd MMM yyyy HH:mm:ss,fff}. If no date format specifier is + given then ISO8601 format is + assumed (). + + + The date format specifier admits the same syntax as the + time pattern string of the . + + + For better results it is recommended to use the log4net date + formatters. These can be specified using one of the strings + "ABSOLUTE", "DATE" and "ISO8601" for specifying + , + and respectively + . For example, + %utcdate{ISO8601} or %utcdate{ABSOLUTE}. + + + These dedicated date formatters perform significantly + better than . + + + + + w + Equivalent to username + + + x + Equivalent to ndc + + + X + Equivalent to mdc + + + % + + + The sequence %% outputs a single percent sign. + + + + + + The single letter patterns are deprecated in favor of the + longer more descriptive pattern names. + + + By default the relevant information is output as is. However, + with the aid of format modifiers it is possible to change the + minimum field width, the maximum field width and justification. + + + The optional format modifier is placed between the percent sign + and the conversion pattern name. + + + The first optional format modifier is the left justification + flag which is just the minus (-) character. Then comes the + optional minimum field width modifier. This is a decimal + constant that represents the minimum number of characters to + output. If the data item requires fewer characters, it is padded on + either the left or the right until the minimum width is + reached. The default is to pad on the left (right justify) but you + can specify right padding with the left justification flag. The + padding character is space. If the data item is larger than the + minimum field width, the field is expanded to accommodate the + data. The value is never truncated. + + + This behavior can be changed using the maximum field + width modifier which is designated by a period followed by a + decimal constant. If the data item is longer than the maximum + field, then the extra characters are removed from the + beginning of the data item and not from the end. For + example, it the maximum field width is eight and the data item is + ten characters long, then the first two characters of the data item + are dropped. This behavior deviates from the printf function in C + where truncation is done from the end. + + + Below are various format modifier examples for the logger + conversion specifier. + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Format modifierleft justifyminimum widthmaximum widthcomment
    %20loggerfalse20none + + Left pad with spaces if the logger name is less than 20 + characters long. + +
    %-20loggertrue20none + + Right pad with spaces if the logger + name is less than 20 characters long. + +
    %.30loggerNAnone30 + + Truncate from the beginning if the logger + name is longer than 30 characters. + +
    %20.30loggerfalse2030 + + Left pad with spaces if the logger name is shorter than 20 + characters. However, if logger name is longer than 30 characters, + then truncate from the beginning. + +
    %-20.30loggertrue2030 + + Right pad with spaces if the logger name is shorter than 20 + characters. However, if logger name is longer than 30 characters, + then truncate from the beginning. + +
    +
    + + Note about caller location information.
    + The following patterns %type %file %line %method %location %class %C %F %L %l %M + all generate caller location information. + Location information uses the System.Diagnostics.StackTrace class to generate + a call stack. The caller's information is then extracted from this stack. +
    + + + The System.Diagnostics.StackTrace class is not supported on the + .NET Compact Framework 1.0 therefore caller location information is not + available on that framework. + + + + + The System.Diagnostics.StackTrace class has this to say about Release builds: + + + "StackTrace information will be most informative with Debug build configurations. + By default, Debug builds include debug symbols, while Release builds do not. The + debug symbols contain most of the file, method name, line number, and column + information used in constructing StackFrame and StackTrace objects. StackTrace + might not report as many method calls as expected, due to code transformations + that occur during optimization." + + + This means that in a Release build the caller information may be incomplete or may + not exist at all! Therefore caller location information cannot be relied upon in a Release build. + + + + Additional pattern converters may be registered with a specific + instance using the method. + +
    + + This is a more detailed pattern. + %timestamp [%thread] %level %logger %ndc - %message%newline + + + A similar pattern except that the relative time is + right padded if less than 6 digits, thread name is right padded if + less than 15 characters and truncated if longer and the logger + name is left padded if shorter than 30 characters and truncated if + longer. + %-6timestamp [%15.15thread] %-5level %30.30logger %ndc - %message%newline + + Nicko Cadell + Gert Driesen + Douglas de la Torre + Daniel Cazzulino +
    + + + Default pattern string for log output. + + + + Default pattern string for log output. + Currently set to the string "%message%newline" + which just prints the application supplied message. + + + + + + A detailed conversion pattern + + + + A conversion pattern which includes Time, Thread, Logger, and Nested Context. + Current value is %timestamp [%thread] %level %logger %ndc - %message%newline. + + + + + + Internal map of converter identifiers to converter types. + + + + This static map is overridden by the converterRegistry instance map + + + + + + the head of the pattern converter chain + + + + + patterns defined on this PatternLayout only + + + + + Constructs a PatternLayout using the DefaultConversionPattern + + + + The default pattern just produces the application supplied message. + + + Note to Inheritors: This constructor calls the virtual method + . If you override this method be + aware that it will be called before your is called constructor. + + + As per the contract the + method must be called after the properties on this object have been + configured. + + + + + + Constructs a PatternLayout using the supplied conversion pattern + + the pattern to use + + + Note to Inheritors: This constructor calls the virtual method + . If you override this method be + aware that it will be called before your is called constructor. + + + When using this constructor the method + need not be called. This may not be the case when using a subclass. + + + + + + Gets or sets the pattern formatting string. + + + + The ConversionPattern option. This is the string which + controls formatting and consists of a mix of literal content and + conversion specifiers. + + + + + + Create the pattern parser instance + + the pattern to parse + The that will format the event + + + Creates the used to parse the conversion string. Sets the + global and instance rules on the . + + + + + + Initializes layout options. + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Produces a formatted string as specified by the conversion pattern. + + The event being logged. + The TextWriter to write the formatted event to. + + + Parses the using the patter format + specified in the property. + + + + + + Add a converter to this PatternLayout + + the converter info + + + This version of the method is used by the configurator. + Programmatic users should use the alternative method. + + + + + + Adds a named pattern converter to this PatternLayout. + + the name of the conversion pattern for this converter + the type of the converter + + + This converter will be used in the formatting of the event. + This method must be called before . + + + The specified must extend the + type. + + + + + + Write the event appdomain name to the output + + + + Writes the to the output writer. + + + Daniel Cazzulino + Nicko Cadell + + + + Write the event appdomain name to the output + + that will receive the formatted result. + the event being logged + + + Writes the to the output . + + + + + + Converter for items in the ASP.Net Cache. + + + + Outputs an item from the . + + + Ron Grabowski + + + + Write the ASP.Net Cache item to the output + + that will receive the formatted result. + The on which the pattern converter should be executed. + The under which the ASP.Net request is running. + + + Writes out the value of a named property. The property name + should be set in the + property. If no property has been set, all key value pairs from the Cache will + be written to the output. + + + + + + Converter for items in the . + + + + Outputs an item from the . + + + Ron Grabowski + + + + Write the ASP.Net HttpContext item to the output + + that will receive the formatted result. + The on which the pattern converter should be executed. + The under which the ASP.Net request is running. + + + Writes out the value of a named property. The property name + should be set in the + property. + + + + + + Abstract class that provides access to the current HttpContext () that + derived classes need. + + + This class handles the case when HttpContext.Current is null by writing + to the writer. + + Ron Grabowski + + + + Derived pattern converters must override this method in order to + convert conversion specifiers in the correct way. + + that will receive the formatted result. + The on which the pattern converter should be executed. + The under which the ASP.Net request is running. + + + + Converter for items in the ASP.Net Cache. + + + + Outputs an item from the . + + + Ron Grabowski + + + + Write the ASP.Net Cache item to the output + + that will receive the formatted result. + The on which the pattern converter should be executed. + The under which the ASP.Net request is running. + + + Writes out the value of a named property. The property name + should be set in the + property. + + + + + + Converter for items in the ASP.Net Cache. + + + + Outputs an item from the . + + + Ron Grabowski + + + + Write the ASP.Net Cache item to the output + + that will receive the formatted result. + The on which the pattern converter should be executed. + The under which the ASP.Net request is running. + + + Writes out the value of a named property. The property name + should be set in the + property. If no property has been set, all key value pairs from the Session will + be written to the output. + + + + + + Date pattern converter, uses a to format + the date of a . + + + + Render the to the writer as a string. + + + The value of the determines + the formatting of the date. The following values are allowed: + + + Option value + Output + + + ISO8601 + + Uses the formatter. + Formats using the "yyyy-MM-dd HH:mm:ss,fff" pattern. + + + + DATE + + Uses the formatter. + Formats using the "dd MMM yyyy HH:mm:ss,fff" for example, "06 Nov 1994 15:49:37,459". + + + + ABSOLUTE + + Uses the formatter. + Formats using the "HH:mm:ss,yyyy" for example, "15:49:37,459". + + + + other + + Any other pattern string uses the formatter. + This formatter passes the pattern string to the + method. + For details on valid patterns see + DateTimeFormatInfo Class. + + + + + + The is in the local time zone and is rendered in that zone. + To output the time in Universal time see . + + + Nicko Cadell + + + + The used to render the date to a string + + + + + Initialize the converter pattern based on the property. + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Converts the pattern into the rendered message. + + that will receive the formatted result. + the event being logged + + + Pass the to the + for it to render it to the writer. + + + The passed is in the local time zone. + + + + + + Write the exception text to the output + + + + If an exception object is stored in the logging event + it will be rendered into the pattern output with a + trailing newline. + + + If there is no exception then nothing will be output + and no trailing newline will be appended. + It is typical to put a newline before the exception + and to have the exception as the last data in the pattern. + + + Nicko Cadell + + + + Default constructor + + + + + Write the exception text to the output + + that will receive the formatted result. + the event being logged + + + If an exception object is stored in the logging event + it will be rendered into the pattern output with a + trailing newline. + + + If there is no exception or the exception property specified + by the Option value does not exist then nothing will be output + and no trailing newline will be appended. + It is typical to put a newline before the exception + and to have the exception as the last data in the pattern. + + + Recognized values for the Option parameter are: + + + + Message + + + Source + + + StackTrace + + + TargetSite + + + HelpLink + + + + + + + Writes the value of the for + the event to the output writer. + + Nicko Cadell + + + + Writes the value of the for + the to the output . + + that will receive the formatted result. + the event being logged + + + + Write the caller location info to the output + + + + Writes the to the output writer. + + + Nicko Cadell + + + + Write the caller location info to the output + + that will receive the formatted result. + the event being logged + + + Writes the to the output writer. + + + + + + Writes the event identity to the output + + + + Writes the value of the to + the output writer. + + + Daniel Cazzulino + Nicko Cadell + + + + Writes the event identity to the output + + that will receive the formatted result. + the event being logged + + + Writes the value of the + to + the output . + + + + + + Write the event level to the output + + + + Writes the display name of the event + to the writer. + + + Nicko Cadell + + + + Write the event level to the output + + that will receive the formatted result. + the event being logged + + + Writes the of the + to the . + + + + + + Write the caller location line number to the output + + + + Writes the value of the for + the event to the output writer. + + + Nicko Cadell + + + + Write the caller location line number to the output + + that will receive the formatted result. + the event being logged + + + Writes the value of the for + the to the output . + + + + + + Converter for logger name + + + + Outputs the of the event. + + + Nicko Cadell + + + + Gets the fully qualified name of the logger + + the event being logged + The fully qualified logger name + + + Returns the of the . + + + + + + Writes the event message to the output + + + + Uses the method + to write out the event message. + + + Nicko Cadell + + + + Writes the event message to the output + + that will receive the formatted result. + the event being logged + + + Uses the method + to write out the event message. + + + + + + Write the method name to the output + + + + Writes the caller location to + the output. + + + Nicko Cadell + + + + Write the method name to the output + + that will receive the formatted result. + the event being logged + + + Writes the caller location to + the output. + + + + + + Converter to output and truncate '.' separated strings + + + + This abstract class supports truncating a '.' separated string + to show a specified number of elements from the right hand side. + This is used to truncate class names that are fully qualified. + + + Subclasses should override the method to + return the fully qualified string. + + + Nicko Cadell + + + + Initialize the converter + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Gets the fully qualified '.' (dot/period) separated name for an event. + + the event being logged + the fully qualified name + + + Overridden by subclasses to get the fully qualified name before the + precision is applied to it. + + + + + + Converts the pattern to the rendered message + + that will receive the formatted result. + the event being logged + + Render the to the precision + specified by the property. + + + + + The fully qualified type of the NamedPatternConverter class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Converter to include event NDC + + + + Outputs the value of the event property named NDC. + + + The should be used instead. + + + Nicko Cadell + + + + Write the event NDC to the output + + that will receive the formatted result. + the event being logged + + + As the thread context stacks are now stored in named event properties + this converter simply looks up the value of the NDC property. + + + The should be used instead. + + + + + + Abstract class that provides the formatting functionality that + derived classes need. + + + Conversion specifiers in a conversion patterns are parsed to + individual PatternConverters. Each of which is responsible for + converting a logging event in a converter specific manner. + + Nicko Cadell + + + + Initializes a new instance of the class. + + + + + Flag indicating if this converter handles the logging event exception + + false if this converter handles the logging event exception + + + If this converter handles the exception object contained within + , then this property should be set to + false. Otherwise, if the layout ignores the exception + object, then the property should be set to true. + + + Set this value to override a this default setting. The default + value is true, this converter does not handle the exception. + + + + + + Derived pattern converters must override this method in order to + convert conversion specifiers in the correct way. + + that will receive the formatted result. + The on which the pattern converter should be executed. + + + + Derived pattern converters must override this method in order to + convert conversion specifiers in the correct way. + + that will receive the formatted result. + The state object on which the pattern converter should be executed. + + + + Property pattern converter + + + + Writes out the value of a named property. The property name + should be set in the + property. + + + If the is set to null + then all the properties are written as key value pairs. + + + Nicko Cadell + + + + Write the property value to the output + + that will receive the formatted result. + the event being logged + + + Writes out the value of a named property. The property name + should be set in the + property. + + + If the is set to null + then all the properties are written as key value pairs. + + + + + + Converter to output the relative time of the event + + + + Converter to output the time of the event relative to the start of the program. + + + Nicko Cadell + + + + Write the relative time to the output + + that will receive the formatted result. + the event being logged + + + Writes out the relative time of the event in milliseconds. + That is the number of milliseconds between the event + and the . + + + + + + Helper method to get the time difference between two DateTime objects + + start time (in the current local time zone) + end time (in the current local time zone) + the time difference in milliseconds + + + + Writes the to the output writer, using format: + type3.MethodCall3(type param,...) > type2.MethodCall2(type param,...) > type1.MethodCall1(type param,...) + + Adam Davies + + + + + + + The fully qualified type of the StackTraceDetailPatternConverter class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Write the caller stack frames to the output + + + + Writes the to the output writer, using format: + type3.MethodCall3 > type2.MethodCall2 > type1.MethodCall1 + + + Michael Cromwell + + + + Initialize the converter + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Write the strack frames to the output + + that will receive the formatted result. + the event being logged + + + Writes the to the output writer. + + + + + + Returns the Name of the method + + + This method was created, so this class could be used as a base class for StackTraceDetailPatternConverter + string + + + + The fully qualified type of the StackTracePatternConverter class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Converter to include event thread name + + + + Writes the to the output. + + + Nicko Cadell + + + + Write the ThreadName to the output + + that will receive the formatted result. + the event being logged + + + Writes the to the . + + + + + + Pattern converter for the class name + + + + Outputs the of the event. + + + Nicko Cadell + + + + Gets the fully qualified name of the class + + the event being logged + The fully qualified type name for the caller location + + + Returns the of the . + + + + + + Converter to include event user name + + Douglas de la Torre + Nicko Cadell + + + + Convert the pattern to the rendered message + + that will receive the formatted result. + the event being logged + + + + Writes the TimeStamp to the output. + + + + Date pattern converter, uses a to format + the date of a . + + + Uses a to format the + in Universal time. + + + See the for details on the date pattern syntax. + + + + Nicko Cadell + + + + Writes the TimeStamp to the output. + + that will receive the formatted result. + the event being logged + + + Pass the to the + for it to render it to the writer. + + + The passed is in the local time zone, this is converted + to Universal time before it is rendered. + + + + + + + The fully qualified type of the UtcDatePatternConverter class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Type converter for the interface. + + + + Supports converting from the interface to + the interface using the . + + + Nicko Cadell + Gert Driesen + + + + Can the sourceType be converted to an + + the source to be to be converted + true if the source type can be converted to + + + Test if the can be converted to a + . Only is supported + as the . + + + + + + Converts the value to a object. + + the value to convert + the object + + + If the object is an then the + is used to adapt between the two interfaces, + otherwise an exception is thrown. + + + + + + Extracts the value of a property from the . + + Nicko Cadell + + + + The name of the value to look up in the LoggingEvent Properties collection. + + + + + Looks up the property for . + + The event to format + returns property value + + + Looks up and returns the object value of the property + named . If there is no property defined + with than name then null will be returned. + + + + + + Extracts the date from the . + + Nicko Cadell + Gert Driesen + + + + Gets the as a . + + The event to format + returns the time stamp + + + The time stamp is in local time. To format the time stamp + in universal time use . + + + + + + Extracts the date from the . + + Nicko Cadell + Gert Driesen + + + + Gets the as a . + + The event to format + returns the time stamp + + + The time stamp is in universal time. To format the time stamp + in local time use . + + + + + + A very simple layout + + + + SimpleLayout consists of the level of the log statement, + followed by " - " and then the log message itself. For example, + + DEBUG - Hello world + + + + Nicko Cadell + Gert Driesen + + + + Constructs a SimpleLayout + + + + + Initialize layout options + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Produces a simple formatted output. + + the event being logged + The TextWriter to write the formatted event to + + + Formats the event as the level of the event, + followed by " - " and then the log message itself. The + output is terminated by a newline. + + + + + + Layout that formats the log events as XML elements. + + + + The output of the consists of a series of + log4net:event elements. It does not output a complete well-formed XML + file. The output is designed to be included as an external entity + in a separate file to form a correct XML file. + + + For example, if abc is the name of the file where + the output goes, then a well-formed XML file would + be: + + + <?xml version="1.0" ?> + + <!DOCTYPE log4net:events SYSTEM "log4net-events.dtd" [<!ENTITY data SYSTEM "abc">]> + + <log4net:events version="1.2" xmlns:log4net="http://logging.apache.org/log4net/schemas/log4net-events-1.2> + &data; + </log4net:events> + + + This approach enforces the independence of the + and the appender where it is embedded. + + + The version attribute helps components to correctly + interpret output generated by . The value of + this attribute should be "1.2" for release 1.2 and later. + + + Alternatively the Header and Footer properties can be + configured to output the correct XML header, open tag and close tag. + When setting the Header and Footer properties it is essential + that the underlying data store not be appendable otherwise the data + will become invalid XML. + + + Nicko Cadell + Gert Driesen + + + + Constructs an XmlLayout + + + + + Constructs an XmlLayout. + + + + The LocationInfo option takes a boolean value. By + default, it is set to false which means there will be no location + information output by this layout. If the option is set to + true, then the file name and line number of the statement + at the origin of the log statement will be output. + + + If you are embedding this layout within an SmtpAppender + then make sure to set the LocationInfo option of that + appender as well. + + + + + + The prefix to use for all element names + + + + The default prefix is log4net. Set this property + to change the prefix. If the prefix is set to an empty string + then no prefix will be written. + + + + + + Set whether to base64 encode the message. + + + + By default the log message will be written as text to the xml + output. This can cause problems when the message contains binary + data. By setting this to true the contents of the message will be + base64 encoded. If this is set then invalid character replacement + (see ) will not be performed + on the log message. + + + + + + Set whether to base64 encode the property values. + + + + By default the properties will be written as text to the xml + output. This can cause problems when one or more properties contain + binary data. By setting this to true the values of the properties + will be base64 encoded. If this is set then invalid character replacement + (see ) will not be performed + on the property values. + + + + + + Initialize layout options + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + Builds a cache of the element names + + + + + + Does the actual writing of the XML. + + The writer to use to output the event to. + The event to write. + + + Override the base class method + to write the to the . + + + + + + Layout that formats the log events as XML elements. + + + + This is an abstract class that must be subclassed by an implementation + to conform to a specific schema. + + + Deriving classes must implement the method. + + + Nicko Cadell + Gert Driesen + + + + Protected constructor to support subclasses + + + + Initializes a new instance of the class + with no location info. + + + + + + Protected constructor to support subclasses + + + + The parameter determines whether + location information will be output by the layout. If + is set to true, then the + file name and line number of the statement at the origin of the log + statement will be output. + + + If you are embedding this layout within an SMTPAppender + then make sure to set the LocationInfo option of that + appender as well. + + + + + + Gets a value indicating whether to include location information in + the XML events. + + + true if location information should be included in the XML + events; otherwise, false. + + + + If is set to true, then the file + name and line number of the statement at the origin of the log + statement will be output. + + + If you are embedding this layout within an SMTPAppender + then make sure to set the LocationInfo option of that + appender as well. + + + + + + The string to replace characters that can not be expressed in XML with. + + + Not all characters may be expressed in XML. This property contains the + string to replace those that can not with. This defaults to a ?. Set it + to the empty string to simply remove offending characters. For more + details on the allowed character ranges see http://www.w3.org/TR/REC-xml/#charsets + Character replacement will occur in the log message, the property names + and the property values. + + + + + + + Initialize layout options + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Gets the content type output by this layout. + + + As this is the XML layout, the value is always "text/xml". + + + + As this is the XML layout, the value is always "text/xml". + + + + + + Produces a formatted string. + + The event being logged. + The TextWriter to write the formatted event to + + + Format the and write it to the . + + + This method creates an that writes to the + . The is passed + to the method. Subclasses should override the + method rather than this method. + + + + + + Does the actual writing of the XML. + + The writer to use to output the event to. + The event to write. + + + Subclasses should override this method to format the as XML. + + + + + + Layout that formats the log events as XML elements compatible with the log4j schema + + + + Formats the log events according to the http://logging.apache.org/log4j schema. + + + Nicko Cadell + + + + The 1st of January 1970 in UTC + + + + + Constructs an XMLLayoutSchemaLog4j + + + + + Constructs an XMLLayoutSchemaLog4j. + + + + The LocationInfo option takes a boolean value. By + default, it is set to false which means there will be no location + information output by this layout. If the option is set to + true, then the file name and line number of the statement + at the origin of the log statement will be output. + + + If you are embedding this layout within an SMTPAppender + then make sure to set the LocationInfo option of that + appender as well. + + + + + + The version of the log4j schema to use. + + + + Only version 1.2 of the log4j schema is supported. + + + + + + Actually do the writing of the xml + + the writer to use + the event to write + + + Generate XML that is compatible with the log4j schema. + + + + + + The log4net Logical Thread Context. + + + + The LogicalThreadContext provides a location for specific debugging + information to be stored. + The LogicalThreadContext properties override any or + properties with the same name. + + + For .NET Standard this class uses System.Threading.AsyncLocal rather than . + + + The Logical Thread Context has a properties map and a stack. + The properties and stack can + be included in the output of log messages. The + supports selecting and outputting these properties. + + + The Logical Thread Context provides a diagnostic context for the current call context. + This is an instrument for distinguishing interleaved log + output from different sources. Log output is typically interleaved + when a server handles multiple clients near-simultaneously. + + + The Logical Thread Context is managed on a per basis. + + + The requires a link time + for the + . + If the calling code does not have this permission then this context will be disabled. + It will not store any property values set on it. + + + Example of using the thread context properties to store a username. + + LogicalThreadContext.Properties["user"] = userName; + log.Info("This log message has a LogicalThreadContext Property called 'user'"); + + + Example of how to push a message into the context stack + + using(LogicalThreadContext.Stacks["LDC"].Push("my context message")) + { + log.Info("This log message has a LogicalThreadContext Stack message that includes 'my context message'"); + + } // at the end of the using block the message is automatically popped + + + + Nicko Cadell + + + + The thread properties map + + + + The LogicalThreadContext properties override any + or properties with the same name. + + + + + + The logical thread stacks. + + + + + This class is used by client applications to request logger instances. + + + + This class has static methods that are used by a client to request + a logger instance. The method is + used to retrieve a logger. + + + See the interface for more details. + + + Simple example of logging messages + + ILog log = LogManager.GetLogger("application-log"); + + log.Info("Application Start"); + log.Debug("This is a debug message"); + + if (log.IsDebugEnabled) + { + log.Debug("This is another debug message"); + } + + + + + Nicko Cadell + Gert Driesen + + + Returns the named logger if it exists. + + Returns the named logger if it exists. + + + + If the named logger exists (in the default repository) then it + returns a reference to the logger, otherwise it returns null. + + + The fully qualified logger name to look for. + The logger found, or null if no logger could be found. + + + Get the currently defined loggers. + + Returns all the currently defined loggers in the default repository. + + + The root logger is not included in the returned array. + + All the defined loggers. + + + Get or create a logger. + + Retrieves or creates a named logger. + + + + Retrieves a logger named as the + parameter. If the named logger already exists, then the + existing instance will be returned. Otherwise, a new instance is + created. + + By default, loggers do not have a set level but inherit + it from the hierarchy. This is one of the central features of + log4net. + + + The name of the logger to retrieve. + The logger with the name specified. + + + + Returns the named logger if it exists. + + + + If the named logger exists (in the specified repository) then it + returns a reference to the logger, otherwise it returns + null. + + + The repository to lookup in. + The fully qualified logger name to look for. + + The logger found, or null if the logger doesn't exist in the specified + repository. + + + + + Returns the named logger if it exists. + + + + If the named logger exists (in the repository for the specified assembly) then it + returns a reference to the logger, otherwise it returns + null. + + + The assembly to use to look up the repository. + The fully qualified logger name to look for. + + The logger, or null if the logger doesn't exist in the specified + assembly's repository. + + + + + Returns all the currently defined loggers in the specified repository. + + The repository to lookup in. + + The root logger is not included in the returned array. + + All the defined loggers. + + + + Returns all the currently defined loggers in the specified assembly's repository. + + The assembly to use to look up the repository. + + The root logger is not included in the returned array. + + All the defined loggers. + + + + Retrieves or creates a named logger. + + + + Retrieve a logger named as the + parameter. If the named logger already exists, then the + existing instance will be returned. Otherwise, a new instance is + created. + + + By default, loggers do not have a set level but inherit + it from the hierarchy. This is one of the central features of + log4net. + + + The repository to lookup in. + The name of the logger to retrieve. + The logger with the name specified. + + + + Retrieves or creates a named logger. + + + + Retrieve a logger named as the + parameter. If the named logger already exists, then the + existing instance will be returned. Otherwise, a new instance is + created. + + + By default, loggers do not have a set level but inherit + it from the hierarchy. This is one of the central features of + log4net. + + + The assembly to use to look up the repository. + The name of the logger to retrieve. + The logger with the name specified. + + + + Shorthand for . + + + Get the logger for the fully qualified name of the type specified. + + The full name of will be used as the name of the logger to retrieve. + The logger with the name specified. + + + + Shorthand for . + + + Gets the logger for the fully qualified name of the type specified. + + The repository to lookup in. + The full name of will be used as the name of the logger to retrieve. + The logger with the name specified. + + + + Shorthand for . + + + Gets the logger for the fully qualified name of the type specified. + + The assembly to use to look up the repository. + The full name of will be used as the name of the logger to retrieve. + The logger with the name specified. + + + + Shuts down the log4net system. + + + + Calling this method will safely close and remove all + appenders in all the loggers including root contained in all the + default repositories. + + + Some appenders need to be closed before the application exists. + Otherwise, pending logging events might be lost. + + The shutdown method is careful to close nested + appenders before closing regular appenders. This allows + configurations where a regular appender is attached to a logger + and again to a nested appender. + + + + + Shutdown a logger repository. + + Shuts down the default repository. + + + + Calling this method will safely close and remove all + appenders in all the loggers including root contained in the + default repository. + + Some appenders need to be closed before the application exists. + Otherwise, pending logging events might be lost. + + The shutdown method is careful to close nested + appenders before closing regular appenders. This allows + configurations where a regular appender is attached to a logger + and again to a nested appender. + + + + + + Shuts down the repository for the repository specified. + + + + Calling this method will safely close and remove all + appenders in all the loggers including root contained in the + specified. + + + Some appenders need to be closed before the application exists. + Otherwise, pending logging events might be lost. + + The shutdown method is careful to close nested + appenders before closing regular appenders. This allows + configurations where a regular appender is attached to a logger + and again to a nested appender. + + + The repository to shut down. + + + + Shuts down the repository specified. + + + + Calling this method will safely close and remove all + appenders in all the loggers including root contained in the + repository. The repository is looked up using + the specified. + + + Some appenders need to be closed before the application exists. + Otherwise, pending logging events might be lost. + + + The shutdown method is careful to close nested + appenders before closing regular appenders. This allows + configurations where a regular appender is attached to a logger + and again to a nested appender. + + + The assembly to use to look up the repository. + + + Reset the configuration of a repository + + Resets all values contained in this repository instance to their defaults. + + + + Resets all values contained in the repository instance to their + defaults. This removes all appenders from all loggers, sets + the level of all non-root loggers to null, + sets their additivity flag to true and sets the level + of the root logger to . Moreover, + message disabling is set to its default "off" value. + + + + + + Resets all values contained in this repository instance to their defaults. + + + + Reset all values contained in the repository instance to their + defaults. This removes all appenders from all loggers, sets + the level of all non-root loggers to null, + sets their additivity flag to true and sets the level + of the root logger to . Moreover, + message disabling is set to its default "off" value. + + + The repository to reset. + + + + Resets all values contained in this repository instance to their defaults. + + + + Reset all values contained in the repository instance to their + defaults. This removes all appenders from all loggers, sets + the level of all non-root loggers to null, + sets their additivity flag to true and sets the level + of the root logger to . Moreover, + message disabling is set to its default "off" value. + + + The assembly to use to look up the repository to reset. + + + Get a logger repository. + + Returns the default instance. + + + + Gets the for the repository specified + by the callers assembly (). + + + The instance for the default repository. + + + + Returns the default instance. + + The default instance. + + + Gets the for the repository specified + by the argument. + + + The repository to lookup in. + + + + Returns the default instance. + + The default instance. + + + Gets the for the repository specified + by the argument. + + + The assembly to use to look up the repository. + + + Create a logger repository. + + Creates a repository with the specified repository type. + + A that implements + and has a no arg constructor. An instance of this type will be created to act + as the for the repository specified. + The created for the repository. + + + The created will be associated with the repository + specified such that a call to will return + the same repository instance. + + + + + + Creates a repository with the specified name. + + + + Creates the default type of which is a + object. + + + The name must be unique. Repositories cannot be redefined. + An will be thrown if the repository already exists. + + + The name of the repository, this must be unique amongst repositories. + The created for the repository. + The specified repository already exists. + + + + Creates a repository with the specified name and repository type. + + + + The name must be unique. Repositories cannot be redefined. + An will be thrown if the repository already exists. + + + The name of the repository, this must be unique to the repository. + A that implements + and has a no arg constructor. An instance of this type will be created to act + as the for the repository specified. + The created for the repository. + The specified repository already exists. + + + + Creates a repository for the specified assembly and repository type. + + + + The created will be associated with the repository + specified such that a call to with the + same assembly specified will return the same repository instance. + + + The assembly to use to get the name of the repository. + A that implements + and has a no arg constructor. An instance of this type will be created to act + as the for the repository specified. + The created for the repository. + + + + Gets the list of currently defined repositories. + + + + Get an array of all the objects that have been created. + + + An array of all the known objects. + + + + Flushes logging events buffered in all configured appenders in the default repository. + + The maximum time in milliseconds to wait for logging events from asynchronous appenders to be flushed. + True if all logging events were flushed successfully, else false. + + + + Looks up the wrapper object for the logger specified. + + The logger to get the wrapper for. + The wrapper for the logger specified. + + + + Looks up the wrapper objects for the loggers specified. + + The loggers to get the wrappers for. + The wrapper objects for the loggers specified. + + + + Create the objects used by + this manager. + + The logger to wrap. + The wrapper for the logger specified. + + + + The wrapper map to use to hold the objects. + + + + + Implementation of Mapped Diagnostic Contexts. + + + + + The MDC is deprecated and has been replaced by the . + The current MDC implementation forwards to the ThreadContext.Properties. + + + + The MDC class is similar to the class except that it is + based on a map instead of a stack. It provides mapped + diagnostic contexts. A Mapped Diagnostic Context, or + MDC in short, is an instrument for distinguishing interleaved log + output from different sources. Log output is typically interleaved + when a server handles multiple clients near-simultaneously. + + + The MDC is managed on a per thread basis. + + + + Nicko Cadell + Gert Driesen + + + + Gets the context value identified by the parameter. + + The key to lookup in the MDC. + The string value held for the key, or a null reference if no corresponding value is found. + + + + The MDC is deprecated and has been replaced by the . + The current MDC implementation forwards to the ThreadContext.Properties. + + + + If the parameter does not look up to a + previously defined context then null will be returned. + + + + + + Add an entry to the MDC + + The key to store the value under. + The value to store. + + + + The MDC is deprecated and has been replaced by the . + The current MDC implementation forwards to the ThreadContext.Properties. + + + + Puts a context value (the parameter) as identified + with the parameter into the current thread's + context map. + + + If a value is already defined for the + specified then the value will be replaced. If the + is specified as null then the key value mapping will be removed. + + + + + + Removes the key value mapping for the key specified. + + The key to remove. + + + + The MDC is deprecated and has been replaced by the . + The current MDC implementation forwards to the ThreadContext.Properties. + + + + Remove the specified entry from this thread's MDC + + + + + + Clear all entries in the MDC + + + + + The MDC is deprecated and has been replaced by the . + The current MDC implementation forwards to the ThreadContext.Properties. + + + + Remove all the entries from this thread's MDC + + + + + + Implementation of Nested Diagnostic Contexts. + + + + + The NDC is deprecated and has been replaced by the . + The current NDC implementation forwards to the ThreadContext.Stacks["NDC"]. + + + + A Nested Diagnostic Context, or NDC in short, is an instrument + to distinguish interleaved log output from different sources. Log + output is typically interleaved when a server handles multiple + clients near-simultaneously. + + + Interleaved log output can still be meaningful if each log entry + from different contexts had a distinctive stamp. This is where NDCs + come into play. + + + Note that NDCs are managed on a per-thread basis. The NDC class + is made up of static methods that operate on the context of the + calling thread. + + + How to push a message into the context + + using (NDC.Push("my context message")) + { + ... all log calls will have 'my context message' included ... + + } // at the end of the using block the message is automatically removed + + + + Nicko Cadell + Gert Driesen + + + + Gets the current context depth. + + The current context depth. + + + + The NDC is deprecated and has been replaced by the . + The current NDC implementation forwards to the ThreadContext.Stacks["NDC"]. + + + + The number of context values pushed onto the context stack. + + + Used to record the current depth of the context. This can then + be restored using the method. + + + + + + + Clears all the contextual information held on the current thread. + + + + + The NDC is deprecated and has been replaced by the . + The current NDC implementation forwards to the ThreadContext.Stacks["NDC"]. + + + + Clears the stack of NDC data held on the current thread. + + + + + + Creates a clone of the stack of context information. + + A clone of the context info for this thread. + + + + The NDC is deprecated and has been replaced by the . + The current NDC implementation forwards to the ThreadContext.Stacks["NDC"]. + + + + The results of this method can be passed to the + method to allow child threads to inherit the context of their + parent thread. + + + + + + Inherits the contextual information from another thread. + + The context stack to inherit. + + + + The NDC is deprecated and has been replaced by the . + The current NDC implementation forwards to the ThreadContext.Stacks["NDC"]. + + + + This thread will use the context information from the stack + supplied. This can be used to initialize child threads with + the same contextual information as their parent threads. These + contexts will NOT be shared. Any further contexts that + are pushed onto the stack will not be visible to the other. + Call to obtain a stack to pass to + this method. + + + + + + Removes the top context from the stack. + + + The message in the context that was removed from the top + of the stack. + + + + + The NDC is deprecated and has been replaced by the . + The current NDC implementation forwards to the ThreadContext.Stacks["NDC"]. + + + + Remove the top context from the stack, and return + it to the caller. If the stack is empty then an + empty string (not null) is returned. + + + + + + Pushes a new context message. + + The new context message. + + An that can be used to clean up + the context stack. + + + + + The NDC is deprecated and has been replaced by the . + The current NDC implementation forwards to the ThreadContext.Stacks["NDC"]. + + + + Pushes a new context onto the context stack. An + is returned that can be used to clean up the context stack. This + can be easily combined with the using keyword to scope the + context. + + + Simple example of using the Push method with the using keyword. + + using(log4net.NDC.Push("NDC_Message")) + { + log.Warn("This should have an NDC message"); + } + + + + + + Pushes a new context message. + + The new context message string format. + Arguments to be passed into messageFormat. + + An that can be used to clean up + the context stack. + + + + + The NDC is deprecated and has been replaced by the . + The current NDC implementation forwards to the ThreadContext.Stacks["NDC"]. + + + + Pushes a new context onto the context stack. An + is returned that can be used to clean up the context stack. This + can be easily combined with the using keyword to scope the + context. + + + Simple example of using the Push method with the using keyword. + + var someValue = "ExampleContext" + using(log4net.NDC.PushFormat("NDC_Message {0}", someValue)) + { + log.Warn("This should have an NDC message"); + } + + + + + + Removes the context information for this thread. It is + not required to call this method. + + + + + The NDC is deprecated and has been replaced by the . + The current NDC implementation forwards to the ThreadContext.Stacks["NDC"]. + + + + This method is not implemented. + + + + + + Forces the stack depth to be at most . + + The maximum depth of the stack + + + + The NDC is deprecated and has been replaced by the . + The current NDC implementation forwards to the ThreadContext.Stacks["NDC"]. + + + + Forces the stack depth to be at most . + This may truncate the head of the stack. This only affects the + stack in the current thread. Also it does not prevent it from + growing, it only sets the maximum depth at the time of the + call. This can be used to return to a known context depth. + + + + + + The default object Renderer. + + + + The default renderer supports rendering objects and collections to strings. + + + See the method for details of the output. + + + Nicko Cadell + Gert Driesen + + + + Renders the object to a string. + + The map used to lookup renderers + The object to render + The writer to render to + + + Render the object to a string. + + + The parameter is + provided to lookup and render other objects. This is + very useful where contains + nested objects of unknown type. The + method can be used to render these objects. + + + The default renderer supports rendering objects to strings as follows: + + + + Value + Rendered String + + + null + + "(null)" + + + + + + + For a one dimensional array this is the + array type name, an open brace, followed by a comma + separated list of the elements (using the appropriate + renderer), followed by a close brace. + + + For example: int[] {1, 2, 3}. + + + If the array is not one dimensional the + Array.ToString() is returned. + + + + + , & + + + Rendered as an open brace, followed by a comma + separated list of the elements (using the appropriate + renderer), followed by a close brace. + + + For example: {a, b, c}. + + + All collection classes that implement its subclasses, + or generic equivalents all implement the interface. + + + + + + + + Rendered as the key, an equals sign ('='), and the value (using the appropriate + renderer). + + + For example: key=value. + + + + + other + + Object.ToString() + + + + + + + + Render the array argument into a string + + The map used to lookup renderers + the array to render + The writer to render to + + + For a one dimensional array this is the + array type name, an open brace, followed by a comma + separated list of the elements (using the appropriate + renderer), followed by a close brace. For example: + int[] {1, 2, 3}. + + + If the array is not one dimensional the + Array.ToString() is returned. + + + + + + Render the enumerator argument into a string + + The map used to lookup renderers + the enumerator to render + The writer to render to + + + Rendered as an open brace, followed by a comma + separated list of the elements (using the appropriate + renderer), followed by a close brace. For example: + {a, b, c}. + + + + + + Renders the DictionaryEntry argument into a string. + + The map used to lookup renderers + the DictionaryEntry to render + The writer to render to + + + Render the key, an equals sign ('='), and the value (using the appropriate + renderer). For example: key=value. + + + + + + Implement this interface in order to render objects as strings + + + + Certain types require special case conversion to + string form. This conversion is done by an object renderer. + Object renderers implement the + interface. + + + Nicko Cadell + Gert Driesen + + + + Render the object to a string + + The map used to lookup renderers + The object to render + The writer to render to + + + Render the object to a + string. + + + The parameter is + provided to lookup and render other objects. This is + very useful where contains + nested objects of unknown type. The + method can be used to render these objects. + + + + + + Maps types to instances for types that require custom + rendering. + + + + The method is used to render an + object using the appropriate renderers defined in this map, + using a default renderer if no custom renderer is defined for a type. + + + Nicko Cadell + Gert Driesen + + + + Renders using the appropriate renderer. + + the object to render to a string + The object rendered as a string. + + + This is a convenience method used to render an object to a string. + The alternative method + should be used when streaming output to a . + + + + + + Render using the appropriate renderer. + + the object to render to a string + The writer to render to + + + Find the appropriate renderer for the type of the + parameter. This is accomplished by calling the + method. Once a renderer is found, it is + applied on the object and the result is returned + as a . + + + + + + Gets the renderer for the specified object type. + + The object for which to look up the renderer. + the renderer for + + + Gets the renderer for the specified object type. + + + Syntactic sugar method that calls + with the type of the object parameter. + + + + + + Gets the renderer for the specified type + + the type to look up the renderer for + The renderer for the specified type, or if no specific renderer has been defined. + + + + Recursively searches interfaces. + + The type for which to look up the renderer. + The renderer for the specified type, or null if not found. + + + + Gets the default renderer instance + + + + + Clears the map of custom renderers. The + is not removed. + + + + + Registers an for . + + The type that will be rendered by . + The renderer for . + + + + Interface implemented by logger repository plugins. + + + + Plugins define additional behavior that can be associated + with a . + The held by the + property is used to store the plugins for a repository. + + + The log4net.Config.PluginAttribute can be used to + attach plugins to repositories created using configuration + attributes. + + + Nicko Cadell + Gert Driesen + + + + Gets the name of the plugin. + + + The name of the plugin. + + + + Plugins are stored in the + keyed by name. Each plugin instance attached to a + repository must be a unique name. + + + + + + Attaches the plugin to the specified . + + The that this plugin should be attached to. + + + A plugin may only be attached to a single repository. + + + This method is called when the plugin is attached to the repository. + + + + + + Is called when the plugin is to shutdown. + + + + This method is called to notify the plugin that + it should stop operating and should detach from + the repository. + + + + + + Interface used to create plugins. + + + + Interface used to create a plugin. + + + Nicko Cadell + Gert Driesen + + + + Creates the plugin object. + + the new plugin instance + + + Create and return a new plugin instance. + + + + + + A strongly-typed collection of objects. + + Nicko Cadell + + + + Supports type-safe iteration over a . + + + + + + Gets the current element in the collection. + + + + + Advances the enumerator to the next element in the collection. + + + true if the enumerator was successfully advanced to the next element; + false if the enumerator has passed the end of the collection. + + + The collection was modified after the enumerator was created. + + + + + Sets the enumerator to its initial position, before the first element in the collection. + + + + + Creates a read-only wrapper for a PluginCollection instance. + + list to create a readonly wrapper arround + + A PluginCollection wrapper that is read-only. + + + + + Initializes a new instance of the PluginCollection class + that is empty and has the default initial capacity. + + + + + Initializes a new instance of the PluginCollection class + that has the specified initial capacity. + + + The number of elements that the new PluginCollection is initially capable of storing. + + + + + Initializes a new instance of the PluginCollection class + that contains elements copied from the specified PluginCollection. + + The PluginCollection whose elements are copied to the new collection. + + + + Initializes a new instance of the PluginCollection class + that contains elements copied from the specified array. + + The array whose elements are copied to the new list. + + + + Initializes a new instance of the PluginCollection class + that contains elements copied from the specified collection. + + The collection whose elements are copied to the new list. + + + + Initializes a new instance of the PluginCollection class + that contains elements copied from the specified collection. + + The collection whose elements are copied to the new list. + + + + Type visible only to our subclasses + Used to access protected constructor + + + + + + A value + + + + + Allow subclasses to avoid our default constructors + + + + + + Gets the number of elements actually contained in the PluginCollection. + + + + + Copies the entire PluginCollection to a one-dimensional + array. + + The one-dimensional array to copy to. + + + + Copies the entire PluginCollection to a one-dimensional + array, starting at the specified index of the target array. + + The one-dimensional array to copy to. + The zero-based index in at which copying begins. + + + + Gets a value indicating whether access to the collection is synchronized (thread-safe). + + false, because the backing type is an array, which is never thread-safe. + + + + Gets an object that can be used to synchronize access to the collection. + + + + + Gets or sets the at the specified index. + + + The at the specified index. + + The zero-based index of the element to get or set. + + is less than zero. + -or- + is equal to or greater than . + + + + + Adds a to the end of the PluginCollection. + + The to be added to the end of the PluginCollection. + The index at which the value has been added. + + + + Removes all elements from the PluginCollection. + + + + + Creates a shallow copy of the . + + A new with a shallow copy of the collection data. + + + + Determines whether a given is in the PluginCollection. + + The to check for. + true if is found in the PluginCollection; otherwise, false. + + + + Returns the zero-based index of the first occurrence of a + in the PluginCollection. + + The to locate in the PluginCollection. + + The zero-based index of the first occurrence of + in the entire PluginCollection, if found; otherwise, -1. + + + + + Inserts an element into the PluginCollection at the specified index. + + The zero-based index at which should be inserted. + The to insert. + + is less than zero + -or- + is equal to or greater than . + + + + + Removes the first occurrence of a specific from the PluginCollection. + + The to remove from the PluginCollection. + + The specified was not found in the PluginCollection. + + + + + Removes the element at the specified index of the PluginCollection. + + The zero-based index of the element to remove. + + is less than zero. + -or- + is equal to or greater than . + + + + + Gets a value indicating whether the collection has a fixed size. + + true if the collection has a fixed size; otherwise, false. The default is false. + + + + Gets a value indicating whether the IList is read-only. + + true if the collection is read-only; otherwise, false. The default is false. + + + + Returns an enumerator that can iterate through the PluginCollection. + + An for the entire PluginCollection. + + + + Gets or sets the number of elements the PluginCollection can contain. + + + The number of elements the PluginCollection can contain. + + + + + Adds the elements of another PluginCollection to the current PluginCollection. + + The PluginCollection whose elements should be added to the end of the current PluginCollection. + The new of the PluginCollection. + + + + Adds the elements of a array to the current PluginCollection. + + The array whose elements should be added to the end of the PluginCollection. + The new of the PluginCollection. + + + + Adds the elements of a collection to the current PluginCollection. + + The collection whose elements should be added to the end of the PluginCollection. + The new of the PluginCollection. + + + + Adds the elements of a collection to the current PluginCollection. + + The collection whose elements should be added to the end of the PluginCollection. + The new of the PluginCollection. + + + + Sets the capacity to the actual number of elements. + + + + + is less than zero. + -or- + is equal to or greater than . + + + + + is less than zero. + -or- + is equal to or greater than . + + + + + Supports simple iteration over a . + + + + + + Initializes a new instance of the Enumerator class. + + + + + + Gets the current element in the collection. + + + + + Advances the enumerator to the next element in the collection. + + + true if the enumerator was successfully advanced to the next element; + false if the enumerator has passed the end of the collection. + + + The collection was modified after the enumerator was created. + + + + + Sets the enumerator to its initial position, before the first element in the collection. + + + + + + + + Map of repository plugins. + + The repository that the plugins should be attached to. + + + This class is a name keyed map of the plugins that are + attached to a repository. + + + Nicko Cadell + Gert Driesen + + + + Map of repository plugins. + + The repository that the plugins should be attached to. + + + This class is a name keyed map of the plugins that are + attached to a repository. + + + Nicko Cadell + Gert Driesen + + + + Gets a by name. + + The name of the to lookup. + + The from the map with the name specified, or + null if no plugin is found. + + + + + Gets all possible plugins as a list of objects. + + All possible plugins as a list of objects. + + + + Adds a to the map. + + The to add to the map. + + + The will be attached to the repository when added. + + + If there already exists a plugin with the same name + attached to the repository then the old plugin will + be and replaced with + the new plugin. + + + + + + Removes an from the map. + + The to remove from the map. + + + + Base implementation of + + + + Default abstract implementation of the + interface. This base class can be used by implementors + of the interface. + + + Nicko Cadell + Gert Driesen + + + + Constructor + + the name of the plugin + + Initializes a new Plugin with the specified name. + + + + + Gets or sets the name of the plugin. + + + The name of the plugin. + + + + Plugins are stored in the + keyed by name. Each plugin instance attached to a + repository must be a unique name. + + + The name of the plugin must not change once the + plugin has been attached to a repository. + + + + + + Attaches this plugin to a . + + The that this plugin should be attached to. + + + A plugin may only be attached to a single repository. + + + This method is called when the plugin is attached to the repository. + + + + + + Is called when the plugin is to shutdown. + + + + This method is called to notify the plugin that + it should stop operating and should detach from + the repository. + + + + + + The repository for this plugin + + + The that this plugin is attached to. + + + + Gets or sets the that this plugin is + attached to. + + + + + + + + + + + + + + + + + + + + + + Default implementation of + + + + This default implementation of the + interface is used to create the default subclass + of the object. + + + Nicko Cadell + Gert Driesen + + + + Create a new instance with the specified name. + + The that will own the . + The name of the . If null, the root logger is returned. + The instance for the specified name. + + + Called by the to create + new named instances. + + + + + + Default internal subclass of + + + + This subclass has no additional behavior over the + class but does allow instances + to be created. + + + + + + Initializes a new instance of the class + with the specified name. + + the name of the logger + + + + Delegate used to handle logger creation event notifications. + + The in which the has been created. + The event args that hold the instance that has been created. + + + + Provides data for the event. + + + + A event is raised every time a is created. + + + The that has been created. + + + + Provides data for the event. + + + + A event is raised every time a is created. + + + The that has been created. + + + + Gets the that has been created. + + + + + Hierarchical organization of loggers + + + + The casual user should not have to deal with this class directly. + + + This class is specialized in retrieving loggers by name and also maintaining the logger + hierarchy. Implements the interface. + + + The structure of the logger hierarchy is maintained by the + method. The hierarchy is such that children + link to their parent but parents do not have any references to their + children. Moreover, loggers can be instantiated in any order, in + particular descendant before ancestor. + + + In case a descendant is created before a particular ancestor, then it creates a provision node + for the ancestor and adds itself to the provision node. Other descendants of the same ancestor + add themselves to the previously created provision node. + + + Nicko Cadell + Gert Driesen + The properties to pass to this repository. + The factory to use to create new logger instances. + + + + Hierarchical organization of loggers + + + + The casual user should not have to deal with this class directly. + + + This class is specialized in retrieving loggers by name and also maintaining the logger + hierarchy. Implements the interface. + + + The structure of the logger hierarchy is maintained by the + method. The hierarchy is such that children + link to their parent but parents do not have any references to their + children. Moreover, loggers can be instantiated in any order, in + particular descendant before ancestor. + + + In case a descendant is created before a particular ancestor, then it creates a provision node + for the ancestor and adds itself to the provision node. Other descendants of the same ancestor + add themselves to the previously created provision node. + + + Nicko Cadell + Gert Driesen + The properties to pass to this repository. + The factory to use to create new logger instances. + + + + The fully qualified type of the Hierarchy class. + + + Used by the internal logger to record the type of the log message. + + + + + Event used to notify that a logger has been created. + + + + + Default constructor + + + + + Construct with properties + + The properties to pass to this repository. + + + + Construct with a logger factory + + The factory to use to create new logger instances. + + + + Has no appender warning been emitted + + + Flag to indicate if we have already issued a warning about not having an appender warning. + + + + + Get the root of this hierarchy + + + + + Gets or sets the default instance. + + + + The logger factory is used to create logger instances. + + + + + + Test if a logger exists + + The name of the logger to lookup + The Logger object with the name specified + + + Check if the named logger exists in the hierarchy. If so return + its reference, otherwise returns . + + + + + + Returns all the currently defined loggers in the hierarchy as an Array + + All the defined loggers + + + Returns all the currently defined loggers in the hierarchy as an Array. + The root logger is not included in the returned + enumeration. + + + + + + Return a new logger instance named as the first parameter using + the default factory. + + + If a logger of that name already exists, then it will be + returned. Otherwise, a new logger will be instantiated and + then linked with its existing ancestors as well as children. + + The name of the logger to retrieve + The logger object with the name specified + + + + Shutting down a hierarchy will safely close and remove + all appenders in all loggers including the root logger. + + + + Shutting down a hierarchy will safely close and remove + all appenders in all loggers including the root logger. + + + Some appenders need to be closed before the + application exists. Otherwise, pending logging events might be + lost. + + + The method is careful to close nested + appenders before closing regular appenders. This allows + configurations where a regular appender is attached to a logger + and again to a nested appender. + + + + + + Reset all values contained in this hierarchy instance to their default. + + + + Reset all values contained in this hierarchy instance to their + default. This removes all appenders from all loggers, sets + the level of all non-root loggers to , + sets their additivity flag to and sets the level + of the root logger to . Moreover, + message disabling is set its default "off" value. + + + Existing loggers are not removed. They are just reset. + + + This method should be used sparingly and with care as it will + block all logging until it is completed. + + + + + + Log the logEvent through this hierarchy. + + the event to log + + + This method should not normally be used to log. + The interface should be used + for routine logging. This interface can be obtained + using the method. + + + The is delivered to the appropriate logger and + that logger is then responsible for logging the event. + + + + + + Returns all the Appenders that are currently configured + + An array containing all the currently configured appenders + + + Returns all the instances that are currently configured. + All the loggers are searched for appenders. The appenders may also be containers + for appenders and these are also searched for additional loggers. + + + The list returned is unordered but does not contain duplicates. + + + + + + Collect the appenders from an . + The appender may also be a container. + + + + + Collect the appenders from an container + + + + + Initialize the log4net system using the specified appender + + the appender to use to log all logging events + + + + Initialize the log4net system using the specified appenders + + the appenders to use to log all logging events + + + + Initialize the log4net system using the specified appenders + + the appenders to use to log all logging events + + + This method provides the same functionality as the + method implemented + on this object, but it is protected and therefore can be called by subclasses. + + + + + + Initialize the log4net system using the specified config + + the element containing the root of the config + + + + Initialize the log4net system using the specified config + + the element containing the root of the config + + + This method provides the same functionality as the + method implemented + on this object, but it is protected and therefore can be called by subclasses. + + + + + + Test if this hierarchy is disabled for the specified . + + The level to check against. + + if the repository is disabled for the level argument, otherwise. + + + If this hierarchy has not been configured then this method will always return . + See also the property. + + + + + Clear all logger definitions from the internal hashtable + + + + This call will clear all logger definitions from the internal + hashtable. Invoking this method will irrevocably mess up the + logger hierarchy. + + + You should really know what you are doing before invoking this method. + + + + + + Returns a new logger instance named as the first parameter using + . + + The name of the logger to retrieve + The factory that will make the new logger instance + The logger object with the name specified + + + If a logger of that name already exists, then it will be + returned. Otherwise, a new logger will be instantiated by the + parameter and linked with its existing + ancestors as well as children. + + + + + + Sends a logger creation event to all registered listeners + + The newly created logger + + Raises the logger creation event. + + + + + Updates all the parents of the specified logger + + The logger to update the parents for + + + This method loops through all the potential parents of + . There 3 possible cases: + + + + No entry for the potential parent of exists + + We create a ProvisionNode for this potential + parent and insert in that provision node. + + + + The entry is of type Logger for the potential parent. + + The entry is 's nearest existing parent. We + update 's parent field with this entry. We also break from + the loop because updating our parent's parent is our parent's + responsibility. + + + + The entry is of type ProvisionNode for this potential parent. + + We add to the list of children for this potential parent. + + + + + + + + Replace a with a in the hierarchy. + + + + We update the links for all the children that placed themselves + in the provision node 'pn'. The second argument 'log' is a + reference for the newly created Logger, parent of all the + children in 'pn'. + + + We loop on all the children 'c' in 'pn'. + + + If the child 'c' has been already linked to a child of + 'log' then there is no need to update 'c'. + + + Otherwise, we set log's parent field to c's parent and set + c's parent field to log. + + + + + + Define or redefine a Level using the values in the argument + + the level values + + Supports setting levels via the configuration file. + + + + + A class to hold the value, name and display name for a level + + + + + Value of the level + + + If the value is not set (defaults to -1) the value will be looked + up for the current level with the same name. + + + + + Name of the level + + + + + Display name for the level + + + + + Override Object.ToString to return sensible debug info + + string info about this object + + + + Set a Property using the values in the argument + + the property value + + Supports setting property values via the configuration file. + + + + + Interface abstracts creation of instances + + + + This interface is used by the to + create new objects. + + + The method is called + to create a named . + + + Implement this interface to create new subclasses of . + + + Nicko Cadell + Gert Driesen + + + + Create a new instance + + The that will own the . + The name of the . + The instance for the specified name. + + + Create a new instance with the + specified name. + + + Called by the to create + new named instances. + + + If the is null then the root logger + must be returned. + + + + + + Implementation of used by + + The name of the . + + + Internal class used to provide implementation of + interface. Applications should use to get + logger instances. + + + This is one of the central classes in the log4net implementation. One of the + distinctive features of log4net are hierarchical loggers and their + evaluation. The organizes the + instances into a rooted tree hierarchy. + + + The class is abstract. Only concrete subclasses of + can be created. The + is used to create instances of this type for the . + + + Nicko Cadell + Gert Driesen + Aspi Havewala + Douglas de la Torre + + + + Implementation of used by + + The name of the . + + + Internal class used to provide implementation of + interface. Applications should use to get + logger instances. + + + This is one of the central classes in the log4net implementation. One of the + distinctive features of log4net are hierarchical loggers and their + evaluation. The organizes the + instances into a rooted tree hierarchy. + + + The class is abstract. Only concrete subclasses of + can be created. The + is used to create instances of this type for the . + + + Nicko Cadell + Gert Driesen + Aspi Havewala + Douglas de la Torre + + + + The fully qualified type of the Logger class. + + + + + The parent of this logger. + + + + All loggers have at least one ancestor which is the root logger. + + + + + + Loggers need to know what Hierarchy they are in. + + + + + Helper implementation of the interface + + + + + Lock to protect AppenderAttachedImpl variable appenderAttachedImpl + + + + + Gets or sets the parent logger in the hierarchy. + + + The parent logger in the hierarchy. + + + + Part of the Composite pattern that makes the hierarchy. + The hierarchy is parent linked rather than child linked. + + + + + + Gets or sets a value indicating if child loggers inherit their parent's appenders. + + + if child loggers inherit their parent's appenders. + + + + Additivity is set to by default, that is children inherit + the appenders of their ancestors by default. If this variable is + set to then the appenders found in the + ancestors of this logger are not used. However, the children + of this logger will inherit its appenders, unless the children + have their additivity flag set to too. See + the user manual for more details. + + + + + + Gets the effective level for this logger. + + The nearest level in the logger hierarchy. + + + Starting from this logger, searches the logger hierarchy for a + non-null level and returns it. Otherwise, returns the level of the + root logger. + + The Logger class is designed so that this method executes as + quickly as possible. + + + + + Gets or sets the where this instance is attached to. + + + + + Gets or sets the assigned for this Logger. + + + + + Add to the list of appenders of this + Logger instance. + + An appender to add to this logger + + + If is already in the list of + appenders, then it won't be added again. + + + + + + Get the appenders contained in this logger as an + . + + + A collection of the appenders in this logger. If no appenders + can be found, then a is returned. + + + + + Look for the appender named as + + The name of the appender to lookup + The appender with the name specified, or . + + + + Removes all previously added appenders from this Logger instance. + + + + This is useful when re-reading configuration information. + + + + + + Remove the appender passed as parameter form the list of appenders. + + The appender to remove + The appender removed from the list + + + The appender removed is not closed. + If you are discarding the appender you must call + on the appender removed. + + + + + + Remove the appender passed as parameter form the list of appenders. + + The name of the appender to remove + The appender removed from the list + + + The appender removed is not closed. + If you are discarding the appender you must call + on the appender removed. + + + + + + Gets the logger name. + + + + + Generates a logging event for the specified using + the and . + + The declaring type of the method that is + the stack boundary into the logging system for this call. + The level of the message to be logged. + The message object to log. + The exception to log, including its stack trace. + + + This generic form is intended to be used by wrappers. + + + This method must not throw any exception to the caller. + + + + + + Logs the specified logging event through this logger. + + The event being logged. + + + This is the most generic printing method that is intended to be used + by wrappers. + + + This method must not throw any exception to the caller. + + + + + + Checks if this logger is enabled for a given passed as parameter. + + The level to check. + + if this logger is enabled for , + otherwise . + + + + This method must not throw any exception to the caller. + + + + + + Gets the where this + instance is attached to. + + + + + Deliver the to the attached appenders. + + The event to log. + + + Call the appenders in the hierarchy starting at . + If no appenders could be found, emit a warning. + + + This method calls all the appenders inherited from the + hierarchy circumventing any evaluation of whether to log or not + to log the particular log request. + + + + + + Closes all attached appenders implementing the interface. + + + + Used to ensure that the appenders are correctly shutdown. + + + + + + This is the most generic printing method. This generic form is intended to be used by wrappers + + The level of the message to be logged. + The message object to log. + The exception to log, including its stack trace. + + + Generate a logging event for the specified using + the . + + + + + + Creates a new logging event and logs the event without further checks. + + The declaring type of the method that is + the stack boundary into the logging system for this call. + The level of the message to be logged. + The message object to log. + The exception to log, including its stack trace. + + + Generates a logging event and delivers it to the attached + appenders. + + + + + + Creates a new logging event and logs the event without further checks. + + The event being logged. + + + Delivers the logging event to the attached appenders. + + + + + + Used internally to accelerate hash table searches. + + + + Internal class used to improve performance of + string keyed hashtables. + + + The hashcode of the string is cached for reuse. + The string is stored as an interned value. + When comparing two objects for equality + the reference equality of the interned strings is compared. + + + Nicko Cadell + Gert Driesen + + + + Construct key with string name + + + + Initializes a new instance of the class + with the specified name. + + + Stores the hashcode of the string and interns + the string key to optimize comparisons. + + + The Compact Framework 1.0 the + method does not work. On the Compact Framework + the string keys are not interned nor are they + compared by reference. + + + The name of the logger. + + + + Returns a hash code for the current instance. + + A hash code for the current instance. + + + Returns the cached hashcode. + + + + + + Name of the Logger + + + + + Provision nodes are used where no logger instance has been specified + + + + instances are used in the + when there is no specified + for that node. + + + A provision node holds a list of child loggers on behalf of a logger that does not exist. + + + Nicko Cadell + Gert Driesen + + + + Create a new provision node with child node + + A child logger to add to this node. + + + + Add a to the internal List + + Logger + + + + Calls for each logger in the internal list + + Callback to execute + Parant logger + + + + The sits at the root of the logger hierarchy tree. + + + + The is a regular except + that it provides several guarantees. + + + First, it cannot be assigned a null + level. Second, since the root logger cannot have a parent, the + property always returns the value of the + level field without walking the hierarchy. + + + Nicko Cadell + Gert Driesen + + + + Construct a + + The level to assign to the root logger. + + + Initializes a new instance of the class with + the specified logging level. + + + The root logger names itself as "root". However, the root + logger cannot be retrieved by name. + + + + + + Gets the assigned level value without walking the logger hierarchy. + + The assigned level value without walking the logger hierarchy. + + + Because the root logger cannot have a parent and its level + must not be null this property just returns the + value of . + + + + + + Gets or sets the assigned for the root logger. + + + The of the root logger. + + + + Setting the level of the root logger to a null reference + may have catastrophic results. We prevent this here. + + + + + + The fully qualified type of the RootLogger class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Initializes the log4net environment using an XML DOM. + + The hierarchy to build. + Nicko Cadell + Gert Driesen + + + + Initializes the log4net environment using an XML DOM. + + The hierarchy to build. + Nicko Cadell + Gert Driesen + + + + Configure the hierarchy by parsing a DOM tree of XML elements. + + The root element to parse. + + + Configure the hierarchy by parsing a DOM tree of XML elements. + + + + + + Parse appenders by IDREF. + + The appender ref element. + The instance of the appender that the ref refers to. + + + Parse an XML element that represents an appender and return + the appender. + + + + + + Parses an appender element. + + The appender element. + The appender instance or null when parsing failed. + + + Parse an XML element that represents an appender and return + the appender instance. + + + + + + Parses a logger element. + + The logger element. + + + Parse an XML element that represents a logger. + + + + + + Parses the root logger element. + + The root element. + + + Parse an XML element that represents the root logger. + + + + + + Parses the children of a logger element. + + The category element. + The logger instance. + Flag to indicate if the logger is the root logger. + + + Parse the child elements of a <logger> element. + + + + + + Parses an object renderer. + + The renderer element. + + + Parse an XML element that represents a renderer. + + + + + + Parses a level element. + + The level element. + The logger object to set the level on. + Flag to indicate if the logger is the root logger. + + + Parse an XML element that represents a level. + + + + + + Sets a parameter on an object. + + The parameter element. + The object to set the parameter on. + + The parameter name must correspond to a writable property + on the object. The value of the parameter is a string, + therefore this function will attempt to set a string + property first. If unable to set a string property it + will inspect the property and its argument type. It will + attempt to call a static method called Parse on the + type of the property. This method will take a single + string argument and return a value that can be used to + set the property. + + + + + Test if an element has no attributes or child elements + + the element to inspect + true if the element has any attributes or child elements, false otherwise + + + + Test if a is constructible with Activator.CreateInstance. + + the type to inspect + true if the type is creatable using a default constructor, false otherwise + + + + Look for a method on the that matches the supplied + + the type that has the method + the name of the method + the method info found + + + The method must be a public instance method on the . + The method must be named or "Add" followed by . + The method must take a single parameter. + + + + + + Converts a string value to a target type. + + The type of object to convert the string to. + The string value to use as the value of the object. + + + An object of type with value or + null when the conversion could not be performed. + + + + + + Creates an object as specified in XML. + + The XML element that contains the definition of the object. + The object type to use if not explicitly specified. + The type that the returned object must be or must inherit from. + The object or null + + + Parse an XML element and create an object instance based on the configuration + data. + + + The type of the instance may be specified in the XML. If not + specified then the is used + as the type. However the type is specified it must support the + type. + + + + + + key: appenderName, value: appender. + + + + + The fully qualified type of the XmlHierarchyConfigurator class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Basic Configurator interface for repositories + + + + Interface used by basic configurator to configure a + with a default . + + + A should implement this interface to support + configuration by the . + + + Nicko Cadell + Gert Driesen + + + + Initialize the repository using the specified appender + + the appender to use to log all logging events + + + Configure the repository to route all logging events to the + specified appender. + + + + + + Initialize the repository using the specified appenders + + the appenders to use to log all logging events + + + Configure the repository to route all logging events to the + specified appenders. + + + + + + Delegate used to handle logger repository shutdown event notifications. + + The that is shutting down. + Empty event args + + + + Delegate used to handle logger repository configuration reset event notifications. + + The that has had its configuration reset. + Empty event args + + + + Delegate used to handle event notifications for logger repository configuration changes. + + The that has had its configuration changed. + Empty event arguments. + + + + Interface implemented by logger repositories, e.g. , and used by the + to obtain instances. + + Nicko Cadell + Gert Driesen + + + + Gets or sets the name of the repository. + + + + + Gets the map from types to instances for custom rendering. + + + + + Gets the map from plugin name to plugin value for plugins attacked to this repository. + + + + + Gets the map from level names and values for this repository. + + + + + Gets or sets the threshold for all events in this repository. + + + + + Gets the named logger, or null. + + The name of the logger to look up. + The logger if found, or null. + + + + Gets all the currently defined loggers. + + + + + Returns a named logger instance + + The name of the logger to retrieve + The logger object with the name specified + + + Returns a named logger instance. + + + If a logger of that name already exists, then it will be + returned. Otherwise, a new logger will be instantiated and + then linked with its existing ancestors as well as children. + + + + + + Shuts down the repository, safely closing and removing + all appenders in all loggers including the root logger. + + + + Some appenders need to be closed before the + application exists. Otherwise, pending logging events might be + lost. + + + The method is careful to close nested + appenders before closing regular appenders. This allows + configurations where a regular appender is attached to a logger + and again to a nested appender. + + + + + + Resets the repository configuration to a default state. Loggers are reset but not removed. + + + + This method should be used sparingly and with care as it will + block all logging until it is completed. + + + + + + Logs a through this repository. + + The event to log. + + + This method should not normally be used to log. + The interface should be used + for routine logging. This interface can be obtained + using the method. + + + The logEvent is delivered to the appropriate logger and + that logger is then responsible for logging the event. + + + + + + Gets or sets a value that indicates whether this repository has been configured. + + + + + Collection of internal messages captured during the most + recent configuration process. + + + + + Event to notify that the repository has been shut down. + + + + + Event to notify that the repository has had its configuration reset to default. + + + + + Event to notify that the repository's configuration has changed. + + + + + Repository specific properties. + + + + + Gets all Appenders that are configured for this repository. + + + + + Configure repository using XML + + + + Interface used by Xml configurator to configure a . + + + A should implement this interface to support + configuration by the . + + + Nicko Cadell + Gert Driesen + + + + Initialize the repository using the specified config + + the element containing the root of the config + + + The schema for the XML configuration data is defined by + the implementation. + + + + + + Base implementation of + + + + Default abstract implementation of the interface. + + + Skeleton implementation of the interface. + All types can extend this type. + + + Nicko Cadell + Gert Driesen + + + + Default Constructor + + + + Initializes the repository with default (empty) properties. + + + + + + Construct the repository using specific properties + + the properties to set for this repository + + + Initializes the repository with specified properties. + + + + + + The name of the repository + + + The string name of the repository + + + + The name of this repository. The name is + used to store and lookup the repositories + stored by the . + + + + + + The threshold for all events in this repository + + + The threshold for all events in this repository + + + + The threshold for all events in this repository + + + + + + RendererMap accesses the object renderer map for this repository. + + + RendererMap accesses the object renderer map for this repository. + + + + RendererMap accesses the object renderer map for this repository. + + + The RendererMap holds a mapping between types and + objects. + + + + + + The plugin map for this repository. + + + The plugin map for this repository. + + + + The plugin map holds the instances + that have been attached to this repository. + + + + + + Get the level map for the Repository. + + + + Get the level map for the Repository. + + + The level map defines the mappings between + level names and objects in + this repository. + + + + + + Test if logger exists + + The name of the logger to lookup + The Logger object with the name specified + + + Check if the named logger exists in the repository. If so return + its reference, otherwise returns null. + + + + + + Returns all the currently defined loggers in the repository + + All the defined loggers + + + Returns all the currently defined loggers in the repository as an Array. + + + + + + Return a new logger instance + + The name of the logger to retrieve + The logger object with the name specified + + + Return a new logger instance. + + + If a logger of that name already exists, then it will be + returned. Otherwise, a new logger will be instantiated and + then linked with its existing ancestors as well as children. + + + + + + Shutdown the repository + + + + Shutdown the repository. Can be overridden in a subclass. + This base class implementation notifies the + listeners and all attached plugins of the shutdown event. + + + + + + Reset the repositories configuration to a default state + + + + Reset all values contained in this instance to their + default state. + + + Existing loggers are not removed. They are just reset. + + + This method should be used sparingly and with care as it will + block all logging until it is completed. + + + + + + Log the logEvent through this repository. + + the event to log + + + This method should not normally be used to log. + The interface should be used + for routine logging. This interface can be obtained + using the method. + + + The logEvent is delivered to the appropriate logger and + that logger is then responsible for logging the event. + + + + + + Flag indicates if this repository has been configured. + + + + + Contains a list of internal messages captured during the + last configuration. + + + + + Event to notify that the repository has been shutdown. + + + Event to notify that the repository has been shutdown. + + + + Event raised when the repository has been shutdown. + + + + + + Event to notify that the repository has had its configuration reset. + + + Event to notify that the repository has had its configuration reset. + + + + Event raised when the repository's configuration has been + reset to default. + + + + + + Event to notify that the repository has had its configuration changed. + + + Event to notify that the repository has had its configuration changed. + + + + Event raised when the repository's configuration has been changed. + + + + + + Repository specific properties + + + Repository specific properties + + + These properties can be specified on a repository specific basis + + + + + Returns all the Appenders that are configured as an Array. + + All the Appenders + + + Returns all the Appenders that are configured as an Array. + + + + + + The fully qualified type of the LoggerRepositorySkeleton class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Adds an object renderer for a specific class. + + The type that will be rendered by the renderer supplied. + The object renderer used to render the object. + + + Adds an object renderer for a specific class. + + + + + + Notify the registered listeners that the repository is shutting down + + Empty EventArgs + + + Notify any listeners that this repository is shutting down. + + + + + + Notify the registered listeners that the repository has had its configuration reset + + Empty EventArgs + + + Notify any listeners that this repository's configuration has been reset. + + + + + + Notify the registered listeners that the repository has had its configuration changed + + Empty EventArgs + + + + Raise a configuration changed event on this repository + + EventArgs.Empty + + + Applications that programmatically change the configuration of the repository should + raise this event notification to notify listeners. + + + + + + Flushes all configured Appenders that implement . + + The maximum time in milliseconds to wait for logging events from asynchronous appenders to be flushed, + or to wait indefinitely. + True if all logging events were flushed successfully, else false. + + + + The log4net Thread Context. + + + + The ThreadContext provides a location for thread specific debugging + information to be stored. + The ThreadContext properties override any + properties with the same name. + + + The thread context has a properties map and a stack. + The properties and stack can + be included in the output of log messages. The + supports selecting and outputting these properties. + + + The Thread Context provides a diagnostic context for the current thread. + This is an instrument for distinguishing interleaved log + output from different sources. Log output is typically interleaved + when a server handles multiple clients near-simultaneously. + + + The Thread Context is managed on a per thread basis. + + + Example of using the thread context properties to store a username. + + ThreadContext.Properties["user"] = userName; + log.Info("This log message has a ThreadContext Property called 'user'"); + + + Example of how to push a message into the context stack + + using(ThreadContext.Stacks["NDC"].Push("my context message")) + { + log.Info("This log message has a ThreadContext Stack message that includes 'my context message'"); + + } // at the end of the using block the message is automatically popped + + + + Nicko Cadell + + + + The thread properties map + + + The thread properties map + + + + The ThreadContext properties override any + properties with the same name. + + + + + + The thread stacks + + + stack map + + + + The thread local stacks. + + + + + + A straightforward implementation of the interface. + + + + This is the default implementation of the + interface. Implementors of the interface + should aggregate an instance of this type. + + + Nicko Cadell + Gert Driesen + + + + Constructor + + + + Initializes a new instance of the class. + + + + + + Append on on all attached appenders. + + The event being logged. + The number of appenders called. + + + Calls the method on all + attached appenders. + + + + + + Append on on all attached appenders. + + The array of events being logged. + The number of appenders called. + + + Calls the method on all + attached appenders. + + + + + + Calls the DoAppende method on the with + the objects supplied. + + The appender + The events + + + If the supports the + interface then the will be passed + through using that interface. Otherwise the + objects in the array will be passed one at a time. + + + + + + Attaches an appender. + + The appender to add. + + + If the appender is already in the list it won't be added again. + + + + + + Gets all attached appenders. + + + A collection of attached appenders, or null if there + are no attached appenders. + + + + The read only collection of all currently attached appenders. + + + + + + Gets an attached appender with the specified name. + + The name of the appender to get. + + The appender with the name specified, or null if no appender with the + specified name is found. + + + + Lookup an attached appender by name. + + + + + + Removes all attached appenders. + + + + Removes and closes all attached appenders + + + + + + Removes the specified appender from the list of attached appenders. + + The appender to remove. + The appender removed from the list + + + The appender removed is not closed. + If you are discarding the appender you must call + on the appender removed. + + + + + + Removes the appender with the specified name from the list of appenders. + + The name of the appender to remove. + The appender removed from the list + + + The appender removed is not closed. + If you are discarding the appender you must call + on the appender removed. + + + + + + List of appenders + + + + + Array of appenders, used to cache the appenderList + + + + + The fully qualified type of the AppenderAttachedImpl class. + + + Used by the internal logger to record the Type of the + log message. + + + + + This class aggregates several PropertiesDictionary collections together. + + + + Provides a dictionary style lookup over an ordered list of + collections. + + + Nicko Cadell + + + + Constructor + + + + Initializes a new instance of the class. + + + + + + Gets the value of a property + + + The value for the property with the specified key + + + + Looks up the value for the specified. + The collections are searched + in the order in which they were added to this collection. The value + returned is the value held by the first collection that contains + the specified key. + + + If none of the collections contain the specified key then + null is returned. + + + + + + Add a Properties Dictionary to this composite collection + + the properties to add + + + Properties dictionaries added first take precedence over dictionaries added + later. + + + + + + Flatten this composite collection into a single properties dictionary + + the flattened dictionary + + + Reduces the collection of ordered dictionaries to a single dictionary + containing the resultant values for the keys. + + + + + + Base class for Context Properties implementations + + Nicko Cadell + + + + Gets or sets the value of a property. + + + + + Wrapper class used to map converter names to converter types + + + + Pattern converter info class used during configuration by custom + PatternString and PatternLayer converters. + + + + + + Gets or sets the name of the conversion pattern in the format string. + + + + + Gets or sets the type of the converter. The type must extend . + + + + + + + + + + + + + + + + Subclass of that maintains a count of + the number of bytes written. + + + + This writer counts the number of bytes written. + + + Nicko Cadell + Gert Driesen + + + + Constructor + + The to actually write to. + The to report errors to. + + + Creates a new instance of the class + with the specified and . + + + + + + Writes a character to the underlying writer and counts the number of bytes written. + + the char to write + + + Overrides implementation of . Counts + the number of bytes written. + + + + + + Writes a buffer to the underlying writer and counts the number of bytes written. + + the buffer to write + the start index to write from + the number of characters to write + + + Overrides implementation of . Counts + the number of bytes written. + + + + + + Writes a string to the output and counts the number of bytes written. + + The string data to write to the output. + + + Overrides implementation of . Counts + the number of bytes written. + + + + + + Gets or sets the total number of bytes written. + + + The total number of bytes written. + + + + Gets or sets the total number of bytes written. + + + + + + A fixed size rolling buffer of logging events. + + + + An array backed fixed size leaky bucket. + + + Nicko Cadell + Gert Driesen + + + + Constructor + + The maximum number of logging events in the buffer. + + + Initializes a new instance of the class with + the specified maximum number of buffered logging events. + + + The argument is not a positive integer. + + + + Appends a to the buffer. + + The event to append to the buffer. + The event discarded from the buffer, if the buffer is full, otherwise null. + + + Append an event to the buffer. If the buffer still contains free space then + null is returned. If the buffer is full then an event will be dropped + to make space for the new event, the dropped event is returned. + + + + + + Get and remove the oldest event in the buffer. + + The oldest logging event in the buffer + + + Gets the oldest (first) logging event in the buffer and removes it + from the buffer. + + + + + + Pops all the logging events from the buffer into an array. + + An array of all the logging events in the buffer. + + + Get all the events in the buffer and clear the buffer. + + + + + + Clear the buffer + + + + Clear the buffer of all events. The events in the buffer are lost. + + + + + + Gets the th oldest event currently in the buffer. + + + + If is outside the range 0 to the number of events + currently in the buffer, then null is returned. + + + + + + Gets the maximum size of the buffer. + + The maximum size of the buffer. + + + Gets the maximum size of the buffer + + + + + + Gets the number of logging events in the buffer. + + The number of logging events in the buffer. + + + This number is guaranteed to be in the range 0 to + (inclusive). + + + + + + An always empty . + + + + A singleton implementation of the + interface that always represents an empty collection. + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + + Uses a private access modifier to enforce the singleton pattern. + + + + + + Gets the singleton instance of the empty collection. + + The singleton instance of the empty collection. + + + Gets the singleton instance of the empty collection. + + + + + + Copies the elements of the to an + , starting at a particular Array index. + + The one-dimensional + that is the destination of the elements copied from + . The Array must have zero-based + indexing. + The zero-based index in array at which + copying begins. + + + As the collection is empty no values are copied into the array. + + + + + + Gets a value indicating if access to the is synchronized (thread-safe). + + + true if access to the is synchronized (thread-safe); otherwise, false. + + + + For the this property is always true. + + + + + + Gets the number of elements contained in the . + + + The number of elements contained in the . + + + + As the collection is empty the is always 0. + + + + + + Gets an object that can be used to synchronize access to the . + + + An object that can be used to synchronize access to the . + + + + As the collection is empty and thread safe and synchronized this instance is also + the object. + + + + + + Returns an enumerator that can iterate through a collection. + + + An that can be used to + iterate through the collection. + + + + As the collection is empty a is returned. + + + + + + An always empty . + + + + A singleton implementation of the + interface that always represents an empty collection. + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + + Uses a private access modifier to enforce the singleton pattern. + + + + + + Gets the singleton instance of the . + + The singleton instance of the . + + + Gets the singleton instance of the . + + + + + + Copies the elements of the to an + , starting at a particular Array index. + + The one-dimensional + that is the destination of the elements copied from + . The Array must have zero-based + indexing. + The zero-based index in array at which + copying begins. + + + As the collection is empty no values are copied into the array. + + + + + + Gets a value indicating if access to the is synchronized (thread-safe). + + + true if access to the is synchronized (thread-safe); otherwise, false. + + + + For the this property is always true. + + + + + + Gets the number of elements contained in the + + + The number of elements contained in the . + + + + As the collection is empty the is always 0. + + + + + + Gets an object that can be used to synchronize access to the . + + + An object that can be used to synchronize access to the . + + + + As the collection is empty and thread safe and synchronized this instance is also + the object. + + + + + + Returns an enumerator that can iterate through a collection. + + + An that can be used to + iterate through the collection. + + + + As the collection is empty a is returned. + + + + + + Adds an element with the provided key and value to the + . + + The to use as the key of the element to add. + The to use as the value of the element to add. + + + As the collection is empty no new values can be added. A + is thrown if this method is called. + + + This dictionary is always empty and cannot be modified. + + + + Removes all elements from the . + + + + As the collection is empty no values can be removed. A + is thrown if this method is called. + + + This dictionary is always empty and cannot be modified. + + + + Determines whether the contains an element + with the specified key. + + The key to locate in the . + false + + + As the collection is empty the method always returns false. + + + + + + Returns an enumerator that can iterate through a collection. + + + An that can be used to + iterate through the collection. + + + + As the collection is empty a is returned. + + + + + + Removes the element with the specified key from the . + + The key of the element to remove. + + + As the collection is empty no values can be removed. A + is thrown if this method is called. + + + This dictionary is always empty and cannot be modified. + + + + Gets a value indicating whether the has a fixed size. + + true + + + As the collection is empty always returns true. + + + + + + Gets a value indicating whether the is read-only. + + true + + + As the collection is empty always returns true. + + + + + + Gets an containing the keys of the . + + An containing the keys of the . + + + As the collection is empty a is returned. + + + + + + Gets an containing the values of the . + + An containing the values of the . + + + As the collection is empty a is returned. + + + + + + Gets or sets the element with the specified key. + + The key of the element to get or set. + null + + + As the collection is empty no values can be looked up or stored. + If the index getter is called then null is returned. + A is thrown if the setter is called. + + + This dictionary is always empty and cannot be modified. + + + + Wrapper for an + + acts like the wrapped encoding, but without a preamble + + + + + + + wraps the in case it has a preamble + + Encoding to check + encoding without preamble + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Contain the information obtained when parsing formatting modifiers + in conversion modifiers. + + + + Holds the formatting information extracted from the format string by + the . This is used by the + objects when rendering the output. + + + Nicko Cadell + Gert Driesen + + + + Defaut Constructor + + + + Initializes a new instance of the class. + + + + + + Constructor + + + + Initializes a new instance of the class + with the specified parameters. + + + + + + Gets or sets the minimum value. + + + + + Gets or sets the maximum value. + + + + + Gets or sets a flag indicating whether left align is enabled. + or not. + + + + + Implementation of Properties collection for the + + + + This class implements a properties collection that is thread safe and supports both + storing properties and capturing a read only copy of the current propertied. + + + This class is optimized to the scenario where the properties are read frequently + and are modified infrequently. + + + Nicko Cadell + + + + The read only copy of the properties. + + + + This variable is declared volatile to prevent the compiler and JIT from + reordering reads and writes of this thread performed on different threads. + + + + + + Lock object used to synchronize updates within this instance + + + + + Constructor + + + + Initializes a new instance of the class. + + + + + + Gets or sets the value of a property + + + The value for the property with the specified key + + + + Reading the value for a key is faster than setting the value. + When the value is written a new read only copy of + the properties is created. + + + + + + Remove a property from the global context + + the key for the entry to remove + + + Removing an entry from the global context properties is relatively expensive compared + with reading a value. + + + + + + Clear the global context properties + + + + + Get a readonly immutable copy of the properties + + the current global context properties + + + This implementation is fast because the GlobalContextProperties class + stores a readonly copy of the properties. + + + + + + The static class ILogExtensions contains a set of widely used + methods that ease the interaction with the ILog interface implementations. + + + + This class contains methods for logging at different levels and checks the + properties for determining if those logging levels are enabled in the current + configuration. + + + Simple example of logging messages + + using log4net.Util; + + ILog log = LogManager.GetLogger("application-log"); + + log.InfoExt("Application Start"); + log.DebugExt("This is a debug message"); + + + + + + The fully qualified type of the Logger class. + + + + + Log a message object with the level. + + The logger on which the message is logged. + The lambda expression that gets the object to log. + + + This method first checks if this logger is INFO + enabled by reading the value property. + This check happens always and does not depend on the + implementation. If this logger is INFO enabled, then it converts + the message object (retrieved by invocation of the provided callback) to a + string by invoking the appropriate . + It then proceeds to call all the registered appenders in this logger + and also higher in the hierarchy depending on the value of + the additivity flag. + + WARNING Note that passing an + to this method will print the name of the + but no stack trace. To print a stack trace use the + form instead. + + + + + + + + Log a message object with the level including + the stack trace of the passed + as a parameter. + + The logger on which the message is logged. + The lambda expression that gets the object to log. + The exception to log, including its stack trace. + + + See the form for more detailed information. + + + + + + + Log a message object with the level. //TODO + + Log a message object with the level. + + The logger on which the message is logged. + The message object to log. + + + This method first checks if this logger is INFO + enabled by reading the value property. + This check happens always and does not depend on the + implementation. If this logger is INFO enabled, then it converts + the message object (passed as parameter) to a string by invoking the appropriate + . It then + proceeds to call all the registered appenders in this logger + and also higher in the hierarchy depending on the value of + the additivity flag. + + WARNING Note that passing an + to this method will print the name of the + but no stack trace. To print a stack trace use the + form instead. + + + + + + + + Log a message object with the level including + the stack trace of the passed + as a parameter. + + The logger on which the message is logged. + The message object to log. + The exception to log, including its stack trace. + + + See the form for more detailed information. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + An that supplies culture-specific formatting information + The logger on which the message is logged. + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object to format + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Log a message object with the level. + + The logger on which the message is logged. + The lambda expression that gets the object to log. + + + This method first checks if this logger is INFO + enabled by reading the value property. + This check happens always and does not depend on the + implementation. If this logger is INFO enabled, then it converts + the message object (retrieved by invocation of the provided callback) to a + string by invoking the appropriate . + It then proceeds to call all the registered appenders in this logger + and also higher in the hierarchy depending on the value of + the additivity flag. + + WARNING Note that passing an + to this method will print the name of the + but no stack trace. To print a stack trace use the + form instead. + + + + + + + + Log a message object with the level including + the stack trace of the passed + as a parameter. + + The logger on which the message is logged. + The lambda expression that gets the object to log. + The exception to log, including its stack trace. + + + See the form for more detailed information. + + + + + + + Log a message object with the level. //TODO + + Log a message object with the level. + + The logger on which the message is logged. + The message object to log. + + + This method first checks if this logger is INFO + enabled by reading the value property. + This check happens always and does not depend on the + implementation. If this logger is INFO enabled, then it converts + the message object (passed as parameter) to a string by invoking the appropriate + . It then + proceeds to call all the registered appenders in this logger + and also higher in the hierarchy depending on the value of + the additivity flag. + + WARNING Note that passing an + to this method will print the name of the + but no stack trace. To print a stack trace use the + form instead. + + + + + + + + Log a message object with the level including + the stack trace of the passed + as a parameter. + + The logger on which the message is logged. + The message object to log. + The exception to log, including its stack trace. + + + See the form for more detailed information. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + An that supplies culture-specific formatting information + The logger on which the message is logged. + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object to format + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Log a message object with the level. + + The logger on which the message is logged. + The lambda expression that gets the object to log. + + + This method first checks if this logger is WARN + enabled by reading the value property. + This check happens always and does not depend on the + implementation. If this logger is WARN enabled, then it converts + the message object (retrieved by invocation of the provided callback) to a + string by invoking the appropriate . + It then proceeds to call all the registered appenders in this logger + and also higher in the hierarchy depending on the value of + the additivity flag. + + WARNING Note that passing an + to this method will print the name of the + but no stack trace. To print a stack trace use the + form instead. + + + + + + + + Log a message object with the level including + the stack trace of the passed + as a parameter. + + The logger on which the message is logged. + The lambda expression that gets the object to log. + The exception to log, including its stack trace. + + + See the form for more detailed information. + + + + + + + Log a message object with the level. //TODO + + Log a message object with the level. + + The logger on which the message is logged. + The message object to log. + + + This method first checks if this logger is WARN + enabled by reading the value property. + This check happens always and does not depend on the + implementation. If this logger is WARN enabled, then it converts + the message object (passed as parameter) to a string by invoking the appropriate + . It then + proceeds to call all the registered appenders in this logger + and also higher in the hierarchy depending on the value of + the additivity flag. + + WARNING Note that passing an + to this method will print the name of the + but no stack trace. To print a stack trace use the + form instead. + + + + + + + + Log a message object with the level including + the stack trace of the passed + as a parameter. + + The logger on which the message is logged. + The message object to log. + The exception to log, including its stack trace. + + + See the form for more detailed information. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + An that supplies culture-specific formatting information + The logger on which the message is logged. + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object to format + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Log a message object with the level. + + The logger on which the message is logged. + The lambda expression that gets the object to log. + + + This method first checks if this logger is ERROR + enabled by reading the value property. + This check happens always and does not depend on the + implementation. If this logger is ERROR enabled, then it converts + the message object (retrieved by invocation of the provided callback) to a + string by invoking the appropriate . + It then proceeds to call all the registered appenders in this logger + and also higher in the hierarchy depending on the value of + the additivity flag. + + WARNING Note that passing an + to this method will print the name of the + but no stack trace. To print a stack trace use the + form instead. + + + + + + + + Log a message object with the level including + the stack trace of the passed + as a parameter. + + The logger on which the message is logged. + The lambda expression that gets the object to log. + The exception to log, including its stack trace. + + + See the form for more detailed information. + + + + + + + Log a message object with the level. //TODO + + Log a message object with the level. + + The logger on which the message is logged. + The message object to log. + + + This method first checks if this logger is ERROR + enabled by reading the value property. + This check happens always and does not depend on the + implementation. If this logger is ERROR enabled, then it converts + the message object (passed as parameter) to a string by invoking the appropriate + . It then + proceeds to call all the registered appenders in this logger + and also higher in the hierarchy depending on the value of + the additivity flag. + + WARNING Note that passing an + to this method will print the name of the + but no stack trace. To print a stack trace use the + form instead. + + + + + + + + Log a message object with the level including + the stack trace of the passed + as a parameter. + + The logger on which the message is logged. + The message object to log. + The exception to log, including its stack trace. + + + See the form for more detailed information. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + An that supplies culture-specific formatting information + The logger on which the message is logged. + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object to format + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Log a message object with the level. + + The logger on which the message is logged. + The lambda expression that gets the object to log. + + + This method first checks if this logger is FATAL + enabled by reading the value property. + This check happens always and does not depend on the + implementation. If this logger is FATAL enabled, then it converts + the message object (retrieved by invocation of the provided callback) to a + string by invoking the appropriate . + It then proceeds to call all the registered appenders in this logger + and also higher in the hierarchy depending on the value of + the additivity flag. + + WARNING Note that passing an + to this method will print the name of the + but no stack trace. To print a stack trace use the + form instead. + + + + + + + + Log a message object with the level including + the stack trace of the passed + as a parameter. + + The logger on which the message is logged. + The lambda expression that gets the object to log. + The exception to log, including its stack trace. + + + See the form for more detailed information. + + + + + + + Log a message object with the level. //TODO + + Log a message object with the level. + + The logger on which the message is logged. + The message object to log. + + + This method first checks if this logger is FATAL + enabled by reading the value property. + This check happens always and does not depend on the + implementation. If this logger is FATAL enabled, then it converts + the message object (passed as parameter) to a string by invoking the appropriate + . It then + proceeds to call all the registered appenders in this logger + and also higher in the hierarchy depending on the value of + the additivity flag. + + WARNING Note that passing an + to this method will print the name of the + but no stack trace. To print a stack trace use the + form instead. + + + + + + + + Log a message object with the level including + the stack trace of the passed + as a parameter. + + The logger on which the message is logged. + The message object to log. + The exception to log, including its stack trace. + + + See the form for more detailed information. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + An that supplies culture-specific formatting information + The logger on which the message is logged. + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object to format + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Manages an ordered mapping from instances + to subclasses. + + Nicko Cadell + + + + Add a to this mapping + + the entry to add + + + If a has previously been added + for the same then that entry will be + overwritten. + + + + + + Looks up the value for the specified level. Finds the nearest + mapping value for the level that is equal to or less than the + specified. + + the level to look up. + The for the level or if no mapping found + + + + Initialize options + + + Caches the sorted list of + + + + + An abstract base class for types that are stored in the + object. + + Nicko Cadell + + + + Default protected constructor + + + + + Gets or sets the level that is the key for this mapping. + + + + + Initialize any options defined on this entry + + + + Should be overridden by any classes that need to initialize based on their options + + + + + + Class for assertions + + + + + Ensures that is not and returns the validated value + + Type of + Value to validate + Name of the value + Error message (optional) + Value (when not null) + + + + + Ensures that is not null and an instance of + and returns the validated value + + Type to check for + Value to validate + Name of the value + Error message (optional) + Value (when not null and of the required type) + + + + + + Determines whether this is a fatal exception that should not be handled + + Exception + , if it is a fatal exception, otherwise + + + + Implementation of Properties collection for the + + + + Class implements a collection of properties that is specific to each thread. + The class is not synchronized as each thread has its own . + + + This class stores its properties in a slot on the named + for .net4x, + otherwise System.Threading.AsyncLocal + + + Nicko Cadell + + + + Flag used to disable this context if we don't have permission to access the CallContext. + + + + + Constructor + + + + Initializes a new instance of the class. + + + + + + + + + Remove a property + + the key for the entry to remove + + + Remove the value for the specified from the context. + + + + + + Clear all the context properties + + + + Clear all the context properties + + + + + + Get the PropertiesDictionary stored in the LocalDataStoreSlot for this thread. + + create the dictionary if it does not exist, otherwise return null if it does not exist + the properties for this thread + + + The collection returned is only to be used on the calling thread. If the + caller needs to share the collection between different threads then the + caller must clone the collection before doings so. + + + + + + Gets the call context get data. + + The properties dictionary stored in the call context + + The method GetData security link demand, therefore we must + put the method call in a separate method that we can wrap in an exception handler. + + + + + Sets the call context data. + + The properties. + + The method SetData has a security link demand, therefore we must + put the method call in a separate method that we can wrap in an exception handler. + + + + + The fully qualified type of the LogicalThreadContextProperties class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Delegate type used for LogicalThreadContextStack's callbacks. + + + + + Implementation of Stack for the + + Nicko Cadell + + + + The stack store. + + + + + The name of this within the + . + + + + + The callback used to let the register a + new instance of a . + + + + + Internal constructor + + + + Initializes a new instance of the class. + + + + + + Gets the number of messages in the stack. + + + + The current number of messages in the stack. That is + the number of times has been called + minus the number of times has been called. + + + + + + Clears all the contextual information held in this stack. + + + + Clears all the contextual information held in this stack. + Only call this if you think that this thread is being reused after + a previous call execution which may not have completed correctly. + You do not need to use this method if you always guarantee to call + the method of the + returned from even in exceptional circumstances, + for example by using the using(log4net.LogicalThreadContext.Stacks["NDC"].Push("Stack_Message")) + syntax. + + + + + + Removes the top context from this stack. + + The message in the context that was removed from the top of this stack. + + + Remove the top context from this stack, and return + it to the caller. If this stack is empty then an + empty string (not ) is returned. + + + + + + Pushes a new context message into this stack. + + The new context message. + + An that can be used to clean up the context stack. + + + + Pushes a new context onto this stack. An + is returned that can be used to clean up this stack. This + can be easily combined with the using keyword to scope the + context. + + + Simple example of using the Push method with the using keyword. + + using(log4net.LogicalThreadContext.Stacks["NDC"].Push("Stack_Message")) + { + log.Warn("This should have an ThreadContext Stack message"); + } + + + + + + Returns the top context from this stack. + + The message in the context from the top of this stack. + + + Returns the top context from this stack. If this stack is empty then an + empty string (not ) is returned. + + + + + + Gets the current context information for this stack. + + The current context information. + + + + Gets the current context information for this stack. + + Gets the current context information + + + + Gets a cross-thread portable version of this object + + + + + Inner class used to represent a single context frame in the stack. + + + + + Constructor + + The message for this context. + The parent context in the chain. + + + Initializes a new instance of the class + with the specified message and parent context. + + + + + + Get the message. + + The message. + + + Get the message. + + + + + + Gets the full text of the context down to the root level. + + + The full text of the context down to the root level. + + + + Gets the full text of the context down to the root level. + + + + + + Struct returned from the method. + + + + This struct implements the and is designed to be used + with the pattern to remove the stack frame at the end of the scope. + + + + + + The depth to trim the stack to when this instance is disposed + + + + + The outer LogicalThreadContextStack. + + + + + Constructor + + The internal stack used by the ThreadContextStack. + The depth to return the stack to when this object is disposed. + + + Initializes a new instance of the class with + the specified stack and return depth. + + + + + + Returns the stack to the correct depth. + + + + Returns the stack to the correct depth. + + + + + + Implementation of Stacks collection for the + + Nicko Cadell + + + + Internal constructor + + + + Initializes a new instance of the class. + + + + + + Gets the named thread context stack + + + The named stack + + + + Gets the named thread context stack + + + + + + The fully qualified type of the ThreadContextStacks class. + + + Used by the internal logger to record the Type of the + log message. + + + + + LogReceivedEventHandler + + + + + Outputs log statements from within the log4net assembly. + + + + Log4net components cannot make log4net logging calls. However, it is + sometimes useful for the user to learn about what log4net is + doing. + + + All log4net internal debug calls go to the standard output stream + whereas internal error messages are sent to the standard error output + stream. + + + Nicko Cadell + Gert Driesen + + + + The event raised when an internal message has been received. + + + + + The Type that generated the internal message. + + + + + The DateTime stamp of when the internal message was received. + + + + + The UTC DateTime stamp of when the internal message was received. + + + + + A string indicating the severity of the internal message. + + + "log4net: ", + "log4net:ERROR ", + "log4net:WARN " + + + + + The internal log message. + + + + + The Exception related to the message. + + + Optional. Will be null if no Exception was passed. + + + + + Formats Prefix, Source, and Message in the same format as the value + sent to Console.Out and Trace.Write. + + + + + + Initializes a new instance of the class. + + + + + Static constructor that initializes logging by reading + settings from the application configuration file. + + + + The log4net.Internal.Debug application setting + controls internal debugging. This setting should be set + to true to enable debugging. + + + The log4net.Internal.Quiet application setting + suppresses all internal logging including error messages. + This setting should be set to true to enable message + suppression. + + + + + + Gets or sets a value indicating whether log4net internal logging + is enabled or disabled. + + + true if log4net internal logging is enabled, otherwise + false. + + + + When set to true, internal debug level logging will be + displayed. + + + This value can be set by setting the application setting + log4net.Internal.Debug in the application configuration + file. + + + The default value is false, i.e. debugging is + disabled. + + + + + The following example enables internal debugging using the + application configuration file : + + + + + + + + + + + + + Gets or sets a value indicating whether log4net should generate no output + from internal logging, not even for errors. + + + true if log4net should generate no output at all from internal + logging, otherwise false. + + + + When set to true will cause internal logging at all levels to be + suppressed. This means that no warning or error reports will be logged. + This option overrides the setting and + disables all debug also. + + This value can be set by setting the application setting + log4net.Internal.Quiet in the application configuration file. + + + The default value is false, i.e. internal logging is not + disabled. + + + + The following example disables internal logging using the + application configuration file : + + + + + + + + + + + + + + + + + Raises the LogReceived event when an internal messages is received. + + + + + + + + + Test if LogLog.Debug is enabled for output. + + + true if Debug is enabled + + + + Test if LogLog.Debug is enabled for output. + + + + + + Writes log4net internal debug messages to the + standard output stream. + + + The message to log. + + + All internal debug messages are prepended with + the string "log4net: ". + + + + + + Writes log4net internal debug messages to the + standard output stream. + + The Type that generated this message. + The message to log. + An exception to log. + + + All internal debug messages are prepended with + the string "log4net: ". + + + + + + Test if LogLog.Warn is enabled for output. + + + true if Warn is enabled + + + + + Writes log4net internal warning messages to the + standard error stream. + + The Type that generated this message. + The message to log. + + + All internal warning messages are prepended with + the string "log4net:WARN ". + + + + + + Writes log4net internal warning messages to the + standard error stream. + + The Type that generated this message. + The message to log. + An exception to log. + + + All internal warning messages are prepended with + the string "log4net:WARN ". + + + + + + Test if LogLog.Error is enabled for output. + + + true if Error is enabled + + + + Test if LogLog.Error is enabled for output. + + + + + + Writes log4net internal error messages to the + standard error stream. + + The Type that generated this message. + The message to log. + + + All internal error messages are prepended with + the string "log4net:ERROR ". + + + + + + Writes log4net internal error messages to the + standard error stream. + + The Type that generated this message. + The message to log. + An exception to log. + + + All internal debug messages are prepended with + the string "log4net:ERROR ". + + + + + + Writes output to the standard output stream. + + The message to log. + + + Writes to both Console.Out and System.Diagnostics.Trace. + + + If the AppDomain is not configured with a config file then + the call to System.Diagnostics.Trace may fail. This is only + an issue if you are programmatically creating your own AppDomains. + + + + + + Writes output to the standard error stream. + + The message to log. + + + Writes to both Console.Error and System.Diagnostics.Trace. + Note that the System.Diagnostics.Trace is not supported + on the Compact Framework. + + + If the AppDomain is not configured with a config file then + the call to System.Diagnostics.Trace may fail. This is only + an issue if you are programmatically creating your own AppDomains. + + + + + + Subscribes to the LogLog.LogReceived event and stores messages + to the supplied IList instance. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Represents a Win32 native error code and message. + + Nicko Cadell + Gert Driesen + + + + Create an instance of the class with the specified + error number and message. + + The number of the native error. + The message of the native error. + + + + Gets the number of the native error. + + + The number of the native error. + + + + Gets the number of the native error. + + + + + + Gets the message of the native error. + + + + + Creates a new instance of the class for the last Windows error. + + + An instance of the class for the last windows error. + + + + The message for the error number is lookup up using the + native Win32 FormatMessage function. + + + + + + Create a new instance of the class. + + the error number for the native error + + An instance of the class for the specified + error number. + + + + The message for the specified error number is lookup up using the + native Win32 FormatMessage function. + + + + + + Retrieves the message corresponding with a Win32 message identifier. + + Message identifier for the requested message. + + The message corresponding with the specified message identifier. + + + + The message will be searched for in system message-table resource(s) + using the native FormatMessage function. + + + + + + Return error information string + + error information string + + + Return error information string + + + + + + Native Methods + + Jan Friedrich + + + + Formats a message string. + + Formatting options, and how to interpret the parameter. + Location of the message definition. + Message identifier for the requested message. + Language identifier for the requested message. + If includes FORMAT_MESSAGE_ALLOCATE_BUFFER, the function allocates a buffer using the LocalAlloc function, and places the pointer to the buffer at the address specified in . + If the FORMAT_MESSAGE_ALLOCATE_BUFFER flag is not set, this parameter specifies the maximum number of TCHARs that can be stored in the output buffer. If FORMAT_MESSAGE_ALLOCATE_BUFFER is set, this parameter specifies the minimum number of TCHARs to allocate for an output buffer. + Pointer to an array of values that are used as insert values in the formatted message. + + + The function requires a message definition as input. The message definition can come from a + buffer passed into the function. It can come from a message table resource in an + already-loaded module. Or the caller can ask the function to search the system's message + table resource(s) for the message definition. The function finds the message definition + in a message table resource based on a message identifier and a language identifier. + The function copies the formatted message text to an output buffer, processing any embedded + insert sequences if requested. + + + To prevent the usage of unsafe code, this stub does not support inserting values in the formatted message. + + + + + If the function succeeds, the return value is the number of TCHARs stored in the output + buffer, excluding the terminating null character. + + + If the function fails, the return value is zero. To get extended error information, + call . + + + + + + Stub for OutputDebugString native method + + the string to output + + + + Open connection to system logger. + + + + + Generate a log message. + + + + The libc syslog method takes a format string and a variable argument list similar + to the classic printf function. As this type of vararg list is not supported + by C# we need to specify the arguments explicitly. Here we have specified the + format string with a single message argument. The caller must set the format + string to "%s". + + + + + + Close descriptor used to write to system logger. + + + + + An always empty . + + + + A singleton implementation of the over a collection + that is empty and not modifiable. + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + + Uses a private access modifier to enforce the singleton pattern. + + + + + + Gets the singleton instance of the . + + The singleton instance of the . + + + + Gets the current object from the enumerator. + + + Throws an because the + never has a current value. + + + + As the enumerator is over an empty collection its + value cannot be moved over a valid position, therefore + will throw an . + + + The collection is empty and + cannot be positioned over a valid location. + + + + Test if the enumerator can advance, if so advance. + + false as the cannot advance. + + + As the enumerator is over an empty collection its + value cannot be moved over a valid position, therefore + will always return false. + + + + + + Resets the enumerator back to the start. + + + + As the enumerator is over an empty collection does nothing. + + + + + + Gets the current key from the enumerator. + + + Throws an exception because the + never has a current value. + + + + As the enumerator is over an empty collection its + value cannot be moved over a valid position, therefore + will throw an . + + + The collection is empty and + cannot be positioned over a valid location. + + + + Gets the current value from the enumerator. + + The current value from the enumerator. + + Throws an because the + never has a current value. + + + + As the enumerator is over an empty collection its + value cannot be moved over a valid position, therefore + will throw an . + + + The collection is empty and + cannot be positioned over a valid location. + + + + Gets the current entry from the enumerator. + + + Throws an because the + never has a current entry. + + + + As the enumerator is over an empty collection its + value cannot be moved over a valid position, therefore + will throw an . + + + The collection is empty and + cannot be positioned over a valid location. + + + + An always empty . + + + + A singleton implementation of the over a collection + that is empty and not modifiable. + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + + Uses a private access modifier to enforce the singleton pattern. + + + + + + Get the singleton instance of the . + + The singleton instance of the . + + + + Gets the current object from the enumerator. + + + Throws an because the + never has a current value. + + + + As the enumerator is over an empty collection its + value cannot be moved over a valid position, therefore + will throw an . + + + The collection is empty and + cannot be positioned over a valid location. + + + + Test if the enumerator can advance, if so advance + + false as the cannot advance. + + + As the enumerator is over an empty collection its + value cannot be moved over a valid position, therefore + will always return false. + + + + + + Resets the enumerator back to the start. + + + + As the enumerator is over an empty collection does nothing. + + + + + + A SecurityContext used when a SecurityContext is not required + + + + The is a no-op implementation of the + base class. It is used where a + is required but one has not been provided. + + + Nicko Cadell + + + + Singleton instance of + + + + Singleton instance of + + + + + + Private constructor + + + + Private constructor for singleton pattern. + + + + + + Impersonate this SecurityContext + + State supplied by the caller + null + + + No impersonation is done and null is always returned. + + + + + + Implements log4net's default error handling policy which consists + of emitting a message for the first error in an appender and + ignoring all subsequent errors. + + + + The error message is processed using the LogLog sub-system by default. + + + This policy aims at protecting an otherwise working application + from being flooded with error messages when logging fails. + + + Nicko Cadell + Gert Driesen + Ron Grabowski + + + + Default Constructor + + + + Initializes a new instance of the class. + + + + + + Constructor + + The prefix to use for each message. + + + Initializes a new instance of the class + with the specified prefix. + + + + + + Reset the error handler back to its initial disabled state. + + + + + Log an Error + + The error message. + The exception. + The internal error code. + + + Invokes if and only if this is the first error or the first error after has been called. + + + + + + Log the very first error + + The error message. + The exception. + The internal error code. + + + Sends the error information to 's Error method. + + + + + + Log an Error + + The error message. + The exception. + + + Invokes if and only if this is the first error or the first error after has been called. + + + + + + Log an error + + The error message. + + + Invokes if and only if this is the first error or the first error after has been called. + + + + + + Is error logging enabled + + + + Logging is only enabled for the first error delivered to the . + + + + + + The date the first error that triggered this error handler occurred, or if it has not been triggered. + + + + + The UTC date the first error that triggered this error handler occured, or if it has not been triggered. + + + + + The message from the first error that triggered this error handler. + + + + + The exception from the first error that triggered this error handler. + + + May be . + + + + + The error code from the first error that triggered this error handler. + + + Defaults to + + + + + String to prefix each message with + + + + + The fully qualified type of the OnlyOnceErrorHandler class. + + + Used by the internal logger to record the Type of the + log message. + + + + + A convenience class to convert property values to specific types. + + + + Utility functions for converting types and parsing values. + + + Nicko Cadell + Gert Driesen + + + + Converts a string to a value. + + String to convert. + The default value. + The value of . + + + If is "true", then true is returned. + If is "false", then false is returned. + Otherwise, is returned. + + + + + + Parses a file size into a number. + + String to parse. + The default value. + The value of . + + + Parses a file size of the form: number[KB|MB|GB] into a + long value. It is scaled with the appropriate multiplier. + + + is returned when + cannot be converted to a value. + + + + + + Converts a string to an object. + + The target type to convert to. + The string to convert to an object. + + The object converted from a string or null when the + conversion failed. + + + + Converts a string to an object. Uses the converter registry to try + to convert the string value into the specified target type. + + + + + + Checks if there is an appropriate type conversion from the source type to the target type. + + The type to convert from. + The type to convert to. + true if there is a conversion from the source type to the target type. + + Checks if there is an appropriate type conversion from the source type to the target type. + + + + + + + Converts an object to the target type. + + The object to convert to the target type. + The type to convert to. + The converted object. + + + Converts an object to the target type. + + + + + + Instantiates an object given a class name. + + The fully qualified class name of the object to instantiate. + The class to which the new object should belong. + The object to return in case of non-fulfillment. + + An instance of the or + if the object could not be instantiated. + + + + Checks that the is a subclass of + . If that test fails or the object could + not be instantiated, then is returned. + + + + + + Performs variable substitution in string from the + values of keys found in . + + The string on which variable substitution is performed. + The dictionary to use to lookup variables. + The result of the substitutions. + + + The variable substitution delimiters are ${ and }. + + + For example, if props contains key=value, then the call + + + + string s = OptionConverter.SubstituteVariables("Value of key is ${key}."); + + + + will set the variable s to "Value of key is value.". + + + If no value could be found for the specified key, then substitution + defaults to an empty string. + + + For example, if system properties contains no value for the key + "nonExistentKey", then the call + + + + string s = OptionConverter.SubstituteVariables("Value of nonExistentKey is [${nonExistentKey}]"); + + + + will set s to "Value of nonExistentKey is []". + + + An Exception is thrown if contains a start + delimiter "${" which is not balanced by a stop delimiter "}". + + + + + + Converts the string representation of the name or numeric value of one or + more enumerated constants to an equivalent enumerated object. + + The type to convert to. + The enum string value. + If true, ignore case; otherwise, regard case. + An object of type whose value is represented by . + + + + The fully qualified type of the OptionConverter class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Abstract class that provides the formatting functionality that + derived classes need. + + + + Conversion specifiers in a conversion patterns are parsed to + individual PatternConverters. Each of which is responsible for + converting a logging event in a converter specific manner. + + + Nicko Cadell + Gert Driesen + + + + Protected constructor + + + + Initializes a new instance of the class. + + + + + + Gets the next pattern converter in the chain. + + + + + Gets or sets the formatting info for this converter + + + The formatting info for this converter + + + + Gets or sets the formatting info for this converter + + + + + + Gets or sets the option value for this converter + + + The option for this converter + + + + Gets or sets the option value for this converter + + + + + + Evaluate this pattern converter and write the output to a writer. + + that will receive the formatted result. + The state object on which the pattern converter should be executed. + + + Derived pattern converters must override this method in order to + convert conversion specifiers in the appropriate way. + + + + + + Set the next pattern converter in the chains + + the pattern converter that should follow this converter in the chain + the next converter + + + The PatternConverter can merge with its neighbor during this method (or a subclass). + Therefore the return value may or may not be the value of the argument passed in. + + + + + + Write the pattern converter to the writer with appropriate formatting + + that will receive the formatted result. + The state object on which the pattern converter should be executed. + + + This method calls to allow the subclass to perform + appropriate conversion of the pattern converter. If formatting options have + been specified via the then this method will + apply those formattings before writing the output. + + + + + + Fast space padding method. + + to which the spaces will be appended. + The number of spaces to be padded. + + + Fast space padding method. + + + + + + Initial buffer size + + + + + Maximum buffer size before it is recycled + + + + + Write an dictionary to a + + the writer to write to + a to use for object conversion + the value to write to the writer + + + Writes the to a writer in the form: + + + {key1=value1, key2=value2, key3=value3} + + + If the specified + is not null then it is used to render the key and value to text, otherwise + the object's ToString method is called. + + + + + + Writes a dictionary to a + + the writer to write to + a to use for object conversion + the value to write to the writer + + + Writes the to a writer in the form: + + + {key1=value1, key2=value2, key3=value3} + + + If the specified + is not null then it is used to render the key and value to text, otherwise + the object's ToString method is called. + + + + + + Write an object to a + + the writer to write to + a to use for object conversion + the value to write to the writer + + + Writes the Object to a writer. If the specified + is not null then it is used to render the object to text, otherwise + the object's ToString method is called. + + + + + + + + + + + Most of the work of the class + is delegated to the PatternParser class. + + + + The PatternParser processes a pattern string and + returns a chain of objects. + + + Nicko Cadell + Gert Driesen + + + + Constructor + + The pattern to parse. + + + Initializes a new instance of the class + with the specified pattern string. + + + + + + Parses the pattern into a chain of pattern converters. + + The head of a chain of pattern converters. + + + + Gets the converter registry used by this parser. + + + + + Build the unified cache of converters from the static and instance maps + + the list of all the converter names + + + + Sort strings by length + + + + that orders strings by string length. + The longest strings are placed first + + + + + + Internal method to parse the specified pattern to find specified matches + + the pattern to parse + the converter names to match in the pattern + + + The matches param must be sorted such that longer strings come before shorter ones. + + + + + + Process a parsed literal + + the literal text + + + + Process a parsed converter pattern + + the name of the converter + the optional option for the converter + the formatting info for the converter + + + + Resets the internal state of the parser and adds the specified pattern converter + to the chain. + + The pattern converter to add. + + + + The first pattern converter in the chain + + + + + the last pattern converter in the chain + + + + + The pattern + + + + + The fully qualified type of the PatternParser class. + + + Used by the internal logger to record the Type of the + log message. + + + + + This class implements a patterned string. + + + + This string has embedded patterns that are resolved and expanded + when the string is formatted. + + + This class functions similarly to the + in that it accepts a pattern and renders it to a string. Unlike the + however the PatternString + does not render the properties of a specific but + of the process in general. + + + The recognized conversion pattern names are: + + + + Conversion Pattern Name + Effect + + + appdomain + + + Used to output the friendly name of the current AppDomain. + + + + + appsetting + + + Used to output the value of a specific appSetting key in the application + configuration file. + + + + + date + + + Used to output the current date and time in the local time zone. + To output the date in universal time use the %utcdate pattern. + The date conversion + specifier may be followed by a date format specifier enclosed + between braces. For example, %date{HH:mm:ss,fff} or + %date{dd MMM yyyy HH:mm:ss,fff}. If no date format specifier is + given then ISO8601 format is + assumed (). + + + The date format specifier admits the same syntax as the + time pattern string of the . + + + For better results it is recommended to use the log4net date + formatters. These can be specified using one of the strings + "ABSOLUTE", "DATE" and "ISO8601" for specifying + , + and respectively + . For example, + %date{ISO8601} or %date{ABSOLUTE}. + + + These dedicated date formatters perform significantly + better than . + + + + + env + + + Used to output the a specific environment variable. The key to + lookup must be specified within braces and directly following the + pattern specifier, e.g. %env{COMPUTERNAME} would include the value + of the COMPUTERNAME environment variable. + + + The env pattern is not supported on the .NET Compact Framework. + + + + + identity + + + Used to output the user name for the currently active user + (Principal.Identity.Name). + + + + + newline + + + Outputs the platform dependent line separator character or + characters. + + + This conversion pattern name offers the same performance as using + non-portable line separator strings such as "\n", or "\r\n". + Thus, it is the preferred way of specifying a line separator. + + + + + processid + + + Used to output the system process ID for the current process. + + + + + property + + + Used to output a specific context property. The key to + lookup must be specified within braces and directly following the + pattern specifier, e.g. %property{user} would include the value + from the property that is keyed by the string 'user'. Each property value + that is to be included in the log must be specified separately. + Properties are stored in logging contexts. By default + the log4net:HostName property is set to the name of machine on + which the event was originally logged. + + + If no key is specified, e.g. %property then all the keys and their + values are printed in a comma separated list. + + + The properties of an event are combined from a number of different + contexts. These are listed below in the order in which they are searched. + + + + the thread properties + + The that are set on the current + thread. These properties are shared by all events logged on this thread. + + + + the global properties + + The that are set globally. These + properties are shared by all the threads in the AppDomain. + + + + + + + random + + + Used to output a random string of characters. The string is made up of + uppercase letters and numbers. By default the string is 4 characters long. + The length of the string can be specified within braces directly following the + pattern specifier, e.g. %random{8} would output an 8 character string. + + + + + username + + + Used to output the WindowsIdentity for the currently + active user. + + + + + utcdate + + + Used to output the date of the logging event in universal time. + The date conversion + specifier may be followed by a date format specifier enclosed + between braces. For example, %utcdate{HH:mm:ss,fff} or + %utcdate{dd MMM yyyy HH:mm:ss,fff}. If no date format specifier is + given then ISO8601 format is + assumed (). + + + The date format specifier admits the same syntax as the + time pattern string of the . + + + For better results it is recommended to use the log4net date + formatters. These can be specified using one of the strings + "ABSOLUTE", "DATE" and "ISO8601" for specifying + , + and respectively + . For example, + %utcdate{ISO8601} or %utcdate{ABSOLUTE}. + + + These dedicated date formatters perform significantly + better than . + + + + + % + + + The sequence %% outputs a single percent sign. + + + + + + Additional pattern converters may be registered with a specific + instance using or + . + + + See the for details on the + format modifiers supported by the patterns. + + + Nicko Cadell + + + + Internal map of converter identifiers to converter types. + + + + + the head of the pattern converter chain + + + + + patterns defined on this PatternString only + + + + + Default constructor + + + + Initialize a new instance of + + + + + + Constructs a PatternString + + The pattern to use with this PatternString + + + Initialize a new instance of with the pattern specified. + + + + + + Gets or sets the pattern formatting string + + + The pattern formatting string + + + + The ConversionPattern option. This is the string which + controls formatting and consists of a mix of literal content and + conversion specifiers. + + + + + + Initialize object options + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Create the used to parse the pattern + + the pattern to parse + The + + + Returns PatternParser used to parse the conversion string. Subclasses + may override this to return a subclass of PatternParser which recognize + custom conversion pattern name. + + + + + + Produces a formatted string as specified by the conversion pattern. + + The TextWriter to write the formatted event to + + + Format the pattern to the . + + + + + + Format the pattern as a string + + the pattern formatted as a string + + + Format the pattern to a string. + + + + + + Adds a converter to this PatternString. + + the converter info + + + This version of the method is used by the configurator. + Programmatic users should use the alternative method. + The converter name is case-insensitive. + + + + + + Add a converter to this PatternString + + the name of the conversion pattern for this converter + the type of the converter + + + + Write the name of the current AppDomain to the output writer + + Nicko Cadell + + + + Write the name of the current AppDomain to the output + + the writer to write to + null, state is not set + + + Writes name of the current AppDomain to the output . + + + + + + AppSetting pattern converter + + + + This pattern converter reads appSettings from the application configuration file. + + + If the is specified then that will be used to + lookup a single appSettings value. If no is specified + then all appSettings will be dumped as a list of key value pairs. + + + A typical use is to specify a base directory for log files, e.g. + + + + + ... + + + ]]> + + + + + + + Write the property value to the output + + that will receive the formatted result. + null, state is not set + + + Writes out the value of a named property. The property name + should be set in the + property. + + + If the is set to null + then all the properties are written as key value pairs. + + + + + + Write the current date to the output + + + + Date pattern converter, uses a to format + the current date and time to the writer as a string. + + + The value of the determines + the formatting of the date. The following values are allowed: + + + Option value + Output + + + ISO8601 + + Uses the formatter. + Formats using the "yyyy-MM-dd HH:mm:ss,fff" pattern. + + + + DATE + + Uses the formatter. + Formats using the "dd MMM yyyy HH:mm:ss,fff" for example, "06 Nov 1994 15:49:37,459". + + + + ABSOLUTE + + Uses the formatter. + Formats using the "HH:mm:ss,fff" for example, "15:49:37,459". + + + + other + + Any other pattern string uses the formatter. + This formatter passes the pattern string to the + method. + For details on valid patterns see + DateTimeFormatInfo Class. + + + + + + The date and time is in the local time zone and is rendered in that zone. + To output the time in Universal time see . + + + Nicko Cadell + + + + The used to render the date to a string + + + + + Initialize the converter options + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Write the current date to the output + + that will receive the formatted result. + null, state is not set + + + Pass the current date and time to the + for it to render it to the writer. + + + The date and time passed is in the local time zone. + + + + + + The fully qualified type of the DatePatternConverter class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Write an folder path to the output + + + + The value of the determines + the name of the variable to output. + should be a value in the enumeration. + + + Ron Grabowski + + + + Writes a special path environment folder path to the output + + the writer to write to + null, state is not set + + + Writes the special path environment folder path to the output . + The name of the special path environment folder path to output must be set + using the + property. + + + + + + The fully qualified type of the EnvironmentFolderPathPatternConverter class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Write an environment variable to the output + + + + Write an environment variable to the output writer. + The value of the determines + the name of the variable to output. + + + Nicko Cadell + + + + Write an environment variable to the output + + the writer to write to + null, state is not set + + + Writes the environment variable to the output . + The name of the environment variable to output must be set + using the + property. + + + + + + The fully qualified type of the EnvironmentPatternConverter class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Write the current thread identity to the output + + + + Write the current thread identity to the output writer + + + Nicko Cadell + + + + Write the current thread identity to the output + + the writer to write to + null, state is not set + + + Writes the current thread identity to the output . + + + + + + The fully qualified type of the IdentityPatternConverter class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Pattern converter for literal string instances in the pattern + + + + Writes the literal string value specified in the + property to + the output. + + + Nicko Cadell + + + + Set the next converter in the chain + + The next pattern converter in the chain + The next pattern converter + + + Special case the building of the pattern converter chain + for instances. Two adjacent + literals in the pattern can be represented by a single combined + pattern converter. This implementation detects when a + is added to the chain + after this converter and combines its value with this converter's + literal value. + + + + + + Write the literal to the output + + the writer to write to + null, not set + + + Override the formatting behavior to ignore the FormattingInfo + because we have a literal instead. + + + Writes the value of + to the output . + + + + + + Convert this pattern into the rendered message + + that will receive the formatted result. + null, not set + + + This method is not used. + + + + + + Writes a newline to the output + + + + Writes the system dependent line terminator to the output. + This behavior can be overridden by setting the : + + + + Option Value + Output + + + DOS + DOS or Windows line terminator "\r\n" + + + UNIX + UNIX line terminator "\n" + + + + Nicko Cadell + + + + Initialize the converter + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Write the current process ID to the output + + + + Write the current process ID to the output writer + + + Nicko Cadell + + + + Write the current process ID to the output + + the writer to write to + null, state is not set + + + Write the current process ID to the output . + + + + + + The fully qualified type of the ProcessIdPatternConverter class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Property pattern converter + + + + This pattern converter reads the thread and global properties. + The thread properties take priority over global properties. + See for details of the + thread properties. See for + details of the global properties. + + + If the is specified then that will be used to + lookup a single property. If no is specified + then all properties will be dumped as a list of key value pairs. + + + Nicko Cadell + + + + Write the property value to the output + + that will receive the formatted result. + null, state is not set + + + Writes out the value of a named property. The property name + should be set in the + property. + + + If the is set to null + then all the properties are written as key value pairs. + + + + + + A Pattern converter that generates a string of random characters + + + + The converter generates a string of random characters. By default + the string is length 4. This can be changed by setting the + to the string value of the length required. + + + The random characters in the string are limited to uppercase letters and numbers only. + + + The random number generator used by this class is not cryptographically secure. + + + Nicko Cadell + + + + Shared random number generator + + + + + Length of random string to generate. Default length 4. + + + + + Initialize the converter options + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Writes a random string to the output + + the writer to write to + null, state is not set + + + + The fully qualified type of the RandomStringPatternConverter class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Write the current threads username to the output + + + + Write the current threads username to the output writer + + + Nicko Cadell + + + + Write the current threads username to the output + + the writer to write to + null, state is not set + + + Write the current threads username to the output . + + + + + + The fully qualified type of the UserNamePatternConverter class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Write the UTC date time to the output + + + + Date pattern converter, uses a to format + the current date and time in Universal time. + + + See the for details on the date pattern syntax. + + + + Nicko Cadell + + + + Write the current date and time to the output + + that will receive the formatted result. + null, state is not set + + + Pass the current date and time to the + for it to render it to the writer. + + + The date is in Universal time when it is rendered. + + + + + + + The fully qualified type of the UtcDatePatternConverter class. + + + Used by the internal logger to record the Type of the + log message. + + + + + String keyed object map. + + + + While this collection is serializable, only member objects that are serializable + will be serialized along with this collection. + + + Nicko Cadell + Gert Driesen + + + + Constructor + + + + Initializes a new instance of the class. + + + + + + Constructor + + properties to copy + + + Initializes a new instance of the class. + + + + + + Initializes a new instance of the class + with serialized data. + + The that holds the serialized object data. + The that contains contextual information about the source or destination. + + + Because this class is sealed the serialization constructor is private. + + + + + + Gets or sets the value of the property with the specified key. + + + The value of the property with the specified key. + + The key of the property to get or set. + + + The property value will only be serialized if it is serializable. + If it cannot be serialized it will be silently ignored if + a serialization operation is performed. + + + + + + See . + + + + + Remove the entry with the specified key from this dictionary + + the key for the entry to remove + + + Remove the entry with the specified key from this dictionary + + + + + + See + + an enumerator + + + Returns a over the contest of this collection. + + + + + + See + + the key to remove + + + Remove the entry with the specified key from this dictionary + + + + + + Remove all properties from the properties collection + + + + Remove all properties from the properties collection + + + + + + See + + the key + the value to store for the key + + + Store a value for the specified . + + + Thrown if the is not a string + + + + See + + + false + + + + This collection is modifiable. This property always + returns false. + + + + + + See + + + The value for the key specified. + + + + Get or set a value for the specified . + + + Thrown if the is not a string + + + + A class to hold the key and data for a property set in the config file + + + + + Property Key + + + + + Property Value + + + + + Override Object.ToString to return sensible debug info + + string info about this object + + + + A that ignores the message + + + This writer is used in special cases where it is necessary + to protect a writer from being closed by a client. + + Nicko Cadell + + + + Constructor + + the writer to actually write to + + Create a new ProtectCloseTextWriter using a writer + + + + + Attaches this instance to a different underlying . + + the writer to attach to + + + + Does not close the underlying output writer. + + + + + that does not leak exceptions + + + + does not throw exceptions when things go wrong. + Instead, it delegates error handling to its . + + + Nicko Cadell + Gert Driesen + + + + Constructor + + the writer to actually write to + the error handler to report error to + + + Create a new QuietTextWriter using a writer and error handler + + + + + + Gets or sets the error handler that all errors are passed to. + + + The error handler that all errors are passed to. + + + + Gets or sets the error handler that all errors are passed to. + + + + + + Gets a value indicating whether this writer is closed. + + + true if this writer is closed, otherwise false. + + + + Gets a value indicating whether this writer is closed. + + + + + + Writes a character to the underlying writer + + the char to write + + + Writes a character to the underlying writer + + + + + + Writes a buffer to the underlying writer + + the buffer to write + the start index to write from + the number of characters to write + + + Writes a buffer to the underlying writer + + + + + + Writes a string to the output. + + The string data to write to the output. + + + + Closes the underlying output writer. + + + + Closes the underlying output writer. + + + + + + The error handler instance to pass all errors to + + + + + Defines a lock that supports single writers and multiple readers + + + + ReaderWriterLock is used to synchronize access to a resource. + At any given time, it allows either concurrent read access for + multiple threads, or write access for a single thread. In a + situation where a resource is changed infrequently, a + ReaderWriterLock provides better throughput than a simple + one-at-a-time lock, such as . + + + If a platform does not support a System.Threading.ReaderWriterLock + implementation then all readers and writers are serialized. Therefore + the caller must not rely on multiple simultaneous readers. + + + Nicko Cadell + + + + Acquires a reader lock + + + + blocks if a different thread has the writer + lock, or if at least one thread is waiting for the writer lock. + + + + + + Decrements the lock count + + + + decrements the lock count. When the count + reaches zero, the lock is released. + + + + + + Acquires the writer lock + + + + This method blocks if another thread has a reader lock or writer lock. + + + + + + Decrements the lock count on the writer lock + + + + ReleaseWriterLock decrements the writer lock count. + When the count reaches zero, the writer lock is released. + + + + + + String keyed object map that is read only. + + + + This collection is readonly and cannot be modified. It is not thread-safe. + + + While this collection is serializable, only member + objects that are serializable will + be serialized along with this collection. + + + Nicko Cadell + Gert Driesen + + + + Constructor + + + + Initializes a new instance of the class. + + + + + + Copy Constructor + + properties to copy + + + Initializes a new instance of the class. + + + + + + Deserialization constructor + + The that holds the serialized object data. + The that contains contextual information about the source or destination. + + + Initializes a new instance of the class + with serialized data. + + + + + + Gets the key names. + + An array of all the keys. + + + Gets the key names. + + + + + + See . + + + + + See . + + + + + See . + + + + + See . + + + + + Gets or sets the value of the property with the specified key. + + + The value of the property with the specified key, or null if a property is not present in the dictionary. + Note this is the semantic, not that of . + + The key of the property to get or set. + + + The property value will only be serialized if it is serializable. + If it cannot be serialized it will be silently ignored if + a serialization operation is performed. + + + + + + Test if the dictionary contains a specified key + + the key to look for + true if the dictionary contains the specified key + + + Test if the dictionary contains a specified key + + + + + + The hashtable used to store the properties + + + The internal collection used to store the properties + + + + The hashtable used to store the properties + + + + + + Serializes this object into the provided. + + The to populate with data. + The destination for this serialization. + + + Serializes this object into the provided. + + + + + + See + + + + + See + + + + + See + + + + + + See + + + + + See . + + + + + Removes all properties from the properties collection + + + + + See . + + + + + See . + + + + + See . + + + + + See . + + + + + See . + + + + + See + + + + + See . + + + + + See . + + + + + See + + + + + See + + + + + See + + + + + See + + + + + See + + + + + The number of properties in this collection + + + + + See . + + + + + See + + + + + See + + + + + A that can be and reused + + + + This uses a single buffer for string operations. + + + Nicko Cadell + + + + Creates an instance of + + the format provider to use + + + + Override Dispose to prevent closing of writer + + flag + + + + Reset this string writer so that it can be reused. + + the maximum buffer capacity before it is trimmed + the default size to make the buffer + + + Reset this string writer so that it can be reused. + The internal buffers are cleared and reset. + + + + + + Utility class for system specific information. + + Nicko Cadell + Gert Driesen + Alexey Solofnenko + + + + Initialize default values for private static fields. + + + + Only static methods are exposed from this type. + + + + + + Gets the system dependent line terminator. + + + + + Gets the base directory for this . + + + + The value returned may be either a local file path or a URI. + + + + + + Gets the path to the configuration file for the current . + + + + The value returned may be either a local file path or a URI. + + + + + + Gets the path to the file that first executed in the current . + + + + + Gets the ID of the current thread. + + + + + Gets the host name or machine name for the current machine. + + + + The host name () or + the machine name () for + the current machine, or if neither of these are available + then NOT AVAILABLE is returned. + + + + + + Gets this application's friendly name. + + + + If available the name of the application is retrieved from + the AppDomain using AppDomain.CurrentDomain.FriendlyName. + + + Otherwise the file name of the entry assembly is used. + + + + + + Get the UTC start time for the current process. + + + + This is the UTC time at which the log4net library was loaded into the + AppDomain. Due to reports of a hang in the call to System.Diagnostics.Process.StartTime + this is not the start time for the current process. + + + The log4net library should be loaded by an application early during its + startup, therefore this start time should be a good approximation for + the actual start time. + + + Note that AppDomains may be loaded and unloaded within the + same process without the process terminating, however this start time + will be set per AppDomain. + + + + + + Text to output when a null is encountered. + + + + Use this value to indicate a null has been encountered while + outputting a string representation of an item. + + + The default value is (null). This value can be overridden by specifying + a value for the log4net.NullText appSetting in the application's + .config file. + + + + + + Text to output when an unsupported feature is requested. + + + + Use this value when an unsupported feature is requested. + + + The default value is NOT AVAILABLE. This value can be overridden by specifying + a value for the log4net.NotAvailableText appSetting in the application's + .config file. + + + + + + Gets the assembly location path for the specified assembly. + + The assembly to get the location for. + The location of the assembly. + + + This method does not guarantee to return the correct path + to the assembly. If only tries to give an indication as to + where the assembly was loaded from. + + + + + + Gets the short name of the . + + The to get the name for. + The short name of the . + + + The short name of the assembly is the + without the version, culture, or public key. i.e. it is just the + assembly's file name without the extension. + + + Because of a FileIOPermission security demand we cannot do + the obvious Assembly.GetName().Name. We are allowed to get + the of the assembly so we + start from there and strip out just the assembly name. + + + + + + Gets the file name portion of the , including the extension. + + The to get the file name for. + The file name of the assembly. + + + Gets the file name portion of the , including the extension. + + + + + + Loads the type specified in the type string. + + A sibling type to use to load the type. + The name of the type to load. + Flag set to true to throw an exception if the type cannot be loaded. + true to ignore the case of the type name; otherwise, false + The type loaded or null if it could not be loaded. + + + If the type name is fully qualified, i.e. if contains an assembly name in + the type name, the type will be loaded from the system using + . + + + If the type name is not fully qualified, it will be loaded from the assembly + containing the specified relative type. If the type is not found in the assembly + then all the loaded assemblies will be searched for the type. + + + + + + Loads the type specified in the type string. + + The name of the type to load. + Flag set to true to throw an exception if the type cannot be loaded. + true to ignore the case of the type name; otherwise, false + The type loaded or null if it could not be loaded. + + + If the type name is fully qualified, i.e. if contains an assembly name in + the type name, the type will be loaded from the system using + . + + + If the type name is not fully qualified it will be loaded from the + assembly that is directly calling this method. If the type is not found + in the assembly then all the loaded assemblies will be searched for the type. + + + + + + Loads the type specified in the type string. + + An assembly to load the type from. + The name of the type to load. + Flag set to true to throw an exception if the type cannot be loaded. + true to ignore the case of the type name; otherwise, false + The type loaded or null if it could not be loaded. + + + If the type name is fully qualified, i.e. if contains an assembly name in + the type name, the type will be loaded from the system using + . + + + If the type name is not fully qualified it will be loaded from the specified + assembly. If the type is not found in the assembly then all the loaded assemblies + will be searched for the type. + + + + + + Creates an + + The name of the parameter that caused the exception + The value of the argument that causes this exception + The message that describes the error + + A new instance of the class + with the specified error message, parameter name, and value + of the argument. + + + + + Creates a for read-only collection modification calls. + + The NotSupportedException object + + + + Parse a string into an value + + the string to parse + out param where the parsed value is placed + true if the string was parsed into an integer + + + Attempts to parse the string into an integer. If the string cannot + be parsed then this method returns false. The method does not throw an exception. + + + + + + Parse a string into an value + + the string to parse + out param where the parsed value is placed + true if the string was parsed into an integer + + + Attempts to parse the string into an integer. If the string cannot + be parsed then this method returns false. The method does not throw an exception. + + + + + + Parse a string into an value + + the string to parse + out param where the parsed value is placed + true if the string was parsed into an integer + + + Attempts to parse the string into an integer. If the string cannot + be parsed then this method returns false. The method does not throw an exception. + + + + + + Lookup an application setting + + the application settings key to lookup + the value for the key, or null + + + + Convert a path into a fully qualified local file path. + + The path to convert. + The fully qualified path. + + + Converts the path specified to a fully + qualified path. If the path is relative it is + taken as relative from the application base + directory. + + + The path specified must be a local file path, a URI is not supported. + + + + + + Creates a new case-insensitive instance of the class with the default initial capacity. + + A new case-insensitive instance of the class with the default initial capacity + + + The new Hashtable instance uses the default load factor, the CaseInsensitiveHashCodeProvider, and the CaseInsensitiveComparer. + + + + + + Tests two strings for equality, the ignoring case. + + + If the platform permits, culture information is ignored completely (ordinal comparison). + The aim of this method is to provide a fast comparison that deals with null and ignores different casing. + It is not supposed to deal with various, culture-specific habits. + Use it to compare against pure ASCII constants, like keywords etc. + + The one string. + The other string. + true if the strings are equal, false otherwise. + + + + The fully qualified type of the SystemInfo class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Cache the host name for the current machine + + + + + Cache the application friendly name + + + + + Utility class that represents a format string. + + Nicko Cadell + An that supplies culture-specific formatting information. + A containing zero or more format items. + An array containing zero or more objects to format. + + + + Utility class that represents a format string. + + Nicko Cadell + An that supplies culture-specific formatting information. + A containing zero or more format items. + An array containing zero or more objects to format. + + + + Format + + + + + Args + + + + + Format the string and arguments + + the formatted string + + + + Replaces the format item in a specified with the text equivalent + of the value of a corresponding instance in a specified array. + A specified parameter supplies culture-specific formatting information. + + An that supplies culture-specific formatting information. + A containing zero or more format items. + An array containing zero or more objects to format. + + A copy of format in which the format items have been replaced by the + equivalent of the corresponding instances of in args. + + + + This method does not throw exceptions. If an exception thrown while formatting the result the + exception and arguments are returned in the result string. + + + + + + Process an error during StringFormat + + + + + Dump the contents of an array into a string builder + + + + + Dump an object to a string + + + + + The fully qualified type of the SystemStringFormat class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Adapter that extends and forwards all + messages to an instance of . + + Nicko Cadell + + + + Creates an instance of that forwards all + messages to a . + + The to forward to + + + + Gets or sets the underlying . + + + + + The in which the output is written + + + + + Gets an object that controls formatting + + + + + Gets or sets the line terminator string used by the TextWriter. + + + + + Closes the writer and releases any system resources associated with the writer + + + + + + + + + Dispose this writer + + flag indicating if we are being disposed + + + Dispose this writer + + + + + + Flushes any buffered output + + + + Clears all buffers for the writer and causes any buffered data to be written + to the underlying device + + + + + + Writes a character to the wrapped TextWriter + + the value to write to the TextWriter + + + Writes a character to the wrapped TextWriter + + + + + + Writes a character buffer to the wrapped TextWriter + + the data buffer + the start index + the number of characters to write + + + Writes a character buffer to the wrapped TextWriter + + + + + + Writes a string to the wrapped TextWriter + + the value to write to the TextWriter + + + Writes a string to the wrapped TextWriter + + + + + + Implementation of Properties collection for the + + + + Class implements a collection of properties that is specific to each thread. + The class is not synchronized as each thread has its own . + + + Nicko Cadell + + + + Each thread will automatically have its instance. + + + + + Internal constructor + + + + Initializes a new instance of the class. + + + + + + Gets or sets the value of a property + + + The value for the property with the specified key + + + + Gets or sets the value of a property + + + + + + Remove a property + + the key for the entry to remove + + + Remove a property + + + + + + Get the keys stored in the properties. + + + Gets the keys stored in the properties. + + a set of the defined keys + + + + Clear all properties + + + + Clear all properties + + + + + + Get the PropertiesDictionary for this thread. + + create the dictionary if it does not exist, otherwise return null if it does not exist + the properties for this thread + + + The collection returned is only to be used on the calling thread. If the + caller needs to share the collection between different threads then the + caller must clone the collection before doing so. + + + + + + Implementation of Stack for the + + + + Implementation of Stack for the + + + Nicko Cadell + + + + The stack store. + + + + + Internal constructor + + + + Initializes a new instance of the class. + + + + + + The number of messages in the stack + + + The current number of messages in the stack + + + + The current number of messages in the stack. That is + the number of times has been called + minus the number of times has been called. + + + + + + Clears all the contextual information held in this stack. + + + + Clears all the contextual information held in this stack. + Only call this if you think that this tread is being reused after + a previous call execution which may not have completed correctly. + You do not need to use this method if you always guarantee to call + the method of the + returned from even in exceptional circumstances, + for example by using the using(log4net.ThreadContext.Stacks["NDC"].Push("Stack_Message")) + syntax. + + + + + + Removes the top context from this stack. + + The message in the context that was removed from the top of this stack. + + + Remove the top context from this stack, and return + it to the caller. If this stack is empty then an + empty string (not ) is returned. + + + + + + Pushes a new context message into this stack. + + The new context message. + + An that can be used to clean up the context stack. + + + + Pushes a new context onto this stack. An + is returned that can be used to clean up this stack. This + can be easily combined with the using keyword to scope the + context. + + + Simple example of using the Push method with the using keyword. + + using(log4net.ThreadContext.Stacks["NDC"].Push("Stack_Message")) + { + log.Warn("This should have an ThreadContext Stack message"); + } + + + + + + Returns the top context from this stack. + + The message in the context from the top of this stack. + + + Returns the top context from this stack. If this stack is empty then an + empty string (not ) is returned. + + + + + + Gets the current context information for this stack. + + The current context information. + + + + Gets and sets the internal stack used by this + + The internal storage stack + + + This property is provided only to support backward compatibility + of the . Typically the internal stack should not + be modified. + + + + + + Gets the current context information for this stack. + + + + + Get a portable version of this object + + + + + Inner class used to represent a single context frame in the stack. + + + + + Constructor + + The message for this context. + The parent context in the chain. + + + Initializes a new instance of the class + with the specified message and parent context. + + + + + + Get the message. + + + + + Gets the full text of the context down to the root level. + + + + + Struct returned from the method. + + + + This struct implements the and is designed to be used + with the pattern to remove the stack frame at the end of the scope. + + + + + + The ThreadContextStack internal stack + + + + + The depth to trim the stack to when this instance is disposed + + + + + Initializes a new instance of the class with + the specified stack and return depth. + + The internal stack used by the ThreadContextStack. + The depth to return the stack to when this object is disposed. + + + + Returns the stack to the correct depth. + + + + + Implementation of Stacks collection for the + + Nicko Cadell + + + + Initializes a new instance of the class. + + + + + Gets the named thread context stack. + + + + + The fully qualified type of the ThreadContextStacks class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Utility class for transforming strings. + + + + Utility class for transforming strings. + + + Nicko Cadell + Gert Driesen + + + + Write a string to an + + the writer to write to + the string to write + The string to replace non XML compliant chars with + + + The test is escaped either using XML escape entities + or using CDATA sections. + + + + + + Replace invalid XML characters in text string + + the XML text input string + the string to use in place of invalid characters + A string that does not contain invalid XML characters. + + + Certain Unicode code points are not allowed in the XML InfoSet, for + details see: http://www.w3.org/TR/REC-xml/#charsets. + + + This method replaces any illegal characters in the input string + with the mask string specified. + + + + + + Count the number of times that the substring occurs in the text + + the text to search + the substring to find + the number of times the substring occurs in the text + + + The substring is assumed to be non repeating within itself. + + + + + + Characters illegal in XML 1.0 + + + + + Type converter for Boolean. + + + + Supports conversion from string to bool type. + + + + + + Nicko Cadell + Gert Driesen + + + + Can the source type be converted to the type supported by this object + + the type to convert + + True if the is + the type. + + + + + Converts the source object to the type supported by this object + + the object to convert + the converted object + + + Uses the method to convert the + argument to a . + + + + The object cannot be converted to the + target type. To check for this condition use the + method. + + + + + Exception base type for conversion errors. + + + + This type extends . It + does not add any new functionality but does differentiate the + type of exception being thrown. + + + Nicko Cadell + Gert Driesen + + + + Constructor + + + + Initializes a new instance of the class. + + + + + + Constructor + + A message to include with the exception. + + + Initializes a new instance of the class + with the specified message. + + + + + + Constructor + + A message to include with the exception. + A nested exception to include. + + + Initializes a new instance of the class + with the specified message and inner exception. + + + + + + Serialization constructor + + The that holds the serialized object data about the exception being thrown. + The that contains contextual information about the source or destination. + + + Initializes a new instance of the class + with serialized data. + + + + + + Creates a new instance of the class. + + The conversion destination type. + The value to convert. + An instance of the . + + + Creates a new instance of the class. + + + + + + Creates a new instance of the class. + + The conversion destination type. + The value to convert. + A nested exception to include. + An instance of the . + + + Creates a new instance of the class. + + + + + + Register of type converters for specific types. + + + + Maintains a registry of type converters used to convert between types. + + + Use the and + methods to register new converters. + The and methods + lookup appropriate converters to use. + + + + + Nicko Cadell + Gert Driesen + + + + This class constructor adds the intrinsic type converters + + + + + Adds a converter for a specific type. + + The type being converted to. + The type converter to use to convert to the destination type. + + + + Adds a converter for a specific type. + + The type being converted to. + The type of the type converter to use to convert to the destination type. + + + + Gets the type converter to use to convert values to the destination type. + + The type being converted from. + The type being converted to. + + The type converter instance to use for type conversions or null + if no type converter is found. + + + + + Gets the type converter to use to convert values to the destination type. + + The type being converted to. + + The type converter instance to use for type conversions or null + if no type converter is found. + + + + + Lookups the type converter to use as specified by the attributes on the + destination type. + + The type being converted to. + + The type converter instance to use for type conversions or null + if no type converter is found. + + + + + Creates the instance of the type converter. + + The type of the type converter. + + The type converter instance to use for type conversions or null + if no type converter is found. + + + + The type specified for the type converter must implement + the or interfaces + and must have a public default (no argument) constructor. + + + + + + The fully qualified type of the ConverterRegistry class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Supports conversion from string to type. + + + + + Nicko Cadell + Gert Driesen + + + + Can the source type be converted to the type supported by this object + + the type to convert + + True if the is + the type. + + + + + Overrides the ConvertFrom method of IConvertFrom. + + the object to convert to an encoding + the encoding + + + Uses the method to + convert the argument to an . + + + + The object cannot be converted to the + target type. To check for this condition use the + method. + + + + + Interface supported by type converters + + + + This interface supports conversion from arbitrary types + to a single target type. See . + + + Nicko Cadell + Gert Driesen + + + + Can the source type be converted to the type supported by this object + + the type to convert + true if the conversion is possible + + + Test if the can be converted to the + type supported by this converter. + + + + + + Convert the source object to the type supported by this object + + the object to convert + the converted object + + + Converts the to the type supported + by this converter. + + + + + + Interface supported by type converters + + + + This interface supports conversion from a single type to arbitrary types. + See . + + + Nicko Cadell + + + + Returns whether this converter can convert the object to the specified type + + A Type that represents the type you want to convert to + true if the conversion is possible + + + Test if the type supported by this converter can be converted to the + . + + + + + + Converts the given value object to the specified type, using the arguments + + the object to convert + The Type to convert the value parameter to + the converted object + + + Converts the (which must be of the type supported + by this converter) to the specified.. + + + + + + Supports conversion from string to type. + + + + Supports conversion from string to type. + + + + + Nicko Cadell + + + + Can the source type be converted to the type supported by this object + + the type to convert + true if the conversion is possible + + + Returns true if the is + the type. + + + + + + Overrides the ConvertFrom method of IConvertFrom. + + the object to convert to an IPAddress + the IPAddress + + + Uses the method to convert the + argument to an . + If that fails then the string is resolved as a DNS hostname. + + + + The object cannot be converted to the + target type. To check for this condition use the + method. + + + + + Supports conversion from string to type. + + + + The string is used as the + of the . + + + + + + Nicko Cadell + + + + Can the source type be converted to the type supported by this object + + the type to convert + + True if the is + the type. + + + + + Overrides the ConvertFrom method of IConvertFrom. + + the object to convert to a PatternLayout + the PatternLayout + + + Creates and returns a new using + the as the + . + + + + The object cannot be converted to the + target type. To check for this condition use the + method. + + + + + Convert between string and + + + + Supports conversion from string to type, + and from a type to a string. + + + The string is used as the + of the . + + + + + + Nicko Cadell + + + + Can the target type be converted to the type supported by this object + + A that represents the type you want to convert to + true if the conversion is possible + + + Returns true if the is + assignable from a type. + + + + + + Converts the given value object to the specified type, using the arguments + + the object to convert + The Type to convert the value parameter to + the converted object + + + Uses the method to convert the + argument to a . + + + + The object cannot be converted to the + . To check for this condition use the + method. + + + + + Can the source type be converted to the type supported by this object + + the type to convert + + True if the is + the type. + + + + + Overrides the ConvertFrom method of IConvertFrom. + + the object to convert to a PatternString + the PatternString + + + Creates and returns a new using + the as the + . + + + + The object cannot be converted to the + target type. To check for this condition use the + method. + + + + + Supports conversion from string to type. + + + + + Nicko Cadell + + + + Can the source type be converted to the type supported by this object + + the type to convert + + True if the is + the type. + + + + + Overrides the ConvertFrom method of IConvertFrom. + + the object to convert to a Type + the Type + + + Uses the method to convert the + argument to a . + Additional effort is made to locate partially specified types + by searching the loaded assemblies. + + + + The object cannot be converted to the + target type. To check for this condition use the + method. + + + + + Attribute used to associate a type converter + + + + Class and Interface level attribute that specifies a type converter + to use with the associated type. + + + To associate a type converter with a target type apply a + TypeConverterAttribute to the target type. Specify the + type of the type converter on the attribute. + + + Nicko Cadell + Gert Driesen + + + + Creates a new type converter attribute for the specified type name + + The string type name of the type converter + + + The type specified must implement the + or the interfaces. + + + + + + Creates a new type converter attribute for the specified type + + The type of the type converter + + + The type specified must implement the + or the interfaces. + + + + + + The string type name of the type converter + + + + The type specified must implement the + or the interfaces. + + + + + + Impersonate a Windows Account + + + + This impersonates a Windows account. + + + How the impersonation is done depends on the value of . + This allows the context to either impersonate a set of user credentials specified + using username, domain name and password or to revert to the process credentials. + + + + + + The impersonation modes for the + + + + See the property for + details. + + + + + + Impersonate a user using the credentials supplied + + + + + Revert this the thread to the credentials of the process + + + + + Gets or sets the impersonation mode for this security context + + + The impersonation mode for this security context + + + + Impersonate either a user with user credentials or + revert this thread to the credentials of the process. + The value is one of the + enum. + + + The default value is + + + When the mode is set to + the user's credentials are established using the + , and + values. + + + When the mode is set to + no other properties need to be set. If the calling thread is + impersonating then it will be reverted back to the process credentials. + + + + + + Gets or sets the Windows username for this security context + + + The Windows username for this security context + + + + This property must be set if + is set to (the default setting). + + + + + + Gets or sets the Windows domain name for this security context + + + The Windows domain name for this security context + + + + The default value for is the local machine name + taken from the property. + + + This property must be set if + is set to (the default setting). + + + + + + Sets the password for the Windows account specified by the and properties. + + + The password for the Windows account specified by the and properties. + + + + This property must be set if + is set to (the default setting). + + + + + + Initialize the SecurityContext based on the options set. + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + The security context will try to Logon the specified user account and + capture a primary token for impersonation. + + + The required , + or properties were not specified. + + + + Impersonate the Windows account specified by the and properties. + + caller provided state + + An instance that will revoke the impersonation of this SecurityContext + + + + Depending on the property either + impersonate a user using credentials supplied or revert + to the process credentials. + + + + + + Create a given the userName, domainName and password. + + the user name + the domain name + the password + the for the account specified + + + Uses the Windows API call LogonUser to get a principal token for the account. This + token is used to initialize the WindowsIdentity. + + + + + + Adds to + + the impersonation context being wrapped + + + Helper class to expose the + through the interface. + + + + + + Adds to + + the impersonation context being wrapped + + + Helper class to expose the + through the interface. + + + + + + Revert the impersonation + + + + + Specifies that null is allowed as an input even if the corresponding type disallows it. + + + + + Initializes a new instance of the System.Diagnostics.CodeAnalysis.AllowNullAttribute class. + + + + + Specifies that null is disallowed as an input even if the corresponding type allows it. + + + + + Initializes a new instance of the System.Diagnostics.CodeAnalysis.DisallowNullAttribute class. + + + + + Specifies that a method that will never return under any circumstance. + + + + + Initializes a new instance of the System.Diagnostics.CodeAnalysis.DoesNotReturnAttribute class. + + + + + Specifies that the method will not return if the associated System.Boolean parameter is passed the specified value. + + + + + Initializes a new instance of the System.Diagnostics.CodeAnalysis.DoesNotReturnIfAttribute class + with the specified parameter value. + + + The condition parameter value. + Code after the method is considered unreachable by diagnostics if the argument to the associated parameter + matches this value. + + + + + Gets the condition parameter value. + + The condition parameter value. Code after the method is considered unreachable + by diagnostics if the argument to the associated parameter matches this value. + + + + + Specifies that an output may be null even if the corresponding type disallows it. + + + + + Specifies that when a method returns System.Diagnostics.CodeAnalysis.MaybeNullWhenAttribute.ReturnValue, + the parameter may be null even if the corresponding type disallows it. + + + + + Initializes the attribute with the specified return value condition. + + The return value condition. If the method returns this value, the associated parameter may be null. + + + + Gets the return value condition. + + + + + Specifies that the method or property will ensure that the listed field and property members have values that aren't null. + + + + + Initializes the attribute with list of field or property members. + + The list of field and property members that are promised to be non-null. + + + + Initializes the attribute with a field or property member. + + The field or property member that is promised to be non-null. + + + + Gets field or property member names. + + + + + Specifies that the method or property will ensure that the listed field and property members have non-null values + when returning with the specified return value condition. + + + + + Initializes the attribute with the specified return value condition and a field or property member. + + The return value condition. If the method returns this value, the associated parameter will not be null. + The list of field and property members that are promised to be non-null. + + + + Initializes the attribute with the specified return value condition and a field or property member. + + The return value condition. If the method returns this value, the associated parameter will not be null. + The field or property member that is promised to be non-null. + + + + Gets field or property member names. + + + + + Gets the return value condition. + + + + + Specifies that an output is not even if the corresponding type allows it. + Specifies that an input argument was not when the call returns. + + + + + Specifies that the output will be non-null if the named parameter is non-null. + + + + + Initializes the attribute with the associated parameter name. + + + The associated parameter name. + The output will be non-null if the argument to the parameter specified is non-null. + + + + + Gets the associated parameter name. + + + + + Specifies that when a method returns ReturnValue, + the parameter will not be null even if the corresponding type allows it. + + + + + Initializes the attribute with the specified return value condition. + + + The return value condition. + If the method returns this value, the associated parameter will not be null. + + + + Gets the return value condition. + + + + + Specifies that this constructor sets all required members for the current type, + and callers do not need to set any required members themselves. + + + + + Attribute to tell Roslyn-Analyzers that a parameter will be checked for + + + + + Indicates that a parameter captures the expression passed for another parameter as a string. + + + + + Name of the parameter whose expression should be captured as a string + + + + + + + + Indicates that compiler support for a particular feature is required for the location where this attribute is applied + + + + + The used for the ref structs C# feature + + + + + The used for the required members C# feature + + + + + The name of the compiler feature + + + + + Gets a value that indicates whether the compiler can choose to allow access to the location + where this attribute is applied if it does not understand + + + + + Initializes a instance for the passed in compiler feature + + The name of the compiler feature + + + + + + + + + + + + + + + + + + + + + + + + + + + + Specifies that a type has required members or that a member is required + + + + diff --git a/packages/log4net.3.0.3-preview.1/lib/netstandard2.0/log4net.xml b/packages/log4net.3.0.3-preview.1/lib/netstandard2.0/log4net.xml new file mode 100644 index 0000000..02a4e1b --- /dev/null +++ b/packages/log4net.3.0.3-preview.1/lib/netstandard2.0/log4net.xml @@ -0,0 +1,27591 @@ + + + + log4net + + + + + Appender that logs to a database. + + + + appends logging events to a table within a + database. The appender can be configured to specify the connection + string by setting the property. + The connection type (provider) can be specified by setting the + property. For more information on database connection strings for + your specific database see http://www.connectionstrings.com/. + + + Records are written into the database either using a prepared + statement or a stored procedure. The property + is set to (System.Data.CommandType.Text) to specify a prepared statement + or to (System.Data.CommandType.StoredProcedure) to specify a stored + procedure. + + + The prepared statement text or the name of the stored procedure + must be set in the property. + + + The prepared statement or stored procedure can take a number + of parameters. Parameters are added using the + method. This adds a single to the + ordered list of parameters. The + type may be subclassed if required to provide database specific + functionality. The specifies + the parameter name, database type, size, and how the value should + be generated using a . + + + + An example of a SQL Server table that could be logged to: + + CREATE TABLE [dbo].[Log] ( + [ID] [int] IDENTITY (1, 1) NOT NULL , + [Date] [datetime] NOT NULL , + [Thread] [varchar] (255) NOT NULL , + [Level] [varchar] (20) NOT NULL , + [Logger] [varchar] (255) NOT NULL , + [Message] [varchar] (4000) NOT NULL + ) ON [PRIMARY] + + + + An example configuration to log to the above table: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Julian Biddle + Nicko Cadell + Gert Driesen + Lance Nehring + + + + Initializes a new instance of the class. + + + Public default constructor to initialize a new instance of this class. + + + + + Gets or sets the database connection string that is used to connect to + the database. + + + The database connection string used to connect to the database. + + + + The connections string is specific to the connection type. + See for more information. + + + Connection string for MS Access via ODBC: + "DSN=MS Access Database;UID=admin;PWD=;SystemDB=C:\data\System.mdw;SafeTransactions = 0;FIL=MS Access;DriverID = 25;DBQ=C:\data\train33.mdb" + + Another connection string for MS Access via ODBC: + "Driver={Microsoft Access Driver (*.mdb)};DBQ=C:\Work\cvs_root\log4net-1.2\access.mdb;UID=;PWD=;" + + Connection string for MS Access via OLE DB: + "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Work\cvs_root\log4net-1.2\access.mdb;User Id=;Password=;" + + + + + The appSettings key from App.Config that contains the connection string. + + + + + The connectionStrings key from App.Config that contains the connection string. + + + + + Gets or sets the type name of the connection + that should be created. + + + The type name of the connection. + + + + The type name of the ADO.NET provider to use. + + + The default is to use the OLE DB provider. + + + Use the OLE DB Provider. This is the default value. + System.Data.OleDb.OleDbConnection, System.Data, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + Use the MS SQL Server Provider. + System.Data.SqlClient.SqlConnection, System.Data, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + Use the ODBC Provider. + Microsoft.Data.Odbc.OdbcConnection,Microsoft.Data.Odbc,version=1.0.3300.0,publicKeyToken=b77a5c561934e089,culture=neutral + This is an optional package that you can download from + http://msdn.microsoft.com/downloads + search for ODBC .NET Data Provider. + + Use the Oracle Provider. + System.Data.OracleClient.OracleConnection, System.Data.OracleClient, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + This is an optional package that you can download from + http://msdn.microsoft.com/downloads + search for .NET Managed Provider for Oracle. + + + + + Gets or sets the command text that is used to insert logging events + into the database. + + + The command text used to insert logging events into the database. + + + + Either the text of the prepared statement or the + name of the stored procedure to execute to write into + the database. + + + The property determines if + this text is a prepared statement or a stored procedure. + + + If this property is not set, the command text is retrieved by invoking + . + + + + + + Gets or sets the command type to execute. + + + The command type to execute. + + + + This value may be either (System.Data.CommandType.Text) to specify + that the is a prepared statement to execute, + or (System.Data.CommandType.StoredProcedure) to specify that the + property is the name of a stored procedure + to execute. + + + The default value is (System.Data.CommandType.Text). + + + + + + Should transactions be used to insert logging events in the database. + + + true if transactions should be used to insert logging events in + the database, otherwise false. The default value is true. + + + + Gets or sets a value that indicates whether transactions should be used + to insert logging events in the database. + + + When set a single transaction will be used to insert the buffered events + into the database. Otherwise each event will be inserted without using + an explicit transaction. + + + + + + Gets or sets the used to call the NetSend method. + + + The used to call the NetSend method. + + + + Unless a specified here for this appender + the is queried for the + security context to use. The default behavior is to use the security context + of the current thread. + + + + + + Should this appender try to reconnect to the database on error. + + + true if the appender should try to reconnect to the database after an + error has occurred, otherwise false. The default value is false, + i.e. not to try to reconnect. + + + + The default behaviour is for the appender not to try to reconnect to the + database if an error occurs. Subsequent logging events are discarded. + + + To force the appender to attempt to reconnect to the database set this + property to true. + + + When the appender attempts to connect to the database there may be a + delay of up to the connection timeout specified in the connection string. + This delay will block the calling application's thread. + Until the connection can be reestablished this potential delay may occur multiple times. + + + + + + Gets or sets the underlying . + + + The underlying . + + + creates a to insert + logging events into a database. Classes deriving from + can use this property to get or set this . Use the + underlying returned from if + you require access beyond that which provides. + + + + + Initialize the appender based on the options set + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Override the parent method to close the database + + + + Closes the database command and database connection. + + + + + + Inserts the events into the database. + + The events to insert into the database. + + + Insert all the events specified in the + array into the database. + + + + + + Adds a parameter to the command. + + The parameter to add to the command. + + + Adds a parameter to the ordered list of command parameters. + + + + + + Writes the events to the database using the transaction specified. + + The transaction that the events will be executed under. + The array of events to insert into the database. + + + The transaction argument can be null if the appender has been + configured not to use transactions. See + property for more information. + + + + + + Prepare entire database command object to be executed. + + The command to prepare. + + + + Formats the log message into database statement text. + + The event being logged. + + This method can be overridden by subclasses to provide + more control over the format of the database statement. + + + Text that can be passed to a . + + + + + Creates an instance used to connect to the database. + + + This method is called whenever a new IDbConnection is needed (i.e. when a reconnect is necessary). + + The of the object. + The connectionString output from the ResolveConnectionString method. + An instance with a valid connection string. + + + + Resolves the connection string from the ConnectionString, ConnectionStringName, or AppSettingsKey + property. + + Additional information describing the connection string. + A connection string used to connect to the database. + + + + Retrieves the class type of the ADO.NET provider. + + + + Gets the Type of the ADO.NET provider to use to connect to the + database. This method resolves the type specified in the + property. + + + Subclasses can override this method to return a different type + if necessary. + + + The of the ADO.NET provider + + + + Connects to the database. + + + + + Cleanup the existing connection. + + + Calls the IDbConnection's method. + + + + + The list of objects. + + + + The list of objects. + + + + + + The fully qualified type of the AdoNetAppender class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Parameter type used by the . + + + + This class provides the basic database parameter properties + as defined by the interface. + + This type can be subclassed to provide database specific + functionality. The two methods that are called externally are + and . + + + + + + Initializes a new instance of the class. + + + Default constructor for the AdoNetAppenderParameter class. + + + + + Gets or sets the name of this parameter. + + + The name of this parameter. + + + + The name of this parameter. The parameter name + must match up to a named parameter to the SQL stored procedure + or prepared statement. + + + + + + Gets or sets the database type for this parameter. + + + The database type for this parameter. + + + + The database type for this parameter. This property should + be set to the database type from the + enumeration. See . + + + This property is optional. If not specified the ADO.NET provider + will attempt to infer the type from the value. + + + + + + + Gets or sets the precision for this parameter. + + + The precision for this parameter. + + + + The maximum number of digits used to represent the Value. + + + This property is optional. If not specified the ADO.NET provider + will attempt to infer the precision from the value. + + + + + + + Gets or sets the scale for this parameter. + + + The scale for this parameter. + + + + The number of decimal places to which Value is resolved. + + + This property is optional. If not specified the ADO.NET provider + will attempt to infer the scale from the value. + + + + + + + Gets or sets the size for this parameter. + + + The size for this parameter. + + + + The maximum size, in bytes, of the data within the column. + + + This property is optional. If not specified the ADO.NET provider + will attempt to infer the size from the value. + + + For BLOB data types like VARCHAR(max) it may be impossible to infer the value automatically, use -1 as the size in this case. + + + + + + + Gets or sets the to use to + render the logging event into an object for this + parameter. + + + The used to render the + logging event into an object for this parameter. + + + + The that renders the value for this + parameter. + + + The can be used to adapt + any into a + for use in the property. + + + + + + Prepare the specified database command object. + + The command to prepare. + + + Prepares the database command object by adding + this parameter to its collection of parameters. + + + + + + Renders the logging event and set the parameter value in the command. + + The command containing the parameter. + The event to be rendered. + + + Renders the logging event using this parameters layout + object. Sets the value of the parameter on the command object. + + + + + + The database type for this parameter. + + + + + Flag to infer type rather than use the DbType + + + + + Appends logging events to the terminal using ANSI color escape sequences. + + + + AnsiColorTerminalAppender appends log events to the standard output stream + or the error output stream using a layout specified by the + user. It also allows the color of a specific level of message to be set. + + + This appender expects the terminal to understand the VT100 control set + in order to interpret the color codes. If the terminal or console does not + understand the control codes the behavior is not defined. + + + By default, all output is written to the console's standard output stream. + The property can be set to direct the output to the + error stream. + + + NOTE: This appender writes each message to the System.Console.Out or + System.Console.Error that is set at the time the event is appended. + Therefore it is possible to programmatically redirect the output of this appender + (for example NUnit does this to capture program output). While this is the desired + behavior of this appender it may have security implications in your application. + + + When configuring the ANSI colored terminal appender, a mapping should be + specified to map a logging level to a color. For example: + + + + + + + + + + + + + + + The Level is the standard log4net logging level and ForeColor and BackColor can be any + of the following values: + + Blue + Green + Red + White + Yellow + Purple + Cyan + + These color values cannot be combined to make new colors. + + + The attributes can be any combination of the following: + + Brightforeground is brighter + Dimforeground is dimmer + Underscoremessage is underlined + Blinkforeground is blinking (does not work on all terminals) + Reverseforeground and background are reversed + Hiddenoutput is hidden + Strikethroughmessage has a line through it + + While any of these attributes may be combined not all combinations + work well together, for example setting both Bright and Dim attributes makes + no sense. + + + Patrick Wagstrom + Nicko Cadell + + + + The enum of possible display attributes that can be combined to form the ANSI color attributes. + + + + + + text is bright + + + + + text is dim + + + + + text is underlined + + + + + text is blinking + + + Not all terminals support this attribute + + + + + text and background colors are reversed + + + + + text is hidden + + + + + text is displayed with a strikethrough + + + + + text color is light + + + + + The enum of possible foreground or background color values for + use with the color mapping method + + + + + + color is black + + + + + color is red + + + + + color is green + + + + + color is yellow + + + + + color is blue + + + + + color is magenta + + + + + color is cyan + + + + + color is white + + + + + Initializes a new instance of the class. + + + The instance of the class is set up to write + to the standard output stream. + + + + + Gets the console output stream, one of "Console.Out" or "Console.Error". + + + + + Adds a mapping of level to foreground and background colors. + + The mapping to add + + + + Writes the event to the console. + + The event to log. + + + This method is called by the method. + + + The format of the output will depend on the appender layout. + + + + + + This appender requires a to be set. + + + + + Initializes the level to color mappings set on this appender. + + + + + The to use when writing to the Console + standard output stream. + + + + + The to use when writing to the Console + standard error output stream. + + + + + Flag to write output to the error stream rather than the standard output stream + + + + + Mapping from level object to color value + + + + + Ansi code to reset terminal + + + + + A class to act as a mapping between the level that a logging call is made at and + the color it should be displayed as. + + + + Defines the mapping between a level and the color it should be displayed in. + + + + + + The mapped foreground color for the specified level + + + + Required property. + The mapped foreground color for the specified level + + + + + + The mapped background color for the specified level. Required property. + + + + + The color attributes for the specified level. + + + + + Initializes the options for the object + + + + Combines the and together + and appends the attributes. + + + + + + The combined , and + suitable for setting the ansi terminal color. + + + + + A strongly-typed collection of objects. + + Nicko Cadell + + + + Supports type-safe iteration over a . + + + + + Creates a read-only wrapper for a instance. + + list to create a readonly wrapper around + + An wrapper that is read-only. + + + + + An empty readonly static AppenderCollection + + + + + Initializes a new instance of the class + that is empty and has the default initial capacity. + + + + + Initializes a new instance of the class + that has the specified initial capacity. + + + The number of elements that the new is initially capable of storing. + + + + + Initializes a new instance of the class + that contains elements copied from the specified . + + The whose elements are copied to the new collection. + + + + Initializes a new instance of the class + that contains elements copied from the specified array. + + The array whose elements are copied to the new list. + + + + Initializes a new instance of the class + that contains elements copied from the specified collection. + + The collection whose elements are copied to the new list. + + + + Type visible only to our subclasses + Used to access protected constructor + + + + + + A value + + + + + Allow subclasses to avoid our default constructors + + + + + + Gets the number of elements actually contained in the . + + + + + Copies the entire to a one-dimensional + array. + + The one-dimensional array to copy to. + + + + Copies the entire to a one-dimensional + array, starting at the specified index of the target array. + + The one-dimensional array to copy to. + The zero-based index in at which copying begins. + + + + Gets a value indicating whether access to the collection is synchronized (thread-safe). + + false, because the backing type is an array, which is never thread-safe. + + + + Gets an object that can be used to synchronize access to the collection. + + + + + Gets or sets the at the specified index. + + The zero-based index of the element to get or set. + + is less than zero + -or- + is equal to or greater than . + + + + + Adds a to the end of the . + + The to be added to the end of the . + The new + + + + Removes all elements from the . + + + + + Creates a shallow copy of the . + + A new with a shallow copy of the collection data. + + + + Determines whether a given is in the . + + The to check for. + if is found in the ; otherwise, . + + + + Returns the zero-based index of the first occurrence of a + in the . + + The to locate in the . + + The zero-based index of the first occurrence of + in the entire , if found; otherwise, -1. + + + + + Inserts an element into the at the specified index. + + The zero-based index at which should be inserted. + The to insert. + + is less than zero + -or- + is equal to or greater than . + + + + + Removes the first occurrence of a specific from the . + + The to remove from the . + True if the item was removed. + + The specified was not found in the . + + + + + Removes the element at the specified index of the . + + The zero-based index of the element to remove. + + is less than zero + -or- + is equal to or greater than . + + + + + Gets a value indicating whether the collection has a fixed size. + + true if the collection has a fixed size; otherwise, false. The default is false + + + + Gets a value indicating whether the IList is read-only. + + true if the collection is read-only; otherwise, false. The default is false + + + + Returns an enumerator that can iterate through the . + + An for the entire . + + + + Gets or sets the number of elements the can contain. + + + + + Adds the elements of another to the current . + + The whose elements should be added to the end of the current . + The new of the . + + + + Adds the elements of a array to the current . + + The array whose elements should be added to the end of the . + The new of the . + + + + Adds the elements of a collection to the current . + + The collection whose elements should be added to the end of the . + The new of the . + + + + Sets the capacity to the actual number of elements. + + + + + Return the collection elements as an array + + the array + + + + is less than zero + -or- + is equal to or greater than . + + + + + Supports simple iteration over a . + + + + + + Initializes a new instance of the class. + + + + + Gets the current element in the collection. + + + + + Advances the enumerator to the next element in the collection. + + + if the enumerator was successfully advanced to the next element; + if the enumerator has passed the end of the collection. + + + The collection was modified after the enumerator was created. + + + + + Sets the enumerator to its initial position, before the first element in the collection. + + + + + + + + Abstract base class implementation of . + + + + This class provides the code for common functionality, such + as support for threshold filtering and support for general filters. + + + Appenders can also implement the interface. Therefore + they would require that the method + be called after the appenders properties have been configured. + + + Nicko Cadell + Gert Driesen + + + + Default constructor + + + Empty default constructor + + + + + Finalizes this appender by calling the implementation's + method. + + + + If this appender has not been closed then the Finalize method + will call . + + + + + + Gets or sets the threshold of this appender. + Defaults to . + + + The threshold of the appender. + + + + All log events with lower level than the threshold level are ignored + by the appender. + + + In configuration files this option is specified by setting the + value of the option to a level + string, such as "DEBUG", "INFO" and so on. + + + + + + Gets or sets the for this appender. + + The of the appender + + + The provides a default + implementation for the property. + + + + + + The filter chain. + + The head of the filter chain. + + + Returns the head Filter. The Filters are organized in a linked list + and so all Filters on this Appender are available through the result. + + + + + + Gets or sets the for this appender. + + The layout of the appender. + + + See for more information. + + + + + + + Initialize the appender based on the options set + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Gets or sets the name that uniquely identifies this appender. + + + + + Closes the appender and releases resources. + + + + Release any resources allocated within the appender such as file handles, + network connections, etc. + + + It is a programming error to append to a closed appender. + + + This method cannot be overridden by subclasses. This method + delegates the closing of the appender to the + method which must be overridden in the subclass. + + + + + + Performs threshold checks and invokes filters before + delegating actual logging to the subclasses specific + method. + + The event to log. + + + This method cannot be overridden by derived classes. A + derived class should override the method + which is called by this method. + + + The implementation of this method is as follows: + + + + + + Checks that the severity of the + is greater than or equal to the of this + appender. + + + + Checks that the chain accepts the + . + + + + + Calls and checks that + it returns true. + + + + + If all of the above steps succeed then the + will be passed to the abstract method. + + + + + + Performs threshold checks and invokes filters before + delegating actual logging to the subclasses specific + method. + + The array of events to log. + + + This method cannot be overridden by derived classes. A + derived class should override the method + which is called by this method. + + + The implementation of this method is as follows: + + + + + + Checks that the severity of the + is greater than or equal to the of this + appender. + + + + Checks that the chain accepts the + . + + + + + Calls and checks that + it returns true. + + + + + If all of the above steps succeed then the + will be passed to the method. + + + + + + Test if the logging event should we output by this appender + + the event to test + true if the event should be output, false if the event should be ignored + + + This method checks the logging event against the threshold level set + on this appender and also against the filters specified on this + appender. + + + The implementation of this method is as follows: + + + + + + Checks that the severity of the + is greater than or equal to the of this + appender. + + + + Checks that the chain accepts the + . + + + + + + + + + Adds a filter to the end of the filter chain. + + the filter to add to this appender + + + The Filters are organized in a linked list. + + + Setting this property causes the new filter to be pushed onto the + back of the filter chain. + + + + + + Clears the filter list for this appender. + + + + Clears the filter list for this appender. + + + + + + Checks if the message level is below this appender's threshold. + + to test against. + + true if the meets the + requirements of this appender. A null level always maps to true, + the equivalent of . + + + + + Is called when the appender is closed. Derived classes should override + this method if resources need to be released. + + + + Releases any resources allocated within the appender such as file handles, + network connections, etc. + + + It is a programming error to append to a closed appender. + + + + + + Subclasses of should implement this method + to perform actual logging. + + The event to append. + + + A subclass must implement this method to perform + logging of the . + + This method will be called by + if all the conditions listed for that method are met. + + + To restrict the logging of events in the appender + override the method. + + + + + + Append a bulk array of logging events. + + the array of logging events + + + This base class implementation calls the + method for each element in the bulk array. + + + A subclass that can better process a bulk array of events should + override this method in addition to . + + + + + + Appends logging events. + + The logging events + + + This base class implementation calls the + method for each element in the bulk array. + + + A subclass that can better process a bulk array of events should + override this method in addition to . + + + + + + Called before as a precondition. + + + + This method is called by + before the call to the abstract method. + + + This method can be overridden in a subclass to extend the checks + made before the event is passed to the method. + + + A subclass should ensure that they delegate this call to + this base class if it is overridden. + + + true if the call to should proceed. + + + + Renders the to a string. + + The event to render. + The event rendered as a string. + + + Helper method to render a to + a string. This appender must have a + set to render the to + a string. + + If there is exception data in the logging event and + the layout does not process the exception, this method + will append the exception text to the rendered string. + + + Where possible use the alternative version of this method + . + That method streams the rendering onto an existing Writer + which can give better performance if the caller already has + a open and ready for writing. + + + + + + Renders the to a string. + + The event to render. + The TextWriter to write the formatted event to + + + Helper method to render a to + a string. This appender must have a + set to render the to + a string. + + If there is exception data in the logging event and + the layout does not process the exception, this method + will append the exception text to the rendered string. + + + Use this method in preference to + where possible. If, however, the caller needs to render the event + to a string then does + provide an efficient mechanism for doing so. + + + + + + Tests if this appender requires a to be set. + + + + In the rather exceptional case, where the appender + implementation admits a layout but can also work without it, + then the appender should return true. + + + This default implementation always returns false. + + + + true if the appender requires a layout object, otherwise false. + + + + + Flushes any buffered log data. + + + This implementation doesn't flush anything and always returns true + + True if all logging events were flushed successfully, else false. + + + + It is assumed and enforced that errorHandler is never null. + + + + See for more information. + + + + + + The last filter in the filter chain. + + + See for more information. + + + + + Flag indicating if this appender is closed. + + + See for more information. + + + + + The guard prevents an appender from repeatedly calling its own DoAppend method + + + + + Used for locking actions by this appender. + + + + + StringWriter used to render events + + + + + Initial buffer size + + + + + Maximum buffer size before it is recycled + + + + + The fully qualified type of the AppenderSkeleton class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Abstract base class implementation of that + buffers events in a fixed size buffer. + + + + This base class should be used by appenders that need to buffer a + number of events before logging them. + For example the + buffers events and then submits the entire contents of the buffer to + the underlying database in one go. + + + Subclasses should override the + method to deliver the buffered events. + + The BufferingAppenderSkeleton maintains a fixed size cyclic + buffer of events. The size of the buffer is set using + the property. + + A is used to inspect + each event as it arrives in the appender. If the + triggers, then the current buffer is sent immediately + (see ). Otherwise the event + is stored in the buffer. For example, an evaluator can be used to + deliver the events immediately when an ERROR event arrives. + + + The buffering appender can be configured in a mode. + By default the appender is NOT lossy. When the buffer is full all + the buffered events are sent with . + If the property is set to true then the + buffer will not be sent when it is full, and new events arriving + in the appender will overwrite the oldest event in the buffer. + In lossy mode the buffer will only be sent when the + triggers. This can be useful behavior when you need to know about + ERROR events but not about events with a lower level, configure an + evaluator that will trigger when an ERROR event arrives, the whole + buffer will be sent which gives a history of events leading up to + the ERROR event. + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + + Protected default constructor to allow subclassing. + + + + + + Initializes a new instance of the class. + + the events passed through this appender must be + fixed by the time that they arrive in the derived class' SendBuffer method. + + + Protected constructor to allow subclassing. + + + The should be set if the subclass + expects the events delivered to be fixed even if the + is set to zero, i.e. when no buffering occurs. + + + + + + Gets or sets a value that indicates whether the appender is lossy. + + + true if the appender is lossy, otherwise false. The default is false. + + + + This appender uses a buffer to store logging events before + delivering them. A triggering event causes the whole buffer + to be sent to the remote sink. If the buffer overruns before + a triggering event then logging events could be lost. Set + to false to prevent logging events + from being lost. + + If is set to true then an + must be specified. + + + + + Gets or sets the size of the cyclic buffer used to hold the + logging events. + + + The size of the cyclic buffer used to hold the logging events. + + + + The option takes a positive integer + representing the maximum number of logging events to collect in + a cyclic buffer. When the is reached, + oldest events are deleted as new events are added to the + buffer. By default the size of the cyclic buffer is 512 events. + + + If the is set to a value less than + or equal to 1 then no buffering will occur. The logging event + will be delivered synchronously (depending on the + and properties). Otherwise the event will + be buffered. + + + + + + Gets or sets the that causes the + buffer to be sent immediately. + + + The that causes the buffer to be + sent immediately. + + + + The evaluator will be called for each event that is appended to this + appender. If the evaluator triggers then the current buffer will + immediately be sent (see ). + + If is set to true then an + must be specified. + + + + + Gets or sets the value of the to use. + + + The value of the to use. + + + + The evaluator will be called for each event that is discarded from this + appender. If the evaluator triggers then the current buffer will immediately + be sent (see ). + + + + + + Gets or sets the fields that will be fixed in the event. + + + The event fields that will be fixed before the event is buffered + + + + The logging event needs to have certain thread specific values + captured before it can be buffered. See + for details. + + + + + + + Flushes any buffered log data. + + The maximum time to wait for logging events to be flushed. + True if all logging events were flushed successfully, else false. + + + + Flush the currently buffered events + + + + Flushes any events that have been buffered. + + + If the appender is buffering in mode then the contents + of the buffer will NOT be flushed to the appender. + + + + + + Flush the currently buffered events + + set to true to flush the buffer of lossy events + + + Flushes events that have been buffered. If is + false then events will only be flushed if this buffer is non-lossy mode. + + + If the appender is buffering in mode then the contents + of the buffer will only be flushed if is true. + In this case the contents of the buffer will be tested against the + and if triggering will be output. All other buffered + events will be discarded. + + + If is true then the buffer will always + be emptied by calling this method. + + + + + + Initialize the appender based on the options set + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Close this appender instance. + + + + Close this appender instance. If this appender is marked + as not then the remaining events in + the buffer must be sent when the appender is closed. + + + + + + This method is called by the method. + + the event to log + + + Stores the in the cyclic buffer. + + + The buffer will be sent (i.e. passed to the + method) if one of the following conditions is met: + + + + The cyclic buffer is full and this appender is + marked as not lossy (see ) + + + An is set and + it is triggered for the + specified. + + + + Before the event is stored in the buffer it is fixed + (see ) to ensure that + any data referenced by the event will be valid when the buffer + is processed. + + + + + + Sends the contents of the buffer. + + The first logging event. + The buffer containing the events that need to be sent. + + + The subclass must override . + + + + + + Sends the events. + + The events that need to be sent. + + + The subclass must override this method to process the buffered events. + + + + + + The default buffer size. + + + The default size of the cyclic buffer used to store events. + This is set to 512 by default. + + + + + The cyclic buffer used to store the logging events. + + + + + The events delivered to the subclass must be fixed. + + + + + Buffers events and then forwards them to attached appenders. + + + + The events are buffered in this appender until conditions are + met to allow the appender to deliver the events to the attached + appenders. See for the + conditions that cause the buffer to be sent. + + The forwarding appender can be used to specify different + thresholds and filters for the same appender at different locations + within the hierarchy. + + + Nicko Cadell + Gert Driesen + + + + Closes the appender and releases resources. + + + + Releases any resources allocated within the appender such as file handles, + network connections, etc. + + + It is a programming error to append to a closed appender. + + + + + + Send the events. + + The events that need to be sent. + + + Forwards the events to the attached appenders. + + + + + + Adds an to the list of appenders of this + instance. + + The to add to this appender. + + + If the specified is already in the list of + appenders, then it won't be added again. + + + + + + Gets the appenders contained in this appender as an + . + + + If no appenders can be found, then an + is returned. + + + A collection of the appenders in this appender. + + + + + Looks for the appender with the specified name. + + The name of the appender to lookup. + + The appender with the specified name, or null. + + + + + Removes all previously added appenders from this appender. + + + + This is useful when re-reading configuration information. + + + + + + Removes the specified appender from the list of appenders. + + The appender to remove. + The appender removed from the list + + The appender removed is not closed. + If you are discarding the appender you must call + on the appender removed. + + + + + Removes the appender with the specified name from the list of appenders. + + The name of the appender to remove. + The appender removed from the list + + The appender removed is not closed. + If you are discarding the appender you must call + on the appender removed. + + + + + Implementation of the interface + + + + + Appends logging events to the console. + + + + ColoredConsoleAppender appends log events to the standard output stream + or the error output stream using a layout specified by the + user. It also allows the color of a specific type of message to be set. + + + By default, all output is written to the console's standard output stream. + The property can be set to direct the output to the + error stream. + + + NOTE: This appender writes directly to the application's attached console + not to the System.Console.Out or System.Console.Error TextWriter. + The System.Console.Out and System.Console.Error streams can be + programmatically redirected (for example NUnit does this to capture program output). + This appender will ignore these redirections because it needs to use Win32 + API calls to colorize the output. To respect these redirections the + must be used. + + + When configuring the colored console appender, mapping should be + specified to map a logging level to a color. For example: + + + + + + + + + + + + + + The Level is the standard log4net logging level and ForeColor and BackColor can be any + combination of the following values: + + Blue + Green + Red + White + Yellow + Purple + Cyan + HighIntensity + + + + Rick Hobbs + Nicko Cadell + + + + The enum of possible color values for use with the color mapping method + + + + The following flags can be combined to form the colors. + + + + + + + color is blue + + + + + color is green + + + + + color is red + + + + + color is white + + + + + color is yellow + + + + + color is purple + + + + + color is cyan + + + + + color is intensified + + + + + Initializes a new instance of the class. + + + The instance of the class is set up to write + to the standard output stream. + + + + + Target is the value of the console output stream. + This is either "Console.Out" or "Console.Error". + + + Target is the value of the console output stream. + This is either "Console.Out" or "Console.Error". + + + + Target is the value of the console output stream. + This is either "Console.Out" or "Console.Error". + + + + + + Add a mapping of level to color - done by the config file + + The mapping to add + + + Add a mapping to this appender. + Each mapping defines the foreground and background colors + for a level. + + + + + + This method is called by the method. + + The event to log. + + + Writes the event to the console. + + + The format of the output will depend on the appender's layout. + + + + + + This appender requires a to be set. + + + + + Initializes the options for this appender. + + + + + The to use when writing to the Console + standard output stream. + + + + + The to use when writing to the Console + standard error output stream. + + + + + Flag to write output to the error stream rather than the standard output stream + + + + + Mapping from level object to color value + + + + + The console output stream writer to write to + + + + This writer is not thread safe. + + + + + + A class to act as a mapping between the level that a logging call is made at and + the color it should be displayed as. + + + + Defines the mapping between a level and the color it should be displayed in. + + + + + + The mapped foreground color for the specified level + + + + + The mapped background color for the specified level + + + + + Initialize the options for the object + + + + Combine the and together. + + + + + + The combined and suitable for + setting the console color. + + + + + Appends logging events to the console. + + + + ConsoleAppender appends log events to the standard output stream + or the error output stream using a layout specified by the + user. + + + By default, all output is written to the console's standard output stream. + The property can be set to direct the output to the + error stream. + + + NOTE: This appender writes each message to the System.Console.Out or + System.Console.Error that is set at the time the event is appended. + Therefore it is possible to programmatically redirect the output of this appender + (for example NUnit does this to capture program output). While this is the desired + behavior of this appender it may have security implications in your application. + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + The instance of the class is set up to write + to the standard output stream. + + + + + Target is the value of the console output stream. + This is either "Console.Out" or "Console.Error". + + + Target is the value of the console output stream. + This is either "Console.Out" or "Console.Error". + + + + Target is the value of the console output stream. + This is either "Console.Out" or "Console.Error". + + + + + + This method is called by the method. + + The event to log. + + + Writes the event to the console. + + + The format of the output will depend on the appender's layout. + + + + + + This appender requires a to be set. + + + + + The to use when writing to the Console standard output stream. + + + + + The to use when writing to the Console standard error output stream. + + + + + Appends log events to the system. + + + + The application configuration file can be used to control what listeners + are actually used. See the MSDN documentation for the + class for details on configuring the + debug system. + + + Events are written using the + method. The event's logger name is passed as the value for the category name to the Write method. + + + Nicko Cadell + + + + Gets or sets a value that indicates whether the appender will + flush at the end of each write. + + + The default behavior is to flush at the end of each + write. If the option is set tofalse, then the underlying + stream can defer writing to physical medium to a later time. + + + Avoiding the flush operation at the end of each append results + in a performance gain of 10 to 20 percent. However, there is safety + trade-off involved in skipping flushing. Indeed, when flushing is + skipped, then it is likely that the last few log events will not + be recorded on disk when the application exits. This is a high + price to pay even for a 20% performance gain. + + + + + + Formats the category parameter sent to the Debug method. + + + + Defaults to a with %logger as the pattern which will use the logger name of the current + as the category parameter. + + + + + + Flushes any buffered log data. + + The maximum time to wait for logging events to be flushed. + True if all logging events were flushed successfully, else false. + + + + Writes the logging event to the system. + + The event to log. + + + Writes the logging event to the system. + If is true then the + is called. + + + + + + This appender requires a to be set. + + + + + Appends logging events to a file. + + + + Logging events are sent to the file specified by the property. + + + The file can be opened in either append or overwrite mode + by specifying the property. + If the file path is relative it is taken as relative from + the application base directory. The file encoding can be + specified by setting the property. + + + The layout's and + values will be written each time the file is opened and closed + respectively. If the property is + then the file may contain multiple copies of the header and footer. + + + This appender will first try to open the file for writing when + is called. This will typically be during configuration. + If the file cannot be opened for writing the appender will attempt + to open the file again each time a message is logged to the appender. + If the file cannot be opened for writing when a message is logged then + the message will be discarded by this appender. + + + The supports pluggable file locking models via + the property. + The default behavior, implemented by + is to obtain an exclusive write lock on the file until this appender is closed. + The alternative models only hold a + write lock while the appender is writing a logging event () + or synchronize by using a named system-wide Mutex (). + + + All locking strategies have issues and you should seriously consider using a different strategy that + avoids having multiple processes logging to the same file. + + + Nicko Cadell + Gert Driesen + Rodrigo B. de Oliveira + Douglas de la Torre + Niall Daley + + + + Write only that uses the + to manage access to an underlying resource. + + + + + Write only that uses the + to manage access to an underlying resource. + + + + + Locking model base class + + + + Base class for the locking models available to the derived loggers. + + + + + + Open the output file + + The filename to use + Whether to append to the file, or overwrite + The encoding to use + + + Open the file specified and prepare for logging. + No writes will be made until is called. + Must be called before any calls to , + and . + + + + + + Close the file + + + + Close the file. No further writes will be made. + + + + + + Initializes all resources used by this locking model. + + + + + Disposes all resources that were initialized by this locking model. + + + + + Acquire the lock on the file + + A stream that is ready to be written to, or null if there is no active stream because uninitialized or error. + + + Acquire the lock on the file in preparation for writing to it. + Returns a stream pointing to the file. + must be called to release the lock on the output file when the return + value is not null. + + + + + + Releases the lock on the file + + + + No further writes will be made to the stream until is called again. + + + + + + Gets or sets the for this LockingModel + + + The for this LockingModel + + + + The file appender this locking model is attached to and working on + behalf of. + + + The file appender is used to locate the security context and the error handler to use. + + + The value of this property will be set before is + called. + + + + + + Helper method that creates a FileStream under CurrentAppender's SecurityContext. + + + + Typically called during OpenFile or AcquireLock. + + + If the directory portion of the does not exist, it is created + via Directory.CreateDirectory. + + + + + + + + + + Helper method to close under CurrentAppender's SecurityContext. + + + Does not set to null. + + + + + + Hold an exclusive lock on the output file + + + + Open the file once for writing and hold it open until is called. + Maintains an exclusive lock on the file during this time. + + + + + + Open the file specified and prepare for logging. + + The filename to use + Whether to append to the file, or overwrite + The encoding to use + + + Open the file specified and prepare for logging. + No writes will be made until is called. + Must be called before any calls to , + and . + + + + + + Close the file + + + + Close the file. No further writes will be made. + + + + + + Acquire the lock on the file + + A stream that is ready to be written to. + + + Does nothing. The lock is already taken + + + + + + Release the lock on the file + + + + Does nothing. The lock will be released when the file is closed. + + + + + + Initializes all resources used by this locking model. + + + + + Disposes all resources that were initialized by this locking model. + + + + + Acquires the file lock for each write + + + + Opens the file once for each / cycle, + thus holding the lock for the minimal amount of time. This method of locking + is considerably slower than but allows + other processes to move/delete the log file whilst logging continues. + + + + + + Prepares to open the file when the first message is logged. + + The filename to use + Whether to append to the file, or overwrite + The encoding to use + + + Open the file specified and prepare for logging. + No writes will be made until is called. + Must be called before any calls to , + and . + + + + + + Close the file + + + + Close the file. No further writes will be made. + + + + + + Acquire the lock on the file + + A stream that is ready to be written to. + + + Acquire the lock on the file in preparation for writing to it. + Return a stream pointing to the file. + must be called to release the lock on the output file. + + + + + + Release the lock on the file + + + + Release the lock on the file. No further writes will be made to the + stream until is called again. + + + + + + Initializes all resources used by this locking model. + + + + + Disposes all resources that were initialized by this locking model. + + + + + Provides cross-process file locking. + + Ron Grabowski + Steve Wranovsky + + + + Open the file specified and prepare for logging. + + The filename to use + Whether to append to the file, or overwrite + The encoding to use + + + Open the file specified and prepare for logging. + No writes will be made until is called. + Must be called before any calls to , + - and . + + + + + + Close the file + + + + Close the file. No further writes will be made. + + + + + + Acquire the lock on the file + + A stream that is ready to be written to. + + + Does nothing. The lock is already taken + + + + + + Releases the lock and allows others to acquire a lock. + + + + + Initializes all resources used by this locking model. + + + + + Disposes all resources that were initialized by this locking model. + + + + + Hold no lock on the output file + + + + Open the file once and hold it open until is called. + Maintains no lock on the file during this time. + + + + + + Open the file specified and prepare for logging. + + The filename to use + Whether to append to the file, or overwrite + The encoding to use + + + Open the file specified and prepare for logging. + No writes will be made until is called. + Must be called before any calls to , + and . + + + + + + Close the file + + + + Close the file. No further writes will be made. + + + + + + Acquire the lock on the file + + A stream that is ready to be written to. + + + Does nothing. The lock is already taken + + + + + + Release the lock on the file + + + + Does nothing. The lock will be released when the file is closed. + + + + + + Initializes all resources used by this locking model. + + + + + Disposes all resources that were initialized by this locking model. + + + + + Default locking model (when no locking model was configured) + + + + + Specify default locking model + + Type of LockingModel + + + + Gets or sets the path to the file that logging will be written to. + + + The path to the file that logging will be written to. + + + + If the path is relative it is taken as relative from + the application base directory. + + + + + + Gets or sets a flag that indicates whether the file should be + appended to or overwritten. + + + Indicates whether the file should be appended to or overwritten. + + + + If the value is set to false then the file will be overwritten, if + it is set to true then the file will be appended to. + + The default value is true. + + + + + Gets or sets used to write to the file. + + + The used to write to the file. + + + + The default encoding set is + which is the encoding for the system's current ANSI code page. + + + + + + Gets or sets the used to write to the file. + + + The used to write to the file. + + + + Unless a specified here for this appender + the is queried for the + security context to use. The default behavior is to use the security context + of the current thread. + + + + + + Gets or sets the used to handle locking of the file. + + + The used to lock the file. + + + + Gets or sets the used to handle locking of the file. + + + There are three built in locking models, , and . + The first locks the file from the start of logging to the end, the + second locks only for the minimal amount of time when logging each message + and the last synchronizes processes using a named system-wide Mutex. + + + The default locking model is the . + + + + + + Activate the options on the file appender. + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + This will cause the file to be opened. + + + + + + Closes any previously opened file and calls the parent's . + + + + Resets the filename and the file stream. + + + + + + Close this appender instance. The underlying stream or writer is also closed. + + + + + Called to initialize the file writer + + + + Will be called for each logged message until the file is + successfully opened. + + + + + + This method is called by the + method. + + The event to log. + + + Writes a log statement to the output stream if the output stream exists + and is writable. + + + The format of the output will depend on the appender's layout. + + + + + + This method is called by the + method. + + The array of events to log. + + + Acquires the output file locks once before writing all the events to + the stream. + + + + + + Writes a footer as produced by the embedded layout's property. + + + + Writes a footer as produced by the embedded layout's property. + + + + + + Writes a header produced by the embedded layout's property. + + + + Writes a header produced by the embedded layout's property. + + + + + + Closes the underlying . + + + + Closes the underlying . + + + + + + Closes the previously opened file. + + + + Writes the to the file and then + closes the file. + + + + + + Sets and opens the file where the log output will go. The specified file must be writable. + + The path to the log file. Must be a fully qualified path. + If true will append to fileName. Otherwise will truncate fileName + + + Calls but guarantees not to throw an exception. + Errors are passed to the . + + + + + + Sets and opens the file where the log output will go. The specified file must be writable. + + The path to the log file. Must be a fully qualified path. + If true will append to fileName. Otherwise will truncate fileName + + + If there was already an opened file, then the previous file + is closed first. + + + This method will ensure that the directory structure + for the specified exists. + + + + + + Sets the quiet writer used for file output + + the file stream that has been opened for writing + + + This implementation of creates a + over the and passes it to the + method. + + + This method can be overridden by subclasses that want to wrap the + in some way, for example to encrypt the output + data using a System.Security.Cryptography.CryptoStream. + + + + + + Sets the quiet writer being used. + + the writer over the file stream that has been opened for writing + + + This method can be overridden by subclasses that want to + wrap the in some way. + + + + + + Convert a path into a fully qualified path. + + The path to convert. + The fully qualified path. + + + Converts the path specified to a fully + qualified path. If the path is relative it is + taken as relative from the application base + directory. + + + + + + The name of the log file. + + + + + The stream to log to. Has added locking semantics + + + + + The fully qualified type of the FileAppender class. + + + Used by the internal logger to record the Type of the + log message. + + + + + This appender forwards logging events to attached appenders. + + + + The forwarding appender can be used to specify different thresholds + and filters for the same appender at different locations within the hierarchy. + + + Nicko Cadell + Gert Driesen + + + + Closes the appender and releases resources. + + + + Releases any resources allocated within the appender such as file handles, + network connections, etc. + + + It is a programming error to append to a closed appender. + + + + + + Forward the logging event to the attached appenders + + The event to log. + + + Delivers the logging event to all the attached appenders. + + + + + + Forward the logging events to the attached appenders + + The array of events to log. + + + Delivers the logging events to all the attached appenders. + + + + + + Adds an to the list of appenders of this + instance. + + The to add to this appender. + + + If the specified is already in the list of + appenders, then it won't be added again. + + + + + + Gets the appenders contained in this appender as an + . + + + If no appenders can be found, then an + is returned. + + + A collection of the appenders in this appender. + + + + + Looks for the appender with the specified name. + + The name of the appender to lookup. + + The appender with the specified name, or null. + + + + Get the named appender attached to this appender. + + + + + + Removes all previously added appenders from this appender. + + + + This is useful when re-reading configuration information. + + + + + + Removes the specified appender from the list of appenders. + + The appender to remove. + The appender removed from the list + + The appender removed is not closed. + If you are discarding the appender you must call + on the appender removed. + + + + + Removes the appender with the specified name from the list of appenders. + + The name of the appender to remove. + The appender removed from the list + + The appender removed is not closed. + If you are discarding the appender you must call + on the appender removed. + + + + + Implementation of the interface + + + + + Implement this interface for your own strategies for printing log statements. + + + + Implementors should consider extending the + class which provides a default implementation of this interface. + + + Appenders can also implement the interface. Therefore + they would require that the method + be called after the appenders properties have been configured. + + + Nicko Cadell + Gert Driesen + + + + Closes the appender and releases resources. + + + + Releases any resources allocated within the appender such as file handles, + network connections, etc. + + + It is a programming error to append to a closed appender. + + + + + + Log the logging event in Appender specific way. + + The event to log + + + This method is called to log a message into this appender. + + + + + + Gets or sets the name of this appender. + + The name of the appender. + + The name uniquely identifies the appender. + + + + + Interface for appenders that support bulk logging. + + + + This interface extends the interface to + support bulk logging of objects. Appenders + should only implement this interface if they can bulk log efficiently. + + + Nicko Cadell + + + + Log the array of logging events in Appender specific way. + + The events to log + + + This method is called to log an array of events into this appender. + + + + + + Interface that can be implemented by Appenders that buffer logging data and expose a method. + + + + + Flushes any buffered log data. + + + Appenders that implement the method must do so in a thread-safe manner: it can be called concurrently with + the method. + + Typically this is done by locking on the Appender instance, e.g.: + + + + + + The parameter is only relevant for appenders that process logging events asynchronously, + such as RemotingAppender. + + + The maximum time to wait for logging events to be flushed. + True if all logging events were flushed successfully, else false. + + + + Logs events to a local syslog service. + + + + This appender uses the POSIX libc library functions openlog, syslog, and closelog. + If these functions are not available on the local system then this appender will not work! + + + The functions openlog, syslog, and closelog are specified in SUSv2 and + POSIX 1003.1-2001 standards. These are used to log messages to the local syslog service. + + + This appender talks to a local syslog service. If you need to log to a remote syslog + daemon and you cannot configure your local syslog service to do this you may be + able to use the to log via UDP. + + + Syslog messages must have a facility and and a severity. The severity + is derived from the Level of the logging event. + The facility must be chosen from the set of defined syslog + values. The facilities list is predefined + and cannot be extended. + + + An identifier is specified with each log message. This can be specified + by setting the property. The identity (also know + as the tag) must not contain white space. The default value for the + identity is the application name (from ). + + + Rob Lyon + Nicko Cadell + + + + syslog severities + + + + The log4net Level maps to a syslog severity using the + method and the + class. The severity is set on . + + + + + + system is unusable + + + + + action must be taken immediately + + + + + critical conditions + + + + + error conditions + + + + + warning conditions + + + + + normal but significant condition + + + + + informational + + + + + debug-level messages + + + + + syslog facilities + + + + The syslog facility defines which subsystem the logging comes from. + This is set on the property. + + + + + + kernel messages + + + + + random user-level messages + + + + + mail system + + + + + system daemons + + + + + security/authorization messages + + + + + messages generated internally by syslogd + + + + + line printer subsystem + + + + + network news subsystem + + + + + UUCP subsystem + + + + + clock (cron/at) daemon + + + + + security/authorization messages (private) + + + + + ftp daemon + + + + + NTP subsystem + + + + + log audit + + + + + log alert + + + + + clock daemon + + + + + reserved for local use + + + + + reserved for local use + + + + + reserved for local use + + + + + reserved for local use + + + + + reserved for local use + + + + + reserved for local use + + + + + reserved for local use + + + + + reserved for local use + + + + + Message identity + + + + An identifier is specified with each log message. This can be specified + by setting the property. The identity (also known + as the tag) must not contain white space. The default value for the + identity is the application name (from ). + + + + + + Syslog facility + + + Set to one of the values. The list of + facilities is predefined and cannot be extended. The default value + is . + + + + + Add a mapping of level to severity + + The mapping to add + + + Adds a to this appender. + + + + + + Initialize the appender based on the options set. + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + This method is called by the method. + + The event to log. + + + Writes the event to a remote syslog daemon. + + + The format of the output will depend on the appender's layout. + + + + + + Close the syslog when the appender is closed + + + + Close the syslog when the appender is closed + + + + + + This appender requires a to be set. + + + + + Translates a log4net level to a syslog severity. + + A log4net level. + A syslog severity. + + + + Generate a syslog priority. + + The syslog facility. + The syslog severity. + A syslog priority. + + + + Marshaled handle to the identity string. We have to hold on to the + string as the openlog and syslog APIs just hold the + pointer to the ident and dereference it for each log message. + + + + + Mapping from level object to syslog severity + + + + + A class to act as a mapping between the level that a logging call is made at and + the syslog severity that is should be logged at. + + + + + The mapped syslog severity for the specified level + + + + + Appends colorful logging events to the console, using .NET built-in capabilities. + + + + ManagedColoredConsoleAppender appends log events to the standard output stream + or the error output stream using a layout specified by the + user. It also allows the color of a specific type of message to be set. + + + By default, all output is written to the console's standard output stream. + The property can be set to direct the output to the + error stream. + + + When configuring the colored console appender, mappings should be + specified to map logging levels to colors. For example: + + + + + + + + + + + + + + + + + + + + + + The Level is the standard log4net logging level while + ForeColor and BackColor are the values of + enumeration. + + + Based on the ColoredConsoleAppender + + + Rick Hobbs + Nicko Cadell + Pavlos Touboulidis + + + + Gets or sets the console output stream. + This is either "Console.Out" or "Console.Error". + + + + + Add a mapping of level to color - done by the config file + + The mapping to add + + + Each mapping defines the foreground and background colors + for a level. + + + + + + Writes the event to the console. + + The event to log. + + + This method is called by the method. + + + The format of the output will depend on the appender's layout. + + + + + + This appender requires a to be set. + + + + + Initializes the options for this appender. + + + + + The to use when writing to the Console + standard output stream. + + + + + The to use when writing to the Console + standard error output stream. + + + + + Flag to write output to the error stream rather than the standard output stream + + + + + Mapping from level object to color value + + + + + A class to act as a mapping between the level that a logging call is made at and + the color it should be displayed as. + + + + + The mapped foreground color for the specified level + + + + + Gets or sets the mapped background color for the specified level + + + + + Stores logging events in an array. + + + + The memory appender stores all the logging events + that are appended in an in-memory array. + + + Use the method to get + and clear the current list of events that have been appended. + + + Use the method to get the current + list of events that have been appended. Note there is a + race-condition when calling and + in pairs, you better use in that case. + + + Use the method to clear the + current list of events. Note there is a + race-condition when calling and + in pairs, you better use in that case. + + + Julian Biddle + Nicko Cadell + Gert Driesen + + + + Gets the events that have been logged. + + The events that have been logged + + + + Gets or sets the fields that will be fixed in the event + + + + The logging event needs to have certain thread specific values + captured before it can be buffered. See + for details. + + + + + + This method is called by the method. + + the event to log + + Stores the in the events list. + + + + + Clear the list of events + + + Clear the list of events + + + + + Gets the events that have been logged and clears the list of events. + + The events that have been logged + + + + The list of events that have been appended. + + + + + Appends log events to the OutputDebugString system. + + Nicko Cadell + Gert Driesen + + + + Writes the logging event to the output debug string API + + the event to log + + + + This appender requires a to be set. + + + + + Logs events to a remote syslog daemon. + + + + The BSD syslog protocol is used to remotely log to + a syslog daemon. The syslogd listens for messages + on UDP port 514. + + + The syslog UDP protocol is not authenticated. Most syslog daemons + do not accept remote log messages because of the security implications. + You may be able to use the LocalSyslogAppender to talk to a local + syslog service. + + + There is an RFC 3164 that claims to document the BSD Syslog Protocol. + This RFC can be seen here: http://www.faqs.org/rfcs/rfc3164.html. + This appender generates what the RFC calls an "Original Device Message", + i.e. does not include the TIMESTAMP or HOSTNAME fields. By observation + this format of message will be accepted by all current syslog daemon + implementations. The daemon will attach the current time and the source + hostname or IP address to any messages received. + + + Syslog messages must have a facility and a severity. The severity + is derived from the Level of the logging event. + The facility must be chosen from the set of defined syslog + values. The facilities list is predefined + and cannot be extended. + + + An identifier is specified with each log message. This can be specified + by setting the property. The identity (also known + as the tag) must not contain white space. The default value for the + identity is the application name (from ). + + + Rob Lyon + Nicko Cadell + + + + Syslog port 514 + + + + + syslog severities + + + + The syslog severities. + + + + + + system is unusable + + + + + action must be taken immediately + + + + + critical conditions + + + + + error conditions + + + + + warning conditions + + + + + normal but significant condition + + + + + informational + + + + + debug-level messages + + + + + syslog facilities + + + + The syslog facilities + + + + + + kernel messages + + + + + random user-level messages + + + + + mail system + + + + + system daemons + + + + + security/authorization messages + + + + + messages generated internally by syslogd + + + + + line printer subsystem + + + + + network news subsystem + + + + + UUCP subsystem + + + + + clock (cron/at) daemon + + + + + security/authorization messages (private) + + + + + ftp daemon + + + + + NTP subsystem + + + + + log audit + + + + + log alert + + + + + clock daemon + + + + + reserved for local use + + + + + reserved for local use + + + + + reserved for local use + + + + + reserved for local use + + + + + reserved for local use + + + + + reserved for local use + + + + + reserved for local use + + + + + reserved for local use + + + + + Initializes a new instance of the class. + + + This instance of the class is set up to write + to a remote syslog daemon. + + + + + Message identity + + + + An identifier is specified with each log message. This can be specified + by setting the property. The identity (also known + as the tag) must not contain white space. The default value for the + identity is the application name (from ). + + + + + + Syslog facility + + + Set to one of the values. The list of + facilities is predefined and cannot be extended. The default value + is . + + + + + Add a mapping of level to severity + + The mapping to add + + + Add a mapping to this appender. + + + + + + Writes the event to a remote syslog daemon. + + The event to log. + + + This method is called by the method. + + + The format of the output will depend on the appender's layout. + + + + + + Appends the rendered message to the buffer + + rendered message + index of the current character in the message + buffer + + + + Initialize the options for this appender + + + + Initialize the level to syslog severity mappings set on this appender. + + + + + + Translates a log4net level to a syslog severity. + + A log4net level. + A syslog severity. + + + + Generate a syslog priority. + + The syslog facility. + The syslog severity. + A syslog priority. + + + Generate a syslog priority. + + + + + + Mapping from level object to syslog severity + + + + + A class to act as a mapping between the level that a logging call is made at and + the syslog severity that it should be logged at. + + + + A class to act as a mapping between the level that a logging call is made at and + the syslog severity that it should be logged at. + + + + + + The mapped syslog severity for the specified level + + + + Required property. + + + + + + Appender that rolls log files based on size or date or both. + + + + RollingFileAppender can roll log files based on size or date or both + depending on the setting of the property. + When set to the log file will be rolled + once its size exceeds the . + When set to the log file will be rolled + once the date boundary specified in the property + is crossed. + When set to the log file will be + rolled once the date boundary specified in the property + is crossed, but within a date boundary the file will also be rolled + once its size exceeds the . + When set to the log file will be rolled when + the appender is configured. This effectively means that the log file can be + rolled once per program execution. + + + A of few additional optional features have been added: + + Attach date pattern for current log file + Backup number increments for newer files + Infinite number of backups by file size + + + + + + For large or infinite numbers of backup files a + greater than zero is highly recommended, otherwise all the backup files need + to be renamed each time a new backup is created. + + + When Date/Time based rolling is used setting + to will reduce the number of file renamings to few or none. + + + + + + Changing or without clearing + the log file directory of backup files will cause unexpected and unwanted side effects. + + + + + If Date/Time based rolling is enabled this appender will attempt to roll existing files + in the directory without a Date/Time tag based on the last write date of the base log file. + The appender only rolls the log file when a message is logged. If Date/Time based rolling + is enabled then the appender will not roll the log file at the Date/Time boundary but + at the point when the next message is logged after the boundary has been crossed. + + + + The extends the and + has the same behavior when opening the log file. + The appender will first try to open the file for writing when + is called. This will typically be during configuration. + If the file cannot be opened for writing the appender will attempt + to open the file again each time a message is logged to the appender. + If the file cannot be opened for writing when a message is logged then + the message will be discarded by this appender. + + + When rolling a backup file necessitates deleting an older backup file the + file to be deleted is moved to a temporary name before being deleted. + + + + + A maximum number of backup files when rolling on date/time boundaries is not supported. + + + + Nicko Cadell + Gert Driesen + Aspi Havewala + Douglas de la Torre + Edward Smit + + + + Style of rolling to use + + + + + Roll files once per program execution + + + + Roll files once per program execution. + Well really once each time this appender is configured. + + + Setting this option also sets AppendToFile to on the + , otherwise this appender would just be a normal file appender. + + + + + + Roll files based only on the size of the file + + + + + Roll files based only on the date + + + + + Roll files based on both the size and date of the file + + + + + The code assumes that the following 'time' constants are in a increasing sequence. + + + + + + + Roll the log not based on the date + + + + + Roll the log for each minute + + + + + Roll the log for each hour + + + + + Roll the log twice a day (midday and midnight) + + + + + Roll the log each day (midnight) + + + + + Roll the log each week + + + + + Roll the log each month + + + + + Initializes a new instance of the class. + + + + + Cleans up all resources used by this appender. + + + + + Gets or sets the strategy for determining the current date and time. The default + implementation is to use LocalDateTime which internally calls through to DateTime.Now. + DateTime.UtcNow may be used on frameworks newer than .NET 1.0 by specifying + . + + + An implementation of the interface which returns the current date and time. + + + + Gets or sets the used to return the current date and time. + + + There are two built strategies for determining the current date and time, + + and . + + + The default strategy is . + + + + + + Gets or sets the date pattern to be used for generating file names + when rolling over on date. + + + The date pattern to be used for generating file names when rolling + over on date. + + + + Takes a string in the same format as expected by + . + May be set to null to disable date formatting. + + + This property determines the rollover schedule when rolling over + on date. + + + + + + Gets or sets the maximum number of backup files that are kept before + the oldest is erased. + + + The maximum number of backup files that are kept before the oldest is + erased. + + + + If set to zero, then there will be no backup files and the log file + will be truncated when it reaches . + + + If a negative number is supplied then no deletions will be made. Note + that this could result in very slow performance as a large number of + files are rolled over unless is used. + + + The maximum applies to each time based group of files and + not the total. + + + + + + Gets or sets the maximum size that the output file is allowed to reach + before being rolled over to backup files. + + + The maximum size in bytes that the output file is allowed to reach before being + rolled over to backup files. + + + + This property is equivalent to except + that it is required for differentiating the setter taking a + argument from the setter taking a + argument. + + + The default maximum file size is 10MB (10*1024*1024). + + + + + + Gets or sets the maximum size that the output file is allowed to reach + before being rolled over to backup files. + + + The maximum size that the output file is allowed to reach before being + rolled over to backup files. + + + + This property allows you to specify the maximum size with the + suffixes "KB", "MB" or "GB" so that the size is interpreted being + expressed respectively in kilobytes, megabytes or gigabytes. + + + For example, the value "10KB" will be interpreted as 10240 bytes. + + + The default maximum file size is 10MB. + + + If you have the option to set the maximum file size programmatically + consider using the property instead as this + allows you to set the size in bytes as a . + + + + + + Gets or sets the rolling file count direction. + + + The rolling file count direction. + + + + Indicates if the current file is the lowest numbered file or the + highest numbered file. + + + By default newer files have lower numbers ( < 0), + i.e. log.1 is most recent, log.5 is the 5th backup, etc... + + + >= 0 does the opposite i.e. + log.1 is the first backup made, log.5 is the 5th backup made, etc. + For infinite backups use >= 0 to reduce + rollover costs. + + The default file count direction is -1. + + + + + Gets or sets the rolling style. + + The rolling style. + + + The default rolling style is . + + + When set to this appender's + property is set to , otherwise + the appender would append to a single file rather than rolling + the file each time it is opened. + + + + + + Gets or sets a value indicating whether to preserve the file name extension when rolling. + + + if the file name extension should be preserved. + + + + By default file.log is rolled to file.log.yyyy-MM-dd or file.log.curSizeRollBackup. + However, under Windows the new file name will lose any program associations as the + extension is changed. Optionally file.log can be renamed to file.yyyy-MM-dd.log or + file.curSizeRollBackup.log to maintain any program associations. + + + + + + Gets or sets a value indicating whether to always log to + the same file. + + + if always should be logged to the same file, otherwise . + + + + By default file.log is always the current file. Optionally + file.log.yyyy-mm-dd for current formatted datePattern can by the currently + logging file (or file.log.curSizeRollBackup or even + file.log.yyyy-mm-dd.curSizeRollBackup). + + + This will make time based rollovers with a large number of backups + much faster as the appender it won't have to rename all the backups! + + + + + + The fully qualified type of the RollingFileAppender class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Sets the quiet writer being used. + + + This method can be overridden by subclasses. + + the writer to set + + + + Write out a logging event. + + the event to write to file. + + + Handles append time behavior for RollingFileAppender. This checks + if a roll over either by date (checked first) or time (checked second) + is need and then appends to the file last. + + + + + + Write out an array of logging events. + + the events to write to file. + + + Handles append time behavior for RollingFileAppender. This checks + if a roll over either by date (checked first) or time (checked second) + is need and then appends to the file last. + + + + + + Performs any required rolling before outputting the next event + + + + Handles append time behavior for RollingFileAppender. This checks + if a roll over either by date (checked first) or time (checked second) + is need and then appends to the file last. + + + + + + Creates and opens the file for logging. If + is false then the fully qualified name is determined and used. + + the name of the file to open + true to append to existing file + + This method will ensure that the directory structure + for the specified exists. + + + + + Get the current output file name + + the base file name + the output file name + + The output file name is based on the base fileName specified. + If is set then the output + file name is the same as the base file passed in. Otherwise + the output file depends on the date pattern, on the count + direction or both. + + + + + Determines curSizeRollBackups (only within the current roll point) + + + + + Generates a wildcard pattern that can be used to find all files + that are similar to the base file name. + + + + + Builds a list of filenames for all files matching the base filename plus a file pattern. + + + + + Initiates a roll over if needed for crossing a date boundary since the last run. + + + + + Initializes based on existing conditions at time of . + + + + Initializes based on existing conditions at time of . + The following is done + + determine curSizeRollBackups (only within the current roll point) + initiates a roll over if needed for crossing a date boundary since the last run. + + + + + + + Does the work of bumping the 'current' file counter higher + to the highest count when an incremental file name is seen. + The highest count is either the first file (when count direction + is greater than 0) or the last file (when count direction less than 0). + In either case, we want to know the highest count that is present. + + + + + + + Attempts to extract a number from the end of the file name that indicates + the number of the times the file has been rolled over. + + + Certain date pattern extensions like yyyyMMdd will be parsed as valid backup indexes. + + + + + Takes a list of files and a base file name, and looks for 'incremented' versions of the base file. + Bumps the max count up to the highest count seen. + + + + + Calculates the RollPoint for the datePattern supplied. + + the date pattern to calculate the check period for + The RollPoint that is most accurate for the date pattern supplied + + Essentially the date pattern is examined to determine what the + most suitable roll point is. The roll point chosen is the roll point + with the smallest period that can be detected using the date pattern + supplied. i.e. if the date pattern only outputs the year, month, day + and hour then the smallest roll point that can be detected would be + and hourly roll point as minutes could not be detected. + + + + + Initialize the appender based on the options set + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + Sets initial conditions including date/time roll over information, first check, + scheduledFilename, and calls to initialize + the current number of backups. + + + + + + CombinePath + + + .1, .2, .3, etc. + + + + + Rollover the file(s) to date/time tagged file(s). + + set to true if the file to be rolled is currently open + + + Rollover the file(s) to date/time tagged file(s). + Resets curSizeRollBackups. + If fileIsOpen is set then the new file is opened (through SafeOpenFile). + + + + + + Renames file to file . + + Name of existing file to roll. + New name for file. + + + Renames file to file . It + also checks for existence of target file and deletes if it does. + + + + + + Test if a file exists at a specified path + + the path to the file + true if the file exists + + + Test if a file exists at a specified path + + + + + + Deletes the specified file if it exists. + + The file to delete. + + + Delete a file if it exists. + The file is first moved to a new filename then deleted. + This allows the file to be removed even when it cannot + be deleted, but it still can be moved. + + + + + + Implements file roll base on file size. + + + + If the maximum number of size based backups is reached + (curSizeRollBackups == maxSizeRollBackups) then the oldest + file is deleted -- its index determined by the sign of countDirection. + If countDirection < 0, then files + {File.1, ..., File.curSizeRollBackups -1} + are renamed to {File.2, ..., + File.curSizeRollBackups}. Moreover, File is + renamed File.1 and closed. + + + A new file is created to receive further log output. + + + If maxSizeRollBackups is equal to zero, then the + File is truncated with no backup files created. + + + If maxSizeRollBackups < 0, then File is + renamed if needed and no files are deleted. + + + + + + Implements file roll. + + the base name to rename + + + If the maximum number of size based backups is reached + (curSizeRollBackups == maxSizeRollBackups) then the oldest + file is deleted -- its index determined by the sign of countDirection. + If countDirection < 0, then files + {File.1, ..., File.curSizeRollBackups -1} + are renamed to {File.2, ..., + File.curSizeRollBackups}. + + + If maxSizeRollBackups is equal to zero, then the + File is truncated with no backup files created. + + + If maxSizeRollBackups < 0, then File is + renamed if needed and no files are deleted. + + + This is called by to rename the files. + + + + + + Get the start time of the next window for the current rollpoint + + the current date + the type of roll point we are working with + the start time for the next roll point an interval after the currentDateTime date + + + Returns the date of the next roll point after the currentDateTime date passed to the method. + + + The basic strategy is to subtract the time parts that are less significant + than the rollpoint from the current time. This should roll the time back to + the start of the time window for the current rollpoint. Then we add 1 window + worth of time and get the start time of the next window for the rollpoint. + + + + + + The actual formatted filename that is currently being written to + or will be the file transferred to on roll over + (based on staticLogFileName). + + + + + The timestamp when we shall next recompute the filename. + + + + + Holds date of last roll over + + + + + The type of rolling done + + + + + How many sized based backups have been made so far + + + + + The rolling mode used in this appender. + + + + + Cache flag set if we are rolling by date. + + + + + Cache flag set if we are rolling by size. + + + + + FileName provided in configuration. Used for rolling properly + + + + + A mutex that is used to lock rolling of files. + + + + + The 1st of January 1970 in UTC + + + + + This interface is used to supply Date/Time information to the . + + + This interface is used to supply Date/Time information to the . + Used primarily to allow test classes to plug themselves in so they can + supply test date/times. + + + + + Gets the current time. + + The current time. + + + Gets the current time. + + + + + + Default implementation of that returns the current time. + + + + + Gets the current time. + + The current time. + + + Gets the current time. + + + + + + Implementation of that returns the current time as the coordinated universal time (UTC). + + + + + Gets the current time. + + The current time. + + + Gets the current time. + + + + + + Send an e-mail when a specific logging event occurs, typically on errors + or fatal errors. + + + + The number of logging events delivered in this e-mail depend on + the value of option. The + keeps only the last + logging events in its + cyclic buffer. This keeps memory requirements at a reasonable level while + still delivering useful application context. + + + Authentication is supported by setting the property to + either or . + If using authentication then the + and properties must also be set. + + + To set the SMTP server port use the property. The default port is 25. + + + Nicko Cadell + Gert Driesen + + + + Default constructor + + + + Default constructor + + + + + + Gets or sets a comma-delimited list of recipient e-mail addresses. + + + + + Gets or sets a comma-delimited list of recipient e-mail addresses + that will be carbon copied. + + + + + Gets or sets a semicolon-delimited list of recipient e-mail addresses + that will be blind carbon copied. + + + A semicolon-delimited list of e-mail addresses. + + + + A semicolon-delimited list of recipient e-mail addresses. + + + + + + Gets or sets the e-mail address of the sender. + + + The e-mail address of the sender. + + + + The e-mail address of the sender. + + + + + + Gets or sets the subject line of the e-mail message. + + + The subject line of the e-mail message. + + + + The subject line of the e-mail message. + + + + + + Gets or sets the name of the SMTP relay mail server to use to send + the e-mail messages. + + + The name of the e-mail relay server. If SmtpServer is not set, the + name of the local SMTP server is used. + + + + The name of the e-mail relay server. If SmtpServer is not set, the + name of the local SMTP server is used. + + + + + + The mode to use to authentication with the SMTP server + + + + Valid Authentication mode values are: , + , and . + The default value is . When using + you must specify the + and to use to authenticate. + When using the Windows credentials for the current + thread, if impersonating, or the process will be used to authenticate. + + + + + + The username to use to authenticate with the SMTP server + + + + A and must be specified when + is set to , + otherwise the username will be ignored. + + + + + + The password to use to authenticate with the SMTP server + + + + A and must be specified when + is set to , + otherwise the password will be ignored. + + + + + + The port on which the SMTP server is listening + + + + The port on which the SMTP server is listening. The default + port is 25. + + + + + + Gets or sets the priority of the e-mail message + + + One of the values. + + + + Sets the priority of the e-mails generated by this + appender. The default priority is . + + + If you are using this appender to report errors then + you may want to set the priority to . + + + + + + Enable or disable use of SSL when sending e-mail message + + + This is available on MS .NET 2.0 runtime and higher + + + + + Gets or sets the reply-to e-mail address. + + + + + Gets or sets the subject encoding to be used. + + + The default encoding is the operating system's current ANSI codepage. + + + + + Gets or sets the body encoding to be used. + + + The default encoding is the operating system's current ANSI codepage. + + + + + Sends the contents of the cyclic buffer as an e-mail message. + + The logging events to send. + + + + This appender requires a to be set. + + + + + Send the email message + + the body text to include in the mail + + + + Values for the property. + + + + SMTP authentication modes. + + + + + + No authentication + + + + + Basic authentication. + + + Requires a username and password to be supplied + + + + + Integrated authentication + + + Uses the Windows credentials from the current thread or process to authenticate. + + + + + Trims leading and trailing commas or semicolons + + + + + Send an email when a specific logging event occurs, typically on errors + or fatal errors. Rather than sending via smtp it writes a file into the + directory specified by . This allows services such + as the IIS SMTP agent to manage sending the messages. + + + + The configuration for this appender is identical to that of the SMTPAppender, + except that instead of specifying the SMTPAppender.SMTPHost you specify + . + + + The number of logging events delivered in this e-mail depend on + the value of option. The + keeps only the last + logging events in its + cyclic buffer. This keeps memory requirements at a reasonable level while + still delivering useful application context. + + + Niall Daley + Nicko Cadell + + + + Gets or sets a semicolon-delimited list of recipient e-mail addresses. + + + + + Gets or sets the e-mail address of the sender. + + + + + Gets or sets the subject line of the e-mail message. + + + + + Gets or sets the path to write the messages to. + + + + Gets or sets the path to write the messages to. This should be the same + as that used by the agent sending the messages. + + + + + + Gets or sets the file extension for the generated files + + + + + Gets or sets the used to write to the pickup directory. + + + The used to write to the pickup directory. + + + + Unless a specified here for this appender + the is queried for the + security context to use. The default behavior is to use the security context + of the current thread. + + + + + + Sends the contents of the cyclic buffer as an e-mail message. + + The logging events to send. + + + Sends the contents of the cyclic buffer as an e-mail message. + + + + + + Activate the options on this appender. + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + This appender requires a to be set. + + + + + Convert a path into a fully qualified path. + + The path to convert. + The fully qualified path. + + + Converts the path specified to a fully + qualified path. If the path is relative it is + taken as relative from the application base + directory. + + + + + + Appender that allows clients to connect via Telnet to receive log messages + + + + The TelnetAppender accepts socket connections and streams logging messages back to the client. + The output is provided in a telnet-friendly way so that a log can be monitored over a TCP/IP socket. + This allows simple remote monitoring of application logging. + + + The default is 23 (the telnet port). + + + Keith Long + Nicko Cadell + + + + The fully qualified type of the TelnetAppender class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Gets or sets the TCP port number on which this will listen for connections. + + + An integer value in the range to + indicating the TCP port number on which this will listen for connections. + + + + The default value is 23 (the telnet port). + + + The value specified is less than + or greater than . + + + + Overrides the parent method to close the socket handler + + + + Closes all the outstanding connections. + + + + + + This appender requires a to be set. + + + + + Create the socket handler and wait for connections + + + + + Writes the logging event to each connected client. + + The event to log. + + + + Helper class to manage connected clients + + + + The SocketHandler class is used to accept connections from clients. + It is threaded so that clients can connect/disconnect asynchronously. + + + + + + Class that represents a client connected to this handler + + + + + Create this for the specified + + the client's socket + + + Opens a stream writer on the socket. + + + + + + Writes a string to the client. + + string to send + + + + Cleans up the client connection. + + + + + Opens a new server port on + + the local port to listen on for connections + + + Creates a socket handler on the specified local server port. + + + + + + Sends a string message to each of the connected clients. + + the text to send + + + + Add a client to the internal clients list + + client to add + + + + Remove a client from the internal clients list + + client to remove + + + + Test if this handler has active connections + + + + + Callback used to accept a connection on the server socket + + The result of the asynchronous operation + + + On connection adds to the list of connections + if there are too many open connections you will be disconnected + + + + + + Closes all network connections + + + + + Sends logging events to a . + + + + An Appender that writes to a . + + + This appender may be used stand alone if initialized with an appropriate + writer, however it is typically used as a base class for an appender that + can open a to write to. + + + Nicko Cadell + Gert Driesen + Douglas de la Torre + + + + Gets or set whether the appender will flush at the end + of each append operation. + + + + The default behavior is to flush at the end of each + append operation. + + + If this option is set to false, then the underlying + stream can defer persisting the logging event to a later + time. + + + + Avoiding the flush operation at the end of each append results in + a performance gain of 10 to 20 percent. However, there is a safety + trade-off involved in skipping flushing. Indeed, when flushing is + skipped, then it is likely that the last few log events will not + be recorded on disk when the application exits. This is a high + price to pay even for a 20% performance gain. + + + + + Sets the where the log output will go. + + + + The specified must be open and writable. + + + The will be closed when the appender + instance is closed. + + + Note: Logging to an unopened will fail. + + + + + + This method determines if there is a sense in attempting to append. + + + + This method checks if an output target has been set and if a + layout has been set. + + + false if any of the preconditions fail. + + + + This method is called by the + method. + + The event to log. + + + Writes a log statement to the output stream if the output stream exists + and is writable. + + + The format of the output will depend on the appender's layout. + + + + + + This method is called by the + method. + + The array of events to log. + + + This method writes all the bulk logged events to the output writer + before flushing the stream. + + + + + + Close this appender instance. The underlying stream or writer is also closed. + + + Closed appenders cannot be reused. + + + + + Gets or set the and the underlying + , if any, for this appender. + + + The for this appender. + + + + + This appender requires a to be set. + + + + + Writes the footer and closes the underlying . + + + + + Closes the underlying . + + + + + Clears internal references to the underlying + and other variables. + + + + Subclasses can override this method for an alternate closing behavior. + + + + + + Writes a footer as produced by the embedded layout's property. + + + + Writes a footer as produced by the embedded layout's property. + + + + + + Writes a header produced by the embedded layout's property. + + + + Writes a header produced by the embedded layout's property. + + + + + + Called to allow a subclass to lazily initialize the writer + + + + This method is called when an event is logged and the or + have not been set. This allows a subclass to + attempt to initialize the writer multiple times. + + + + + + Gets or sets the where logging events + will be written to. + + + The where logging events are written. + + + + This is the where logging events + will be written to. + + + + + + The fully qualified type of the TextWriterAppender class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Flushes any buffered log data. + + The maximum time to wait for logging events to be flushed. + True if all logging events were flushed successfully, else false. + + + + Appends log events to the system. + + + + The application configuration file can be used to control what listeners + are actually used. See the MSDN documentation for the + class for details on configuring the + trace system. + + + Events are written using the System.Diagnostics.Trace.Write(string,string) + method. The event's logger name is the default value for the category parameter + of the Write method. + + + Compact Framework
    + The Compact Framework does not support the + class for any operation except Assert. When using the Compact Framework this + appender will write to the system rather than + the Trace system. This appender will therefore behave like the . +
    +
    + Douglas de la Torre + Nicko Cadell + Gert Driesen + Ron Grabowski +
    + + + Gets or sets a value that indicates whether the appender will + flush at the end of each write. + + + The default behavior is to flush at the end of each + write. If the option is set tofalse, then the underlying + stream can defer writing to physical medium to a later time. + + + Avoiding the flush operation at the end of each append results + in a performance gain of 10 to 20 percent. However, there is safety + trade-off involved in skipping flushing. Indeed, when flushing is + skipped, then it is likely that the last few log events will not + be recorded on disk when the application exits. This is a high + price to pay even for a 20% performance gain. + + + + + + The category parameter sent to the Trace method. + + + + Defaults to %logger which will use the logger name of the current + as the category parameter. + + + + + + Writes the logging event to the system. + + The event to log. + + + + This appender requires a to be set. + + + + + Flushes any buffered log data. + + The maximum time to wait for logging events to be flushed. + True if all logging events were flushed successfully, else false. + + + + Sends logging events as connectionless UDP datagrams to a remote host or a + multicast group using an . + + + + UDP guarantees neither that messages arrive, nor that they arrive in the correct order. + + + To view the logging results, a custom application can be developed that listens for logging + events. + + + When decoding events send via this appender remember to use the same encoding + to decode the events as was used to send the events. See the + property to specify the encoding to use. + + + + This example shows how to log receive logging events that are sent + on IP address 244.0.0.1 and port 8080 to the console. The event is + encoded in the packet as a unicode string and it is decoded as such. + + IPEndPoint remoteEndPoint = new IPEndPoint(IPAddress.Any, 0); + UdpClient udpClient; + byte[] buffer; + string loggingEvent; + + try + { + udpClient = new UdpClient(8080); + + while(true) + { + buffer = udpClient.Receive(ref remoteEndPoint); + loggingEvent = System.Text.Encoding.Unicode.GetString(buffer); + Console.WriteLine(loggingEvent); + } + } + catch(Exception e) + { + Console.WriteLine(e.ToString()); + } + + + Dim remoteEndPoint as IPEndPoint + Dim udpClient as UdpClient + Dim buffer as Byte() + Dim loggingEvent as String + + Try + remoteEndPoint = new IPEndPoint(IPAddress.Any, 0) + udpClient = new UdpClient(8080) + + While True + buffer = udpClient.Receive(ByRef remoteEndPoint) + loggingEvent = System.Text.Encoding.Unicode.GetString(buffer) + Console.WriteLine(loggingEvent) + Wend + Catch e As Exception + Console.WriteLine(e.ToString()) + End Try + + + An example configuration section to log information using this appender to the + IP 224.0.0.1 on port 8080: + + + + + + + + + + Gert Driesen + Nicko Cadell + + + + Initializes a new instance of the class. + + + The default constructor initializes all fields to their default values. + + + + + Gets or sets the IP address of the remote host or multicast group to which + the underlying should sent the logging event. + + + The IP address of the remote host or multicast group to which the logging event + will be sent. + + + + Multicast addresses are identified by IP class D addresses (in the range 224.0.0.0 to + 239.255.255.255). Multicast packets can pass across different networks through routers, so + it is possible to use multicasts in an Internet scenario as long as your network provider + supports multicasting. + + + Hosts that want to receive particular multicast messages must register their interest by joining + the multicast group. Multicast messages are not sent to networks where no host has joined + the multicast group. Class D IP addresses are used for multicast groups, to differentiate + them from normal host addresses, allowing nodes to easily detect if a message is of interest. + + + Static multicast addresses that are needed globally are assigned by IANA. A few examples are listed in the table below: + + + + + IP Address + Description + + + 224.0.0.1 + + + Sends a message to all system on the subnet. + + + + + 224.0.0.2 + + + Sends a message to all routers on the subnet. + + + + + 224.0.0.12 + + + The DHCP server answers messages on the IP address 224.0.0.12, but only on a subnet. + + + + + + + A complete list of actually reserved multicast addresses and their owners in the ranges + defined by RFC 3171 can be found at the IANA web site. + + + The address range 239.0.0.0 to 239.255.255.255 is reserved for administrative scope-relative + addresses. These addresses can be reused with other local groups. Routers are typically + configured with filters to prevent multicast traffic in this range from flowing outside + of the local network. + + + + + + Gets or sets the TCP port number of the remote host or multicast group to which + the underlying should sent the logging event. + + + An integer value in the range to + indicating the TCP port number of the remote host or multicast group to which the logging event + will be sent. + + + The underlying will send messages to this TCP port number + on the remote host or multicast group. + + The value specified is less than or greater than . + + + + Gets or sets the TCP port number from which the underlying will communicate. + + + An integer value in the range to + indicating the TCP port number from which the underlying will communicate. + + + + The underlying will bind to this port for sending messages. + + + Setting the value to 0 (the default) will cause the udp client not to bind to + a local port. + + + The value specified is less than or greater than . + + + + Gets or sets used to write the packets. + + + The used to write the packets. + + + + The used to write the packets. + + + + + + Gets or sets the underlying . + + + The underlying . + + + creates a to send logging events + over a network. Classes deriving from can use this + property to get or set this . Use the underlying + returned from if you require access beyond that which + provides. + + + + + Gets or sets the cached remote endpoint to which the logging events should be sent. + + + The method will initialize the remote endpoint + with the values of the and + properties. + + + + + Initialize the appender based on the options set. + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + The appender will be ignored if no was specified or + an invalid remote or local TCP port number was specified. + + + The required property was not specified. + The TCP port number assigned to or is less than or greater than . + + + + This method is called by the method. + + The event to log. + + + Sends the event using an UDP datagram. + + + Exceptions are passed to the . + + + + + + This appender requires a to be set. + + + + + Closes the UDP connection and releases all resources associated with + this instance. + + + + Disables the underlying and releases all managed + and unmanaged resources associated with the . + + + + + + Initializes the underlying connection. + + + + The underlying is initialized and binds to the + port number from which you intend to communicate. + + + Exceptions are passed to the . + + + + + + The TCP port number of the remote host or multicast group to + which the logging event will be sent. + + + + + The TCP port number from which the will communicate. + + + + + Assembly level attribute that specifies a repository to alias to this assembly's repository. + + + + An assembly's logger repository is defined by its , + however this can be overridden by an assembly loaded before the target assembly. + + + An assembly can alias another assembly's repository to its repository by + specifying this attribute with the name of the target repository. + + + This attribute can only be specified on the assembly and may be used + as many times as necessary to alias all the required repositories. + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class with + the specified repository to alias to this assembly's repository. + + The repository to alias to this assemby's repository. + + + + Gets or sets the repository to alias to this assemby's repository. + + + + + Use this class to quickly configure a . + + + + Allows very simple programmatic configuration of log4net. + + + Only one appender can be configured using this configurator. + The appender is set at the root of the hierarchy and all logging + events will be delivered to that appender. + + + Appenders can also implement the interface. Therefore + they would require that the method + be called after the appenders properties have been configured. + + + Nicko Cadell + Gert Driesen + + + + The fully qualified type of the BasicConfigurator class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Initializes the log4net system with a default configuration. + + + + Initializes the log4net logging system using a + that will write to Console.Out. The log messages are + formatted using the layout object + with the + layout style. + + + + + + Initializes the log4net system using the specified appenders. + + The appenders to use to log all logging events. + + + Initializes the log4net system using the specified appenders. + + + + + + Initializes the with a default configuration. + + The repository to configure. + + + Initializes the specified repository using a + that will write to Console.Out. The log messages are + formatted using the layout object + with the + layout style. + + + + + + Initializes the using the specified appenders. + + The repository to configure. + The appenders to use to log all logging events. + + + Initializes the using the specified appender. + + + + + + Base class for all log4net configuration attributes. + + + This is an abstract class that must be extended by + specific configurators. This attribute allows the + configurator to be parameterized by an assembly level + attribute. + + Nicko Cadell + Gert Driesen + + + + Constructor used by subclasses. + + the ordering priority for this configurator + + + The is used to order the configurator + attributes before they are invoked. Higher priority configurators are executed + before lower priority ones. + + + + + + Configures the for the specified assembly. + + The assembly that this attribute was defined on. + The repository to configure. + + + Abstract method implemented by a subclass. When this method is called + the subclass should configure the . + + + + + + Compare this instance to another ConfiguratorAttribute + + the object to compare to + see + + + Compares the priorities of the two instances. + Sorts by priority in descending order. Objects with the same priority are + randomly ordered. + + + + + + Class to register for the log4net section of the configuration file + + + The log4net section of the configuration file needs to have a section + handler registered. This is the section handler used. It simply returns + the XML element that is the root of the section. + + + Example of registering the log4net section handler : + + + +
    + + + log4net configuration XML goes here + + + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + + Default constructor. + + + + + + Parses the configuration section. + + The configuration settings in a corresponding parent configuration section. + The configuration context when called from the ASP.NET configuration system. Otherwise, this parameter is reserved and is a null reference. + The for the log4net section. + The for the log4net section. + + + Returns the containing the configuration data, + + + + + + Assembly level attribute that specifies a plugin to attach to + the repository. + + + + Specifies the type of a plugin to create and attach to the + assembly's repository. The plugin type must implement the + interface. + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class + with the specified type. + + The type name of plugin to create. + + + Create the attribute with the plugin type specified. + + + Where possible use the constructor that takes a . + + + + + + Initializes a new instance of the class + with the specified type. + + The type of plugin to create. + + + Create the attribute with the plugin type specified. + + + + + + Gets or sets the type for the plugin. + + + + + Gets or sets the type name for the plugin. + + + + Where possible use the property instead. + + + + + + Creates the plugin object defined by this attribute. + + The plugin object. + + + + + + + Assembly level attribute that specifies the logging repository for the assembly. + + + + Assemblies are mapped to logging repository. This attribute specified + on the assembly controls + the configuration of the repository. The property specifies the name + of the repository that this assembly is a part of. The + specifies the type of the object + to create for the assembly. If this attribute is not specified or a + is not specified then the assembly will be part of the default shared logging repository. + + + This attribute can only be specified on the assembly and may only be used + once per assembly. + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + + Default constructor. + + + + + + Initialize a new instance of the class + with the name of the repository. + + The name of the repository. + + + Initialize the attribute with the name for the assembly's repository. + + + + + + Gets or sets the name of the logging repository. + + + The string name to use as the name of the repository associated with this + assembly. + + + + This value does not have to be unique. Several assemblies can share the + same repository. They will share the logging configuration of the repository. + + + + + + Gets or sets the type of repository to create for this assembly. + + + The type of repository to create for this assembly. + + + + The type of the repository to create for the assembly. + The type must implement the + interface. + + + This will be the type of repository created when + the repository is created. If multiple assemblies reference the + same repository then the repository is only created once using the + of the first assembly to call into the + repository. + + + + + + Assembly level attribute to configure the . + + the type of the provider to use + + + This attribute may only be used at the assembly scope and can only + be used once per assembly. + + + Use this attribute to configure the + without calling one of the + methods. + + + Nicko Cadell + + + + Assembly level attribute to configure the . + + the type of the provider to use + + + This attribute may only be used at the assembly scope and can only + be used once per assembly. + + + Use this attribute to configure the + without calling one of the + methods. + + + Nicko Cadell + + + + Gets or sets the type of the provider to use. + + + + The provider specified must subclass the + class. + + + + + + Configures the SecurityContextProvider + + The assembly that this attribute was defined on. + The repository to configure. + + + Creates a provider instance from the specified. + Sets this as the default security context provider . + + + + + + The fully qualified type of the SecurityContextProviderAttribute class. + + + Used by the internal logger to record the Type of the log message. + + + + + Configures a using an XML tree. + + Nicko Cadell + Gert Driesen + + + + Automatically configures the using settings + stored in the application's configuration file. + + + + Each application has a configuration file. This has the + same name as the application with '.config' appended. + This file is XML and calling this function prompts the + configurator to look in that file for a section called + log4net that contains the configuration data. + + + To use this method to configure log4net you must specify + the section + handler for the log4net configuration section. See the + for an example. + + + The repository to configure. + + + + Automatically configures the log4net system based on the + application's configuration settings. + + + + Each application has a configuration file. This has the + same name as the application with '.config' appended. + This file is XML and calling this function prompts the + configurator to look in that file for a section called + log4net that contains the configuration data. + + + To use this method to configure log4net you must specify + the section + handler for the log4net configuration section. See the + for an example. + + + + + + + Configures log4net using a log4net element + + + + Loads the log4net configuration from the XML element + supplied as . + + + The element to parse. + + + + Configures log4net using the specified configuration file. + + The XML file to load the configuration from. + + + The configuration file must be valid XML. It must contain + at least one element called log4net that holds + the log4net configuration data. + + + The log4net configuration file can possibly be specified in the application's + configuration file (either MyAppName.exe.config for a + normal application on Web.config for an ASP.NET application). + + + The first element matching <configuration> will be read as the + configuration. If this file is also a .NET .config file then you must specify + a configuration section for the log4net element otherwise .NET will + complain. Set the type for the section handler to , for example: + + +
    + + + + + The following example configures log4net using a configuration file, of which the + location is stored in the application's configuration file : + + + using log4net.Config; + using System.IO; + using System.Configuration; + + ... + + XmlConfigurator.Configure(new FileInfo(ConfigurationSettings.AppSettings["log4net-config-file"])); + + + In the .config file, the path to the log4net can be specified like this : + + + + + + + + + + + + + Configures log4net using the specified configuration URI. + + A URI to load the XML configuration from. + + + The configuration data must be valid XML. It must contain + at least one element called log4net that holds + the log4net configuration data. + + + The must support the URI scheme specified. + + + + + + Configures log4net using the specified configuration data stream. + + A stream to load the XML configuration from. + + + The configuration data must be valid XML. It must contain + at least one element called log4net that holds + the log4net configuration data. + + + Note that this method will NOT close the stream parameter. + + + + + + Configures the using the specified XML + element. + + + Loads the log4net configuration from the XML element + supplied as . + + The repository to configure. + The element to parse. + + + + Configures the using the specified configuration + file. + + The repository to configure. + The XML file to load the configuration from. + + + The configuration file must be valid XML. It must contain + at least one element called log4net that holds + the configuration data. + + + The log4net configuration file can possibly be specified in the application's + configuration file (either MyAppName.exe.config for a + normal application on Web.config for an ASP.NET application). + + + The first element matching <configuration> will be read as the + configuration. If this file is also a .NET .config file then you must specify + a configuration section for the log4net element otherwise .NET will + complain. Set the type for the section handler to , for example: + + +
    + + + + + The following example configures log4net using a configuration file, of which the + location is stored in the application's configuration file : + + + using log4net.Config; + using System.IO; + using System.Configuration; + + ... + + XmlConfigurator.Configure(new FileInfo(ConfigurationSettings.AppSettings["log4net-config-file"])); + + + In the .config file, the path to the log4net can be specified like this : + + + + + + + + + + + + + Configures the using the specified configuration + URI. + + The repository to configure. + A URI to load the XML configuration from. + + + The configuration data must be valid XML. It must contain + at least one element called log4net that holds + the configuration data. + + + The must support the URI scheme specified. + + + + + + Configures the using the specified configuration + file. + + The repository to configure. + The stream to load the XML configuration from. + + + The configuration data must be valid XML. It must contain + at least one element called log4net that holds + the configuration data. + + + Note that this method will NOT close the stream parameter. + + + + + + Configures log4net using the file specified, monitors the file for changes + and reloads the configuration if a change is detected. + + The XML file to load the configuration from. + + + The configuration file must be valid XML. It must contain + at least one element called log4net that holds + the configuration data. + + + The configuration file will be monitored using a + and depends on the behavior of that class. + + + For more information on how to configure log4net using + a separate configuration file, see . + + + + + + + Configures the using the file specified, + monitors the file for changes and reloads the configuration if a change + is detected. + + The repository to configure. + The XML file to load the configuration from. + + + The configuration file must be valid XML. It must contain + at least one element called log4net that holds + the configuration data. + + + The configuration file will be monitored using a + and depends on the behavior of that class. + + + For more information on how to configure log4net using + a separate configuration file, see . + + + + + + + Class used to watch config files. + + + + Uses the to monitor + changes to a specified file. Because multiple change notifications + may be raised when the file is modified, a timer is used to + compress the notifications into a single event. The timer + waits for time before delivering + the event notification. If any further + change notifications arrive while the timer is waiting it + is reset and waits again for to + elapse. + + + + + + Holds the FileInfo used to configure the XmlConfigurator + + + + + Holds the repository being configured. + + + + + The timer used to compress the notification events. + + + + + The default amount of time to wait after receiving notification + before reloading the config file. + + + + + Watches file for changes. This object should be disposed when no longer + needed to free system handles on the watched resources. + + + + + Initializes a new instance of the class to + watch a specified config file used to configure a repository. + + The repository to configure. + The configuration file to watch. + + + Initializes a new instance of the class. + + + + + + Event handler used by . + + The firing the event. + The argument indicates the file that caused the event to be fired. + + + This handler reloads the configuration from the file when the event is fired. + + + + + + Event handler used by . + + The firing the event. + The argument indicates the file that caused the event to be fired. + + + This handler reloads the configuration from the file when the event is fired. + + + + + + Called by the timer when the configuration has been updated. + + null + + + + Release the handles held by the watcher and timer. + + + + + Configures the specified repository using a log4net element. + + The hierarchy to configure. + The element to parse. + + + Loads the log4net configuration from the XML element + supplied as . + + + This method is ultimately called by one of the Configure methods + to load the configuration from an . + + + + + + Maps repository names to ConfigAndWatchHandler instances to allow a particular + ConfigAndWatchHandler to dispose of its FileSystemWatcher when a repository is + reconfigured. + + + + + The fully qualified type of the XmlConfigurator class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Assembly level attribute to configure the . + + + + This attribute may only be used at the assembly scope and can only + be used once per assembly. + + + Use this attribute to configure the + without calling one of the + methods. + + + If neither of the or + properties are set the configuration is loaded from the application's .config file. + If set the property takes priority over the + property. The property + specifies a path to a file to load the config from. The path is relative to the + application's base directory; . + The property is used as a postfix to the assembly file name. + The config file must be located in the application's base directory; . + For example in a console application setting the to + config has the same effect as not specifying the or + properties. + + + The property can be set to cause the + to watch the configuration file for changes. + + + + Log4net will only look for assembly level configuration attributes once. + When using the log4net assembly level attributes to control the configuration + of log4net you must ensure that the first call to any of the + methods is made from the assembly with the configuration + attributes. + + + If you cannot guarantee the order in which log4net calls will be made from + different assemblies you must use programmatic configuration instead, i.e. + call the method directly. + + + + Nicko Cadell + Gert Driesen + + + + Default constructor + + + + Default constructor + + + + + + Gets or sets the filename of the configuration file. + + + The filename of the configuration file. + + + + If specified, this is the name of the configuration file to use with + the . This file path is relative to the + application base directory (). + + + The takes priority over the . + + + + + + Gets or sets the extension of the configuration file. + + + + If specified this is the extension for the configuration file. + The path to the config file is built by using the application + base directory (), + the assembly file name and the config file extension. + + + If the is set to MyExt then + possible config file names would be: MyConsoleApp.exe.MyExt or + MyClassLibrary.dll.MyExt. + + + The takes priority over the . + + + + + + Gets or sets a value indicating whether to watch the configuration file. + + + true if the configuration should be watched, false otherwise. + + + + If this flag is specified and set to true then the framework + will watch the configuration file and will reload the config each time + the file is modified. + + + The config file can only be watched if it is loaded from local disk. + In a No-Touch (Smart Client) deployment where the application is downloaded + from a web server the config file may not reside on the local disk + and therefore it may not be able to watch it. + + + Watching configuration is not supported on the SSCLI. + + + + + + Configures the for the specified assembly. + + The assembly that this attribute was defined on. + The repository to configure. + + + Configure the repository using the . + The specified must extend the + class otherwise the will not be able to + configure it. + + + The does not extend . + + + + Attempt to load configuration from the local file system + + The assembly that this attribute was defined on. + The repository to configure. + + + + Configure the specified repository using a + + The repository to configure. + the FileInfo pointing to the config file + + + + Attempt to load configuration from a URI + + The repository to configure. + + + + The fully qualified type of the XmlConfiguratorAttribute class. + + + Used by the internal logger to record the Type of the + log message. + + + + + The default implementation of the interface. + + + + Uses attributes defined on the calling assembly to determine how to + configure the hierarchy for the repository. + + + Nicko Cadell + Gert Driesen + + + + Event to notify that a logger repository has been created. + + + Event to notify that a logger repository has been created. + + + + Event raised when a new repository is created. + The event source will be this selector. The event args will + be a which + holds the newly created . + + + + + + Creates a new repository selector. + + The type of the repositories to create, must implement + + + Create a new repository selector. + The default type for repositories must be specified, + an appropriate value would be . + + + is . + does not implement . + + + + Gets the for the specified assembly. + + The assembly use to look up the . + + + The type of the created and the repository + to create can be overridden by specifying the + attribute on the . + + + The default values are to use the + implementation of the interface and to use the + as the name of the repository. + + + The created will be automatically configured using + any attributes defined on + the . + + + The for the assembly + is . + + + + Gets the for the specified repository. + + The repository to use to look up the . + The for the specified repository. + + + Returns the named repository. If is null + a is thrown. If the repository + does not exist a is thrown. + + + Use to create a repository. + + + is . + does not exist. + + + + Creates a new repository for the assembly specified + + the assembly to use to create the repository to associate with the . + The type of repository to create, must implement . + The repository created. + + + The created will be associated with the repository + specified such that a call to with the + same assembly specified will return the same repository instance. + + + The type of the created and + the repository to create can be overridden by specifying the + attribute on the + . The default values are to use the + implementation of the + interface and to use the + as the name of the repository. + + + The created will be automatically + configured using any + attributes defined on the . + + + If a repository for the already exists + that repository will be returned. An error will not be raised and that + repository may be of a different type to that specified in . + Also the attribute on the + assembly may be used to override the repository type specified in + . + + + is . + + + + Creates a new repository for the assembly specified. + + the assembly to use to create the repository to associate with the . + The type of repository to create, must implement . + The name to assign to the created repository + Set to true to read and apply the assembly attributes + The repository created. + + + The created will be associated with the repository + specified such that a call to with the + same assembly specified will return the same repository instance. + + + The type of the created and + the repository to create can be overridden by specifying the + attribute on the + . The default values are to use the + implementation of the + interface and to use the + as the name of the repository. + + + The created will be automatically + configured using any + attributes defined on the . + + + If a repository for the already exists + that repository will be returned. An error will not be raised and that + repository may be of a different type to that specified in . + Also the attribute on the + assembly may be used to override the repository type specified in + . + + + is . + + + + Creates a new repository for the specified repository. + + The repository to associate with the . + The type of repository to create, must implement . + If this param is then the default repository type is used. + The new repository. + + + The created will be associated with the repository + specified such that a call to with the + same repository specified will return the same repository instance. + + + is . + already exists. + + + + Test if a named repository exists + + the named repository to check + true if the repository exists + + + Test if a named repository exists. Use + to create a new repository and to retrieve + a repository. + + + + + + Gets a list of objects + + an array of all known objects + + + Gets an array of all repositories created by this selector. + + + + + + Aliases a repository to an existing repository. + + The repository to alias. + The repository that the repository is aliased to. + + + The repository specified will be aliased to the repository when created. + The repository must not already exist. + + + When the repository is created it must utilize the same repository type as + the repository it is aliased to, otherwise the aliasing will fail. + + + + is . + -or- + is . + + + + + Notifies the registered listeners that the repository has been created. + + The repository that has been created. + + + Raises the event. + + + + + + Gets the repository name and repository type for the specified assembly. + + The assembly that has a . + in/out param to hold the repository name to use for the assembly, caller should set this to the default value before calling. + in/out param to hold the type of the repository to create for the assembly, caller should set this to the default value before calling. + is . + + + + Configures the repository using information from the assembly. + + The assembly containing + attributes which define the configuration for the repository. + The repository to configure. + + is . + -or- + is . + + + + + Loads the attribute defined plugins on the assembly. + + The assembly that contains the attributes. + The repository to add the plugins to. + + is . + -or- + is . + + + + + Loads the attribute defined aliases on the assembly. + + The assembly that contains the attributes. + The repository to alias to. + + is . + -or- + is . + + + + + The fully qualified type of the DefaultRepositorySelector class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Defined error codes that can be passed to the method. + + + + Values passed to the method. + + + Nicko Cadell + + + + A general error + + + + + Error while writing output + + + + + Failed to flush file + + + + + Failed to close file + + + + + Unable to open output file + + + + + No layout specified + + + + + Failed to parse address + + + + + An evaluator that triggers on an Exception type + + + + This evaluator will trigger if the type of the Exception + passed to + is equal to a Type in . /// + + + Drew Schaeffer + + + + Default ctor to allow dynamic creation through a configurator. + + + + + Constructs an evaluator and initializes to trigger on + + the type that triggers this evaluator. + If true, this evaluator will trigger on subclasses of . + + + + The type that triggers this evaluator. + + + + + If true, this evaluator will trigger on subclasses of . + + + + + Is this the triggering event? + + The event to check + This method returns true, if the logging event Exception + Type is . + Otherwise it returns false + + + This evaluator will trigger if the Exception Type of the event + passed to + is . + + + + + + Flags passed to the property + + Nicko Cadell + + + + Fix the MDC + + + + + Fix the NDC + + + + + Fix the rendered message + + + + + Fix the thread name + + + + + Fix the callers location information + + + CAUTION: Very slow to generate + + + + + Fix the callers windows user name + + + CAUTION: Slow to generate + + + + + Fix the domain friendly name + + + + + Fix the callers principal name + + + CAUTION: May be slow to generate + + + + + Fix the exception text + + + + + Fix the event properties. Active properties must implement in order to be eligible for fixing. + + + + + No fields fixed + + + + + All fields fixed + + + + + Partial fields fixed + + + + This set of partial fields gives good performance. The following fields are fixed: + + + + + + + + + + + + + Interface for attaching appenders to objects. + + + + Interface for attaching, removing and retrieving appenders. + + + Nicko Cadell + Gert Driesen + + + + Attaches an appender. + + The appender to add. + + + Add the specified appender. The implementation may + choose to allow or deny duplicate appenders. + + + + + + Gets all attached appenders. + + + A collection of attached appenders. + + + + Gets a collection of attached appenders. + If there are no attached appenders the + implementation should return an empty + collection rather than null. + + + + + + Gets an attached appender with the specified name. + + The name of the appender to get. + + The appender with the name specified, or null if no appender with the + specified name is found. + + + + Returns an attached appender with the specified. + If no appender with the specified name is found null will be + returned. + + + + + + Removes all attached appenders. + + + + Removes and closes all attached appenders + + + + + + Removes the specified appender from the list of attached appenders. + + The appender to remove. + The appender removed from the list + + + The appender removed is not closed. + If you are discarding the appender you must call + on the appender removed. + + + + + + Removes the appender with the specified name from the list of appenders. + + The name of the appender to remove. + The appender removed from the list + + + The appender removed is not closed. + If you are discarding the appender you must call + on the appender removed. + + + + + + Appenders may delegate their error handling to an . + + + + Error handling is a particularly tedious to get right because by + definition errors are hard to predict and to reproduce. + + + Nicko Cadell + Gert Driesen + + + + Handles the error and information about the error condition is passed as + a parameter. + + The message associated with the error. + The that was thrown when the error occurred. + The error code associated with the error. + + + Handles the error and information about the error condition is passed as + a parameter. + + + + + + Prints the error message passed as a parameter. + + The message associated with the error. + The that was thrown when the error occurred. + + + See . + + + + + + Prints the error message passed as a parameter. + + The message associated with the error. + + + See . + + + + + + Interface for objects that require fixing. + + + + Interface that indicates that the object requires fixing before it + can be taken outside the context of the appender's + method. + + + When objects that implement this interface are stored + in the context properties maps + and + are fixed + (see ) the + method will be called. + + + Nicko Cadell + + + + Get a portable version of this object + + the portable instance of this object + + + Get a portable instance object that represents the current + state of this object. The portable object can be stored + and logged from any thread with identical results. + + + + + + Interface that all loggers implement to support logging events and testing if a level + is enabled for logging. + + + + These methods will not throw exceptions. Note to implementers, ensure + that the implementation of these methods cannot allow an exception + to be thrown to the caller. + + + Nicko Cadell + Gert Driesen + + + + Gets the name of the logger. + + + + + Generates a logging event for the specified using + the and . + + The declaring type of the method that is + the stack boundary into the logging system for this call. + The level of the message to be logged. + The message object to log. + the exception to log, including its stack trace. Pass null to not log an exception. + + + This generic form is intended to be used by wrappers. + + + + + + Logs the specified logging event through this logger. + + The event being logged. + + + This is the most generic printing method that is intended to be used + by wrappers. + + + + + + Checks if this logger is enabled for a given passed as parameter. + + The level to check. + + true if this logger is enabled for level, otherwise false. + + + + + Gets the where this + Logger instance is attached to. + + + + + Base interface for all wrappers + + + + Base interface for all wrappers. + + + All wrappers must implement this interface. + + + Nicko Cadell + + + + Gets the object that implements this object. + + + + + + The Logger object may not be the same object as this object because of logger decorators. + This gets the actual underlying objects that is used to process the log events. + + + + + + Interface used to delay activate a configured object. + + + + This allows an object to defer activation of its options until all + options have been set. This is required for components which have + related options that remain ambiguous until all are set. + + + If a component implements this interface then the method + must be called by the container after its all the configured properties have been set + and before the component can be used. + + + Nicko Cadell + + + + Activate the options that were previously set with calls to properties. + + + + This allows an object to defer activation of its options until all + options have been set. This is required for components which have + related options that remain ambiguous until all are set. + + + If a component implements this interface then this method must be called + after its properties have been set before the component can be used. + + + + + + Delegate used to handle logger repository creation event notifications + + The which created the repository. + The event args + that holds the instance that has been created. + + + Delegate used to handle logger repository creation event notifications. + + + + + + Provides data for the event. + + the that has been created + + + A + event is raised every time a is created. + + + + + + Provides data for the event. + + the that has been created + + + A + event is raised every time a is created. + + + + + + The that has been created + + + The that has been created + + + + The that has been created + + + + + + Interface used by the to select the . + + + + The uses a + to specify the policy for selecting the correct + to return to the caller. + + + Nicko Cadell + Gert Driesen + + + + Gets the for the specified assembly. + + The assembly to use to look up to the + The for the assembly. + + + Gets the for the specified assembly. + + + How the association between and + is made is not defined. The implementation may choose any method for + this association. The results of this method must be repeatable, i.e. + when called again with the same arguments the result must be the + save value. + + + + + + Gets the named . + + The name to use to look up to the . + The named + + Lookup a named . This is the repository created by + calling . + + + + + Creates a new repository for the assembly specified. + + The assembly to use to create the domain to associate with the . + The type of repository to create, must implement . + The repository created. + + + The created will be associated with the domain + specified such that a call to with the + same assembly specified will return the same repository instance. + + + How the association between and + is made is not defined. The implementation may choose any method for + this association. + + + + + + Creates a new repository with the name specified. + + The name to associate with the . + The type of repository to create, must implement . + The repository created. + + + The created will be associated with the name + specified such that a call to with the + same name will return the same repository instance. + + + + + + Test if a named repository exists + + the named repository to check + true if the repository exists + + + Test if a named repository exists. Use + to create a new repository and to retrieve + a repository. + + + + + + Gets an array of all currently defined repositories. + + + An array of the instances created by + this . + + + Gets an array of all repositories created by this selector. + + + + + + Event to notify that a logger repository has been created. + + + Event to notify that a logger repository has been created. + + + + Event raised when a new repository is created. + The event source will be this selector. The event args will + be a which + holds the newly created . + + + + + + Test if an triggers an action + + + + Implementations of this interface allow certain appenders to decide + when to perform an appender specific action. + + + The action or behavior triggered is defined by the implementation. + + + Nicko Cadell + + + + Test if this event triggers the action + + The event to check + true if this event triggers the action, otherwise false + + + Return true if this event triggers the action + + + + + + Defines the default set of levels recognized by the system. + + + + Each has an associated . + + + Levels have a numeric that defines the relative + ordering between levels. Two Levels with the same + are deemed to be equivalent. + + + The levels that are recognized by log4net are set for each + and each repository can have different levels defined. The levels are stored + in the on the repository. Levels are + looked up by name from the . + + + When logging at level INFO the actual level used is not but + the value of LoggerRepository.LevelMap["INFO"]. The default value for this is + , but this can be changed by reconfiguring the level map. + + + Each level has a in addition to its . The + is the string that is written into the output log. By default + the display name is the same as the level name, but this can be used to alias levels + or to localize the log output. + + + Some of the predefined levels recognized by the system are: + + + + . + + + . + + + . + + + . + + + . + + + . + + + . + + + + Nicko Cadell + Gert Driesen + + + + Constructor + + Integer value for this level, higher values represent more severe levels. + The string name of this level. + The display name for this level. This may be localized or otherwise different from the name + + + Initializes a new instance of the class with + the specified level name and value. + + + + + + Constructor + + Integer value for this level, higher values represent more severe levels. + The string name of this level. + + + Initializes a new instance of the class with + the specified level name and value. + + + + + + Serialization constructor + + The that holds the serialized object data. + The that contains contextual information about the source or destination. + + + Initializes a new instance of the class + with serialized data. + + + + + + Gets the name of this level. + + + The name of this level. + + + + Gets the name of this level. + + + + + + Gets the value of this level. + + + + + Gets the display name of this level. + + + + + Returns the representation of the current + . + + + A representation of the current . + + + + Returns the level . + + + + + + + + + Compares levels. + + The object to compare against. + if the objects are equal. + + + + Returns a hash code + + A hash code for the current . + + + Returns a hash code suitable for use in hashing algorithms and data + structures like a hash table. + + + Returns the hash code of the level . + + + + + + + + + Compares this instance to a specified object and returns an + indication of their relative values. + + A instance or to compare with this instance. + + A 32-bit signed integer that indicates the relative order of the + values compared. The return value has these meanings: + + + Value + Meaning + + + Less than zero + This instance is less than . + + + Zero + This instance is equal to . + + + Greater than zero + + This instance is greater than . + -or- + is . + + + + + + + must be an instance of + or ; otherwise, an exception is thrown. + + + + + + Serializes this object into the provided. + + The to populate with data. + The destination for this serialization. + + + + Returns a value indicating whether a specified + is greater than another specified . + + A + A + + if is greater than + ; otherwise, . + + + + + Returns a value indicating whether a specified + is less than another specified . + + A + A + + if is less than + ; otherwise, . + + + + + Returns a value indicating whether a specified + is greater than or equal to another specified . + + A + A + + if is greater than or equal to + ; otherwise, . + + + + + Returns a value indicating whether a specified + is less than or equal to another specified . + + A + A + + if is less than or equal to + ; otherwise, . + + + + + Returns a value indicating whether two specified + objects have the same value. + + A or . + A or . + + if the value of is the same as the + value of ; otherwise, . + + + + + Returns a value indicating whether two specified + objects have different values. + + A or . + A or . + + if the value of is different from + the value of ; otherwise, . + + + + + Compares two specified instances. + + The first to compare. + The second to compare. + + A 32-bit signed integer that indicates the relative order of the + two values compared. The return value has these meanings: + + + Value + Meaning + + + Less than zero + is less than . + + + Zero + is equal to . + + + Greater than zero + is greater than . + + + + + + + The level designates a higher level than all the rest. + + + + + The level designates very severe error events. + System unusable, emergencies. + + + + + The level designates very severe error events. + System unusable, emergencies. + + + + + The level designates very severe error events + that will presumably lead the application to abort. + + + + + The level designates very severe error events. + Take immediate action, alerts. + + + + + The level designates very severe error events. + Critical condition, critical. + + + + + The level designates very severe error events. + + + + + The level designates error events that might + still allow the application to continue running. + + + + + The level designates potentially harmful + situations. + + + + + The level designates informational messages + that highlight the progress of the application at the highest level. + + + + + The level designates informational messages that + highlight the progress of the application at coarse-grained level. + + + + + The level designates fine-grained informational + events that are most useful to debug an application. + + + + + The level designates fine-grained informational + events that are most useful to debug an application. + + + + + The level designates fine-grained informational + events that are most useful to debug an application. + + + + + The level designates fine-grained informational + events that are most useful to debug an application. + + + + + The level designates fine-grained informational + events that are most useful to debug an application. + + + + + The level designates fine-grained informational + events that are most useful to debug an application. + + + + + The level designates the lowest level possible. + + + + + A strongly-typed collection of objects. + + Nicko Cadell + + + + Supports type-safe iteration over a . + + + + + Gets the current element in the collection. + + + + + Advances the enumerator to the next element in the collection. + + + true if the enumerator was successfully advanced to the next element; + false if the enumerator has passed the end of the collection. + + + The collection was modified after the enumerator was created. + + + + + Sets the enumerator to its initial position, before the first element in the collection. + + + + + Creates a read-only wrapper for a LevelCollection instance. + + list to create a readonly wrapper arround + + A LevelCollection wrapper that is read-only. + + + + + Initializes a new instance of the LevelCollection class + that is empty and has the default initial capacity. + + + + + Initializes a new instance of the LevelCollection class + that has the specified initial capacity. + + + The number of elements that the new LevelCollection is initially capable of storing. + + + + + Initializes a new instance of the LevelCollection class + that contains elements copied from the specified LevelCollection. + + The LevelCollection whose elements are copied to the new collection. + + + + Initializes a new instance of the LevelCollection class + that contains elements copied from the specified array. + + The array whose elements are copied to the new list. + + + + Initializes a new instance of the LevelCollection class + that contains elements copied from the specified collection. + + The collection whose elements are copied to the new list. + + + + Initializes a new instance of the LevelCollection class + that contains elements copied from the specified collection. + + The collection whose elements are copied to the new list. + + + + Type visible only to our subclasses + Used to access protected constructor + + + + + A value + + + + + Allow subclasses to avoid our default constructors + + + + + Gets the number of elements actually contained in the LevelCollection. + + + + + Copies the entire LevelCollection to a one-dimensional + array. + + The one-dimensional array to copy to. + + + + Copies the entire LevelCollection to a one-dimensional + array, starting at the specified index of the target array. + + The one-dimensional array to copy to. + The zero-based index in at which copying begins. + + + + Gets a value indicating whether access to the collection is synchronized (thread-safe). + + false, because the backing type is an array, which is never thread-safe. + + + + Gets an object that can be used to synchronize access to the collection. + + + + + Gets or sets the at the specified index. + + The zero-based index of the element to get or set. + + is less than zero + -or- + is equal to or greater than . + + + + + Adds a to the end of the LevelCollection. + + The to be added to the end of the LevelCollection. + The index at which the value has been added. + + + + Removes all elements from the LevelCollection. + + + + + Creates a shallow copy of the . + + A new with a shallow copy of the collection data. + + + + Determines whether a given is in the LevelCollection. + + The to check for. + true if is found in the LevelCollection; otherwise, false. + + + + Returns the zero-based index of the first occurrence of a + in the LevelCollection. + + The to locate in the LevelCollection. + + The zero-based index of the first occurrence of + in the entire LevelCollection, if found; otherwise, -1. + + + + + Inserts an element into the LevelCollection at the specified index. + + The zero-based index at which should be inserted. + The to insert. + + is less than zero + -or- + is equal to or greater than . + + + + + Removes the first occurrence of a specific from the LevelCollection. + + The to remove from the LevelCollection. + + The specified was not found in the LevelCollection. + + + + + Removes the element at the specified index of the LevelCollection. + + The zero-based index of the element to remove. + + is less than zero + -or- + is equal to or greater than . + + + + + Gets a value indicating whether the collection has a fixed size. + + true if the collection has a fixed size; otherwise, false. The default is false + + + + Gets a value indicating whether the IList is read-only. + + true if the collection is read-only; otherwise, false. The default is false + + + + Returns an enumerator that can iterate through the LevelCollection. + + An for the entire LevelCollection. + + + + Gets or sets the number of elements the LevelCollection can contain. + + + + + Adds the elements of another LevelCollection to the current LevelCollection. + + The LevelCollection whose elements should be added to the end of the current LevelCollection. + The new of the LevelCollection. + + + + Adds the elements of a array to the current LevelCollection. + + The array whose elements should be added to the end of the LevelCollection. + The new of the LevelCollection. + + + + Adds the elements of a collection to the current LevelCollection. + + The collection whose elements should be added to the end of the LevelCollection. + The new of the LevelCollection. + + + + Sets the capacity to the actual number of elements. + + + + + is less than zero + -or- + is equal to or greater than . + + + + + is less than zero + -or- + is equal to or greater than . + + + + + Supports simple iteration over a . + + + + + Initializes a new instance of the Enumerator class. + + + + + + Gets the current element in the collection. + + + + + Advances the enumerator to the next element in the collection. + + + true if the enumerator was successfully advanced to the next element; + false if the enumerator has passed the end of the collection. + + + The collection was modified after the enumerator was created. + + + + + Sets the enumerator to its initial position, before the first element in the collection. + + + + + An evaluator that triggers at a threshold level + + the threshold to trigger at + + + This evaluator will trigger if the level of the event + passed to + is equal to or greater than the + level. + + + Nicko Cadell + + + + An evaluator that triggers at a threshold level + + the threshold to trigger at + + + This evaluator will trigger if the level of the event + passed to + is equal to or greater than the + level. + + + Nicko Cadell + + + + Create a new evaluator using the threshold. + + + + This evaluator will trigger if the level of the event + passed to + is equal to or greater than the + level. + + + + + + the threshold to trigger at + + + The that will cause this evaluator to trigger + + + + This evaluator will trigger if the level of the event + passed to + is equal to or greater than the + level. + + + + + + Is this the triggering event? + + The event to check + This method returns true, if the event level + is equal or higher than the . + Otherwise it returns false + + + + Maps between string name and Level object. + + + + This mapping is held separately for each . + The level name is case-insensitive. + + + Nicko Cadell + + + + Mapping from level name to Level object. The + level name is case-insensitive + + + + + Clear the internal maps of all levels + + + + Clear the internal maps of all levels + + + + + + Looks up a by name + + The name of the Level to look up. + A Level from the map with the name specified, or null if none is found. + + + + Creates a new Level and adds it to the map. + + the string to display for the Level + the level value to give to the Level + + + + + Creates a new Level and adds it to the map. + + the string to display for the Level + the level value to give to the Level + the display name to give to the Level + + + + Adds a Level to the map. + + the Level to add + + + + Gets all possible levels as a collection of Level objects. + + + + + Looks up a named level from the map. + + + The name of the level to look up is taken from this level. + If the level is not set in the map then this level is added. + If no level with the specified name is found then the + argument is added to the level map + and returned. + + the level in the map with the name specified + + + + The internal representation of caller location information. + + + + This class uses the System.Diagnostics.StackTrace class to generate + a call stack. The caller's information is then extracted from this stack. + + + The System.Diagnostics.StackTrace class is not supported on the + .NET Compact Framework 1.0 therefore caller location information is not + available on that framework. + + + The System.Diagnostics.StackTrace class has this to say about Release builds: + + + "StackTrace information will be most informative with Debug build configurations. + By default, Debug builds include debug symbols, while Release builds do not. The + debug symbols contain most of the file, method name, line number, and column + information used in constructing StackFrame and StackTrace objects. StackTrace + might not report as many method calls as expected, due to code transformations + that occur during optimization." + + + This means that in a Release build the caller information may be incomplete or may + not exist at all! Therefore caller location information cannot be relied upon in a Release build. + + + Nicko Cadell + Gert Driesen + + + + Constructor + + The declaring type of the method that is + the stack boundary into the logging system for this call. + + + Initializes a new instance of the + class based on the current thread. + + + + + + Constructor + + The fully qualified class name. + The method name. + The file name. + The line number of the method within the file. + + + Initializes a new instance of the + class with the specified data. + + + + + + Serialization constructor + + The that holds the serialized object data. + The that contains contextual information about the source or destination. + + + Initializes a new instance of the class + with serialized data. + + + + + + Gets the fully qualified class name of the caller making the logging + request. + + + + + Gets the file name of the caller. + + + + + Gets the line number of the caller. + + + + + Gets the method name of the caller. + + + + + Gets all available caller information + + + All available caller information, in the format + fully.qualified.classname.of.caller.methodName(Filename:line) + + + + + Gets the stack frames from the stack trace of the caller making the log request + + + + + Serializes this object into the provided. + + The to populate with data. + The destination for this serialization. + + + + The fully qualified type of the LocationInfo class. + + + Used by the internal logger to record the Type of the + log message. + + + + + When location information is not available the constant + NA is returned. Current value of this string + constant is ?. + + + + + Exception base type for log4net. + + + + This type extends . It + does not add any new functionality but does differentiate the + type of exception being thrown. + + + Nicko Cadell + Gert Driesen + + + + Constructor + + + + Initializes a new instance of the class. + + + + + + Constructor + + A message to include with the exception. + + + Initializes a new instance of the class with + the specified message. + + + + + + Constructor + + A message to include with the exception. + A nested exception to include. + + + Initializes a new instance of the class + with the specified message and inner exception. + + + + + + Serialization constructor + + The that holds the serialized object data about the exception being thrown. + The that contains contextual information about the source or destination. + + + Initializes a new instance of the class + with serialized data. + + + + + + Static manager that controls the creation of repositories + + + + Static manager that controls the creation of repositories + + + This class is used by the wrapper managers (e.g. ) + to provide access to the objects. + + + This manager also holds the that is used to + lookup and create repositories. The selector can be set either programmatically using + the property, or by setting the log4net.RepositorySelector + AppSetting in the applications config file to the fully qualified type name of the + selector to use. + + + Nicko Cadell + Gert Driesen + + + + Hook the shutdown event + + + + On the full .NET runtime, the static constructor hooks up the + AppDomain.ProcessExit and AppDomain.DomainUnload> events. + These are used to shut down the log4net system as the application exits. + + + + + + Register for ProcessExit and DomainUnload events on the AppDomain + + + + This needs to be in a separate method because the events make + a LinkDemand for the ControlAppDomain SecurityPermission. Because + this is a LinkDemand it is demanded at JIT time. Therefore we cannot + catch the exception in the method itself, we have to catch it in the + caller. + + + + + + Return the default instance. + + the repository to lookup in + Return the default instance + + + Gets the for the repository specified + by the argument. + + + + + + Returns the default instance. + + The assembly to use to look up the repository. + The default instance. + + + Returns the default instance. + + + + + + Returns the named logger if it exists. + + The repository to lookup in. + The fully qualified logger name to look for. + + The logger found, or null if the named logger does not exist in the + specified repository. + + + + If the named logger exists (in the specified repository) then it + returns a reference to the logger, otherwise it returns + null. + + + + + + Returns the named logger if it exists. + + The assembly to use to look up the repository. + The fully qualified logger name to look for. + + The logger found, or null if the named logger does not exist in the + specified assembly's repository. + + + + If the named logger exists (in the specified assembly's repository) then it + returns a reference to the logger, otherwise it returns + null. + + + + + + Returns all the currently defined loggers in the specified repository. + + The repository to lookup in. + All the defined loggers. + + + The root logger is not included in the returned array. + + + + + + Returns all the currently defined loggers in the specified assembly's repository. + + The assembly to use to look up the repository. + All the defined loggers. + + + The root logger is not included in the returned array. + + + + + + Retrieves or creates a named logger. + + The repository to lookup in. + The name of the logger to retrieve. + The logger with the name specified. + + + Retrieves a logger named as the + parameter. If the named logger already exists, then the + existing instance will be returned. Otherwise, a new instance is + created. + + + By default, loggers do not have a set level but inherit + it from the hierarchy. This is one of the central features of + log4net. + + + + + + Retrieves or creates a named logger. + + The assembly to use to look up the repository. + The name of the logger to retrieve. + The logger with the name specified. + + + Retrieves a logger named as the + parameter. If the named logger already exists, then the + existing instance will be returned. Otherwise, a new instance is + created. + + + By default, loggers do not have a set level but inherit + it from the hierarchy. This is one of the central features of + log4net. + + + + + + Shorthand for . + + The repository to lookup in. + The of which the fullname will be used as the name of the logger to retrieve. + The logger with the name specified. + + + Gets the logger for the fully qualified name of the type specified. + + + + + + Shorthand for . + + the assembly to use to look up the repository + The of which the fullname will be used as the name of the logger to retrieve. + The logger with the name specified. + + + Gets the logger for the fully qualified name of the type specified. + + + + + + Shuts down the log4net system. + + + + Calling this method will safely close and remove all + appenders in all the loggers including root contained in all the + default repositories. + + + Some appenders need to be closed before the application exists. + Otherwise, pending logging events might be lost. + + + The shutdown method is careful to close nested + appenders before closing regular appenders. This allows + configurations where a regular appender is attached to a logger + and again to a nested appender. + + + + + + Shuts down the repository for the repository specified. + + The repository to shut down. + + + Calling this method will safely close and remove all + appenders in all the loggers including root contained in the + repository for the specified. + + + Some appenders need to be closed before the application exists. + Otherwise, pending logging events might be lost. + + + The shutdown method is careful to close nested + appenders before closing regular appenders. This allows + configurations where a regular appender is attached to a logger + and again to a nested appender. + + + + + + Shuts down the repository for the repository specified. + + The assembly to use to look up the repository. + + + Calling this method will safely close and remove all + appenders in all the loggers including root contained in the + repository for the repository. The repository is looked up using + the specified. + + + Some appenders need to be closed before the application exists. + Otherwise, pending logging events might be lost. + + + The shutdown method is careful to close nested + appenders before closing regular appenders. This allows + configurations where a regular appender is attached to a logger + and again to a nested appender. + + + + + + Resets all values contained in this repository instance to their defaults. + + The repository to reset. + + + Resets all values contained in the repository instance to their + defaults. This removes all appenders from all loggers, sets + the level of all non-root loggers to null, + sets their additivity flag to true and sets the level + of the root logger to . Moreover, + message disabling is set its default "off" value. + + + + + + Resets all values contained in this repository instance to their defaults. + + The assembly to use to look up the repository to reset. + + + Resets all values contained in the repository instance to their + defaults. This removes all appenders from all loggers, sets + the level of all non-root loggers to null, + sets their additivity flag to true and sets the level + of the root logger to . Moreover, + message disabling is set its default "off" value. + + + + + + Creates a repository with the specified name. + + The name of the repository, this must be unique amongst repositories. + The created for the repository. + + + Creates the default type of which is a + object. + + + The name must be unique. Repositories cannot be redefined. + An will be thrown if the repository already exists. + + + The specified repository already exists. + + + + Creates a repository with the specified name and repository type. + + The name of the repository, this must be unique to the repository. + A that implements + and has a no arg constructor. An instance of this type will be created to act + as the for the repository specified. + The created for the repository. + + + The name must be unique. Repositories cannot be redefined. + An Exception will be thrown if the repository already exists. + + + The specified repository already exists. + + + + Creates a repository for the specified assembly and repository type. + + The assembly to use to get the name of the repository. + A that implements + and has a no arg constructor. An instance of this type will be created to act + as the for the repository specified. + The created for the repository. + + + The created will be associated with the repository + specified such that a call to with the + same assembly specified will return the same repository instance. + + + + + + Gets an array of all currently defined repositories. + + An array of all the known objects. + + + Gets an array of all currently defined repositories. + + + + + + Gets or sets the repository selector used by the . + + + The repository selector used by the . + + + + The repository selector () is used by + the to create and select repositories + (). + + + The caller to supplies either a string name + or an assembly (if not supplied the assembly is inferred using + ). + + + This context is used by the selector to look up a specific repository. + + + + + + Internal method to get pertinent version info. + + A string of version info. + + + + Called when the event fires + + the that is exiting + null + + + Called when the event fires. + + + When the event is triggered the log4net system is . + + + + + + Called when the event fires + + the that is exiting + null + + + Called when the event fires. + + + When the event is triggered the log4net system is . + + + + + + The fully qualified type of the LoggerManager class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Implementation of the interface. + + The logger to wrap. + + + This class should be used as the base for all wrapper implementations. + + + Nicko Cadell + Gert Driesen + + + + Implementation of the interface. + + The logger to wrap. + + + This class should be used as the base for all wrapper implementations. + + + Nicko Cadell + Gert Driesen + + + + Gets the implementation behind this wrapper object. + + + The object that this object is implementing. + + + + The Logger object may not be the same object as this object + because of logger decorators. + + + This gets the actual underlying objects that is used to process + the log events. + + + + + + Portable data structure used by + + Nicko Cadell + + + + The logger name. + + + + + Level of logging event. + + + + A null level produces varying results depending on the appenders in use. + In many cases it is equivalent of , other times + it is mapped to Debug or Info defaults. + + + Level cannot be Serializable because it is a flyweight. + Due to its special serialization it cannot be declared final either. + + + + + + The application supplied message. + + + + + Gets or sets the name of the thread in which this logging event was generated. + + + + + Gets or sets the UTC time the event was logged. + + + + + Location information for the caller. + + + + Location information for the caller. + + + + + + String representation of the user + + + + String representation of the user's windows name, like DOMAIN\username + + + + + + String representation of the identity. + + + + String representation of the current thread's principal identity. + + + + + + The string representation of the exception + + + + The string representation of the exception + + + + + + String representation of the AppDomain. + + + + String representation of the AppDomain. + + + + + + Additional event specific properties + + + + A logger or an appender may attach additional + properties to specific events. These properties + have a string key and an object value. + + + + + + The internal representation of logging events. + + + + When an affirmative decision is made to log then a + instance is created. This instance + is passed around to the different log4net components. + + + This class is of concern to those wishing to extend log4net. + + + Some of the values in instances of + are considered volatile, that is the values are correct at the + time the event is delivered to appenders, but will not be consistent + at any time afterward. If an event is to be stored and then processed + at a later time these volatile values must be fixed by setting + . There is a performance penalty + for incurred by calling but it + is essential to maintain data consistency. + + + Nicko Cadell + Gert Driesen + Douglas de la Torre + Daniel Cazzulino + + + + Initializes a new instance of the class + from the supplied parameters. + + The declaring type of the method that is + the stack boundary into the logging system for this call. + The repository this event is logged in. + The name of the logger of this event. + + The level of this event. + A null level produces varying results depending on the appenders in use. + In many cases it is equivalent of , other times + it is mapped to Debug or Info defaults. + + The message of this event. + The exception for this event. + + + Except , and , + all fields of are lazily filled when actually needed. Set + to cache all data locally to prevent inconsistencies. + + This method is called by the log4net framework + to create a logging event. + + + + + + Initializes a new instance of the class + using specific data. + + The declaring type of the method that is + the stack boundary into the logging system for this call. + The repository this event is logged in. + Data used to initialize the logging event. + The fields in the struct that have already been fixed. + + + This constructor is provided to allow a + to be created independently of the log4net framework. This can + be useful if you require a custom serialization scheme. + + + Use the method to obtain an + instance of the class. + + + The parameter should be used to specify which fields in the + struct have been preset. Fields not specified in the + will be captured from the environment if requested or fixed. + + + + + + Initializes a new instance of the class + using specific data. + + The declaring type of the method that is + the stack boundary into the logging system for this call. + The repository this event is logged in. + Data used to initialize the logging event. + + + This constructor is provided to allow a + to be created independently of the log4net framework. This can + be useful if you require a custom serialization scheme. + + + Use the method to obtain an + instance of the class. + + + This constructor sets this objects flags to , + this assumes that all the data relating to this event is passed in via the + parameter and no other data should be captured from the environment. + + + + + + Initializes a new instance of the class + using specific data. + + Data used to initialize the logging event. + + + This constructor is provided to allow a + to be created independently of the log4net framework. This can + be useful if you require a custom serialization scheme. + + + Use the method to obtain an + instance of the class. + + + This constructor sets this objects flags to , + this assumes that all the data relating to this event is passed in via the + parameter and no other data should be captured from the environment. + + + + + + Initializes a new instance of the class. + + + + This constructor is provided to allow deserialization using System.Text.Json + or Newtonsoft.Json. + + + Use the method to obtain an + instance of the class. + + + This constructor sets this objects flags to . + + + + + + Serialization constructor + + The that holds the serialized object data. + The that contains contextual information about the source or destination. + + + Initializes a new instance of the class + with serialized data. + + + + + + Gets the time when the current process started. + + + This is the time when this process started. + + + + The TimeStamp is stored internally in UTC and converted to the local time zone for this computer. + + + Tries to get the start time for the current process. + Failing that it returns the time of the first call to + this property. + + + Note that AppDomains may be loaded and unloaded within the + same process without the process terminating and therefore + without the process start time being reset. + + + + + + Gets the UTC time when the current process started. + + + This is the UTC time when this process started. + + + + Tries to get the start time for the current process. + Failing that it returns the time of the first call to + this property. + + + Note that AppDomains may be loaded and unloaded within the + same process without the process terminating and therefore + without the process start time being reset. + + + + + + Gets the of the logging event. + A null level produces varying results depending on the appenders in use. + In many cases it is equivalent of , other times + it is mapped to Debug or Info defaults. + + + + + Gets the time of the logging event. + + + The time of the logging event. + + + + The TimeStamp is stored in UTC and converted to the local time zone for this computer. + + + + + + Gets UTC the time of the logging event. + + + The UTC time of the logging event. + + + + + Gets the name of the logger that logged the event. + + + + + Gets the location information for this logging event. + + + + The collected information is cached for future use. + + + See the class for more information on + supported frameworks and the different behavior in Debug and + Release builds. + + + + + + Gets the message object used to initialize this event. + + + The message object used to initialize this event. + + + + Gets the message object used to initialize this event. + Note that this event may not have a valid message object. + If the event is serialized the message object will not + be transferred. To get the text of the message the + property must be used + not this property. + + + If there is no defined message object for this event then + null will be returned. + + + + + + Gets the exception object used to initialize this event. + + + The exception object used to initialize this event. + + + + Gets the exception object used to initialize this event. + Note that this event may not have a valid exception object. + If the event is serialized the exception object will not + be transferred. To get the text of the exception the + method must be used + not this property. + + + If there is no defined exception object for this event then + null will be returned. + + + + + + The that this event was created in. + + + + The that this event was created in. + + + + + + Ensure that the repository is set. + + the value for the repository + + + + Gets the message, rendered through the . + + + The message rendered through the . + + + + The collected information is cached for future use. + + + + + + Write the rendered message to a TextWriter + + the writer to write the message to + + + Unlike the property this method + does store the message data in the internal cache. Therefore + if called only once this method should be faster than the + property, however if the message is + to be accessed multiple times then the property will be more efficient. + + + + + + Gets the name of the current thread. + + + The name of the current thread, or the thread ID when + the name is not available. + + + + The collected information is cached for future use. + + + + + + Returns a 'meaningful' name for the thread (or its Id) + + Name + Meaningful name + + + + Gets the name of the current user. + + + The name of the current user, or NOT AVAILABLE when the + underlying runtime has no support for retrieving the name of the + current user. + + + + Calls WindowsIdentity.GetCurrent().Name to get the name of + the current windows user. + + + To improve performance, we could cache the string representation of + the name, and reuse that as long as the identity stayed constant. + Once the identity changed, we would need to re-assign and re-render + the string. + + + However, the WindowsIdentity.GetCurrent() call seems to + return different objects every time, so the current implementation + doesn't do this type of caching. + + + Timing for these operations: + + + + Method + Results + + + WindowsIdentity.GetCurrent() + 10000 loops, 00:00:00.2031250 seconds + + + WindowsIdentity.GetCurrent().Name + 10000 loops, 00:00:08.0468750 seconds + + + + This means we could speed things up almost 40 times by caching the + value of the WindowsIdentity.GetCurrent().Name property, since + this takes (8.04-0.20) = 7.84375 seconds. + + + + + + Gets the identity of the current thread principal. + + + + Calls System.Threading.Thread.CurrentPrincipal.Identity.Name to get + the name of the current thread principal. + + + + + + Gets the AppDomain friendly name. + + + + + Additional event specific properties. + + + Additional event specific properties. + + + + A logger or an appender may attach additional + properties to specific events. These properties + have a string key and an object value. + + + This property is for events that have been added directly to + this event. The aggregate properties (which include these + event properties) can be retrieved using + and . + + + Once the properties have been fixed this property + returns the combined cached properties. This ensures that updates to + this property are always reflected in the underlying storage. When + returning the combined properties there may be more keys in the + Dictionary than expected. + + + + + + Gets the fixed fields in this event, or on set, fixes fields specified in the value. + + + + Fields will not be fixed if they have previously been fixed. + It is not possible to 'unfix' a field. + + + + + + Serializes this object into the provided. + + The to populate with data. + The destination for this serialization. + + + The data in this event must be fixed before it can be serialized. + + + The property must be set during the + method call if this event + is to be used outside that method. + + + + + + Gets the portable data for this . + + The for this event. + + + A new can be constructed using a + instance. + + + Does a fix of the data + in the logging event before returning the event data. + + + + + + Gets the portable data for this . + + The set of data to ensure is fixed in the LoggingEventData + The for this event. + + + A new can be constructed using a + instance. + + + + + + Returns this event's exception's rendered using the + . + + + This event's exception's rendered using the . + + + + Returns this event's exception's rendered using the + . + + + + + + Fix the fields specified by the parameter + + the fields to fix + + + Only fields specified in the will be fixed. + Fields will not be fixed if they have previously been fixed. + It is not possible to 'unfix' a field. + + + + + + Looks up a composite property in this event + + the key for the property to lookup + the value for the property + + + This event has composite properties that combine properties from + several different contexts in the following order: + + + this event's properties + + This event has that can be set. These + properties are specific to this event only. + + + + the thread properties + + The that are set on the current + thread. These properties are shared by all events logged on this thread. + + + + the global properties + + The that are set globally. These + properties are shared by all the threads in the AppDomain. + + + + + + + + + Get all the composite properties in this event + + the containing all the properties + + + See for details of the composite properties + stored by the event. + + + This method returns a single containing all the + properties defined for this event. + + + + + + The internal logging event data. + + + + + Location information for the caller. + + + + + The internal logging event data. + + + + + The internal logging event data. + + + + + The fully qualified Type of the calling + logger class in the stack frame (i.e. the declaring type of the method). + + + + + The fix state for this event + + + These flags indicate which fields have been fixed. + Not serialized. + + + + + Indicated that the internal cache is updateable (ie not fixed) + + + This is a separate flag to fixFlags as it allows incremental fixing and simpler + changes in the caching strategy. + + + + + The key into the Properties map for the host name value. + + + + + The key into the Properties map for the thread identity value. + + + + + The key into the Properties map for the user name value. + + + + + Implementation of wrapper interface. + + + + This implementation of the interface + forwards to the held by the base class. + + + This logger has methods to allow the caller to log at the following + levels: + + + + DEBUG + + The and methods log messages + at the DEBUG level. That is the level with that name defined in the + repositories . The default value + for this level is . The + property tests if this level is enabled for logging. + + + + INFO + + The and methods log messages + at the INFO level. That is the level with that name defined in the + repositories . The default value + for this level is . The + property tests if this level is enabled for logging. + + + + WARN + + The and methods log messages + at the WARN level. That is the level with that name defined in the + repositories . The default value + for this level is . The + property tests if this level is enabled for logging. + + + + ERROR + + The and methods log messages + at the ERROR level. That is the level with that name defined in the + repositories . The default value + for this level is . The + property tests if this level is enabled for logging. + + + + FATAL + + The and methods log messages + at the FATAL level. That is the level with that name defined in the + repositories . The default value + for this level is . The + property tests if this level is enabled for logging. + + + + + The values for these levels and their semantic meanings can be changed by + configuring the for the repository. + + + Nicko Cadell + Gert Driesen + + + + Construct a new wrapper for the specified logger. + + The logger to wrap. + + + Construct a new wrapper for the specified logger. + + + + + + Virtual method called when the configuration of the repository changes + + the repository holding the levels + + + Virtual method called when the configuration of the repository changes + + + + + + Logs a message object with the DEBUG level. + + The message object to log. + + + This method first checks if this logger is DEBUG + enabled by comparing the level of this logger with the + DEBUG level. If this logger is + DEBUG enabled, then it converts the message object + (passed as parameter) to a string by invoking the appropriate + . It then + proceeds to call all the registered appenders in this logger + and also higher in the hierarchy depending on the value of the + additivity flag. + + + WARNING Note that passing an + to this method will print the name of the + but no stack trace. To print a stack trace use the + form instead. + + + + + + Logs a message object with the DEBUG level + + The message object to log. + The exception to log, including its stack trace. + + + Logs a message object with the DEBUG level including + the stack trace of the passed + as a parameter. + + + See the form for more detailed information. + + + + + + + Logs a formatted message string with the DEBUG level. + + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the DEBUG level. + + A String containing zero or more format items + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the DEBUG level. + + A String containing zero or more format items + An Object to format + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the DEBUG level. + + A String containing zero or more format items + An Object to format + An Object to format + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the DEBUG level. + + An that supplies culture-specific formatting information + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a message object with the INFO level. + + The message object to log. + + + This method first checks if this logger is INFO + enabled by comparing the level of this logger with the + INFO level. If this logger is + INFO enabled, then it converts the message object + (passed as parameter) to a string by invoking the appropriate + . It then + proceeds to call all the registered appenders in this logger + and also higher in the hierarchy depending on the value of + the additivity flag. + + + WARNING Note that passing an + to this method will print the name of the + but no stack trace. To print a stack trace use the + form instead. + + + + + + Logs a message object with the INFO level. + + The message object to log. + The exception to log, including its stack trace. + + + Logs a message object with the INFO level including + the stack trace of the + passed as a parameter. + + + See the form for more detailed information. + + + + + + + Logs a formatted message string with the INFO level. + + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the INFO level. + + A String containing zero or more format items + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the INFO level. + + A String containing zero or more format items + An Object to format + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the INFO level. + + A String containing zero or more format items + An Object to format + An Object to format + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the INFO level. + + An that supplies culture-specific formatting information + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a message object with the WARN level. + + the message object to log + + + This method first checks if this logger is WARN + enabled by comparing the level of this logger with the + WARN level. If this logger is + WARN enabled, then it converts the message object + (passed as parameter) to a string by invoking the appropriate + . It then + proceeds to call all the registered appenders in this logger and + also higher in the hierarchy depending on the value of the + additivity flag. + + + WARNING Note that passing an to this + method will print the name of the but no + stack trace. To print a stack trace use the + form instead. + + + + + + Logs a message object with the WARN level + + The message object to log. + The exception to log, including its stack trace. + + + Logs a message object with the WARN level including + the stack trace of the + passed as a parameter. + + + See the form for more detailed information. + + + + + + + Logs a formatted message string with the WARN level. + + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the WARN level. + + A String containing zero or more format items + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the WARN level. + + A String containing zero or more format items + An Object to format + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the WARN level. + + A String containing zero or more format items + An Object to format + An Object to format + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the WARN level. + + An that supplies culture-specific formatting information + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a message object with the ERROR level. + + The message object to log. + + + This method first checks if this logger is ERROR + enabled by comparing the level of this logger with the + ERROR level. If this logger is + ERROR enabled, then it converts the message object + (passed as parameter) to a string by invoking the appropriate + . It then + proceeds to call all the registered appenders in this logger and + also higher in the hierarchy depending on the value of the + additivity flag. + + + WARNING Note that passing an to this + method will print the name of the but no + stack trace. To print a stack trace use the + form instead. + + + + + + Logs a message object with the ERROR level + + The message object to log. + The exception to log, including its stack trace. + + + Logs a message object with the ERROR level including + the stack trace of the + passed as a parameter. + + + See the form for more detailed information. + + + + + + + Logs a formatted message string with the ERROR level. + + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the ERROR level. + + A String containing zero or more format items + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the ERROR level. + + A String containing zero or more format items + An Object to format + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the ERROR level. + + A String containing zero or more format items + An Object to format + An Object to format + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the ERROR level. + + An that supplies culture-specific formatting information + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a message object with the FATAL level. + + The message object to log. + + + This method first checks if this logger is FATAL + enabled by comparing the level of this logger with the + FATAL level. If this logger is + FATAL enabled, then it converts the message object + (passed as parameter) to a string by invoking the appropriate + . It then + proceeds to call all the registered appenders in this logger and + also higher in the hierarchy depending on the value of the + additivity flag. + + + WARNING Note that passing an to this + method will print the name of the but no + stack trace. To print a stack trace use the + form instead. + + + + + + Logs a message object with the FATAL level + + The message object to log. + The exception to log, including its stack trace. + + + Logs a message object with the FATAL level including + the stack trace of the + passed as a parameter. + + + See the form for more detailed information. + + + + + + + Logs a formatted message string with the FATAL level. + + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the FATAL level. + + A String containing zero or more format items + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the FATAL level. + + A String containing zero or more format items + An Object to format + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the FATAL level. + + A String containing zero or more format items + An Object to format + An Object to format + An Object to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + The string is formatted using the + format provider. To specify a localized provider use the + method. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Logs a formatted message string with the FATAL level. + + An that supplies culture-specific formatting information + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the method. See + String.Format for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + Checks if this logger is enabled for the DEBUG + level. + + + true if this logger is enabled for DEBUG events, + false otherwise. + + + + This function is intended to lessen the computational cost of + disabled log debug statements. + + + For some log Logger object, when you write: + + + log.Debug("This is entry number: " + i ); + + + You incur the cost constructing the message, concatenation in + this case, regardless of whether the message is logged or not. + + + If you are worried about speed, then you should write: + + + if (log.IsDebugEnabled()) + { + log.Debug("This is entry number: " + i ); + } + + + This way you will not incur the cost of parameter + construction if debugging is disabled for log. On + the other hand, if the log is debug enabled, you + will incur the cost of evaluating whether the logger is debug + enabled twice. Once in IsDebugEnabled and once in + the Debug. This is an insignificant overhead + since evaluating a logger takes about 1% of the time it + takes to actually log. + + + + + + Checks if this logger is enabled for the INFO level. + + + true if this logger is enabled for INFO events, + false otherwise. + + + + See for more information and examples + of using this method. + + + + + + + Checks if this logger is enabled for the WARN level. + + + true if this logger is enabled for WARN events, + false otherwise. + + + + See for more information and examples + of using this method. + + + + + + + Checks if this logger is enabled for the ERROR level. + + + true if this logger is enabled for ERROR events, + false otherwise. + + + + See for more information and examples of using this method. + + + + + + + Checks if this logger is enabled for the FATAL level. + + + true if this logger is enabled for FATAL events, + false otherwise. + + + + See for more information and examples of using this method. + + + + + + + Event handler for the event + + the repository + Empty + + + + The fully qualified name of this declaring type not the type of any subclass. + + + + + Used to ensure 'params object?[]?' arguments that receive a null are converted + to an array of one null value so that 'XxxFormat("{0}", null)' will work correctly. + Overloads like 'XxxFormat(message, object? arg0)' are not matched by the compiler in this case. + + + + + provides method information without actually referencing a System.Reflection.MethodBase + as that would require that the containing assembly is loaded. + + + + + + constructs a method item for an unknown method. + + + + + constructs a method item from the name of the method. + + + + + + constructs a method item from the name of the method and its parameters. + + + + + + + constructs a method item from a method base by determining the method name and its parameters. + + + + + + Gets the method name of the caller making the logging request. + + + + + Gets the method parameters of the caller making the logging request. + + + + + The fully qualified type of the StackFrameItem class. + + + Used by the internal logger to record the Type of the + log message. + + + + + When location information is not available the constant + NA is returned. Current value of this string + constant is ?. + + + + + A SecurityContext used by log4net when interacting with protected resources + + + + A SecurityContext used by log4net when interacting with protected resources + for example with operating system services. This can be used to impersonate + a principal that has been granted privileges on the system resources. + + + Nicko Cadell + + + + Impersonate this SecurityContext + + State supplied by the caller + An instance that will + revoke the impersonation of this SecurityContext, or null + + + Impersonate this security context. Further calls on the current + thread should now be made in the security context provided + by this object. When the result + method is called the security + context of the thread should be reverted to the state it was in + before was called. + + + + + + The providers default instances. + + + + A configured component that interacts with potentially protected system + resources uses a to provide the elevated + privileges required. If the object has + been not been explicitly provided to the component then the component + will request one from this . + + + By default the is + an instance of which returns only + objects. This is a reasonable default + where the privileges required are not know by the system. + + + This default behavior can be overridden by subclassing the + and overriding the method to return + the desired objects. The default provider + can be replaced by programmatically setting the value of the + property. + + + An alternative is to use the log4net.Config.SecurityContextProviderAttribute + This attribute can be applied to an assembly in the same way as the + log4net.Config.XmlConfiguratorAttribute". The attribute takes + the type to use as the as an argument. + + + Nicko Cadell + + + + The default provider + + + + + Gets or sets the default SecurityContextProvider + + + The default SecurityContextProvider + + + + The default provider is used by configured components that + require a and have not had one + given to them. + + + By default this is an instance of + that returns objects. + + + The default provider can be set programmatically by setting + the value of this property to a sub class of + that has the desired behavior. + + + + + + Protected default constructor to allow subclassing + + + + Protected default constructor to allow subclassing + + + + + + Create a SecurityContext for a consumer + + The consumer requesting the SecurityContext + An impersonation context + + + The default implementation is to return a . + + + Subclasses should override this method to provide their own + behavior. + + + + + + Empty Interface (as replacement for ) + + + + + Empty Attribute (as replacement for ) + + + + + Provides stack frame information without actually referencing a System.Diagnostics.StackFrame + as that would require that the containing assembly is loaded. + + + + + Creates a stack frame item from a stack frame. + + + + + + Gets the fully qualified class name of the caller making the logging + request. + + + + + Gets the file name of the caller. + + + + + Gets the line number of the caller. + + + + + Gets the method name of the caller. + + + + + Gets all available caller information in the format + fully.qualified.classname.of.caller.methodName(Filename:line) + + + + + The fully qualified type of the StackFrameItem class. + + + Used by the internal logger to record the Type of the + log message. + + + + + When location information is not available the constant + NA is returned. Current value of this string + constant is ?. + + + + + An evaluator that triggers after specified number of seconds. + + + The time threshold in seconds to trigger after. + Zero means it won't trigger at all. + + + + This evaluator will trigger if the specified time period + has passed since last check. + + + Robert Sevcik + + + + An evaluator that triggers after specified number of seconds. + + + The time threshold in seconds to trigger after. + Zero means it won't trigger at all. + + + + This evaluator will trigger if the specified time period + has passed since last check. + + + Robert Sevcik + + + + The UTC time of last check. This gets updated when the object is created and when the evaluator triggers. + + + + + The default time threshold for triggering in seconds. Zero means it won't trigger at all. + + + + + Create a new evaluator using the time threshold in seconds. + + + + Create a new evaluator using the time threshold in seconds. + + + This evaluator will trigger if the specified time period + has passed since last check. + + + + + + The time threshold in seconds to trigger after + + + The time threshold in seconds to trigger after. + Zero means it won't trigger at all. + + + + This evaluator will trigger if the specified time period + has passed since last check. + + + + + + Is this the triggering event? + + The event to check + This method returns true, if the specified time period + has passed since last check.. + Otherwise it returns false + + + This evaluator will trigger if the specified time period + has passed since last check. + + + + + + Delegate used to handle creation of new wrappers. + + The logger to wrap in a wrapper. + + + Delegate used to handle creation of new wrappers. This delegate + is called from the + method to construct the wrapper for the specified logger. + + + The delegate to use is supplied to the + constructor. + + + + + + Maps between logger objects and wrapper objects. + + + + This class maintains a mapping between objects and + objects. Use the method to + look up the for the specified . + + + New wrapper instances are created by the + method. The default behavior is for this method to delegate construction + of the wrapper to the delegate supplied + to the constructor. This allows specialization of the behavior without + requiring subclassing of this type. + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the + + The handler to use to create the wrapper objects. + + + Initializes a new instance of the class with + the specified handler to create the wrapper objects. + + + + + + Gets the wrapper object for the specified logger. + + The wrapper object for the specified logger + + + If the logger is null then the corresponding wrapper is null. + + + Looks up the wrapper it has previously been requested and + returns it. If the wrapper has never been requested before then + the virtual method is + called. + + + + + + Gets the map of logger repositories. + + + Map of logger repositories. + + + + Gets the hashtable that is keyed on . The + values are hashtables keyed on with the + value being the corresponding . + + + + + + Creates the wrapper object for the specified logger. + + The logger to wrap in a wrapper. + The wrapper object for the logger. + + + This implementation uses the + passed to the constructor to create the wrapper. This method + can be overridden in a subclass. + + + + + + Called when a monitored repository shutdown event is received. + + The that is shutting down + + + This method is called when a that this + is holding loggers for has signaled its shutdown + event . The default + behavior of this method is to release the references to the loggers + and their wrappers generated for this repository. + + + + + + Event handler for repository shutdown event. + + The sender of the event. + The event args. + + + + The handler to use to create the extension wrapper objects. + + + + + Internal reference to the delegate used to register for repository shutdown events. + + + + + Formats a as "HH:mm:ss,fff". + + + + Formats a in the format "HH:mm:ss,fff" for example, "15:49:37,459". + + + Nicko Cadell + Gert Driesen + + + + Renders the date into a string. Format is "HH:mm:ss". + + The date to render into a string. + The string builder to write to. + + + Subclasses should override this method to render the date + into a string using a precision up to the second. This method + will be called at most once per second and the result will be + reused if it is needed again during the same second. + + + + + + Renders the date into a string. Format is "HH:mm:ss,fff". + + The date to render into a string. + The writer to write to. + + + Uses the method to generate the + time string up to the seconds and then appends the current + milliseconds. The results from are + cached and is called at most once + per second. + + + Subclasses should override + rather than . + + + + + + String constant used to specify AbsoluteTimeDateFormat in layouts. Current value is ABSOLUTE. + + + + + String constant used to specify DateTimeDateFormat in layouts. Current value is DATE. + + + + + String constant used to specify ISO8601DateFormat in layouts. Current value is ISO8601. + + + + + Last stored time with precision up to the second. + + + + + Last stored time with precision up to the second, formatted + as a string. + + + + + Formats a as "dd MMM yyyy HH:mm:ss,fff" + + + + Formats a in the format + "dd MMM yyyy HH:mm:ss,fff" for example, + "06 Nov 1994 15:49:37,459". + + + Nicko Cadell + Gert Driesen + Angelika Schnagl + + + + Formats the date without the milliseconds part + + The date to format. + The string builder to write to. + + + Formats a DateTime in the format "dd MMM yyyy HH:mm:ss" + for example, "06 Nov 1994 15:49:37". + + + The base class will append the ",fff" milliseconds section. + This method will only be called at most once per second. + + + + + + Render a as a string. + + + + Interface to abstract the rendering of a + instance into a string. + + + The method is used to render the + date to a text writer. + + + Nicko Cadell + Gert Driesen + + + + Formats the specified date as a string. + + The date to format. + The writer to write to. + + + Format the as a string and write it + to the provided. + + + + + + Formats the as "yyyy-MM-dd HH:mm:ss,fff". + + + + Formats the specified as a string: "yyyy-MM-dd HH:mm:ss,fff". + + + Nicko Cadell + Gert Driesen + + + + Formats the date without the milliseconds part + + The date to format. + The string builder to write to. + + + Formats the date specified as a string: "yyyy-MM-dd HH:mm:ss". + + + The base class will append the ",fff" milliseconds section. + This method will only be called at most once per second. + + + + + + Formats the using the method. + + + + Formats the using the method. + + + Nicko Cadell + Gert Driesen + The format string. + + + + Formats the using the method. + + + + Formats the using the method. + + + Nicko Cadell + Gert Driesen + The format string. + + + + Formats the date using . + + The date to convert to a string. + The writer to write to. + + + Uses the date format string supplied to the constructor to call + the method to format the date. + + + + + + This filter drops all . + + + + You can add this filter to the end of a filter chain to + switch from the default "accept all unless instructed otherwise" + filtering behavior to a "deny all unless instructed otherwise" + behavior. + + + Nicko Cadell + Gert Driesen + + + + Always returns . + + the LoggingEvent to filter + Always returns + + + Ignores the event being logged and just returns + . This can be used to change the default filter + chain behavior from to . This filter + should only be used as the last filter in the chain + as any further filters will be ignored! + + + + + + The return result from + + + + The return result from + + + + + + The log event must be dropped immediately without + consulting with the remaining filters, if any, in the chain. + + + + + This filter is neutral with respect to the log event. + The remaining filters, if any, should be consulted for a final decision. + + + + + The log event must be logged immediately without + consulting with the remaining filters, if any, in the chain. + + + + + Subclass this type to implement customized logging event filtering + + + + Users should extend this class to implement customized logging + event filtering. Note that and + , the parent class of all standard + appenders, have built-in filtering rules. It is suggested that you + first use and understand the built-in rules before rushing to write + your own custom filters. + + + This abstract class assumes and also imposes that filters be + organized in a linear chain. The + method of each filter is called sequentially, in the order of their + addition to the chain. + + + The method must return one + of the integer constants , + or . + + + If the value is returned, then the log event is dropped + immediately without consulting with the remaining filters. + + + If the value is returned, then the next filter + in the chain is consulted. If there are no more filters in the + chain, then the log event is logged. Thus, in the presence of no + filters, the default behavior is to log all logging events. + + + If the value is returned, then the log + event is logged without consulting the remaining filters. + + + The philosophy of log4net filters is largely inspired from the + Linux ipchains. + + + Nicko Cadell + Gert Driesen + + + + Initialize the filter with the options set + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + Typically filter's options become active immediately on set, + however this method must still be called. + + + + + + Decide if the should be logged through an appender. + + The to decide upon + The decision of the filter + + + If the decision is , then the event will be + dropped. If the decision is , then the next + filter, if any, will be invoked. If the decision is then + the event will be logged without consulting with other filters in + the chain. + + + This method is marked abstract and must be implemented + in a subclass. + + + + + + Gets or sets the next filter in the filter chain. + + + + Filters are typically composed into chains. This property allows the next filter in + the chain to be accessed. + + + + + + Implement this interface to provide customized logging event filtering + + + + Users should implement this interface to implement customized logging + event filtering. Note that and + , the parent class of all standard + appenders, have built-in filtering rules. It is suggested that you + first use and understand the built-in rules before rushing to write + your own custom filters. + + + This abstract class assumes and also imposes that filters be + organized in a linear chain. The + method of each filter is called sequentially, in the order of their + addition to the chain. + + + The method must return one + of the integer constants , + or . + + + If the value is returned, then the log event is dropped + immediately without consulting with the remaining filters. + + + If the value is returned, then the next filter + in the chain is consulted. If there are no more filters in the + chain, then the log event is logged. Thus, in the presence of no + filters, the default behavior is to log all logging events. + + + If the value is returned, then the log + event is logged without consulting the remaining filters. + + + The philosophy of log4net filters is largely inspired from the + Linux ipchains. + + + Nicko Cadell + Gert Driesen + + + + Decide if the logging event should be logged through an appender. + + The LoggingEvent to decide upon + The decision of the filter + + + If the decision is , then the event will be + dropped. If the decision is , then the next + filter, if any, will be invoked. If the decision is then + the event will be logged without consulting with other filters in + the chain. + + + + + + Gets or sets the next filter in the chain. + + + + Filters are typically composed into chains. This property allows the next filter in + the chain to be accessed. + + + + + + This is a very simple filter based on matching. + + + + The filter admits two options and + . If there is an exact match between the value + of the option and the of the + , then the method returns in + case the option value is set + to true, if it is false then + is returned. If the does not match then + the result will be . + + + Nicko Cadell + Gert Driesen + + + + when matching + + + + The property is a flag that determines + the behavior when a matching is found. If the + flag is set to true then the filter will the + logging event, otherwise it will the event. + + + The default is true i.e. to the event. + + + + + + The that the filter will match + + + + The level that this filter will attempt to match against the + level. If a match is found then + the result depends on the value of . + + + + + + Tests if the of the logging event matches that of the filter + + the event to filter + see remarks + + + If the of the event matches the level of the + filter then the result of the function depends on the + value of . If it is true then + the function will return , it it is false then it + will return . If the does not match then + the result will be . + + + + + + This is a simple filter based on matching. + + + + The filter admits three options and + that determine the range of priorities that are matched, and + . If there is a match between the range + of priorities and the of the , then the + method returns in case the + option value is set to true, if it is false + then is returned. If there is no match, is returned. + + + Nicko Cadell + Gert Driesen + + + + when matching and + + + + The property is a flag that determines + the behavior when a matching is found. If the + flag is set to true then the filter will the + logging event, otherwise it will the event. + + + The default is true i.e. to the event. + + + + + + Set the minimum matched + + + + The minimum level that this filter will attempt to match against the + level. If a match is found then + the result depends on the value of . + + + + + + Sets the maximum matched + + + + The maximum level that this filter will attempt to match against the + level. If a match is found then + the result depends on the value of . + + + + + + Check if the event should be logged. + + the logging event to check + see remarks + + + If the of the logging event is outside the range + matched by this filter then + is returned. If the is matched then the value of + is checked. If it is true then + is returned, otherwise + is returned. + + + + + + Simple filter to match a string in the event's logger name. + + + + The works very similar to the . It admits two + options and . If the + of the starts + with the value of the option, then the + method returns in + case the option value is set to true, + if it is false then is returned. + + + Daniel Cazzulino + + + + when matching + + + + The property is a flag that determines + the behavior when a matching is found. If the + flag is set to true then the filter will the + logging event, otherwise it will the event. + + + The default is true i.e. to the event. + + + + + + The that the filter will match + + + + This filter will attempt to match this value against logger name in + the following way. The match will be done against the beginning of the + logger name (using ). The match is + case sensitive. If a match is found then + the result depends on the value of . + + + + + + Check if this filter should allow the event to be logged + + the event being logged + see remarks + + + The rendered message is matched against the . + If the equals the beginning of + the incoming () + then a match will have occurred. If no match occurs + this function will return + allowing other filters to check the event. If a match occurs then + the value of is checked. If it is + true then is returned otherwise + is returned. + + + + + + Simple filter to match a keyed string in the + + + + Simple filter to match a keyed string in the + + + As the MDC has been replaced with layered properties the + should be used instead. + + + Nicko Cadell + Gert Driesen + + + + Simple filter to match a string in the + + + + Simple filter to match a string in the + + + As the NDC has been replaced with named stacks stored in the + properties collections the should + be used instead. + + + Nicko Cadell + Gert Driesen + + + + Default constructor + + + + Sets the to "NDC". + + + + + + Simple filter to match a string an event property + + + + Simple filter to match a string in the value for a + specific event property + + + Nicko Cadell + + + + The key to lookup in the event properties and then match against. + + + + The key name to use to lookup in the properties map of the + . The match will be performed against + the value of this property if it exists. + + + + + + Check if this filter should allow the event to be logged + + the event being logged + see remarks + + + The event property for the is matched against + the . + If the occurs as a substring within + the property value then a match will have occurred. If no match occurs + this function will return + allowing other filters to check the event. If a match occurs then + the value of is checked. If it is + true then is returned otherwise + is returned. + + + + + + Simple filter to match a string in the rendered message. + + Nicko Cadell + Gert Driesen + + + + A regex object to match (generated from m_stringRegexToMatch) + + + + + Initialize and precompile the Regex if required + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + when matching or + + + + The property is a flag that determines + the behavior when a matching is found. If the + flag is set to true then the filter will the + logging event, otherwise it will the event. + + + The default is true i.e. to the event. + + + + + + Sets the static string to match + + + + The string that will be substring matched against + the rendered message. If the message contains this + string then the filter will match. If a match is found then + the result depends on the value of . + + + One of or + must be specified. + + + + + + Sets the regular expression to match + + + + The regular expression pattern that will be matched against + the rendered message. If the message matches this + pattern then the filter will match. If a match is found then + the result depends on the value of . + + + One of or + must be specified. + + + + + + Check if this filter should allow the event to be logged + + the event being logged + see remarks + + + The rendered message is matched against the . + If the occurs as a substring within + the message then a match will have occurred. If no match occurs + this function will return + allowing other filters to check the event. If a match occurs then + the value of is checked. If it is + true then is returned otherwise + is returned. + + + + + + The log4net Global Context. + + + + The GlobalContext provides a location for global debugging + information to be stored. + + + The global context has a properties map and these properties can + be included in the output of log messages. The + supports selecting and outputing these properties. + + + By default the log4net:HostName property is set to the name of + the current machine. + + + + + GlobalContext.Properties["hostname"] = Environment.MachineName; + + + + Nicko Cadell + + + + The global properties map. + + + + + The ILog interface is use by application to log messages into + the log4net framework. + + + + Use the to obtain logger instances + that implement this interface. The + static method is used to get logger instances. + + + This class contains methods for logging at different levels and also + has properties for determining if those logging levels are + enabled in the current configuration. + + + This interface can be implemented in different ways. This documentation + specifies reasonable behavior that a caller can expect from the actual + implementation, however different implementations reserve the right to + do things differently. + + + Simple example of logging messages + + ILog log = LogManager.GetLogger("application-log"); + + log.Info("Application Start"); + log.Debug("This is a debug message"); + + if (log.IsDebugEnabled) + { + log.Debug("This is another debug message"); + } + + + + + Nicko Cadell + Gert Driesen + + + Log a message object with the level. + + Logs a message object with the level. + + The message object to log. + + + This method first checks if this logger is DEBUG + enabled by comparing the level of this logger with the + level. If this logger is + DEBUG enabled, then it converts the message object + (passed as parameter) to a string by invoking the appropriate + . It then + proceeds to call all the registered appenders in this logger + and also higher in the hierarchy depending on the value of + the additivity flag. + + WARNING Note that passing an + to this method will print the name of the + but no stack trace. To print a stack trace use the + form instead. + + + + + + + + Log a message object with the level including + the stack trace of the passed + as a parameter. + + The message object to log. + The exception to log, including its stack trace. + + + See the form for more detailed information. + + + + + + + Log a formatted string with the level. + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + An that supplies culture-specific formatting information + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + Log a message object with the level. + + Logs a message object with the level. + + + + This method first checks if this logger is INFO + enabled by comparing the level of this logger with the + level. If this logger is + INFO enabled, then it converts the message object + (passed as parameter) to a string by invoking the appropriate + . It then + proceeds to call all the registered appenders in this logger + and also higher in the hierarchy depending on the value of the + additivity flag. + + WARNING Note that passing an + to this method will print the name of the + but no stack trace. To print a stack trace use the + form instead. + + + The message object to log. + + + + + + Logs a message object with the INFO level including + the stack trace of the passed + as a parameter. + + The message object to log. + The exception to log, including its stack trace. + + + See the form for more detailed information. + + + + + + + Log a formatted message string with the level. + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + An that supplies culture-specific formatting information + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + Log a message object with the level. + + Log a message object with the level. + + + + This method first checks if this logger is WARN + enabled by comparing the level of this logger with the + level. If this logger is + WARN enabled, then it converts the message object + (passed as parameter) to a string by invoking the appropriate + . It then + proceeds to call all the registered appenders in this logger + and also higher in the hierarchy depending on the value of the + additivity flag. + + WARNING Note that passing an + to this method will print the name of the + but no stack trace. To print a stack trace use the + form instead. + + + The message object to log. + + + + + + Log a message object with the level including + the stack trace of the passed + as a parameter. + + The message object to log. + The exception to log, including its stack trace. + + + See the form for more detailed information. + + + + + + + Log a formatted message string with the level. + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + An that supplies culture-specific formatting information + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + Log a message object with the level. + + Logs a message object with the level. + + The message object to log. + + + This method first checks if this logger is ERROR + enabled by comparing the level of this logger with the + level. If this logger is + ERROR enabled, then it converts the message object + (passed as parameter) to a string by invoking the appropriate + . It then + proceeds to call all the registered appenders in this logger + and also higher in the hierarchy depending on the value of the + additivity flag. + + WARNING Note that passing an + to this method will print the name of the + but no stack trace. To print a stack trace use the + form instead. + + + + + + + + Log a message object with the level including + the stack trace of the passed + as a parameter. + + The message object to log. + The exception to log, including its stack trace. + + + See the form for more detailed information. + + + + + + + Log a formatted message string with the level. + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + An that supplies culture-specific formatting information + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + Log a message object with the level. + + Log a message object with the level. + + + + This method first checks if this logger is FATAL + enabled by comparing the level of this logger with the + level. If this logger is + FATAL enabled, then it converts the message object + (passed as parameter) to a string by invoking the appropriate + . It then + proceeds to call all the registered appenders in this logger + and also higher in the hierarchy depending on the value of the + additivity flag. + + WARNING Note that passing an + to this method will print the name of the + but no stack trace. To print a stack trace use the + form instead. + + + The message object to log. + + + + + + Log a message object with the level including + the stack trace of the passed + as a parameter. + + The message object to log. + The exception to log, including its stack trace. + + + See the form for more detailed information. + + + + + + + Log a formatted message string with the level. + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + A String containing zero or more format items + An Object to format + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + An that supplies culture-specific formatting information + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Checks if this logger is enabled for the level. + + + true if this logger is enabled for events, false otherwise. + + + + This function is intended to lessen the computational cost of + disabled log debug statements. + + For some ILog interface log, when you write: + + log.Debug("This is entry number: " + i ); + + + You incur the cost constructing the message, string construction and concatenation in + this case, regardless of whether the message is logged or not. + + + If you are worried about speed (who isn't), then you should write: + + + if (log.IsDebugEnabled) + { + log.Debug("This is entry number: " + i ); + } + + + This way you will not incur the cost of parameter + construction if debugging is disabled for log. On + the other hand, if the log is debug enabled, you + will incur the cost of evaluating whether the logger is debug + enabled twice. Once in and once in + the . This is an insignificant overhead + since evaluating a logger takes about 1% of the time it + takes to actually log. This is the preferred style of logging. + + Alternatively if your logger is available statically then the is debug + enabled state can be stored in a static variable like this: + + + private static readonly bool isDebugEnabled = log.IsDebugEnabled; + + + Then when you come to log you can write: + + + if (isDebugEnabled) + { + log.Debug("This is entry number: " + i ); + } + + + This way the debug enabled state is only queried once + when the class is loaded. Using a private static readonly + variable is the most efficient because it is a run time constant + and can be heavily optimized by the JIT compiler. + + + Of course if you use a static readonly variable to + hold the enabled state of the logger then you cannot + change the enabled state at runtime to vary the logging + that is produced. You have to decide if you need absolute + speed or runtime flexibility. + + + + + + + + Checks if this logger is enabled for the level. + + + true if this logger is enabled for events, false otherwise. + + + For more information see . + + + + + + + + Checks if this logger is enabled for the level. + + + true if this logger is enabled for events, false otherwise. + + + For more information see . + + + + + + + + Checks if this logger is enabled for the level. + + + true if this logger is enabled for events, false otherwise. + + + For more information see . + + + + + + + + Checks if this logger is enabled for the level. + + + true if this logger is enabled for events, false otherwise. + + + For more information see . + + + + + + + + A flexible layout configurable with pattern string that re-evaluates on each call. + + + This class is built on and provides all the + features and capabilities of PatternLayout. PatternLayout is a 'static' class + in that its layout is done once at configuration time. This class will recreate + the layout on each reference. + One important difference between PatternLayout and DynamicPatternLayout is the + treatment of the Header and Footer parameters in the configuration. The Header and Footer + parameters for DynamicPatternLayout must be syntactically in the form of a PatternString, + but should not be marked as type log4net.Util.PatternString. Doing so causes the + pattern to be statically converted at configuration time and causes DynamicPatternLayout + to perform the same as PatternLayout. + Please see for complete documentation. + + <layout type="log4net.Layout.DynamicPatternLayout"> + <param name="Header" value="%newline**** Trace Opened Local: %date{yyyy-MM-dd HH:mm:ss.fff} UTC: %utcdate{yyyy-MM-dd HH:mm:ss.fff} ****%newline" /> + <param name="Footer" value="**** Trace Closed %date{yyyy-MM-dd HH:mm:ss.fff} ****%newline" /> + </layout> + + + + + + The header PatternString + + + + + The footer PatternString + + + + + Constructs a DynamicPatternLayout using the DefaultConversionPattern + + + + The default pattern just produces the application supplied message. + + + + + + Constructs a DynamicPatternLayout using the supplied conversion pattern. + + The pattern to use. + + + + Gets or sets the header for the layout format. + + the layout header + + + The Header text will be appended before any logging events + are formatted and appended. + + The pattern will be formatted on each get operation. + + + + + Gets or sets the footer for the layout format. + + the layout footer + + + The Footer text will be appended after all the logging events + have been formatted and appended. + + The pattern will be formatted on each get operation. + + + + + A Layout that renders only the Exception text from the logging event + + + + This Layout should only be used with appenders that utilize multiple + layouts (e.g. ). + + + Nicko Cadell + Gert Driesen + + + + Constructs an ExceptionLayout. + + + + + Activates component options. + + + + Part of the component activation + framework. + + + This method does nothing as options become effective immediately. + + + + + + Gets the exception text from the logging event + + The TextWriter to write the formatted event to + the event being logged + + + Write the exception string to the . + The exception string is retrieved from . + + + + + + Interface implemented by layout objects + + + + An object is used to format a + as text. The method is called by an + appender to transform the into a string. + + + The layout can also supply and + text that is appender before any events and after all the events respectively. + + + Nicko Cadell + Gert Driesen + + + + Implement this method to create your own layout format. + + The TextWriter to write the formatted event to + The event to format + + + This method is called by an appender to format + the as text and output to a writer. + + + If the caller does not have a and prefers the + event to be formatted as a then the following + code can be used to format the event into a . + + + StringWriter writer = new StringWriter(); + Layout.Format(writer, loggingEvent); + string formattedEvent = writer.ToString(); + + + + + + The content type output by this layout. + + The content type + + + The content type output by this layout. + + + This is a MIME type e.g. "text/plain". + + + + + + The header for the layout format. + + the layout header + + + The Header text will be appended before any logging events + are formatted and appended. + + + + + + The footer for the layout format. + + the layout footer + + + The Footer text will be appended after all the logging events + have been formatted and appended. + + + + + + Flag indicating if this layout handle exceptions + + false if this layout handles exceptions + + + If this layout handles the exception object contained within + , then the layout should return + false. Otherwise, if the layout ignores the exception + object, then the layout should return true. + + + + + + Extensions for + + Jan Friedrich + + + + writes the specified start tag and associates it with the given namespace and prefix + + Writer + The full name of the element + The namespace prefix of the element + The local name of the element + The namespace URI to associate with the element + + + + Creates an XmlWriter + + TextWriter + XmlWriter + + + + Interface for raw layout objects + + + + Interface used to format a + to an object. + + + This interface should not be confused with the + interface. This interface is used in + only certain specialized situations where a raw object is + required rather than a formatted string. The + is not generally useful than this interface. + + + Nicko Cadell + Gert Driesen + + + + Implement this method to create your own layout format. + + The event to format + returns the formatted event + + + Implement this method to create your own layout format. + + + + + + Adapts any to a + + + + Where an is required this adapter + allows a to be specified. + + + Nicko Cadell + Gert Driesen + + + + The layout to adapt + + + + + Construct a new adapter + + the layout to adapt + + + Create the adapter for the specified . + + + + + + Formats the logging event as an object. + + The event to format + returns the formatted event + + + Uses the object supplied to + the constructor to perform the formatting. + + + + + + Extend this abstract class to create your own log layout format. + + + + This is the base implementation of the + interface. Most layout objects should extend this class. + + + + + + Subclasses must implement the + method. + + + Subclasses should set the in their default + constructor. + + + + Nicko Cadell + Gert Driesen + + + + Empty default constructor + + + + Empty default constructor + + + + + + Activate component options + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + This method must be implemented by the subclass. + + + + + + Implement this method to create your own layout format. + + The TextWriter to write the formatted event to + The event to format + + + This method is called by an appender to format + the as text. + + + + + + Convenience method for easily formatting the logging event into a string variable. + + + + Creates a new StringWriter instance to store the formatted logging event. + + + + + The content type output by this layout. + + The content type is "text/plain" + + + The content type output by this layout. + + + This base class uses the value "text/plain". + To change this value a subclass must override this + property. + + + + + + The header for the layout format. + + the layout header + + + The Header text will be appended before any logging events + are formatted and appended. + + + + + + The footer for the layout format. + + the layout footer + + + The Footer text will be appended after all the logging events + have been formatted and appended. + + + + + + Flag indicating if this layout handles exceptions. + + false if this layout handles exceptions + + + If this layout handles the exception object contained within + , then the layout should return + false. Otherwise, if the layout ignores the exception + object, then the layout should return true. + + + Set this value to override the default setting. The default + value is true, this layout does not handle the exception. + + + + + + A flexible layout configurable with pattern string. + + + + The goal of this class is to a + as a string. The results + depend on the conversion pattern. + + + The conversion pattern is closely related to the conversion + pattern of the printf function in C. A conversion pattern is + composed of literal text and format control expressions called + conversion specifiers. + + + You are free to insert any literal text within the conversion + pattern. + + + Each conversion specifier starts with a percent sign (%) and is + followed by optional format modifiers and a conversion + pattern name. The conversion pattern name specifies the type of + data, e.g. logger, level, date, thread name. The format + modifiers control such things as field width, padding, left and + right justification. The following is a simple example. + + + Let the conversion pattern be "%-5level [%thread]: %message%newline" and assume + that the log4net environment was set to use a PatternLayout. Then the + statements + + + ILog log = LogManager.GetLogger(typeof(TestApp)); + log.Debug("Message 1"); + log.Warn("Message 2"); + + would yield the output + + DEBUG [main]: Message 1 + WARN [main]: Message 2 + + + Note that there is no explicit separator between text and + conversion specifiers. The pattern parser knows when it has reached + the end of a conversion specifier when it reads a conversion + character. In the example above the conversion specifier + %-5level means the level of the logging event should be left + justified to a width of five characters. + + + The recognized conversion pattern names are: + + + + Conversion Pattern Name + Effect + + + a + Equivalent to appdomain + + + appdomain + + Used to output the friendly name of the AppDomain where the + logging event was generated. + + + + aspnet-cache + + + Used to output all cache items in the case of %aspnet-cache or just one named item if used as %aspnet-cache{key} + + + This pattern is not available for Compact Framework or Client Profile assemblies. + + + + + aspnet-context + + + Used to output all context items in the case of %aspnet-context or just one named item if used as %aspnet-context{key} + + + This pattern is not available for Compact Framework or Client Profile assemblies. + + + + + aspnet-request + + + Used to output all request parameters in the case of %aspnet-request or just one named param if used as %aspnet-request{key} + + + This pattern is not available for Compact Framework or Client Profile assemblies. + + + + + aspnet-session + + + Used to output all session items in the case of %aspnet-session or just one named item if used as %aspnet-session{key} + + + This pattern is not available for Compact Framework or Client Profile assemblies. + + + + + c + Equivalent to logger + + + C + Equivalent to type + + + class + Equivalent to type + + + d + Equivalent to date + + + date + + + Used to output the date of the logging event in the local time zone. + To output the date in universal time use the %utcdate pattern. + The date conversion + specifier may be followed by a date format specifier enclosed + between braces. For example, %date{HH:mm:ss,fff} or + %date{dd MMM yyyy HH:mm:ss,fff}. If no date format specifier is + given then ISO8601 format is + assumed (). + + + The date format specifier admits the same syntax as the + time pattern string of the . + + + For better results it is recommended to use the log4net date + formatters. These can be specified using one of the strings + "ABSOLUTE", "DATE" and "ISO8601" for specifying + , + and respectively + . For example, + %date{ISO8601} or %date{ABSOLUTE}. + + + These dedicated date formatters perform significantly + better than . + + + + + exception + + + Used to output the exception passed in with the log message. + + + If an exception object is stored in the logging event + it will be rendered into the pattern output with a + trailing newline. + If there is no exception then nothing will be output + and no trailing newline will be appended. + It is typical to put a newline before the exception + and to have the exception as the last data in the pattern. + + + + + F + Equivalent to file + + + file + + + Used to output the file name where the logging request was + issued. + + + WARNING Generating caller location information is + extremely slow. Its use should be avoided unless execution speed + is not an issue. + + + See the note below on the availability of caller location information. + + + + + identity + + + Used to output the user name for the currently active user + (Principal.Identity.Name). + + + WARNING Generating caller information is + extremely slow. Its use should be avoided unless execution speed + is not an issue. + + + + + l + Equivalent to location + + + L + Equivalent to line + + + location + + + Used to output location information of the caller which generated + the logging event. + + + The location information depends on the CLI implementation but + usually consists of the fully qualified name of the calling + method followed by the callers source the file name and line + number between parentheses. + + + The location information can be very useful. However, its + generation is extremely slow. Its use should be avoided + unless execution speed is not an issue. + + + See the note below on the availability of caller location information. + + + + + level + + + Used to output the level of the logging event. + + + + + line + + + Used to output the line number from where the logging request + was issued. + + + WARNING Generating caller location information is + extremely slow. Its use should be avoided unless execution speed + is not an issue. + + + See the note below on the availability of caller location information. + + + + + logger + + + Used to output the logger of the logging event. The + logger conversion specifier can be optionally followed by + precision specifier, that is a decimal constant in + brackets. + + + If a precision specifier is given, then only the corresponding + number of right most components of the logger name will be + printed. By default the logger name is printed in full. + + + For example, for the logger name "a.b.c" the pattern + %logger{2} will output "b.c". + + + + + m + Equivalent to message + + + M + Equivalent to method + + + message + + + Used to output the application supplied message associated with + the logging event. + + + + + mdc + + + The MDC (old name for the ThreadContext.Properties) is now part of the + combined event properties. This pattern is supported for compatibility + but is equivalent to property. + + + + + method + + + Used to output the method name where the logging request was + issued. + + + WARNING Generating caller location information is + extremely slow. Its use should be avoided unless execution speed + is not an issue. + + + See the note below on the availability of caller location information. + + + + + n + Equivalent to newline + + + newline + + + Outputs the platform dependent line separator character or + characters. + + + This conversion pattern offers the same performance as using + non-portable line separator strings such as "\n", or "\r\n". + Thus, it is the preferred way of specifying a line separator. + + + + + ndc + + + Used to output the NDC (nested diagnostic context) associated + with the thread that generated the logging event. + + + + + p + Equivalent to level + + + P + Equivalent to property + + + properties + Equivalent to property + + + property + + + Used to output the an event specific property. The key to + lookup must be specified within braces and directly following the + pattern specifier, e.g. %property{user} would include the value + from the property that is keyed by the string 'user'. Each property value + that is to be included in the log must be specified separately. + Properties are added to events by loggers or appenders. By default + the log4net:HostName property is set to the name of machine on + which the event was originally logged. + + + If no key is specified, e.g. %property then all the keys and their + values are printed in a comma separated list. + + + The properties of an event are combined from a number of different + contexts. These are listed below in the order in which they are searched. + + + + the event properties + + The event has that can be set. These + properties are specific to this event only. + + + + the thread properties + + The that are set on the current + thread. These properties are shared by all events logged on this thread. + + + + the global properties + + The that are set globally. These + properties are shared by all the threads in the AppDomain. + + + + + + + + r + Equivalent to timestamp + + + stacktrace + + + Used to output the stack trace of the logging event + The stack trace level specifier may be enclosed + between braces. For example, %stacktrace{level}. + If no stack trace level specifier is given then 1 is assumed + + + Output uses the format: + type3.MethodCall3 > type2.MethodCall2 > type1.MethodCall1 + + + This pattern is not available for Compact Framework assemblies. + + + + + stacktracedetail + + + Used to output the stack trace of the logging event + The stack trace level specifier may be enclosed + between braces. For example, %stacktracedetail{level}. + If no stack trace level specifier is given then 1 is assumed + + + Output uses the format: + type3.MethodCall3(type param,...) > type2.MethodCall2(type param,...) > type1.MethodCall1(type param,...) + + + This pattern is not available for Compact Framework assemblies. + + + + + t + Equivalent to thread + + + timestamp + + + Used to output the number of milliseconds elapsed since the start + of the application until the creation of the logging event. + + + + + thread + + + Used to output the name of the thread that generated the + logging event. Uses the thread number if no name is available. + + + + + type + + + Used to output the fully qualified type name of the caller + issuing the logging request. This conversion specifier + can be optionally followed by precision specifier, that + is a decimal constant in brackets. + + + If a precision specifier is given, then only the corresponding + number of right most components of the class name will be + printed. By default the class name is output in fully qualified form. + + + For example, for the class name "log4net.Layout.PatternLayout", the + pattern %type{1} will output "PatternLayout". + + + WARNING Generating the caller class information is + slow. Thus, its use should be avoided unless execution speed is + not an issue. + + + See the note below on the availability of caller location information. + + + + + u + Equivalent to identity + + + username + + + Used to output the WindowsIdentity for the currently + active user. + + + WARNING Generating caller WindowsIdentity information is + extremely slow. Its use should be avoided unless execution speed + is not an issue. + + + + + utcdate + + + Used to output the date of the logging event in universal time. + The date conversion + specifier may be followed by a date format specifier enclosed + between braces. For example, %utcdate{HH:mm:ss,fff} or + %utcdate{dd MMM yyyy HH:mm:ss,fff}. If no date format specifier is + given then ISO8601 format is + assumed (). + + + The date format specifier admits the same syntax as the + time pattern string of the . + + + For better results it is recommended to use the log4net date + formatters. These can be specified using one of the strings + "ABSOLUTE", "DATE" and "ISO8601" for specifying + , + and respectively + . For example, + %utcdate{ISO8601} or %utcdate{ABSOLUTE}. + + + These dedicated date formatters perform significantly + better than . + + + + + w + Equivalent to username + + + x + Equivalent to ndc + + + X + Equivalent to mdc + + + % + + + The sequence %% outputs a single percent sign. + + + + + + The single letter patterns are deprecated in favor of the + longer more descriptive pattern names. + + + By default the relevant information is output as is. However, + with the aid of format modifiers it is possible to change the + minimum field width, the maximum field width and justification. + + + The optional format modifier is placed between the percent sign + and the conversion pattern name. + + + The first optional format modifier is the left justification + flag which is just the minus (-) character. Then comes the + optional minimum field width modifier. This is a decimal + constant that represents the minimum number of characters to + output. If the data item requires fewer characters, it is padded on + either the left or the right until the minimum width is + reached. The default is to pad on the left (right justify) but you + can specify right padding with the left justification flag. The + padding character is space. If the data item is larger than the + minimum field width, the field is expanded to accommodate the + data. The value is never truncated. + + + This behavior can be changed using the maximum field + width modifier which is designated by a period followed by a + decimal constant. If the data item is longer than the maximum + field, then the extra characters are removed from the + beginning of the data item and not from the end. For + example, it the maximum field width is eight and the data item is + ten characters long, then the first two characters of the data item + are dropped. This behavior deviates from the printf function in C + where truncation is done from the end. + + + Below are various format modifier examples for the logger + conversion specifier. + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Format modifierleft justifyminimum widthmaximum widthcomment
    %20loggerfalse20none + + Left pad with spaces if the logger name is less than 20 + characters long. + +
    %-20loggertrue20none + + Right pad with spaces if the logger + name is less than 20 characters long. + +
    %.30loggerNAnone30 + + Truncate from the beginning if the logger + name is longer than 30 characters. + +
    %20.30loggerfalse2030 + + Left pad with spaces if the logger name is shorter than 20 + characters. However, if logger name is longer than 30 characters, + then truncate from the beginning. + +
    %-20.30loggertrue2030 + + Right pad with spaces if the logger name is shorter than 20 + characters. However, if logger name is longer than 30 characters, + then truncate from the beginning. + +
    +
    + + Note about caller location information.
    + The following patterns %type %file %line %method %location %class %C %F %L %l %M + all generate caller location information. + Location information uses the System.Diagnostics.StackTrace class to generate + a call stack. The caller's information is then extracted from this stack. +
    + + + The System.Diagnostics.StackTrace class is not supported on the + .NET Compact Framework 1.0 therefore caller location information is not + available on that framework. + + + + + The System.Diagnostics.StackTrace class has this to say about Release builds: + + + "StackTrace information will be most informative with Debug build configurations. + By default, Debug builds include debug symbols, while Release builds do not. The + debug symbols contain most of the file, method name, line number, and column + information used in constructing StackFrame and StackTrace objects. StackTrace + might not report as many method calls as expected, due to code transformations + that occur during optimization." + + + This means that in a Release build the caller information may be incomplete or may + not exist at all! Therefore caller location information cannot be relied upon in a Release build. + + + + Additional pattern converters may be registered with a specific + instance using the method. + +
    + + This is a more detailed pattern. + %timestamp [%thread] %level %logger %ndc - %message%newline + + + A similar pattern except that the relative time is + right padded if less than 6 digits, thread name is right padded if + less than 15 characters and truncated if longer and the logger + name is left padded if shorter than 30 characters and truncated if + longer. + %-6timestamp [%15.15thread] %-5level %30.30logger %ndc - %message%newline + + Nicko Cadell + Gert Driesen + Douglas de la Torre + Daniel Cazzulino +
    + + + Default pattern string for log output. + + + + Default pattern string for log output. + Currently set to the string "%message%newline" + which just prints the application supplied message. + + + + + + A detailed conversion pattern + + + + A conversion pattern which includes Time, Thread, Logger, and Nested Context. + Current value is %timestamp [%thread] %level %logger %ndc - %message%newline. + + + + + + Internal map of converter identifiers to converter types. + + + + This static map is overridden by the converterRegistry instance map + + + + + + the head of the pattern converter chain + + + + + patterns defined on this PatternLayout only + + + + + Constructs a PatternLayout using the DefaultConversionPattern + + + + The default pattern just produces the application supplied message. + + + Note to Inheritors: This constructor calls the virtual method + . If you override this method be + aware that it will be called before your is called constructor. + + + As per the contract the + method must be called after the properties on this object have been + configured. + + + + + + Constructs a PatternLayout using the supplied conversion pattern + + the pattern to use + + + Note to Inheritors: This constructor calls the virtual method + . If you override this method be + aware that it will be called before your is called constructor. + + + When using this constructor the method + need not be called. This may not be the case when using a subclass. + + + + + + Gets or sets the pattern formatting string. + + + + The ConversionPattern option. This is the string which + controls formatting and consists of a mix of literal content and + conversion specifiers. + + + + + + Create the pattern parser instance + + the pattern to parse + The that will format the event + + + Creates the used to parse the conversion string. Sets the + global and instance rules on the . + + + + + + Initializes layout options. + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Produces a formatted string as specified by the conversion pattern. + + The event being logged. + The TextWriter to write the formatted event to. + + + Parses the using the patter format + specified in the property. + + + + + + Add a converter to this PatternLayout + + the converter info + + + This version of the method is used by the configurator. + Programmatic users should use the alternative method. + + + + + + Adds a named pattern converter to this PatternLayout. + + the name of the conversion pattern for this converter + the type of the converter + + + This converter will be used in the formatting of the event. + This method must be called before . + + + The specified must extend the + type. + + + + + + Write the event appdomain name to the output + + + + Writes the to the output writer. + + + Daniel Cazzulino + Nicko Cadell + + + + Write the event appdomain name to the output + + that will receive the formatted result. + the event being logged + + + Writes the to the output . + + + + + + Date pattern converter, uses a to format + the date of a . + + + + Render the to the writer as a string. + + + The value of the determines + the formatting of the date. The following values are allowed: + + + Option value + Output + + + ISO8601 + + Uses the formatter. + Formats using the "yyyy-MM-dd HH:mm:ss,fff" pattern. + + + + DATE + + Uses the formatter. + Formats using the "dd MMM yyyy HH:mm:ss,fff" for example, "06 Nov 1994 15:49:37,459". + + + + ABSOLUTE + + Uses the formatter. + Formats using the "HH:mm:ss,yyyy" for example, "15:49:37,459". + + + + other + + Any other pattern string uses the formatter. + This formatter passes the pattern string to the + method. + For details on valid patterns see + DateTimeFormatInfo Class. + + + + + + The is in the local time zone and is rendered in that zone. + To output the time in Universal time see . + + + Nicko Cadell + + + + The used to render the date to a string + + + + + Initialize the converter pattern based on the property. + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Converts the pattern into the rendered message. + + that will receive the formatted result. + the event being logged + + + Pass the to the + for it to render it to the writer. + + + The passed is in the local time zone. + + + + + + Write the exception text to the output + + + + If an exception object is stored in the logging event + it will be rendered into the pattern output with a + trailing newline. + + + If there is no exception then nothing will be output + and no trailing newline will be appended. + It is typical to put a newline before the exception + and to have the exception as the last data in the pattern. + + + Nicko Cadell + + + + Default constructor + + + + + Write the exception text to the output + + that will receive the formatted result. + the event being logged + + + If an exception object is stored in the logging event + it will be rendered into the pattern output with a + trailing newline. + + + If there is no exception or the exception property specified + by the Option value does not exist then nothing will be output + and no trailing newline will be appended. + It is typical to put a newline before the exception + and to have the exception as the last data in the pattern. + + + Recognized values for the Option parameter are: + + + + Message + + + Source + + + StackTrace + + + TargetSite + + + HelpLink + + + + + + + Writes the value of the for + the event to the output writer. + + Nicko Cadell + + + + Writes the value of the for + the to the output . + + that will receive the formatted result. + the event being logged + + + + Write the caller location info to the output + + + + Writes the to the output writer. + + + Nicko Cadell + + + + Write the caller location info to the output + + that will receive the formatted result. + the event being logged + + + Writes the to the output writer. + + + + + + Writes the event identity to the output + + + + Writes the value of the to + the output writer. + + + Daniel Cazzulino + Nicko Cadell + + + + Writes the event identity to the output + + that will receive the formatted result. + the event being logged + + + Writes the value of the + to + the output . + + + + + + Write the event level to the output + + + + Writes the display name of the event + to the writer. + + + Nicko Cadell + + + + Write the event level to the output + + that will receive the formatted result. + the event being logged + + + Writes the of the + to the . + + + + + + Write the caller location line number to the output + + + + Writes the value of the for + the event to the output writer. + + + Nicko Cadell + + + + Write the caller location line number to the output + + that will receive the formatted result. + the event being logged + + + Writes the value of the for + the to the output . + + + + + + Converter for logger name + + + + Outputs the of the event. + + + Nicko Cadell + + + + Gets the fully qualified name of the logger + + the event being logged + The fully qualified logger name + + + Returns the of the . + + + + + + Writes the event message to the output + + + + Uses the method + to write out the event message. + + + Nicko Cadell + + + + Writes the event message to the output + + that will receive the formatted result. + the event being logged + + + Uses the method + to write out the event message. + + + + + + Write the method name to the output + + + + Writes the caller location to + the output. + + + Nicko Cadell + + + + Write the method name to the output + + that will receive the formatted result. + the event being logged + + + Writes the caller location to + the output. + + + + + + Converter to output and truncate '.' separated strings + + + + This abstract class supports truncating a '.' separated string + to show a specified number of elements from the right hand side. + This is used to truncate class names that are fully qualified. + + + Subclasses should override the method to + return the fully qualified string. + + + Nicko Cadell + + + + Initialize the converter + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Gets the fully qualified '.' (dot/period) separated name for an event. + + the event being logged + the fully qualified name + + + Overridden by subclasses to get the fully qualified name before the + precision is applied to it. + + + + + + Converts the pattern to the rendered message + + that will receive the formatted result. + the event being logged + + Render the to the precision + specified by the property. + + + + + The fully qualified type of the NamedPatternConverter class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Converter to include event NDC + + + + Outputs the value of the event property named NDC. + + + The should be used instead. + + + Nicko Cadell + + + + Write the event NDC to the output + + that will receive the formatted result. + the event being logged + + + As the thread context stacks are now stored in named event properties + this converter simply looks up the value of the NDC property. + + + The should be used instead. + + + + + + Abstract class that provides the formatting functionality that + derived classes need. + + + Conversion specifiers in a conversion patterns are parsed to + individual PatternConverters. Each of which is responsible for + converting a logging event in a converter specific manner. + + Nicko Cadell + + + + Initializes a new instance of the class. + + + + + Flag indicating if this converter handles the logging event exception + + false if this converter handles the logging event exception + + + If this converter handles the exception object contained within + , then this property should be set to + false. Otherwise, if the layout ignores the exception + object, then the property should be set to true. + + + Set this value to override a this default setting. The default + value is true, this converter does not handle the exception. + + + + + + Derived pattern converters must override this method in order to + convert conversion specifiers in the correct way. + + that will receive the formatted result. + The on which the pattern converter should be executed. + + + + Derived pattern converters must override this method in order to + convert conversion specifiers in the correct way. + + that will receive the formatted result. + The state object on which the pattern converter should be executed. + + + + Property pattern converter + + + + Writes out the value of a named property. The property name + should be set in the + property. + + + If the is set to null + then all the properties are written as key value pairs. + + + Nicko Cadell + + + + Write the property value to the output + + that will receive the formatted result. + the event being logged + + + Writes out the value of a named property. The property name + should be set in the + property. + + + If the is set to null + then all the properties are written as key value pairs. + + + + + + Converter to output the relative time of the event + + + + Converter to output the time of the event relative to the start of the program. + + + Nicko Cadell + + + + Write the relative time to the output + + that will receive the formatted result. + the event being logged + + + Writes out the relative time of the event in milliseconds. + That is the number of milliseconds between the event + and the . + + + + + + Helper method to get the time difference between two DateTime objects + + start time (in the current local time zone) + end time (in the current local time zone) + the time difference in milliseconds + + + + Writes the to the output writer, using format: + type3.MethodCall3(type param,...) > type2.MethodCall2(type param,...) > type1.MethodCall1(type param,...) + + Adam Davies + + + + + + + The fully qualified type of the StackTraceDetailPatternConverter class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Write the caller stack frames to the output + + + + Writes the to the output writer, using format: + type3.MethodCall3 > type2.MethodCall2 > type1.MethodCall1 + + + Michael Cromwell + + + + Initialize the converter + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Write the strack frames to the output + + that will receive the formatted result. + the event being logged + + + Writes the to the output writer. + + + + + + Returns the Name of the method + + + This method was created, so this class could be used as a base class for StackTraceDetailPatternConverter + string + + + + The fully qualified type of the StackTracePatternConverter class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Converter to include event thread name + + + + Writes the to the output. + + + Nicko Cadell + + + + Write the ThreadName to the output + + that will receive the formatted result. + the event being logged + + + Writes the to the . + + + + + + Pattern converter for the class name + + + + Outputs the of the event. + + + Nicko Cadell + + + + Gets the fully qualified name of the class + + the event being logged + The fully qualified type name for the caller location + + + Returns the of the . + + + + + + Converter to include event user name + + Douglas de la Torre + Nicko Cadell + + + + Convert the pattern to the rendered message + + that will receive the formatted result. + the event being logged + + + + Writes the TimeStamp to the output. + + + + Date pattern converter, uses a to format + the date of a . + + + Uses a to format the + in Universal time. + + + See the for details on the date pattern syntax. + + + + Nicko Cadell + + + + Writes the TimeStamp to the output. + + that will receive the formatted result. + the event being logged + + + Pass the to the + for it to render it to the writer. + + + The passed is in the local time zone, this is converted + to Universal time before it is rendered. + + + + + + + The fully qualified type of the UtcDatePatternConverter class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Type converter for the interface. + + + + Supports converting from the interface to + the interface using the . + + + Nicko Cadell + Gert Driesen + + + + Can the sourceType be converted to an + + the source to be to be converted + true if the source type can be converted to + + + Test if the can be converted to a + . Only is supported + as the . + + + + + + Converts the value to a object. + + the value to convert + the object + + + If the object is an then the + is used to adapt between the two interfaces, + otherwise an exception is thrown. + + + + + + Extracts the value of a property from the . + + Nicko Cadell + + + + The name of the value to look up in the LoggingEvent Properties collection. + + + + + Looks up the property for . + + The event to format + returns property value + + + Looks up and returns the object value of the property + named . If there is no property defined + with than name then null will be returned. + + + + + + Extracts the date from the . + + Nicko Cadell + Gert Driesen + + + + Gets the as a . + + The event to format + returns the time stamp + + + The time stamp is in local time. To format the time stamp + in universal time use . + + + + + + Extracts the date from the . + + Nicko Cadell + Gert Driesen + + + + Gets the as a . + + The event to format + returns the time stamp + + + The time stamp is in universal time. To format the time stamp + in local time use . + + + + + + A very simple layout + + + + SimpleLayout consists of the level of the log statement, + followed by " - " and then the log message itself. For example, + + DEBUG - Hello world + + + + Nicko Cadell + Gert Driesen + + + + Constructs a SimpleLayout + + + + + Initialize layout options + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Produces a simple formatted output. + + the event being logged + The TextWriter to write the formatted event to + + + Formats the event as the level of the event, + followed by " - " and then the log message itself. The + output is terminated by a newline. + + + + + + Layout that formats the log events as XML elements. + + + + The output of the consists of a series of + log4net:event elements. It does not output a complete well-formed XML + file. The output is designed to be included as an external entity + in a separate file to form a correct XML file. + + + For example, if abc is the name of the file where + the output goes, then a well-formed XML file would + be: + + + <?xml version="1.0" ?> + + <!DOCTYPE log4net:events SYSTEM "log4net-events.dtd" [<!ENTITY data SYSTEM "abc">]> + + <log4net:events version="1.2" xmlns:log4net="http://logging.apache.org/log4net/schemas/log4net-events-1.2> + &data; + </log4net:events> + + + This approach enforces the independence of the + and the appender where it is embedded. + + + The version attribute helps components to correctly + interpret output generated by . The value of + this attribute should be "1.2" for release 1.2 and later. + + + Alternatively the Header and Footer properties can be + configured to output the correct XML header, open tag and close tag. + When setting the Header and Footer properties it is essential + that the underlying data store not be appendable otherwise the data + will become invalid XML. + + + Nicko Cadell + Gert Driesen + + + + Constructs an XmlLayout + + + + + Constructs an XmlLayout. + + + + The LocationInfo option takes a boolean value. By + default, it is set to false which means there will be no location + information output by this layout. If the option is set to + true, then the file name and line number of the statement + at the origin of the log statement will be output. + + + If you are embedding this layout within an SmtpAppender + then make sure to set the LocationInfo option of that + appender as well. + + + + + + The prefix to use for all element names + + + + The default prefix is log4net. Set this property + to change the prefix. If the prefix is set to an empty string + then no prefix will be written. + + + + + + Set whether to base64 encode the message. + + + + By default the log message will be written as text to the xml + output. This can cause problems when the message contains binary + data. By setting this to true the contents of the message will be + base64 encoded. If this is set then invalid character replacement + (see ) will not be performed + on the log message. + + + + + + Set whether to base64 encode the property values. + + + + By default the properties will be written as text to the xml + output. This can cause problems when one or more properties contain + binary data. By setting this to true the values of the properties + will be base64 encoded. If this is set then invalid character replacement + (see ) will not be performed + on the property values. + + + + + + Initialize layout options + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + Builds a cache of the element names + + + + + + Does the actual writing of the XML. + + The writer to use to output the event to. + The event to write. + + + Override the base class method + to write the to the . + + + + + + Layout that formats the log events as XML elements. + + + + This is an abstract class that must be subclassed by an implementation + to conform to a specific schema. + + + Deriving classes must implement the method. + + + Nicko Cadell + Gert Driesen + + + + Protected constructor to support subclasses + + + + Initializes a new instance of the class + with no location info. + + + + + + Protected constructor to support subclasses + + + + The parameter determines whether + location information will be output by the layout. If + is set to true, then the + file name and line number of the statement at the origin of the log + statement will be output. + + + If you are embedding this layout within an SMTPAppender + then make sure to set the LocationInfo option of that + appender as well. + + + + + + Gets a value indicating whether to include location information in + the XML events. + + + true if location information should be included in the XML + events; otherwise, false. + + + + If is set to true, then the file + name and line number of the statement at the origin of the log + statement will be output. + + + If you are embedding this layout within an SMTPAppender + then make sure to set the LocationInfo option of that + appender as well. + + + + + + The string to replace characters that can not be expressed in XML with. + + + Not all characters may be expressed in XML. This property contains the + string to replace those that can not with. This defaults to a ?. Set it + to the empty string to simply remove offending characters. For more + details on the allowed character ranges see http://www.w3.org/TR/REC-xml/#charsets + Character replacement will occur in the log message, the property names + and the property values. + + + + + + + Initialize layout options + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Gets the content type output by this layout. + + + As this is the XML layout, the value is always "text/xml". + + + + As this is the XML layout, the value is always "text/xml". + + + + + + Produces a formatted string. + + The event being logged. + The TextWriter to write the formatted event to + + + Format the and write it to the . + + + This method creates an that writes to the + . The is passed + to the method. Subclasses should override the + method rather than this method. + + + + + + Does the actual writing of the XML. + + The writer to use to output the event to. + The event to write. + + + Subclasses should override this method to format the as XML. + + + + + + Layout that formats the log events as XML elements compatible with the log4j schema + + + + Formats the log events according to the http://logging.apache.org/log4j schema. + + + Nicko Cadell + + + + The 1st of January 1970 in UTC + + + + + Constructs an XMLLayoutSchemaLog4j + + + + + Constructs an XMLLayoutSchemaLog4j. + + + + The LocationInfo option takes a boolean value. By + default, it is set to false which means there will be no location + information output by this layout. If the option is set to + true, then the file name and line number of the statement + at the origin of the log statement will be output. + + + If you are embedding this layout within an SMTPAppender + then make sure to set the LocationInfo option of that + appender as well. + + + + + + The version of the log4j schema to use. + + + + Only version 1.2 of the log4j schema is supported. + + + + + + Actually do the writing of the xml + + the writer to use + the event to write + + + Generate XML that is compatible with the log4j schema. + + + + + + The log4net Logical Thread Context. + + + + The LogicalThreadContext provides a location for specific debugging + information to be stored. + The LogicalThreadContext properties override any or + properties with the same name. + + + For .NET Standard this class uses System.Threading.AsyncLocal rather than . + + + The Logical Thread Context has a properties map and a stack. + The properties and stack can + be included in the output of log messages. The + supports selecting and outputting these properties. + + + The Logical Thread Context provides a diagnostic context for the current call context. + This is an instrument for distinguishing interleaved log + output from different sources. Log output is typically interleaved + when a server handles multiple clients near-simultaneously. + + + The Logical Thread Context is managed on a per basis. + + + The requires a link time + for the + . + If the calling code does not have this permission then this context will be disabled. + It will not store any property values set on it. + + + Example of using the thread context properties to store a username. + + LogicalThreadContext.Properties["user"] = userName; + log.Info("This log message has a LogicalThreadContext Property called 'user'"); + + + Example of how to push a message into the context stack + + using(LogicalThreadContext.Stacks["LDC"].Push("my context message")) + { + log.Info("This log message has a LogicalThreadContext Stack message that includes 'my context message'"); + + } // at the end of the using block the message is automatically popped + + + + Nicko Cadell + + + + The thread properties map + + + + The LogicalThreadContext properties override any + or properties with the same name. + + + + + + The logical thread stacks. + + + + + This class is used by client applications to request logger instances. + + + + This class has static methods that are used by a client to request + a logger instance. The method is + used to retrieve a logger. + + + See the interface for more details. + + + Simple example of logging messages + + ILog log = LogManager.GetLogger("application-log"); + + log.Info("Application Start"); + log.Debug("This is a debug message"); + + if (log.IsDebugEnabled) + { + log.Debug("This is another debug message"); + } + + + + + Nicko Cadell + Gert Driesen + + + Returns the named logger if it exists. + + Returns the named logger if it exists. + + + + If the named logger exists (in the default repository) then it + returns a reference to the logger, otherwise it returns null. + + + The fully qualified logger name to look for. + The logger found, or null if no logger could be found. + + + Get the currently defined loggers. + + Returns all the currently defined loggers in the default repository. + + + The root logger is not included in the returned array. + + All the defined loggers. + + + Get or create a logger. + + Retrieves or creates a named logger. + + + + Retrieves a logger named as the + parameter. If the named logger already exists, then the + existing instance will be returned. Otherwise, a new instance is + created. + + By default, loggers do not have a set level but inherit + it from the hierarchy. This is one of the central features of + log4net. + + + The name of the logger to retrieve. + The logger with the name specified. + + + + Returns the named logger if it exists. + + + + If the named logger exists (in the specified repository) then it + returns a reference to the logger, otherwise it returns + null. + + + The repository to lookup in. + The fully qualified logger name to look for. + + The logger found, or null if the logger doesn't exist in the specified + repository. + + + + + Returns the named logger if it exists. + + + + If the named logger exists (in the repository for the specified assembly) then it + returns a reference to the logger, otherwise it returns + null. + + + The assembly to use to look up the repository. + The fully qualified logger name to look for. + + The logger, or null if the logger doesn't exist in the specified + assembly's repository. + + + + + Returns all the currently defined loggers in the specified repository. + + The repository to lookup in. + + The root logger is not included in the returned array. + + All the defined loggers. + + + + Returns all the currently defined loggers in the specified assembly's repository. + + The assembly to use to look up the repository. + + The root logger is not included in the returned array. + + All the defined loggers. + + + + Retrieves or creates a named logger. + + + + Retrieve a logger named as the + parameter. If the named logger already exists, then the + existing instance will be returned. Otherwise, a new instance is + created. + + + By default, loggers do not have a set level but inherit + it from the hierarchy. This is one of the central features of + log4net. + + + The repository to lookup in. + The name of the logger to retrieve. + The logger with the name specified. + + + + Retrieves or creates a named logger. + + + + Retrieve a logger named as the + parameter. If the named logger already exists, then the + existing instance will be returned. Otherwise, a new instance is + created. + + + By default, loggers do not have a set level but inherit + it from the hierarchy. This is one of the central features of + log4net. + + + The assembly to use to look up the repository. + The name of the logger to retrieve. + The logger with the name specified. + + + + Shorthand for . + + + Get the logger for the fully qualified name of the type specified. + + The full name of will be used as the name of the logger to retrieve. + The logger with the name specified. + + + + Shorthand for . + + + Gets the logger for the fully qualified name of the type specified. + + The repository to lookup in. + The full name of will be used as the name of the logger to retrieve. + The logger with the name specified. + + + + Shorthand for . + + + Gets the logger for the fully qualified name of the type specified. + + The assembly to use to look up the repository. + The full name of will be used as the name of the logger to retrieve. + The logger with the name specified. + + + + Shuts down the log4net system. + + + + Calling this method will safely close and remove all + appenders in all the loggers including root contained in all the + default repositories. + + + Some appenders need to be closed before the application exists. + Otherwise, pending logging events might be lost. + + The shutdown method is careful to close nested + appenders before closing regular appenders. This allows + configurations where a regular appender is attached to a logger + and again to a nested appender. + + + + + Shutdown a logger repository. + + Shuts down the default repository. + + + + Calling this method will safely close and remove all + appenders in all the loggers including root contained in the + default repository. + + Some appenders need to be closed before the application exists. + Otherwise, pending logging events might be lost. + + The shutdown method is careful to close nested + appenders before closing regular appenders. This allows + configurations where a regular appender is attached to a logger + and again to a nested appender. + + + + + + Shuts down the repository for the repository specified. + + + + Calling this method will safely close and remove all + appenders in all the loggers including root contained in the + specified. + + + Some appenders need to be closed before the application exists. + Otherwise, pending logging events might be lost. + + The shutdown method is careful to close nested + appenders before closing regular appenders. This allows + configurations where a regular appender is attached to a logger + and again to a nested appender. + + + The repository to shut down. + + + + Shuts down the repository specified. + + + + Calling this method will safely close and remove all + appenders in all the loggers including root contained in the + repository. The repository is looked up using + the specified. + + + Some appenders need to be closed before the application exists. + Otherwise, pending logging events might be lost. + + + The shutdown method is careful to close nested + appenders before closing regular appenders. This allows + configurations where a regular appender is attached to a logger + and again to a nested appender. + + + The assembly to use to look up the repository. + + + Reset the configuration of a repository + + Resets all values contained in this repository instance to their defaults. + + + + Resets all values contained in the repository instance to their + defaults. This removes all appenders from all loggers, sets + the level of all non-root loggers to null, + sets their additivity flag to true and sets the level + of the root logger to . Moreover, + message disabling is set to its default "off" value. + + + + + + Resets all values contained in this repository instance to their defaults. + + + + Reset all values contained in the repository instance to their + defaults. This removes all appenders from all loggers, sets + the level of all non-root loggers to null, + sets their additivity flag to true and sets the level + of the root logger to . Moreover, + message disabling is set to its default "off" value. + + + The repository to reset. + + + + Resets all values contained in this repository instance to their defaults. + + + + Reset all values contained in the repository instance to their + defaults. This removes all appenders from all loggers, sets + the level of all non-root loggers to null, + sets their additivity flag to true and sets the level + of the root logger to . Moreover, + message disabling is set to its default "off" value. + + + The assembly to use to look up the repository to reset. + + + Get a logger repository. + + Returns the default instance. + + + + Gets the for the repository specified + by the callers assembly (). + + + The instance for the default repository. + + + + Returns the default instance. + + The default instance. + + + Gets the for the repository specified + by the argument. + + + The repository to lookup in. + + + + Returns the default instance. + + The default instance. + + + Gets the for the repository specified + by the argument. + + + The assembly to use to look up the repository. + + + Create a logger repository. + + Creates a repository with the specified repository type. + + A that implements + and has a no arg constructor. An instance of this type will be created to act + as the for the repository specified. + The created for the repository. + + + The created will be associated with the repository + specified such that a call to will return + the same repository instance. + + + + + + Creates a repository with the specified name. + + + + Creates the default type of which is a + object. + + + The name must be unique. Repositories cannot be redefined. + An will be thrown if the repository already exists. + + + The name of the repository, this must be unique amongst repositories. + The created for the repository. + The specified repository already exists. + + + + Creates a repository with the specified name and repository type. + + + + The name must be unique. Repositories cannot be redefined. + An will be thrown if the repository already exists. + + + The name of the repository, this must be unique to the repository. + A that implements + and has a no arg constructor. An instance of this type will be created to act + as the for the repository specified. + The created for the repository. + The specified repository already exists. + + + + Creates a repository for the specified assembly and repository type. + + + + The created will be associated with the repository + specified such that a call to with the + same assembly specified will return the same repository instance. + + + The assembly to use to get the name of the repository. + A that implements + and has a no arg constructor. An instance of this type will be created to act + as the for the repository specified. + The created for the repository. + + + + Gets the list of currently defined repositories. + + + + Get an array of all the objects that have been created. + + + An array of all the known objects. + + + + Flushes logging events buffered in all configured appenders in the default repository. + + The maximum time in milliseconds to wait for logging events from asynchronous appenders to be flushed. + True if all logging events were flushed successfully, else false. + + + + Looks up the wrapper object for the logger specified. + + The logger to get the wrapper for. + The wrapper for the logger specified. + + + + Looks up the wrapper objects for the loggers specified. + + The loggers to get the wrappers for. + The wrapper objects for the loggers specified. + + + + Create the objects used by + this manager. + + The logger to wrap. + The wrapper for the logger specified. + + + + The wrapper map to use to hold the objects. + + + + + Implementation of Mapped Diagnostic Contexts. + + + + + The MDC is deprecated and has been replaced by the . + The current MDC implementation forwards to the ThreadContext.Properties. + + + + The MDC class is similar to the class except that it is + based on a map instead of a stack. It provides mapped + diagnostic contexts. A Mapped Diagnostic Context, or + MDC in short, is an instrument for distinguishing interleaved log + output from different sources. Log output is typically interleaved + when a server handles multiple clients near-simultaneously. + + + The MDC is managed on a per thread basis. + + + + Nicko Cadell + Gert Driesen + + + + Gets the context value identified by the parameter. + + The key to lookup in the MDC. + The string value held for the key, or a null reference if no corresponding value is found. + + + + The MDC is deprecated and has been replaced by the . + The current MDC implementation forwards to the ThreadContext.Properties. + + + + If the parameter does not look up to a + previously defined context then null will be returned. + + + + + + Add an entry to the MDC + + The key to store the value under. + The value to store. + + + + The MDC is deprecated and has been replaced by the . + The current MDC implementation forwards to the ThreadContext.Properties. + + + + Puts a context value (the parameter) as identified + with the parameter into the current thread's + context map. + + + If a value is already defined for the + specified then the value will be replaced. If the + is specified as null then the key value mapping will be removed. + + + + + + Removes the key value mapping for the key specified. + + The key to remove. + + + + The MDC is deprecated and has been replaced by the . + The current MDC implementation forwards to the ThreadContext.Properties. + + + + Remove the specified entry from this thread's MDC + + + + + + Clear all entries in the MDC + + + + + The MDC is deprecated and has been replaced by the . + The current MDC implementation forwards to the ThreadContext.Properties. + + + + Remove all the entries from this thread's MDC + + + + + + Implementation of Nested Diagnostic Contexts. + + + + + The NDC is deprecated and has been replaced by the . + The current NDC implementation forwards to the ThreadContext.Stacks["NDC"]. + + + + A Nested Diagnostic Context, or NDC in short, is an instrument + to distinguish interleaved log output from different sources. Log + output is typically interleaved when a server handles multiple + clients near-simultaneously. + + + Interleaved log output can still be meaningful if each log entry + from different contexts had a distinctive stamp. This is where NDCs + come into play. + + + Note that NDCs are managed on a per-thread basis. The NDC class + is made up of static methods that operate on the context of the + calling thread. + + + How to push a message into the context + + using (NDC.Push("my context message")) + { + ... all log calls will have 'my context message' included ... + + } // at the end of the using block the message is automatically removed + + + + Nicko Cadell + Gert Driesen + + + + Gets the current context depth. + + The current context depth. + + + + The NDC is deprecated and has been replaced by the . + The current NDC implementation forwards to the ThreadContext.Stacks["NDC"]. + + + + The number of context values pushed onto the context stack. + + + Used to record the current depth of the context. This can then + be restored using the method. + + + + + + + Clears all the contextual information held on the current thread. + + + + + The NDC is deprecated and has been replaced by the . + The current NDC implementation forwards to the ThreadContext.Stacks["NDC"]. + + + + Clears the stack of NDC data held on the current thread. + + + + + + Creates a clone of the stack of context information. + + A clone of the context info for this thread. + + + + The NDC is deprecated and has been replaced by the . + The current NDC implementation forwards to the ThreadContext.Stacks["NDC"]. + + + + The results of this method can be passed to the + method to allow child threads to inherit the context of their + parent thread. + + + + + + Inherits the contextual information from another thread. + + The context stack to inherit. + + + + The NDC is deprecated and has been replaced by the . + The current NDC implementation forwards to the ThreadContext.Stacks["NDC"]. + + + + This thread will use the context information from the stack + supplied. This can be used to initialize child threads with + the same contextual information as their parent threads. These + contexts will NOT be shared. Any further contexts that + are pushed onto the stack will not be visible to the other. + Call to obtain a stack to pass to + this method. + + + + + + Removes the top context from the stack. + + + The message in the context that was removed from the top + of the stack. + + + + + The NDC is deprecated and has been replaced by the . + The current NDC implementation forwards to the ThreadContext.Stacks["NDC"]. + + + + Remove the top context from the stack, and return + it to the caller. If the stack is empty then an + empty string (not null) is returned. + + + + + + Pushes a new context message. + + The new context message. + + An that can be used to clean up + the context stack. + + + + + The NDC is deprecated and has been replaced by the . + The current NDC implementation forwards to the ThreadContext.Stacks["NDC"]. + + + + Pushes a new context onto the context stack. An + is returned that can be used to clean up the context stack. This + can be easily combined with the using keyword to scope the + context. + + + Simple example of using the Push method with the using keyword. + + using(log4net.NDC.Push("NDC_Message")) + { + log.Warn("This should have an NDC message"); + } + + + + + + Pushes a new context message. + + The new context message string format. + Arguments to be passed into messageFormat. + + An that can be used to clean up + the context stack. + + + + + The NDC is deprecated and has been replaced by the . + The current NDC implementation forwards to the ThreadContext.Stacks["NDC"]. + + + + Pushes a new context onto the context stack. An + is returned that can be used to clean up the context stack. This + can be easily combined with the using keyword to scope the + context. + + + Simple example of using the Push method with the using keyword. + + var someValue = "ExampleContext" + using(log4net.NDC.PushFormat("NDC_Message {0}", someValue)) + { + log.Warn("This should have an NDC message"); + } + + + + + + Removes the context information for this thread. It is + not required to call this method. + + + + + The NDC is deprecated and has been replaced by the . + The current NDC implementation forwards to the ThreadContext.Stacks["NDC"]. + + + + This method is not implemented. + + + + + + Forces the stack depth to be at most . + + The maximum depth of the stack + + + + The NDC is deprecated and has been replaced by the . + The current NDC implementation forwards to the ThreadContext.Stacks["NDC"]. + + + + Forces the stack depth to be at most . + This may truncate the head of the stack. This only affects the + stack in the current thread. Also it does not prevent it from + growing, it only sets the maximum depth at the time of the + call. This can be used to return to a known context depth. + + + + + + The default object Renderer. + + + + The default renderer supports rendering objects and collections to strings. + + + See the method for details of the output. + + + Nicko Cadell + Gert Driesen + + + + Renders the object to a string. + + The map used to lookup renderers + The object to render + The writer to render to + + + Render the object to a string. + + + The parameter is + provided to lookup and render other objects. This is + very useful where contains + nested objects of unknown type. The + method can be used to render these objects. + + + The default renderer supports rendering objects to strings as follows: + + + + Value + Rendered String + + + null + + "(null)" + + + + + + + For a one dimensional array this is the + array type name, an open brace, followed by a comma + separated list of the elements (using the appropriate + renderer), followed by a close brace. + + + For example: int[] {1, 2, 3}. + + + If the array is not one dimensional the + Array.ToString() is returned. + + + + + , & + + + Rendered as an open brace, followed by a comma + separated list of the elements (using the appropriate + renderer), followed by a close brace. + + + For example: {a, b, c}. + + + All collection classes that implement its subclasses, + or generic equivalents all implement the interface. + + + + + + + + Rendered as the key, an equals sign ('='), and the value (using the appropriate + renderer). + + + For example: key=value. + + + + + other + + Object.ToString() + + + + + + + + Render the array argument into a string + + The map used to lookup renderers + the array to render + The writer to render to + + + For a one dimensional array this is the + array type name, an open brace, followed by a comma + separated list of the elements (using the appropriate + renderer), followed by a close brace. For example: + int[] {1, 2, 3}. + + + If the array is not one dimensional the + Array.ToString() is returned. + + + + + + Render the enumerator argument into a string + + The map used to lookup renderers + the enumerator to render + The writer to render to + + + Rendered as an open brace, followed by a comma + separated list of the elements (using the appropriate + renderer), followed by a close brace. For example: + {a, b, c}. + + + + + + Renders the DictionaryEntry argument into a string. + + The map used to lookup renderers + the DictionaryEntry to render + The writer to render to + + + Render the key, an equals sign ('='), and the value (using the appropriate + renderer). For example: key=value. + + + + + + Implement this interface in order to render objects as strings + + + + Certain types require special case conversion to + string form. This conversion is done by an object renderer. + Object renderers implement the + interface. + + + Nicko Cadell + Gert Driesen + + + + Render the object to a string + + The map used to lookup renderers + The object to render + The writer to render to + + + Render the object to a + string. + + + The parameter is + provided to lookup and render other objects. This is + very useful where contains + nested objects of unknown type. The + method can be used to render these objects. + + + + + + Maps types to instances for types that require custom + rendering. + + + + The method is used to render an + object using the appropriate renderers defined in this map, + using a default renderer if no custom renderer is defined for a type. + + + Nicko Cadell + Gert Driesen + + + + Renders using the appropriate renderer. + + the object to render to a string + The object rendered as a string. + + + This is a convenience method used to render an object to a string. + The alternative method + should be used when streaming output to a . + + + + + + Render using the appropriate renderer. + + the object to render to a string + The writer to render to + + + Find the appropriate renderer for the type of the + parameter. This is accomplished by calling the + method. Once a renderer is found, it is + applied on the object and the result is returned + as a . + + + + + + Gets the renderer for the specified object type. + + The object for which to look up the renderer. + the renderer for + + + Gets the renderer for the specified object type. + + + Syntactic sugar method that calls + with the type of the object parameter. + + + + + + Gets the renderer for the specified type + + the type to look up the renderer for + The renderer for the specified type, or if no specific renderer has been defined. + + + + Recursively searches interfaces. + + The type for which to look up the renderer. + The renderer for the specified type, or null if not found. + + + + Gets the default renderer instance + + + + + Clears the map of custom renderers. The + is not removed. + + + + + Registers an for . + + The type that will be rendered by . + The renderer for . + + + + Interface implemented by logger repository plugins. + + + + Plugins define additional behavior that can be associated + with a . + The held by the + property is used to store the plugins for a repository. + + + The log4net.Config.PluginAttribute can be used to + attach plugins to repositories created using configuration + attributes. + + + Nicko Cadell + Gert Driesen + + + + Gets the name of the plugin. + + + The name of the plugin. + + + + Plugins are stored in the + keyed by name. Each plugin instance attached to a + repository must be a unique name. + + + + + + Attaches the plugin to the specified . + + The that this plugin should be attached to. + + + A plugin may only be attached to a single repository. + + + This method is called when the plugin is attached to the repository. + + + + + + Is called when the plugin is to shutdown. + + + + This method is called to notify the plugin that + it should stop operating and should detach from + the repository. + + + + + + Interface used to create plugins. + + + + Interface used to create a plugin. + + + Nicko Cadell + Gert Driesen + + + + Creates the plugin object. + + the new plugin instance + + + Create and return a new plugin instance. + + + + + + A strongly-typed collection of objects. + + Nicko Cadell + + + + Supports type-safe iteration over a . + + + + + + Gets the current element in the collection. + + + + + Advances the enumerator to the next element in the collection. + + + true if the enumerator was successfully advanced to the next element; + false if the enumerator has passed the end of the collection. + + + The collection was modified after the enumerator was created. + + + + + Sets the enumerator to its initial position, before the first element in the collection. + + + + + Creates a read-only wrapper for a PluginCollection instance. + + list to create a readonly wrapper arround + + A PluginCollection wrapper that is read-only. + + + + + Initializes a new instance of the PluginCollection class + that is empty and has the default initial capacity. + + + + + Initializes a new instance of the PluginCollection class + that has the specified initial capacity. + + + The number of elements that the new PluginCollection is initially capable of storing. + + + + + Initializes a new instance of the PluginCollection class + that contains elements copied from the specified PluginCollection. + + The PluginCollection whose elements are copied to the new collection. + + + + Initializes a new instance of the PluginCollection class + that contains elements copied from the specified array. + + The array whose elements are copied to the new list. + + + + Initializes a new instance of the PluginCollection class + that contains elements copied from the specified collection. + + The collection whose elements are copied to the new list. + + + + Initializes a new instance of the PluginCollection class + that contains elements copied from the specified collection. + + The collection whose elements are copied to the new list. + + + + Type visible only to our subclasses + Used to access protected constructor + + + + + + A value + + + + + Allow subclasses to avoid our default constructors + + + + + + Gets the number of elements actually contained in the PluginCollection. + + + + + Copies the entire PluginCollection to a one-dimensional + array. + + The one-dimensional array to copy to. + + + + Copies the entire PluginCollection to a one-dimensional + array, starting at the specified index of the target array. + + The one-dimensional array to copy to. + The zero-based index in at which copying begins. + + + + Gets a value indicating whether access to the collection is synchronized (thread-safe). + + false, because the backing type is an array, which is never thread-safe. + + + + Gets an object that can be used to synchronize access to the collection. + + + + + Gets or sets the at the specified index. + + + The at the specified index. + + The zero-based index of the element to get or set. + + is less than zero. + -or- + is equal to or greater than . + + + + + Adds a to the end of the PluginCollection. + + The to be added to the end of the PluginCollection. + The index at which the value has been added. + + + + Removes all elements from the PluginCollection. + + + + + Creates a shallow copy of the . + + A new with a shallow copy of the collection data. + + + + Determines whether a given is in the PluginCollection. + + The to check for. + true if is found in the PluginCollection; otherwise, false. + + + + Returns the zero-based index of the first occurrence of a + in the PluginCollection. + + The to locate in the PluginCollection. + + The zero-based index of the first occurrence of + in the entire PluginCollection, if found; otherwise, -1. + + + + + Inserts an element into the PluginCollection at the specified index. + + The zero-based index at which should be inserted. + The to insert. + + is less than zero + -or- + is equal to or greater than . + + + + + Removes the first occurrence of a specific from the PluginCollection. + + The to remove from the PluginCollection. + + The specified was not found in the PluginCollection. + + + + + Removes the element at the specified index of the PluginCollection. + + The zero-based index of the element to remove. + + is less than zero. + -or- + is equal to or greater than . + + + + + Gets a value indicating whether the collection has a fixed size. + + true if the collection has a fixed size; otherwise, false. The default is false. + + + + Gets a value indicating whether the IList is read-only. + + true if the collection is read-only; otherwise, false. The default is false. + + + + Returns an enumerator that can iterate through the PluginCollection. + + An for the entire PluginCollection. + + + + Gets or sets the number of elements the PluginCollection can contain. + + + The number of elements the PluginCollection can contain. + + + + + Adds the elements of another PluginCollection to the current PluginCollection. + + The PluginCollection whose elements should be added to the end of the current PluginCollection. + The new of the PluginCollection. + + + + Adds the elements of a array to the current PluginCollection. + + The array whose elements should be added to the end of the PluginCollection. + The new of the PluginCollection. + + + + Adds the elements of a collection to the current PluginCollection. + + The collection whose elements should be added to the end of the PluginCollection. + The new of the PluginCollection. + + + + Adds the elements of a collection to the current PluginCollection. + + The collection whose elements should be added to the end of the PluginCollection. + The new of the PluginCollection. + + + + Sets the capacity to the actual number of elements. + + + + + is less than zero. + -or- + is equal to or greater than . + + + + + is less than zero. + -or- + is equal to or greater than . + + + + + Supports simple iteration over a . + + + + + + Initializes a new instance of the Enumerator class. + + + + + + Gets the current element in the collection. + + + + + Advances the enumerator to the next element in the collection. + + + true if the enumerator was successfully advanced to the next element; + false if the enumerator has passed the end of the collection. + + + The collection was modified after the enumerator was created. + + + + + Sets the enumerator to its initial position, before the first element in the collection. + + + + + + + + Map of repository plugins. + + The repository that the plugins should be attached to. + + + This class is a name keyed map of the plugins that are + attached to a repository. + + + Nicko Cadell + Gert Driesen + + + + Map of repository plugins. + + The repository that the plugins should be attached to. + + + This class is a name keyed map of the plugins that are + attached to a repository. + + + Nicko Cadell + Gert Driesen + + + + Gets a by name. + + The name of the to lookup. + + The from the map with the name specified, or + null if no plugin is found. + + + + + Gets all possible plugins as a list of objects. + + All possible plugins as a list of objects. + + + + Adds a to the map. + + The to add to the map. + + + The will be attached to the repository when added. + + + If there already exists a plugin with the same name + attached to the repository then the old plugin will + be and replaced with + the new plugin. + + + + + + Removes an from the map. + + The to remove from the map. + + + + Base implementation of + + + + Default abstract implementation of the + interface. This base class can be used by implementors + of the interface. + + + Nicko Cadell + Gert Driesen + + + + Constructor + + the name of the plugin + + Initializes a new Plugin with the specified name. + + + + + Gets or sets the name of the plugin. + + + The name of the plugin. + + + + Plugins are stored in the + keyed by name. Each plugin instance attached to a + repository must be a unique name. + + + The name of the plugin must not change once the + plugin has been attached to a repository. + + + + + + Attaches this plugin to a . + + The that this plugin should be attached to. + + + A plugin may only be attached to a single repository. + + + This method is called when the plugin is attached to the repository. + + + + + + Is called when the plugin is to shutdown. + + + + This method is called to notify the plugin that + it should stop operating and should detach from + the repository. + + + + + + The repository for this plugin + + + The that this plugin is attached to. + + + + Gets or sets the that this plugin is + attached to. + + + + + + + + + + + + + + + + + + + + + + Default implementation of + + + + This default implementation of the + interface is used to create the default subclass + of the object. + + + Nicko Cadell + Gert Driesen + + + + Create a new instance with the specified name. + + The that will own the . + The name of the . If null, the root logger is returned. + The instance for the specified name. + + + Called by the to create + new named instances. + + + + + + Default internal subclass of + + + + This subclass has no additional behavior over the + class but does allow instances + to be created. + + + + + + Initializes a new instance of the class + with the specified name. + + the name of the logger + + + + Delegate used to handle logger creation event notifications. + + The in which the has been created. + The event args that hold the instance that has been created. + + + + Provides data for the event. + + + + A event is raised every time a is created. + + + The that has been created. + + + + Provides data for the event. + + + + A event is raised every time a is created. + + + The that has been created. + + + + Gets the that has been created. + + + + + Hierarchical organization of loggers + + + + The casual user should not have to deal with this class directly. + + + This class is specialized in retrieving loggers by name and also maintaining the logger + hierarchy. Implements the interface. + + + The structure of the logger hierarchy is maintained by the + method. The hierarchy is such that children + link to their parent but parents do not have any references to their + children. Moreover, loggers can be instantiated in any order, in + particular descendant before ancestor. + + + In case a descendant is created before a particular ancestor, then it creates a provision node + for the ancestor and adds itself to the provision node. Other descendants of the same ancestor + add themselves to the previously created provision node. + + + Nicko Cadell + Gert Driesen + The properties to pass to this repository. + The factory to use to create new logger instances. + + + + Hierarchical organization of loggers + + + + The casual user should not have to deal with this class directly. + + + This class is specialized in retrieving loggers by name and also maintaining the logger + hierarchy. Implements the interface. + + + The structure of the logger hierarchy is maintained by the + method. The hierarchy is such that children + link to their parent but parents do not have any references to their + children. Moreover, loggers can be instantiated in any order, in + particular descendant before ancestor. + + + In case a descendant is created before a particular ancestor, then it creates a provision node + for the ancestor and adds itself to the provision node. Other descendants of the same ancestor + add themselves to the previously created provision node. + + + Nicko Cadell + Gert Driesen + The properties to pass to this repository. + The factory to use to create new logger instances. + + + + The fully qualified type of the Hierarchy class. + + + Used by the internal logger to record the type of the log message. + + + + + Event used to notify that a logger has been created. + + + + + Default constructor + + + + + Construct with properties + + The properties to pass to this repository. + + + + Construct with a logger factory + + The factory to use to create new logger instances. + + + + Has no appender warning been emitted + + + Flag to indicate if we have already issued a warning about not having an appender warning. + + + + + Get the root of this hierarchy + + + + + Gets or sets the default instance. + + + + The logger factory is used to create logger instances. + + + + + + Test if a logger exists + + The name of the logger to lookup + The Logger object with the name specified + + + Check if the named logger exists in the hierarchy. If so return + its reference, otherwise returns . + + + + + + Returns all the currently defined loggers in the hierarchy as an Array + + All the defined loggers + + + Returns all the currently defined loggers in the hierarchy as an Array. + The root logger is not included in the returned + enumeration. + + + + + + Return a new logger instance named as the first parameter using + the default factory. + + + If a logger of that name already exists, then it will be + returned. Otherwise, a new logger will be instantiated and + then linked with its existing ancestors as well as children. + + The name of the logger to retrieve + The logger object with the name specified + + + + Shutting down a hierarchy will safely close and remove + all appenders in all loggers including the root logger. + + + + Shutting down a hierarchy will safely close and remove + all appenders in all loggers including the root logger. + + + Some appenders need to be closed before the + application exists. Otherwise, pending logging events might be + lost. + + + The method is careful to close nested + appenders before closing regular appenders. This allows + configurations where a regular appender is attached to a logger + and again to a nested appender. + + + + + + Reset all values contained in this hierarchy instance to their default. + + + + Reset all values contained in this hierarchy instance to their + default. This removes all appenders from all loggers, sets + the level of all non-root loggers to , + sets their additivity flag to and sets the level + of the root logger to . Moreover, + message disabling is set its default "off" value. + + + Existing loggers are not removed. They are just reset. + + + This method should be used sparingly and with care as it will + block all logging until it is completed. + + + + + + Log the logEvent through this hierarchy. + + the event to log + + + This method should not normally be used to log. + The interface should be used + for routine logging. This interface can be obtained + using the method. + + + The is delivered to the appropriate logger and + that logger is then responsible for logging the event. + + + + + + Returns all the Appenders that are currently configured + + An array containing all the currently configured appenders + + + Returns all the instances that are currently configured. + All the loggers are searched for appenders. The appenders may also be containers + for appenders and these are also searched for additional loggers. + + + The list returned is unordered but does not contain duplicates. + + + + + + Collect the appenders from an . + The appender may also be a container. + + + + + Collect the appenders from an container + + + + + Initialize the log4net system using the specified appender + + the appender to use to log all logging events + + + + Initialize the log4net system using the specified appenders + + the appenders to use to log all logging events + + + + Initialize the log4net system using the specified appenders + + the appenders to use to log all logging events + + + This method provides the same functionality as the + method implemented + on this object, but it is protected and therefore can be called by subclasses. + + + + + + Initialize the log4net system using the specified config + + the element containing the root of the config + + + + Initialize the log4net system using the specified config + + the element containing the root of the config + + + This method provides the same functionality as the + method implemented + on this object, but it is protected and therefore can be called by subclasses. + + + + + + Test if this hierarchy is disabled for the specified . + + The level to check against. + + if the repository is disabled for the level argument, otherwise. + + + If this hierarchy has not been configured then this method will always return . + See also the property. + + + + + Clear all logger definitions from the internal hashtable + + + + This call will clear all logger definitions from the internal + hashtable. Invoking this method will irrevocably mess up the + logger hierarchy. + + + You should really know what you are doing before invoking this method. + + + + + + Returns a new logger instance named as the first parameter using + . + + The name of the logger to retrieve + The factory that will make the new logger instance + The logger object with the name specified + + + If a logger of that name already exists, then it will be + returned. Otherwise, a new logger will be instantiated by the + parameter and linked with its existing + ancestors as well as children. + + + + + + Sends a logger creation event to all registered listeners + + The newly created logger + + Raises the logger creation event. + + + + + Updates all the parents of the specified logger + + The logger to update the parents for + + + This method loops through all the potential parents of + . There 3 possible cases: + + + + No entry for the potential parent of exists + + We create a ProvisionNode for this potential + parent and insert in that provision node. + + + + The entry is of type Logger for the potential parent. + + The entry is 's nearest existing parent. We + update 's parent field with this entry. We also break from + the loop because updating our parent's parent is our parent's + responsibility. + + + + The entry is of type ProvisionNode for this potential parent. + + We add to the list of children for this potential parent. + + + + + + + + Replace a with a in the hierarchy. + + + + We update the links for all the children that placed themselves + in the provision node 'pn'. The second argument 'log' is a + reference for the newly created Logger, parent of all the + children in 'pn'. + + + We loop on all the children 'c' in 'pn'. + + + If the child 'c' has been already linked to a child of + 'log' then there is no need to update 'c'. + + + Otherwise, we set log's parent field to c's parent and set + c's parent field to log. + + + + + + Define or redefine a Level using the values in the argument + + the level values + + Supports setting levels via the configuration file. + + + + + A class to hold the value, name and display name for a level + + + + + Value of the level + + + If the value is not set (defaults to -1) the value will be looked + up for the current level with the same name. + + + + + Name of the level + + + + + Display name for the level + + + + + Override Object.ToString to return sensible debug info + + string info about this object + + + + Set a Property using the values in the argument + + the property value + + Supports setting property values via the configuration file. + + + + + Interface abstracts creation of instances + + + + This interface is used by the to + create new objects. + + + The method is called + to create a named . + + + Implement this interface to create new subclasses of . + + + Nicko Cadell + Gert Driesen + + + + Create a new instance + + The that will own the . + The name of the . + The instance for the specified name. + + + Create a new instance with the + specified name. + + + Called by the to create + new named instances. + + + If the is null then the root logger + must be returned. + + + + + + Implementation of used by + + The name of the . + + + Internal class used to provide implementation of + interface. Applications should use to get + logger instances. + + + This is one of the central classes in the log4net implementation. One of the + distinctive features of log4net are hierarchical loggers and their + evaluation. The organizes the + instances into a rooted tree hierarchy. + + + The class is abstract. Only concrete subclasses of + can be created. The + is used to create instances of this type for the . + + + Nicko Cadell + Gert Driesen + Aspi Havewala + Douglas de la Torre + + + + Implementation of used by + + The name of the . + + + Internal class used to provide implementation of + interface. Applications should use to get + logger instances. + + + This is one of the central classes in the log4net implementation. One of the + distinctive features of log4net are hierarchical loggers and their + evaluation. The organizes the + instances into a rooted tree hierarchy. + + + The class is abstract. Only concrete subclasses of + can be created. The + is used to create instances of this type for the . + + + Nicko Cadell + Gert Driesen + Aspi Havewala + Douglas de la Torre + + + + The fully qualified type of the Logger class. + + + + + The parent of this logger. + + + + All loggers have at least one ancestor which is the root logger. + + + + + + Loggers need to know what Hierarchy they are in. + + + + + Helper implementation of the interface + + + + + Lock to protect AppenderAttachedImpl variable appenderAttachedImpl + + + + + Gets or sets the parent logger in the hierarchy. + + + The parent logger in the hierarchy. + + + + Part of the Composite pattern that makes the hierarchy. + The hierarchy is parent linked rather than child linked. + + + + + + Gets or sets a value indicating if child loggers inherit their parent's appenders. + + + if child loggers inherit their parent's appenders. + + + + Additivity is set to by default, that is children inherit + the appenders of their ancestors by default. If this variable is + set to then the appenders found in the + ancestors of this logger are not used. However, the children + of this logger will inherit its appenders, unless the children + have their additivity flag set to too. See + the user manual for more details. + + + + + + Gets the effective level for this logger. + + The nearest level in the logger hierarchy. + + + Starting from this logger, searches the logger hierarchy for a + non-null level and returns it. Otherwise, returns the level of the + root logger. + + The Logger class is designed so that this method executes as + quickly as possible. + + + + + Gets or sets the where this instance is attached to. + + + + + Gets or sets the assigned for this Logger. + + + + + Add to the list of appenders of this + Logger instance. + + An appender to add to this logger + + + If is already in the list of + appenders, then it won't be added again. + + + + + + Get the appenders contained in this logger as an + . + + + A collection of the appenders in this logger. If no appenders + can be found, then a is returned. + + + + + Look for the appender named as + + The name of the appender to lookup + The appender with the name specified, or . + + + + Removes all previously added appenders from this Logger instance. + + + + This is useful when re-reading configuration information. + + + + + + Remove the appender passed as parameter form the list of appenders. + + The appender to remove + The appender removed from the list + + + The appender removed is not closed. + If you are discarding the appender you must call + on the appender removed. + + + + + + Remove the appender passed as parameter form the list of appenders. + + The name of the appender to remove + The appender removed from the list + + + The appender removed is not closed. + If you are discarding the appender you must call + on the appender removed. + + + + + + Gets the logger name. + + + + + Generates a logging event for the specified using + the and . + + The declaring type of the method that is + the stack boundary into the logging system for this call. + The level of the message to be logged. + The message object to log. + The exception to log, including its stack trace. + + + This generic form is intended to be used by wrappers. + + + This method must not throw any exception to the caller. + + + + + + Logs the specified logging event through this logger. + + The event being logged. + + + This is the most generic printing method that is intended to be used + by wrappers. + + + This method must not throw any exception to the caller. + + + + + + Checks if this logger is enabled for a given passed as parameter. + + The level to check. + + if this logger is enabled for , + otherwise . + + + + This method must not throw any exception to the caller. + + + + + + Gets the where this + instance is attached to. + + + + + Deliver the to the attached appenders. + + The event to log. + + + Call the appenders in the hierarchy starting at . + If no appenders could be found, emit a warning. + + + This method calls all the appenders inherited from the + hierarchy circumventing any evaluation of whether to log or not + to log the particular log request. + + + + + + Closes all attached appenders implementing the interface. + + + + Used to ensure that the appenders are correctly shutdown. + + + + + + This is the most generic printing method. This generic form is intended to be used by wrappers + + The level of the message to be logged. + The message object to log. + The exception to log, including its stack trace. + + + Generate a logging event for the specified using + the . + + + + + + Creates a new logging event and logs the event without further checks. + + The declaring type of the method that is + the stack boundary into the logging system for this call. + The level of the message to be logged. + The message object to log. + The exception to log, including its stack trace. + + + Generates a logging event and delivers it to the attached + appenders. + + + + + + Creates a new logging event and logs the event without further checks. + + The event being logged. + + + Delivers the logging event to the attached appenders. + + + + + + Used internally to accelerate hash table searches. + + + + Internal class used to improve performance of + string keyed hashtables. + + + The hashcode of the string is cached for reuse. + The string is stored as an interned value. + When comparing two objects for equality + the reference equality of the interned strings is compared. + + + Nicko Cadell + Gert Driesen + + + + Construct key with string name + + + + Initializes a new instance of the class + with the specified name. + + + Stores the hashcode of the string and interns + the string key to optimize comparisons. + + + The Compact Framework 1.0 the + method does not work. On the Compact Framework + the string keys are not interned nor are they + compared by reference. + + + The name of the logger. + + + + Returns a hash code for the current instance. + + A hash code for the current instance. + + + Returns the cached hashcode. + + + + + + Name of the Logger + + + + + Provision nodes are used where no logger instance has been specified + + + + instances are used in the + when there is no specified + for that node. + + + A provision node holds a list of child loggers on behalf of a logger that does not exist. + + + Nicko Cadell + Gert Driesen + + + + Create a new provision node with child node + + A child logger to add to this node. + + + + Add a to the internal List + + Logger + + + + Calls for each logger in the internal list + + Callback to execute + Parant logger + + + + The sits at the root of the logger hierarchy tree. + + + + The is a regular except + that it provides several guarantees. + + + First, it cannot be assigned a null + level. Second, since the root logger cannot have a parent, the + property always returns the value of the + level field without walking the hierarchy. + + + Nicko Cadell + Gert Driesen + + + + Construct a + + The level to assign to the root logger. + + + Initializes a new instance of the class with + the specified logging level. + + + The root logger names itself as "root". However, the root + logger cannot be retrieved by name. + + + + + + Gets the assigned level value without walking the logger hierarchy. + + The assigned level value without walking the logger hierarchy. + + + Because the root logger cannot have a parent and its level + must not be null this property just returns the + value of . + + + + + + Gets or sets the assigned for the root logger. + + + The of the root logger. + + + + Setting the level of the root logger to a null reference + may have catastrophic results. We prevent this here. + + + + + + The fully qualified type of the RootLogger class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Initializes the log4net environment using an XML DOM. + + The hierarchy to build. + Nicko Cadell + Gert Driesen + + + + Initializes the log4net environment using an XML DOM. + + The hierarchy to build. + Nicko Cadell + Gert Driesen + + + + Configure the hierarchy by parsing a DOM tree of XML elements. + + The root element to parse. + + + Configure the hierarchy by parsing a DOM tree of XML elements. + + + + + + Parse appenders by IDREF. + + The appender ref element. + The instance of the appender that the ref refers to. + + + Parse an XML element that represents an appender and return + the appender. + + + + + + Parses an appender element. + + The appender element. + The appender instance or null when parsing failed. + + + Parse an XML element that represents an appender and return + the appender instance. + + + + + + Parses a logger element. + + The logger element. + + + Parse an XML element that represents a logger. + + + + + + Parses the root logger element. + + The root element. + + + Parse an XML element that represents the root logger. + + + + + + Parses the children of a logger element. + + The category element. + The logger instance. + Flag to indicate if the logger is the root logger. + + + Parse the child elements of a <logger> element. + + + + + + Parses an object renderer. + + The renderer element. + + + Parse an XML element that represents a renderer. + + + + + + Parses a level element. + + The level element. + The logger object to set the level on. + Flag to indicate if the logger is the root logger. + + + Parse an XML element that represents a level. + + + + + + Sets a parameter on an object. + + The parameter element. + The object to set the parameter on. + + The parameter name must correspond to a writable property + on the object. The value of the parameter is a string, + therefore this function will attempt to set a string + property first. If unable to set a string property it + will inspect the property and its argument type. It will + attempt to call a static method called Parse on the + type of the property. This method will take a single + string argument and return a value that can be used to + set the property. + + + + + Test if an element has no attributes or child elements + + the element to inspect + true if the element has any attributes or child elements, false otherwise + + + + Test if a is constructible with Activator.CreateInstance. + + the type to inspect + true if the type is creatable using a default constructor, false otherwise + + + + Look for a method on the that matches the supplied + + the type that has the method + the name of the method + the method info found + + + The method must be a public instance method on the . + The method must be named or "Add" followed by . + The method must take a single parameter. + + + + + + Converts a string value to a target type. + + The type of object to convert the string to. + The string value to use as the value of the object. + + + An object of type with value or + null when the conversion could not be performed. + + + + + + Creates an object as specified in XML. + + The XML element that contains the definition of the object. + The object type to use if not explicitly specified. + The type that the returned object must be or must inherit from. + The object or null + + + Parse an XML element and create an object instance based on the configuration + data. + + + The type of the instance may be specified in the XML. If not + specified then the is used + as the type. However the type is specified it must support the + type. + + + + + + key: appenderName, value: appender. + + + + + The fully qualified type of the XmlHierarchyConfigurator class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Basic Configurator interface for repositories + + + + Interface used by basic configurator to configure a + with a default . + + + A should implement this interface to support + configuration by the . + + + Nicko Cadell + Gert Driesen + + + + Initialize the repository using the specified appender + + the appender to use to log all logging events + + + Configure the repository to route all logging events to the + specified appender. + + + + + + Initialize the repository using the specified appenders + + the appenders to use to log all logging events + + + Configure the repository to route all logging events to the + specified appenders. + + + + + + Delegate used to handle logger repository shutdown event notifications. + + The that is shutting down. + Empty event args + + + + Delegate used to handle logger repository configuration reset event notifications. + + The that has had its configuration reset. + Empty event args + + + + Delegate used to handle event notifications for logger repository configuration changes. + + The that has had its configuration changed. + Empty event arguments. + + + + Interface implemented by logger repositories, e.g. , and used by the + to obtain instances. + + Nicko Cadell + Gert Driesen + + + + Gets or sets the name of the repository. + + + + + Gets the map from types to instances for custom rendering. + + + + + Gets the map from plugin name to plugin value for plugins attacked to this repository. + + + + + Gets the map from level names and values for this repository. + + + + + Gets or sets the threshold for all events in this repository. + + + + + Gets the named logger, or null. + + The name of the logger to look up. + The logger if found, or null. + + + + Gets all the currently defined loggers. + + + + + Returns a named logger instance + + The name of the logger to retrieve + The logger object with the name specified + + + Returns a named logger instance. + + + If a logger of that name already exists, then it will be + returned. Otherwise, a new logger will be instantiated and + then linked with its existing ancestors as well as children. + + + + + + Shuts down the repository, safely closing and removing + all appenders in all loggers including the root logger. + + + + Some appenders need to be closed before the + application exists. Otherwise, pending logging events might be + lost. + + + The method is careful to close nested + appenders before closing regular appenders. This allows + configurations where a regular appender is attached to a logger + and again to a nested appender. + + + + + + Resets the repository configuration to a default state. Loggers are reset but not removed. + + + + This method should be used sparingly and with care as it will + block all logging until it is completed. + + + + + + Logs a through this repository. + + The event to log. + + + This method should not normally be used to log. + The interface should be used + for routine logging. This interface can be obtained + using the method. + + + The logEvent is delivered to the appropriate logger and + that logger is then responsible for logging the event. + + + + + + Gets or sets a value that indicates whether this repository has been configured. + + + + + Collection of internal messages captured during the most + recent configuration process. + + + + + Event to notify that the repository has been shut down. + + + + + Event to notify that the repository has had its configuration reset to default. + + + + + Event to notify that the repository's configuration has changed. + + + + + Repository specific properties. + + + + + Gets all Appenders that are configured for this repository. + + + + + Configure repository using XML + + + + Interface used by Xml configurator to configure a . + + + A should implement this interface to support + configuration by the . + + + Nicko Cadell + Gert Driesen + + + + Initialize the repository using the specified config + + the element containing the root of the config + + + The schema for the XML configuration data is defined by + the implementation. + + + + + + Base implementation of + + + + Default abstract implementation of the interface. + + + Skeleton implementation of the interface. + All types can extend this type. + + + Nicko Cadell + Gert Driesen + + + + Default Constructor + + + + Initializes the repository with default (empty) properties. + + + + + + Construct the repository using specific properties + + the properties to set for this repository + + + Initializes the repository with specified properties. + + + + + + The name of the repository + + + The string name of the repository + + + + The name of this repository. The name is + used to store and lookup the repositories + stored by the . + + + + + + The threshold for all events in this repository + + + The threshold for all events in this repository + + + + The threshold for all events in this repository + + + + + + RendererMap accesses the object renderer map for this repository. + + + RendererMap accesses the object renderer map for this repository. + + + + RendererMap accesses the object renderer map for this repository. + + + The RendererMap holds a mapping between types and + objects. + + + + + + The plugin map for this repository. + + + The plugin map for this repository. + + + + The plugin map holds the instances + that have been attached to this repository. + + + + + + Get the level map for the Repository. + + + + Get the level map for the Repository. + + + The level map defines the mappings between + level names and objects in + this repository. + + + + + + Test if logger exists + + The name of the logger to lookup + The Logger object with the name specified + + + Check if the named logger exists in the repository. If so return + its reference, otherwise returns null. + + + + + + Returns all the currently defined loggers in the repository + + All the defined loggers + + + Returns all the currently defined loggers in the repository as an Array. + + + + + + Return a new logger instance + + The name of the logger to retrieve + The logger object with the name specified + + + Return a new logger instance. + + + If a logger of that name already exists, then it will be + returned. Otherwise, a new logger will be instantiated and + then linked with its existing ancestors as well as children. + + + + + + Shutdown the repository + + + + Shutdown the repository. Can be overridden in a subclass. + This base class implementation notifies the + listeners and all attached plugins of the shutdown event. + + + + + + Reset the repositories configuration to a default state + + + + Reset all values contained in this instance to their + default state. + + + Existing loggers are not removed. They are just reset. + + + This method should be used sparingly and with care as it will + block all logging until it is completed. + + + + + + Log the logEvent through this repository. + + the event to log + + + This method should not normally be used to log. + The interface should be used + for routine logging. This interface can be obtained + using the method. + + + The logEvent is delivered to the appropriate logger and + that logger is then responsible for logging the event. + + + + + + Flag indicates if this repository has been configured. + + + + + Contains a list of internal messages captured during the + last configuration. + + + + + Event to notify that the repository has been shutdown. + + + Event to notify that the repository has been shutdown. + + + + Event raised when the repository has been shutdown. + + + + + + Event to notify that the repository has had its configuration reset. + + + Event to notify that the repository has had its configuration reset. + + + + Event raised when the repository's configuration has been + reset to default. + + + + + + Event to notify that the repository has had its configuration changed. + + + Event to notify that the repository has had its configuration changed. + + + + Event raised when the repository's configuration has been changed. + + + + + + Repository specific properties + + + Repository specific properties + + + These properties can be specified on a repository specific basis + + + + + Returns all the Appenders that are configured as an Array. + + All the Appenders + + + Returns all the Appenders that are configured as an Array. + + + + + + The fully qualified type of the LoggerRepositorySkeleton class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Adds an object renderer for a specific class. + + The type that will be rendered by the renderer supplied. + The object renderer used to render the object. + + + Adds an object renderer for a specific class. + + + + + + Notify the registered listeners that the repository is shutting down + + Empty EventArgs + + + Notify any listeners that this repository is shutting down. + + + + + + Notify the registered listeners that the repository has had its configuration reset + + Empty EventArgs + + + Notify any listeners that this repository's configuration has been reset. + + + + + + Notify the registered listeners that the repository has had its configuration changed + + Empty EventArgs + + + + Raise a configuration changed event on this repository + + EventArgs.Empty + + + Applications that programmatically change the configuration of the repository should + raise this event notification to notify listeners. + + + + + + Flushes all configured Appenders that implement . + + The maximum time in milliseconds to wait for logging events from asynchronous appenders to be flushed, + or to wait indefinitely. + True if all logging events were flushed successfully, else false. + + + + The log4net Thread Context. + + + + The ThreadContext provides a location for thread specific debugging + information to be stored. + The ThreadContext properties override any + properties with the same name. + + + The thread context has a properties map and a stack. + The properties and stack can + be included in the output of log messages. The + supports selecting and outputting these properties. + + + The Thread Context provides a diagnostic context for the current thread. + This is an instrument for distinguishing interleaved log + output from different sources. Log output is typically interleaved + when a server handles multiple clients near-simultaneously. + + + The Thread Context is managed on a per thread basis. + + + Example of using the thread context properties to store a username. + + ThreadContext.Properties["user"] = userName; + log.Info("This log message has a ThreadContext Property called 'user'"); + + + Example of how to push a message into the context stack + + using(ThreadContext.Stacks["NDC"].Push("my context message")) + { + log.Info("This log message has a ThreadContext Stack message that includes 'my context message'"); + + } // at the end of the using block the message is automatically popped + + + + Nicko Cadell + + + + The thread properties map + + + The thread properties map + + + + The ThreadContext properties override any + properties with the same name. + + + + + + The thread stacks + + + stack map + + + + The thread local stacks. + + + + + + A straightforward implementation of the interface. + + + + This is the default implementation of the + interface. Implementors of the interface + should aggregate an instance of this type. + + + Nicko Cadell + Gert Driesen + + + + Constructor + + + + Initializes a new instance of the class. + + + + + + Append on on all attached appenders. + + The event being logged. + The number of appenders called. + + + Calls the method on all + attached appenders. + + + + + + Append on on all attached appenders. + + The array of events being logged. + The number of appenders called. + + + Calls the method on all + attached appenders. + + + + + + Calls the DoAppende method on the with + the objects supplied. + + The appender + The events + + + If the supports the + interface then the will be passed + through using that interface. Otherwise the + objects in the array will be passed one at a time. + + + + + + Attaches an appender. + + The appender to add. + + + If the appender is already in the list it won't be added again. + + + + + + Gets all attached appenders. + + + A collection of attached appenders, or null if there + are no attached appenders. + + + + The read only collection of all currently attached appenders. + + + + + + Gets an attached appender with the specified name. + + The name of the appender to get. + + The appender with the name specified, or null if no appender with the + specified name is found. + + + + Lookup an attached appender by name. + + + + + + Removes all attached appenders. + + + + Removes and closes all attached appenders + + + + + + Removes the specified appender from the list of attached appenders. + + The appender to remove. + The appender removed from the list + + + The appender removed is not closed. + If you are discarding the appender you must call + on the appender removed. + + + + + + Removes the appender with the specified name from the list of appenders. + + The name of the appender to remove. + The appender removed from the list + + + The appender removed is not closed. + If you are discarding the appender you must call + on the appender removed. + + + + + + List of appenders + + + + + Array of appenders, used to cache the appenderList + + + + + The fully qualified type of the AppenderAttachedImpl class. + + + Used by the internal logger to record the Type of the + log message. + + + + + This class aggregates several PropertiesDictionary collections together. + + + + Provides a dictionary style lookup over an ordered list of + collections. + + + Nicko Cadell + + + + Constructor + + + + Initializes a new instance of the class. + + + + + + Gets the value of a property + + + The value for the property with the specified key + + + + Looks up the value for the specified. + The collections are searched + in the order in which they were added to this collection. The value + returned is the value held by the first collection that contains + the specified key. + + + If none of the collections contain the specified key then + null is returned. + + + + + + Add a Properties Dictionary to this composite collection + + the properties to add + + + Properties dictionaries added first take precedence over dictionaries added + later. + + + + + + Flatten this composite collection into a single properties dictionary + + the flattened dictionary + + + Reduces the collection of ordered dictionaries to a single dictionary + containing the resultant values for the keys. + + + + + + Base class for Context Properties implementations + + Nicko Cadell + + + + Gets or sets the value of a property. + + + + + Wrapper class used to map converter names to converter types + + + + Pattern converter info class used during configuration by custom + PatternString and PatternLayer converters. + + + + + + Gets or sets the name of the conversion pattern in the format string. + + + + + Gets or sets the type of the converter. The type must extend . + + + + + + + + + + + + + + + + Subclass of that maintains a count of + the number of bytes written. + + + + This writer counts the number of bytes written. + + + Nicko Cadell + Gert Driesen + + + + Constructor + + The to actually write to. + The to report errors to. + + + Creates a new instance of the class + with the specified and . + + + + + + Writes a character to the underlying writer and counts the number of bytes written. + + the char to write + + + Overrides implementation of . Counts + the number of bytes written. + + + + + + Writes a buffer to the underlying writer and counts the number of bytes written. + + the buffer to write + the start index to write from + the number of characters to write + + + Overrides implementation of . Counts + the number of bytes written. + + + + + + Writes a string to the output and counts the number of bytes written. + + The string data to write to the output. + + + Overrides implementation of . Counts + the number of bytes written. + + + + + + Gets or sets the total number of bytes written. + + + The total number of bytes written. + + + + Gets or sets the total number of bytes written. + + + + + + A fixed size rolling buffer of logging events. + + + + An array backed fixed size leaky bucket. + + + Nicko Cadell + Gert Driesen + + + + Constructor + + The maximum number of logging events in the buffer. + + + Initializes a new instance of the class with + the specified maximum number of buffered logging events. + + + The argument is not a positive integer. + + + + Appends a to the buffer. + + The event to append to the buffer. + The event discarded from the buffer, if the buffer is full, otherwise null. + + + Append an event to the buffer. If the buffer still contains free space then + null is returned. If the buffer is full then an event will be dropped + to make space for the new event, the dropped event is returned. + + + + + + Get and remove the oldest event in the buffer. + + The oldest logging event in the buffer + + + Gets the oldest (first) logging event in the buffer and removes it + from the buffer. + + + + + + Pops all the logging events from the buffer into an array. + + An array of all the logging events in the buffer. + + + Get all the events in the buffer and clear the buffer. + + + + + + Clear the buffer + + + + Clear the buffer of all events. The events in the buffer are lost. + + + + + + Gets the th oldest event currently in the buffer. + + + + If is outside the range 0 to the number of events + currently in the buffer, then null is returned. + + + + + + Gets the maximum size of the buffer. + + The maximum size of the buffer. + + + Gets the maximum size of the buffer + + + + + + Gets the number of logging events in the buffer. + + The number of logging events in the buffer. + + + This number is guaranteed to be in the range 0 to + (inclusive). + + + + + + An always empty . + + + + A singleton implementation of the + interface that always represents an empty collection. + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + + Uses a private access modifier to enforce the singleton pattern. + + + + + + Gets the singleton instance of the empty collection. + + The singleton instance of the empty collection. + + + Gets the singleton instance of the empty collection. + + + + + + Copies the elements of the to an + , starting at a particular Array index. + + The one-dimensional + that is the destination of the elements copied from + . The Array must have zero-based + indexing. + The zero-based index in array at which + copying begins. + + + As the collection is empty no values are copied into the array. + + + + + + Gets a value indicating if access to the is synchronized (thread-safe). + + + true if access to the is synchronized (thread-safe); otherwise, false. + + + + For the this property is always true. + + + + + + Gets the number of elements contained in the . + + + The number of elements contained in the . + + + + As the collection is empty the is always 0. + + + + + + Gets an object that can be used to synchronize access to the . + + + An object that can be used to synchronize access to the . + + + + As the collection is empty and thread safe and synchronized this instance is also + the object. + + + + + + Returns an enumerator that can iterate through a collection. + + + An that can be used to + iterate through the collection. + + + + As the collection is empty a is returned. + + + + + + An always empty . + + + + A singleton implementation of the + interface that always represents an empty collection. + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + + Uses a private access modifier to enforce the singleton pattern. + + + + + + Gets the singleton instance of the . + + The singleton instance of the . + + + Gets the singleton instance of the . + + + + + + Copies the elements of the to an + , starting at a particular Array index. + + The one-dimensional + that is the destination of the elements copied from + . The Array must have zero-based + indexing. + The zero-based index in array at which + copying begins. + + + As the collection is empty no values are copied into the array. + + + + + + Gets a value indicating if access to the is synchronized (thread-safe). + + + true if access to the is synchronized (thread-safe); otherwise, false. + + + + For the this property is always true. + + + + + + Gets the number of elements contained in the + + + The number of elements contained in the . + + + + As the collection is empty the is always 0. + + + + + + Gets an object that can be used to synchronize access to the . + + + An object that can be used to synchronize access to the . + + + + As the collection is empty and thread safe and synchronized this instance is also + the object. + + + + + + Returns an enumerator that can iterate through a collection. + + + An that can be used to + iterate through the collection. + + + + As the collection is empty a is returned. + + + + + + Adds an element with the provided key and value to the + . + + The to use as the key of the element to add. + The to use as the value of the element to add. + + + As the collection is empty no new values can be added. A + is thrown if this method is called. + + + This dictionary is always empty and cannot be modified. + + + + Removes all elements from the . + + + + As the collection is empty no values can be removed. A + is thrown if this method is called. + + + This dictionary is always empty and cannot be modified. + + + + Determines whether the contains an element + with the specified key. + + The key to locate in the . + false + + + As the collection is empty the method always returns false. + + + + + + Returns an enumerator that can iterate through a collection. + + + An that can be used to + iterate through the collection. + + + + As the collection is empty a is returned. + + + + + + Removes the element with the specified key from the . + + The key of the element to remove. + + + As the collection is empty no values can be removed. A + is thrown if this method is called. + + + This dictionary is always empty and cannot be modified. + + + + Gets a value indicating whether the has a fixed size. + + true + + + As the collection is empty always returns true. + + + + + + Gets a value indicating whether the is read-only. + + true + + + As the collection is empty always returns true. + + + + + + Gets an containing the keys of the . + + An containing the keys of the . + + + As the collection is empty a is returned. + + + + + + Gets an containing the values of the . + + An containing the values of the . + + + As the collection is empty a is returned. + + + + + + Gets or sets the element with the specified key. + + The key of the element to get or set. + null + + + As the collection is empty no values can be looked up or stored. + If the index getter is called then null is returned. + A is thrown if the setter is called. + + + This dictionary is always empty and cannot be modified. + + + + Wrapper for an + + acts like the wrapped encoding, but without a preamble + + + + + + + wraps the in case it has a preamble + + Encoding to check + encoding without preamble + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Contain the information obtained when parsing formatting modifiers + in conversion modifiers. + + + + Holds the formatting information extracted from the format string by + the . This is used by the + objects when rendering the output. + + + Nicko Cadell + Gert Driesen + + + + Defaut Constructor + + + + Initializes a new instance of the class. + + + + + + Constructor + + + + Initializes a new instance of the class + with the specified parameters. + + + + + + Gets or sets the minimum value. + + + + + Gets or sets the maximum value. + + + + + Gets or sets a flag indicating whether left align is enabled. + or not. + + + + + Implementation of Properties collection for the + + + + This class implements a properties collection that is thread safe and supports both + storing properties and capturing a read only copy of the current propertied. + + + This class is optimized to the scenario where the properties are read frequently + and are modified infrequently. + + + Nicko Cadell + + + + The read only copy of the properties. + + + + This variable is declared volatile to prevent the compiler and JIT from + reordering reads and writes of this thread performed on different threads. + + + + + + Lock object used to synchronize updates within this instance + + + + + Constructor + + + + Initializes a new instance of the class. + + + + + + Gets or sets the value of a property + + + The value for the property with the specified key + + + + Reading the value for a key is faster than setting the value. + When the value is written a new read only copy of + the properties is created. + + + + + + Remove a property from the global context + + the key for the entry to remove + + + Removing an entry from the global context properties is relatively expensive compared + with reading a value. + + + + + + Clear the global context properties + + + + + Get a readonly immutable copy of the properties + + the current global context properties + + + This implementation is fast because the GlobalContextProperties class + stores a readonly copy of the properties. + + + + + + The static class ILogExtensions contains a set of widely used + methods that ease the interaction with the ILog interface implementations. + + + + This class contains methods for logging at different levels and checks the + properties for determining if those logging levels are enabled in the current + configuration. + + + Simple example of logging messages + + using log4net.Util; + + ILog log = LogManager.GetLogger("application-log"); + + log.InfoExt("Application Start"); + log.DebugExt("This is a debug message"); + + + + + + The fully qualified type of the Logger class. + + + + + Log a message object with the level. + + The logger on which the message is logged. + The lambda expression that gets the object to log. + + + This method first checks if this logger is INFO + enabled by reading the value property. + This check happens always and does not depend on the + implementation. If this logger is INFO enabled, then it converts + the message object (retrieved by invocation of the provided callback) to a + string by invoking the appropriate . + It then proceeds to call all the registered appenders in this logger + and also higher in the hierarchy depending on the value of + the additivity flag. + + WARNING Note that passing an + to this method will print the name of the + but no stack trace. To print a stack trace use the + form instead. + + + + + + + + Log a message object with the level including + the stack trace of the passed + as a parameter. + + The logger on which the message is logged. + The lambda expression that gets the object to log. + The exception to log, including its stack trace. + + + See the form for more detailed information. + + + + + + + Log a message object with the level. //TODO + + Log a message object with the level. + + The logger on which the message is logged. + The message object to log. + + + This method first checks if this logger is INFO + enabled by reading the value property. + This check happens always and does not depend on the + implementation. If this logger is INFO enabled, then it converts + the message object (passed as parameter) to a string by invoking the appropriate + . It then + proceeds to call all the registered appenders in this logger + and also higher in the hierarchy depending on the value of + the additivity flag. + + WARNING Note that passing an + to this method will print the name of the + but no stack trace. To print a stack trace use the + form instead. + + + + + + + + Log a message object with the level including + the stack trace of the passed + as a parameter. + + The logger on which the message is logged. + The message object to log. + The exception to log, including its stack trace. + + + See the form for more detailed information. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + An that supplies culture-specific formatting information + The logger on which the message is logged. + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object to format + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Log a message object with the level. + + The logger on which the message is logged. + The lambda expression that gets the object to log. + + + This method first checks if this logger is INFO + enabled by reading the value property. + This check happens always and does not depend on the + implementation. If this logger is INFO enabled, then it converts + the message object (retrieved by invocation of the provided callback) to a + string by invoking the appropriate . + It then proceeds to call all the registered appenders in this logger + and also higher in the hierarchy depending on the value of + the additivity flag. + + WARNING Note that passing an + to this method will print the name of the + but no stack trace. To print a stack trace use the + form instead. + + + + + + + + Log a message object with the level including + the stack trace of the passed + as a parameter. + + The logger on which the message is logged. + The lambda expression that gets the object to log. + The exception to log, including its stack trace. + + + See the form for more detailed information. + + + + + + + Log a message object with the level. //TODO + + Log a message object with the level. + + The logger on which the message is logged. + The message object to log. + + + This method first checks if this logger is INFO + enabled by reading the value property. + This check happens always and does not depend on the + implementation. If this logger is INFO enabled, then it converts + the message object (passed as parameter) to a string by invoking the appropriate + . It then + proceeds to call all the registered appenders in this logger + and also higher in the hierarchy depending on the value of + the additivity flag. + + WARNING Note that passing an + to this method will print the name of the + but no stack trace. To print a stack trace use the + form instead. + + + + + + + + Log a message object with the level including + the stack trace of the passed + as a parameter. + + The logger on which the message is logged. + The message object to log. + The exception to log, including its stack trace. + + + See the form for more detailed information. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + An that supplies culture-specific formatting information + The logger on which the message is logged. + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object to format + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Log a message object with the level. + + The logger on which the message is logged. + The lambda expression that gets the object to log. + + + This method first checks if this logger is WARN + enabled by reading the value property. + This check happens always and does not depend on the + implementation. If this logger is WARN enabled, then it converts + the message object (retrieved by invocation of the provided callback) to a + string by invoking the appropriate . + It then proceeds to call all the registered appenders in this logger + and also higher in the hierarchy depending on the value of + the additivity flag. + + WARNING Note that passing an + to this method will print the name of the + but no stack trace. To print a stack trace use the + form instead. + + + + + + + + Log a message object with the level including + the stack trace of the passed + as a parameter. + + The logger on which the message is logged. + The lambda expression that gets the object to log. + The exception to log, including its stack trace. + + + See the form for more detailed information. + + + + + + + Log a message object with the level. //TODO + + Log a message object with the level. + + The logger on which the message is logged. + The message object to log. + + + This method first checks if this logger is WARN + enabled by reading the value property. + This check happens always and does not depend on the + implementation. If this logger is WARN enabled, then it converts + the message object (passed as parameter) to a string by invoking the appropriate + . It then + proceeds to call all the registered appenders in this logger + and also higher in the hierarchy depending on the value of + the additivity flag. + + WARNING Note that passing an + to this method will print the name of the + but no stack trace. To print a stack trace use the + form instead. + + + + + + + + Log a message object with the level including + the stack trace of the passed + as a parameter. + + The logger on which the message is logged. + The message object to log. + The exception to log, including its stack trace. + + + See the form for more detailed information. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + An that supplies culture-specific formatting information + The logger on which the message is logged. + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object to format + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Log a message object with the level. + + The logger on which the message is logged. + The lambda expression that gets the object to log. + + + This method first checks if this logger is ERROR + enabled by reading the value property. + This check happens always and does not depend on the + implementation. If this logger is ERROR enabled, then it converts + the message object (retrieved by invocation of the provided callback) to a + string by invoking the appropriate . + It then proceeds to call all the registered appenders in this logger + and also higher in the hierarchy depending on the value of + the additivity flag. + + WARNING Note that passing an + to this method will print the name of the + but no stack trace. To print a stack trace use the + form instead. + + + + + + + + Log a message object with the level including + the stack trace of the passed + as a parameter. + + The logger on which the message is logged. + The lambda expression that gets the object to log. + The exception to log, including its stack trace. + + + See the form for more detailed information. + + + + + + + Log a message object with the level. //TODO + + Log a message object with the level. + + The logger on which the message is logged. + The message object to log. + + + This method first checks if this logger is ERROR + enabled by reading the value property. + This check happens always and does not depend on the + implementation. If this logger is ERROR enabled, then it converts + the message object (passed as parameter) to a string by invoking the appropriate + . It then + proceeds to call all the registered appenders in this logger + and also higher in the hierarchy depending on the value of + the additivity flag. + + WARNING Note that passing an + to this method will print the name of the + but no stack trace. To print a stack trace use the + form instead. + + + + + + + + Log a message object with the level including + the stack trace of the passed + as a parameter. + + The logger on which the message is logged. + The message object to log. + The exception to log, including its stack trace. + + + See the form for more detailed information. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + An that supplies culture-specific formatting information + The logger on which the message is logged. + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object to format + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Log a message object with the level. + + The logger on which the message is logged. + The lambda expression that gets the object to log. + + + This method first checks if this logger is FATAL + enabled by reading the value property. + This check happens always and does not depend on the + implementation. If this logger is FATAL enabled, then it converts + the message object (retrieved by invocation of the provided callback) to a + string by invoking the appropriate . + It then proceeds to call all the registered appenders in this logger + and also higher in the hierarchy depending on the value of + the additivity flag. + + WARNING Note that passing an + to this method will print the name of the + but no stack trace. To print a stack trace use the + form instead. + + + + + + + + Log a message object with the level including + the stack trace of the passed + as a parameter. + + The logger on which the message is logged. + The lambda expression that gets the object to log. + The exception to log, including its stack trace. + + + See the form for more detailed information. + + + + + + + Log a message object with the level. //TODO + + Log a message object with the level. + + The logger on which the message is logged. + The message object to log. + + + This method first checks if this logger is FATAL + enabled by reading the value property. + This check happens always and does not depend on the + implementation. If this logger is FATAL enabled, then it converts + the message object (passed as parameter) to a string by invoking the appropriate + . It then + proceeds to call all the registered appenders in this logger + and also higher in the hierarchy depending on the value of + the additivity flag. + + WARNING Note that passing an + to this method will print the name of the + but no stack trace. To print a stack trace use the + form instead. + + + + + + + + Log a message object with the level including + the stack trace of the passed + as a parameter. + + The logger on which the message is logged. + The message object to log. + The exception to log, including its stack trace. + + + See the form for more detailed information. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + An that supplies culture-specific formatting information + The logger on which the message is logged. + A String containing zero or more format items + An Object array containing zero or more objects to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Logs a formatted message string with the level. + + The logger on which the message is logged. + A String containing zero or more format items + An Object to format + An Object to format + An Object to format + + + The message is formatted using the String.Format method. See + for details of the syntax of the format string and the behavior + of the formatting. + + + This method does not take an object to include in the + log event. To pass an use one of the + methods instead. + + + + + + + + Manages an ordered mapping from instances + to subclasses. + + Nicko Cadell + + + + Add a to this mapping + + the entry to add + + + If a has previously been added + for the same then that entry will be + overwritten. + + + + + + Looks up the value for the specified level. Finds the nearest + mapping value for the level that is equal to or less than the + specified. + + the level to look up. + The for the level or if no mapping found + + + + Initialize options + + + Caches the sorted list of + + + + + An abstract base class for types that are stored in the + object. + + Nicko Cadell + + + + Default protected constructor + + + + + Gets or sets the level that is the key for this mapping. + + + + + Initialize any options defined on this entry + + + + Should be overridden by any classes that need to initialize based on their options + + + + + + Class for assertions + + + + + Ensures that is not and returns the validated value + + Type of + Value to validate + Name of the value + Error message (optional) + Value (when not null) + + + + + Ensures that is not null and an instance of + and returns the validated value + + Type to check for + Value to validate + Name of the value + Error message (optional) + Value (when not null and of the required type) + + + + + + Determines whether this is a fatal exception that should not be handled + + Exception + , if it is a fatal exception, otherwise + + + + Implementation of Properties collection for the + + + + Class implements a collection of properties that is specific to each thread. + The class is not synchronized as each thread has its own . + + + This class stores its properties in a slot on the named + for .net4x, + otherwise System.Threading.AsyncLocal + + + Nicko Cadell + + + + Flag used to disable this context if we don't have permission to access the CallContext. + + + + + Constructor + + + + Initializes a new instance of the class. + + + + + + + + + Remove a property + + the key for the entry to remove + + + Remove the value for the specified from the context. + + + + + + Clear all the context properties + + + + Clear all the context properties + + + + + + Get the PropertiesDictionary stored in the LocalDataStoreSlot for this thread. + + create the dictionary if it does not exist, otherwise return null if it does not exist + the properties for this thread + + + The collection returned is only to be used on the calling thread. If the + caller needs to share the collection between different threads then the + caller must clone the collection before doings so. + + + + + + Gets the call context get data. + + The properties dictionary stored in the call context + + The method GetData security link demand, therefore we must + put the method call in a separate method that we can wrap in an exception handler. + + + + + Sets the call context data. + + The properties. + + The method SetData has a security link demand, therefore we must + put the method call in a separate method that we can wrap in an exception handler. + + + + + The fully qualified type of the LogicalThreadContextProperties class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Delegate type used for LogicalThreadContextStack's callbacks. + + + + + Implementation of Stack for the + + Nicko Cadell + + + + The stack store. + + + + + The name of this within the + . + + + + + The callback used to let the register a + new instance of a . + + + + + Internal constructor + + + + Initializes a new instance of the class. + + + + + + Gets the number of messages in the stack. + + + + The current number of messages in the stack. That is + the number of times has been called + minus the number of times has been called. + + + + + + Clears all the contextual information held in this stack. + + + + Clears all the contextual information held in this stack. + Only call this if you think that this thread is being reused after + a previous call execution which may not have completed correctly. + You do not need to use this method if you always guarantee to call + the method of the + returned from even in exceptional circumstances, + for example by using the using(log4net.LogicalThreadContext.Stacks["NDC"].Push("Stack_Message")) + syntax. + + + + + + Removes the top context from this stack. + + The message in the context that was removed from the top of this stack. + + + Remove the top context from this stack, and return + it to the caller. If this stack is empty then an + empty string (not ) is returned. + + + + + + Pushes a new context message into this stack. + + The new context message. + + An that can be used to clean up the context stack. + + + + Pushes a new context onto this stack. An + is returned that can be used to clean up this stack. This + can be easily combined with the using keyword to scope the + context. + + + Simple example of using the Push method with the using keyword. + + using(log4net.LogicalThreadContext.Stacks["NDC"].Push("Stack_Message")) + { + log.Warn("This should have an ThreadContext Stack message"); + } + + + + + + Returns the top context from this stack. + + The message in the context from the top of this stack. + + + Returns the top context from this stack. If this stack is empty then an + empty string (not ) is returned. + + + + + + Gets the current context information for this stack. + + The current context information. + + + + Gets the current context information for this stack. + + Gets the current context information + + + + Gets a cross-thread portable version of this object + + + + + Inner class used to represent a single context frame in the stack. + + + + + Constructor + + The message for this context. + The parent context in the chain. + + + Initializes a new instance of the class + with the specified message and parent context. + + + + + + Get the message. + + The message. + + + Get the message. + + + + + + Gets the full text of the context down to the root level. + + + The full text of the context down to the root level. + + + + Gets the full text of the context down to the root level. + + + + + + Struct returned from the method. + + + + This struct implements the and is designed to be used + with the pattern to remove the stack frame at the end of the scope. + + + + + + The depth to trim the stack to when this instance is disposed + + + + + The outer LogicalThreadContextStack. + + + + + Constructor + + The internal stack used by the ThreadContextStack. + The depth to return the stack to when this object is disposed. + + + Initializes a new instance of the class with + the specified stack and return depth. + + + + + + Returns the stack to the correct depth. + + + + Returns the stack to the correct depth. + + + + + + Implementation of Stacks collection for the + + Nicko Cadell + + + + Internal constructor + + + + Initializes a new instance of the class. + + + + + + Gets the named thread context stack + + + The named stack + + + + Gets the named thread context stack + + + + + + The fully qualified type of the ThreadContextStacks class. + + + Used by the internal logger to record the Type of the + log message. + + + + + LogReceivedEventHandler + + + + + Outputs log statements from within the log4net assembly. + + + + Log4net components cannot make log4net logging calls. However, it is + sometimes useful for the user to learn about what log4net is + doing. + + + All log4net internal debug calls go to the standard output stream + whereas internal error messages are sent to the standard error output + stream. + + + Nicko Cadell + Gert Driesen + + + + The event raised when an internal message has been received. + + + + + The Type that generated the internal message. + + + + + The DateTime stamp of when the internal message was received. + + + + + The UTC DateTime stamp of when the internal message was received. + + + + + A string indicating the severity of the internal message. + + + "log4net: ", + "log4net:ERROR ", + "log4net:WARN " + + + + + The internal log message. + + + + + The Exception related to the message. + + + Optional. Will be null if no Exception was passed. + + + + + Formats Prefix, Source, and Message in the same format as the value + sent to Console.Out and Trace.Write. + + + + + + Initializes a new instance of the class. + + + + + Static constructor that initializes logging by reading + settings from the application configuration file. + + + + The log4net.Internal.Debug application setting + controls internal debugging. This setting should be set + to true to enable debugging. + + + The log4net.Internal.Quiet application setting + suppresses all internal logging including error messages. + This setting should be set to true to enable message + suppression. + + + + + + Gets or sets a value indicating whether log4net internal logging + is enabled or disabled. + + + true if log4net internal logging is enabled, otherwise + false. + + + + When set to true, internal debug level logging will be + displayed. + + + This value can be set by setting the application setting + log4net.Internal.Debug in the application configuration + file. + + + The default value is false, i.e. debugging is + disabled. + + + + + The following example enables internal debugging using the + application configuration file : + + + + + + + + + + + + + Gets or sets a value indicating whether log4net should generate no output + from internal logging, not even for errors. + + + true if log4net should generate no output at all from internal + logging, otherwise false. + + + + When set to true will cause internal logging at all levels to be + suppressed. This means that no warning or error reports will be logged. + This option overrides the setting and + disables all debug also. + + This value can be set by setting the application setting + log4net.Internal.Quiet in the application configuration file. + + + The default value is false, i.e. internal logging is not + disabled. + + + + The following example disables internal logging using the + application configuration file : + + + + + + + + + + + + + + + + + Raises the LogReceived event when an internal messages is received. + + + + + + + + + Test if LogLog.Debug is enabled for output. + + + true if Debug is enabled + + + + Test if LogLog.Debug is enabled for output. + + + + + + Writes log4net internal debug messages to the + standard output stream. + + + The message to log. + + + All internal debug messages are prepended with + the string "log4net: ". + + + + + + Writes log4net internal debug messages to the + standard output stream. + + The Type that generated this message. + The message to log. + An exception to log. + + + All internal debug messages are prepended with + the string "log4net: ". + + + + + + Test if LogLog.Warn is enabled for output. + + + true if Warn is enabled + + + + + Writes log4net internal warning messages to the + standard error stream. + + The Type that generated this message. + The message to log. + + + All internal warning messages are prepended with + the string "log4net:WARN ". + + + + + + Writes log4net internal warning messages to the + standard error stream. + + The Type that generated this message. + The message to log. + An exception to log. + + + All internal warning messages are prepended with + the string "log4net:WARN ". + + + + + + Test if LogLog.Error is enabled for output. + + + true if Error is enabled + + + + Test if LogLog.Error is enabled for output. + + + + + + Writes log4net internal error messages to the + standard error stream. + + The Type that generated this message. + The message to log. + + + All internal error messages are prepended with + the string "log4net:ERROR ". + + + + + + Writes log4net internal error messages to the + standard error stream. + + The Type that generated this message. + The message to log. + An exception to log. + + + All internal debug messages are prepended with + the string "log4net:ERROR ". + + + + + + Writes output to the standard output stream. + + The message to log. + + + Writes to both Console.Out and System.Diagnostics.Trace. + + + If the AppDomain is not configured with a config file then + the call to System.Diagnostics.Trace may fail. This is only + an issue if you are programmatically creating your own AppDomains. + + + + + + Writes output to the standard error stream. + + The message to log. + + + Writes to both Console.Error and System.Diagnostics.Trace. + Note that the System.Diagnostics.Trace is not supported + on the Compact Framework. + + + If the AppDomain is not configured with a config file then + the call to System.Diagnostics.Trace may fail. This is only + an issue if you are programmatically creating your own AppDomains. + + + + + + Subscribes to the LogLog.LogReceived event and stores messages + to the supplied IList instance. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Represents a Win32 native error code and message. + + Nicko Cadell + Gert Driesen + + + + Create an instance of the class with the specified + error number and message. + + The number of the native error. + The message of the native error. + + + + Gets the number of the native error. + + + The number of the native error. + + + + Gets the number of the native error. + + + + + + Gets the message of the native error. + + + + + Creates a new instance of the class for the last Windows error. + + + An instance of the class for the last windows error. + + + + The message for the error number is lookup up using the + native Win32 FormatMessage function. + + + + + + Create a new instance of the class. + + the error number for the native error + + An instance of the class for the specified + error number. + + + + The message for the specified error number is lookup up using the + native Win32 FormatMessage function. + + + + + + Retrieves the message corresponding with a Win32 message identifier. + + Message identifier for the requested message. + + The message corresponding with the specified message identifier. + + + + The message will be searched for in system message-table resource(s) + using the native FormatMessage function. + + + + + + Return error information string + + error information string + + + Return error information string + + + + + + Native Methods + + Jan Friedrich + + + + Formats a message string. + + Formatting options, and how to interpret the parameter. + Location of the message definition. + Message identifier for the requested message. + Language identifier for the requested message. + If includes FORMAT_MESSAGE_ALLOCATE_BUFFER, the function allocates a buffer using the LocalAlloc function, and places the pointer to the buffer at the address specified in . + If the FORMAT_MESSAGE_ALLOCATE_BUFFER flag is not set, this parameter specifies the maximum number of TCHARs that can be stored in the output buffer. If FORMAT_MESSAGE_ALLOCATE_BUFFER is set, this parameter specifies the minimum number of TCHARs to allocate for an output buffer. + Pointer to an array of values that are used as insert values in the formatted message. + + + The function requires a message definition as input. The message definition can come from a + buffer passed into the function. It can come from a message table resource in an + already-loaded module. Or the caller can ask the function to search the system's message + table resource(s) for the message definition. The function finds the message definition + in a message table resource based on a message identifier and a language identifier. + The function copies the formatted message text to an output buffer, processing any embedded + insert sequences if requested. + + + To prevent the usage of unsafe code, this stub does not support inserting values in the formatted message. + + + + + If the function succeeds, the return value is the number of TCHARs stored in the output + buffer, excluding the terminating null character. + + + If the function fails, the return value is zero. To get extended error information, + call . + + + + + + Stub for OutputDebugString native method + + the string to output + + + + Open connection to system logger. + + + + + Generate a log message. + + + + The libc syslog method takes a format string and a variable argument list similar + to the classic printf function. As this type of vararg list is not supported + by C# we need to specify the arguments explicitly. Here we have specified the + format string with a single message argument. The caller must set the format + string to "%s". + + + + + + Close descriptor used to write to system logger. + + + + + An always empty . + + + + A singleton implementation of the over a collection + that is empty and not modifiable. + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + + Uses a private access modifier to enforce the singleton pattern. + + + + + + Gets the singleton instance of the . + + The singleton instance of the . + + + + Gets the current object from the enumerator. + + + Throws an because the + never has a current value. + + + + As the enumerator is over an empty collection its + value cannot be moved over a valid position, therefore + will throw an . + + + The collection is empty and + cannot be positioned over a valid location. + + + + Test if the enumerator can advance, if so advance. + + false as the cannot advance. + + + As the enumerator is over an empty collection its + value cannot be moved over a valid position, therefore + will always return false. + + + + + + Resets the enumerator back to the start. + + + + As the enumerator is over an empty collection does nothing. + + + + + + Gets the current key from the enumerator. + + + Throws an exception because the + never has a current value. + + + + As the enumerator is over an empty collection its + value cannot be moved over a valid position, therefore + will throw an . + + + The collection is empty and + cannot be positioned over a valid location. + + + + Gets the current value from the enumerator. + + The current value from the enumerator. + + Throws an because the + never has a current value. + + + + As the enumerator is over an empty collection its + value cannot be moved over a valid position, therefore + will throw an . + + + The collection is empty and + cannot be positioned over a valid location. + + + + Gets the current entry from the enumerator. + + + Throws an because the + never has a current entry. + + + + As the enumerator is over an empty collection its + value cannot be moved over a valid position, therefore + will throw an . + + + The collection is empty and + cannot be positioned over a valid location. + + + + An always empty . + + + + A singleton implementation of the over a collection + that is empty and not modifiable. + + + Nicko Cadell + Gert Driesen + + + + Initializes a new instance of the class. + + + + Uses a private access modifier to enforce the singleton pattern. + + + + + + Get the singleton instance of the . + + The singleton instance of the . + + + + Gets the current object from the enumerator. + + + Throws an because the + never has a current value. + + + + As the enumerator is over an empty collection its + value cannot be moved over a valid position, therefore + will throw an . + + + The collection is empty and + cannot be positioned over a valid location. + + + + Test if the enumerator can advance, if so advance + + false as the cannot advance. + + + As the enumerator is over an empty collection its + value cannot be moved over a valid position, therefore + will always return false. + + + + + + Resets the enumerator back to the start. + + + + As the enumerator is over an empty collection does nothing. + + + + + + A SecurityContext used when a SecurityContext is not required + + + + The is a no-op implementation of the + base class. It is used where a + is required but one has not been provided. + + + Nicko Cadell + + + + Singleton instance of + + + + Singleton instance of + + + + + + Private constructor + + + + Private constructor for singleton pattern. + + + + + + Impersonate this SecurityContext + + State supplied by the caller + null + + + No impersonation is done and null is always returned. + + + + + + Implements log4net's default error handling policy which consists + of emitting a message for the first error in an appender and + ignoring all subsequent errors. + + + + The error message is processed using the LogLog sub-system by default. + + + This policy aims at protecting an otherwise working application + from being flooded with error messages when logging fails. + + + Nicko Cadell + Gert Driesen + Ron Grabowski + + + + Default Constructor + + + + Initializes a new instance of the class. + + + + + + Constructor + + The prefix to use for each message. + + + Initializes a new instance of the class + with the specified prefix. + + + + + + Reset the error handler back to its initial disabled state. + + + + + Log an Error + + The error message. + The exception. + The internal error code. + + + Invokes if and only if this is the first error or the first error after has been called. + + + + + + Log the very first error + + The error message. + The exception. + The internal error code. + + + Sends the error information to 's Error method. + + + + + + Log an Error + + The error message. + The exception. + + + Invokes if and only if this is the first error or the first error after has been called. + + + + + + Log an error + + The error message. + + + Invokes if and only if this is the first error or the first error after has been called. + + + + + + Is error logging enabled + + + + Logging is only enabled for the first error delivered to the . + + + + + + The date the first error that triggered this error handler occurred, or if it has not been triggered. + + + + + The UTC date the first error that triggered this error handler occured, or if it has not been triggered. + + + + + The message from the first error that triggered this error handler. + + + + + The exception from the first error that triggered this error handler. + + + May be . + + + + + The error code from the first error that triggered this error handler. + + + Defaults to + + + + + String to prefix each message with + + + + + The fully qualified type of the OnlyOnceErrorHandler class. + + + Used by the internal logger to record the Type of the + log message. + + + + + A convenience class to convert property values to specific types. + + + + Utility functions for converting types and parsing values. + + + Nicko Cadell + Gert Driesen + + + + Converts a string to a value. + + String to convert. + The default value. + The value of . + + + If is "true", then true is returned. + If is "false", then false is returned. + Otherwise, is returned. + + + + + + Parses a file size into a number. + + String to parse. + The default value. + The value of . + + + Parses a file size of the form: number[KB|MB|GB] into a + long value. It is scaled with the appropriate multiplier. + + + is returned when + cannot be converted to a value. + + + + + + Converts a string to an object. + + The target type to convert to. + The string to convert to an object. + + The object converted from a string or null when the + conversion failed. + + + + Converts a string to an object. Uses the converter registry to try + to convert the string value into the specified target type. + + + + + + Checks if there is an appropriate type conversion from the source type to the target type. + + The type to convert from. + The type to convert to. + true if there is a conversion from the source type to the target type. + + Checks if there is an appropriate type conversion from the source type to the target type. + + + + + + + Converts an object to the target type. + + The object to convert to the target type. + The type to convert to. + The converted object. + + + Converts an object to the target type. + + + + + + Instantiates an object given a class name. + + The fully qualified class name of the object to instantiate. + The class to which the new object should belong. + The object to return in case of non-fulfillment. + + An instance of the or + if the object could not be instantiated. + + + + Checks that the is a subclass of + . If that test fails or the object could + not be instantiated, then is returned. + + + + + + Performs variable substitution in string from the + values of keys found in . + + The string on which variable substitution is performed. + The dictionary to use to lookup variables. + The result of the substitutions. + + + The variable substitution delimiters are ${ and }. + + + For example, if props contains key=value, then the call + + + + string s = OptionConverter.SubstituteVariables("Value of key is ${key}."); + + + + will set the variable s to "Value of key is value.". + + + If no value could be found for the specified key, then substitution + defaults to an empty string. + + + For example, if system properties contains no value for the key + "nonExistentKey", then the call + + + + string s = OptionConverter.SubstituteVariables("Value of nonExistentKey is [${nonExistentKey}]"); + + + + will set s to "Value of nonExistentKey is []". + + + An Exception is thrown if contains a start + delimiter "${" which is not balanced by a stop delimiter "}". + + + + + + Converts the string representation of the name or numeric value of one or + more enumerated constants to an equivalent enumerated object. + + The type to convert to. + The enum string value. + If true, ignore case; otherwise, regard case. + An object of type whose value is represented by . + + + + The fully qualified type of the OptionConverter class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Abstract class that provides the formatting functionality that + derived classes need. + + + + Conversion specifiers in a conversion patterns are parsed to + individual PatternConverters. Each of which is responsible for + converting a logging event in a converter specific manner. + + + Nicko Cadell + Gert Driesen + + + + Protected constructor + + + + Initializes a new instance of the class. + + + + + + Gets the next pattern converter in the chain. + + + + + Gets or sets the formatting info for this converter + + + The formatting info for this converter + + + + Gets or sets the formatting info for this converter + + + + + + Gets or sets the option value for this converter + + + The option for this converter + + + + Gets or sets the option value for this converter + + + + + + Evaluate this pattern converter and write the output to a writer. + + that will receive the formatted result. + The state object on which the pattern converter should be executed. + + + Derived pattern converters must override this method in order to + convert conversion specifiers in the appropriate way. + + + + + + Set the next pattern converter in the chains + + the pattern converter that should follow this converter in the chain + the next converter + + + The PatternConverter can merge with its neighbor during this method (or a subclass). + Therefore the return value may or may not be the value of the argument passed in. + + + + + + Write the pattern converter to the writer with appropriate formatting + + that will receive the formatted result. + The state object on which the pattern converter should be executed. + + + This method calls to allow the subclass to perform + appropriate conversion of the pattern converter. If formatting options have + been specified via the then this method will + apply those formattings before writing the output. + + + + + + Fast space padding method. + + to which the spaces will be appended. + The number of spaces to be padded. + + + Fast space padding method. + + + + + + Initial buffer size + + + + + Maximum buffer size before it is recycled + + + + + Write an dictionary to a + + the writer to write to + a to use for object conversion + the value to write to the writer + + + Writes the to a writer in the form: + + + {key1=value1, key2=value2, key3=value3} + + + If the specified + is not null then it is used to render the key and value to text, otherwise + the object's ToString method is called. + + + + + + Writes a dictionary to a + + the writer to write to + a to use for object conversion + the value to write to the writer + + + Writes the to a writer in the form: + + + {key1=value1, key2=value2, key3=value3} + + + If the specified + is not null then it is used to render the key and value to text, otherwise + the object's ToString method is called. + + + + + + Write an object to a + + the writer to write to + a to use for object conversion + the value to write to the writer + + + Writes the Object to a writer. If the specified + is not null then it is used to render the object to text, otherwise + the object's ToString method is called. + + + + + + + + + + + Most of the work of the class + is delegated to the PatternParser class. + + + + The PatternParser processes a pattern string and + returns a chain of objects. + + + Nicko Cadell + Gert Driesen + + + + Constructor + + The pattern to parse. + + + Initializes a new instance of the class + with the specified pattern string. + + + + + + Parses the pattern into a chain of pattern converters. + + The head of a chain of pattern converters. + + + + Gets the converter registry used by this parser. + + + + + Build the unified cache of converters from the static and instance maps + + the list of all the converter names + + + + Sort strings by length + + + + that orders strings by string length. + The longest strings are placed first + + + + + + Internal method to parse the specified pattern to find specified matches + + the pattern to parse + the converter names to match in the pattern + + + The matches param must be sorted such that longer strings come before shorter ones. + + + + + + Process a parsed literal + + the literal text + + + + Process a parsed converter pattern + + the name of the converter + the optional option for the converter + the formatting info for the converter + + + + Resets the internal state of the parser and adds the specified pattern converter + to the chain. + + The pattern converter to add. + + + + The first pattern converter in the chain + + + + + the last pattern converter in the chain + + + + + The pattern + + + + + The fully qualified type of the PatternParser class. + + + Used by the internal logger to record the Type of the + log message. + + + + + This class implements a patterned string. + + + + This string has embedded patterns that are resolved and expanded + when the string is formatted. + + + This class functions similarly to the + in that it accepts a pattern and renders it to a string. Unlike the + however the PatternString + does not render the properties of a specific but + of the process in general. + + + The recognized conversion pattern names are: + + + + Conversion Pattern Name + Effect + + + appdomain + + + Used to output the friendly name of the current AppDomain. + + + + + appsetting + + + Used to output the value of a specific appSetting key in the application + configuration file. + + + + + date + + + Used to output the current date and time in the local time zone. + To output the date in universal time use the %utcdate pattern. + The date conversion + specifier may be followed by a date format specifier enclosed + between braces. For example, %date{HH:mm:ss,fff} or + %date{dd MMM yyyy HH:mm:ss,fff}. If no date format specifier is + given then ISO8601 format is + assumed (). + + + The date format specifier admits the same syntax as the + time pattern string of the . + + + For better results it is recommended to use the log4net date + formatters. These can be specified using one of the strings + "ABSOLUTE", "DATE" and "ISO8601" for specifying + , + and respectively + . For example, + %date{ISO8601} or %date{ABSOLUTE}. + + + These dedicated date formatters perform significantly + better than . + + + + + env + + + Used to output the a specific environment variable. The key to + lookup must be specified within braces and directly following the + pattern specifier, e.g. %env{COMPUTERNAME} would include the value + of the COMPUTERNAME environment variable. + + + The env pattern is not supported on the .NET Compact Framework. + + + + + identity + + + Used to output the user name for the currently active user + (Principal.Identity.Name). + + + + + newline + + + Outputs the platform dependent line separator character or + characters. + + + This conversion pattern name offers the same performance as using + non-portable line separator strings such as "\n", or "\r\n". + Thus, it is the preferred way of specifying a line separator. + + + + + processid + + + Used to output the system process ID for the current process. + + + + + property + + + Used to output a specific context property. The key to + lookup must be specified within braces and directly following the + pattern specifier, e.g. %property{user} would include the value + from the property that is keyed by the string 'user'. Each property value + that is to be included in the log must be specified separately. + Properties are stored in logging contexts. By default + the log4net:HostName property is set to the name of machine on + which the event was originally logged. + + + If no key is specified, e.g. %property then all the keys and their + values are printed in a comma separated list. + + + The properties of an event are combined from a number of different + contexts. These are listed below in the order in which they are searched. + + + + the thread properties + + The that are set on the current + thread. These properties are shared by all events logged on this thread. + + + + the global properties + + The that are set globally. These + properties are shared by all the threads in the AppDomain. + + + + + + + random + + + Used to output a random string of characters. The string is made up of + uppercase letters and numbers. By default the string is 4 characters long. + The length of the string can be specified within braces directly following the + pattern specifier, e.g. %random{8} would output an 8 character string. + + + + + username + + + Used to output the WindowsIdentity for the currently + active user. + + + + + utcdate + + + Used to output the date of the logging event in universal time. + The date conversion + specifier may be followed by a date format specifier enclosed + between braces. For example, %utcdate{HH:mm:ss,fff} or + %utcdate{dd MMM yyyy HH:mm:ss,fff}. If no date format specifier is + given then ISO8601 format is + assumed (). + + + The date format specifier admits the same syntax as the + time pattern string of the . + + + For better results it is recommended to use the log4net date + formatters. These can be specified using one of the strings + "ABSOLUTE", "DATE" and "ISO8601" for specifying + , + and respectively + . For example, + %utcdate{ISO8601} or %utcdate{ABSOLUTE}. + + + These dedicated date formatters perform significantly + better than . + + + + + % + + + The sequence %% outputs a single percent sign. + + + + + + Additional pattern converters may be registered with a specific + instance using or + . + + + See the for details on the + format modifiers supported by the patterns. + + + Nicko Cadell + + + + Internal map of converter identifiers to converter types. + + + + + the head of the pattern converter chain + + + + + patterns defined on this PatternString only + + + + + Default constructor + + + + Initialize a new instance of + + + + + + Constructs a PatternString + + The pattern to use with this PatternString + + + Initialize a new instance of with the pattern specified. + + + + + + Gets or sets the pattern formatting string + + + The pattern formatting string + + + + The ConversionPattern option. This is the string which + controls formatting and consists of a mix of literal content and + conversion specifiers. + + + + + + Initialize object options + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Create the used to parse the pattern + + the pattern to parse + The + + + Returns PatternParser used to parse the conversion string. Subclasses + may override this to return a subclass of PatternParser which recognize + custom conversion pattern name. + + + + + + Produces a formatted string as specified by the conversion pattern. + + The TextWriter to write the formatted event to + + + Format the pattern to the . + + + + + + Format the pattern as a string + + the pattern formatted as a string + + + Format the pattern to a string. + + + + + + Adds a converter to this PatternString. + + the converter info + + + This version of the method is used by the configurator. + Programmatic users should use the alternative method. + The converter name is case-insensitive. + + + + + + Add a converter to this PatternString + + the name of the conversion pattern for this converter + the type of the converter + + + + Write the name of the current AppDomain to the output writer + + Nicko Cadell + + + + Write the name of the current AppDomain to the output + + the writer to write to + null, state is not set + + + Writes name of the current AppDomain to the output . + + + + + + AppSetting pattern converter + + + + This pattern converter reads appSettings from the application configuration file. + + + If the is specified then that will be used to + lookup a single appSettings value. If no is specified + then all appSettings will be dumped as a list of key value pairs. + + + A typical use is to specify a base directory for log files, e.g. + + + + + ... + + + ]]> + + + + + + + Write the property value to the output + + that will receive the formatted result. + null, state is not set + + + Writes out the value of a named property. The property name + should be set in the + property. + + + If the is set to null + then all the properties are written as key value pairs. + + + + + + Write the current date to the output + + + + Date pattern converter, uses a to format + the current date and time to the writer as a string. + + + The value of the determines + the formatting of the date. The following values are allowed: + + + Option value + Output + + + ISO8601 + + Uses the formatter. + Formats using the "yyyy-MM-dd HH:mm:ss,fff" pattern. + + + + DATE + + Uses the formatter. + Formats using the "dd MMM yyyy HH:mm:ss,fff" for example, "06 Nov 1994 15:49:37,459". + + + + ABSOLUTE + + Uses the formatter. + Formats using the "HH:mm:ss,fff" for example, "15:49:37,459". + + + + other + + Any other pattern string uses the formatter. + This formatter passes the pattern string to the + method. + For details on valid patterns see + DateTimeFormatInfo Class. + + + + + + The date and time is in the local time zone and is rendered in that zone. + To output the time in Universal time see . + + + Nicko Cadell + + + + The used to render the date to a string + + + + + Initialize the converter options + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Write the current date to the output + + that will receive the formatted result. + null, state is not set + + + Pass the current date and time to the + for it to render it to the writer. + + + The date and time passed is in the local time zone. + + + + + + The fully qualified type of the DatePatternConverter class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Write an folder path to the output + + + + The value of the determines + the name of the variable to output. + should be a value in the enumeration. + + + Ron Grabowski + + + + Writes a special path environment folder path to the output + + the writer to write to + null, state is not set + + + Writes the special path environment folder path to the output . + The name of the special path environment folder path to output must be set + using the + property. + + + + + + The fully qualified type of the EnvironmentFolderPathPatternConverter class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Write an environment variable to the output + + + + Write an environment variable to the output writer. + The value of the determines + the name of the variable to output. + + + Nicko Cadell + + + + Write an environment variable to the output + + the writer to write to + null, state is not set + + + Writes the environment variable to the output . + The name of the environment variable to output must be set + using the + property. + + + + + + The fully qualified type of the EnvironmentPatternConverter class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Write the current thread identity to the output + + + + Write the current thread identity to the output writer + + + Nicko Cadell + + + + Write the current thread identity to the output + + the writer to write to + null, state is not set + + + Writes the current thread identity to the output . + + + + + + The fully qualified type of the IdentityPatternConverter class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Pattern converter for literal string instances in the pattern + + + + Writes the literal string value specified in the + property to + the output. + + + Nicko Cadell + + + + Set the next converter in the chain + + The next pattern converter in the chain + The next pattern converter + + + Special case the building of the pattern converter chain + for instances. Two adjacent + literals in the pattern can be represented by a single combined + pattern converter. This implementation detects when a + is added to the chain + after this converter and combines its value with this converter's + literal value. + + + + + + Write the literal to the output + + the writer to write to + null, not set + + + Override the formatting behavior to ignore the FormattingInfo + because we have a literal instead. + + + Writes the value of + to the output . + + + + + + Convert this pattern into the rendered message + + that will receive the formatted result. + null, not set + + + This method is not used. + + + + + + Writes a newline to the output + + + + Writes the system dependent line terminator to the output. + This behavior can be overridden by setting the : + + + + Option Value + Output + + + DOS + DOS or Windows line terminator "\r\n" + + + UNIX + UNIX line terminator "\n" + + + + Nicko Cadell + + + + Initialize the converter + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Write the current process ID to the output + + + + Write the current process ID to the output writer + + + Nicko Cadell + + + + Write the current process ID to the output + + the writer to write to + null, state is not set + + + Write the current process ID to the output . + + + + + + The fully qualified type of the ProcessIdPatternConverter class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Property pattern converter + + + + This pattern converter reads the thread and global properties. + The thread properties take priority over global properties. + See for details of the + thread properties. See for + details of the global properties. + + + If the is specified then that will be used to + lookup a single property. If no is specified + then all properties will be dumped as a list of key value pairs. + + + Nicko Cadell + + + + Write the property value to the output + + that will receive the formatted result. + null, state is not set + + + Writes out the value of a named property. The property name + should be set in the + property. + + + If the is set to null + then all the properties are written as key value pairs. + + + + + + A Pattern converter that generates a string of random characters + + + + The converter generates a string of random characters. By default + the string is length 4. This can be changed by setting the + to the string value of the length required. + + + The random characters in the string are limited to uppercase letters and numbers only. + + + The random number generator used by this class is not cryptographically secure. + + + Nicko Cadell + + + + Shared random number generator + + + + + Length of random string to generate. Default length 4. + + + + + Initialize the converter options + + + + This is part of the delayed object + activation scheme. The method must + be called on this object after the configuration properties have + been set. Until is called this + object is in an undefined state and must not be used. + + + If any of the configuration properties are modified then + must be called again. + + + + + + Writes a random string to the output + + the writer to write to + null, state is not set + + + + The fully qualified type of the RandomStringPatternConverter class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Write the current threads username to the output + + + + Write the current threads username to the output writer + + + Nicko Cadell + + + + Write the current threads username to the output + + the writer to write to + null, state is not set + + + Write the current threads username to the output . + + + + + + The fully qualified type of the UserNamePatternConverter class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Write the UTC date time to the output + + + + Date pattern converter, uses a to format + the current date and time in Universal time. + + + See the for details on the date pattern syntax. + + + + Nicko Cadell + + + + Write the current date and time to the output + + that will receive the formatted result. + null, state is not set + + + Pass the current date and time to the + for it to render it to the writer. + + + The date is in Universal time when it is rendered. + + + + + + + The fully qualified type of the UtcDatePatternConverter class. + + + Used by the internal logger to record the Type of the + log message. + + + + + String keyed object map. + + + + While this collection is serializable, only member objects that are serializable + will be serialized along with this collection. + + + Nicko Cadell + Gert Driesen + + + + Constructor + + + + Initializes a new instance of the class. + + + + + + Constructor + + properties to copy + + + Initializes a new instance of the class. + + + + + + Initializes a new instance of the class + with serialized data. + + The that holds the serialized object data. + The that contains contextual information about the source or destination. + + + Because this class is sealed the serialization constructor is private. + + + + + + Gets or sets the value of the property with the specified key. + + + The value of the property with the specified key. + + The key of the property to get or set. + + + The property value will only be serialized if it is serializable. + If it cannot be serialized it will be silently ignored if + a serialization operation is performed. + + + + + + See . + + + + + Remove the entry with the specified key from this dictionary + + the key for the entry to remove + + + Remove the entry with the specified key from this dictionary + + + + + + See + + an enumerator + + + Returns a over the contest of this collection. + + + + + + See + + the key to remove + + + Remove the entry with the specified key from this dictionary + + + + + + Remove all properties from the properties collection + + + + Remove all properties from the properties collection + + + + + + See + + the key + the value to store for the key + + + Store a value for the specified . + + + Thrown if the is not a string + + + + See + + + false + + + + This collection is modifiable. This property always + returns false. + + + + + + See + + + The value for the key specified. + + + + Get or set a value for the specified . + + + Thrown if the is not a string + + + + A class to hold the key and data for a property set in the config file + + + + + Property Key + + + + + Property Value + + + + + Override Object.ToString to return sensible debug info + + string info about this object + + + + A that ignores the message + + + This writer is used in special cases where it is necessary + to protect a writer from being closed by a client. + + Nicko Cadell + + + + Constructor + + the writer to actually write to + + Create a new ProtectCloseTextWriter using a writer + + + + + Attaches this instance to a different underlying . + + the writer to attach to + + + + Does not close the underlying output writer. + + + + + that does not leak exceptions + + + + does not throw exceptions when things go wrong. + Instead, it delegates error handling to its . + + + Nicko Cadell + Gert Driesen + + + + Constructor + + the writer to actually write to + the error handler to report error to + + + Create a new QuietTextWriter using a writer and error handler + + + + + + Gets or sets the error handler that all errors are passed to. + + + The error handler that all errors are passed to. + + + + Gets or sets the error handler that all errors are passed to. + + + + + + Gets a value indicating whether this writer is closed. + + + true if this writer is closed, otherwise false. + + + + Gets a value indicating whether this writer is closed. + + + + + + Writes a character to the underlying writer + + the char to write + + + Writes a character to the underlying writer + + + + + + Writes a buffer to the underlying writer + + the buffer to write + the start index to write from + the number of characters to write + + + Writes a buffer to the underlying writer + + + + + + Writes a string to the output. + + The string data to write to the output. + + + + Closes the underlying output writer. + + + + Closes the underlying output writer. + + + + + + The error handler instance to pass all errors to + + + + + Defines a lock that supports single writers and multiple readers + + + + ReaderWriterLock is used to synchronize access to a resource. + At any given time, it allows either concurrent read access for + multiple threads, or write access for a single thread. In a + situation where a resource is changed infrequently, a + ReaderWriterLock provides better throughput than a simple + one-at-a-time lock, such as . + + + If a platform does not support a System.Threading.ReaderWriterLock + implementation then all readers and writers are serialized. Therefore + the caller must not rely on multiple simultaneous readers. + + + Nicko Cadell + + + + Acquires a reader lock + + + + blocks if a different thread has the writer + lock, or if at least one thread is waiting for the writer lock. + + + + + + Decrements the lock count + + + + decrements the lock count. When the count + reaches zero, the lock is released. + + + + + + Acquires the writer lock + + + + This method blocks if another thread has a reader lock or writer lock. + + + + + + Decrements the lock count on the writer lock + + + + ReleaseWriterLock decrements the writer lock count. + When the count reaches zero, the writer lock is released. + + + + + + String keyed object map that is read only. + + + + This collection is readonly and cannot be modified. It is not thread-safe. + + + While this collection is serializable, only member + objects that are serializable will + be serialized along with this collection. + + + Nicko Cadell + Gert Driesen + + + + Constructor + + + + Initializes a new instance of the class. + + + + + + Copy Constructor + + properties to copy + + + Initializes a new instance of the class. + + + + + + Deserialization constructor + + The that holds the serialized object data. + The that contains contextual information about the source or destination. + + + Initializes a new instance of the class + with serialized data. + + + + + + Gets the key names. + + An array of all the keys. + + + Gets the key names. + + + + + + See . + + + + + See . + + + + + See . + + + + + See . + + + + + Gets or sets the value of the property with the specified key. + + + The value of the property with the specified key, or null if a property is not present in the dictionary. + Note this is the semantic, not that of . + + The key of the property to get or set. + + + The property value will only be serialized if it is serializable. + If it cannot be serialized it will be silently ignored if + a serialization operation is performed. + + + + + + Test if the dictionary contains a specified key + + the key to look for + true if the dictionary contains the specified key + + + Test if the dictionary contains a specified key + + + + + + The hashtable used to store the properties + + + The internal collection used to store the properties + + + + The hashtable used to store the properties + + + + + + Serializes this object into the provided. + + The to populate with data. + The destination for this serialization. + + + Serializes this object into the provided. + + + + + + See + + + + + See + + + + + See + + + + + + See + + + + + See . + + + + + Removes all properties from the properties collection + + + + + See . + + + + + See . + + + + + See . + + + + + See . + + + + + See . + + + + + See + + + + + See . + + + + + See . + + + + + See + + + + + See + + + + + See + + + + + See + + + + + See + + + + + The number of properties in this collection + + + + + See . + + + + + See + + + + + See + + + + + A that can be and reused + + + + This uses a single buffer for string operations. + + + Nicko Cadell + + + + Creates an instance of + + the format provider to use + + + + Override Dispose to prevent closing of writer + + flag + + + + Reset this string writer so that it can be reused. + + the maximum buffer capacity before it is trimmed + the default size to make the buffer + + + Reset this string writer so that it can be reused. + The internal buffers are cleared and reset. + + + + + + Utility class for system specific information. + + Nicko Cadell + Gert Driesen + Alexey Solofnenko + + + + Initialize default values for private static fields. + + + + Only static methods are exposed from this type. + + + + + + Gets the system dependent line terminator. + + + + + Gets the base directory for this . + + + + The value returned may be either a local file path or a URI. + + + + + + Gets the path to the configuration file for the current . + + + + The value returned may be either a local file path or a URI. + + + + + + Gets the path to the file that first executed in the current . + + + + + Gets the ID of the current thread. + + + + + Gets the host name or machine name for the current machine. + + + + The host name () or + the machine name () for + the current machine, or if neither of these are available + then NOT AVAILABLE is returned. + + + + + + Gets this application's friendly name. + + + + If available the name of the application is retrieved from + the AppDomain using AppDomain.CurrentDomain.FriendlyName. + + + Otherwise the file name of the entry assembly is used. + + + + + + Get the UTC start time for the current process. + + + + This is the UTC time at which the log4net library was loaded into the + AppDomain. Due to reports of a hang in the call to System.Diagnostics.Process.StartTime + this is not the start time for the current process. + + + The log4net library should be loaded by an application early during its + startup, therefore this start time should be a good approximation for + the actual start time. + + + Note that AppDomains may be loaded and unloaded within the + same process without the process terminating, however this start time + will be set per AppDomain. + + + + + + Text to output when a null is encountered. + + + + Use this value to indicate a null has been encountered while + outputting a string representation of an item. + + + The default value is (null). This value can be overridden by specifying + a value for the log4net.NullText appSetting in the application's + .config file. + + + + + + Text to output when an unsupported feature is requested. + + + + Use this value when an unsupported feature is requested. + + + The default value is NOT AVAILABLE. This value can be overridden by specifying + a value for the log4net.NotAvailableText appSetting in the application's + .config file. + + + + + + Gets the assembly location path for the specified assembly. + + The assembly to get the location for. + The location of the assembly. + + + This method does not guarantee to return the correct path + to the assembly. If only tries to give an indication as to + where the assembly was loaded from. + + + + + + Gets the short name of the . + + The to get the name for. + The short name of the . + + + The short name of the assembly is the + without the version, culture, or public key. i.e. it is just the + assembly's file name without the extension. + + + Because of a FileIOPermission security demand we cannot do + the obvious Assembly.GetName().Name. We are allowed to get + the of the assembly so we + start from there and strip out just the assembly name. + + + + + + Gets the file name portion of the , including the extension. + + The to get the file name for. + The file name of the assembly. + + + Gets the file name portion of the , including the extension. + + + + + + Loads the type specified in the type string. + + A sibling type to use to load the type. + The name of the type to load. + Flag set to true to throw an exception if the type cannot be loaded. + true to ignore the case of the type name; otherwise, false + The type loaded or null if it could not be loaded. + + + If the type name is fully qualified, i.e. if contains an assembly name in + the type name, the type will be loaded from the system using + . + + + If the type name is not fully qualified, it will be loaded from the assembly + containing the specified relative type. If the type is not found in the assembly + then all the loaded assemblies will be searched for the type. + + + + + + Loads the type specified in the type string. + + The name of the type to load. + Flag set to true to throw an exception if the type cannot be loaded. + true to ignore the case of the type name; otherwise, false + The type loaded or null if it could not be loaded. + + + If the type name is fully qualified, i.e. if contains an assembly name in + the type name, the type will be loaded from the system using + . + + + If the type name is not fully qualified it will be loaded from the + assembly that is directly calling this method. If the type is not found + in the assembly then all the loaded assemblies will be searched for the type. + + + + + + Loads the type specified in the type string. + + An assembly to load the type from. + The name of the type to load. + Flag set to true to throw an exception if the type cannot be loaded. + true to ignore the case of the type name; otherwise, false + The type loaded or null if it could not be loaded. + + + If the type name is fully qualified, i.e. if contains an assembly name in + the type name, the type will be loaded from the system using + . + + + If the type name is not fully qualified it will be loaded from the specified + assembly. If the type is not found in the assembly then all the loaded assemblies + will be searched for the type. + + + + + + Creates an + + The name of the parameter that caused the exception + The value of the argument that causes this exception + The message that describes the error + + A new instance of the class + with the specified error message, parameter name, and value + of the argument. + + + + + Creates a for read-only collection modification calls. + + The NotSupportedException object + + + + Parse a string into an value + + the string to parse + out param where the parsed value is placed + true if the string was parsed into an integer + + + Attempts to parse the string into an integer. If the string cannot + be parsed then this method returns false. The method does not throw an exception. + + + + + + Parse a string into an value + + the string to parse + out param where the parsed value is placed + true if the string was parsed into an integer + + + Attempts to parse the string into an integer. If the string cannot + be parsed then this method returns false. The method does not throw an exception. + + + + + + Parse a string into an value + + the string to parse + out param where the parsed value is placed + true if the string was parsed into an integer + + + Attempts to parse the string into an integer. If the string cannot + be parsed then this method returns false. The method does not throw an exception. + + + + + + Lookup an application setting + + the application settings key to lookup + the value for the key, or null + + + + Convert a path into a fully qualified local file path. + + The path to convert. + The fully qualified path. + + + Converts the path specified to a fully + qualified path. If the path is relative it is + taken as relative from the application base + directory. + + + The path specified must be a local file path, a URI is not supported. + + + + + + Creates a new case-insensitive instance of the class with the default initial capacity. + + A new case-insensitive instance of the class with the default initial capacity + + + The new Hashtable instance uses the default load factor, the CaseInsensitiveHashCodeProvider, and the CaseInsensitiveComparer. + + + + + + Tests two strings for equality, the ignoring case. + + + If the platform permits, culture information is ignored completely (ordinal comparison). + The aim of this method is to provide a fast comparison that deals with null and ignores different casing. + It is not supposed to deal with various, culture-specific habits. + Use it to compare against pure ASCII constants, like keywords etc. + + The one string. + The other string. + true if the strings are equal, false otherwise. + + + + The fully qualified type of the SystemInfo class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Cache the host name for the current machine + + + + + Cache the application friendly name + + + + + Utility class that represents a format string. + + Nicko Cadell + An that supplies culture-specific formatting information. + A containing zero or more format items. + An array containing zero or more objects to format. + + + + Utility class that represents a format string. + + Nicko Cadell + An that supplies culture-specific formatting information. + A containing zero or more format items. + An array containing zero or more objects to format. + + + + Format + + + + + Args + + + + + Format the string and arguments + + the formatted string + + + + Replaces the format item in a specified with the text equivalent + of the value of a corresponding instance in a specified array. + A specified parameter supplies culture-specific formatting information. + + An that supplies culture-specific formatting information. + A containing zero or more format items. + An array containing zero or more objects to format. + + A copy of format in which the format items have been replaced by the + equivalent of the corresponding instances of in args. + + + + This method does not throw exceptions. If an exception thrown while formatting the result the + exception and arguments are returned in the result string. + + + + + + Process an error during StringFormat + + + + + Dump the contents of an array into a string builder + + + + + Dump an object to a string + + + + + The fully qualified type of the SystemStringFormat class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Adapter that extends and forwards all + messages to an instance of . + + Nicko Cadell + + + + Creates an instance of that forwards all + messages to a . + + The to forward to + + + + Gets or sets the underlying . + + + + + The in which the output is written + + + + + Gets an object that controls formatting + + + + + Gets or sets the line terminator string used by the TextWriter. + + + + + Closes the writer and releases any system resources associated with the writer + + + + + + + + + Dispose this writer + + flag indicating if we are being disposed + + + Dispose this writer + + + + + + Flushes any buffered output + + + + Clears all buffers for the writer and causes any buffered data to be written + to the underlying device + + + + + + Writes a character to the wrapped TextWriter + + the value to write to the TextWriter + + + Writes a character to the wrapped TextWriter + + + + + + Writes a character buffer to the wrapped TextWriter + + the data buffer + the start index + the number of characters to write + + + Writes a character buffer to the wrapped TextWriter + + + + + + Writes a string to the wrapped TextWriter + + the value to write to the TextWriter + + + Writes a string to the wrapped TextWriter + + + + + + Implementation of Properties collection for the + + + + Class implements a collection of properties that is specific to each thread. + The class is not synchronized as each thread has its own . + + + Nicko Cadell + + + + Each thread will automatically have its instance. + + + + + Internal constructor + + + + Initializes a new instance of the class. + + + + + + Gets or sets the value of a property + + + The value for the property with the specified key + + + + Gets or sets the value of a property + + + + + + Remove a property + + the key for the entry to remove + + + Remove a property + + + + + + Get the keys stored in the properties. + + + Gets the keys stored in the properties. + + a set of the defined keys + + + + Clear all properties + + + + Clear all properties + + + + + + Get the PropertiesDictionary for this thread. + + create the dictionary if it does not exist, otherwise return null if it does not exist + the properties for this thread + + + The collection returned is only to be used on the calling thread. If the + caller needs to share the collection between different threads then the + caller must clone the collection before doing so. + + + + + + Implementation of Stack for the + + + + Implementation of Stack for the + + + Nicko Cadell + + + + The stack store. + + + + + Internal constructor + + + + Initializes a new instance of the class. + + + + + + The number of messages in the stack + + + The current number of messages in the stack + + + + The current number of messages in the stack. That is + the number of times has been called + minus the number of times has been called. + + + + + + Clears all the contextual information held in this stack. + + + + Clears all the contextual information held in this stack. + Only call this if you think that this tread is being reused after + a previous call execution which may not have completed correctly. + You do not need to use this method if you always guarantee to call + the method of the + returned from even in exceptional circumstances, + for example by using the using(log4net.ThreadContext.Stacks["NDC"].Push("Stack_Message")) + syntax. + + + + + + Removes the top context from this stack. + + The message in the context that was removed from the top of this stack. + + + Remove the top context from this stack, and return + it to the caller. If this stack is empty then an + empty string (not ) is returned. + + + + + + Pushes a new context message into this stack. + + The new context message. + + An that can be used to clean up the context stack. + + + + Pushes a new context onto this stack. An + is returned that can be used to clean up this stack. This + can be easily combined with the using keyword to scope the + context. + + + Simple example of using the Push method with the using keyword. + + using(log4net.ThreadContext.Stacks["NDC"].Push("Stack_Message")) + { + log.Warn("This should have an ThreadContext Stack message"); + } + + + + + + Returns the top context from this stack. + + The message in the context from the top of this stack. + + + Returns the top context from this stack. If this stack is empty then an + empty string (not ) is returned. + + + + + + Gets the current context information for this stack. + + The current context information. + + + + Gets and sets the internal stack used by this + + The internal storage stack + + + This property is provided only to support backward compatibility + of the . Typically the internal stack should not + be modified. + + + + + + Gets the current context information for this stack. + + + + + Get a portable version of this object + + + + + Inner class used to represent a single context frame in the stack. + + + + + Constructor + + The message for this context. + The parent context in the chain. + + + Initializes a new instance of the class + with the specified message and parent context. + + + + + + Get the message. + + + + + Gets the full text of the context down to the root level. + + + + + Struct returned from the method. + + + + This struct implements the and is designed to be used + with the pattern to remove the stack frame at the end of the scope. + + + + + + The ThreadContextStack internal stack + + + + + The depth to trim the stack to when this instance is disposed + + + + + Initializes a new instance of the class with + the specified stack and return depth. + + The internal stack used by the ThreadContextStack. + The depth to return the stack to when this object is disposed. + + + + Returns the stack to the correct depth. + + + + + Implementation of Stacks collection for the + + Nicko Cadell + + + + Initializes a new instance of the class. + + + + + Gets the named thread context stack. + + + + + The fully qualified type of the ThreadContextStacks class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Utility class for transforming strings. + + + + Utility class for transforming strings. + + + Nicko Cadell + Gert Driesen + + + + Write a string to an + + the writer to write to + the string to write + The string to replace non XML compliant chars with + + + The test is escaped either using XML escape entities + or using CDATA sections. + + + + + + Replace invalid XML characters in text string + + the XML text input string + the string to use in place of invalid characters + A string that does not contain invalid XML characters. + + + Certain Unicode code points are not allowed in the XML InfoSet, for + details see: http://www.w3.org/TR/REC-xml/#charsets. + + + This method replaces any illegal characters in the input string + with the mask string specified. + + + + + + Count the number of times that the substring occurs in the text + + the text to search + the substring to find + the number of times the substring occurs in the text + + + The substring is assumed to be non repeating within itself. + + + + + + Characters illegal in XML 1.0 + + + + + Type converter for Boolean. + + + + Supports conversion from string to bool type. + + + + + + Nicko Cadell + Gert Driesen + + + + Can the source type be converted to the type supported by this object + + the type to convert + + True if the is + the type. + + + + + Converts the source object to the type supported by this object + + the object to convert + the converted object + + + Uses the method to convert the + argument to a . + + + + The object cannot be converted to the + target type. To check for this condition use the + method. + + + + + Exception base type for conversion errors. + + + + This type extends . It + does not add any new functionality but does differentiate the + type of exception being thrown. + + + Nicko Cadell + Gert Driesen + + + + Constructor + + + + Initializes a new instance of the class. + + + + + + Constructor + + A message to include with the exception. + + + Initializes a new instance of the class + with the specified message. + + + + + + Constructor + + A message to include with the exception. + A nested exception to include. + + + Initializes a new instance of the class + with the specified message and inner exception. + + + + + + Serialization constructor + + The that holds the serialized object data about the exception being thrown. + The that contains contextual information about the source or destination. + + + Initializes a new instance of the class + with serialized data. + + + + + + Creates a new instance of the class. + + The conversion destination type. + The value to convert. + An instance of the . + + + Creates a new instance of the class. + + + + + + Creates a new instance of the class. + + The conversion destination type. + The value to convert. + A nested exception to include. + An instance of the . + + + Creates a new instance of the class. + + + + + + Register of type converters for specific types. + + + + Maintains a registry of type converters used to convert between types. + + + Use the and + methods to register new converters. + The and methods + lookup appropriate converters to use. + + + + + Nicko Cadell + Gert Driesen + + + + This class constructor adds the intrinsic type converters + + + + + Adds a converter for a specific type. + + The type being converted to. + The type converter to use to convert to the destination type. + + + + Adds a converter for a specific type. + + The type being converted to. + The type of the type converter to use to convert to the destination type. + + + + Gets the type converter to use to convert values to the destination type. + + The type being converted from. + The type being converted to. + + The type converter instance to use for type conversions or null + if no type converter is found. + + + + + Gets the type converter to use to convert values to the destination type. + + The type being converted to. + + The type converter instance to use for type conversions or null + if no type converter is found. + + + + + Lookups the type converter to use as specified by the attributes on the + destination type. + + The type being converted to. + + The type converter instance to use for type conversions or null + if no type converter is found. + + + + + Creates the instance of the type converter. + + The type of the type converter. + + The type converter instance to use for type conversions or null + if no type converter is found. + + + + The type specified for the type converter must implement + the or interfaces + and must have a public default (no argument) constructor. + + + + + + The fully qualified type of the ConverterRegistry class. + + + Used by the internal logger to record the Type of the + log message. + + + + + Supports conversion from string to type. + + + + + Nicko Cadell + Gert Driesen + + + + Can the source type be converted to the type supported by this object + + the type to convert + + True if the is + the type. + + + + + Overrides the ConvertFrom method of IConvertFrom. + + the object to convert to an encoding + the encoding + + + Uses the method to + convert the argument to an . + + + + The object cannot be converted to the + target type. To check for this condition use the + method. + + + + + Interface supported by type converters + + + + This interface supports conversion from arbitrary types + to a single target type. See . + + + Nicko Cadell + Gert Driesen + + + + Can the source type be converted to the type supported by this object + + the type to convert + true if the conversion is possible + + + Test if the can be converted to the + type supported by this converter. + + + + + + Convert the source object to the type supported by this object + + the object to convert + the converted object + + + Converts the to the type supported + by this converter. + + + + + + Interface supported by type converters + + + + This interface supports conversion from a single type to arbitrary types. + See . + + + Nicko Cadell + + + + Returns whether this converter can convert the object to the specified type + + A Type that represents the type you want to convert to + true if the conversion is possible + + + Test if the type supported by this converter can be converted to the + . + + + + + + Converts the given value object to the specified type, using the arguments + + the object to convert + The Type to convert the value parameter to + the converted object + + + Converts the (which must be of the type supported + by this converter) to the specified.. + + + + + + Supports conversion from string to type. + + + + Supports conversion from string to type. + + + + + Nicko Cadell + + + + Can the source type be converted to the type supported by this object + + the type to convert + true if the conversion is possible + + + Returns true if the is + the type. + + + + + + Overrides the ConvertFrom method of IConvertFrom. + + the object to convert to an IPAddress + the IPAddress + + + Uses the method to convert the + argument to an . + If that fails then the string is resolved as a DNS hostname. + + + + The object cannot be converted to the + target type. To check for this condition use the + method. + + + + + Supports conversion from string to type. + + + + The string is used as the + of the . + + + + + + Nicko Cadell + + + + Can the source type be converted to the type supported by this object + + the type to convert + + True if the is + the type. + + + + + Overrides the ConvertFrom method of IConvertFrom. + + the object to convert to a PatternLayout + the PatternLayout + + + Creates and returns a new using + the as the + . + + + + The object cannot be converted to the + target type. To check for this condition use the + method. + + + + + Convert between string and + + + + Supports conversion from string to type, + and from a type to a string. + + + The string is used as the + of the . + + + + + + Nicko Cadell + + + + Can the target type be converted to the type supported by this object + + A that represents the type you want to convert to + true if the conversion is possible + + + Returns true if the is + assignable from a type. + + + + + + Converts the given value object to the specified type, using the arguments + + the object to convert + The Type to convert the value parameter to + the converted object + + + Uses the method to convert the + argument to a . + + + + The object cannot be converted to the + . To check for this condition use the + method. + + + + + Can the source type be converted to the type supported by this object + + the type to convert + + True if the is + the type. + + + + + Overrides the ConvertFrom method of IConvertFrom. + + the object to convert to a PatternString + the PatternString + + + Creates and returns a new using + the as the + . + + + + The object cannot be converted to the + target type. To check for this condition use the + method. + + + + + Supports conversion from string to type. + + + + + Nicko Cadell + + + + Can the source type be converted to the type supported by this object + + the type to convert + + True if the is + the type. + + + + + Overrides the ConvertFrom method of IConvertFrom. + + the object to convert to a Type + the Type + + + Uses the method to convert the + argument to a . + Additional effort is made to locate partially specified types + by searching the loaded assemblies. + + + + The object cannot be converted to the + target type. To check for this condition use the + method. + + + + + Attribute used to associate a type converter + + + + Class and Interface level attribute that specifies a type converter + to use with the associated type. + + + To associate a type converter with a target type apply a + TypeConverterAttribute to the target type. Specify the + type of the type converter on the attribute. + + + Nicko Cadell + Gert Driesen + + + + Creates a new type converter attribute for the specified type name + + The string type name of the type converter + + + The type specified must implement the + or the interfaces. + + + + + + Creates a new type converter attribute for the specified type + + The type of the type converter + + + The type specified must implement the + or the interfaces. + + + + + + The string type name of the type converter + + + + The type specified must implement the + or the interfaces. + + + + + + Specifies that null is allowed as an input even if the corresponding type disallows it. + + + + + Initializes a new instance of the System.Diagnostics.CodeAnalysis.AllowNullAttribute class. + + + + + Specifies that null is disallowed as an input even if the corresponding type allows it. + + + + + Initializes a new instance of the System.Diagnostics.CodeAnalysis.DisallowNullAttribute class. + + + + + Specifies that a method that will never return under any circumstance. + + + + + Initializes a new instance of the System.Diagnostics.CodeAnalysis.DoesNotReturnAttribute class. + + + + + Specifies that the method will not return if the associated System.Boolean parameter is passed the specified value. + + + + + Initializes a new instance of the System.Diagnostics.CodeAnalysis.DoesNotReturnIfAttribute class + with the specified parameter value. + + + The condition parameter value. + Code after the method is considered unreachable by diagnostics if the argument to the associated parameter + matches this value. + + + + + Gets the condition parameter value. + + The condition parameter value. Code after the method is considered unreachable + by diagnostics if the argument to the associated parameter matches this value. + + + + + Specifies that an output may be null even if the corresponding type disallows it. + + + + + Specifies that when a method returns System.Diagnostics.CodeAnalysis.MaybeNullWhenAttribute.ReturnValue, + the parameter may be null even if the corresponding type disallows it. + + + + + Initializes the attribute with the specified return value condition. + + The return value condition. If the method returns this value, the associated parameter may be null. + + + + Gets the return value condition. + + + + + Specifies that the method or property will ensure that the listed field and property members have values that aren't null. + + + + + Initializes the attribute with list of field or property members. + + The list of field and property members that are promised to be non-null. + + + + Initializes the attribute with a field or property member. + + The field or property member that is promised to be non-null. + + + + Gets field or property member names. + + + + + Specifies that the method or property will ensure that the listed field and property members have non-null values + when returning with the specified return value condition. + + + + + Initializes the attribute with the specified return value condition and a field or property member. + + The return value condition. If the method returns this value, the associated parameter will not be null. + The list of field and property members that are promised to be non-null. + + + + Initializes the attribute with the specified return value condition and a field or property member. + + The return value condition. If the method returns this value, the associated parameter will not be null. + The field or property member that is promised to be non-null. + + + + Gets field or property member names. + + + + + Gets the return value condition. + + + + + Specifies that an output is not even if the corresponding type allows it. + Specifies that an input argument was not when the call returns. + + + + + Specifies that the output will be non-null if the named parameter is non-null. + + + + + Initializes the attribute with the associated parameter name. + + + The associated parameter name. + The output will be non-null if the argument to the parameter specified is non-null. + + + + + Gets the associated parameter name. + + + + + Specifies that when a method returns ReturnValue, + the parameter will not be null even if the corresponding type allows it. + + + + + Initializes the attribute with the specified return value condition. + + + The return value condition. + If the method returns this value, the associated parameter will not be null. + + + + Gets the return value condition. + + + + + Specifies that this constructor sets all required members for the current type, + and callers do not need to set any required members themselves. + + + + + Attribute to tell Roslyn-Analyzers that a parameter will be checked for + + + + + Indicates that a parameter captures the expression passed for another parameter as a string. + + + + + Name of the parameter whose expression should be captured as a string + + + + + + + + Indicates that compiler support for a particular feature is required for the location where this attribute is applied + + + + + The used for the ref structs C# feature + + + + + The used for the required members C# feature + + + + + The name of the compiler feature + + + + + Gets a value that indicates whether the compiler can choose to allow access to the location + where this attribute is applied if it does not understand + + + + + Initializes a instance for the passed in compiler feature + + The name of the compiler feature + + + + + + + + + + + + + + + + + + + + + + + + + + + + Specifies that a type has required members or that a member is required + + + + diff --git a/packages/log4net.3.0.3-preview.1/log4net.3.0.3-preview.1.nupkg b/packages/log4net.3.0.3-preview.1/log4net.3.0.3-preview.1.nupkg new file mode 100644 index 0000000000000000000000000000000000000000..51c84a8c2c2197afc990a98cfeb43726d964b39f GIT binary patch literal 718681 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 z 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

    a6*xm5$$q`X$%XaRQojg!=wn~hsBK*N)G?X9> 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%0DDaVCO1LmURTfSU4j>alQ;uvF9iXL8y95QK;+wj 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⋘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 AFitxe; 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

    CPE|koyrpjlE#{%ZeYM?h1iGXL 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 JPDHLkV1i$1cXR*% literal 0 HcmV?d00001

    #Ki1V|pLSH}=vNNIFVSS5;67uNSG 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 !9Kw*PGm%fY?_8&-RHxb^_Qw0R=mhneri>_e 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�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 Ha{+k(M#T&c literal 0 HcmV?d00001 diff --git a/packages/log4net.3.0.3-preview.1/package-icon.png b/packages/log4net.3.0.3-preview.1/package-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..7b596e6683ddbb083f672c3b5d9270a9a3035ec0 GIT binary patch literal 40042 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