// 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_COMMON_SERVER_MESSAGE_H__
#define P2P_COMMON_SERVER_MESSAGE_H__

#include <string>

namespace p2p {

namespace util {

// Magic value for the P2PServerMessage "magic" field.
const uint64_t kP2PServerMagic = 0x746F68536E6F6F4DULL;  // "MoonShot"

// Messages passed between the p2p-server and the p2p-http-server.
enum P2PServerMessageType {
  kP2PServerNumConnections = 0,
  kP2PServerRequestResult,
  kP2PServerServedSuccessfullyMB,
  kP2PServerServedInterruptedMB,
  kP2PServerRangeBeginPercentage,
  kP2PServerDownloadSpeedKBps,
  kP2PServerPeakDownloadSpeedKBps,
  kP2PServerClientCount,
  kP2PServerPortNumber,

  // Add new P2PServerMessageTypes above this line.
  kNumP2PServerMessageTypes
};

// The possible values passed for a kP2PServerRequestResult message.
enum P2PServerRequestResult {
  // The resource was found and the response served.
  kP2PRequestResultResponseSent = 0,

  // The resource was found but the client disconnected.
  kP2PRequestResultResponseInterrupted,

  kP2PRequestResultMalformed,  // Request was malformed.
  kP2PRequestResultNotFound,  // Requested resource was not found.
  kP2PRequestResultIndex,  // Requested the '/' or '/index.html' resource.

  // Add new P2PServerRequestResults above this line.
  kNumP2PServerRequestResults
};

struct P2PServerMessage {
  uint64_t magic;  // The magic value fixed to be "MoonShot".
  uint32_t message_type;  // The P2PServerMessageType.
  int64_t value;  // The value for the provided message type.
};

// Returns whether the magic field in the provided |message| is valid.
bool ValidP2PServerMessageMagic(const P2PServerMessage& message);

// Converts a uint32_t |value| to a P2PServerMessageType if the provided
// |value| is in range. Returns whether the conversion was successful.
bool ParseP2PServerMessageType(uint32_t value, P2PServerMessageType* result);

// Converts a int64_t |value| to a P2PServerRequestResult if the provided
// |value| is in range. Returns whether the conversion was successful.
bool ParseP2PServerRequestResult(int64_t value,
                                 P2PServerRequestResult* result);

// Convertion to human-readable string for debugging purposes.
std::string ToString(const P2PServerMessage& message);
std::string ToString(P2PServerMessageType message_type);
std::string ToString(P2PServerRequestResult request_result);

}  // namespace util

}  // namespace p2p

#endif  // P2P_COMMON_SERVER_MESSAGE_H__
