//
//  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
