summaryrefslogtreecommitdiff
path: root/src/plugins/winrt/packagemanager.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/plugins/winrt/packagemanager.cpp')
-rw-r--r--src/plugins/winrt/packagemanager.cpp54
1 files changed, 41 insertions, 13 deletions
diff --git a/src/plugins/winrt/packagemanager.cpp b/src/plugins/winrt/packagemanager.cpp
index 0d17744c52..2385559e99 100644
--- a/src/plugins/winrt/packagemanager.cpp
+++ b/src/plugins/winrt/packagemanager.cpp
@@ -44,6 +44,7 @@
# include <windows.foundation.collections.h>
# include <windows.system.userprofile.h>
# include <sddl.h>
+# include <shellapi.h>
using namespace Microsoft::WRL;
using namespace ABI::Windows;
@@ -101,34 +102,45 @@ static IUriRuntimeClass *createUriRunTimeClass(const QString &url, QString *erro
return result;
}
-static bool evaluateDeploymentResult(AsyncDeployOperationProgress *asyncInfo,
- ABI::Windows::Foundation::AsyncStatus status,
- QString *errorMessage)
+static PackageManager::Error evaluateDeploymentResult(
+ AsyncDeployOperationProgress *asyncInfo,
+ ABI::Windows::Foundation::AsyncStatus status,
+ QString *errorMessage)
{
- bool ok = true;
+ PackageManager::Error error = PackageManager::NoError;
errorMessage->clear();
switch (status) {
case ABI::Windows::Foundation::AsyncStatus::Started:
case ABI::Windows::Foundation::AsyncStatus::Completed:
break;
case ABI::Windows::Foundation::AsyncStatus::Canceled:
- ok = false; // Should not occur, deployment cannot be canceled.
+ error = PackageManager::Canceled; // Should not occur, deployment cannot be canceled.
*errorMessage = PackageManager::tr("Operation canceled.");
break;
case ABI::Windows::Foundation::AsyncStatus::Error: {
- ok = false;
+ error = PackageManager::UnknownError;
ABI::Windows::Management::Deployment::IDeploymentResult *result;
if (SUCCEEDED(asyncInfo->GetResults(&result))) {
HSTRING hError;
if (SUCCEEDED(result->get_ErrorText(&hError)))
*errorMessage = hStringToQString(hError);
+ HRESULT errorCode;
+ if (SUCCEEDED(result->get_ExtendedErrorCode(&errorCode))) {
+ switch (HRESULT_CODE(errorCode)) {
+ case ERROR_INSTALL_POLICY_FAILURE:
+ error = PackageManager::DeveloperLicenseRequired;
+ break;
+ default:
+ break; // TODO: handle more error cases
+ }
+ }
}
if (errorMessage->isEmpty())
*errorMessage = PackageManager::tr("Unknown error.");
}
break;
}
- return ok;
+ return error;
}
// ---------- PackageManagerPrivate
@@ -332,16 +344,16 @@ bool PackageManager::startAddPackage(const QString &manifestFile,
HRESULT PackageManagerPrivate::packageAdded(AsyncDeployOperationProgress *asyncInfo, ABI::Windows::Foundation::AsyncStatus status)
{
QString errorMessage;
- const bool ok = evaluateDeploymentResult(asyncInfo, status, &errorMessage);
+ const PackageManager::Error error = evaluateDeploymentResult(asyncInfo, status, &errorMessage);
const ProgressManifestHash::Iterator it = pendingInstalls.find(asyncInfo);
if (it == pendingInstalls.end()) {
qWarning("%s: asyncInfo not found", Q_FUNC_INFO);
return S_OK;
}
- if (ok) {
+ if (error == PackageManager::NoError) {
emit q->packageAdded(it.value());
} else {
- emit q->packageAddFailed(it.value(), errorMessage);
+ emit q->packageAddFailed(it.value(), errorMessage, error);
}
pendingInstalls.erase(it);
return S_OK;
@@ -372,16 +384,16 @@ bool PackageManager::startRemovePackage(const QString &fullName, QString *errorM
HRESULT PackageManagerPrivate::packageRemoved(AsyncDeployOperationProgress *asyncInfo, ABI::Windows::Foundation::AsyncStatus status)
{
QString errorMessage;
- const bool ok = evaluateDeploymentResult(asyncInfo, status, &errorMessage);
+ const PackageManager::Error error = evaluateDeploymentResult(asyncInfo, status, &errorMessage);
const ProgressNameHash::Iterator it = pendingRemoves.find(asyncInfo);
if (it == pendingRemoves.end()) {
qWarning("%s: asyncInfo not found", Q_FUNC_INFO);
return S_OK;
}
- if (ok) {
+ if (error == PackageManager::NoError) {
emit q->packageRemoved(it.value());
} else {
- emit q->packageRemovalFailed(it.value(), errorMessage);
+ emit q->packageRemovalFailed(it.value(), errorMessage, error);
}
pendingRemoves.erase(it);
return S_OK;
@@ -392,6 +404,18 @@ bool PackageManager::operationInProgress() const
return !d->pendingInstalls.isEmpty() || !d->pendingRemoves.isEmpty();
}
+void PackageManager::launchDeveloperRegistration()
+{
+ // Must run elevated, so we use the native API
+ SHELLEXECUTEINFO shExecInfo;
+ shExecInfo.cbSize = sizeof(SHELLEXECUTEINFO);
+ shExecInfo.lpVerb = L"runas";
+ shExecInfo.lpFile = L"powershell";
+ shExecInfo.lpParameters = L"-windowstyle hidden -command show-windowsdeveloperlicenseregistration";
+ shExecInfo.nShow = SW_MINIMIZE;
+ ShellExecuteEx(&shExecInfo);
+}
+
#else // defined(_MSC_VER) && _MSC_VER >= 1700
namespace WinRt {
@@ -427,6 +451,10 @@ bool PackageManager::operationInProgress() const
return false;
}
+void PackageManager::launchDeveloperRegistration()
+{
+}
+
#endif // !defined(_MSC_VER) && _MSC_VER >= 1700
} // namespace Internal