//
//  Copyright 2015 Google, Inc.
//
//  Licensed under the Apache License, Version 2.0 (the "License");
//  you may not use this file except in compliance with the License.
//  You may obtain a copy of the License at:
//
//  http://www.apache.org/licenses/LICENSE-2.0
//
//  Unless required by applicable law or agreed to in writing, software
//  distributed under the License is distributed on an "AS IS" BASIS,
//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
//  See the License for the specific language governing permissions and
//  limitations under the License.
//

#pragma once

#include <atomic>
#include <base/files/file_path.h>
#include <base/files/scoped_file.h>
#include <base/macros.h>
#include <base/threading/thread.h>

#include "service/ipc/ipc_handler.h"
#include "service/ipc/ipc_manager.h"

namespace base {
class SingleThreadTaskRunner;
}  // namespace base

namespace ipc {

// Implements a Linux sequential packet domain-socket based IPCHandler
class IPCHandlerLinux : public IPCHandler {
 public:
  IPCHandlerLinux(bluetooth::Adapter* adapter, IPCManager::Delegate* delegate);
  ~IPCHandlerLinux() override;

  // IPCHandler overrides:
  bool Run() override;
  void Stop() override;

 private:
  IPCHandlerLinux() = default;

  // Starts listening for incoming connections. Posted on |thread_| by Run().
  void StartListeningOnThread();

  // Stops the IPC thread. This helper is needed since base::Thread requires
  // threads to be stopped on the thread that started them.
  void ShutDownOnOriginThread();

  // Notifies the delegate that we started or stoppedlistening for incoming
  // connections.
  void NotifyStartedOnOriginThread();
  void NotifyStartedOnCurrentThread();
  void NotifyStoppedOnOriginThread();
  void NotifyStoppedOnCurrentThread();

// True, if the IPC mechanism is running.
#if defined(__APPLE__)
  bool running_ ATTRIBUTE_UNUSED;
#else
  bool running_;
#endif

  // The server socket on which we listen to incoming connections.
  base::ScopedFD socket_;

  // The file path to |socket_|. This is only set if we create and manage the
  // life time of the socket.
  base::FilePath socket_path_;

  // We use a dedicated thread for listening to incoming connections and
  // polling from the socket to avoid blocking the main thread.
  base::Thread thread_;

  // Whether or not the listening thread should continue to run.
  std::atomic<bool> keep_running_;

  // The origin thread's task runner.
  scoped_refptr<base::SingleThreadTaskRunner> origin_task_runner_;

  DISALLOW_COPY_AND_ASSIGN(IPCHandlerLinux);
};

}  // namespace ipc
