summaryrefslogtreecommitdiff
path: root/src/main/frege/buildclient/util/IoUtils.fr
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/frege/buildclient/util/IoUtils.fr')
-rw-r--r--src/main/frege/buildclient/util/IoUtils.fr78
1 files changed, 78 insertions, 0 deletions
diff --git a/src/main/frege/buildclient/util/IoUtils.fr b/src/main/frege/buildclient/util/IoUtils.fr
new file mode 100644
index 0000000..afa6bd6
--- /dev/null
+++ b/src/main/frege/buildclient/util/IoUtils.fr
@@ -0,0 +1,78 @@
+module buildclient.util.IoUtils where
+
+
+import frege.java.Net
+import frege.java.IO
+
+data HttpURLConnection = native java.net.HttpURLConnection where
+ -- Unchecked cast, but who cares
+ native fromUrlConnection "(java.net.HttpURLConnection)" :: MutableIO URLConnection -> IOMutable HttpURLConnection
+ native setRequestProperty :: MutableIO HttpURLConnection -> String -> String -> IO ()
+ native getHeaderField :: MutableIO HttpURLConnection -> String -> IO (Maybe String)
+ native getResponseCode :: MutableIO HttpURLConnection -> IO Int throws IOException
+
+data ZipEntry = native java.util.zip.ZipEntry where
+ native getName :: Mutable s ZipEntry -> ST s String
+ native isDirectory :: Mutable s ZipEntry -> ST s Bool
+
+data ZipInputStream = native java.util.zip.ZipInputStream where
+ native new :: MutableIO InputStream -> IOMutable ZipInputStream
+ native getNextEntry :: MutableIO ZipInputStream -> IO (Maybe (MutableIO ZipEntry)) throws IOException
+ native closeEntry :: MutableIO ZipInputStream -> IO () throws IOException
+extractZip :: Int -> File -> File -> IO ()
+extractZip skipDirs archiveFile targetDirectory =
+ do
+ File.mkdirs targetDirectory
+ fis <- FileInputStream.new archiveFile
+ zis <- ZipInputStream.new fis
+ extractFiles zis
+ return ()
+ where
+ extractFiles zis = do
+ entry <- ZipInputStream.getNextEntry zis
+ case entry of
+ Just n -> extractFile zis n >> extractFiles zis
+ Nothing -> return ()
+ extractFile zis zentry = do
+ isdir <- ZipEntry.isDirectory zentry
+ if isdir
+ then return ()
+ else do
+ name <- ZipEntry.getName zentry
+ let (Right pattern) = Regex.compile "[/\\\\]"
+ let parts = drop skipDirs $ toList $ Regex.split (pattern) name
+ let targetFile = fold File.new targetDirectory parts
+ maybe (return false) File.mkdirs $ File.getParentFile targetFile
+ saveInputStreamTo zis targetFile
+ return ()
+
+writeFileStr :: File -> String -> IO ()
+writeFileStr file text = do
+ fos <- FileOutputStream.new file
+ osw <- OutputStreamWriter.new fos "UTF-8"
+ osw.write text
+ osw.close
+
+readFileStr :: File -> IO String
+readFileStr file = do
+ fis <- FileInputStream.new file
+ isr <- InputStreamReader.new fis "UTF-8"
+ getContentsOf isr
+
+saveInputStreamTo :: MutableIO InputStream -> File -> IO ()
+saveInputStreamTo is file =
+ do maybe (return false) File.mkdirs $ File.getParentFile file
+ fos <- FileOutputStream.new file
+ arr <- newArray 4096
+ copyloop arr fos
+ fos.close
+ return ()
+ where
+ copyloop :: ArrayOf RealWorld Byte -> MutableIO FileOutputStream -> IO ()
+ copyloop buf to = do
+ rc <- InputStream.read is buf
+ if rc < 0
+ then return ()
+ else do
+ OutputStream.write to buf 0 rc
+ copyloop buf to