-(mod) removed distinguishing between different archive input sources

-(mod) changed the name of library so that it doesn't get the name of liblibarchive...
-(add) added make install target
-(add) added library versioning
-(del) deleted file and memory container as they are obsolete
This commit is contained in:
Domen Vrankar 2014-06-17 22:53:29 +02:00
parent 8b95419844
commit 756cab1b15
8 changed files with 107 additions and 252 deletions

View File

@ -1,6 +1,32 @@
#BSD 2-Clause license
#
#Copyright (c) 2014, Domen Vrankar
#All rights reserved.
#
#Redistribution and use in source and binary forms, with or without modification,
#are permitted provided that the following conditions are met:
#
#1. Redistributions of source code must retain the above copyright notice, this
# list of conditions and the following disclaimer.
#
#2. Redistributions in binary form must reproduce the above copyright notice,
# this list of conditions and the following disclaimer in the documentation
# and/or other materials provided with the distribution.
#
#THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
#ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
#WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
#DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
#ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
#(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
#LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
#ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
#(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
#SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
cmake_minimum_required( VERSION 2.8.12 ) cmake_minimum_required( VERSION 2.8.12 )
project(libarchive_cpp_wrapper) project(archive_cpp_wrapper)
set(CMAKE_CXX_FLAGS "-Wall -std=c++11") set(CMAKE_CXX_FLAGS "-Wall -std=c++11")
@ -12,8 +38,6 @@ add_library( ${PROJECT_NAME} SHARED
archive_reader.cpp archive_reader.cpp
archive_reader_entry.cpp archive_reader_entry.cpp
archive_reader_iterator.cpp archive_reader_iterator.cpp
archive_reader_file_container.cpp
archive_reader_memory_container.cpp
archive_reader_entry_buffer.cpp archive_reader_entry_buffer.cpp
archive_exception.cpp archive_exception.cpp
@ -23,3 +47,28 @@ add_library( ${PROJECT_NAME} SHARED
) )
target_link_libraries( ${PROJECT_NAME} /usr/lib/x86_64-linux-gnu/libarchive.so.13 ) target_link_libraries( ${PROJECT_NAME} /usr/lib/x86_64-linux-gnu/libarchive.so.13 )
set_target_properties( ${PROJECT_NAME} PROPERTIES VERSION "0.0.1" SOVERSION "1" )
install(
TARGETS ${PROJECT_NAME} LIBRARY
DESTINATION lib
)
install(
FILES
archive_reader_entry_buffer.hpp
archive_reader.hpp
archive_writer_format.hpp
archive_exception.hpp
archive_writer_entry.hpp
archive_reader_iterator.hpp
archive_reader_format.hpp
archive_writer_filter.hpp
archive_reader_filter.hpp
archive_reader_entry.hpp
archive_writer.hpp
archive_reader.tpp
DESTINATION include
)

View File

@ -28,16 +28,14 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#include "archive_reader.hpp" #include "archive_reader.hpp"
#include "archive_reader_file_container.hpp"
#include "archive_reader_memory_container.hpp"
#include "archive_exception.hpp" #include "archive_exception.hpp"
#include <archive_entry.h> #include <archive_entry.h>
namespace ns_archive { namespace ns_archive {
reader::reader() : reader::reader(std::istream& stream, size_t block_size) :
_archive( archive_read_new(), [](archive* archive){ archive_read_free(archive); } ) // errors in destructor will be silently ignored _archive( archive_read_new(), [](archive* archive){ archive_read_free(archive); } ), // errors in destructor will be silently ignored
_reader_container( stream, block_size )
{ {
// //
} }
@ -119,22 +117,26 @@ READER_INIT_FILTER(LZOP, lzop)
READER_INIT_FILTER(GRZIP, gzip) READER_INIT_FILTER(GRZIP, gzip)
/// ---------------- init_data ---------------- // /// ---------------- init_data ---------------- //
template<> ssize_t reader_callback( archive* archive, void* in_reader_container, const void** buff )
void reader::init_data(ns_reader::file_container&& container)
{ {
if(archive_read_open_filename(_archive.get(), container.get_path().c_str(), container.get_block_size()) != ARCHIVE_OK) reader::reader_container* p_reader_container = reinterpret_cast<reader::reader_container*>( in_reader_container );
{
throw archive_exception( "Failed to open archive '" + container.get_path() + "'" ); p_reader_container->_stream.read( &p_reader_container->_buff[0], p_reader_container->_buff.size() );
} *buff = &p_reader_container->_buff[0];
return p_reader_container->_stream.gcount();
} }
template<> int close_callback( archive*, void* )
void reader::init_data(ns_reader::memory_container&& container)
{ {
std::vector<char> content = container.move_get_buffer(); return ARCHIVE_OK;
if(archive_read_open_memory(_archive.get(), content.data(), content.size()) != ARCHIVE_OK) }
void reader::init_data()
{ {
throw archive_exception( "Failed to open memory archive" ); if(archive_read_open( _archive.get(), &_reader_container, nullptr, reader_callback, close_callback ) != ARCHIVE_OK)
{
throw archive_exception( "Failed to read the archive!" );
} }
} }

View File

@ -31,6 +31,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#include <istream> #include <istream>
#include <memory> #include <memory>
#include <vector>
#include <archive.h> #include <archive.h>
#include "archive_reader_format.hpp" #include "archive_reader_format.hpp"
@ -48,11 +49,11 @@ public:
reader(const reader&) = delete; reader(const reader&) = delete;
reader& operator=(const reader&) = delete; reader& operator=(const reader&) = delete;
template<ns_reader::format FORMAT, ns_reader::filter FILTER, typename DATA_CONTAINER> template<ns_reader::format FORMAT>
static reader make_reader(DATA_CONTAINER&& container); static reader make_reader( std::istream& stream, size_t block_size );
template<ns_reader::format FORMAT, typename DATA_CONTAINER> template<ns_reader::format FORMAT, ns_reader::filter FILTER>
static reader make_reader(DATA_CONTAINER&& container); static reader make_reader( std::istream& stream, size_t block_size);
ns_reader::entry* get_next_entry(); ns_reader::entry* get_next_entry();
bool has_next_entry(); bool has_next_entry();
@ -61,7 +62,7 @@ public:
ns_reader::iterator end(); ns_reader::iterator end();
private: private:
reader(); reader( std::istream& stream, size_t block_size );
template<ns_reader::format FORMAT> template<ns_reader::format FORMAT>
void init_format(); void init_format();
@ -69,11 +70,26 @@ private:
template<ns_reader::filter FILTER> template<ns_reader::filter FILTER>
void init_filter(); void init_filter();
template<typename DATA_CONTAINER> void init_data();
void init_data(DATA_CONTAINER&& container);
std::shared_ptr<archive> _archive; std::shared_ptr<archive> _archive;
ns_reader::entry *_next_entry = nullptr; ns_reader::entry *_next_entry = nullptr;
class reader_container
{
public:
reader_container( std::istream& stream, size_t block_size ) :
_stream( stream )
{
_buff.resize( block_size );
}
public:
std::istream& _stream;
std::vector<char> _buff;
} _reader_container;
friend ssize_t reader_callback( archive* archive, void* in_reader_container, const void** buff );
friend int close_callback( archive*, void* );
}; };
} }

View File

@ -28,23 +28,23 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
namespace ns_archive { namespace ns_archive {
template<ns_reader::format FORMAT, ns_reader::filter FILTER, typename DATA_CONTAINER> template<ns_reader::format FORMAT>
reader reader::make_reader(DATA_CONTAINER&& container) reader reader::make_reader( std::istream& stream, size_t block_size )
{ {
reader a_reader; reader a_reader( stream, block_size );
a_reader.init_format<FORMAT>();
a_reader.init_data();
return a_reader;
}
template<ns_reader::format FORMAT, ns_reader::filter FILTER>
reader reader::make_reader( std::istream& stream, size_t block_size )
{
reader a_reader( stream, block_size );
a_reader.init_format<FORMAT>(); a_reader.init_format<FORMAT>();
a_reader.init_filter<FILTER>(); a_reader.init_filter<FILTER>();
a_reader.init_data(std::move(container)); a_reader.init_data();
return a_reader;
}
template<ns_reader::format FORMAT, typename DATA_CONTAINER>
reader reader::make_reader(DATA_CONTAINER&& container)
{
reader a_reader;
a_reader.init_format<FORMAT>();
a_reader.init_data(std::move(container));
return a_reader; return a_reader;
} }

View File

@ -1,52 +0,0 @@
/*
BSD 2-Clause license
Copyright (c) 2014, Domen Vrankar
All rights reserved.
Redistribution and use in source and binary forms, with or without modification,
are permitted provided that the following conditions are met:
1. Redistributions of source code must retain the above copyright notice, this
list of conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright notice,
this list of conditions and the following disclaimer in the documentation
and/or other materials provided with the distribution.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include "archive_reader_file_container.hpp"
namespace ns_archive {
namespace ns_reader {
file_container::file_container(const std::string& file_path, size_t block_size) :
_file_path(file_path),
_block_size(block_size)
{
//
}
const std::string& file_container::get_path() const
{
return _file_path;
}
size_t file_container::get_block_size() const
{
return _block_size;
}
}
}

View File

@ -1,53 +0,0 @@
/*
BSD 2-Clause license
Copyright (c) 2014, Domen Vrankar
All rights reserved.
Redistribution and use in source and binary forms, with or without modification,
are permitted provided that the following conditions are met:
1. Redistributions of source code must retain the above copyright notice, this
list of conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright notice,
this list of conditions and the following disclaimer in the documentation
and/or other materials provided with the distribution.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#ifndef ARCHIVE_READER_FILE_CONTAINER_HPP_INCLUDED
#define ARCHIVE_READER_FILE_CONTAINER_HPP_INCLUDED
#include <string>
namespace ns_archive {
namespace ns_reader {
class file_container
{
public:
file_container(const std::string& file_path, size_t block_size);
const std::string& get_path() const;
size_t get_block_size() const;
private:
std::string _file_path;
size_t _block_size;
};
}
}
#endif // ARCHIVE_READER_FILE_CONTAINER_HPP_INCLUDED

View File

@ -1,54 +0,0 @@
/*
BSD 2-Clause license
Copyright (c) 2014, Domen Vrankar
All rights reserved.
Redistribution and use in source and binary forms, with or without modification,
are permitted provided that the following conditions are met:
1. Redistributions of source code must retain the above copyright notice, this
list of conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright notice,
this list of conditions and the following disclaimer in the documentation
and/or other materials provided with the distribution.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include "archive_reader_memory_container.hpp"
#include <algorithm>
#include <iterator>
namespace ns_archive {
namespace ns_reader {
memory_container::memory_container(std::istream& input_stream)
{
std::copy(std::istream_iterator<char>(input_stream), std::istream_iterator<char>(), std::back_inserter(_buffer));
}
memory_container::memory_container(std::vector<char>&& buffer) :
_buffer(std::forward<std::vector<char>>(buffer))
{
//
}
std::vector<char>&& memory_container::move_get_buffer()
{
return std::move(_buffer);
}
}
}

View File

@ -1,53 +0,0 @@
/*
BSD 2-Clause license
Copyright (c) 2014, Domen Vrankar
All rights reserved.
Redistribution and use in source and binary forms, with or without modification,
are permitted provided that the following conditions are met:
1. Redistributions of source code must retain the above copyright notice, this
list of conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright notice,
this list of conditions and the following disclaimer in the documentation
and/or other materials provided with the distribution.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#ifndef ARCHIVE_READER_MEMORY_CONTAINER_HPP_INCLUDED
#define ARCHIVE_READER_MEMORY_CONTAINER_HPP_INCLUDED
#include <vector>
#include <istream>
namespace ns_archive {
namespace ns_reader {
class memory_container
{
public:
memory_container(std::istream& input_stream);
memory_container(std::vector<char>&& buffer);
std::vector<char>&& move_get_buffer();
private:
std::vector<char> _buffer;
};
}
}
#endif // ARCHIVE_READER_MEMORY_CONTAINER_HPP_INCLUDED