// Copyright (c) 2013 The Chromium OS Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef P2P_HTTP_SERVER_CONNECTION_DELEGATE_INTERFACE_H__
#define P2P_HTTP_SERVER_CONNECTION_DELEGATE_INTERFACE_H__

#include "p2p/common/server_message.h"

#include <string>

#include <base/threading/simple_thread.h>

namespace p2p {

namespace http_server {

class ServerInterface;

// The ConnectionDelegateInterface exposes a single Run() method intended to
// be run from the thread that handles this connection manager.
class ConnectionDelegateInterface
  : public base::DelegateSimpleThread::Delegate {
 public:
  virtual ~ConnectionDelegateInterface() {}

  // The ConnectionDelegateInterface::Run() method should serve any .p2p file in
  // the |dirfd| directory over the |fd| socket and close the socket once done.
  // This should also call ServerInterface::ConnectionTerminated() on |server|
  // once the connection is closed and report the desired metrics calling
  // ServerInterface::ReportServerMessage().
  virtual void Run() = 0;
};

// A ConnectionDelegateFactory is a function that builds a
// ConnectionDelegateInterface that should serve files from the directory
// referenced by the file descriptor |dirfd| through the socket |fd| at a
// rate not bigger than |max_download_rate| bytes per second.
// |pretty_addr| is a string identifying the client's address and the |server|
// points to the ServerInterface instance to notify when the transfer is done.
typedef ConnectionDelegateInterface* (ConnectionDelegateFactory)(
    int dirfd,
    int fd,
    const std::string& pretty_addr,
    ServerInterface* server,
    int64_t max_download_rate);

}  // namespace http_server

}  // namespace p2p

#endif  // P2P_HTTP_SERVER_CONNECTION_DELEGATE_INTERFACE_H__
