Remove LocaleGuard and lexical_cast<> in favour of libdcp::raw_convert,
authorCarl Hetherington <cth@carlh.net>
Sun, 11 May 2014 23:57:51 +0000 (00:57 +0100)
committerCarl Hetherington <cth@carlh.net>
Sun, 11 May 2014 23:57:51 +0000 (00:57 +0100)
which should get things right with both decimal and thousands
separators; LocaleGuard fixed decimal separators ok but not, it appears,
thousands ones.

22 files changed:
src/lib/audio_content.cc
src/lib/audio_mapping.cc
src/lib/colour_conversion.cc
src/lib/config.cc
src/lib/content.cc
src/lib/dci_metadata.cc
src/lib/dcp_video_frame.cc
src/lib/ffmpeg.cc
src/lib/ffmpeg_content.cc
src/lib/ffmpeg_decoder.cc
src/lib/film.cc
src/lib/image_examiner.cc
src/lib/playlist.cc
src/lib/server.cc
src/lib/server_finder.cc
src/lib/sndfile_content.cc
src/lib/subtitle_content.cc
src/lib/update.cc
src/lib/util.cc
src/lib/util.h
src/lib/video_content.cc
src/wx/audio_mapping_view.cc

index b96300e15eb6c8c362f5964814a7ad1d4213eda8..1896c4d5c356ad5105ab952c2e9f0067a2c77931 100644 (file)
@@ -18,6 +18,7 @@
 */
 
 #include <libcxml/cxml.h>
+#include <libdcp/raw_convert.h>
 #include "audio_content.h"
 #include "analyse_audio_job.h"
 #include "job_manager.h"
@@ -30,8 +31,8 @@
 using std::string;
 using std::vector;
 using boost::shared_ptr;
-using boost::lexical_cast;
 using boost::dynamic_pointer_cast;
+using libdcp::raw_convert;
 
 int const AudioContentProperty::AUDIO_CHANNELS = 200;
 int const AudioContentProperty::AUDIO_LENGTH = 201;
@@ -59,8 +60,6 @@ AudioContent::AudioContent (shared_ptr<const Film> f, boost::filesystem::path p)
 AudioContent::AudioContent (shared_ptr<const Film> f, shared_ptr<const cxml::Node> node)
        : Content (f, node)
 {
-       LocaleGuard lg;
-       
        _audio_gain = node->number_child<float> ("AudioGain");
        _audio_delay = node->number_child<int> ("AudioDelay");
 }
@@ -90,11 +89,9 @@ AudioContent::AudioContent (shared_ptr<const Film> f, vector<shared_ptr<Content>
 void
 AudioContent::as_xml (xmlpp::Node* node) const
 {
-       LocaleGuard lg;
-       
        boost::mutex::scoped_lock lm (_mutex);
-       node->add_child("AudioGain")->add_child_text (lexical_cast<string> (_audio_gain));
-       node->add_child("AudioDelay")->add_child_text (lexical_cast<string> (_audio_delay));
+       node->add_child("AudioGain")->add_child_text (raw_convert<string> (_audio_gain));
+       node->add_child("AudioDelay")->add_child_text (raw_convert<string> (_audio_delay));
 }
 
 
index 301d44fa665f0840f60cdd30956352ec3f1d76b0..b1810c97349e0652767e0940084b3db0b7add927 100644 (file)
@@ -17,9 +17,9 @@
 
 */
 
-#include <boost/lexical_cast.hpp>
 #include <libxml++/libxml++.h>
 #include <libcxml/cxml.h>
+#include <libdcp/raw_convert.h>
 #include "audio_mapping.h"
 #include "util.h"
 
@@ -30,8 +30,8 @@ using std::pair;
 using std::string;
 using std::min;
 using boost::shared_ptr;
-using boost::lexical_cast;
 using boost::dynamic_pointer_cast;
+using libdcp::raw_convert;
 
 AudioMapping::AudioMapping ()
        : _content_channels (0)
@@ -94,7 +94,7 @@ AudioMapping::AudioMapping (shared_ptr<const cxml::Node> node, int state_version
                        set (
                                (*i)->number_attribute<int> ("Content"),
                                static_cast<libdcp::Channel> ((*i)->number_attribute<int> ("DCP")),
-                               lexical_cast<float> ((*i)->content ())
+                               raw_convert<float> ((*i)->content ())
                                );
                }
        }
@@ -115,14 +115,14 @@ AudioMapping::get (int c, libdcp::Channel d) const
 void
 AudioMapping::as_xml (xmlpp::Node* node) const
 {
-       node->add_child ("ContentChannels")->add_child_text (lexical_cast<string> (_content_channels));
+       node->add_child ("ContentChannels")->add_child_text (raw_convert<string> (_content_channels));
 
        for (int c = 0; c < _content_channels; ++c) {
                for (int d = 0; d < MAX_DCP_AUDIO_CHANNELS; ++d) {
                        xmlpp::Element* t = node->add_child ("Gain");
-                       t->set_attribute ("Content", lexical_cast<string> (c));
-                       t->set_attribute ("DCP", lexical_cast<string> (d));
-                       t->add_child_text (lexical_cast<string> (get (c, static_cast<libdcp::Channel> (d))));
+                       t->set_attribute ("Content", raw_convert<string> (c));
+                       t->set_attribute ("DCP", raw_convert<string> (d));
+                       t->add_child_text (raw_convert<string> (get (c, static_cast<libdcp::Channel> (d))));
                }
        }
 }
index c3fa05426f3a2877b7b51cbf5d719ee2d2451794..cd1a81b257dcadfa76b1c6196ae7e7267f9dfce6 100644 (file)
@@ -17,9 +17,9 @@
 
 */
 
-#include <boost/lexical_cast.hpp>
 #include <libxml++/libxml++.h>
 #include <libdcp/colour_matrix.h>
+#include <libdcp/raw_convert.h>
 #include <libcxml/cxml.h>
 #include "config.h"
 #include "colour_conversion.h"
@@ -32,8 +32,8 @@ using std::string;
 using std::cout;
 using std::vector;
 using boost::shared_ptr;
-using boost::lexical_cast;
 using boost::optional;
+using libdcp::raw_convert;
 
 ColourConversion::ColourConversion ()
        : input_gamma (2.4)
@@ -64,8 +64,6 @@ ColourConversion::ColourConversion (double i, bool il, double const m[3][3], dou
 ColourConversion::ColourConversion (cxml::NodePtr node)
        : matrix (3, 3)
 {
-       LocaleGuard lg;
-       
        input_gamma = node->number_child<double> ("InputGamma");
        input_gamma_linearised = node->bool_child ("InputGammaLinearised");
 
@@ -79,7 +77,7 @@ ColourConversion::ColourConversion (cxml::NodePtr node)
        for (list<cxml::NodePtr>::iterator i = m.begin(); i != m.end(); ++i) {
                int const ti = (*i)->number_attribute<int> ("i");
                int const tj = (*i)->number_attribute<int> ("j");
-               matrix(ti, tj) = lexical_cast<double> ((*i)->content ());
+               matrix(ti, tj) = raw_convert<double> ((*i)->content ());
        }
 
        output_gamma = node->number_child<double> ("OutputGamma");
@@ -88,21 +86,19 @@ ColourConversion::ColourConversion (cxml::NodePtr node)
 void
 ColourConversion::as_xml (xmlpp::Node* node) const
 {
-       LocaleGuard lg;
-       
-       node->add_child("InputGamma")->add_child_text (lexical_cast<string> (input_gamma));
+       node->add_child("InputGamma")->add_child_text (raw_convert<string> (input_gamma));
        node->add_child("InputGammaLinearised")->add_child_text (input_gamma_linearised ? "1" : "0");
 
        for (int i = 0; i < 3; ++i) {
                for (int j = 0; j < 3; ++j) {
                        xmlpp::Element* m = node->add_child("Matrix");
-                       m->set_attribute ("i", lexical_cast<string> (i));
-                       m->set_attribute ("j", lexical_cast<string> (j));
-                       m->add_child_text (lexical_cast<string> (matrix (i, j)));
+                       m->set_attribute ("i", raw_convert<string> (i));
+                       m->set_attribute ("j", raw_convert<string> (j));
+                       m->add_child_text (raw_convert<string> (matrix (i, j)));
                }
        }
 
-       node->add_child("OutputGamma")->add_child_text (lexical_cast<string> (output_gamma));
+       node->add_child("OutputGamma")->add_child_text (raw_convert<string> (output_gamma));
 }
 
 optional<size_t>
index eda56416d20a380f4e0ca654540593ba1ce1ae64..d7503b848c75dad058e00cde6afaaf6fedffae10 100644 (file)
@@ -24,6 +24,7 @@
 #include <boost/filesystem.hpp>
 #include <boost/algorithm/string.hpp>
 #include <libdcp/colour_matrix.h>
+#include <libdcp/raw_convert.h>
 #include <libcxml/cxml.h>
 #include "config.h"
 #include "server.h"
@@ -46,10 +47,10 @@ using std::max;
 using std::exception;
 using std::cerr;
 using boost::shared_ptr;
-using boost::lexical_cast;
 using boost::optional;
 using boost::algorithm::is_any_of;
 using boost::algorithm::split;
+using libdcp::raw_convert;
 
 Config* Config::_instance = 0;
 
@@ -87,8 +88,6 @@ Config::Config ()
 void
 Config::read ()
 {
-       LocaleGuard lg;
-       
        if (!boost::filesystem::exists (file (false))) {
                read_old_metadata ();
                return;
@@ -308,15 +307,13 @@ Config::instance ()
 void
 Config::write () const
 {
-       LocaleGuard lg;
-       
        xmlpp::Document doc;
        xmlpp::Element* root = doc.create_root_node ("Config");
 
        root->add_child("Version")->add_child_text ("1");
-       root->add_child("NumLocalEncodingThreads")->add_child_text (lexical_cast<string> (_num_local_encoding_threads));
+       root->add_child("NumLocalEncodingThreads")->add_child_text (raw_convert<string> (_num_local_encoding_threads));
        root->add_child("DefaultDirectory")->add_child_text (_default_directory.string ());
-       root->add_child("ServerPortBase")->add_child_text (lexical_cast<string> (_server_port_base));
+       root->add_child("ServerPortBase")->add_child_text (raw_convert<string> (_server_port_base));
        root->add_child("UseAnyServers")->add_child_text (_use_any_servers ? "1" : "0");
        
        for (vector<string>::const_iterator i = _servers.begin(); i != _servers.end(); ++i) {
@@ -344,9 +341,9 @@ Config::write () const
 
        _default_dci_metadata.as_xml (root->add_child ("DCIMetadata"));
 
-       root->add_child("DefaultStillLength")->add_child_text (lexical_cast<string> (_default_still_length));
-       root->add_child("DefaultJ2KBandwidth")->add_child_text (lexical_cast<string> (_default_j2k_bandwidth));
-       root->add_child("DefaultAudioDelay")->add_child_text (lexical_cast<string> (_default_audio_delay));
+       root->add_child("DefaultStillLength")->add_child_text (raw_convert<string> (_default_still_length));
+       root->add_child("DefaultJ2KBandwidth")->add_child_text (raw_convert<string> (_default_j2k_bandwidth));
+       root->add_child("DefaultAudioDelay")->add_child_text (raw_convert<string> (_default_audio_delay));
 
        for (vector<PresetColourConversion>::const_iterator i = _colour_conversions.begin(); i != _colour_conversions.end(); ++i) {
                i->as_xml (root->add_child ("ColourConversion"));
@@ -365,7 +362,7 @@ Config::write () const
        root->add_child("CheckForUpdates")->add_child_text (_check_for_updates ? "1" : "0");
        root->add_child("CheckForTestUpdates")->add_child_text (_check_for_test_updates ? "1" : "0");
 
-       root->add_child("MaximumJ2KBandwidth")->add_child_text (lexical_cast<string> (_maximum_j2k_bandwidth));
+       root->add_child("MaximumJ2KBandwidth")->add_child_text (raw_convert<string> (_maximum_j2k_bandwidth));
 
        doc.write_to_file_formatted (file(false).string ());
 }
index 8294682475a65b30ceb6717f5eea37b1dff33fba..1ec607d394896b8ec0dbdc7ad1dbeacb7cfb7393 100644 (file)
@@ -20,6 +20,7 @@
 #include <boost/thread/mutex.hpp>
 #include <libxml++/libxml++.h>
 #include <libcxml/cxml.h>
+#include <libdcp/raw_convert.h>
 #include "content.h"
 #include "util.h"
 #include "content_factory.h"
@@ -36,7 +37,7 @@ using std::list;
 using std::cout;
 using std::vector;
 using boost::shared_ptr;
-using boost::lexical_cast;
+using libdcp::raw_convert;
 
 int const ContentProperty::PATH = 400;
 int const ContentProperty::POSITION = 401;
@@ -119,9 +120,9 @@ Content::as_xml (xmlpp::Node* node) const
                node->add_child("Path")->add_child_text (i->string ());
        }
        node->add_child("Digest")->add_child_text (_digest);
-       node->add_child("Position")->add_child_text (lexical_cast<string> (_position));
-       node->add_child("TrimStart")->add_child_text (lexical_cast<string> (_trim_start));
-       node->add_child("TrimEnd")->add_child_text (lexical_cast<string> (_trim_end));
+       node->add_child("Position")->add_child_text (raw_convert<string> (_position));
+       node->add_child("TrimStart")->add_child_text (raw_convert<string> (_trim_start));
+       node->add_child("TrimEnd")->add_child_text (raw_convert<string> (_trim_end));
 }
 
 void
index 27306a15e48f2c1f6c44c7eb10bf90867a98a7f2..ccdc1ee1ca73d70720481497f392881f53caf101 100644 (file)
@@ -1,5 +1,5 @@
 /*
-    Copyright (C) 2012 Carl Hetherington <cth@carlh.net>
+    Copyright (C) 2012-2014 Carl Hetherington <cth@carlh.net>
 
     This program is free software; you can redistribute it and/or modify
     it under the terms of the GNU General Public License as published by
 
 #include <iostream>
 #include <libcxml/cxml.h>
+#include <libdcp/raw_convert.h>
 #include "dci_metadata.h"
 
 #include "i18n.h"
 
 using std::string;
-using boost::lexical_cast;
 using boost::shared_ptr;
+using libdcp::raw_convert;
 
 DCIMetadata::DCIMetadata (shared_ptr<const cxml::Node> node)
 {
@@ -42,7 +43,7 @@ DCIMetadata::DCIMetadata (shared_ptr<const cxml::Node> node)
 void
 DCIMetadata::as_xml (xmlpp::Node* root) const
 {
-       root->add_child("ContentVersion")->add_child_text (lexical_cast<string> (content_version));
+       root->add_child("ContentVersion")->add_child_text (raw_convert<string> (content_version));
        root->add_child("AudioLanguage")->add_child_text (audio_language);
        root->add_child("SubtitleLanguage")->add_child_text (subtitle_language);
        root->add_child("Territory")->add_child_text (territory);
index 54531a0f9947e0eca275f78b36e8b4f6d71d6387..1c12eb7fd7b9a6022de7e0a1b26895d3256669b7 100644 (file)
 #include <boost/array.hpp>
 #include <boost/asio.hpp>
 #include <boost/filesystem.hpp>
-#include <boost/lexical_cast.hpp>
 #include <libdcp/rec709_linearised_gamma_lut.h>
 #include <libdcp/srgb_linearised_gamma_lut.h>
 #include <libdcp/gamma_lut.h>
 #include <libdcp/xyz_frame.h>
 #include <libdcp/rgb_xyz.h>
 #include <libdcp/colour_matrix.h>
+#include <libdcp/raw_convert.h>
 #include <libcxml/cxml.h>
 #include "film.h"
 #include "dcp_video_frame.h"
@@ -67,8 +67,8 @@ using std::string;
 using std::stringstream;
 using std::cout;
 using boost::shared_ptr;
-using boost::lexical_cast;
 using libdcp::Size;
+using libdcp::raw_convert;
 
 #define DCI_COEFFICENT (48.0 / 52.37)
 
@@ -276,7 +276,7 @@ DCPVideoFrame::encode_remotely (ServerDescription serv)
 {
        boost::asio::io_service io_service;
        boost::asio::ip::tcp::resolver resolver (io_service);
-       boost::asio::ip::tcp::resolver::query query (serv.host_name(), boost::lexical_cast<string> (Config::instance()->server_port_base ()));
+       boost::asio::ip::tcp::resolver::query query (serv.host_name(), raw_convert<string> (Config::instance()->server_port_base ()));
        boost::asio::ip::tcp::resolver::iterator endpoint_iterator = resolver.resolve (query);
 
        shared_ptr<Socket> socket (new Socket);
@@ -286,9 +286,9 @@ DCPVideoFrame::encode_remotely (ServerDescription serv)
        xmlpp::Document doc;
        xmlpp::Element* root = doc.create_root_node ("EncodingRequest");
 
-       root->add_child("Version")->add_child_text (lexical_cast<string> (SERVER_LINK_VERSION));
-       root->add_child("Width")->add_child_text (lexical_cast<string> (_image->size().width));
-       root->add_child("Height")->add_child_text (lexical_cast<string> (_image->size().height));
+       root->add_child("Version")->add_child_text (raw_convert<string> (SERVER_LINK_VERSION));
+       root->add_child("Width")->add_child_text (raw_convert<string> (_image->size().width));
+       root->add_child("Height")->add_child_text (raw_convert<string> (_image->size().height));
        add_metadata (root);
 
        stringstream xml;
@@ -312,7 +312,7 @@ DCPVideoFrame::encode_remotely (ServerDescription serv)
 void
 DCPVideoFrame::add_metadata (xmlpp::Element* el) const
 {
-       el->add_child("Frame")->add_child_text (lexical_cast<string> (_frame));
+       el->add_child("Frame")->add_child_text (raw_convert<string> (_frame));
 
        switch (_eyes) {
        case EYES_BOTH:
@@ -330,9 +330,9 @@ DCPVideoFrame::add_metadata (xmlpp::Element* el) const
        
        _conversion.as_xml (el->add_child("ColourConversion"));
 
-       el->add_child("FramesPerSecond")->add_child_text (lexical_cast<string> (_frames_per_second));
-       el->add_child("J2KBandwidth")->add_child_text (lexical_cast<string> (_j2k_bandwidth));
-       el->add_child("Resolution")->add_child_text (lexical_cast<string> (int (_resolution)));
+       el->add_child("FramesPerSecond")->add_child_text (raw_convert<string> (_frames_per_second));
+       el->add_child("J2KBandwidth")->add_child_text (raw_convert<string> (_j2k_bandwidth));
+       el->add_child("Resolution")->add_child_text (raw_convert<string> (int (_resolution)));
 }
 
 EncodedData::EncodedData (int s)
index 60eea6ec7756b626cf76fb996f552940196730b9..ed3e0721f2810c0b7a7e56fc084d7a2a16f49278 100644 (file)
@@ -22,6 +22,7 @@ extern "C" {
 #include <libavformat/avformat.h>
 #include <libswscale/swscale.h>
 }
+#include <libdcp/raw_convert.h>
 #include "ffmpeg.h"
 #include "ffmpeg_content.h"
 #include "exceptions.h"
@@ -33,7 +34,7 @@ using std::string;
 using std::cout;
 using std::stringstream;
 using boost::shared_ptr;
-using boost::lexical_cast;
+using libdcp::raw_convert;
 
 boost::mutex FFmpeg::_mutex;
 
@@ -94,8 +95,8 @@ FFmpeg::setup_general ()
        /* These durations are in microseconds, and represent how far into the content file
           we will look for streams.
        */
-       av_dict_set (&options, "analyzeduration", lexical_cast<string> (5 * 60 * 1e6).c_str(), 0);
-       av_dict_set (&options, "probesize", lexical_cast<string> (5 * 60 * 1e6).c_str(), 0);
+       av_dict_set (&options, "analyzeduration", raw_convert<string> (5 * 60 * 1e6).c_str(), 0);
+       av_dict_set (&options, "probesize", raw_convert<string> (5 * 60 * 1e6).c_str(), 0);
        
        if (avformat_open_input (&_format_context, 0, 0, &options) < 0) {
                throw OpenFileError (_ffmpeg_content->path(0).string ());
index b39113fd1a39ca43def767e34c861460f3ba3714..f810d53be21374e27cd3e929214d04130fcb98b6 100644 (file)
@@ -21,6 +21,7 @@ extern "C" {
 #include <libavformat/avformat.h>
 }
 #include <libcxml/cxml.h>
+#include <libdcp/raw_convert.h>
 #include "ffmpeg_content.h"
 #include "ffmpeg_examiner.h"
 #include "compose.hpp"
@@ -40,8 +41,8 @@ using std::list;
 using std::cout;
 using std::pair;
 using boost::shared_ptr;
-using boost::lexical_cast;
 using boost::dynamic_pointer_cast;
+using libdcp::raw_convert;
 
 int const FFmpegContentProperty::SUBTITLE_STREAMS = 100;
 int const FFmpegContentProperty::SUBTITLE_STREAM = 101;
@@ -152,7 +153,7 @@ FFmpegContent::as_xml (xmlpp::Node* node) const
        }
 
        if (_first_video) {
-               node->add_child("FirstVideo")->add_child_text (lexical_cast<string> (_first_video.get ()));
+               node->add_child("FirstVideo")->add_child_text (raw_convert<string> (_first_video.get ()));
        }
 }
 
@@ -353,7 +354,7 @@ void
 FFmpegStream::as_xml (xmlpp::Node* root) const
 {
        root->add_child("Name")->add_child_text (name);
-       root->add_child("Id")->add_child_text (lexical_cast<string> (_id));
+       root->add_child("Id")->add_child_text (raw_convert<string> (_id));
 }
 
 FFmpegAudioStream::FFmpegAudioStream (shared_ptr<const cxml::Node> node, int version)
@@ -369,10 +370,10 @@ void
 FFmpegAudioStream::as_xml (xmlpp::Node* root) const
 {
        FFmpegStream::as_xml (root);
-       root->add_child("FrameRate")->add_child_text (lexical_cast<string> (frame_rate));
-       root->add_child("Channels")->add_child_text (lexical_cast<string> (channels));
+       root->add_child("FrameRate")->add_child_text (raw_convert<string> (frame_rate));
+       root->add_child("Channels")->add_child_text (raw_convert<string> (channels));
        if (first_audio) {
-               root->add_child("FirstAudio")->add_child_text (lexical_cast<string> (first_audio.get ()));
+               root->add_child("FirstAudio")->add_child_text (raw_convert<string> (first_audio.get ()));
        }
        mapping.as_xml (root->add_child("Mapping"));
 }
index 1920f9275c66ba92d3ae85c9ddf81fbe2591253c..c93012608406cab6aeaf8c78414f5215366898df 100644 (file)
@@ -27,7 +27,6 @@
 #include <iomanip>
 #include <iostream>
 #include <stdint.h>
-#include <boost/lexical_cast.hpp>
 #include <sndfile.h>
 extern "C" {
 #include <libavcodec/avcodec.h>
index 7b72126f95c9d459ba2b209b0e24b4d9d29260e9..09d939957d26b5d42b0804c8acd0ef10cec38d04 100644 (file)
@@ -27,7 +27,6 @@
 #include <unistd.h>
 #include <boost/filesystem.hpp>
 #include <boost/algorithm/string.hpp>
-#include <boost/lexical_cast.hpp>
 #include <boost/date_time.hpp>
 #include <libxml++/libxml++.h>
 #include <libcxml/cxml.h>
@@ -36,6 +35,7 @@
 #include <libdcp/signer.h>
 #include <libdcp/util.h>
 #include <libdcp/kdm.h>
+#include <libdcp/raw_convert.h>
 #include "film.h"
 #include "job.h"
 #include "util.h"
@@ -72,7 +72,6 @@ using std::cout;
 using std::list;
 using boost::shared_ptr;
 using boost::weak_ptr;
-using boost::lexical_cast;
 using boost::dynamic_pointer_cast;
 using boost::to_upper_copy;
 using boost::ends_with;
@@ -80,6 +79,7 @@ using boost::starts_with;
 using boost::optional;
 using libdcp::Size;
 using libdcp::Signer;
+using libdcp::raw_convert;
 
 /* 5 -> 6
  * AudioMapping XML changed.
@@ -152,9 +152,10 @@ string
 Film::video_identifier () const
 {
        assert (container ());
-       LocaleGuard lg;
 
        stringstream s;
+       s.imbue (std::locale::classic ());
+       
        s << container()->id()
          << "_" << resolution_to_string (_resolution)
          << "_" << _playlist->video_identifier()
@@ -340,12 +341,10 @@ Film::encoded_frames () const
 shared_ptr<xmlpp::Document>
 Film::metadata () const
 {
-       LocaleGuard lg;
-
        shared_ptr<xmlpp::Document> doc (new xmlpp::Document);
        xmlpp::Element* root = doc->create_root_node ("Metadata");
 
-       root->add_child("Version")->add_child_text (lexical_cast<string> (current_state_version));
+       root->add_child("Version")->add_child_text (raw_convert<string> (current_state_version));
        root->add_child("Name")->add_child_text (_name);
        root->add_child("UseDCIName")->add_child_text (_use_dci_name ? "1" : "0");
 
@@ -360,11 +359,11 @@ Film::metadata () const
        root->add_child("Resolution")->add_child_text (resolution_to_string (_resolution));
        root->add_child("Scaler")->add_child_text (_scaler->id ());
        root->add_child("WithSubtitles")->add_child_text (_with_subtitles ? "1" : "0");
-       root->add_child("J2KBandwidth")->add_child_text (lexical_cast<string> (_j2k_bandwidth));
+       root->add_child("J2KBandwidth")->add_child_text (raw_convert<string> (_j2k_bandwidth));
        _dci_metadata.as_xml (root->add_child ("DCIMetadata"));
-       root->add_child("VideoFrameRate")->add_child_text (lexical_cast<string> (_video_frame_rate));
+       root->add_child("VideoFrameRate")->add_child_text (raw_convert<string> (_video_frame_rate));
        root->add_child("DCIDate")->add_child_text (boost::gregorian::to_iso_string (_dci_date));
-       root->add_child("AudioChannels")->add_child_text (lexical_cast<string> (_audio_channels));
+       root->add_child("AudioChannels")->add_child_text (raw_convert<string> (_audio_channels));
        root->add_child("ThreeD")->add_child_text (_three_d ? "1" : "0");
        root->add_child("SequenceVideo")->add_child_text (_sequence_video ? "1" : "0");
        root->add_child("Interop")->add_child_text (_interop ? "1" : "0");
@@ -392,8 +391,6 @@ Film::write_metadata () const
 list<string>
 Film::read_metadata ()
 {
-       LocaleGuard lg;
-
        if (boost::filesystem::exists (file ("metadata")) && !boost::filesystem::exists (file ("metadata.xml"))) {
                throw StringError (_("This film was created with an older version of DCP-o-matic, and unfortunately it cannot be loaded into this version.  You will need to create a new Film, re-add your content and set it up again.  Sorry!"));
        }
index 12fe2b8a61d757f4c561bb4bcd867782d13edfdf..4ff324f68d4d76ba29e6437e353e48d1b178be65 100644 (file)
@@ -1,5 +1,5 @@
 /*
-    Copyright (C) 2013 Carl Hetherington <cth@carlh.net>
+    Copyright (C) 2013-2014 Carl Hetherington <cth@carlh.net>
 
     This program is free software; you can redistribute it and/or modify
     it under the terms of the GNU General Public License as published by
@@ -18,7 +18,6 @@
 */
 
 #include <iostream>
-#include <boost/lexical_cast.hpp>
 #include <Magick++.h>
 #include "image_content.h"
 #include "image_examiner.h"
@@ -33,8 +32,6 @@ using std::cout;
 using std::list;
 using std::sort;
 using boost::shared_ptr;
-using boost::lexical_cast;
-using boost::bad_lexical_cast;
 
 ImageExaminer::ImageExaminer (shared_ptr<const Film> film, shared_ptr<const ImageContent> content, shared_ptr<Job>)
        : _film (film)
index a2bec83bb3266948802c14f4c9fe4436e3b4e649..eb9a49d30b3947cca95da47328b30c5bd0335bbe 100644 (file)
@@ -19,7 +19,6 @@
 
 #include <libcxml/cxml.h>
 #include <boost/shared_ptr.hpp>
-#include <boost/lexical_cast.hpp>
 #include "playlist.h"
 #include "sndfile_content.h"
 #include "sndfile_decoder.h"
@@ -46,7 +45,6 @@ using boost::optional;
 using boost::shared_ptr;
 using boost::weak_ptr;
 using boost::dynamic_pointer_cast;
-using boost::lexical_cast;
 
 Playlist::Playlist ()
        : _sequence_video (true)
index 1f3f61e425a0392b791453245e0fcd6b2cd7b671..0c5792ae0da6b8d07d678e5244b6b04b381645e6 100644 (file)
@@ -27,9 +27,9 @@
 #include <sstream>
 #include <iostream>
 #include <boost/algorithm/string.hpp>
-#include <boost/lexical_cast.hpp>
 #include <boost/scoped_array.hpp>
 #include <libcxml/cxml.h>
+#include <libdcp/raw_convert.h>
 #include "server.h"
 #include "util.h"
 #include "scaler.h"
@@ -56,8 +56,8 @@ using boost::thread;
 using boost::bind;
 using boost::scoped_array;
 using boost::optional;
-using boost::lexical_cast;
 using libdcp::Size;
+using libdcp::raw_convert;
 
 Server::Server (shared_ptr<Log> log, bool verbose)
        : _log (log)
@@ -246,7 +246,7 @@ Server::broadcast_received ()
                /* Reply to the client saying what we can do */
                xmlpp::Document doc;
                xmlpp::Element* root = doc.create_root_node ("ServerAvailable");
-               root->add_child("Threads")->add_child_text (lexical_cast<string> (_worker_threads.size ()));
+               root->add_child("Threads")->add_child_text (raw_convert<string> (_worker_threads.size ()));
                stringstream xml;
                doc.write_to_stream (xml, "UTF-8");
 
index 1080d24c4103765fce705019b177c19b4a415275..ed6016c6723f51e1be2f028b67fc952fda482978 100644 (file)
@@ -18,6 +18,7 @@
 */
 
 #include <libcxml/cxml.h>
+#include <libdcp/raw_convert.h>
 #include "server_finder.h"
 #include "exceptions.h"
 #include "util.h"
@@ -32,7 +33,7 @@ using std::vector;
 using std::cout;
 using boost::shared_ptr;
 using boost::scoped_array;
-using boost::lexical_cast;
+using libdcp::raw_convert;
 
 ServerFinder* ServerFinder::_instance = 0;
 
@@ -82,7 +83,7 @@ try
                        }
                        try {
                                boost::asio::ip::udp::resolver resolver (io_service);
-                               boost::asio::ip::udp::resolver::query query (*i, lexical_cast<string> (Config::instance()->server_port_base() + 1));
+                               boost::asio::ip::udp::resolver::query query (*i, raw_convert<string> (Config::instance()->server_port_base() + 1));
                                boost::asio::ip::udp::endpoint end_point (*resolver.resolve (query));
                                socket.send_to (boost::asio::buffer (data.c_str(), data.size() + 1), end_point);
                        } catch (...) {
index a8388ab77b24cb1441e1c19a0905e01ec775a193..fcdf88778ac81173080aebfbda9cbf832d8a169c 100644 (file)
@@ -1,5 +1,5 @@
 /*
-    Copyright (C) 2013 Carl Hetherington <cth@carlh.net>
+    Copyright (C) 2013-2014 Carl Hetherington <cth@carlh.net>
 
     This program is free software; you can redistribute it and/or modify
     it under the terms of the GNU General Public License as published by
@@ -18,6 +18,7 @@
 */
 
 #include <libcxml/cxml.h>
+#include <libdcp/raw_convert.h>
 #include "sndfile_content.h"
 #include "sndfile_decoder.h"
 #include "film.h"
@@ -31,7 +32,7 @@ using std::string;
 using std::stringstream;
 using std::cout;
 using boost::shared_ptr;
-using boost::lexical_cast;
+using libdcp::raw_convert;
 
 int const SndfileContentProperty::VIDEO_FRAME_RATE = 600;
 
@@ -137,9 +138,9 @@ SndfileContent::as_xml (xmlpp::Node* node) const
        Content::as_xml (node);
        AudioContent::as_xml (node);
 
-       node->add_child("AudioChannels")->add_child_text (lexical_cast<string> (audio_channels ()));
-       node->add_child("AudioLength")->add_child_text (lexical_cast<string> (audio_length ()));
-       node->add_child("AudioFrameRate")->add_child_text (lexical_cast<string> (content_audio_frame_rate ()));
+       node->add_child("AudioChannels")->add_child_text (raw_convert<string> (audio_channels ()));
+       node->add_child("AudioLength")->add_child_text (raw_convert<string> (audio_length ()));
+       node->add_child("AudioFrameRate")->add_child_text (raw_convert<string> (content_audio_frame_rate ()));
        _audio_mapping.as_xml (node->add_child("AudioMapping"));
 }
 
index 8f88574e5e7ff53950c903b710c571fe1b151cce..0abb7d491ec57ffff13e2d483fc67e282fd473fb 100644 (file)
@@ -1,5 +1,5 @@
 /*
-    Copyright (C) 2013 Carl Hetherington <cth@carlh.net>
+    Copyright (C) 2013-2014 Carl Hetherington <cth@carlh.net>
 
     This program is free software; you can redistribute it and/or modify
     it under the terms of the GNU General Public License as published by
@@ -18,6 +18,7 @@
 */
 
 #include <libcxml/cxml.h>
+#include <libdcp/raw_convert.h>
 #include "subtitle_content.h"
 #include "util.h"
 #include "exceptions.h"
@@ -27,8 +28,8 @@
 using std::string;
 using std::vector;
 using boost::shared_ptr;
-using boost::lexical_cast;
 using boost::dynamic_pointer_cast;
+using libdcp::raw_convert;
 
 int const SubtitleContentProperty::SUBTITLE_X_OFFSET = 500;
 int const SubtitleContentProperty::SUBTITLE_Y_OFFSET = 501;
@@ -49,8 +50,6 @@ SubtitleContent::SubtitleContent (shared_ptr<const Film> f, shared_ptr<const cxm
        , _subtitle_y_offset (0)
        , _subtitle_scale (1)
 {
-       LocaleGuard lg;
-
        if (version >= 7) {
                _subtitle_x_offset = node->number_child<float> ("SubtitleXOffset");
                _subtitle_y_offset = node->number_child<float> ("SubtitleYOffset");
@@ -91,11 +90,9 @@ SubtitleContent::SubtitleContent (shared_ptr<const Film> f, vector<shared_ptr<Co
 void
 SubtitleContent::as_xml (xmlpp::Node* root) const
 {
-       LocaleGuard lg;
-       
-       root->add_child("SubtitleXOffset")->add_child_text (lexical_cast<string> (_subtitle_x_offset));
-       root->add_child("SubtitleYOffset")->add_child_text (lexical_cast<string> (_subtitle_y_offset));
-       root->add_child("SubtitleScale")->add_child_text (lexical_cast<string> (_subtitle_scale));
+       root->add_child("SubtitleXOffset")->add_child_text (raw_convert<string> (_subtitle_x_offset));
+       root->add_child("SubtitleYOffset")->add_child_text (raw_convert<string> (_subtitle_y_offset));
+       root->add_child("SubtitleScale")->add_child_text (raw_convert<string> (_subtitle_scale));
 }
 
 void
index a98ee5b5d6bd8b52331831a1a101e0ccf0e21f20..34eaf385c92e77340b361ad634705083a938a459 100644 (file)
@@ -22,6 +22,7 @@
 #include <boost/algorithm/string.hpp>
 #include <curl/curl.h>
 #include <libcxml/cxml.h>
+#include <libdcp/raw_convert.h>
 #include "update.h"
 #include "version.h"
 #include "ui_signaller.h"
@@ -32,7 +33,7 @@ using std::cout;
 using std::min;
 using std::string;
 using std::stringstream;
-using boost::lexical_cast;
+using libdcp::raw_convert;
 
 UpdateChecker* UpdateChecker::_instance = 0;
 
@@ -120,12 +121,12 @@ UpdateChecker::thread ()
                                current_pre = true;
                        }
                        
-                       float current_float = lexical_cast<float> (current);
+                       float current_float = raw_convert<float> (current);
                        if (current_pre) {
                                current_float -= 0.005;
                        }
                        
-                       if (current_float < lexical_cast<float> (_stable)) {
+                       if (current_float < raw_convert<float> (_stable)) {
                                set_state (YES);
                        } else {
                                set_state (NO);
index 62416163bc4aa080ef58cb0acab6d954dd34d0df..a5111b7dc121d18c65211757ffb7c96791b7add7 100644 (file)
@@ -1,5 +1,5 @@
 /*
-    Copyright (C) 2012 Carl Hetherington <cth@carlh.net>
+    Copyright (C) 2012-2014 Carl Hetherington <cth@carlh.net>
     Copyright (C) 2000-2007 Paul Davis
 
     This program is free software; you can redistribute it and/or modify
@@ -37,7 +37,6 @@
 #include <boost/algorithm/string.hpp>
 #include <boost/bind.hpp>
 #include <boost/lambda/lambda.hpp>
-#include <boost/lexical_cast.hpp>
 #include <boost/thread.hpp>
 #include <boost/filesystem.hpp>
 #ifdef DCPOMATIC_WINDOWS
@@ -52,6 +51,7 @@
 #include <libdcp/util.h>
 #include <libdcp/signer_chain.h>
 #include <libdcp/signer.h>
+#include <libdcp/raw_convert.h>
 extern "C" {
 #include <libavcodec/avcodec.h>
 #include <libavformat/avformat.h>
@@ -99,9 +99,9 @@ using std::streampos;
 using std::set_terminate;
 using boost::shared_ptr;
 using boost::thread;
-using boost::lexical_cast;
 using boost::optional;
 using libdcp::Size;
+using libdcp::raw_convert;
 
 static boost::thread::id ui_thread;
 static boost::filesystem::path backtrace_file;
@@ -729,14 +729,14 @@ int
 get_required_int (multimap<string, string> const & kv, string k)
 {
        string const v = get_required_string (kv, k);
-       return lexical_cast<int> (v);
+       return raw_convert<int> (v);
 }
 
 float
 get_required_float (multimap<string, string> const & kv, string k)
 {
        string const v = get_required_string (kv, k);
-       return lexical_cast<float> (v);
+       return raw_convert<float> (v);
 }
 
 string
@@ -766,7 +766,7 @@ get_optional_int (multimap<string, string> const & kv, string k)
                return 0;
        }
 
-       return lexical_cast<int> (i->second);
+       return raw_convert<int> (i->second);
 }
 
 /** Trip an assert if the caller is not in the UI thread */
@@ -852,25 +852,6 @@ FrameRateConversion::FrameRateConversion (float source, int dcp)
        }
 }
 
-LocaleGuard::LocaleGuard ()
-       : _old (0)
-{
-       char const * old = setlocale (LC_NUMERIC, 0);
-
-       if (old) {
-               _old = strdup (old);
-               if (strcmp (_old, "C")) {
-                       setlocale (LC_NUMERIC, "C");
-               }
-       }
-}
-
-LocaleGuard::~LocaleGuard ()
-{
-       setlocale (LC_NUMERIC, _old);
-       free (_old);
-}
-
 bool
 valid_image_file (boost::filesystem::path f)
 {
index 473c902395529ebaa8c3878ddbc67419717d7166..e85abf402d8ec1637570222a923c7708c6242601 100644 (file)
@@ -166,16 +166,6 @@ private:
 
 extern int64_t video_frames_to_audio_frames (VideoContent::Frame v, float audio_sample_rate, float frames_per_second);
 
-class LocaleGuard
-{
-public:
-       LocaleGuard ();
-       ~LocaleGuard ();
-       
-private:
-       char* _old;
-};
-
 class ScopedTemporary
 {
 public:
index b704b64477b1ceaef7208dafd5ae2e0b775fcd89..783cddafad958fcb5ee81cc3806bea3dc2dff8e8 100644 (file)
@@ -20,6 +20,7 @@
 #include <iomanip>
 #include <libcxml/cxml.h>
 #include <libdcp/colour_matrix.h>
+#include <libdcp/raw_convert.h>
 #include "video_content.h"
 #include "video_examiner.h"
 #include "compose.hpp"
@@ -45,9 +46,9 @@ using std::setprecision;
 using std::cout;
 using std::vector;
 using boost::shared_ptr;
-using boost::lexical_cast;
 using boost::optional;
 using boost::dynamic_pointer_cast;
+using libdcp::raw_convert;
 
 vector<VideoContentScale> VideoContentScale::_scales;
 
@@ -155,15 +156,15 @@ void
 VideoContent::as_xml (xmlpp::Node* node) const
 {
        boost::mutex::scoped_lock lm (_mutex);
-       node->add_child("VideoLength")->add_child_text (lexical_cast<string> (_video_length));
-       node->add_child("VideoWidth")->add_child_text (lexical_cast<string> (_video_size.width));
-       node->add_child("VideoHeight")->add_child_text (lexical_cast<string> (_video_size.height));
-       node->add_child("VideoFrameRate")->add_child_text (lexical_cast<string> (_video_frame_rate));
-       node->add_child("VideoFrameType")->add_child_text (lexical_cast<string> (static_cast<int> (_video_frame_type)));
-       node->add_child("LeftCrop")->add_child_text (boost::lexical_cast<string> (_crop.left));
-       node->add_child("RightCrop")->add_child_text (boost::lexical_cast<string> (_crop.right));
-       node->add_child("TopCrop")->add_child_text (boost::lexical_cast<string> (_crop.top));
-       node->add_child("BottomCrop")->add_child_text (boost::lexical_cast<string> (_crop.bottom));
+       node->add_child("VideoLength")->add_child_text (raw_convert<string> (_video_length));
+       node->add_child("VideoWidth")->add_child_text (raw_convert<string> (_video_size.width));
+       node->add_child("VideoHeight")->add_child_text (raw_convert<string> (_video_size.height));
+       node->add_child("VideoFrameRate")->add_child_text (raw_convert<string> (_video_frame_rate));
+       node->add_child("VideoFrameType")->add_child_text (raw_convert<string> (static_cast<int> (_video_frame_type)));
+       node->add_child("LeftCrop")->add_child_text (raw_convert<string> (_crop.left));
+       node->add_child("RightCrop")->add_child_text (raw_convert<string> (_crop.right));
+       node->add_child("TopCrop")->add_child_text (raw_convert<string> (_crop.top));
+       node->add_child("BottomCrop")->add_child_text (raw_convert<string> (_crop.bottom));
        _scale.as_xml (node->add_child("Scale"));
        _colour_conversion.as_xml (node->add_child("ColourConversion"));
 }
index 39bc0825b9c7245ad184190fa9e1fc7c1eb9fe37..c1f3e2067a150a3e4790468700103034a74d29f8 100644 (file)
@@ -58,8 +58,6 @@ public:
 
        void Draw (wxGrid& grid, wxGridCellAttr &, wxDC& dc, const wxRect& rect, int row, int col, bool)
        {
-               LocaleGuard lg;
-       
                dc.SetPen (*wxThePenList->FindOrCreatePen (wxColour (255, 255, 255), 1, wxPENSTYLE_SOLID));
                dc.SetBrush (*wxTheBrushList->FindOrCreateBrush (wxColour (255, 255, 255), wxBRUSHSTYLE_SOLID));
                dc.DrawRectangle (rect);
@@ -224,8 +222,6 @@ AudioMappingView::set (AudioMapping map)
 void
 AudioMappingView::update_cells ()
 {
-       LocaleGuard lg;
-       
        if (_grid->GetNumberRows ()) {
                _grid->DeleteRows (0, _grid->GetNumberRows ());
        }