Files

91 lines
1.8 KiB
C

#include <memory.h>
#include "malunal/types/object.h"
const uuid_t UUID_OBJECT_T = {
.tl = 0xB84510EE,
.tm = 0xBCDB,
.thv = 0x4B26,
.csr = 0x9E,
.csl = 0xEF,
.nbs = {
0xBB, 0x5A, 0xDB,
0x6C, 0x9C, 0x3A
}
};
error_t
object_query_interface(
object_iptr_t obj,
uuid_iptr_t iid,
rtti_intf_mptr_t intf
) {
if (obj == null)
return (error_t) {
.domain = &ERROR_DOMAIN_OBJECT_T,
.code = OBJECT_ERROR_NULL_OBJECT
};
if (intf == null)
return (error_t) {
.domain = &ERROR_DOMAIN_OBJECT_T,
.code = OBJECT_ERROR_NULL_OUTPUT
};
malunal_size_t index;
rtti_intf_mptr_t entry;
for (index = 0; index < obj->rtti->nIntfs; index++) {
entry = &obj->rtti->pIntfs[index];
if (uuid_equals(iid, entry->iid)) {
intf->iid = entry->iid;
intf->vtable = entry->vtable;
return NO_ERROR;
}
}
intf->iid = null;
intf->vtable = null;
return (error_t) {
.domain = &ERROR_DOMAIN_OBJECT_T,
.code = OBJECT_ERROR_NOT_MY_INTERFACE
};
}
error_t
object_query_property(
object_iptr_t obj,
malunal_cstr_t name,
rtti_prop_mptr_t prop
) {
if (obj == null)
return (error_t) {
.domain = &ERROR_DOMAIN_OBJECT_T,
.code = OBJECT_ERROR_NOT_MY_INTERFACE
};
if (prop == null)
return (error_t) {
.domain = &ERROR_DOMAIN_OBJECT_T,
.code = OBJECT_ERROR_NULL_OUTPUT
};
malunal_size_t index;
rtti_prop_mptr_t entry;
for (index = 0; index < obj->rtti->nProps; index++) {
entry = &obj->rtti->pProps[index];
if (strcmp(name, entry->name) == 0) {
prop->name = entry->name;
prop->rtti = entry->rtti;
return NO_ERROR;
}
}
prop->name = null;
prop->rtti = null;
return (error_t) {
.domain = &ERROR_DOMAIN_OBJECT_T,
.code = OBJECT_ERROR_NOT_MY_PROPERTY
};
}