xpc_object_t xpc_uuid_create(const uuid_t uuid) { xpc_u val; memcpy(val.uuid, uuid, sizeof(uuid_t)); return _xpc_prim_create(_XPC_TYPE_UUID, val, 1); }
xpc_object_t xpc_data_create(const void *bytes, size_t length) { xpc_u val; val.ptr = (uintptr_t)bytes; return _xpc_prim_create(_XPC_TYPE_DATA, val, length); }
xpc_object_t xpc_string_create_with_format_and_arguments(const char *fmt, va_list ap) { xpc_u val; vasprintf(&val.str, fmt, ap); return _xpc_prim_create(_XPC_TYPE_STRING, val, strlen(val.str)); }
xpc_object_t xpc_string_create(const char *string) { xpc_u val; val.str = string; return _xpc_prim_create(_XPC_TYPE_STRING, val, strlen(string)); }
xpc_object_t xpc_double_create(double value) { xpc_u val; val.d = value; return _xpc_prim_create(_XPC_TYPE_DOUBLE, val, 1); }
xpc_object_t xpc_date_create(int64_t interval) { xpc_u val; val.i = interval; return _xpc_prim_create(_XPC_TYPE_DATE, val, 1); }
xpc_object_t xpc_uint64_create(uint64_t value) { xpc_u val; val.ui = value; return _xpc_prim_create(_XPC_TYPE_UINT64, val, 1); }
xpc_object_t xpc_bool_create(bool value) { xpc_u val; val.b = value; return _xpc_prim_create(_XPC_TYPE_BOOL, val, 1); }
xpc_object_t xpc_string_create_with_format(const char *fmt, ...) { va_list ap; xpc_u val; va_start(ap, fmt); vasprintf(&val.str, fmt, ap); va_end(ap); return _xpc_prim_create(_XPC_TYPE_STRING, val, strlen(val.str)); }
xpc_object_t xpc_date_create_from_current(void) { xpc_u val; struct timespec tp; clock_gettime(CLOCK_REALTIME, &tp); val.ui = *(uint64_t *)&tp; return _xpc_prim_create(_XPC_TYPE_DATE, val, 1); }
xpc_object_t xpc_array_create(const xpc_object_t *objects, size_t count) { struct xpc_object *xo; size_t i; xpc_u val; xo = _xpc_prim_create(_XPC_TYPE_ARRAY, val, 0); for (i = 0; i < count; i++) xpc_array_append_value(xo, objects[i]); return (xo); }
xpc_object_t xpc_copy(xpc_object_t obj) { struct xpc_object *xo, *xotmp; const void *newdata; xo = obj; switch (xo->xo_xpc_type) { case _XPC_TYPE_BOOL: case _XPC_TYPE_INT64: case _XPC_TYPE_UINT64: case _XPC_TYPE_DATE: case _XPC_TYPE_ENDPOINT: return _xpc_prim_create(xo->xo_xpc_type, xo->xo_u, 1); case _XPC_TYPE_STRING: return xpc_string_create(strdup( xpc_string_get_string_ptr(xo))); case _XPC_TYPE_DATA: newdata = xpc_data_get_bytes_ptr(obj); return (xpc_data_create(newdata, xpc_data_get_length(obj))); case _XPC_TYPE_DICTIONARY: xotmp = xpc_dictionary_create(NULL, NULL, 0); xpc_dictionary_apply(obj, ^(const char *k, xpc_object_t v) { xpc_dictionary_set_value(xotmp, k, xpc_copy(v)); return (bool)true; }); return (xotmp); case _XPC_TYPE_ARRAY: xotmp = xpc_array_create(NULL, 0); xpc_array_apply(obj, ^(size_t idx, xpc_object_t v) { xpc_array_set_value(xotmp, idx, xpc_copy(v)); return ((bool)true); });
xpc_object_t xpc_null_create(void) { xpc_u val; return _xpc_prim_create(_XPC_TYPE_NULL, val, 0); }