summaryrefslogtreecommitdiff
path: root/src/lib
diff options
context:
space:
mode:
authorCarl Hetherington <cth@carlh.net>2020-05-03 22:28:09 +0200
committerCarl Hetherington <cth@carlh.net>2020-05-03 22:28:09 +0200
commit4ead1f24f97edde9b6a77e47947cb188a551b49b (patch)
tree8cf096450678065ccf4dee1e961c398f4fa15b8a /src/lib
parentcc09cc4b12d199d490217d7b60ed0af69afb90de (diff)
Add Zipper class and use it in CinemaKDMs.
Diffstat (limited to 'src/lib')
-rw-r--r--src/lib/cinema_kdms.cc29
-rw-r--r--src/lib/wscript1
-rw-r--r--src/lib/zipper.cc78
-rw-r--r--src/lib/zipper.h39
4 files changed, 122 insertions, 25 deletions
diff --git a/src/lib/cinema_kdms.cc b/src/lib/cinema_kdms.cc
index 32879cf6b..3af1e0d84 100644
--- a/src/lib/cinema_kdms.cc
+++ b/src/lib/cinema_kdms.cc
@@ -27,8 +27,8 @@
#include "emailer.h"
#include "compose.hpp"
#include "log.h"
+#include "zipper.h"
#include "dcpomatic_log.h"
-#include <zip.h>
#include <boost/foreach.hpp>
#include "i18n.h"
@@ -43,39 +43,18 @@ using boost::function;
void
CinemaKDMs::make_zip_file (boost::filesystem::path zip_file, dcp::NameFormat name_format, dcp::NameFormat::Map name_values) const
{
- int error;
- struct zip* zip = zip_open (zip_file.string().c_str(), ZIP_CREATE | ZIP_EXCL, &error);
- if (!zip) {
- if (error == ZIP_ER_EXISTS) {
- throw FileError ("ZIP file already exists", zip_file);
- }
- throw FileError ("could not create ZIP file", zip_file);
- }
-
- list<shared_ptr<string> > kdm_strings;
+ Zipper zipper (zip_file);
name_values['c'] = cinema->name;
BOOST_FOREACH (shared_ptr<ScreenKDM> i, screen_kdms) {
- shared_ptr<string> kdm (new string(i->kdm_as_xml()));
- kdm_strings.push_back (kdm);
-
- struct zip_source* source = zip_source_buffer (zip, kdm->c_str(), kdm->length(), 0);
- if (!source) {
- throw runtime_error ("could not create ZIP source");
- }
-
name_values['s'] = i->screen->name;
name_values['i'] = i->kdm_id ();
string const name = careful_string_filter(name_format.get(name_values, ".xml"));
- if (zip_add (zip, name.c_str(), source) == -1) {
- throw runtime_error ("failed to add KDM to ZIP archive");
- }
+ zipper.add (name, i->kdm_as_xml());
}
- if (zip_close (zip) == -1) {
- throw runtime_error ("failed to close ZIP archive");
- }
+ zipper.close ();
}
/** Collect a list of ScreenKDMs into a list of CinemaKDMs so that each
diff --git a/src/lib/wscript b/src/lib/wscript
index 1eac718e3..ea52079d0 100644
--- a/src/lib/wscript
+++ b/src/lib/wscript
@@ -183,6 +183,7 @@ sources = """
video_mxf_examiner.cc
video_ring_buffers.cc
writer.cc
+ zipper.cc
"""
def build(bld):
diff --git a/src/lib/zipper.cc b/src/lib/zipper.cc
new file mode 100644
index 000000000..d43b18ef0
--- /dev/null
+++ b/src/lib/zipper.cc
@@ -0,0 +1,78 @@
+/*
+ Copyright (C) 2020 Carl Hetherington <cth@carlh.net>
+
+ This file is part of DCP-o-matic.
+
+ DCP-o-matic is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ DCP-o-matic is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with DCP-o-matic. If not, see <http://www.gnu.org/licenses/>.
+
+*/
+
+#include "zipper.h"
+#include "exceptions.h"
+#include "dcpomatic_assert.h"
+#include <zip.h>
+#include <boost/filesystem.hpp>
+#include <stdexcept>
+
+using std::string;
+using std::runtime_error;
+using boost::shared_ptr;
+
+
+Zipper::Zipper (boost::filesystem::path file)
+{
+ int error;
+ _zip = zip_open (file.string().c_str(), ZIP_CREATE | ZIP_EXCL, &error);
+ if (!_zip) {
+ if (error == ZIP_ER_EXISTS) {
+ throw FileError ("ZIP file already exists", file);
+ }
+ throw FileError ("could not create ZIP file", file);
+ }
+}
+
+
+void
+Zipper::add (string name, string content)
+{
+ shared_ptr<string> copy(new string(content));
+ _store.push_back (copy);
+
+ struct zip_source* source = zip_source_buffer (_zip, copy->c_str(), copy->length(), 0);
+ if (!source) {
+ throw runtime_error ("could not create ZIP source");
+ }
+
+ if (zip_add(_zip, name.c_str(), source) == -1) {
+ throw runtime_error ("failed to add data to ZIP archive");
+ }
+}
+
+
+void
+Zipper::close ()
+{
+ if (zip_close(_zip) == -1) {
+ throw runtime_error ("failed to close ZIP archive");
+ }
+ _zip = 0;
+}
+
+
+Zipper::~Zipper ()
+{
+ if (_zip) {
+ zip_close(_zip);
+ }
+}
diff --git a/src/lib/zipper.h b/src/lib/zipper.h
new file mode 100644
index 000000000..a981a22b7
--- /dev/null
+++ b/src/lib/zipper.h
@@ -0,0 +1,39 @@
+/*
+ Copyright (C) 2020 Carl Hetherington <cth@carlh.net>
+
+ This file is part of DCP-o-matic.
+
+ DCP-o-matic is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ DCP-o-matic is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with DCP-o-matic. If not, see <http://www.gnu.org/licenses/>.
+
+*/
+
+#include <boost/noncopyable.hpp>
+#include <boost/filesystem.hpp>
+#include <boost/shared_ptr.hpp>
+#include <vector>
+
+class Zipper : public boost::noncopyable
+{
+public:
+ Zipper (boost::filesystem::path file);
+ ~Zipper ();
+
+ void add (std::string name, std::string content);
+ void close ();
+
+private:
+ struct zip* _zip;
+ std::vector<boost::shared_ptr<std::string> > _store;
+};
+