h-gpgme-0.2.0.0: src/Crypto/Gpgme/Ctx.hs
module Crypto.Gpgme.Ctx where
import Bindings.Gpgme
import Foreign
import Foreign.C.String
import Foreign.C.Types
import Crypto.Gpgme.Types
import Crypto.Gpgme.Internal
-- | Creates a new 'Ctx' from a @homedirectory@, a @locale@
-- and a @protocol@. Needs to be freed with 'freeCtx', which
-- is why you are encouraged to use 'withCtx'.
newCtx :: String -- ^ path to gpg homedirectory
-> String -- ^ locale
-> Protocol -- ^ protocol
-> IO Ctx
newCtx homedir localeStr protocol =
do homedirPtr <- newCString homedir
-- check version: necessary for initialization!!
version <- c'gpgme_check_version nullPtr >>= peekCString
-- create context
ctxPtr <- malloc
checkError "gpgme_new" =<< c'gpgme_new ctxPtr
ctx <- peek ctxPtr
-- set locale
locale <- newCString localeStr
checkError "set_locale" =<< c'gpgme_set_locale ctx lcCtype locale
-- set protocol in ctx
checkError "set_protocol" =<< c'gpgme_set_protocol ctx
(fromProtocol protocol)
-- set homedir in ctx
checkError "set_engine_info" =<< c'gpgme_ctx_set_engine_info ctx
(fromProtocol protocol) nullPtr homedirPtr
return (Ctx ctxPtr version)
where lcCtype :: CInt
lcCtype = 0
-- | Free a previously created 'Ctx'
freeCtx :: Ctx -> IO ()
freeCtx (Ctx ctxPtr _) =
do ctx <- peek ctxPtr
c'gpgme_release ctx
free ctxPtr
-- | Runs the action with a new 'Ctx' and frees it afterwards
--
-- See 'newCtx' for a descrption of the parameters.
withCtx :: String -- ^ path to gpg homedirectory
-> String -- ^ locale
-> Protocol -- ^ protocol
-> (Ctx -> IO a) -- ^ action to be run with ctx
-> IO a
withCtx homedir localeStr prot f = do
ctx <- newCtx homedir localeStr prot
res <- f ctx
freeCtx ctx
return res
-- | Sets the produced output to be ASCII armored
--
-- Inject between `withCtx' and your 'IO a' like
--
-- > withCtx homedir locale OpenPGP $ withArmor $ \ctx ->
-- > withKey ctx fpr NoSecret $ \pubkey ->
-- > encrypt ctx [pubkey] NoFlag plaintext
withArmor :: (Ctx -> IO a) -> Ctx -> IO a
withArmor f ctx = do
cctx <- peek $ _ctx ctx
c'gpgme_set_armor cctx 1
f ctx