libnx/nx/source/services/mii.c
2020-04-17 01:28:53 +02:00

81 lines
2.3 KiB
C

#define NX_SERVICE_ASSUME_NON_DOMAIN
#include "service_guard.h"
#include "services/mii.h"
static MiiServiceType g_miiServiceType;
static Service g_miiSrv;
NX_GENERATE_SERVICE_GUARD_PARAMS(mii, (MiiServiceType service_type), (service_type));
Result _miiInitialize(MiiServiceType service_type) {
Result rc = MAKERESULT(Module_Libnx, LibnxError_BadInput);
g_miiServiceType = service_type;
switch (g_miiServiceType) {
case MiiServiceType_System:
rc = smGetService(&g_miiSrv, "mii:e");
break;
case MiiServiceType_User:
rc = smGetService(&g_miiSrv, "mii:u");
break;
}
return rc;
}
void _miiCleanup(void) {
serviceClose(&g_miiSrv);
}
Service* miiGetServiceSession(void) {
return &g_miiSrv;
}
Result miiOpenDatabase(MiiDatabase *out, MiiSpecialKeyCode key_code) {
u32 in = (u32)key_code;
return serviceDispatchIn(&g_miiSrv, 0, in,
.out_num_objects = 1,
.out_objects = &out->s,
);
}
Result miiDatabaseIsUpdated(MiiDatabase *db, bool *out_updated, MiiSourceFlag flag) {
u32 in = (u32)flag;
u8 tmp = 0;
Result rc = serviceDispatchInOut(&db->s, 0, in, tmp);
if (R_SUCCEEDED(rc) && out_updated) *out_updated = tmp & 1;
return rc;
}
Result miiDatabaseIsFull(MiiDatabase *db, bool *out_full) {
u8 tmp = 0;
Result rc = serviceDispatchOut(&db->s, 1, tmp);
if (R_SUCCEEDED(rc) && out_full) *out_full = tmp & 1;
return rc;
}
Result miiDatabaseGetCount(MiiDatabase *db, s32 *out_count, MiiSourceFlag flag) {
u32 in = (u32)flag;
return serviceDispatchInOut(&db->s, 2, in, *out_count);
}
Result miiDatabaseGet1(MiiDatabase *db, MiiSourceFlag flag, MiiCharInfo *out_infos, s32 count, s32 *total_out) {
u32 in = (u32)flag;
return serviceDispatchInOut(&db->s, 4, in, *total_out,
.buffer_attrs = { SfBufferAttr_HipcMapAlias | SfBufferAttr_Out },
.buffers = { { out_infos, count * sizeof(MiiCharInfo) } },
);
}
Result miiDatabaseBuildRandom(MiiDatabase *db, MiiAge age, MiiGender gender, MiiFaceColor face_color, MiiCharInfo *out_info) {
const struct {
u32 age;
u32 gender;
u32 face_color;
} in = { age, gender, face_color };
return serviceDispatchInOut(&db->s, 6, in, *out_info);
}
void miiDatabaseClose(MiiDatabase *db) {
serviceClose(&db->s);
}