std::string StreamCache::RealFileForCacheFile( const std::string cacheFile, const std::string contentType ) { std::string realFile = cacheFile; // force extensions for some known mime types because renderer has no idea about mime types // FIXME: this breaks caching due to cache file name mismatch at the start of PerformRequest if( contentType != "" ) { std::string forceExtension( "" ); if( contentType == "image/x-tga" ) { forceExtension = ".tga"; } else if( contentType == "image/jpeg" || contentType == "image/jpg" ) { forceExtension = ".jpg"; } else if( contentType == "image/png" ) { forceExtension = ".png"; } // remove existing extension (if any), append forced extension if( forceExtension != "" ) { std::string::size_type dot = realFile.rfind( '.' ); std::string::size_type slash = realFile.rfind( '/' ); if( dot != realFile.npos && ( slash == realFile.npos || dot > slash ) ) { realFile = realFile.substr( 0, dot ); } realFile += forceExtension; } } // add a link if( realFile != cacheFile ) { int filenum; std::string linkFile = cacheFile + LINK_EXTENSION; if( trap::FS_FOpenFile( linkFile.c_str(), &filenum, FS_WRITE ) >= 0 ) { trap::FS_Write( realFile.c_str(), realFile.length(), filenum ); trap::FS_FCloseFile( filenum ); } } return realFile; }
/* if user consents to it, change the filename extension. */ char *maybeForceExtension( struct pgpfileBones *filebPtr, char *filename, char *extension ) { struct pgpenvBones *envbPtr = filebPtr->envbPtr; PGPEnv *env = envbPtr->m_env; PGPInt32 pri; PGPError err; static char newname[MAX_PATH]; if (!hasExtension(filename, extension)) { strcpy(newname, filename); forceExtension( filebPtr, newname, extension ); if (!fileExists(newname)) { fprintf(filebPtr->pgpout, LANG("\nShould '%s' be renamed to '%s' [Y/n]? "), filename, newname); if (getyesno(filebPtr, 'y', (PGPBoolean)pgpenvGetInt( env, PGPENV_BATCHMODE, &pri, &err ))) return newname; } } return NULL; }/* maybe_force_extension */