Try to improve path handling a bit, and add a few tests.
authorCarl Hetherington <cth@carlh.net>
Mon, 23 Jul 2012 13:39:54 +0000 (14:39 +0100)
committerCarl Hetherington <cth@carlh.net>
Mon, 23 Jul 2012 13:39:54 +0000 (14:39 +0100)
src/lib/film.cc
src/lib/film_state.cc
src/lib/film_state.h
test/test.cc

index f11d30abafb749e92ef4150fbd9b62a450f69232..bed9739243fed372d7a87db7caf11269c34f4d19 100644 (file)
@@ -413,10 +413,11 @@ Film::j2k_dir () const
 {
        assert (format());
 
-       stringstream s;
+       filesystem::path p;
+
 
        /* Start with j2c */
-       s << "j2c/";
+       p /= "j2c";
 
        pair<string, string> f = Filter::ffmpeg_strings (filters ());
 
@@ -424,19 +425,24 @@ Film::j2k_dir () const
           so that we don't get confused about J2K files generated using different
           settings.
        */
+       stringstream s;
        s << _state.format->nickname()
          << "_" << _state.content_digest
          << "_" << left_crop() << "_" << right_crop() << "_" << top_crop() << "_" << bottom_crop()
          << "_" << f.first << "_" << f.second
          << "_" << _state.scaler->id();
 
+       p /= s.str ();
+
        /* Similarly for the A/B case */
        if (dcp_ab()) {
+               stringstream s;
                pair<string, string> fa = Filter::ffmpeg_strings (Config::instance()->reference_filters());
-               s << "/ab_" << Config::instance()->reference_scaler()->id() << "_" << fa.first << "_" << fa.second;
+               s << "ab_" << Config::instance()->reference_scaler()->id() << "_" << fa.first << "_" << fa.second;
+               p /= s.str ();
        }
        
-       return _state.dir (s.str ());
+       return _state.dir (p.string ());
 }
 
 /** Handle a change to the Film's metadata */
index 369e4c98693417a8d5ccd193dc4dad22361066ab..ae70b53bdc4626776a1f055541726e8c56cc30b7 100644 (file)
@@ -190,10 +190,14 @@ string
 FilmState::thumb_file_for_frame (int n) const
 {
        stringstream s;
-       s << dir ("thumbs") << "/";
        s.width (8);
        s << setfill('0') << n << ".tiff";
-       return s.str ();
+       
+       filesystem::path p;
+       p /= dir ("thumbs");
+       p /= s.str ();
+               
+       return p.string ();
 }
 
 
@@ -221,19 +225,21 @@ FilmState::cropped_size (Size s) const
 string
 FilmState::dir (string d) const
 {
-       stringstream s;
-       s << directory << "/" << d;
-       filesystem::create_directories (s.str ());
-       return s.str ();
+       filesystem::path p;
+       p /= directory;
+       p /= d;
+       filesystem::create_directories (p);
+       return p.string ();
 }
 
 /** Given a file or directory name, return its full path within the Film's directory */
 string
 FilmState::file (string f) const
 {
-       stringstream s;
-       s << directory << "/" << f;
-       return s.str ();
+       filesystem::path p;
+       p /= directory;
+       p /= f;
+       return p.string ();
 }
 
 string
index 62ca76c4190b2a4d2d97db9cd6c2ea8555678cd0..beac5fc2c92410fca665a7a4085bae04f7661076 100644 (file)
@@ -135,7 +135,7 @@ public:
 
        /* Data which is cached to speed things up */
 
-       /** Vector of frame indices for each of our `thumbnails */
+       /** Vector of frame indices for each of our `thumbnails' */
        std::vector<int> thumbs;
        /** Size, in pixels, of the source (ignoring cropping) */
        Size size;
index dd44f4a45bbbd4270b6abaa103e46651c9cbf0ff..d2e2620291e7a60de7bf1a0ef169aa07d9a039f9 100644 (file)
@@ -235,3 +235,16 @@ BOOST_AUTO_TEST_CASE (md5_digest_test)
 
        BOOST_CHECK_THROW (md5_digest ("foobar"), OpenFileError);
 }
+
+BOOST_AUTO_TEST_CASE (paths_test)
+{
+       FilmState s;
+       s.directory = "build/test/a/b/c/d/e";
+       s.thumbs.push_back (42);
+       BOOST_CHECK_EQUAL (s.thumb_file (0), "build/test/a/b/c/d/e/thumbs/00000042.tiff");
+
+       s.content = "/foo/bar/baz";
+       BOOST_CHECK_EQUAL (s.content_path(), "/foo/bar/baz");
+       s.content = "foo/bar/baz";
+       BOOST_CHECK_EQUAL (s.content_path(), "build/test/a/b/c/d/e/foo/bar/baz");
+}