1
0
mirror of https://github.com/cookiengineer/audacity synced 2025-05-05 14:18:53 +02:00

Manage the members of CommandOutputTarget with smart pointers

This commit is contained in:
Paul Licameli 2016-03-31 13:12:04 -04:00
parent e8ad90b3c9
commit 3481e678ea
6 changed files with 21 additions and 37 deletions

View File

@ -4634,7 +4634,7 @@ void AudacityProject::SafeDisplayStatusMessage(const wxChar *msg)
{
auto target
= std::make_unique<CommandOutputTarget>(TargetFactory::ProgressDefault(),
new StatusBarTarget(*mStatusBar),
std::make_shared<StatusBarTarget>(*mStatusBar),
TargetFactory::MessageDefault());
CommandType *type = CommandDirectory::Get()->LookUp(wxT("Message"));
wxASSERT_MSG(type != NULL, wxT("Message command not found!"));

View File

@ -257,9 +257,9 @@ std::unique_ptr<ScreenshotCommand> ScreenFrame::CreateCommand()
{
wxASSERT(mStatus != NULL);
auto output =
std::make_unique<CommandOutputTarget>(new NullProgressTarget(),
new StatusBarTarget(*mStatus),
new MessageBoxTarget());
std::make_unique<CommandOutputTarget>(std::make_unique<NullProgressTarget>(),
std::make_shared<StatusBarTarget>(*mStatus),
std::make_shared<MessageBoxTarget>());
CommandType *type = CommandDirectory::Get()->LookUp(wxT("Screenshot"));
wxASSERT_MSG(type != NULL, wxT("Screenshot command doesn't exist!"));
return std::make_unique<ScreenshotCommand>(*type, std::move(output), this);

View File

@ -81,9 +81,9 @@ void CommandBuilder::BuildCommand(const wxString &cmdName,
{
// Stage 1: create a Command object of the right type
CommandMessageTarget *scriptOutput = ScriptCommandRelay::GetResponseTarget();
auto scriptOutput = ScriptCommandRelay::GetResponseTarget();
auto output
= std::make_unique<CommandOutputTarget>(new NullProgressTarget(),
= std::make_unique<CommandOutputTarget>(std::make_unique<NullProgressTarget>(),
scriptOutput,
scriptOutput);

View File

@ -22,6 +22,7 @@ should be reference-counted.
#ifndef __COMMANDTARGETS__
#define __COMMANDTARGETS__
#include "../MemoryX.h"
#include <wx/string.h>
#include <wx/msgdlg.h>
#include <wx/statusbr.h>
@ -170,28 +171,15 @@ public:
class TargetFactory
{
public:
static CommandProgressTarget *ProgressDefault()
static std::unique_ptr<CommandProgressTarget> ProgressDefault()
{
return CreateProgressTarget<NullProgressTarget>();
return std::make_unique<NullProgressTarget>();
}
static CommandMessageTarget *MessageDefault()
static std::shared_ptr<CommandMessageTarget> MessageDefault()
{
return CreateMessageTarget<MessageBoxTarget>();
return std::make_shared<MessageBoxTarget>();
}
template<typename T>
static CommandProgressTarget *CreateProgressTarget()
{
return (new T);
}
template<typename T>
static CommandMessageTarget *CreateMessageTarget()
{
return (new T);
}
};
/// Used to aggregate the various output targets a command may have.
@ -199,21 +187,17 @@ public:
class CommandOutputTarget
{
private:
CommandProgressTarget *mProgressTarget;
CommandMessageTarget *mStatusTarget;
CommandMessageTarget *mErrorTarget;
std::unique_ptr<CommandProgressTarget> mProgressTarget;
std::shared_ptr<CommandMessageTarget> mStatusTarget;
std::shared_ptr<CommandMessageTarget> mErrorTarget;
public:
CommandOutputTarget(CommandProgressTarget *pt = TargetFactory::ProgressDefault(),
CommandMessageTarget *st = TargetFactory::MessageDefault(),
CommandMessageTarget *et = TargetFactory::MessageDefault())
: mProgressTarget(pt), mStatusTarget(st), mErrorTarget(et)
CommandOutputTarget(std::unique_ptr<CommandProgressTarget> &&pt = TargetFactory::ProgressDefault(),
std::shared_ptr<CommandMessageTarget> &&st = TargetFactory::MessageDefault(),
std::shared_ptr<CommandMessageTarget> &&et = TargetFactory::MessageDefault())
: mProgressTarget(std::move(pt)), mStatusTarget(st), mErrorTarget(et)
{ }
~CommandOutputTarget()
{
delete mProgressTarget;
if (mErrorTarget != mStatusTarget)
delete mStatusTarget;
delete mErrorTarget;
}
void Progress(double completed)
{

View File

@ -110,8 +110,8 @@ Response ScriptCommandRelay::ReceiveResponse()
/// Get a pointer to a message target which allows commands to send responses
/// back to a script.
ResponseQueueTarget *ScriptCommandRelay::GetResponseTarget()
std::shared_ptr<ResponseQueueTarget> ScriptCommandRelay::GetResponseTarget()
{
// This should be deleted by a Command destructor
return new ResponseQueueTarget(sResponseQueue);
return std::make_shared<ResponseQueueTarget>(sResponseQueue);
}

View File

@ -52,7 +52,7 @@ class ScriptCommandRelay
static void PostCommand(AudacityProject *project, const CommandHolder &cmd);
static void SendResponse(const wxString &response);
static Response ReceiveResponse();
static ResponseQueueTarget *GetResponseTarget();
static std::shared_ptr<ResponseQueueTarget> GetResponseTarget();
};
#endif /* End of include guard: __SCRIPTCOMMANDRELAY__ */