summaryrefslogtreecommitdiffstats
path: root/src/plugins/winrt
diff options
context:
space:
mode:
authorSamuel Nevala <samuel.nevala@intopalo.com>2015-11-11 10:05:04 +0200
committerSamuel Nevala <samuel.nevala@intopalo.com>2015-11-11 22:12:55 +0000
commitda0b7aea9adae024d5ea885c7e7589de86ce80f8 (patch)
treee272fe1ad64e66aac2a611dd1741e5c98314fc14 /src/plugins/winrt
parentb05fac61e0bd3cde6a5a6c37c37ebea01ce8ed29 (diff)
winrt: Fix crash when camera unloaded while searching focus.
Return early from focus related methods when async operation reports that it is write protected. Change-Id: I41bf9121e7ae431e5158b5e4c43cde582c30dfd7 Task-Id: QTBUG-49347 Reviewed-by: Peng Wu <peng.wu@intopalo.com> Reviewed-by: Andrew Knight <andrew.knight@intopalo.com>
Diffstat (limited to 'src/plugins/winrt')
-rw-r--r--src/plugins/winrt/qwinrtcameracontrol.cpp11
-rw-r--r--src/plugins/winrt/qwinrtcameralockscontrol.cpp11
2 files changed, 14 insertions, 8 deletions
diff --git a/src/plugins/winrt/qwinrtcameracontrol.cpp b/src/plugins/winrt/qwinrtcameracontrol.cpp
index 7a926ad60..0c9d0e5cb 100644
--- a/src/plugins/winrt/qwinrtcameracontrol.cpp
+++ b/src/plugins/winrt/qwinrtcameracontrol.cpp
@@ -1154,8 +1154,11 @@ bool QWinRTCameraControl::focus()
return false;
ComPtr<IAsyncAction> op;
HRESULT hr = d->focusControl->FocusAsync(&op);
- if (HRESULT_CODE(hr) == ERROR_OPERATION_IN_PROGRESS)
- return true;
+ const long errorCode = HRESULT_CODE(hr);
+ if (errorCode == ERROR_OPERATION_IN_PROGRESS
+ || errorCode == ERROR_WRITE_PROTECT) {
+ return false;
+ }
Q_ASSERT_SUCCEEDED(hr);
hr = QWinRTFunctions::await(op, QWinRTFunctions::ProcessThreadEvents);
Q_ASSERT_SUCCEEDED(hr);
@@ -1184,6 +1187,8 @@ bool QWinRTCameraControl::lockFocus()
Q_ASSERT_SUCCEEDED(hr);
ComPtr<IAsyncAction> op;
hr = focusControl2->LockAsync(&op);
+ if (HRESULT_CODE(hr) == ERROR_WRITE_PROTECT)
+ return false;
Q_ASSERT_SUCCEEDED(hr);
return QWinRTFunctions::await(op) == S_OK;
}
@@ -1198,6 +1203,8 @@ bool QWinRTCameraControl::unlockFocus()
Q_ASSERT_SUCCEEDED(hr);
ComPtr<IAsyncAction> op;
hr = focusControl2->UnlockAsync(&op);
+ if (HRESULT_CODE(hr) == ERROR_WRITE_PROTECT)
+ return false;
Q_ASSERT_SUCCEEDED(hr);
return QWinRTFunctions::await(op) == S_OK;
}
diff --git a/src/plugins/winrt/qwinrtcameralockscontrol.cpp b/src/plugins/winrt/qwinrtcameralockscontrol.cpp
index e429c5ff1..11e576be0 100644
--- a/src/plugins/winrt/qwinrtcameralockscontrol.cpp
+++ b/src/plugins/winrt/qwinrtcameralockscontrol.cpp
@@ -104,10 +104,10 @@ void QWinRTCameraLocksControl::searchAndLockFocus()
} else {
m_focusLockStatus = QCamera::Searching;
emit lockStatusChanged(QCamera::LockFocus, m_focusLockStatus, QCamera::LockAcquired);
- cameraControl->focus();
- cameraControl->lockFocus();
- m_focusLockStatus = QCamera::Locked;
- emit lockStatusChanged(QCamera::LockFocus, m_focusLockStatus, QCamera::LockAcquired);
+ if (cameraControl->focus()) {
+ m_focusLockStatus = cameraControl->lockFocus() ? QCamera::Locked : QCamera::Unlocked;
+ emit lockStatusChanged(QCamera::LockFocus, m_focusLockStatus, QCamera::LockAcquired);
+ }
}
}
@@ -117,8 +117,7 @@ void QWinRTCameraLocksControl::unlockFocus()
return;
QWinRTCameraControl *cameraControl = qobject_cast<QWinRTCameraControl *>(parent());
Q_ASSERT(cameraControl);
- cameraControl->unlockFocus();
- m_focusLockStatus = QCamera::Unlocked;
+ m_focusLockStatus = cameraControl->unlockFocus() ? QCamera::Unlocked : QCamera::Locked;
emit lockStatusChanged(QCamera::LockFocus, m_focusLockStatus, QCamera::UserRequest);
}