[DEV] better provider API

This commit is contained in:
Edouard DUPIN 2018-09-17 21:34:08 +02:00
parent 9b318f4cac
commit fa0828fc30
10 changed files with 52 additions and 44 deletions

View File

@ -192,9 +192,9 @@ namespace etest {
} \
ETEST_DEBUG(" [ SUB-DONE ]"); \
} catch ( etk::Exception e ) { \
testCatchThrow(e, __LINE__); \
etest::g_currentTest->testCatchThrow(e, __LINE__); \
} catch ( ... ) {\
testCatchThrow(__LINE__); \
etest::g_currentTest->testCatchThrow(__LINE__); \
} \
} while (false)
@ -218,9 +218,9 @@ namespace etest {
} \
ETEST_DEBUG(" [ SUB-DONE ]"); \
} catch ( etk::Exception e ) { \
testCatchThrow(e, __LINE__); \
etest::g_currentTest->testCatchThrow(e, __LINE__); \
} catch ( ... ) {\
testCatchThrow(__LINE__); \
etest::g_currentTest->testCatchThrow(__LINE__); \
} \
} while (false)
@ -247,9 +247,9 @@ namespace etest {
return; \
} \
} catch ( etk::Exception e ) { \
testCatchThrow(e, __LINE__); \
etest::g_currentTest->testCatchThrow(e, __LINE__); \
} catch ( ... ) {\
testCatchThrow(__LINE__); \
etest::g_currentTest->testCatchThrow(__LINE__); \
} \
} while (false)
@ -277,9 +277,9 @@ namespace etest {
} \
ETEST_DEBUG(" [ SUB-DONE ]"); \
} catch ( etk::Exception e ) { \
testCatchThrow(e, __LINE__); \
etest::g_currentTest->testCatchThrow(e, __LINE__); \
} catch ( ... ) {\
testCatchThrow(__LINE__); \
etest::g_currentTest->testCatchThrow(__LINE__); \
} \
} while (false)
@ -318,9 +318,9 @@ namespace etest {
} \
ETEST_DEBUG(" [ SUB-DONE ]"); \
} catch ( etk::Exception e ) { \
testCatchThrow(e, __LINE__); \
etest::g_currentTest->testCatchThrow(e, __LINE__); \
} catch ( ... ) {\
testCatchThrow(__LINE__); \
etest::g_currentTest->testCatchThrow(__LINE__); \
} \
} while (false)

View File

@ -46,7 +46,7 @@ bool etk::io::File::open(etk::io::OpenMode _mode) {
break;
}
if(m_pointer == null) {
TK_WARNING("Can not open the file " << m_path.getNative() << " mode: " << _mode << " errno" << errno << " (" << strerror(errno) << ")");
TK_WARNING("Can not open the file '" << m_path.getNative() << "' mode: " << _mode << " errno" << errno << " (" << strerror(errno) << ")");
return false;
}
return true;

View File

@ -136,9 +136,10 @@ namespace etk {
/**
* @brief Write all the vector in a file
* @param[in] _value String data to write in the File
* @return true the file is fully correcty write
*/
void fileWriteAll(const etk::String& _value) {
write(static_cast<const void*>(&(_value[0])), sizeof(char), _value.size()/sizeof(char));
bool fileWriteAll(const etk::String& _value) {
return int64_t(_value.size()) == write(static_cast<const void*>(&(_value[0])), sizeof(char), _value.size()/sizeof(char));
}
};
}

View File

@ -25,6 +25,8 @@ namespace etk {
virtual ememory::SharedPtr<etk::io::Interface> create(const etk::Uri& _uri) = 0;
virtual bool exist(const etk::Uri& _uri) = 0;
virtual etk::Vector<etk::Uri> list(const etk::Uri& _uri) = 0;
virtual bool canMove() { return false; }
virtual bool move(const etk::Uri& _uriSource, const etk::Uri& _uriDestination) { return false; }
};
}
}

View File

@ -53,3 +53,11 @@ etk::Vector<etk::Uri> etk::uri::provider::ProviderFile::list(const etk::Uri& _ur
}
return out;
}
bool etk::uri::provider::ProviderFile::canMove() {
return true;
}
bool etk::uri::provider::ProviderFile::move(const etk::Uri& _uriSource, const etk::Uri& _uriDestination) {
return etk::path::move(_uriSource.getPath(), _uriDestination.getPath());
}

View File

@ -21,6 +21,8 @@ namespace etk {
ememory::SharedPtr<etk::io::Interface> create(const etk::Uri& _uri) override;
bool exist(const etk::Uri& _uri) override;
etk::Vector<etk::Uri> list(const etk::Uri& _uri) override;
virtual bool canMove() override;
virtual bool move(const etk::Uri& _uriSource, const etk::Uri& _uriDestination) override;
};
}
}

View File

@ -7,10 +7,18 @@
#include <etk/uri/provider/ProviderFile.hpp>
#include <etk/Map.hpp>
#include <etk/io/File.hpp>
#include <etk/debug.hpp>
static etk::Map<etk::String, ememory::SharedPtr<etk::uri::provider::Interface>>& getProviders() {
static etk::Map<etk::String, ememory::SharedPtr<etk::uri::provider::Interface>> g_data;
return g_data;
namespace etk {
namespace uri {
namespace provider {
etk::Map<etk::String, ememory::SharedPtr<etk::uri::provider::Interface>>& getProviders();
etk::Map<etk::String, ememory::SharedPtr<etk::uri::provider::Interface>>& getProviders() {
static etk::Map<etk::String, ememory::SharedPtr<etk::uri::provider::Interface>> g_data;
return g_data;
}
}
}
}
void etk::uri::provider::add(const etk::String& _scheme, ememory::SharedPtr<etk::uri::provider::Interface> _interface) {
@ -18,16 +26,16 @@ void etk::uri::provider::add(const etk::String& _scheme, ememory::SharedPtr<etk:
if (scheme.empty() == true) {
scheme = "RAW";
}
getProviders().set(scheme, _interface);
etk::uri::provider::getProviders().set(scheme, _interface);
}
void etk::uri::provider::clear() {
getProviders().clear();
etk::uri::provider::getProviders().clear();
etk::uri::provider::add("", ememory::makeShared<etk::uri::provider::ProviderFile>());
}
void etk::uri::provider::remove(const etk::String& _scheme) {
getProviders().erase(_scheme);
etk::uri::provider::getProviders().erase(_scheme);
}
bool etk::uri::provider::exist(const etk::String& _scheme) {
@ -35,28 +43,18 @@ bool etk::uri::provider::exist(const etk::String& _scheme) {
if (scheme.empty() == true) {
scheme = "RAW";
}
return getProviders().exist(scheme);
return etk::uri::provider::getProviders().exist(scheme);
}
ememory::SharedPtr<etk::io::Interface> etk::uri::provider::get(const etk::Uri& _uri) {
etk::String scheme = _uri.getScheme();
if (scheme.empty() == true) {
scheme = "RAW";
}
if (getProviders().exist(scheme) == false) {
return null;
}
return getProviders()[scheme]->create(_uri);
}
ememory::SharedPtr<etk::uri::provider::Interface> etk::uri::provider::getProvider(const etk::String& _scheme) {
etk::String scheme = _scheme;
if (scheme.empty() == true) {
scheme = "RAW";
}
if (getProviders().exist(scheme) == false) {
if (etk::uri::provider::getProviders().exist(scheme) == false) {
return null;
}
return getProviders()[scheme];
return etk::uri::provider::getProviders()[scheme];
}
void etk::uri::provider::init() {
@ -64,5 +62,6 @@ void etk::uri::provider::init() {
}
void etk::uri::provider::unInit() {
getProviders().clear();
etk::uri::provider::getProviders().clear();
}

View File

@ -40,12 +40,6 @@ namespace etk {
* @brief Clear all providers
*/
void clear();
/**
* @brief Get an IO interface with a specific URI
* @param[in] _uri Data interface requested
* @return The interface requested.
*/
ememory::SharedPtr<etk::io::Interface> get(const etk::Uri& _uri);
/**
* @brief Get an URI provider
* @param[in] _scheme type of provider

View File

@ -55,6 +55,7 @@ def configure(target, my_module):
'etk/archive/Archive.cpp',
'etk/archive/Zip.cpp',
'etk/uri/Uri.cpp',
'etk/uri/uri.cpp',
'etk/uri/Query.cpp',
'etk/uri/provider/provider.cpp',
'etk/uri/provider/ProviderFile.cpp',
@ -92,6 +93,7 @@ def configure(target, my_module):
'etk/TreeNode.hpp',
'etk/FlatTree.hpp',
'etk/uri/Uri.hpp',
'etk/uri/uri.hpp',
'etk/uri/Query.hpp',
'etk/uri/provider/provider.hpp',
'etk/uri/provider/Interface.hpp',

View File

@ -8,7 +8,7 @@
#include <etest/etest.hpp>
#include <test-debug/debug.hpp>
#include <etk/uri/Uri.hpp>
#include <etk/uri/uri.hpp>
#include <etk/uri/provider/provider.hpp>
#include <etk/uri/provider/ProviderFile.hpp>
#include <etk/uri/provider/ProviderFileZip.hpp>
@ -72,9 +72,9 @@ TEST(TestUriProvider, checkPlouf) {
EXPECT_EQ(etk::uri::provider::exist("PLOUF_1"), true);
EXPECT_EQ(etk::uri::provider::exist("PLOUF_2"), true);
EXPECT_EQ(s_plouf, 0);
etk::uri::provider::get("PLOUF_1:///qsdfqsdfqsdfqsdf.txt");
etk::uri::get("PLOUF_1:///qsdfqsdfqsdfqsdf.txt");
EXPECT_EQ(s_plouf, 5555);
etk::uri::provider::get("PLOUF_2:///qsdfqsdfqsdfqsdf.txt");
etk::uri::get("PLOUF_2:///qsdfqsdfqsdfqsdf.txt");
EXPECT_EQ(s_plouf, 9999);
etk::uri::provider::remove("PLOUF_1");
EXPECT_EQ(etk::uri::provider::exist(""), true);
@ -176,7 +176,7 @@ TEST(TestUriProvider, directReadFile) {
etk::uri::provider::add("DATA", ememory::makeShared<etk::uri::provider::ProviderFile>(etk::path::getDataPath()));
EXPECT_EQ(etk::uri::provider::exist("DATA"), true);
etk::Uri element("DATA:///data/dir_B/file_B_1.txt");
ememory::SharedPtr<etk::io::Interface> ioElement = etk::uri::provider::get(element);
ememory::SharedPtr<etk::io::Interface> ioElement = etk::uri::get(element);
EXPECT_EQ(ioElement->open(etk::io::OpenMode::Read), true);
etk::String data = ioElement->readAllString();
EXPECT_EQ(ioElement->close(), true);
@ -257,7 +257,7 @@ TEST(TestUriProvider, zipReadFile) {
etk::uri::provider::add("DATA", ememory::makeShared<etk::uri::provider::ProviderFileZip>(etk::path::getDataPath() / "data_sample.zip", "data"));
EXPECT_EQ(etk::uri::provider::exist("DATA"), true);
etk::Uri element("DATA:///dir_B/file_B_1.txt");
ememory::SharedPtr<etk::io::Interface> ioElement = etk::uri::provider::get(element);
ememory::SharedPtr<etk::io::Interface> ioElement = etk::uri::get(element);
EXPECT_EQ(ioElement->open(etk::io::OpenMode::Read), true);
etk::String data = ioElement->readAllString();
EXPECT_EQ(ioElement->close(), true);