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