]> gitweb @ CieloNegro.org - Lucu.git/blobdiff - ImplantFile.hs
Exodus to GHC 6.8.1
[Lucu.git] / ImplantFile.hs
index a16c76ec8bee3eb9331cdf9c42a24b99facd99ec..26be80e73e7dcd109160dcfe68be812ff4c66af2 100644 (file)
@@ -2,12 +2,14 @@ import           Codec.Binary.Base64
 import           Codec.Compression.GZip
 import           Control.Monad
 import           Data.Bits
-import           Data.ByteString.Base (LazyByteString)
-import qualified Data.ByteString.Lazy as L
+import qualified Data.ByteString.Lazy as Lazy (ByteString)
+import qualified Data.ByteString.Lazy as L hiding (ByteString)
 import           Data.Char
 import           Data.Digest.SHA1
 import           Data.Int
 import           Data.Maybe
+import           Data.Time
+import           Data.Time.Clock.POSIX
 import           Data.Word
 import           Language.Haskell.Pretty
 import           Language.Haskell.Syntax
@@ -15,11 +17,10 @@ import           Network.HTTP.Lucu.MIMEType
 import           Network.HTTP.Lucu.MIMEType.DefaultExtensionMap
 import           Network.HTTP.Lucu.MIMEType.Guess
 import           System.Console.GetOpt
-import           System.Directory
 import           System.Environment
 import           System.Exit
+import           System.Posix.Files
 import           System.IO
-import           System.Time
 
 data CmdOpt
     = OptOutput FilePath
@@ -111,19 +112,17 @@ generateHaskellSource opts srcFile
              rawB64      = encode $ L.unpack input
              gzippedB64  = encode $ L.unpack gzippedData
 
-             header      = mkHeader srcFile originalLen gzippedLen useGZip mimeType eTag lastMod
+         header <- mkHeader srcFile originalLen gzippedLen useGZip mimeType eTag lastMod
              
-             hsModule = HsModule undefined (Module modName) (Just exports) imports decls
+         let hsModule = HsModule undefined (Module modName) (Just exports) imports decls
              exports  = [HsEVar (UnQual (HsIdent symName))]
              imports  = [ HsImportDecl undefined (Module "Codec.Binary.Base64")
                                        False Nothing Nothing
-                        , HsImportDecl undefined (Module "Data.ByteString.Base")
-                                       False Nothing (Just (False, [HsIVar (HsIdent "LazyByteString")]))
                         , HsImportDecl undefined (Module "Data.ByteString.Lazy")
                                        True (Just (Module "L")) Nothing
-                        , HsImportDecl undefined (Module "Network.HTTP.Lucu")
+                        , HsImportDecl undefined (Module "Data.Time")
                                        False Nothing Nothing
-                        , HsImportDecl undefined (Module "System.Time")
+                        , HsImportDecl undefined (Module "Network.HTTP.Lucu")
                                        False Nothing Nothing
                         ]
                         ++
@@ -263,18 +262,15 @@ generateHaskellSource opts srcFile
              declLastModified
                  = [ HsTypeSig undefined [HsIdent "lastModified"]
                                (HsQualType []
-                                (HsTyCon (UnQual (HsIdent "ClockTime"))))
+                                (HsTyCon (UnQual (HsIdent "UTCTime"))))
                    , HsFunBind [HsMatch undefined (HsIdent "lastModified")
                                 [] (HsUnGuardedRhs defLastModified) []]
                    ]
 
              defLastModified :: HsExp
              defLastModified 
-                 = let TOD a b = lastMod
-                   in 
-                     (HsApp (HsApp (HsCon (UnQual (HsIdent "TOD")))
-                             (HsLit (HsInt a)))
-                      (HsLit (HsInt b)))
+                 = HsApp (HsVar (UnQual (HsIdent "read")))
+                   (HsLit (HsString $ show lastMod))
                             
 
              declContentType :: [HsDecl]
@@ -295,7 +291,7 @@ generateHaskellSource opts srcFile
              declGZippedData 
                  = [ HsTypeSig undefined [HsIdent "gzippedData"]
                                (HsQualType []
-                                (HsTyCon (UnQual (HsIdent "LazyByteString"))))
+                                (HsTyCon (Qual (Module "L") (HsIdent "ByteString"))))
                    , HsFunBind [HsMatch undefined (HsIdent "gzippedData")
                                 [] (HsUnGuardedRhs defGZippedData) []]
                    ]
@@ -311,7 +307,7 @@ generateHaskellSource opts srcFile
              declRawData 
                  = [ HsTypeSig undefined [HsIdent "rawData"]
                                (HsQualType []
-                                (HsTyCon (UnQual (HsIdent "LazyByteString"))))
+                                (HsTyCon (Qual (Module "L") (HsIdent "ByteString"))))
                    , HsFunBind [HsMatch undefined (HsIdent "rawData")
                                 [] (HsUnGuardedRhs defRawData) []]
                    ]
@@ -328,23 +324,24 @@ generateHaskellSource opts srcFile
          hClose output
 
 
-mkHeader :: FilePath -> Int64 -> Int64 -> Bool -> MIMEType -> String -> ClockTime -> String
+mkHeader :: FilePath -> Int64 -> Int64 -> Bool -> MIMEType -> String -> UTCTime -> IO String
 mkHeader srcFile originalLen gzippedLen useGZip mimeType eTag lastMod
-    = "{- DO NOT EDIT THIS FILE.\n" ++
-      "   This file is automatically generated by the lucu-implant-file program.\n" ++
-      "\n" ++
-      "              Source: " ++ (if srcFile == "-"
-                                   then "(stdin)"
-                                   else srcFile) ++ "\n" ++
-      "     Original Length: " ++ show originalLen ++ " bytes\n" ++
-      (if useGZip
-       then "   Compressed Length: " ++ show gzippedLen ++ " bytes\n" ++
-            "         Compression: gzip\n"
-       else "         Compression: disabled\n") ++
-      "           MIME Type: " ++ show mimeType ++ "\n" ++
-      "                ETag: " ++ eTag ++ "\n" ++
-      "       Last Modified: " ++ show lastMod ++ "\n" ++
-      " -}"
+    = do localLastMod <- utcToLocalZonedTime lastMod
+         return ("{- DO NOT EDIT THIS FILE.\n" ++
+                 "   This file is automatically generated by the lucu-implant-file program.\n" ++
+                 "\n" ++
+                 "              Source: " ++ (if srcFile == "-"
+                                              then "(stdin)"
+                                              else srcFile) ++ "\n" ++
+                 "     Original Length: " ++ show originalLen ++ " bytes\n" ++
+                 (if useGZip
+                  then "   Compressed Length: " ++ show gzippedLen ++ " bytes\n" ++
+                       "         Compression: gzip\n"
+                  else "         Compression: disabled\n") ++
+                 "           MIME Type: " ++ show mimeType ++ "\n" ++
+                 "                ETag: " ++ eTag ++ "\n" ++
+                 "       Last Modified: " ++ show localLastMod ++ "\n" ++
+                 " -}")
 
 
 getModuleName :: [CmdOpt] -> IO String
@@ -369,6 +366,7 @@ getSymbolName opts modName
           defaultSymName = mkDefault modName
           mkDefault      = headToLower . getLastComp
           headToLower    = \ str -> case str of
+                                      []     -> error "module name must not be empty"
                                       (x:xs) -> toLower x : xs
           getLastComp    = reverse . fst . break (== '.') . reverse
       in
@@ -392,12 +390,13 @@ getMIMEType opts srcFile
           _                         -> error "too many --mime-type options."
 
 
-getLastModified :: FilePath -> IO ClockTime
-getLastModified "-"   = getClockTime
-getLastModified fpath = getModificationTime fpath
+getLastModified :: FilePath -> IO UTCTime
+getLastModified "-"   = getCurrentTime
+getLastModified fpath = getFileStatus fpath
+                        >>= return . posixSecondsToUTCTime . toEnum . fromEnum . modificationTime
 
 
-getETag :: [CmdOpt] -> LazyByteString -> IO String
+getETag :: [CmdOpt] -> Lazy.ByteString -> IO String
 getETag opts input
     = let eTagOpts = filter (\ x -> case x of
                                       OptETag _ -> True
@@ -421,11 +420,12 @@ getETag opts input
 
       hex4bit :: Int -> Char
       hex4bit n
-          | n < 10 = (chr $ ord '0' + n     )
-          | n < 16 = (chr $ ord 'a' + n - 10)
+          | n < 10    = (chr $ ord '0' + n     )
+          | n < 16    = (chr $ ord 'a' + n - 10)
+          | otherwise = undefined
 
 
-openInput :: FilePath -> IO LazyByteString
+openInput :: FilePath -> IO Lazy.ByteString
 openInput "-"   = L.getContents
 openInput fpath = L.readFile fpath
 
@@ -454,14 +454,13 @@ openOutput opts
            Compression: disabled
              MIME Type: image/png
                   ETag: d41d8cd98f00b204e9800998ecf8427e
-         Last Modified: Wed, 03 Oct 2007 00:55:45 JST
+         Last Modified: 2007-11-05 13:53:42.231882 JST
    -}
   module Foo.Bar.Baz (baz) where
   import Codec.Binary.Base64
-  import Data.ByteString.Base (LazyByteString)
   import qualified Data.ByteString.Lazy as L
+  import Data.Time
   import Network.HTTP.Lucu
-  import System.Time
 
   baz :: ResourceDef
   baz = ResourceDef {
@@ -480,13 +479,13 @@ openOutput opts
   entityTag :: ETag
   entityTag = strongETag "d41d8cd98f00b204e9800998ecf8427e"
 
-  lastModified :: ClockTime
-  lastModified = TOD 1191340545 0
+  lastModified :: UTCTime
+  lastModified = read "2007-11-05 04:47:56.008366 UTC"
 
   contentType :: MIMEType
   contentType = read "image/png"
 
-  rawData :: LazyByteString
+  rawData :: L.ByteString
   rawData = L.pack (decode "IyEvdXNyL2Jpbi9lbnYgcnVuZ2hjCgppbXBvcnQgRGlzdHJ...")
   ------------------------------------------------------------------------------
 
@@ -518,7 +517,7 @@ openOutput opts
         }
   
   -- rawData の代はりに gzippedData
-  gzippedData :: LazyByteString
+  gzippedData :: L.ByteString
   gzippedData = L.pack (decode "Otb/+DniOlRgAAAAYAAAAGAAAAB/6QOmToAEIGAAAAB...")
   ------------------------------------------------------------------------------
  -}