const AnimData* AnimResManager::loadAnimData(const char *aniFileName) { assert(aniFileName != NULL && *aniFileName != 0); vector< Pair >::iterator node = find(m_AnimData.begin(), m_AnimData.end(), aniFileName); if (node != m_AnimData.end()) { return node->pAnimData; } char *s2 = strdup(aniFileName); if (!s2) return 0; vector<const char *> pathTokens; for (const char *pathToken = strtok(s2, "/\\"); pathToken; pathToken = strtok(0, "/\\")) { pathTokens.push_back(pathToken); } const char *cdot = strrchr(pathTokens.back(), '.'); bool bXmlFile = false; if (cdot && 0 == strcmp(cdot, ".xml")) bXmlFile = true; free(s2); if (bXmlFile) { AnimData *pAnimData = new AnimData; if (pAnimData) { if (!pAnimData->loadFromXml(aniFileName)) { delete pAnimData; pAnimData = 0; } } return pAnimData; } else { iByteStream *byteStream = iSystem::GetInstance()->loadStream(aniFileName); if (!byteStream) return 0; AnimData *pAnimData = new AnimData; if (pAnimData) { if (!pAnimData->loadFromByteStream(byteStream)) { delete pAnimData; pAnimData = 0; } } iSystem::GetInstance()->release(byteStream); return pAnimData; } }