summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTomi Korpipaa <tomi.korpipaa@qt.io>2019-10-03 11:30:04 +0300
committerTomi Korpipaa <tomi.korpipaa@qt.io>2019-10-04 10:54:52 +0300
commitf5b80413a8aeb8ffc2e2fc7dbdac7ec5414f408c (patch)
tree72022f68046887fc71e9f81e349074244102cb81
parent51688ecd12ce581e551bf997d325ab9f89a26b5d (diff)
Fix importing images with spaces in path
When importing Collada or FBX that have images including spaces in the path, we did not find them. Get rid of the percentage encoding to find the images. Task-number: QT3DS-3972 Change-Id: Ia433232a9bce99e93acceb83ed22d247d087b3ec Reviewed-by: Mahmoud Badri <mahmoud.badri@qt.io> Reviewed-by: Miikka Heikkinen <miikka.heikkinen@qt.io>
-rw-r--r--src/Authoring/QT3DSIMP/Qt3DSImportLib/Qt3DSImport.cpp126
1 files changed, 75 insertions, 51 deletions
diff --git a/src/Authoring/QT3DSIMP/Qt3DSImportLib/Qt3DSImport.cpp b/src/Authoring/QT3DSIMP/Qt3DSImportLib/Qt3DSImport.cpp
index 2bbab435..661f0a03 100644
--- a/src/Authoring/QT3DSIMP/Qt3DSImportLib/Qt3DSImport.cpp
+++ b/src/Authoring/QT3DSIMP/Qt3DSImportLib/Qt3DSImport.cpp
@@ -37,6 +37,7 @@
#include "Qt3DSImportComposerTypes.h"
#include "Qt3DSFileToolsSeekableMeshBufIOStream.h"
#include "foundation/StrConvertUTF.h"
+#include <QtCore/qurl.h>
using qt3dsdm::IStringTable;
@@ -342,14 +343,14 @@ public:
{
if (m_ValidInstances.contains(inst))
return fromHdl(inst);
- return NULL;
+ return nullptr;
}
Instance *GetInstance(TIMPHandle inst)
{
if (m_ValidInstances.contains(inst))
return fromHdl(inst);
- return NULL;
+ return nullptr;
}
Instance *GetInstance(TCharPtr id)
@@ -357,7 +358,7 @@ public:
ImportHashMap<TCharPtr, Instance *>::const_iterator entry = m_IdToInstMap.find(id);
if (entry != m_IdToInstMap.end())
return entry->second;
- return NULL;
+ return nullptr;
}
Instance *GetInstance(TCharPtr id) const
@@ -365,7 +366,7 @@ public:
ImportHashMap<TCharPtr, Instance *>::const_iterator entry = m_IdToInstMap.find(id);
if (entry != m_IdToInstMap.end())
return entry->second;
- return NULL;
+ return nullptr;
}
Option<InstanceDesc> GetInstanceByHandle(TIMPHandle inst) const override
@@ -434,7 +435,7 @@ public:
QT3DSU32 GetNumProperties(TIMPHandle instance) const override
{
Instance *inst = GetInstance(instance);
- if (inst == NULL) {
+ if (inst == nullptr) {
QT3DS_ASSERT(false);
return 0;
}
@@ -443,7 +444,7 @@ public:
QT3DSU32 GetProperties(TIMPHandle instance, NVDataRef<PropertyValue> outBuffer) const override
{
Instance *inst = GetInstance(instance);
- if (inst == NULL) {
+ if (inst == nullptr) {
QT3DS_ASSERT(false);
return 0;
}
@@ -460,7 +461,7 @@ public:
ComposerPropertyNames::Enum val) const override
{
Instance *inst = GetInstance(instance);
- if (inst == NULL) {
+ if (inst == nullptr) {
QT3DS_ASSERT(false);
return Empty();
}
@@ -475,7 +476,7 @@ public:
QT3DSU32 GetNumChildren(TIMPHandle instance) const override
{
Instance *inst = GetInstance(instance);
- if (inst == NULL) {
+ if (inst == nullptr) {
QT3DS_ASSERT(false);
return 0;
}
@@ -493,7 +494,7 @@ public:
QT3DSU32 GetChildren(TIMPHandle instance, NVDataRef<InstanceDesc> childBuffer) const override
{
Instance *inst = GetInstance(instance);
- if (inst == NULL) {
+ if (inst == nullptr) {
QT3DS_ASSERT(false);
return 0;
}
@@ -514,7 +515,7 @@ public:
void MarkInstanceInvalid(TIMPHandle instance) override
{
Instance *inst = GetInstance(instance);
- if (inst == NULL) {
+ if (inst == nullptr) {
QT3DS_ASSERT(false);
return;
}
@@ -579,7 +580,7 @@ public:
QT3DSIMP_FOREACH(idx, (QT3DSU32)inSource.m_Children.size())
{
Instance *oldChild = GetInstance(inSource.m_Children[idx]);
- if (oldChild == NULL) {
+ if (oldChild == nullptr) {
QT3DS_ASSERT(false);
return retval;
}
@@ -599,7 +600,7 @@ public:
return;
}
Instance *theCopy = GetInstance(theNewItemId->second);
- if (theCopy == NULL) {
+ if (theCopy == nullptr) {
QT3DS_ASSERT(false);
return;
}
@@ -632,7 +633,7 @@ public:
QT3DSIMP_FOREACH(idx, (QT3DSU32)inSource.m_Children.size())
{
Instance *oldChild = GetInstance(inSource.m_Children[idx]);
- if (oldChild == NULL) {
+ if (oldChild == nullptr) {
QT3DS_ASSERT(false);
return;
}
@@ -643,7 +644,7 @@ public:
TIMPHandle CopyInstance(TIMPHandle inSource) override
{
Instance *inst = GetInstance(inSource);
- if (inst == NULL) {
+ if (inst == nullptr) {
QT3DS_ASSERT(false);
return 0;
}
@@ -654,7 +655,7 @@ public:
Instance *retval = CopyInstanceHierarchy(*inst, idMap);
Instance *parent = fromHdl(inst->m_Parent);
- if (parent != NULL)
+ if (parent != nullptr)
parent->AddChild(retval, inst);
// Copy properties and animations
@@ -666,7 +667,7 @@ public:
bool SetInstanceProperties(TIMPHandle instance, NVConstDataRef<PropertyValue> inBuffer) override
{
Instance *inst = GetInstance(instance);
- if (inst == NULL) {
+ if (inst == nullptr) {
QT3DS_ASSERT(false);
return false;
}
@@ -677,7 +678,7 @@ public:
const TImportModelValue &val) override
{
Instance *inst = GetInstance(instance);
- if (inst == NULL) {
+ if (inst == nullptr) {
QT3DS_ASSERT(false);
return false;
}
@@ -694,11 +695,11 @@ public:
{
Instance *inst = GetInstance(instance);
Instance *child = GetInstance(childHdl);
- if (inst == NULL) {
+ if (inst == nullptr) {
QT3DS_ASSERT(false);
return false;
}
- if (child == NULL) {
+ if (child == nullptr) {
QT3DS_ASSERT(false);
return false;
}
@@ -757,25 +758,36 @@ public:
if (!m_ImageDir.IsDirectory())
m_ImageDir.CreateDir(true);
- if (!m_ImageDir.IsDirectory())
- return ImportErrorData(ImportErrorCodes::UnableToCreateDirectory, m_ImageDir.toCString());
+ if (!m_ImageDir.IsDirectory()) {
+ return ImportErrorData(ImportErrorCodes::UnableToCreateDirectory,
+ m_ImageDir.toCString());
+ }
Q3DStudio::CString imgPath = CFilePath::GetAbsolutePath(CString(_imgPath));
- Q3DStudio::CString srcImgPath =
- CFilePath::GetRelativePathFromBase(m_FullSrcDirectory, imgPath);
-
- Q3DStudio::SFileErrorCodeFileNameAndNumBytes copyResult =
- Q3DStudio::SFileTools::FindAndCopyDestFile(m_ImageDir, imgPath);
+ Q3DStudio::CString srcImgPath = CFilePath::GetRelativePathFromBase(m_FullSrcDirectory,
+ imgPath);
+
+ // Need to get rid of %20 and such in the path, or we won't find the image
+ Q3DStudio::CString cleanImgPath
+ = Q3DStudio::CString::fromQString(QUrl::fromPercentEncoding(
+ imgPath.toQString().toUtf8()));
+ Q3DStudio::CString cleanSrcImgPath
+ = Q3DStudio::CString::fromQString(QUrl::fromPercentEncoding(
+ srcImgPath.toQString().toUtf8()));
+
+ Q3DStudio::SFileErrorCodeFileNameAndNumBytes copyResult
+ = Q3DStudio::SFileTools::FindAndCopyDestFile(m_ImageDir, cleanImgPath);
// Get the actual return value relative do our destination directory
- Q3DStudio::CString _retval =
- CFilePath::GetRelativePathFromBase(m_DestDirectory, copyResult.m_DestFilename);
+ Q3DStudio::CString _retval = CFilePath::GetRelativePathFromBase(m_DestDirectory,
+ copyResult.m_DestFilename);
// Register the string, so we can hand retval back to clients
TCharPtr retval = m_StringTable.RegisterStr(_retval.c_str());
- m_Images.insert(eastl::make_pair(m_StringTable.RegisterStr(srcImgPath.c_str()), retval));
+ m_Images.insert(eastl::make_pair(m_StringTable.RegisterStr(cleanSrcImgPath.c_str()),
+ retval));
if (copyResult.m_Error != Q3DStudio::FileErrorCodes::NoError) {
- CharPtrOrError errorValue(
- ImportErrorData(FromFileErrorCode(copyResult.m_Error), RegisterStr(imgPath)));
+ CharPtrOrError errorValue(ImportErrorData(FromFileErrorCode(copyResult.m_Error),
+ RegisterStr(cleanImgPath)));
errorValue.m_Value = retval;
return errorValue;
}
@@ -786,23 +798,31 @@ public:
if (dstPath.hasValue()) {
if (!m_ImageDir.IsDirectory())
m_ImageDir.CreateDir(true);
- if (!m_ImageDir.IsDirectory())
- return ImportErrorData(ImportErrorCodes::UnableToCreateDirectory, m_ImageDir.toCString());
- CFilePath fullDestPath =
- CFilePath::CombineBaseAndRelative(m_DestDirectory, CString(dstPath.getValue()));
+ if (!m_ImageDir.IsDirectory()) {
+ return ImportErrorData(ImportErrorCodes::UnableToCreateDirectory,
+ m_ImageDir.toCString());
+ }
+ CFilePath fullDestPath = CFilePath::CombineBaseAndRelative(m_DestDirectory,
+ CString(dstPath.getValue()));
Q3DStudio::SFileErrorCodeAndNumBytes copyResult = Q3DStudio::SFileTools::Copy(
fullDestPath, Q3DStudio::FileOpenFlags(Q3DStudio::FileOpenFlagValues::Truncate
| Q3DStudio::FileOpenFlagValues::Open
| Q3DStudio::FileOpenFlagValues::Create),
- CString(_imgPath));
+ CString(_imgPath));
// Regardless of if the copy operation succeeds or not, if the destination exists
- // already
- // Then we enter it into our dictionary
+ // already then we enter it into our dictionary.
if (fullDestPath.IsFile()) {
CFilePath imgPath = CFilePath::GetAbsolutePath(CString(_imgPath));
- CFilePath srcImgPath =
- CFilePath::GetRelativePathFromBase(m_FullSrcDirectory, imgPath);
- m_Images.insert(eastl::make_pair(m_StringTable.RegisterStr(srcImgPath.toCString()),
+ CFilePath srcImgPath = CFilePath::GetRelativePathFromBase(m_FullSrcDirectory,
+ imgPath);
+ // Need to get rid of %20 and such in the path, or we won't find the image
+ Q3DStudio::CString cleanImgPath
+ = Q3DStudio::CString::fromQString(
+ QUrl::fromPercentEncoding(imgPath.toQString().toUtf8()));
+ Q3DStudio::CString cleanSrcImgPath
+ = Q3DStudio::CString::fromQString(
+ QUrl::fromPercentEncoding(srcImgPath.toQString().toUtf8()));
+ m_Images.insert(eastl::make_pair(m_StringTable.RegisterStr(cleanSrcImgPath),
m_StringTable.RegisterStr(dstPath.getValue())));
}
@@ -810,7 +830,7 @@ public:
if (copyResult.m_Error != Q3DStudio::FileErrorCodes::NoError) {
QT3DS_ASSERT(false);
- const wchar_t *extraData = NULL;
+ const wchar_t *extraData = nullptr;
ImportErrorCodes::Enum error = FromFileErrorCode(copyResult.m_Error);
if (error == ImportErrorCodes::ResourceNotWriteable)
extraData = dstPath.getValue();
@@ -827,9 +847,13 @@ public:
Option<TCharPtr> FindImageByPath(TCharPtr _imgPath) const override
{
Q3DStudio::CString imgPath = CFilePath::GetAbsolutePath(CString(_imgPath));
- Q3DStudio::CString srcImgPath =
- CFilePath::GetRelativePathFromBase(m_FullSrcDirectory, imgPath);
- return FindImageByRelativePath(srcImgPath.c_str());
+ Q3DStudio::CString srcImgPath = CFilePath::GetRelativePathFromBase(m_FullSrcDirectory,
+ imgPath);
+ // Need to get rid of %20 and such in the path, or we won't find the image
+ Q3DStudio::CString cleanPath
+ = Q3DStudio::CString::fromQString(QUrl::fromPercentEncoding(
+ srcImgPath.toQString().toUtf8()));
+ return FindImageByRelativePath(cleanPath.c_str());
}
Option<TCharPtr> FindImageByRelativePath(TCharPtr imgPath) const override
@@ -1146,7 +1170,7 @@ public:
MemoryBuffer<RawAllocator> &inTempBuf)
{
Instance *theInstance = GetInstance(inAnimation.m_InstanceId);
- if (theInstance == NULL || theInstance->m_Valid == false)
+ if (theInstance == nullptr || theInstance->m_Valid == false)
return;
IDOMWriter::Scope __animScope(writer, L"AnimationTrack");
TCharStr thePropName(inAnimation.m_PropertyName);
@@ -1395,7 +1419,7 @@ public:
std::shared_ptr<IDOMFactory> factory(IDOMFactory::CreateDOMFactory(m_StringTablePtr));
std::shared_ptr<IDOMWriter> theWriter;
- SDOMElement *theTopElement = NULL;
+ SDOMElement *theTopElement = nullptr;
bool exists = fullPath.Exists();
{
@@ -1413,7 +1437,7 @@ public:
theTopElement = CDOMSerializer::Read(*factory, stream);
- if (theTopElement == NULL) {
+ if (theTopElement == nullptr) {
QT3DS_ASSERT(false);
return 0;
}
@@ -1480,7 +1504,7 @@ public:
{
using namespace Q3DStudio;
std::shared_ptr<IDOMFactory> factory(IDOMFactory::CreateDOMFactory(m_StringTablePtr));
- SDOMElement *topElement = NULL;
+ SDOMElement *topElement = nullptr;
{
Qt3DSFileToolsSeekableMeshBufIOStream stream(
SFile::Wrap(SFile::OpenForRead(fname), fname));
@@ -1492,7 +1516,7 @@ public:
topElement = CDOMSerializer::Read(*factory, stream);
}
- if (topElement == NULL) {
+ if (topElement == nullptr) {
QT3DS_ASSERT(false);
return false;
}
@@ -1945,7 +1969,7 @@ QT3DSU32 Import::GetHighestImportRevision(TCharPtr pathToFile)
std::shared_ptr<IDOMFactory> theFactory = IDOMFactory::CreateDOMFactory(theStringTable);
SDOMElement *theTopElement = CDOMSerializer::Read(*theFactory, stream);
- if (theTopElement == NULL) {
+ if (theTopElement == nullptr) {
QT3DS_ASSERT(false);
return 0;
}