11using  System ; 
2+ using  System . Drawing ; 
23using  System . IO ; 
4+ using  System . Runtime . InteropServices . ComTypes ; 
35using  System . Text ; 
46using  System . Text . Json ; 
57
@@ -9,27 +11,43 @@ public class JSONPListParser<T>
911    { 
1012
1113        private  bool  theme ; 
14+         private  readonly  JsonReaderOptions  options ; 
1215
1316        public  JSONPListParser ( bool  theme ) 
1417        { 
1518            this . theme  =  theme ; 
19+ 
20+             this . options  =  new  JsonReaderOptions ( ) ; 
21+             options . CommentHandling  =  JsonCommentHandling . Skip ; 
22+             options . AllowTrailingCommas  =  true ; 
1623        } 
1724
1825        public  T  Parse ( Stream  contents ) 
1926        { 
2027            PList < T >  pList  =  new  PList < T > ( theme ) ; 
2128
22-             byte [ ]  hmm  =  new  byte [ contents . Length ] ; 
23-             contents . Read ( hmm ,  0 ,  hmm . Length ) ; 
29+             var  buffer  =  new  byte [ 1024 ] ; 
2430
25-             JsonReaderOptions  options  =  new  JsonReaderOptions ( ) ; 
26-             options . CommentHandling  =  JsonCommentHandling . Skip ; 
27-             options . AllowTrailingCommas  =  true ; 
28-             var  reader  =  new  Utf8JsonReader ( hmm ,  options ) ; 
31+             // Fill the buffer. 
32+             // For this snippet, we're assuming the stream is open and has data. 
33+             // If it might be closed or empty, check if the return value is 0. 
34+             int  size  =  contents . Read ( buffer ,  0 ,  buffer . Length ) ; 
35+ 
36+             var  reader  =  new  Utf8JsonReader ( buffer . AsSpan ( 0 ,  size ) ,  isFinalBlock :  false ,  state :  new  JsonReaderState ( options ) ) ; 
2937
3038            while  ( true ) 
3139            { 
32-                 if  ( ! reader . Read ( ) ) 
40+                 int  bytesRead  =  - 1 ; 
41+ 
42+                 while  ( ! reader . Read ( ) ) 
43+                 { 
44+                     bytesRead  =  GetMoreBytesFromStream ( contents ,  ref  buffer ,  ref  reader ) ; 
45+ 
46+                     if  ( bytesRead  ==  0 ) 
47+                         break ; 
48+                 } 
49+ 
50+                 if  ( bytesRead  ==  0 ) 
3351                    break ; 
3452
3553                JsonTokenType  nextToken  =  reader . TokenType ; 
@@ -66,5 +84,31 @@ public T Parse(Stream contents)
6684            } 
6785            return  pList . GetResult ( ) ; 
6886        } 
87+ 
88+         private  static int  GetMoreBytesFromStream ( Stream  stream ,  ref  byte [ ]  buffer ,  ref  Utf8JsonReader  reader ) 
89+         { 
90+             int  bytesRead ; 
91+             if  ( reader . BytesConsumed  <  buffer . Length ) 
92+             { 
93+                 ReadOnlySpan < byte >  leftover  =  buffer . AsSpan ( ( int ) reader . BytesConsumed ) ; 
94+ 
95+                 if  ( leftover . Length  ==  buffer . Length ) 
96+                 { 
97+                     Array . Resize ( ref  buffer ,  buffer . Length  *  2 ) ; 
98+                 } 
99+ 
100+                 leftover . CopyTo ( buffer ) ; 
101+                 bytesRead  =  stream . Read ( buffer ,  leftover . Length ,  buffer . Length  -  leftover . Length ) ; 
102+                 reader  =  new  Utf8JsonReader ( buffer . AsSpan ( 0 ,  bytesRead  +  leftover . Length ) ,  isFinalBlock :  bytesRead  ==  0 ,  reader . CurrentState ) ; 
103+             } 
104+             else 
105+             { 
106+                 bytesRead  =  stream . Read ( buffer ,  0 ,  buffer . Length ) ; 
107+                 reader  =  new  Utf8JsonReader ( buffer . AsSpan ( 0 ,  bytesRead ) ,  isFinalBlock :  bytesRead  ==  0 ,  reader . CurrentState ) ; 
108+             } 
109+ 
110+             //reader = new Utf8JsonReader(buffer, isFinalBlock: bytesRead == 0, reader.CurrentState); 
111+             return  bytesRead ; 
112+         } 
69113    } 
70114} 
0 commit comments