From f5b80413a8aeb8ffc2e2fc7dbdac7ec5414f408c Mon Sep 17 00:00:00 2001 From: Tomi Korpipaa Date: Thu, 3 Oct 2019 11:30:04 +0300 Subject: 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 Reviewed-by: Miikka Heikkinen --- .../QT3DSIMP/Qt3DSImportLib/Qt3DSImport.cpp | 126 ++++++++++++--------- 1 file 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 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::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::const_iterator entry = m_IdToInstMap.find(id); if (entry != m_IdToInstMap.end()) return entry->second; - return NULL; + return nullptr; } Option 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 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 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 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 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 FindImageByRelativePath(TCharPtr imgPath) const override @@ -1146,7 +1170,7 @@ public: MemoryBuffer &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 factory(IDOMFactory::CreateDOMFactory(m_StringTablePtr)); std::shared_ptr 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 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 theFactory = IDOMFactory::CreateDOMFactory(theStringTable); SDOMElement *theTopElement = CDOMSerializer::Read(*theFactory, stream); - if (theTopElement == NULL) { + if (theTopElement == nullptr) { QT3DS_ASSERT(false); return 0; } -- cgit v1.2.3