OgrePlatform OgreDataManager at android

longer

28-01-2014 19:02:47

The function not work on android :
bool OgreDataManager::isDataExist(const std::string& _name)

is away return false.Can not load nothing.Crash at android where mGUI->initialise();

And i fix it to:

bool OgreDataManager::isDataExist(const std::string& _name)
{
VectorString search;
if (mAllGroups)
{
Ogre::StringVector sp = Ogre::ResourceGroupManager::getSingleton().getResourceGroups();
search.reserve(sp.size());
for (size_t i = 0; i < sp.size(); i++)
search.push_back(sp);
}
else
search.push_back(mGroup);
bool isFind(false);
for (VectorString::iterator it=search.begin();it!=search.end();it++)
{
isFind=Ogre::ResourceGroupManager::getSingleton().resourceExists(*it,_name);
if (isFind)
{
break;
}
}
return isFind;
//const VectorString& files = getDataListNames(_name);
//return !files.empty();
}


It's work .

Altren

28-01-2014 20:08:52

Could you explain why it doesn't work on android? And may be getDataListNames require similar changes as well.

longer

28-01-2014 20:25:33

I think the problem maby at the function:
const VectorString& OgreDataManager::getDataListNames(const std::string& _pattern, bool _fullpath)

use :
*iter == fi->filename

to compare two path name.At Android it's not path(or have?),just a apk compress file.Not sure.
Android debug so difficulty.

I will add message same log and find something.

longer

28-01-2014 21:05:31

std::string testName="MyGUI_Core.xml";
MyGUI::DataManager* dataManager=MyGUI::DataManager::getInstancePtr();
MyGUI::DataStreamHolder data =dataManager->getData(testName);
if (data.getData() == nullptr)
{
std::ostringstream str;
str<<"The data about :"<<testName.c_str()<<" can not get Data."<<std::endl;
logMessage(str);
}
else
{
std::ostringstream str;
str<<"The data about :"<<testName.c_str()<<" can get Data."<<std::endl;
logMessage(str);
}

logMessage("MyGUI::VectorString begin:");
const MyGUI::VectorString& vecString=dataManager->getDataListNames(testName);
if (!vecString.empty())
{
logMessage("getDataListNames not empty..");
for (MyGUI::VectorString::const_iterator it=vecString.begin();it!=vecString.end();it++)
{
logMessage(*it);
}
}
else
{
logMessage("getDataListNames is empty..");
}
logMessage("MyGUI::VectorString end.");
logMessage("FileInfoListPtr printf begin:");

Ogre::ResourceGroupManager* ogreResGroupMangr=Ogre::ResourceGroupManager::getSingletonPtr();
Ogre::FileInfoListPtr pFileInfo = ogreResGroupMangr->findResourceFileInfo("General", testName);
for (Ogre::FileInfoList::iterator it=pFileInfo->begin();it!=pFileInfo->end();it++)
{
std::ostringstream str;
str<<"filename :"<<it->filename.c_str()<<std::endl;
str<<"path :"<<it->path.c_str()<<std::endl;
str<<"basename :"<<it->basename.c_str()<<std::endl;
str<<"compressedSize :"<<it->compressedSize<<std::endl;
str<<"uncompressedSize :"<<it->uncompressedSize<<std::endl;
logMessage(str);
}
logMessage("FileInfoListPtr printf end.");

01-29 04:58:17.440: I/OGRE(2783): MyGUI::OgrePlatform create succeed.
01-29 04:58:17.440: I/OGRE(2783): The data about :MyGUI_Core.xml can get Data.
01-29 04:58:17.440: I/OGRE(2783): MyGUI::VectorString begin:
01-29 04:58:20.900: I/OGRE(2783): getDataListNames is empty..
01-29 04:58:20.900: I/OGRE(2783): MyGUI::VectorString end.
01-29 04:58:20.900: I/OGRE(2783): FileInfoListPtr printf begin:
01-29 04:58:24.690: I/OGRE(2783): filename :MyGUI_Core.xml
01-29 04:58:24.690: I/OGRE(2783): path :media/MyGUI_Media
01-29 04:58:24.690: I/OGRE(2783): basename :MyGUI_Core.xml
01-29 04:58:24.690: I/OGRE(2783): compressedSize :377
01-29 04:58:24.690: I/OGRE(2783): uncompressedSize :377
01-29 04:58:24.690: I/OGRE(2783): FileInfoListPtr printf end.

The result is up.
dataManager->getData(testName);//can get the file buffer.
dataManager->getDataListNames(testName);//return a empty string vector.

longer

28-01-2014 21:19:29

if (fi->path.empty())

at here .

in android the Ogre::FileInfo.path is not empty.
so the result vector is empty while loop end.

longer

28-01-2014 21:21:54

const VectorString& OgreDataManager::getDataListNames(const std::string& _pattern, bool _fullpath)
{
static VectorString result;
result.clear();

VectorString search;
if (mAllGroups)
{
Ogre::StringVector sp = Ogre::ResourceGroupManager::getSingleton().getResourceGroups();
search.reserve(sp.size());
for (size_t i = 0; i < sp.size(); i++)
search.push_back(sp[i]);
}
else
search.push_back(mGroup);

std::vector<Ogre::FileInfoListPtr> pFileInfos;

int resultSize = 0;
for (size_t i = 0; i < search.size(); i++)
{
Ogre::FileInfoListPtr pFileInfo = Ogre::ResourceGroupManager::getSingleton().findResourceFileInfo(search[i], _pattern);
resultSize += pFileInfo->size();
if (!pFileInfo->empty())
pFileInfos.push_back(pFileInfo);
else
pFileInfo.setNull();
}

result.reserve(resultSize);

for (size_t i = 0; i < pFileInfos.size(); i++)
{
Ogre::FileInfoListPtr pFileInfo = pFileInfos[i];
for (Ogre::FileInfoList::iterator fi = pFileInfo->begin(); fi != pFileInfo->end(); ++fi )
{
if (fi->path.empty())//at here
{
bool found = false;
for (VectorString::iterator iter = result.begin(); iter != result.end(); ++iter)
{
if (*iter == fi->filename)
{
found = true;
break;
}
}
if (!found)
{
result.push_back(_fullpath ? fi->archive->getName() + "/" + fi->filename : fi->filename);
}
}//no else here.
}

pFileInfo.setNull();
}

return result;
}