{-# LINE 1 "LDAP/Result.hsc" #-}
{- -*- Mode: haskell; -*-
Haskell LDAP Interface
Copyright (C) 2005 John Goerzen <jgoerzen@complete.org>

This code is under a 3-clause BSD license; see COPYING for details.
-}

{- |
   Module     : LDAP.Result
   Copyright  : Copyright (C) 2005 John Goerzen
   License    : BSD

   Maintainer : John Goerzen,
   Maintainer : jgoerzen\@complete.org
   Stability  : provisional
   Portability: portable

LDAP Result Processing

Written by John Goerzen, jgoerzen\@complete.org
-}

module LDAP.Result (LDAPMessage, CLDAPMessage,
                    ldap_1result
                   ) where

import LDAP.Utils
import LDAP.Types
import Foreign

{-# LINE 31 "LDAP/Result.hsc" #-}
import Foreign.C.Types(CInt(..))

{-# LINE 33 "LDAP/Result.hsc" #-}



data CLDAPMessage
type LDAPMessage = ForeignPtr CLDAPMessage

{- | Get 1 result from an operation. -}
ldap_1result :: LDAP -> LDAPInt -> IO (LDAPMessage)
ldap_1result :: LDAP -> LDAPInt -> IO LDAPMessage
ldap_1result LDAP
ld LDAPInt
msgid =
    LDAP -> (LDAPPtr -> IO LDAPMessage) -> IO LDAPMessage
forall a. LDAP -> (LDAPPtr -> IO a) -> IO a
withLDAPPtr LDAP
ld (\LDAPPtr
cld ->
    (Ptr (Ptr CLDAPMessage) -> IO LDAPMessage) -> IO LDAPMessage
forall a b. Storable a => (Ptr a -> IO b) -> IO b
alloca (LDAPPtr -> Ptr (Ptr CLDAPMessage) -> IO LDAPMessage
f LDAPPtr
cld)
    )
    where f :: LDAPPtr -> Ptr (Ptr CLDAPMessage) -> IO LDAPMessage
f LDAPPtr
cld (Ptr (Ptr CLDAPMessage)
ptr::Ptr (Ptr CLDAPMessage)) =
              do String -> LDAP -> IO LDAPInt -> IO LDAPInt
checkLEn1 String
"ldap_1result" LDAP
ld (IO LDAPInt -> IO LDAPInt) -> IO LDAPInt -> IO LDAPInt
forall a b. (a -> b) -> a -> b
$
                         LDAPPtr
-> LDAPInt
-> LDAPInt
-> Ptr ()
-> Ptr (Ptr CLDAPMessage)
-> IO LDAPInt
ldap_result LDAPPtr
cld LDAPInt
msgid LDAPInt
0 Ptr ()
forall a. Ptr a
nullPtr Ptr (Ptr CLDAPMessage)
ptr
                 String -> IO (Ptr CLDAPMessage) -> IO LDAPMessage
fromldmptr String
"ldap_1result" (Ptr (Ptr CLDAPMessage) -> IO (Ptr CLDAPMessage)
forall a. Storable a => Ptr a -> IO a
peek Ptr (Ptr CLDAPMessage)
ptr)

fromldmptr :: String -> IO (Ptr CLDAPMessage) -> IO LDAPMessage
fromldmptr :: String -> IO (Ptr CLDAPMessage) -> IO LDAPMessage
fromldmptr String
caller IO (Ptr CLDAPMessage)
action =
    do Ptr CLDAPMessage
ptr <- IO (Ptr CLDAPMessage)
action
       if Ptr CLDAPMessage
ptr Ptr CLDAPMessage -> Ptr CLDAPMessage -> Bool
forall a. Eq a => a -> a -> Bool
== Ptr CLDAPMessage
forall a. Ptr a
nullPtr
          then String -> IO LDAPMessage
forall a. String -> IO a
forall (m :: * -> *) a. MonadFail m => String -> m a
fail (String
caller String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
": got null LDAPMessage pointer")
          else FinalizerPtr CLDAPMessage -> Ptr CLDAPMessage -> IO LDAPMessage
forall a. FinalizerPtr a -> Ptr a -> IO (ForeignPtr a)
newForeignPtr FinalizerPtr CLDAPMessage
ldap_msgfree_call Ptr CLDAPMessage
ptr

foreign import ccall safe "ldap.h ldap_result"
  ldap_result :: LDAPPtr -> LDAPInt -> LDAPInt -> Ptr () -> Ptr (Ptr CLDAPMessage) -> IO LDAPInt

foreign import ccall unsafe "ldap.h &ldap_msgfree"
  ldap_msgfree_call :: FunPtr (Ptr CLDAPMessage -> IO ())