#ifdef HAVE_CONFIG_H #include #endif #ifdef _WIN32 #include #else #include #include #include #include #endif #include #include #include #include #include using namespace std; inline string testFilePath(const string &filename) { return string(TESTS_DIR "data/") + filename; } #define TEST_FILE_PATH_C(f) testFilePath(f).c_str() inline string copyFile(const string &filename, const string &ext) { char testFileName[1024]; #ifdef _WIN32 char tempDir[MAX_PATH + 1]; GetTempPathA(sizeof(tempDir), tempDir); wsprintfA(testFileName, "%s\\taglib-test%s", tempDir, ext.c_str()); #else snprintf(testFileName, sizeof(testFileName), "/%s/taglib-test%s", P_tmpdir, ext.c_str()); #endif string sourceFileName = testFilePath(filename) + ext; ifstream source(sourceFileName.c_str(), std::ios::binary); ofstream destination(testFileName, std::ios::binary); destination << source.rdbuf(); return string(testFileName); } inline void deleteFile(const string &filename) { remove(filename.c_str()); } inline bool fileEqual(const string &filename1, const string &filename2) { char buf1[BUFSIZ]; char buf2[BUFSIZ]; ifstream stream1(filename1.c_str(), ios_base::in | ios_base::binary); ifstream stream2(filename2.c_str(), ios_base::in | ios_base::binary); if(!stream1 && !stream2) return true; if(!stream1 || !stream2) return false; for(;;) { stream1.read(buf1, BUFSIZ); stream2.read(buf2, BUFSIZ); streamsize n1 = stream1.gcount(); streamsize n2 = stream2.gcount(); if(n1 != n2) return false; if(n1 == 0) break; if(memcmp(buf1, buf2, static_cast(n1)) != 0) return false; } return stream1.good() == stream2.good(); } class ScopedFileCopy { public: ScopedFileCopy(const string &filename, const string &ext, bool deleteFile=true) { m_deleteFile = deleteFile; m_filename = copyFile(filename, ext); } ~ScopedFileCopy() { if(m_deleteFile) deleteFile(m_filename); } string fileName() { return m_filename; } private: bool m_deleteFile; string m_filename; };