| // 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 { |
| |
| DownloadInterruptReason ConvertFileErrorToInterruptReason( |
| base::File::Error file_error) { |
| switch (file_error) { |
| case base::File::FILE_OK: |
| return DOWNLOAD_INTERRUPT_REASON_NONE; |
| |
| case base::File::FILE_ERROR_IN_USE: |
| return DOWNLOAD_INTERRUPT_REASON_FILE_TRANSIENT_ERROR; |
| |
| case base::File::FILE_ERROR_ACCESS_DENIED: |
| return DOWNLOAD_INTERRUPT_REASON_FILE_ACCESS_DENIED; |
| |
| case base::File::FILE_ERROR_TOO_MANY_OPENED: |
| return DOWNLOAD_INTERRUPT_REASON_FILE_TRANSIENT_ERROR; |
| |
| case base::File::FILE_ERROR_NO_MEMORY: |
| return DOWNLOAD_INTERRUPT_REASON_FILE_TRANSIENT_ERROR; |
| |
| case base::File::FILE_ERROR_NO_SPACE: |
| return DOWNLOAD_INTERRUPT_REASON_FILE_NO_SPACE; |
| |
| case base::File::FILE_ERROR_SECURITY: |
| return DOWNLOAD_INTERRUPT_REASON_FILE_ACCESS_DENIED; |
| |
| default: |
| return DOWNLOAD_INTERRUPT_REASON_FILE_FAILED; |
| } |
| } |
| |
| DownloadInterruptReason ConvertNetErrorToInterruptReason( |
| net::Error net_error, DownloadInterruptSource source) { |
| switch (net_error) { |
| case net::OK: |
| return DOWNLOAD_INTERRUPT_REASON_NONE; |
| |
| // File errors. |
| |
| // The file is too large. |
| case net::ERR_FILE_TOO_BIG: |
| return DOWNLOAD_INTERRUPT_REASON_FILE_TOO_LARGE; |
| |
| // Permission to access a resource, other than the network, was denied. |
| case net::ERR_ACCESS_DENIED: |
| return DOWNLOAD_INTERRUPT_REASON_FILE_ACCESS_DENIED; |
| |
| // There were not enough resources to complete the operation. |
| case net::ERR_INSUFFICIENT_RESOURCES: |
| return DOWNLOAD_INTERRUPT_REASON_FILE_TRANSIENT_ERROR; |
| |
| // Memory allocation failed. |
| case net::ERR_OUT_OF_MEMORY: |
| return DOWNLOAD_INTERRUPT_REASON_FILE_TRANSIENT_ERROR; |
| |
| // The path or file name is too long. |
| case net::ERR_FILE_PATH_TOO_LONG: |
| return DOWNLOAD_INTERRUPT_REASON_FILE_NAME_TOO_LONG; |
| |
| // Not enough room left on the disk. |
| case net::ERR_FILE_NO_SPACE: |
| return DOWNLOAD_INTERRUPT_REASON_FILE_NO_SPACE; |
| |
| // The file has a virus. |
| case net::ERR_FILE_VIRUS_INFECTED: |
| return DOWNLOAD_INTERRUPT_REASON_FILE_VIRUS_INFECTED; |
| |
| // The file was blocked by local policy. |
| case net::ERR_BLOCKED_BY_CLIENT: |
| return DOWNLOAD_INTERRUPT_REASON_FILE_BLOCKED; |
| |
| // Network errors. |
| |
| // The network operation timed out. |
| case net::ERR_TIMED_OUT: |
| return DOWNLOAD_INTERRUPT_REASON_NETWORK_TIMEOUT; |
| |
| // The network connection was lost or changed. |
| case net::ERR_NETWORK_CHANGED: |
| case net::ERR_INTERNET_DISCONNECTED: |
| return DOWNLOAD_INTERRUPT_REASON_NETWORK_DISCONNECTED; |
| |
| // The server has gone down. |
| case net::ERR_CONNECTION_FAILED: |
| return DOWNLOAD_INTERRUPT_REASON_NETWORK_SERVER_DOWN; |
| |
| // Server responses. |
| |
| // The server does not support range requests. |
| case net::ERR_REQUEST_RANGE_NOT_SATISFIABLE: |
| return DOWNLOAD_INTERRUPT_REASON_SERVER_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; |
| } |
| |
| std::string DownloadInterruptReasonToString(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 |