blob: 83e38dfa3bd4f6676dd1f0357a7fabe7e6009812 [file] [log] [blame]
// 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.
#include "p2p/common/server_message.h"
#include <glib.h>
#include <inttypes.h>
#include <base/format_macros.h>
#include <base/logging.h>
#include <base/strings/string_number_conversions.h>
#include <base/strings/stringprintf.h>
using std::string;
namespace p2p {
namespace util {
bool ValidP2PServerMessageMagic(const P2PServerMessage& message) {
return message.magic == kP2PServerMagic;
}
bool ParseP2PServerMessageType(uint32_t value, P2PServerMessageType* result) {
CHECK(result);
if (value >= kNumP2PServerMessageTypes)
return false;
*result = static_cast<P2PServerMessageType>(value);
return true;
}
bool ParseP2PServerRequestResult(int64_t value,
P2PServerRequestResult* result) {
CHECK(result);
if (value < 0 || value >= kNumP2PServerRequestResults)
return false;
*result = static_cast<P2PServerRequestResult>(value);
return true;
}
string ToString(const P2PServerMessage& message) {
if (message.magic != kP2PServerMagic) {
return base::StringPrintf(
"{InvalidMagic[%" PRIx64 "], Unknown[%" PRIu32 "]: %" PRId64 "}",
message.magic, message.message_type, message.value);
}
P2PServerMessageType message_type;
if (!ParseP2PServerMessageType(message.message_type, &message_type)) {
return base::StringPrintf("{InvalidType[%" PRIu32 "]: %" PRId64 "}",
message.message_type, message.value);
}
string res = "{" + ToString(message_type) + ": ";
if (message_type == kP2PServerRequestResult) {
P2PServerRequestResult req_res;
if (!ParseP2PServerRequestResult(message.value, &req_res)) {
return res + "InvalidRequestResult[" +
base::NumberToString(message.value) + "]}";
}
return res + ToString(req_res) + "}";
}
return res + base::NumberToString(message.value) + "}";
}
std::string ToString(P2PServerMessageType message_type) {
switch (message_type) {
case kP2PServerNumConnections:
return "NumConnections";
case kP2PServerRequestResult:
return "RequestResult";
case kP2PServerServedSuccessfullyMB:
return "ServedSuccessfullyMB";
case kP2PServerServedInterruptedMB:
return "ServedInterruptedMB";
case kP2PServerRangeBeginPercentage:
return "RangeBeginPercentage";
case kP2PServerDownloadSpeedKBps:
return "DownloadSpeedKBps";
case kP2PServerPeakDownloadSpeedKBps:
return "PeakDownloadSpeedKBps";
case kP2PServerClientCount:
return "ClientCount";
case kP2PServerPortNumber:
return "PortNumber";
case kNumP2PServerMessageTypes:
return "Unknown";
// Don't add a default case to let the compiler warn about newly added
// message types which should be added here.
}
return "Unknown";
}
std::string ToString(P2PServerRequestResult request_result) {
switch (request_result) {
case kP2PRequestResultResponseSent:
return "ResponseSent";
case kP2PRequestResultResponseInterrupted:
return "ResponseInterrupted";
case kP2PRequestResultMalformed:
return "Malformed";
case kP2PRequestResultNotFound:
return "NotFound";
case kP2PRequestResultIndex:
return "Index";
case kNumP2PServerRequestResults:
return "Unknown";
// Don't add a default case to let the compiler warn about newly added
// message types which should be added here.
}
return "Unknown";
}
} // namespace util
} // namespace p2p