diff --git a/libctru/include/3ds/services/news.h b/libctru/include/3ds/services/news.h index 14717af..5c265f6 100644 --- a/libctru/include/3ds/services/news.h +++ b/libctru/include/3ds/services/news.h @@ -20,4 +20,4 @@ void newsExit(void); * @param imageSize Size of the image data in bytes. * @param jpeg Whether the image is a JPEG or not. */ -Result NEWSU_AddNotification(const u16* title, u32 titleLength, const u16* message, u32 messageLength, const void* imageData, u32 imageSize, bool jpeg); +Result NEWS_AddNotification(const u16* title, u32 titleLength, const u16* message, u32 messageLength, const void* imageData, u32 imageSize, bool jpeg); diff --git a/libctru/source/services/news.c b/libctru/source/services/news.c index 50ee1a3..c2108cc 100644 --- a/libctru/source/services/news.c +++ b/libctru/source/services/news.c @@ -22,11 +22,14 @@ typedef struct { static Handle newsHandle; static int newsRefCount; +static bool useNewsS; Result newsInit(void) { Result res; if (AtomicPostIncrement(&newsRefCount)) return 0; res = srvGetServiceHandle(&newsHandle, "news:u"); + useNewsS = R_FAILED(res); + if (useNewsS) res = srvGetServiceHandle(&newsHandle, "news:s"); if (R_FAILED(res)) AtomicDecrement(&newsRefCount); return res; } @@ -36,7 +39,7 @@ void newsExit(void) { svcCloseHandle(newsHandle); } -Result NEWSU_AddNotification(const u16* title, u32 titleLength, const u16* message, u32 messageLength, const void* imageData, u32 imageSize, bool jpeg) +Result NEWS_AddNotification(const u16* title, u32 titleLength, const u16* message, u32 messageLength, const void* imageData, u32 imageSize, bool jpeg) { NotificationHeader header = { 0 }; header.dataSet = true; @@ -53,14 +56,20 @@ Result NEWSU_AddNotification(const u16* title, u32 titleLength, const u16* messa cmdbuf[1] = sizeof(NotificationHeader); cmdbuf[2] = (messageLength + 1) * sizeof(u16); cmdbuf[3] = imageSize; - cmdbuf[4] = IPC_Desc_CurProcessHandle(); - cmdbuf[5] = 0; // Process ID, Filled automatically by the ARM11 kernel. - cmdbuf[6] = IPC_Desc_Buffer(sizeof(NotificationHeader),IPC_BUFFER_R); - cmdbuf[7] = (u32) &header; - cmdbuf[8] = IPC_Desc_Buffer((messageLength + 1) * sizeof(u16),IPC_BUFFER_R); - cmdbuf[9] = (u32) message; - cmdbuf[10] = IPC_Desc_Buffer(imageSize,IPC_BUFFER_R); - cmdbuf[11] = (u32) imageData; + + u32 baseIndex = 4; + if (!useNewsS) { + cmdbuf[baseIndex] = IPC_Desc_CurProcessHandle(); + cmdbuf[baseIndex + 1] = 0; // Process ID, Filled automatically by the ARM11 kernel. + baseIndex += 2; + } + + cmdbuf[baseIndex] = IPC_Desc_Buffer(sizeof(NotificationHeader),IPC_BUFFER_R); + cmdbuf[baseIndex + 1] = (u32) &header; + cmdbuf[baseIndex + 2] = IPC_Desc_Buffer((messageLength + 1) * sizeof(u16),IPC_BUFFER_R); + cmdbuf[baseIndex + 3] = (u32) message; + cmdbuf[baseIndex + 4] = IPC_Desc_Buffer(imageSize,IPC_BUFFER_R); + cmdbuf[baseIndex + 5] = (u32) imageData; if(R_FAILED(ret = svcSendSyncRequest(newsHandle))) return ret;