Revision control

++ // Copyright (C) 2026 The Qt Company Ltd.
++ // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
++
++ #include "qohosimagecapture_p.h"
++
++ #include "qohoscamerasession_p.h"
++ #include "qohosmediacapturesession_p.h"
++
++ #include <QtCore/qdatetime.h>
++ #include <QtGui/qimage.h>
++ #include <QtMultimedia/qmediametadata.h>
++
++ QT_BEGIN_NAMESPACE
++
++ QOhosImageCapture::QOhosImageCapture(QImageCapture *parent) : QPlatformImageCapture(parent) { }
++
++ bool QOhosImageCapture::isReadyForCapture() const
++ {
++ return m_session && m_session->isReadyForCapture();
++ }
++
++ int QOhosImageCapture::capture(const QString &fileName)
++ {
++ if (!m_session) {
++ Q_EMIT error(-1, QImageCapture::ResourceError, msgImageCaptureNotSet());
++ return -1;
++ }
++ return m_session->capture(fileName, /*toBuffer=*/false);
++ }
++
++ int QOhosImageCapture::captureToBuffer()
++ {
++ if (!m_session) {
++ Q_EMIT error(-1, QImageCapture::ResourceError, msgImageCaptureNotSet());
++ return -1;
++ }
++ return m_session->capture(QString(), /*toBuffer=*/true);
++ }
++
++ QImageEncoderSettings QOhosImageCapture::imageSettings() const
++ {
++ if (m_session)
++ return m_session->imageSettings();
++ return m_pendingSettings;
++ }
++
++ void QOhosImageCapture::setImageSettings(const QImageEncoderSettings &settings)
++ {
++ m_pendingSettings = settings;
++ if (m_session)
++ m_session->setImageSettings(settings);
++ }
++
++ void QOhosImageCapture::setCaptureSession(QPlatformMediaCaptureSession *session)
++ {
++ auto *ohosSession = static_cast<QOhosMediaCaptureSession *>(session);
++ QOhosCameraSession *newCameraSession = ohosSession ? ohosSession->cameraSession() : nullptr;
++ if (m_service == ohosSession && m_session == newCameraSession)
++ return;
++
++ disconnectFromSession();
++ m_service = ohosSession;
++ m_session = newCameraSession;
++ if (m_session) {
++ m_session->setImageSettings(m_pendingSettings);
++ connectToSession();
++ notifyReadyForCaptureChanged(m_session->isReadyForCapture());
++ } else {
++ notifyReadyForCaptureChanged(false);
++ }
++ }
++
++ void QOhosImageCapture::notifyReadyForCaptureChanged(bool ready)
++ {
++ if (m_lastReady == ready)
++ return;
++ m_lastReady = ready;
++ Q_EMIT readyForCaptureChanged(ready);
++ }
++
++ void QOhosImageCapture::connectToSession()
++ {
++ if (!m_session)
++ return;
++ connect(m_session, &QOhosCameraSession::readyForCaptureChanged, this,
++ &QOhosImageCapture::notifyReadyForCaptureChanged);
++ connect(m_session, &QOhosCameraSession::imageExposed, this, &QOhosImageCapture::imageExposed);
++ connect(m_session, &QOhosCameraSession::imageCaptured, this,
++ &QOhosImageCapture::onSessionImageCaptured);
++ connect(m_session, &QOhosCameraSession::imageAvailable, this,
++ &QOhosImageCapture::imageAvailable);
++ connect(m_session, &QOhosCameraSession::imageSaved, this, &QOhosImageCapture::imageSaved);
++ connect(m_session, &QOhosCameraSession::imageCaptureError, this, &QOhosImageCapture::error);
++ }
++
++ void QOhosImageCapture::onSessionImageCaptured(int id, const QImage &preview)
++ {
++ Q_EMIT imageCaptured(id, preview);
++
++ QMediaMetaData md = metaData();
++ md.insert(QMediaMetaData::Date, QDateTime::currentDateTime());
++ if (!preview.isNull())
++ md.insert(QMediaMetaData::Resolution, preview.size());
++ Q_EMIT imageMetadataAvailable(id, md);
++ }
++
++ void QOhosImageCapture::disconnectFromSession()
++ {
++ if (m_session)
++ disconnect(m_session, nullptr, this, nullptr);
++ }
++
++ QT_END_NAMESPACE
++
++ #include "moc_qohosimagecapture_p.cpp"