// 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