view Framework/HttpQueries/HttpQueriesQueue.h @ 19:b06103a50c95

upgrade to year 2020
author Sebastien Jodogne <s.jodogne@gmail.com>
date Fri, 31 Jan 2020 17:47:55 +0100
parents 7e207ade2f1a
children 17f775299b4a
line wrap: on
line source

/**
 * Transfers accelerator plugin for Orthanc
 * Copyright (C) 2018-2020 Osimis S.A., Belgium
 *
 * This program is free software: you can redistribute it and/or
 * modify it under the terms of the GNU Affero 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
 * Affero General Public License for more details.
 * 
 * You should have received a copy of the GNU Affero General Public License
 * along with this program. If not, see <http://www.gnu.org/licenses/>.
 **/


#pragma once

#include "IHttpQuery.h"

#include <Plugins/Samples/Common/OrthancPluginCppWrapper.h>

#include <boost/thread/mutex.hpp>
#include <boost/thread/condition_variable.hpp>


namespace OrthancPlugins
{
  class HttpQueriesQueue : public boost::noncopyable
  {
  public:
    enum Status
    {
      Status_Running,
      Status_Success,
      Status_Failure
    };

  private:
    OrthancPeers                  peers_;
    boost::mutex                  mutex_;
    boost::condition_variable     completed_;
    std::vector<IHttpQuery*>      queries_;
    unsigned int                  maxRetries_;

    size_t                        position_;
    uint64_t                      downloadedSize_;   // GET answers + POST answers
    uint64_t                      uploadedSize_;     // PUT body + POST body
    size_t                        successQueries_;
    bool                          isFailure_;


    Status GetStatusInternal() const;

  public:
    HttpQueriesQueue();

    ~HttpQueriesQueue();

    OrthancPeers& GetOrthancPeers()
    {
      return peers_;
    }

    unsigned int GetMaxRetries();

    void SetMaxRetries(unsigned int maxRetries);

    void Reserve(size_t size);

    void Reset();

    void Enqueue(IHttpQuery* query);  // Takes ownership

    bool ExecuteOneQuery(size_t& networkTraffic);

    Status WaitComplete(unsigned int timeoutMS);
    
    void WaitComplete();

    void GetStatistics(size_t& scheduledQueriesCount,
                       size_t& successQueriesCount,
                       uint64_t& downloadedSize,
                       uint64_t& uploadedSize);
  };
}