packages feed

skype4hs-0.0.0.0: src/Network/Skype/API/Carbon/CFDictionary.hsc

module Network.Skype.API.Carbon.CFDictionary where

#include "CoreFoundation/CFDictionary.h"

import Foreign
import Network.Skype.API.Carbon.CFBase

data CFDictionary key value

type CFDictionaryRef key value = Ptr (CFDictionary key value)

newtype CFDictionaryKeyCallBacks =
  CFDictionaryKeyCallBacks (Ptr CFDictionaryKeyCallBacks)

newtype CFDictionaryValueCallBacks =
  CFDictionaryValueCallBacks (Ptr CFDictionaryValueCallBacks)

newCFDictionary :: [(Ptr key, Ptr value)] -> IO (CFDictionaryRef key value)
newCFDictionary elements =
  withArrayLen ks $ \len ks_p ->
  withArray    vs $ \vs_p ->
  c_CFDictionaryCreate defaultAllocator
                       ks_p
                       vs_p
                       (fromIntegral len)
                       p_CFTypeDictionaryKeyCallBacks
                       p_CFTypeDictionaryValueCallBacks
  where (ks, vs) = unzip elements

foreign import ccall unsafe "&kCFTypeDictionaryKeyCallBacks"
  p_CFTypeDictionaryKeyCallBacks :: CFDictionaryKeyCallBacks

foreign import ccall unsafe "&kCFTypeDictionaryValueCallBacks"
  p_CFTypeDictionaryValueCallBacks :: CFDictionaryValueCallBacks

foreign import ccall unsafe "CFDictionaryCreate"
  c_CFDictionaryCreate :: CFAllocatorRef
                       -> Ptr (Ptr key)
                       -> Ptr (Ptr value)
                       -> CFIndex
                       -> CFDictionaryKeyCallBacks
                       -> CFDictionaryValueCallBacks
                       -> IO (CFDictionaryRef key value)

foreign import ccall unsafe "CFDictionaryGetValue"
  c_CFDictionaryGetValue :: CFDictionaryRef key value
                         -> Ptr key
                         -> IO (Ptr value)