diff options
Diffstat (limited to 'src/main/frege/buildclient/util/IoUtils.fr')
-rw-r--r-- | src/main/frege/buildclient/util/IoUtils.fr | 78 |
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 |