2013-07-27 6 views
2

На MacRuby Pointer to typedef struct, я узнал, как разыменования указателя, созданный сMacRuby указатель, ссылки, разыменования при использовании какао рамочных

x=Pointer.new_with_type 
... 
==> use x.value, or x[0] 

Работает лакомство!

Теперь я хочу узнать, что я считаю «противоположным». Я пытаюсь использовать этот API.

OSStatus SecKeychainCopySettings (
    SecKeychainRef keychain, 
    SecKeychainSettings *outSettings 
); 

Второй параметр должен быть указателем. Но мне никогда не удается получить реальные outSettings из keychain, но я получаю настройки по умолчанию.

framework 'Security' 
keychainObject = Pointer.new_with_type('^{OpaqueSecKeychainRef}') 
SecKeychainOpen("/Users/charbon/Library/Keychains/Josja.keychain",keychainObject) 

#attempt #1 
settings=Pointer.new_with_type('{SecKeychainSettings=IBBI}') 
SecKeychainCopySettings(keychainObject.value, settings) 
p settings.value 
#<SecKeychainSettings version=0 lockOnSleep=false useLockInterval=false lockInterval=0> 

#attempt #2 
settings2=SecKeychainSettings.new 
result = SecKeychainCopySettings(keychainObject.value, settings2) 
p settings2 
#<SecKeychainSettings version=0 lockOnSleep=false useLockInterval=false lockInterval=0> 

Уставки брелка открыл следует читать

#<SecKeychainSettings version=0 lockOnSleep=true useLockInterval=true lockInterval=1800> 

Что мне не хватает?

ответ

0

Получил это! Док в SecKeychainCopySettings упоминает

outSettings По возвращению, указатель на структуру настройки брелки. Поскольку эта структура версирована, вы должны выделить память для нее и заполнить версию структуры, прежде чем передавать ее функции .

Таким образом, мы не можем просто создать указатель на SecKeychainSettings. Мы должны установить версию Struct, на которую указывает указатель на что-то.

settings=Pointer.new_with_type('{SecKeychainSettings=IBBI}') 
#settings[0] dereferences the Pointer 
#for some reason, settings[0][0]=1 does not work, nor settings[0].version=1 
settings[0]=[1,false,false,0] 
#we are redefining the complete SecKeychainSettings struct 
# [0]=version [1]=lockOnSleep [2]=useLockInterval [3]=lockInterval 
result = SecKeychainCopySettings(keychainObject.value, settings) 
p settings 
=> #<SecKeychainSettings version=1 lockOnSleep=true useLockInterval=false lockInterval=300> irb(main):019:0>