blob: aaf0910f8000f8d6beab97c8af218226922846cb [file] [log] [blame]
/*
*
* Copyright 2013 Canonical Ltd.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
*/
#include "capture.h"
const char code[] = "\
var component, object; \
function createObject() { \
component = Qt.createComponent(%1); \
if (component.status == Component.Ready) \
finishCreation(); \
else \
component.statusChanged.connect(finishCreation); \
} \
function finishCreation() { \
CordovaWrapper.global.captureObject = component.createObject(root, \
{root: root, cordova: cordova, state: \"%2\"}); \
} \
createObject()";
static QString formatFile(const QMimeDatabase &db, const QString &path) {
QFileInfo info(path);
QMimeType mime = db.mimeTypeForFile(info.fileName());
QVariantMap file;
file.insert("name", info.fileName());
file.insert("fullPath", info.absoluteFilePath());
file.insert("lastModifiedDate", info.lastModified().toMSecsSinceEpoch());
file.insert("size", info.size());
file.insert("type", mime.name());
return CordovaInternal::format(file);
}
MediaCapture::MediaCapture(Cordova *cordova): CPlugin(cordova), _scId(0), _ecId(0) {
}
void MediaCapture::captureAudio(int scId, int ecId, const QVariantMap &) {
if (_scId || _ecId) {
this->callback(_ecId, QString("{code: %1}").arg(CAPTURE_APPLICATION_BUSY));
return;
}
QString path = m_cordova->get_app_dir() + "/../qml/MediaCaptureWidget.qml";
QString qml = QString(code).arg(CordovaInternal::format(path)).arg("audio");
m_cordova->execQML(qml);
_scId = scId;
_ecId = ecId;
}
void MediaCapture::onAudioRecordError(QMediaRecorder::Error) {
if (!_ecId)
return;
this->callback(_ecId, QString("{code: %1}").arg(CAPTURE_INTERNAL_ERR));
_ecId = _scId = 0;
_recorder.clear();
_files.clear();
m_cordova->execQML("CordovaWrapper.global.captureObject.destroy()");
}
void MediaCapture::recordAudio() {
if (_recorder.data()) {
QUrl url = _recorder->outputLocation();
QString path = url.toString();
_recorder->stop();
_recorder.clear();
this->callback(_scId, QString("[%1]").arg(formatFile(_db, path)));
_ecId = _scId = 0;
m_cordova->execQML("CordovaWrapper.global.captureObject.destroy()");
} else {
_recorder = QSharedPointer<QAudioRecorder>(new QAudioRecorder);
QObject::connect(_recorder.data(), SIGNAL(error(QMediaRecorder::Error)), this, SLOT(onAudioRecordError(QMediaRecorder::Error)));
if (_options.find("mode")->toString() == "audio/amr") {
_recorder->setContainerFormat("amr");
_recorder->setOutputLocation(generateLocation("amr"));
} else {
_recorder->setContainerFormat("wav");
_recorder->setOutputLocation(generateLocation("wav"));
}
_recorder->record();
}
}
void MediaCapture::cancel() {
if (!_ecId)
return;
m_cordova->execQML("CordovaWrapper.global.captureObject.destroy()");
_recorder.clear();
this->callback(_ecId, QString("{code: %1}").arg(CAPTURE_NO_MEDIA_FILES));
_ecId = _scId = 0;
_recorder.clear();
}
void MediaCapture::captureVideo(int scId, int ecId, const QVariantMap &) {
if (_scId || _ecId) {
this->callback(_ecId, QString("{code: %1}").arg(CAPTURE_APPLICATION_BUSY));
return;
}
QString path = m_cordova->get_app_dir() + "/../qml/MediaCaptureWidget.qml";
QString qml = QString(code).arg(CordovaInternal::format(path)).arg("videoRecording");
m_cordova->execQML(qml);
_scId = scId;
_ecId = ecId;
}
void MediaCapture::onVideoRecordEnd(const QString &uri) {
QString path = QUrl::fromUserInput(uri).path();
this->callback(_scId, QString("[%1]").arg(formatFile(_db, path)));
_ecId = _scId = 0;
m_cordova->execQML("CordovaWrapper.global.captureObject.destroy()");
}
void MediaCapture::captureImage(int scId, int ecId, const QVariantMap &) {
if (_scId || _ecId) {
this->callback(_ecId, QString("{code: %1}").arg(CAPTURE_APPLICATION_BUSY));
return;
}
QString path = m_cordova->get_app_dir() + "/../qml/MediaCaptureWidget.qml";
QString qml = QString(code).arg(CordovaInternal::format(path)).arg("camera");
m_cordova->execQML(qml);
_scId = scId;
_ecId = ecId;
}
void MediaCapture::onImageSaved(const QString &path) {
this->callback(_scId, QString("[%1]").arg(formatFile(_db, path)));
_ecId = _scId = 0;
}