// 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/basictypes.h>
#include <base/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 *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 *port, bool *is_source);

  DISALLOW_COPY_AND_ASSIGN(ConnectionInfoReader);
};

}  // namespace shill

#endif  // SHILL_CONNECTION_INFO_READER_H_
