diff --git a/modules/juce_cryptography/hashing/juce_MD5.h b/modules/juce_cryptography/hashing/juce_MD5.h index 83a03cb7ce..4ffef36685 100644 --- a/modules/juce_cryptography/hashing/juce_MD5.h +++ b/modules/juce_cryptography/hashing/juce_MD5.h @@ -72,7 +72,7 @@ public: @code MD5 checksum (myString.toUTF8()); @endcode */ - MD5 (const CharPointer_UTF8& utf8Text) noexcept; + explicit MD5 (const CharPointer_UTF8& utf8Text) noexcept; /** Destructor. */ ~MD5() noexcept; diff --git a/modules/juce_events/broadcasters/juce_ActionBroadcaster.cpp b/modules/juce_events/broadcasters/juce_ActionBroadcaster.cpp index 401a22be3e..d4cde465d4 100644 --- a/modules/juce_events/broadcasters/juce_ActionBroadcaster.cpp +++ b/modules/juce_events/broadcasters/juce_ActionBroadcaster.cpp @@ -26,17 +26,17 @@ BEGIN_JUCE_NAMESPACE //============================================================================== -// special message of our own with a string in it class ActionMessage : public Message { public: ActionMessage (const String& messageText, ActionListener* const listener_) noexcept - : message (messageText) + : message (messageText), + listener (listener_) { - pointerParameter = listener_; } const String message; + ActionListener* const listener; private: JUCE_DECLARE_NON_COPYABLE (ActionMessage); @@ -47,10 +47,9 @@ ActionBroadcaster::CallbackReceiver::CallbackReceiver() {} void ActionBroadcaster::CallbackReceiver::handleMessage (const Message& message) { const ActionMessage& am = static_cast (message); - ActionListener* const target = static_cast (am.pointerParameter); - if (owner->actionListeners.contains (target)) - target->actionListenerCallback (am.message); + if (owner->actionListeners.contains (am.listener)) + am.listener->actionListenerCallback (am.message); } //============================================================================== diff --git a/modules/juce_events/interprocess/juce_InterprocessConnection.cpp b/modules/juce_events/interprocess/juce_InterprocessConnection.cpp index 6aa89db715..23fcb485b8 100644 --- a/modules/juce_events/interprocess/juce_InterprocessConnection.cpp +++ b/modules/juce_events/interprocess/juce_InterprocessConnection.cpp @@ -190,29 +190,44 @@ void InterprocessConnection::initialiseWithPipe (NamedPipe* const pipe_) startThread(); } -const int messageMagicNumber = 0xb734128b; +//============================================================================== +struct ConnectionStateMessage : public Message +{ +public: + ConnectionStateMessage (bool connectionMade_) + : connectionMade (connectionMade_) + {} + + bool connectionMade; +}; + +struct DataDeliveryMessage : public Message +{ +public: + DataDeliveryMessage (const MemoryBlock& data_) + : data (data_) + {} + + MemoryBlock data; +}; void InterprocessConnection::handleMessage (const Message& message) { - if (message.intParameter1 == messageMagicNumber) + const ConnectionStateMessage* m = dynamic_cast (&message); + + if (m != nullptr) { - switch (message.intParameter2) - { - case 0: - { - ScopedPointer data (static_cast (message.pointerParameter)); - messageReceived (*data); - break; - } - - case 1: + if (m->connectionMade) connectionMade(); - break; - - case 2: + else connectionLost(); - break; - } + } + else + { + const DataDeliveryMessage* d = dynamic_cast (&message); + + if (d != nullptr) + messageReceived (d->data); } } @@ -223,7 +238,7 @@ void InterprocessConnection::connectionMadeInt() callbackConnectionState = true; if (useMessageThread) - postMessage (new Message (messageMagicNumber, 1, 0, 0)); + postMessage (new ConnectionStateMessage (true)); else connectionMade(); } @@ -236,7 +251,7 @@ void InterprocessConnection::connectionLostInt() callbackConnectionState = false; if (useMessageThread) - postMessage (new Message (messageMagicNumber, 2, 0, 0)); + postMessage (new ConnectionStateMessage (false)); else connectionLost(); } @@ -247,7 +262,7 @@ void InterprocessConnection::deliverDataInt (const MemoryBlock& data) jassert (callbackConnectionState); if (useMessageThread) - postMessage (new Message (messageMagicNumber, 0, 0, new MemoryBlock (data))); + postMessage (new DataDeliveryMessage (data)); else messageReceived (data); } diff --git a/modules/juce_events/juce_events.cpp b/modules/juce_events/juce_events.cpp index 8213d77b40..f5c1474c18 100644 --- a/modules/juce_events/juce_events.cpp +++ b/modules/juce_events/juce_events.cpp @@ -60,7 +60,6 @@ // timers/*.cpp, interprocess/*.cpp #include "messages/juce_ApplicationBase.cpp" #include "messages/juce_DeletedAtShutdown.cpp" -#include "messages/juce_Message.cpp" #include "messages/juce_MessageListener.cpp" #include "messages/juce_MessageManager.cpp" #include "broadcasters/juce_ActionBroadcaster.cpp" diff --git a/modules/juce_events/messages/juce_Message.cpp b/modules/juce_events/messages/juce_Message.cpp deleted file mode 100644 index 6e473b17a7..0000000000 --- a/modules/juce_events/messages/juce_Message.cpp +++ /dev/null @@ -1,54 +0,0 @@ -/* - ============================================================================== - - This file is part of the JUCE library - "Jules' Utility Class Extensions" - Copyright 2004-11 by Raw Material Software Ltd. - - ------------------------------------------------------------------------------ - - JUCE can be redistributed and/or modified under the terms of the GNU General - Public License (Version 2), as published by the Free Software Foundation. - A copy of the license is included in the JUCE distribution, or can be found - online at www.gnu.org/licenses. - - JUCE is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - ------------------------------------------------------------------------------ - - To release a closed-source product which uses JUCE, commercial licenses are - available: visit www.rawmaterialsoftware.com/juce for more information. - - ============================================================================== -*/ - -BEGIN_JUCE_NAMESPACE - -//============================================================================== -Message::Message() noexcept - : intParameter1 (0), - intParameter2 (0), - intParameter3 (0), - pointerParameter (nullptr), - messageRecipient (nullptr) -{ -} - -Message::Message (const int intParameter1_, - const int intParameter2_, - const int intParameter3_, - void* const pointerParameter_) noexcept - : intParameter1 (intParameter1_), - intParameter2 (intParameter2_), - intParameter3 (intParameter3_), - pointerParameter (pointerParameter_), - messageRecipient (nullptr) -{ -} - -Message::~Message() -{ -} - -END_JUCE_NAMESPACE diff --git a/modules/juce_events/messages/juce_Message.h b/modules/juce_events/messages/juce_Message.h index 0d2fa6b579..e39c53a8e6 100644 --- a/modules/juce_events/messages/juce_Message.h +++ b/modules/juce_events/messages/juce_Message.h @@ -49,28 +49,9 @@ public: */ Message() noexcept; - /** Creates a message object, filling in the member variables. - - The corresponding public member variables will be set from the parameters - passed in. - */ - Message (int intParameter1, - int intParameter2, - int intParameter3, - void* pointerParameter) noexcept; - /** Destructor. */ virtual ~Message(); - //============================================================================== - // These values can be used for carrying simple data that the application needs to - // pass around. For more complex messages, just create a subclass. - - int intParameter1; /**< user-defined integer value. */ - int intParameter2; /**< user-defined integer value. */ - int intParameter3; /**< user-defined integer value. */ - void* pointerParameter; /**< user-defined pointer value. */ - /** A typedef for pointers to messages. */ typedef ReferenceCountedObjectPtr Ptr; diff --git a/modules/juce_events/messages/juce_MessageListener.cpp b/modules/juce_events/messages/juce_MessageListener.cpp index 14f2574cdd..afd7525afb 100644 --- a/modules/juce_events/messages/juce_MessageListener.cpp +++ b/modules/juce_events/messages/juce_MessageListener.cpp @@ -53,7 +53,7 @@ void MessageListener::postMessage (Message* const message) const bool MessageListener::isValidMessageListener() const noexcept { - return (MessageManager::instance != nullptr) + return MessageManager::instance != nullptr && MessageManager::instance->messageListeners.contains (this); } diff --git a/modules/juce_events/messages/juce_MessageManager.cpp b/modules/juce_events/messages/juce_MessageManager.cpp index bc2f822edf..bdb8c925fe 100644 --- a/modules/juce_events/messages/juce_MessageManager.cpp +++ b/modules/juce_events/messages/juce_MessageManager.cpp @@ -26,9 +26,28 @@ BEGIN_JUCE_NAMESPACE //============================================================================== -MessageManager* MessageManager::instance = nullptr; +Message::Message() noexcept : messageRecipient (nullptr) {} +Message::~Message() {} -enum { quitMessageId = 0xfffff321 }; +//============================================================================== +CallbackMessage::CallbackMessage() noexcept {} +CallbackMessage::~CallbackMessage() {} + +void CallbackMessage::post() +{ + if (MessageManager::instance != nullptr) + MessageManager::instance->postMessageToQueue (this); +} + +//============================================================================== +struct QuitMessage : public Message +{ + QuitMessage() noexcept {} +}; + + +//============================================================================== +MessageManager* MessageManager::instance = nullptr; MessageManager::MessageManager() noexcept : quitMessagePosted (false), @@ -76,17 +95,6 @@ void MessageManager::postMessageToQueue (Message* const message) } //============================================================================== -CallbackMessage::CallbackMessage() noexcept {} -CallbackMessage::~CallbackMessage() {} - -void CallbackMessage::post() -{ - if (MessageManager::instance != nullptr) - MessageManager::instance->postMessageToQueue (this); -} - -//============================================================================== -// not for public use.. void MessageManager::deliverMessage (Message* const message) { JUCE_TRY @@ -101,7 +109,7 @@ void MessageManager::deliverMessage (Message* const message) { callbackMessage->messageCallback(); } - else if (message->intParameter1 == (int) quitMessageId) + else if (dynamic_cast (message) != nullptr) { quitMessageReceived = true; } @@ -125,7 +133,7 @@ void MessageManager::runDispatchLoop() void MessageManager::stopDispatchLoop() { - postMessageToQueue (new Message ((int) quitMessageId, 0, 0, nullptr)); + postMessageToQueue (new QuitMessage()); quitMessagePosted = true; } diff --git a/modules/juce_gui_basics/commands/juce_ApplicationCommandTarget.cpp b/modules/juce_gui_basics/commands/juce_ApplicationCommandTarget.cpp index 61215446cc..8aa2c0f826 100644 --- a/modules/juce_gui_basics/commands/juce_ApplicationCommandTarget.cpp +++ b/modules/juce_gui_basics/commands/juce_ApplicationCommandTarget.cpp @@ -25,6 +25,41 @@ BEGIN_JUCE_NAMESPACE + +//============================================================================== +class ApplicationCommandTarget::MessageTarget : public MessageListener +{ +public: + MessageTarget (ApplicationCommandTarget& owner_) + : owner (owner_) + { + } + + void handleMessage (const Message& message) + { + jassert (dynamic_cast (&message) != nullptr); + + owner.tryToInvoke (dynamic_cast (message).info, false); + } + + struct InvokedMessage : public Message + { + InvokedMessage (const InvocationInfo& info_) + : info (info_) + {} + + const InvocationInfo info; + + private: + JUCE_DECLARE_NON_COPYABLE (InvokedMessage); + }; + +private: + ApplicationCommandTarget& owner; + + JUCE_DECLARE_NON_COPYABLE (MessageTarget); +}; + //============================================================================== ApplicationCommandTarget::ApplicationCommandTarget() { @@ -43,9 +78,9 @@ bool ApplicationCommandTarget::tryToInvoke (const InvocationInfo& info, const bo if (async) { if (messageInvoker == nullptr) - messageInvoker = new CommandTargetMessageInvoker (this); + messageInvoker = new MessageTarget (*this); - messageInvoker->postMessage (new Message (0, 0, 0, new ApplicationCommandTarget::InvocationInfo (info))); + messageInvoker->postMessage (new MessageTarget::InvokedMessage (info)); return true; } else @@ -174,21 +209,5 @@ ApplicationCommandTarget::InvocationInfo::InvocationInfo (const CommandID comman { } -//============================================================================== -ApplicationCommandTarget::CommandTargetMessageInvoker::CommandTargetMessageInvoker (ApplicationCommandTarget* const owner_) - : owner (owner_) -{ -} - -ApplicationCommandTarget::CommandTargetMessageInvoker::~CommandTargetMessageInvoker() -{ -} - -void ApplicationCommandTarget::CommandTargetMessageInvoker::handleMessage (const Message& message) -{ - const ScopedPointer info (static_cast (message.pointerParameter)); - owner->tryToInvoke (*info, false); -} - END_JUCE_NAMESPACE diff --git a/modules/juce_gui_basics/commands/juce_ApplicationCommandTarget.h b/modules/juce_gui_basics/commands/juce_ApplicationCommandTarget.h index d6c3e2f048..644b635579 100644 --- a/modules/juce_gui_basics/commands/juce_ApplicationCommandTarget.h +++ b/modules/juce_gui_basics/commands/juce_ApplicationCommandTarget.h @@ -234,24 +234,11 @@ public: private: //============================================================================== - // (for async invocation of commands) - class CommandTargetMessageInvoker : public MessageListener - { - public: - CommandTargetMessageInvoker (ApplicationCommandTarget* owner); - ~CommandTargetMessageInvoker(); + class MessageTarget; + friend class MessageTarget; + friend class ScopedPointer; + ScopedPointer messageInvoker; - void handleMessage (const Message& message); - - private: - ApplicationCommandTarget* const owner; - - JUCE_DECLARE_NON_COPYABLE (CommandTargetMessageInvoker); - }; - - ScopedPointer messageInvoker; - - friend class CommandTargetMessageInvoker; bool tryToInvoke (const InvocationInfo& info, bool async); JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ApplicationCommandTarget);