void ArpNotificationType::NotifyDependents(BMessage *msg, bool deliverAsynchronously) { BHandler *h; BLooper *looper; for (long i=0; (h = (BHandler*)dependents.ItemAt(i)) != 0; i++) { if (((looper = h->Looper()) != 0) && (looper->Lock())) { // FIX: need to send out the message, and let the views // invalidate themselves! So be aware that the Update // implementation will ALWAYS be called from within this // loop, meaning within a lock/unlock #if 0 // Uncomment this to debug where messages are going printf("SENDING MESSAGE TO %s\n", h->Name()); fflush(stdout); #endif h->MessageReceived(msg); looper->Unlock(); } } }
void BHandler::MessageReceived(BMessage* message) { BMessage reply(B_REPLY); switch (message->what) { case kMsgStartObserving: case kMsgStopObserving: { BMessenger target; uint32 what; if (message->FindMessenger(kObserveTarget, &target) != B_OK || message->FindInt32(B_OBSERVE_WHAT_CHANGE, (int32*)&what) != B_OK) { break; } ObserverList* list = _ObserverList(); if (list != NULL) { if (message->what == kMsgStartObserving) list->Add(target, what); else list->Remove(target, what); } break; } case B_GET_PROPERTY: { int32 cur; BMessage specifier; int32 form; const char* prop; status_t err = message->GetCurrentSpecifier(&cur, &specifier, &form, &prop); if (err != B_OK && err != B_BAD_SCRIPT_SYNTAX) break; bool known = false; // B_BAD_SCRIPT_SYNTAX defaults to the Messenger property if (err == B_BAD_SCRIPT_SYNTAX || cur < 0 || (strcmp(prop, "Messenger") == 0)) { err = reply.AddMessenger("result", this); known = true; } else if (strcmp(prop, "Suites") == 0) { err = GetSupportedSuites(&reply); known = true; } else if (strcmp(prop, "InternalName") == 0) { err = reply.AddString("result", Name()); known = true; } if (known) { reply.AddInt32("error", B_OK); message->SendReply(&reply); return; } // let's try next handler break; } case B_GET_SUPPORTED_SUITES: { reply.AddInt32("error", GetSupportedSuites(&reply)); message->SendReply(&reply); return; } } // ToDo: there is some more work needed here // (someone in the know should fill in)! if (fNextHandler) { // we need to apply the next handler's filters here, too BHandler* target = Looper()->_HandlerFilter(message, fNextHandler); if (target != NULL && target != this) { // TODO: we also need to make sure that "target" is not before // us in the handler chain - at least in case it wasn't before // the handler actually targeted with this message - this could // get ugly, though. target->MessageReceived(message); } } else if (message->what != B_MESSAGE_NOT_UNDERSTOOD && (message->WasDropped() || message->HasSpecifiers())) { printf("BHandler %s: MessageReceived() couldn't understand the message:\n", Name()); message->PrintToStream(); message->SendReply(B_MESSAGE_NOT_UNDERSTOOD); } }