mirror of
https://github.com/overte-org/overte.git
synced 2025-08-09 20:23:06 +02:00
make snapshots uploaded for locations temp files that will be cleared
This commit is contained in:
parent
e7b9e2b060
commit
8dddbb9d4b
3 changed files with 93 additions and 46 deletions
|
@ -104,47 +104,48 @@ void LocationManager::updateSnapshotForExistingLocation(const QString& locationI
|
||||||
// first create a snapshot and save it
|
// first create a snapshot and save it
|
||||||
Application* application = Application::getInstance();
|
Application* application = Application::getInstance();
|
||||||
|
|
||||||
QString filename = Snapshot::saveSnapshot(application->getGLWidget(), application->getAvatar());
|
QTemporaryFile* tempImageFile = Snapshot::saveTempSnapshot(application->getGLWidget(), application->getAvatar());
|
||||||
|
|
||||||
AccountManager& accountManager = AccountManager::getInstance();
|
if (tempImageFile && tempImageFile->open()) {
|
||||||
|
AccountManager& accountManager = AccountManager::getInstance();
|
||||||
// setup a multipart that is in the AccountManager thread - we need this so it can be cleaned up after the QNetworkReply
|
|
||||||
QHttpMultiPart* imageFileMultiPart = new QHttpMultiPart(QHttpMultiPart::FormDataType);
|
// setup a multipart that is in the AccountManager thread - we need this so it can be cleaned up after the QNetworkReply
|
||||||
imageFileMultiPart->moveToThread(accountManager.thread());
|
QHttpMultiPart* imageFileMultiPart = new QHttpMultiPart(QHttpMultiPart::FormDataType);
|
||||||
|
imageFileMultiPart->moveToThread(accountManager.thread());
|
||||||
// load the file at that filename, parent the mile to the QHttpMultipart
|
|
||||||
QFile* locationImageFile = new QFile(filename, imageFileMultiPart);
|
// parent the temp file to the QHttpMultipart after moving it to account manager thread
|
||||||
|
tempImageFile->moveToThread(accountManager.thread());
|
||||||
if (!locationImageFile->open(QIODevice::ReadOnly)) {
|
tempImageFile->setParent(imageFileMultiPart);
|
||||||
|
|
||||||
|
qDebug() << "Uploading a snapshot from" << QFileInfo(*tempImageFile).absoluteFilePath()
|
||||||
|
<< "as location image for" << locationID;
|
||||||
|
|
||||||
|
const QString LOCATION_IMAGE_NAME = "location[image]";
|
||||||
|
|
||||||
|
QHttpPart imagePart;
|
||||||
|
imagePart.setHeader(QNetworkRequest::ContentDispositionHeader,
|
||||||
|
QVariant("form-data; name=\"" + LOCATION_IMAGE_NAME + "\";"
|
||||||
|
" filename=\"" + QFileInfo(tempImageFile->fileName()).fileName().toUtf8() + "\""));
|
||||||
|
imagePart.setHeader(QNetworkRequest::ContentTypeHeader, QVariant("application/octet-stream"));
|
||||||
|
imagePart.setBodyDevice(tempImageFile);
|
||||||
|
|
||||||
|
imageFileMultiPart->append(imagePart);
|
||||||
|
|
||||||
|
const QString LOCATION_IMAGE_PUT_PATH = "api/v1/locations/%1/image";
|
||||||
|
|
||||||
|
JSONCallbackParameters imageCallbackParams;
|
||||||
|
imageCallbackParams.jsonCallbackReceiver = this;
|
||||||
|
imageCallbackParams.jsonCallbackMethod = "locationImageUpdateSuccess";
|
||||||
|
|
||||||
|
// make an authenticated request via account manager to upload the image
|
||||||
|
// don't do anything with error or success for now
|
||||||
|
AccountManager::getInstance().authenticatedRequest(LOCATION_IMAGE_PUT_PATH.arg(locationID),
|
||||||
|
QNetworkAccessManager::PutOperation,
|
||||||
|
JSONCallbackParameters(), QByteArray(), imageFileMultiPart);
|
||||||
|
} else {
|
||||||
qDebug() << "Couldn't open snapshot file to upload as location image. No location image will be stored.";
|
qDebug() << "Couldn't open snapshot file to upload as location image. No location image will be stored.";
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
qDebug() << "Uploading a snapshot from" << filename << "as location image for" << locationID;
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
const QString LOCATION_IMAGE_NAME = "location[image]";
|
|
||||||
|
|
||||||
QHttpPart imagePart;
|
|
||||||
imagePart.setHeader(QNetworkRequest::ContentDispositionHeader,
|
|
||||||
QVariant("form-data; name=\"" + LOCATION_IMAGE_NAME + "\";"));
|
|
||||||
imagePart.setHeader(QNetworkRequest::ContentTypeHeader, QVariant("application/octet-stream"));
|
|
||||||
imagePart.setBodyDevice(locationImageFile);
|
|
||||||
|
|
||||||
imageFileMultiPart->append(imagePart);
|
|
||||||
|
|
||||||
const QString LOCATION_IMAGE_PUT_PATH = "api/v1/locations/%1/image";
|
|
||||||
|
|
||||||
JSONCallbackParameters imageCallbackParams;
|
|
||||||
imageCallbackParams.jsonCallbackReceiver = this;
|
|
||||||
imageCallbackParams.jsonCallbackMethod = "locationImageUpdateSuccess";
|
|
||||||
|
|
||||||
// make an authenticated request via account manager to upload the image
|
|
||||||
// don't do anything with error or success for now
|
|
||||||
AccountManager::getInstance().authenticatedRequest(LOCATION_IMAGE_PUT_PATH.arg(locationID),
|
|
||||||
QNetworkAccessManager::PutOperation,
|
|
||||||
JSONCallbackParameters(), QByteArray(), imageFileMultiPart);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -65,6 +65,24 @@ SnapshotMetaData* Snapshot::parseSnapshotData(QString snapshotPath) {
|
||||||
}
|
}
|
||||||
|
|
||||||
QString Snapshot::saveSnapshot(QGLWidget* widget, Avatar* avatar) {
|
QString Snapshot::saveSnapshot(QGLWidget* widget, Avatar* avatar) {
|
||||||
|
QFile* snapshotFile = savedFileForSnapshot(widget, avatar, false);
|
||||||
|
|
||||||
|
// we don't need the snapshot file, so close it, grab its filename and delete it
|
||||||
|
snapshotFile->close();
|
||||||
|
|
||||||
|
QString snapshotPath = QFileInfo(*snapshotFile).absoluteFilePath();
|
||||||
|
|
||||||
|
delete snapshotFile;
|
||||||
|
|
||||||
|
return snapshotPath;
|
||||||
|
}
|
||||||
|
|
||||||
|
QTemporaryFile* Snapshot::saveTempSnapshot(QGLWidget* widget, Avatar* avatar) {
|
||||||
|
// return whatever we get back from saved file for snapshot
|
||||||
|
return static_cast<QTemporaryFile*>(savedFileForSnapshot(widget, avatar, true));;
|
||||||
|
}
|
||||||
|
|
||||||
|
QFile* Snapshot::savedFileForSnapshot(QGLWidget* widget, Avatar* avatar, bool isTemporary) {
|
||||||
QImage shot = widget->grabFrameBuffer();
|
QImage shot = widget->grabFrameBuffer();
|
||||||
|
|
||||||
glm::vec3 location = avatar->getPosition();
|
glm::vec3 location = avatar->getPosition();
|
||||||
|
@ -91,16 +109,40 @@ QString Snapshot::saveSnapshot(QGLWidget* widget, Avatar* avatar) {
|
||||||
username.replace(QRegExp("[^A-Za-z0-9_]"), "-");
|
username.replace(QRegExp("[^A-Za-z0-9_]"), "-");
|
||||||
|
|
||||||
QDateTime now = QDateTime::currentDateTime();
|
QDateTime now = QDateTime::currentDateTime();
|
||||||
QString fileName = Menu::getInstance()->getSnapshotsLocation();
|
|
||||||
|
|
||||||
if (!fileName.endsWith(QDir::separator())) {
|
|
||||||
fileName.append(QDir::separator());
|
|
||||||
}
|
|
||||||
|
|
||||||
fileName.append(QString(FILENAME_PATH_FORMAT.arg(username, now.toString(DATETIME_FORMAT), formattedLocation)));
|
|
||||||
shot.save(fileName, 0, 100);
|
|
||||||
|
|
||||||
return fileName;
|
QString filename = FILENAME_PATH_FORMAT.arg(username, now.toString(DATETIME_FORMAT), formattedLocation);
|
||||||
|
|
||||||
|
const int IMAGE_QUALITY = 100;
|
||||||
|
|
||||||
|
if (!isTemporary) {
|
||||||
|
QString snapshotFullPath = Menu::getInstance()->getSnapshotsLocation();
|
||||||
|
|
||||||
|
if (!snapshotFullPath.endsWith(QDir::separator())) {
|
||||||
|
snapshotFullPath.append(QDir::separator());
|
||||||
|
}
|
||||||
|
|
||||||
|
snapshotFullPath.append(filename);
|
||||||
|
|
||||||
|
QFile* imageFile = new QFile(snapshotFullPath);
|
||||||
|
imageFile->open(QIODevice::WriteOnly);
|
||||||
|
|
||||||
|
shot.save(imageFile, 0, IMAGE_QUALITY);
|
||||||
|
imageFile->close();
|
||||||
|
|
||||||
|
return imageFile;
|
||||||
|
} else {
|
||||||
|
QTemporaryFile* imageTempFile = new QTemporaryFile(QDir::tempPath() + "/XXXXXX-" + filename);
|
||||||
|
|
||||||
|
if (!imageTempFile->open()) {
|
||||||
|
qDebug() << "Unable to open QTemporaryFile for temp snapshot. Will not save.";
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
shot.save(imageTempFile, 0, IMAGE_QUALITY);
|
||||||
|
imageTempFile->close();
|
||||||
|
|
||||||
|
return imageTempFile;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -42,7 +42,11 @@ class Snapshot {
|
||||||
|
|
||||||
public:
|
public:
|
||||||
static QString saveSnapshot(QGLWidget* widget, Avatar* avatar);
|
static QString saveSnapshot(QGLWidget* widget, Avatar* avatar);
|
||||||
|
static QTemporaryFile* saveTempSnapshot(QGLWidget* widget, Avatar* avatar);
|
||||||
static SnapshotMetaData* parseSnapshotData(QString snapshotPath);
|
static SnapshotMetaData* parseSnapshotData(QString snapshotPath);
|
||||||
|
|
||||||
|
private:
|
||||||
|
static QFile* savedFileForSnapshot(QGLWidget* widget, Avatar* avatar, bool isTemporary);
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // hifi_Snapshot_h
|
#endif // hifi_Snapshot_h
|
||||||
|
|
Loading…
Reference in a new issue