Function to read and write bytes from streams 31/1731/1
authorHannu Niemistö <hannu.niemisto@semantum.fi>
Mon, 23 Apr 2018 12:02:59 +0000 (15:02 +0300)
committerHannu Niemistö <hannu.niemisto@semantum.fi>
Wed, 25 Apr 2018 14:17:04 +0000 (17:17 +0300)
Change-Id: I5aa133cbdda3acaf36ed4cb0d7175a7ec1e8caff

bundles/org.simantics.scl.data/scl/Data/Binary.scl [new file with mode: 0644]

diff --git a/bundles/org.simantics.scl.data/scl/Data/Binary.scl b/bundles/org.simantics.scl.data/scl/Data/Binary.scl
new file mode 100644 (file)
index 0000000..382528a
--- /dev/null
@@ -0,0 +1,49 @@
+import "Stream"
+
+importJava "java.io.InputStream" where
+    """Reads bytes from the stream to a mutable vector. The maximum number of bytes read is the dimension of the vector. Returns the actual number of bytes read or -1, if the stream has finished."""
+    @JavaName read
+    readBytesM :: InputStream -> MVector Byte -> <Proc> Integer
+
+    """Reads a range of bytes from the stream to a mutable vector. The first integer is the  offset the second integer is the  maximum length of the range. Returns the actual number of bytes read or -1, if the stream has finished."""
+    @JavaName read
+    readRangeOfBytesM :: InputStream -> MVector Byte -> Integer -> Integer -> <Proc> Integer
+
+"""Reads bytes from the stream. The integer parameter is the maximum number of bytes. Returns Nothing if stream has finished or a vector of bytes read."""
+readBytes :: InputStream -> Integer -> <Proc> Maybe (Vector Byte)
+readBytes stream length = 
+    if count == (-1)
+    then Nothing
+    else if count == length
+    then Just (freezeMVector result)
+    else Just (take count (freezeMVector result)) 
+  where
+    result = createMVector length
+    count = readBytesM stream result 
+
+importJava "java.io.OutputStream" where
+    """Writes given vector of bytes to output stream."""
+    @JavaName write
+    writeBytes :: OutputStream -> Vector Byte -> <Proc> ()
+
+    @JavaName write
+    writeBytesM :: OutputStream -> MVector Byte -> <Proc> ()
+    
+    """Writes a range of bytes from the vector to output stream. The first integer is the offset the second integer is the length of the range."""
+    @JavaName write
+    writeRangeOfBytes :: OutputStream -> Vector Byte -> Integer -> Integer -> <Proc> ()
+    
+    @JavaName write
+    writeRangeOfBytesM :: OutputStream -> MVector Byte -> Integer -> Integer -> <Proc> ()
+    
+"""Copy all available bytes from output stream to input stream."""
+copyAllBytes :: OutputStream -> InputStream -> <Proc> ()
+copyAllBytes output input = loop ()
+  where
+    buffer = createMVector 4096
+    loop () = let count = readBytesM input buffer
+              in if count == (-1) 
+                 then ()
+                 else do
+                     writeRangeOfBytesM output buffer 0 count
+                     loop ()