X-Git-Url: http://wien.tomnetworks.com/gitweb/?p=hs-java.git;a=blobdiff_plain;f=Java%2FJAR%2FArchive.hs;fp=Java%2FJAR%2FArchive.hs;h=035f1e1d5b4ec31085e0b1d6a9676bb0d64dddcf;hp=0000000000000000000000000000000000000000;hb=22d4ad212c27135cea11b577c62f7d133d392d4e;hpb=f70370b0813194dc47d76cd349f0d8a02616062c diff --git a/Java/JAR/Archive.hs b/Java/JAR/Archive.hs new file mode 100644 index 0000000..035f1e1 --- /dev/null +++ b/Java/JAR/Archive.hs @@ -0,0 +1,32 @@ + +module Java.JAR.Archive where + +import Control.Monad.Trans +import qualified Control.Monad.State as St +import qualified Codec.Archive.LibZip as Zip +import Data.Binary +import qualified Data.ByteString.Lazy as B + +import Java.ClassPath.Types +import Java.ClassPath.Common +import JVM.ClassFile +import JVM.Converter + +readJAR :: FilePath -> IO [Tree CPEntry] +readJAR jarfile = do + files <- Zip.withArchive [] jarfile $ Zip.fileNames [] + return $ mapF (NotLoadedJAR jarfile) (buildTree files) + +readFromJAR :: FilePath -> FilePath -> IO (Class Direct) +readFromJAR jarfile path = do + content <- Zip.withArchive [] jarfile $ Zip.fileContents [] path + let bstr = B.pack content + return $ classFile2Direct (decode bstr) + +addJAR :: FilePath -> ClassPath () +addJAR jarfile = do + classes <- liftIO $ readJAR jarfile + cp <- St.get + let cp' = merge $ cp ++ classes + St.put cp' +