#include "SCDynamicStoreInternal.h"
#include "config.h"
Boolean
SCDynamicStoreSetMultiple(SCDynamicStoreRef store,
CFDictionaryRef keysToSet,
CFArrayRef keysToRemove,
CFArrayRef keysToNotify)
{
SCDynamicStorePrivateRef storePrivate;
kern_return_t status;
CFDataRef xmlSet = NULL;
xmlData_t mySetRef = NULL;
CFIndex mySetLen = 0;
CFDataRef xmlRemove = NULL;
xmlData_t myRemoveRef = NULL;
CFIndex myRemoveLen = 0;
CFDataRef xmlNotify = NULL;
xmlData_t myNotifyRef = NULL;
CFIndex myNotifyLen = 0;
int sc_status;
if (store == NULL) {
store = __SCDynamicStoreNullSession();
if (store == NULL) {
_SCErrorSet(kSCStatusNoStoreSession);
return FALSE;
}
}
storePrivate = (SCDynamicStorePrivateRef)store;
if (storePrivate->server == MACH_PORT_NULL) {
_SCErrorSet(kSCStatusNoStoreServer);
return FALSE;
}
if (keysToSet != NULL) {
CFDictionaryRef newInfo;
Boolean ok;
newInfo = _SCSerializeMultiple(keysToSet);
if (newInfo == NULL) {
_SCErrorSet(kSCStatusInvalidArgument);
return FALSE;
}
ok = _SCSerialize(newInfo, &xmlSet, (void **)&mySetRef, &mySetLen);
CFRelease(newInfo);
if (!ok) {
_SCErrorSet(kSCStatusInvalidArgument);
return FALSE;
}
}
if (keysToRemove != NULL) {
if (!_SCSerialize(keysToRemove, &xmlRemove, (void **)&myRemoveRef, &myRemoveLen)) {
if (xmlSet != NULL) CFRelease(xmlSet);
_SCErrorSet(kSCStatusInvalidArgument);
return FALSE;
}
}
if (keysToNotify != NULL) {
if (!_SCSerialize(keysToNotify, &xmlNotify, (void **)&myNotifyRef, &myNotifyLen)) {
if (xmlSet != NULL) CFRelease(xmlSet);
if (xmlRemove != NULL) CFRelease(xmlRemove);
_SCErrorSet(kSCStatusInvalidArgument);
return FALSE;
}
}
os_activity_scope(storePrivate->activity);
retry :
status = configset_m(storePrivate->server,
mySetRef,
(mach_msg_type_number_t)mySetLen,
myRemoveRef,
(mach_msg_type_number_t)myRemoveLen,
myNotifyRef,
(mach_msg_type_number_t)myNotifyLen,
(int *)&sc_status);
if (__SCDynamicStoreCheckRetryAndHandleError(store,
status,
&sc_status,
"SCDynamicStoreSetMultiple configset_m()")) {
goto retry;
}
if (xmlSet != NULL) CFRelease(xmlSet);
if (xmlRemove != NULL) CFRelease(xmlRemove);
if (xmlNotify != NULL) CFRelease(xmlNotify);
if (sc_status != kSCStatusOK) {
_SCErrorSet(sc_status);
return FALSE;
}
return TRUE;
}
Boolean
SCDynamicStoreSetValue(SCDynamicStoreRef store, CFStringRef key, CFPropertyListRef value)
{
SCDynamicStorePrivateRef storePrivate;
kern_return_t status;
CFDataRef utfKey;
xmlData_t myKeyRef;
CFIndex myKeyLen;
CFDataRef xmlData;
xmlData_t myDataRef;
CFIndex myDataLen;
int sc_status;
int newInstance;
if (store == NULL) {
store = __SCDynamicStoreNullSession();
if (store == NULL) {
_SCErrorSet(kSCStatusNoStoreSession);
return FALSE;
}
}
storePrivate = (SCDynamicStorePrivateRef)store;
if (storePrivate->server == MACH_PORT_NULL) {
_SCErrorSet(kSCStatusNoStoreServer);
return FALSE;
}
if (!_SCSerializeString(key, &utfKey, (void **)&myKeyRef, &myKeyLen)) {
_SCErrorSet(kSCStatusInvalidArgument);
return FALSE;
}
if (!_SCSerialize(value, &xmlData, (void **)&myDataRef, &myDataLen)) {
CFRelease(utfKey);
_SCErrorSet(kSCStatusInvalidArgument);
return FALSE;
}
os_activity_scope(storePrivate->activity);
retry :
status = configset(storePrivate->server,
myKeyRef,
(mach_msg_type_number_t)myKeyLen,
myDataRef,
(mach_msg_type_number_t)myDataLen,
0,
&newInstance,
(int *)&sc_status);
if (__SCDynamicStoreCheckRetryAndHandleError(store,
status,
&sc_status,
"SCDynamicStoreSetValue configset()")) {
goto retry;
}
CFRelease(utfKey);
CFRelease(xmlData);
if (sc_status != kSCStatusOK) {
_SCErrorSet(sc_status);
return FALSE;
}
return TRUE;
}