blob: b3ee11e44667ad970d07d3cea18375fda9441a90 [file] [log] [blame]
// Copyright (c) 2012 The Chromium 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 "content/browser/download/download_interrupt_reasons_impl.h"
#include "base/logging.h"
namespace content {
#define FILE_ERROR_TO_INTERRUPT_REASON(n, d) \
case net::ERR_##n: return DOWNLOAD_INTERRUPT_REASON_FILE_##d;
#define NET_ERROR_TO_INTERRUPT_REASON(n, d) \
case net::ERR_##n: return DOWNLOAD_INTERRUPT_REASON_NETWORK_##d;
#define SERVER_ERROR_TO_INTERRUPT_REASON(n, d) \
case net::ERR_##n: return DOWNLOAD_INTERRUPT_REASON_SERVER_##d;
DownloadInterruptReason ConvertNetErrorToInterruptReason(
net::Error net_error, DownloadInterruptSource source) {
switch (net_error) {
// File errors.
case net::OK: return DOWNLOAD_INTERRUPT_REASON_NONE;
// The file is too large.
FILE_ERROR_TO_INTERRUPT_REASON(FILE_TOO_BIG, TOO_LARGE)
// Permission to access a resource, other than the network, was denied.
FILE_ERROR_TO_INTERRUPT_REASON(ACCESS_DENIED, ACCESS_DENIED)
// There were not enough resources to complete the operation.
FILE_ERROR_TO_INTERRUPT_REASON(INSUFFICIENT_RESOURCES, TRANSIENT_ERROR)
// Memory allocation failed.
FILE_ERROR_TO_INTERRUPT_REASON(OUT_OF_MEMORY, TRANSIENT_ERROR)
// The path or file name is too long.
FILE_ERROR_TO_INTERRUPT_REASON(FILE_PATH_TOO_LONG, NAME_TOO_LONG)
// Not enough room left on the disk.
FILE_ERROR_TO_INTERRUPT_REASON(FILE_NO_SPACE, NO_SPACE)
// The file has a virus.
FILE_ERROR_TO_INTERRUPT_REASON(FILE_VIRUS_INFECTED, VIRUS_INFECTED)
// Network errors.
// The network operation timed out.
NET_ERROR_TO_INTERRUPT_REASON(TIMED_OUT, TIMEOUT)
// The network connection has been lost.
NET_ERROR_TO_INTERRUPT_REASON(INTERNET_DISCONNECTED, DISCONNECTED)
// The server has gone down.
NET_ERROR_TO_INTERRUPT_REASON(CONNECTION_FAILED, SERVER_DOWN)
// The server has terminated the connection.
// NET_ERROR_TO_INTERRUPT_REASON(CONNECTION_RESET, SERVER_DISCONNECTED)
// The server has aborted the connection.
// NET_ERROR_TO_INTERRUPT_REASON(CONNECTION_ABORTED, SERVER_ABORTED)
// Server responses.
// The server does not support range requests.
SERVER_ERROR_TO_INTERRUPT_REASON(REQUEST_RANGE_NOT_SATISFIABLE, NO_RANGE)
default: break;
}
// Handle errors that don't have mappings, depending on the source.
switch (source) {
case DOWNLOAD_INTERRUPT_FROM_DISK:
return DOWNLOAD_INTERRUPT_REASON_FILE_FAILED;
case DOWNLOAD_INTERRUPT_FROM_NETWORK:
return DOWNLOAD_INTERRUPT_REASON_NETWORK_FAILED;
case DOWNLOAD_INTERRUPT_FROM_SERVER:
return DOWNLOAD_INTERRUPT_REASON_SERVER_FAILED;
default:
break;
}
NOTREACHED();
return DOWNLOAD_INTERRUPT_REASON_NONE;
}
#undef FILE_ERROR_TO_INTERRUPT_REASON
#undef NET_ERROR_TO_INTERRUPT_REASON
#undef SERVER_ERROR_TO_INTERRUPT_REASON
std::string InterruptReasonDebugString(DownloadInterruptReason error) {
#define INTERRUPT_REASON(name, value) \
case DOWNLOAD_INTERRUPT_REASON_##name: return #name;
switch (error) {
INTERRUPT_REASON(NONE, 0)
#include "content/public/browser/download_interrupt_reason_values.h"
default:
break;
}
#undef INTERRUPT_REASON
return "Unknown error";
}
} // namespace content