0963a156eb61250a0cdfdd19c91fb7f45ec7bcc3
[hs-java.git] / Java / JAR / Archive.hs
1 -- | This module defines functions to read Java JAR files.
2 module Java.JAR.Archive where
3
4 import qualified Codec.Archive.LibZip as Zip
5 import Data.Binary
6 import qualified Data.ByteString.Lazy as B
7
8 import Java.ClassPath.Types
9 import Java.ClassPath.Common
10 import JVM.ClassFile
11 import JVM.Converter
12
13 readJAREntry :: (Enum a) => FilePath -> String -> IO (Maybe [a])
14 readJAREntry jarfile path = do
15   Zip.catchZipError (Just `fmap` (Zip.withArchive [] jarfile $ Zip.fileContents [] path))
16                     (\_ -> return Nothing)
17
18 -- | Read all entires from JAR file
19 readAllJAR :: FilePath -> IO [Tree CPEntry]
20 readAllJAR jarfile = do
21   files <- Zip.withArchive [] jarfile $ Zip.fileNames []
22   return $ mapF (NotLoadedJAR jarfile) (buildTree files)
23
24 -- | Read one class from JAR file
25 readFromJAR :: FilePath -> FilePath -> IO (Class Direct)
26 readFromJAR jarfile path = do
27   content <- Zip.withArchive [] jarfile $ Zip.fileContents [] path
28   let bstr = B.pack content
29   return $ classFile2Direct (decode bstr)
30