Пример #1
0
filter_result
Server::Filter(BMessage* message, BHandler **target)
{
	filter_result result = B_DISPATCH_MESSAGE;

	switch (message->what) {
		case IM_MESSAGE_RECEIVED:
		{
			BString id = message->FindString("id");
			if (id.Length() > 0) {
				bool found = false;
				ContactLinker* item = fRosterMap.ValueFor(id, &found);
				if (found) {
					ChatWindow* win = item->GetChatWindow();
					item->ShowWindow();
					win->PostMessage(message);
				}
			}
			result = B_SKIP_MESSAGE;
			break;
		}
		case CAYA_CLOSE_CHAT_WINDOW:
		{
			BString id = message->FindString("id");
			if (id.Length() > 0) {
				bool found = false;
				ContactLinker* item = fRosterMap.ValueFor(id, &found);

				if (found)
					item->HideWindow();
			}
			result = B_SKIP_MESSAGE;
			break;
		}
		case IM_MESSAGE:
			result = ImMessage(message);
			break;

		case CAYA_REPLICANT_MESSENGER:
		{
			BMessenger* messenger = new BMessenger();

			status_t ret = message->FindMessenger(
				"messenger", messenger);

			if (ret != B_OK || !messenger->IsValid()) {
				message->PrintToStream();
				printf("err %s\n", strerror(ret));
				break;
			}
			AccountManager* accountManager = AccountManager::Get();
			accountManager->SetReplicantMessenger(messenger);
			accountManager->ReplicantStatusNotify(accountManager->Status());
			break;
		}

		default:
			// Dispatch not handled messages to main window
			break;
	}

	return result;
}