[vlmc-devel] [PATCH] Added libcloudstorage based filesystem.
yikei lu
luyikei.qmltu at gmail.com
Tue Aug 9 18:11:45 CEST 2016
Hi !
Sorry I don't really understand what this patch will do if applied.
Could you explain it clearly?
Regards,
2016-08-09 11:06 GMT-05:00 Paweł Wegner <pawel.wegner95 at gmail.com>:
> ---
> Makefile.am | 17 +++++++
> configure.ac | 6 +++
> src/factory/CloudProvider.cpp | 63 +++++++++++++++++++++++
> src/factory/CloudProvider.h | 54 ++++++++++++++++++++
> src/filesystem/cloudprovider/Device.cpp | 82 ++++++++++++++++++++++++++++++
> src/filesystem/cloudprovider/Device.h | 50 ++++++++++++++++++
> src/filesystem/cloudprovider/Directory.cpp | 79 ++++++++++++++++++++++++++++
> src/filesystem/cloudprovider/Directory.h | 53 +++++++++++++++++++
> src/filesystem/cloudprovider/File.cpp | 40 +++++++++++++++
> src/filesystem/cloudprovider/File.h | 43 ++++++++++++++++
> 10 files changed, 487 insertions(+)
> create mode 100644 src/factory/CloudProvider.cpp
> create mode 100644 src/factory/CloudProvider.h
> create mode 100644 src/filesystem/cloudprovider/Device.cpp
> create mode 100644 src/filesystem/cloudprovider/Device.h
> create mode 100644 src/filesystem/cloudprovider/Directory.cpp
> create mode 100644 src/filesystem/cloudprovider/Directory.h
> create mode 100644 src/filesystem/cloudprovider/File.cpp
> create mode 100644 src/filesystem/cloudprovider/File.h
>
> diff --git a/Makefile.am b/Makefile.am
> index 064be20..eb4ec03 100644
> --- a/Makefile.am
> +++ b/Makefile.am
> @@ -194,6 +194,23 @@ libmedialibrary_la_LIBADD += $(LIBJPEG_LIBS)
> endif
> endif
>
> +if HAVE_LIBCLOUDSTORAGE
> +libmedialibrary_la_SOURCES += \
> + src/factory/CloudProvider.cpp \
> + src/filesystem/cloudprovider/Directory.cpp \
> + src/filesystem/cloudprovider/Device.cpp \
> + src/filesystem/cloudprovider/File.cpp \
> + $(NULL)
> +noinst_HEADERS += \
> + src/factory/CloudProvider.h \
> + src/filesystem/cloudprovider/Directory.h \
> + src/filesystem/cloudprovider/Device.h \
> + src/filesystem/cloudprovider/File.h \
> + $(NULL)
> +libmedialibrary_la_CPPFLAGS += $(LIBCLOUDSTORAGE_CFLAGS)
> +libmedialibrary_la_LIBADD += $(LIBCLOUDSTORAGE_LIBS)
> +endif
> +
> lib_LTLIBRARIES = libmedialibrary.la
> if HAVE_DARWIN
> lib_LTLIBRARIES += libmedialibrary_macos.la
> diff --git a/configure.ac b/configure.ac
> index 5ebba8a..6efb72b 100644
> --- a/configure.ac
> +++ b/configure.ac
> @@ -269,6 +269,12 @@ PKG_CHECK_MODULES(EVAS, evas, [
> ], [have_evas="no"])
> AM_CONDITIONAL([HAVE_EVAS], [test "${have_evas}" = "yes"])
>
> +PKG_CHECK_MODULES(LIBCLOUDSTORAGE, libcloudstorage, [
> + have_libcloudstorage="yes"
> + AC_DEFINE([HAVE_LIBCLOUDSTORAGE], 1, [Define to 1 if libcloudstorage is available])
> + ])
> +AM_CONDITIONAL([HAVE_LIBCLOUDSTORAGE], [test "${have_libcloudstorage}" = "yes"])
> +
> AC_ARG_ENABLE(tests,AC_HELP_STRING([--disable-tests], [Disable build of automated tests suites]))
> AM_CONDITIONAL([HAVE_TESTS], [test "${enable_tests}" = "yes"])
> AS_IF([test "${enable_tests}" = "yes"], [
> diff --git a/src/factory/CloudProvider.cpp b/src/factory/CloudProvider.cpp
> new file mode 100644
> index 0000000..081c535
> --- /dev/null
> +++ b/src/factory/CloudProvider.cpp
> @@ -0,0 +1,63 @@
> +/*****************************************************************************
> + * Media Library
> + *****************************************************************************
> + * Copyright (C) 2016 Paweł Wegner
> + *
> + * Authors: Paweł Wegner<pawel.wegner95 at gmail.com>
> + *
> + * This program is free software; you can redistribute it and/or modify it
> + * under the terms of the GNU Lesser General Public License as published by
> + * the Free Software Foundation; either version 2.1 of the License, or
> + * (at your option) any later version.
> + *
> + * This program 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 Lesser General Public License for more details.
> + *
> + * You should have received a copy of the GNU Lesser General Public License
> + * along with this program; if not, write to the Free Software Foundation,
> + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
> + *****************************************************************************/
> +
> +#include "CloudProvider.h"
> +
> +#include <ICloudStorage.h>
> +
> +#include "filesystem/cloudprovider/Device.h"
> +#include "filesystem/cloudprovider/Directory.h"
> +#include "logging/Logger.h"
> +
> +namespace medialibrary {
> +
> +namespace factory {
> +
> +CloudProvider::CloudProvider( cloudstorage::ICloudProvider::Pointer provider )
> + : m_device( std::make_shared<cp::Device>( provider ) ) {
> +}
> +
> +std::shared_ptr<fs::IDirectory> CloudProvider::createDirectory(
> + const std::string& path ) {
> + std::lock_guard<std::mutex> lock( m_mutex );
> + const auto it = m_directories.find( path );
> + if ( it != end( m_directories ) ) return it->second;
> + try {
> + auto dir = std::make_shared<cp::Directory>( m_device, nullptr, path );
> + m_directories[path] = dir;
> + return dir;
> + } catch ( const std::exception& ex ) {
> + LOG_ERROR( "Failed to create cp::IDirectory for ", path, ": ", ex.what() );
> + return nullptr;
> + }
> +}
> +
> +std::shared_ptr<fs::IDevice> CloudProvider::createDevice( const std::string& ) {
> + return m_device;
> +}
> +
> +void CloudProvider::refresh() {
> + std::lock_guard<std::mutex> lock( m_mutex );
> + m_directories.clear();
> +}
> +}
> +}
> diff --git a/src/factory/CloudProvider.h b/src/factory/CloudProvider.h
> new file mode 100644
> index 0000000..0b281fb
> --- /dev/null
> +++ b/src/factory/CloudProvider.h
> @@ -0,0 +1,54 @@
> +/*****************************************************************************
> + * Media Library
> + *****************************************************************************
> + * Copyright (C) 2016 Paweł Wegner
> + *
> + * Authors: Paweł Wegner<pawel.wegner95 at gmail.com>
> + *
> + * This program is free software; you can redistribute it and/or modify it
> + * under the terms of the GNU Lesser General Public License as published by
> + * the Free Software Foundation; either version 2.1 of the License, or
> + * (at your option) any later version.
> + *
> + * This program 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 Lesser General Public License for more details.
> + *
> + * You should have received a copy of the GNU Lesser General Public License
> + * along with this program; if not, write to the Free Software Foundation,
> + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
> + *****************************************************************************/
> +
> +#pragma once
> +
> +#include "factory/IFileSystem.h"
> +#include "filesystem/cloudprovider/Device.h"
> +
> +#include <ICloudProvider.h>
> +#include <mutex>
> +#include <unordered_map>
> +
> +namespace medialibrary {
> +
> +namespace factory {
> +
> +class CloudProvider : public IFileSystem {
> +public:
> + CloudProvider( cloudstorage::ICloudProvider::Pointer provider );
> +
> + std::shared_ptr<fs::IDirectory> createDirectory(
> + const std::string& path ) override;
> +
> + std::shared_ptr<fs::IDevice> createDevice( const std::string& uuid ) override;
> +
> + void refresh() override;
> +
> +private:
> + std::mutex m_mutex;
> + std::unordered_map<std::string, std::shared_ptr<fs::IDirectory>>
> + m_directories;
> + std::shared_ptr<cp::Device> m_device;
> +};
> +}
> +}
> diff --git a/src/filesystem/cloudprovider/Device.cpp b/src/filesystem/cloudprovider/Device.cpp
> new file mode 100644
> index 0000000..54e9eb9
> --- /dev/null
> +++ b/src/filesystem/cloudprovider/Device.cpp
> @@ -0,0 +1,82 @@
> +/*****************************************************************************
> + * Media Library
> + *****************************************************************************
> + * Copyright (C) 2016 Paweł Wegner
> + *
> + * Authors: Paweł Wegner<pawel.wegner95 at gmail.com>
> + *
> + * This program is free software; you can redistribute it and/or modify it
> + * under the terms of the GNU Lesser General Public License as published by
> + * the Free Software Foundation; either version 2.1 of the License, or
> + * (at your option) any later version.
> + *
> + * This program 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 Lesser General Public License for more details.
> + *
> + * You should have received a copy of the GNU Lesser General Public License
> + * along with this program; if not, write to the Free Software Foundation,
> + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
> + *****************************************************************************/
> +
> +#include "Device.h"
> +
> +#include "logging/Logger.h"
> +
> +namespace medialibrary {
> +
> +namespace cp {
> +
> +namespace {
> +class AuthorizationCallback : public cloudstorage::ICloudProvider::ICallback {
> +public:
> + Status userConsentRequired( const cloudstorage::ICloudProvider& p ) override {
> + LOG_INFO( "User consent required at " + p.authorizeLibraryUrl() );
> + return Status::WaitForAuthorizationCode;
> + }
> +
> + void accepted( const cloudstorage::ICloudProvider& ) override {}
> +
> + void declined( const cloudstorage::ICloudProvider& ) override {}
> +
> + void error( const cloudstorage::ICloudProvider&,
> + const std::string& description ) override {
> + LOG_ERROR( description );
> + }
> +};
> +}
> +
> +Device::Device( cloudstorage::ICloudProvider::Pointer provider )
> + : m_cloudprovider( provider ),
> + m_uuid( "cloudprovider-" + provider->name() ),
> + m_mountpoint( provider->endpoint() ) {
> + // TODO reuse refresh token
> + // TODO provide ICryptoPP implementation
> + // TODO provide IHttp implementation
> + provider->initialize(
> + {"", std::make_shared<AuthorizationCallback>(), nullptr, nullptr, {}} );
> +}
> +
> +const std::string& Device::uuid() const {
> + return m_uuid;
> +}
> +
> +bool Device::isRemovable() const {
> + return true;
> +}
> +
> +bool Device::isPresent() const {
> + // TODO check if connected to the internet
> + return true;
> +}
> +
> +const std::string& Device::mountpoint() const {
> + return m_mountpoint;
> +}
> +
> +cloudstorage::ICloudProvider::Pointer Device::provider() const {
> + return m_cloudprovider;
> +}
> +}
> +}
> diff --git a/src/filesystem/cloudprovider/Device.h b/src/filesystem/cloudprovider/Device.h
> new file mode 100644
> index 0000000..32defd3
> --- /dev/null
> +++ b/src/filesystem/cloudprovider/Device.h
> @@ -0,0 +1,50 @@
> +/*****************************************************************************
> + * Media Library
> + *****************************************************************************
> + * Copyright (C) 2016 Paweł Wegner
> + *
> + * Authors: Paweł Wegner<pawel.wegner95 at gmail.com>
> + *
> + * This program is free software; you can redistribute it and/or modify it
> + * under the terms of the GNU Lesser General Public License as published by
> + * the Free Software Foundation; either version 2.1 of the License, or
> + * (at your option) any later version.
> + *
> + * This program 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 Lesser General Public License for more details.
> + *
> + * You should have received a copy of the GNU Lesser General Public License
> + * along with this program; if not, write to the Free Software Foundation,
> + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
> + *****************************************************************************/
> +
> +#pragma once
> +
> +#include <ICloudProvider.h>
> +
> +#include "filesystem/IDevice.h"
> +
> +namespace medialibrary {
> +
> +namespace cp {
> +
> +class Device : public fs::IDevice {
> +public:
> + Device( cloudstorage::ICloudProvider::Pointer );
> +
> + const std::string& uuid() const override;
> + bool isRemovable() const override;
> + bool isPresent() const override;
> + const std::string& mountpoint() const override;
> +
> + cloudstorage::ICloudProvider::Pointer provider() const;
> +
> +private:
> + cloudstorage::ICloudProvider::Pointer m_cloudprovider;
> + std::string m_uuid;
> + std::string m_mountpoint;
> +};
> +}
> +}
> diff --git a/src/filesystem/cloudprovider/Directory.cpp b/src/filesystem/cloudprovider/Directory.cpp
> new file mode 100644
> index 0000000..fadf19f
> --- /dev/null
> +++ b/src/filesystem/cloudprovider/Directory.cpp
> @@ -0,0 +1,79 @@
> +/*****************************************************************************
> + * Media Library
> + *****************************************************************************
> + * Copyright (C) 2016 Paweł Wegner
> + *
> + * Authors: Paweł Wegner<pawel.wegner95 at gmail.com>
> + *
> + * This program is free software; you can redistribute it and/or modify it
> + * under the terms of the GNU Lesser General Public License as published by
> + * the Free Software Foundation; either version 2.1 of the License, or
> + * (at your option) any later version.
> + *
> + * This program 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 Lesser General Public License for more details.
> + *
> + * You should have received a copy of the GNU Lesser General Public License
> + * along with this program; if not, write to the Free Software Foundation,
> + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
> + *****************************************************************************/
> +
> +#include "Directory.h"
> +
> +#include "filesystem/cloudprovider/File.h"
> +
> +namespace medialibrary {
> +
> +namespace cp {
> +
> +Directory::Directory( std::shared_ptr<Device> device,
> + cloudstorage::IItem::Pointer item, const std::string& path )
> + : m_device( device ), m_path( path ), m_item( item ) {}
> +
> +const std::string& Directory::path() const {
> + return m_path;
> +}
> +
> +const std::vector<std::shared_ptr<fs::IFile>>& Directory::files() const {
> + if ( m_files.size() == 0 && m_directories.size() == 0 ) read();
> + return m_files;
> +}
> +
> +const std::vector<std::shared_ptr<fs::IDirectory>>& Directory::dirs() const {
> + if ( m_files.size() == 0 && m_directories.size() == 0 ) read();
> + return m_directories;
> +}
> +
> +std::shared_ptr<fs::IDevice> Directory::device() const {
> + return m_device;
> +}
> +
> +void Directory::read() const {
> + if ( !m_item ) {
> + m_item = m_device->provider()
> + ->getItemAsync( path(), []( cloudstorage::IItem::Pointer ) {} )
> + ->result();
> + }
> + auto t =
> + m_device->provider()
> + ->listDirectoryAsync(
> + m_item, []( const std::vector<cloudstorage::IItem::Pointer>& ) {} )
> + ->result();
> + for ( auto item : t ) {
> + if ( item->type() == cloudstorage::IItem::FileType::Directory ) {
> + m_directories.emplace_back( std::make_shared<Directory>(
> + m_device, item, path() + "/" + item->filename() ) );
> + } else {
> + auto i = m_device->provider()
> + ->getItemDataAsync( item->id(),
> + []( cloudstorage::IItem::Pointer ) {} )
> + ->result();
> + m_files.emplace_back(
> + std::make_shared<File>( i->url(), path() + "/" + item->filename() ) );
> + }
> + }
> +}
> +}
> +}
> diff --git a/src/filesystem/cloudprovider/Directory.h b/src/filesystem/cloudprovider/Directory.h
> new file mode 100644
> index 0000000..6a9615e
> --- /dev/null
> +++ b/src/filesystem/cloudprovider/Directory.h
> @@ -0,0 +1,53 @@
> +/*****************************************************************************
> + * Media Library
> + *****************************************************************************
> + * Copyright (C) 2016 Paweł Wegner
> + *
> + * Authors: Paweł Wegner<pawel.wegner95 at gmail.com>
> + *
> + * This program is free software; you can redistribute it and/or modify it
> + * under the terms of the GNU Lesser General Public License as published by
> + * the Free Software Foundation; either version 2.1 of the License, or
> + * (at your option) any later version.
> + *
> + * This program 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 Lesser General Public License for more details.
> + *
> + * You should have received a copy of the GNU Lesser General Public License
> + * along with this program; if not, write to the Free Software Foundation,
> + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
> + *****************************************************************************/
> +
> +#pragma once
> +
> +#include "filesystem/IDirectory.h"
> +#include "filesystem/cloudprovider/Device.h"
> +
> +namespace medialibrary {
> +
> +namespace cp {
> +
> +class Directory : public fs::IDirectory {
> +public:
> + Directory( std::shared_ptr<Device> device, cloudstorage::IItem::Pointer item,
> + const std::string& path );
> +
> + const std::string& path() const override;
> +
> + const std::vector<std::shared_ptr<fs::IFile>>& files() const override;
> + const std::vector<std::shared_ptr<IDirectory>>& dirs() const override;
> + std::shared_ptr<fs::IDevice> device() const override;
> +
> +private:
> + void read() const;
> +
> + std::shared_ptr<Device> m_device;
> + std::string m_path;
> + mutable std::vector<std::shared_ptr<fs::IFile>> m_files;
> + mutable std::vector<std::shared_ptr<fs::IDirectory>> m_directories;
> + mutable cloudstorage::IItem::Pointer m_item;
> +};
> +}
> +}
> diff --git a/src/filesystem/cloudprovider/File.cpp b/src/filesystem/cloudprovider/File.cpp
> new file mode 100644
> index 0000000..bd4a8a2
> --- /dev/null
> +++ b/src/filesystem/cloudprovider/File.cpp
> @@ -0,0 +1,40 @@
> +/*****************************************************************************
> + * Media Library
> + *****************************************************************************
> + * Copyright (C) 2016 Paweł Wegner
> + *
> + * Authors: Paweł Wegner<pawel.wegner95 at gmail.com>
> + *
> + * This program is free software; you can redistribute it and/or modify it
> + * under the terms of the GNU Lesser General Public License as published by
> + * the Free Software Foundation; either version 2.1 of the License, or
> + * (at your option) any later version.
> + *
> + * This program 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 Lesser General Public License for more details.
> + *
> + * You should have received a copy of the GNU Lesser General Public License
> + * along with this program; if not, write to the Free Software Foundation,
> + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
> + *****************************************************************************/
> +
> +#include "File.h"
> +
> +namespace medialibrary {
> +namespace cp {
> +
> +File::File( const std::string& url, const std::string& path )
> + : fs::CommonFile( path ), m_url( url ) {}
> +
> +unsigned int File::lastModificationDate() const {
> + // TODO
> + return 0;
> +}
> +
> +const std::string& File::fullPath() const {
> + return m_url;
> +}
> +}
> +}
> diff --git a/src/filesystem/cloudprovider/File.h b/src/filesystem/cloudprovider/File.h
> new file mode 100644
> index 0000000..5901225
> --- /dev/null
> +++ b/src/filesystem/cloudprovider/File.h
> @@ -0,0 +1,43 @@
> +/*****************************************************************************
> + * Media Library
> + *****************************************************************************
> + * Copyright (C) 2016 Paweł Wegner
> + *
> + * Authors: Paweł Wegner<pawel.wegner95 at gmail.com>
> + *
> + * This program is free software; you can redistribute it and/or modify it
> + * under the terms of the GNU Lesser General Public License as published by
> + * the Free Software Foundation; either version 2.1 of the License, or
> + * (at your option) any later version.
> + *
> + * This program 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 Lesser General Public License for more details.
> + *
> + * You should have received a copy of the GNU Lesser General Public License
> + * along with this program; if not, write to the Free Software Foundation,
> + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
> + *****************************************************************************/
> +
> +#pragma once
> +
> +#include "filesystem/common/CommonFile.h"
> +
> +#include <IItem.h>
> +
> +namespace medialibrary {
> +namespace cp {
> +
> +class File : public fs::CommonFile {
> +public:
> + File( const std::string& url, const std::string& path );
> +
> + unsigned int lastModificationDate() const override;
> + const std::string& fullPath() const override;
> +
> +private:
> + std::string m_url;
> +};
> +}
> +}
> --
> 2.7.4
>
> _______________________________________________
> Vlmc-devel mailing list
> Vlmc-devel at videolan.org
> https://mailman.videolan.org/listinfo/vlmc-devel
More information about the Vlmc-devel
mailing list