// 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 SHILL_CONNECTION_INFO_READER_H_
#define SHILL_CONNECTION_INFO_READER_H_

#include <string>
#include <vector>

#include <base/macros.h>
#include <base/files/file_path.h>
#include <gtest/gtest_prod.h>

#include "shill/connection_info.h"

namespace shill {

class ConnectionInfoReader {
 public:
  ConnectionInfoReader();
  virtual ~ConnectionInfoReader();

  // Returns the file path (/proc/net/ip_conntrack by default) from where
  // IP connection tracking information are read. Overloadded by unit tests
  // to return a different file path.
  virtual base::FilePath GetConnectionInfoFilePath() const;

  // Loads IP connection tracking information from the file path returned by
  // GetConnectionInfoFilePath(). Existing entries in |info_list| are always
  // discarded. Returns true on success.
  virtual bool LoadConnectionInfo(std::vector<ConnectionInfo> *info_list);

 private:
  FRIEND_TEST(ConnectionInfoReaderTest, ParseConnectionInfo);
  FRIEND_TEST(ConnectionInfoReaderTest, ParseIPAddress);
  FRIEND_TEST(ConnectionInfoReaderTest, ParseIsUnreplied);
  FRIEND_TEST(ConnectionInfoReaderTest, ParsePort);
  FRIEND_TEST(ConnectionInfoReaderTest, ParseProtocol);
  FRIEND_TEST(ConnectionInfoReaderTest, ParseTimeToExpireSeconds);

  bool ParseConnectionInfo(const std::string &input, ConnectionInfo *info);
  bool ParseProtocol(const std::string &input, int *protocol);
  bool ParseTimeToExpireSeconds(const std::string &input,
                                int64_t *time_to_expire_seconds);
  bool ParseIsUnreplied(const std::string &input, bool *is_unreplied);
  bool ParseIPAddress(const std::string &input,
                      IPAddress *ip_address, bool *is_source);
  bool ParsePort(const std::string &input, uint16_t *port, bool *is_source);

  DISALLOW_COPY_AND_ASSIGN(ConnectionInfoReader);
};

}  // namespace shill

#endif  // SHILL_CONNECTION_INFO_READER_H_
