Skip to content
Snippets Groups Projects
Select Git revision
  • master default protected
  • release/202005
  • release/202001
  • release/201912
  • release/201911
  • release/releaseWindowsTestOne
  • release/windowsReleaseTest
  • release/releaseTest
  • release/releaseWindowsTest
  • release/201910
  • release/qt/201910
  • release/windows-test/201910
  • release/201908
  • release/201906
  • release/201905
  • release/201904
  • release/201903
  • release/201902
  • release/201901
  • release/201812
  • 4.0.0
  • 2.2.0
  • 2.1.0
  • 2.0.1
  • 2.0.0
  • 1.4.1
  • 1.4.0
  • 1.3.0
  • 1.2.0
  • 1.1.0
30 results

jami.h

Blame
  • Code owners
    Assign users and groups as approvers for specific file changes. Learn more.
    jami.h 5.77 KiB
    /*
     *  Copyright (C) 2004-2022 Savoir-faire Linux Inc.
     *
     *  Author: Philippe Proulx <philippe.proulx@savoirfairelinux.com>
     *  Author: Guillaume Roguez <Guillaume.Roguez@savoirfairelinux.com>
     *
     *  This program 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 3 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 General Public License for more details.
     *
     *  You should have received a copy of the GNU 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.
     */
    #ifndef DRING_H
    #define DRING_H
    
    #include "def.h"
    
    #include <vector>
    #include <functional>
    #include <string>
    #include <map>
    #include <memory>
    #include <type_traits>
    
    #include "trace-tools.h"
    
    namespace DRing {
    
    /* flags for initialization */
    enum InitFlag {
        DRING_FLAG_DEBUG = 1 << 0,
        DRING_FLAG_CONSOLE_LOG = 1 << 1,
        DRING_FLAG_AUTOANSWER = 1 << 2,
    };
    
    /**
     * Return the library version as string.
     */
    DRING_PUBLIC const char* version() noexcept;
    
    /**
     * Return the target platform (OS) as a string.
     */
    DRING_PUBLIC const char* platform() noexcept;
    
    /**
     * Initialize globals, create underlaying daemon.
     *
     * @param flags  Flags to customize this initialization
     * @returns      true if initialization succeed else false.
     */
    DRING_PUBLIC bool init(enum InitFlag flags) noexcept;
    
    /**
     * Start asynchronously daemon created by init().
     * @returns true if daemon started successfully
     */
    DRING_PUBLIC bool start(const std::string& config_file = {}) noexcept;
    
    /**
     * Stop and freeing any resource allocated by daemon
     */
    DRING_PUBLIC void fini() noexcept;
    
    /**
     * Control log handlers.
     *
     * @param whom  Log handler to control
     */
    DRING_PUBLIC void logging(const std::string& whom, const std::string& action) noexcept;
    
    /* External Callback Dynamic Utilities
     *
     * The library provides to users a way to be acknowledged
     * when daemon's objects have a state change.
     * The user is aware of this changement when the deamon calls
     * a user-given callback.
     * Daemon handles many of these callbacks, one per event type.
     * The user registers his callbacks using registerXXXXHandlers() functions.
     * As each callback has its own function signature,
     * to keep compatibility over releases we don't let user directly provides
     * his callbacks as it or through a structure.
     * This way brings ABI violation if we need to change the order
     * and/or the existence of any callback type.
     * Thus the user have to pass them using following template classes
     * and functions, that wraps user-callback in a generic and ABI-compatible way.
     */
    
    /* Generic class to transit user callbacks to daemon library.
     * Used conjointly with std::shared_ptr to hide the concrete class.
     * See CallbackWrapper template for details.
     */
    class DRING_PUBLIC CallbackWrapperBase
    {};
    
    /* Concrete class of CallbackWrapperBase.
     * This class wraps callbacks of a specific signature.
     * Also used to obtain the user callback from a CallbackWrapperBase shared ptr.
     *
     * This class is CopyConstructible, CopyAssignable, MoveConstructible
     * and MoveAssignable.
     */
    template<typename TProto>
    class CallbackWrapper : public CallbackWrapperBase
    {
    private:
        using TFunc = std::function<TProto>;
        TFunc cb_; // The user-callback
    
    public:
        const char* file_;
        uint32_t linum_;
    
        // Empty wrapper: no callback associated.
        // Used to initialize internal callback arrays.
        CallbackWrapper() noexcept {}
    
        // Create and initialize a wrapper to given callback.
        CallbackWrapper(TFunc&& func, const char* filename, uint32_t linum) noexcept
            : cb_(std::forward<TFunc>(func)),
              file_(filename),
              linum_(linum)
        {}
    
        // Create and initialize a wrapper from a generic CallbackWrapperBase
        // shared pointer.
        // Note: the given callback is copied into internal storage.
        CallbackWrapper(const std::shared_ptr<CallbackWrapperBase>& p) noexcept
        {
            if (p) {
                auto other = (CallbackWrapper<TProto>*)p.get();
    
                cb_    = other->cb_;
                file_  = other->file_;
                linum_ = other->linum_;
            }
        }
    
        // Return user-callback reference.
        // The returned std::function can be null-initialized if no callback
        // has been set.
        constexpr const TFunc& operator*() const noexcept { return cb_; }
    
        // Return boolean true value if a non-null callback has been set
        constexpr explicit operator bool() const noexcept { return static_cast<bool>(cb_); }
    };
    
    /**
     * Return an exportable callback object.
     * This object is a std::pair of a string and a CallbackWrapperBase shared_ptr.
     * This last wraps given callback in a ABI-compatible way.
     * Note: this version accepts callbacks as rvalue only.
     */
    template<typename Ts>
    std::pair<std::string, std::shared_ptr<CallbackWrapperBase>>
    exportable_callback(std::function<typename Ts::cb_type>&& func,
                        const char* file=CURRENT_FILENAME(),
                        uint32_t linum=CURRENT_LINE())
    {
        return std::make_pair((const std::string&) Ts::name,
                              std::make_shared<CallbackWrapper<typename Ts::cb_type>>(
                                  std::forward<std::function<typename Ts::cb_type>>(func),
                                  file, linum));
    }
    
    DRING_PUBLIC void registerSignalHandlers(
        const std::map<std::string, std::shared_ptr<CallbackWrapperBase>>&);
    DRING_PUBLIC void unregisterSignalHandlers();
    
    using MediaMap = std::map<std::string, std::string>;
    
    } // namespace DRing
    
    #endif /* DRING_H */