]> Chaos Git - corbenik/ctrulib.git/commitdiff
Added bossRegisterTask, bossSendProperty, bossDeleteTask, and bossCmd34.
authoryellows8 <yellows8@users.noreply.github.com>
Thu, 22 Dec 2016 06:32:49 +0000 (01:32 -0500)
committeryellows8 <yellows8@users.noreply.github.com>
Thu, 22 Dec 2016 06:32:49 +0000 (01:32 -0500)
libctru/include/3ds/services/boss.h
libctru/source/services/boss.c

index 479909c6da4629f2c64da226b325a83f67efcd83..1ad5fedbd943c40600c7656d0c52580a56877d93 100644 (file)
@@ -16,6 +16,22 @@ void bossExit(void);
 /// Returns the BOSS session handle.
 Handle bossGetSessionHandle();
 
+/**
+ * @brief Register a task.
+ * @param taskID BOSS taskID.
+ * @param unk0 Unknown, usually zero.
+ * @param unk1 Unknown, usually zero.
+ */
+Result bossRegisterTask(char *taskID, u8 unk0, u8 unk1);
+
+/**
+ * @brief Send a property.
+ * @param PropertyID PropertyID
+ * @param buf Input buffer data.
+ * @param size Buffer size.
+ */
+Result bossSendProperty(u16 PropertyID, void* buf, u32 size);
+
 /**
  * @brief ?
  * @param taskID BOSS taskID.
@@ -28,3 +44,16 @@ Result bossStartTaskImmediate(char *taskID);
  */
 Result bossStartBgImmediate(char *taskID);
 
+/**
+ * @brief Deletes a task by using CancelTask and UnregisterTask internally.
+ * @param taskID BOSS taskID.
+ * @param unk Unknown, usually zero?
+ */
+Result bossDeleteTask(char *taskID, u32 unk);
+
+/**
+ * @brief ?
+ * @param taskID BOSS taskID.
+ */
+Result bossCmd34(char *taskID);
+
index 987e0db85282c32fb5be3591b4d0b5f38a0ced71..eb4240d7c519bd1c31a845b55feaf632de61b302 100644 (file)
@@ -75,6 +75,57 @@ static Result bossipc_InitializeSession(u64 programID)
        return (Result)cmdbuf[1];
 }
 
+Result bossRegisterTask(char *taskID, u8 unk0, u8 unk1)
+{
+       Result ret = 0;
+       u32 *cmdbuf = getThreadCommandBuffer();
+       u32 size = strlen(taskID)+1;
+
+       cmdbuf[0] = IPC_MakeHeader(0xB,3,2); // 0xB00C2
+       cmdbuf[1] = size;
+       cmdbuf[2] = unk0;
+       cmdbuf[3] = unk1;
+       cmdbuf[4] = IPC_Desc_Buffer(size, IPC_BUFFER_R);
+       cmdbuf[5] = (u32)taskID;
+
+       if(R_FAILED(ret = svcSendSyncRequest(bossHandle)))return ret;
+
+       return (Result)cmdbuf[1];
+}
+
+static Result bossipc_UnregisterTask(char *taskID, u32 unk)
+{
+       Result ret = 0;
+       u32 *cmdbuf = getThreadCommandBuffer();
+       u32 size = strlen(taskID)+1;
+
+       cmdbuf[0] = IPC_MakeHeader(0xC,2,2); // 0xC0082
+       cmdbuf[1] = size;
+       cmdbuf[2] = unk;
+       cmdbuf[3] = IPC_Desc_Buffer(size, IPC_BUFFER_R);
+       cmdbuf[4] = (u32)taskID;
+
+       if(R_FAILED(ret = svcSendSyncRequest(bossHandle)))return ret;
+
+       return (Result)cmdbuf[1];
+}
+
+Result bossSendProperty(u16 PropertyID, void* buf, u32 size)
+{
+       Result ret = 0;
+       u32 *cmdbuf = getThreadCommandBuffer();
+
+       cmdbuf[0] = IPC_MakeHeader(0x14,2,2); // 0x140082
+       cmdbuf[1] = PropertyID;
+       cmdbuf[2] = size;
+       cmdbuf[3] = IPC_Desc_Buffer(size, IPC_BUFFER_R);
+       cmdbuf[4] = (u32)buf;
+
+       if(R_FAILED(ret = svcSendSyncRequest(bossHandle)))return ret;
+
+       return (Result)cmdbuf[1];
+}
+
 Result bossStartTaskImmediate(char *taskID)
 {
        Result ret = 0;
@@ -91,6 +142,34 @@ Result bossStartTaskImmediate(char *taskID)
        return (Result)cmdbuf[1];
 }
 
+Result bossipc_CancelTask(char *taskID)
+{
+       Result ret = 0;
+       u32 *cmdbuf = getThreadCommandBuffer();
+       u32 size = strlen(taskID)+1;
+
+       cmdbuf[0] = IPC_MakeHeader(0x1E,1,2); // 0x1E0042
+       cmdbuf[1] = size;
+       cmdbuf[2] = IPC_Desc_Buffer(size, IPC_BUFFER_R);
+       cmdbuf[3] = (u32)taskID;
+
+       if(R_FAILED(ret = svcSendSyncRequest(bossHandle)))return ret;
+
+       return (Result)cmdbuf[1];
+}
+
+Result bossDeleteTask(char *taskID, u32 unk)
+{
+       Result ret=0;
+
+       ret = bossipc_CancelTask(taskID);
+       if(R_FAILED(ret))return ret;
+
+       ret = bossipc_UnregisterTask(taskID, unk);
+
+       return ret;
+}
+
 Result bossStartBgImmediate(char *taskID)
 {
        Result ret = 0;
@@ -107,3 +186,19 @@ Result bossStartBgImmediate(char *taskID)
        return (Result)cmdbuf[1];
 }
 
+Result bossCmd34(char *taskID)
+{
+       Result ret = 0;
+       u32 *cmdbuf = getThreadCommandBuffer();
+       u32 size = strlen(taskID)+1;
+
+       cmdbuf[0] = IPC_MakeHeader(0x34,1,2); // 0x340042
+       cmdbuf[1] = size;
+       cmdbuf[2] = IPC_Desc_Buffer(size, IPC_BUFFER_R);
+       cmdbuf[3] = (u32)taskID;
+
+       if(R_FAILED(ret = svcSendSyncRequest(bossHandle)))return ret;
+
+       return (Result)cmdbuf[1];
+}
+