From 9bc51ee07c1b706b2d2e98c590a979ac90bce687 Mon Sep 17 00:00:00 2001 From: X512 Date: Mon, 22 Jun 2020 01:26:17 +0900 Subject: [PATCH] BLooper: implement scripting Change-Id: I73dd301ca7109675a4b629464ba7275a8095c77b Reviewed-on: https://review.haiku-os.org/c/haiku/+/2940 Reviewed-by: Adrien Destugues --- src/kits/app/Looper.cpp | 53 +++++++++++++++++++++++++++++++++++++++-- 1 file changed, 51 insertions(+), 2 deletions(-) diff --git a/src/kits/app/Looper.cpp b/src/kits/app/Looper.cpp index e10f684385..a769ef2d9b 100644 --- a/src/kits/app/Looper.cpp +++ b/src/kits/app/Looper.cpp @@ -18,6 +18,7 @@ #include #include #include +#include #include #include @@ -284,8 +285,56 @@ BLooper::DispatchMessage(BMessage* message, BHandler* handler) void BLooper::MessageReceived(BMessage* message) { - // TODO: implement scripting support - BHandler::MessageReceived(message); + if (!message->HasSpecifiers()) { + BHandler::MessageReceived(message); + return; + } + + BMessage replyMsg(B_REPLY); + status_t err = B_BAD_SCRIPT_SYNTAX; + int32 index; + BMessage specifier; + int32 what; + const char* property; + + if (message->GetCurrentSpecifier(&index, &specifier, &what, &property) + != B_OK) { + return BHandler::MessageReceived(message); + } + + BPropertyInfo propertyInfo(sLooperPropInfo); + switch (propertyInfo.FindMatch(message, index, &specifier, what, + property)) { + case 1: // Handlers: GET + if (message->what == B_GET_PROPERTY) { + int32 count = CountHandlers(); + err = B_OK; + for (int32 i = 0; err == B_OK && i < count; i++) { + BMessenger messenger(HandlerAt(i)); + err = replyMsg.AddMessenger("result", messenger); + } + } + break; + case 2: // Handler: COUNT + if (message->what == B_COUNT_PROPERTIES) + err = replyMsg.AddInt32("result", CountHandlers()); + break; + + default: + return BHandler::MessageReceived(message); + } + + if (err != B_OK) { + replyMsg.what = B_MESSAGE_NOT_UNDERSTOOD; + + if (err == B_BAD_SCRIPT_SYNTAX) + replyMsg.AddString("message", "Didn't understand the specifier(s)"); + else + replyMsg.AddString("message", strerror(err)); + } + + replyMsg.AddInt32("error", err); + message->SendReply(&replyMsg); }