Skip to content

Commit

Permalink
in progress, tryng to figure out how to best handle different error m…
Browse files Browse the repository at this point in the history
…odes
  • Loading branch information
William Cheng committed Apr 30, 2019
1 parent 5a43f88 commit e9ab631
Show file tree
Hide file tree
Showing 3 changed files with 67 additions and 57 deletions.
26 changes: 12 additions & 14 deletions preview/MsixCore/MsixCoreInstaller/IPackageHandler.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -4,22 +4,20 @@

namespace MsixCoreLib
{
/// Interface for a logical chunk of work done on an Msix request
class IPackageHandler
{
public:
/// Interface for a logical chunk of work done on an Msix request
class IPackageHandler
{
public:

virtual HRESULT ExecuteForAddRequest() = 0;
virtual HRESULT ExecuteForAddRequest(HRESULT & hrExecute) = 0;

virtual HRESULT ExecuteForRemoveRequest() { return S_OK; }
virtual bool IsMandatoryForRemoveRequest() { return false; }
virtual bool IsMandatoryForAddRequest() { return true; }
virtual HRESULT ExecuteForRemoveRequest() { return S_OK; }

virtual ~IPackageHandler() {};
};
virtual ~IPackageHandler() {};
};

/// Function responsible for creating an instance of an IPackageHandler object /// Function responsible for creating an instance of an IPackageHandler object
/// @param msixRequest - the msix request object to act upon /// @return S_OK of the package.
/// @return S_OK if CreateHandler is to not fail the deployment of the package.
typedef HRESULT(*CreateHandler)(_In_ MsixRequest* msixRequest, _Out_ IPackageHandler** instance);
/// Function responsible for creating an instance of an IPackageHandler object
/// @param msixRequest - the msix request object to act upon
/// @return S_OK if CreateHandler is to not fail the deployment of the package.
typedef HRESULT(*CreateHandler)(_In_ MsixRequest* msixRequest, _Out_ IPackageHandler** instance);
}
96 changes: 55 additions & 41 deletions preview/MsixCore/MsixCoreInstaller/MsixRequest.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -40,43 +40,61 @@
using namespace std;
#include <GdiPlus.h>
using namespace MsixCoreLib;
struct HandlerInfo

enum ErrorHandling
{
IgnoreError = 0,
ExecuteErrorHandler = 1,
ExecuteNextHandler = 2, // if returned from function, this explicitly tells us to go to next?
ReturnError = 3, // for fatal errors, do not go to errorHandler, return immediately with error
SkipRestOfHandlers = 4, //early return when detect do-nothing?
};

struct AddHandlerInfo
{
CreateHandler create;
PCWSTR nextHandler;
ErrorHandling errorHandling;
PCWSTR errorHandler;
};

std::map<PCWSTR, HandlerInfo> AddHandlers =
struct RemoveHandlerInfo
{
CreateHandler create;
PCWSTR nextHandler;
ErrorHandling errorHandling;
};

std::map<PCWSTR, AddHandlerInfo> AddHandlers =
{
//HandlerName Function to create NextHandler ErrorHandlerInfo
{PopulatePackageInfo::HandlerName, {PopulatePackageInfo::CreateHandler, ValidateTargetDeviceFamily::HandlerName, nullptr /*nothing to rollback if we can't open the package*/}},
{ValidateTargetDeviceFamily::HandlerName, {ValidateTargetDeviceFamily::CreateHandler, ProcessPotentialUpdate::HandlerName, ErrorHandler::HandlerName}},
{ProcessPotentialUpdate::HandlerName, {ProcessPotentialUpdate::CreateHandler, Extractor::HandlerName, ErrorHandler::HandlerName}},
{Extractor::HandlerName, {Extractor::CreateHandler, StartMenuLink::HandlerName, ErrorHandler::HandlerName}},
{StartMenuLink::HandlerName, {StartMenuLink::CreateHandler, AddRemovePrograms::HandlerName, ErrorHandler::HandlerName}},
{AddRemovePrograms::HandlerName, {AddRemovePrograms::CreateHandler, Protocol::HandlerName, ErrorHandler::HandlerName}},
{Protocol::HandlerName, {Protocol::CreateHandler, ComInterface::HandlerName, ErrorHandler::HandlerName}},
{ComInterface::HandlerName, {ComInterface::CreateHandler, ComServer::HandlerName, ErrorHandler::HandlerName}},
{ComServer::HandlerName, {ComServer::CreateHandler, StartupTask::HandlerName, ErrorHandler::HandlerName}},
{StartupTask::HandlerName, {StartupTask::CreateHandler, FileTypeAssociation::HandlerName, ErrorHandler::HandlerName}},
{FileTypeAssociation::HandlerName, {FileTypeAssociation::CreateHandler, InstallComplete::HandlerName, ErrorHandler::HandlerName}},
{InstallComplete::HandlerName, {InstallComplete::CreateHandler, nullptr, ErrorHandler::HandlerName}},
{ErrorHandler::HandlerName, {ErrorHandler::CreateHandler, nullptr, nullptr}},
//HandlerName Function to create NextHandler (on success) ErrorHandling ErrorHandler (when ExecuteErrorHandler)
{PopulatePackageInfo::HandlerName, {PopulatePackageInfo::CreateHandler, ValidateTargetDeviceFamily::HandlerName, ReturnError, nullptr}},
{ValidateTargetDeviceFamily::HandlerName, {ValidateTargetDeviceFamily::CreateHandler, ProcessPotentialUpdate::HandlerName, ExecuteErrorHandler, ErrorHandler::HandlerName}},
{ProcessPotentialUpdate::HandlerName, {ProcessPotentialUpdate::CreateHandler, Extractor::HandlerName, ExecuteErrorHandler, ErrorHandler::HandlerName}},
{Extractor::HandlerName, {Extractor::CreateHandler, StartMenuLink::HandlerName, ExecuteErrorHandler, ErrorHandler::HandlerName}},
{StartMenuLink::HandlerName, {StartMenuLink::CreateHandler, AddRemovePrograms::HandlerName, ExecuteErrorHandler, ErrorHandler::HandlerName}},
{AddRemovePrograms::HandlerName, {AddRemovePrograms::CreateHandler, Protocol::HandlerName, ExecuteErrorHandler, ErrorHandler::HandlerName}},
{Protocol::HandlerName, {Protocol::CreateHandler, ComInterface::HandlerName, ExecuteErrorHandler, ErrorHandler::HandlerName}},
{ComInterface::HandlerName, {ComInterface::CreateHandler, ComServer::HandlerName, ExecuteErrorHandler, ErrorHandler::HandlerName}},
{ComServer::HandlerName, {ComServer::CreateHandler, StartupTask::HandlerName, ExecuteErrorHandler, ErrorHandler::HandlerName}},
{StartupTask::HandlerName, {StartupTask::CreateHandler, FileTypeAssociation::HandlerName, ExecuteErrorHandler, ErrorHandler::HandlerName}},
{FileTypeAssociation::HandlerName, {FileTypeAssociation::CreateHandler, InstallComplete::HandlerName, ExecuteErrorHandler, ErrorHandler::HandlerName}},
{InstallComplete::HandlerName, {InstallComplete::CreateHandler, nullptr, ExecuteErrorHandler, ErrorHandler::HandlerName}},
{ErrorHandler::HandlerName, {ErrorHandler::CreateHandler, nullptr, IgnoreError, nullptr}},
};

std::map<PCWSTR, HandlerInfo> RemoveHandlers =
std::map<PCWSTR, RemoveHandlerInfo> RemoveHandlers =
{
//HandlerName Function to create NextHandler
{PopulatePackageInfo::HandlerName, {PopulatePackageInfo::CreateHandler, StartMenuLink::HandlerName}},
{StartMenuLink::HandlerName, {StartMenuLink::CreateHandler, AddRemovePrograms::HandlerName}},
{AddRemovePrograms::HandlerName, {AddRemovePrograms::CreateHandler, Protocol::HandlerName}},
{Protocol::HandlerName, {Protocol::CreateHandler, ComInterface::HandlerName}},
{ComInterface::HandlerName, {ComInterface::CreateHandler, ComServer::HandlerName}},
{ComServer::HandlerName, {ComServer::CreateHandler, StartupTask::HandlerName}},
{StartupTask::HandlerName, {StartupTask::CreateHandler, FileTypeAssociation::HandlerName}},
{FileTypeAssociation::HandlerName, {FileTypeAssociation::CreateHandler, Extractor::HandlerName}},
{Extractor::HandlerName, {Extractor::CreateHandler, nullptr}},
//HandlerName Function to create NextHandler ErrorHandling
{PopulatePackageInfo::HandlerName, {PopulatePackageInfo::CreateHandler, StartMenuLink::HandlerName, ReturnError}},
{StartMenuLink::HandlerName, {StartMenuLink::CreateHandler, AddRemovePrograms::HandlerName, IgnoreError}},
{AddRemovePrograms::HandlerName, {AddRemovePrograms::CreateHandler, Protocol::HandlerName, IgnoreError}},
{Protocol::HandlerName, {Protocol::CreateHandler, ComInterface::HandlerName, IgnoreError}},
{ComInterface::HandlerName, {ComInterface::CreateHandler, ComServer::HandlerName, IgnoreError}},
{ComServer::HandlerName, {ComServer::CreateHandler, StartupTask::HandlerName, IgnoreError}},
{StartupTask::HandlerName, {StartupTask::CreateHandler, FileTypeAssociation::HandlerName, IgnoreError}},
{FileTypeAssociation::HandlerName, {FileTypeAssociation::CreateHandler, Extractor::HandlerName, IgnoreError}},
{Extractor::HandlerName, {Extractor::CreateHandler, nullptr, IgnoreError}},
};

HRESULT MsixRequest::Make(OperationType operationType, const std::wstring & packageFilePath, std::wstring packageFullName, MSIX_VALIDATION_OPTION validationOption, MsixRequest ** outInstance)
Expand Down Expand Up @@ -108,7 +126,11 @@ HRESULT MsixRequest::ProcessRequest()
{
case OperationType::Add:
{
RETURN_IF_FAILED(ProcessAddRequest());
HRESULT hr = ProcessAddRequest();
if (FAILED(hr))
{
m_msixResponse->SetErrorStatus(hr, L"Failed to process add request");
}
break;
}
case OperationType::Remove:
Expand All @@ -132,22 +154,14 @@ HRESULT MsixRequest::ProcessAddRequest()
"Executing handler",
TraceLoggingValue(currentHandlerName, "HandlerName"));

HandlerInfo currentHandler = AddHandlers[currentHandlerName];
AddHandlerInfo currentHandler = AddHandlers[currentHandlerName];
AutoPtr<IPackageHandler> handler;
auto hrExecute = currentHandler.create(this, &handler);
if (FAILED(hrExecute))
{
if (handler->IsMandatoryForAddRequest())
{
m_msixResponse->SetErrorStatus(hrExecute, L"Can't create the handler " + std::wstring(currentHandlerName));
return hrExecute;
}
}
RETURN_IF_FAILED(currentHandler.create(this, &handler));

hrExecute = handler->ExecuteForAddRequest();
HRESULT hrExecute = S_OK;
RETURN_IF_FAILED(handler->ExecuteForAddRequest(hrExecute));
if (FAILED(hrExecute))
{
m_msixResponse->SetErrorStatus(hrExecute, L"Can't execute the handler " + std::wstring(currentHandlerName));
currentHandlerName = currentHandler.errorHandler;
}
else
Expand All @@ -168,7 +182,7 @@ HRESULT MsixRequest::ProcessRemoveRequest()
"Executing handler",
TraceLoggingValue(currentHandlerName, "HandlerName"));

HandlerInfo currentHandler = RemoveHandlers[currentHandlerName];
RemoveHandlerInfo currentHandler = RemoveHandlers[currentHandlerName];
AutoPtr<IPackageHandler> handler;
HRESULT hrExecute = currentHandler.create(this, &handler);
if (FAILED(hrExecute))
Expand Down
2 changes: 0 additions & 2 deletions preview/MsixCore/MsixCoreInstaller/PopulatePackageInfo.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -18,8 +18,6 @@ class PopulatePackageInfo : IPackageHandler
/// @return E_NOT_SET when the package cannot be found
HRESULT ExecuteForRemoveRequest();

bool IsMandatoryForRemoveRequest() { return true; }

static const PCWSTR HandlerName;
static HRESULT CreateHandler(_In_ MsixRequest* msixRequest, _Out_ IPackageHandler** instance);
~PopulatePackageInfo() {}
Expand Down

0 comments on commit e9ab631

Please sign in to comment.