[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