Esempio n. 1
0
 public static IOutputStream <TDst> Transform <TSrc, TDst>(this IOutputStream <TSrc> stream, ITransformation <TSrc, TDst> transformation, int readBufSize = 1024)
 {
     //Encoding.UTF8.GetBytes(str, strPos, charsToBuffer, intBuf, 0);
     return(CreateOutput <TDst>(() => {
         var inBuf = new TSrc[readBufSize];
         var inBufPos = 0;
         var inBufCnt = 0;
         IStreamReader <TSrc> reader = null;
         if (stream != null)
         {
             reader = stream.CreateReader();
         }
         return new AnonymousStreamReader <TDst>((buf, ofs, cnt) => {
             var totalBytesCopied = 0;
             while (cnt > 0)
             {
                 var bytesCopied = transformation.Copy(buf, ofs, cnt);
                 if (bytesCopied > 0)
                 {
                     ofs += bytesCopied;
                     cnt -= bytesCopied;
                     totalBytesCopied += bytesCopied;
                 }
                 else
                 {
                     Action process = () => {
                         var itemsProcessed = transformation.Process(inBuf, inBufPos, inBufCnt);
                         inBufCnt -= itemsProcessed;
                         inBufPos += itemsProcessed;
                     };
                     if (inBufCnt > 0)
                     {
                         process();
                     }
                     else
                     {
                         if (reader == null)
                         {
                             return totalBytesCopied;
                         }
                         inBufPos = 0;
                         //try {
                         inBufCnt = reader.Read(inBuf, 0, inBuf.Length);
                         //} catch (Exception err) {
                         //inBufCnt = 0;
                         //try {
                         //    reader.Dispose();
                         //} finally {
                         //    reader = null;
                         //}
                         //}
                         if (inBufCnt > 0)
                         {
                             process();
                         }
                         else
                         {
                             try {
                                 reader.Dispose();
                             } finally {
                                 reader = null;
                             }
                             return totalBytesCopied;
                         }
                     }
                 }
             }
             return totalBytesCopied;
         });
     }));
 }