From 21b6c8b0b8b486a097bb9db41f9b02933b358f44 Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Mon, 23 Jul 2012 14:39:54 +0100 Subject: [PATCH] Try to improve path handling a bit, and add a few tests. --- src/lib/film.cc | 14 ++++++++++---- src/lib/film_state.cc | 24 +++++++++++++++--------- src/lib/film_state.h | 2 +- test/test.cc | 13 +++++++++++++ 4 files changed, 39 insertions(+), 14 deletions(-) diff --git a/src/lib/film.cc b/src/lib/film.cc index f11d30aba..bed973924 100644 --- a/src/lib/film.cc +++ b/src/lib/film.cc @@ -413,10 +413,11 @@ Film::j2k_dir () const { assert (format()); - stringstream s; + filesystem::path p; + /* Start with j2c */ - s << "j2c/"; + p /= "j2c"; pair 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 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 */ diff --git a/src/lib/film_state.cc b/src/lib/film_state.cc index 369e4c986..ae70b53bd 100644 --- a/src/lib/film_state.cc +++ b/src/lib/film_state.cc @@ -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 diff --git a/src/lib/film_state.h b/src/lib/film_state.h index 62ca76c41..beac5fc2c 100644 --- a/src/lib/film_state.h +++ b/src/lib/film_state.h @@ -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 thumbs; /** Size, in pixels, of the source (ignoring cropping) */ Size size; diff --git a/test/test.cc b/test/test.cc index dd44f4a45..d2e262029 100644 --- a/test/test.cc +++ b/test/test.cc @@ -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"); +} -- 2.30.2