| // Copyright (c) 2011 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 "net/base/net_errors.h" | 
 |  | 
 | #include <winsock2.h> | 
 |  | 
 | #include "base/logging.h" | 
 |  | 
 | namespace net { | 
 |  | 
 | // Map winsock and system errors to Chromium errors. | 
 | Error MapSystemError(logging::SystemErrorCode os_error) { | 
 |   if (os_error != 0) | 
 |     DVLOG(2) << "Error " << os_error; | 
 |  | 
 |   // There are numerous Winsock error codes, but these are the ones we thus far | 
 |   // find interesting. | 
 |   switch (os_error) { | 
 |     case WSAEWOULDBLOCK: | 
 |     case WSA_IO_PENDING: | 
 |       return ERR_IO_PENDING; | 
 |     case WSAEACCES: | 
 |       return ERR_ACCESS_DENIED; | 
 |     case WSAENETDOWN: | 
 |       return ERR_INTERNET_DISCONNECTED; | 
 |     case WSAETIMEDOUT: | 
 |       return ERR_TIMED_OUT; | 
 |     case WSAECONNRESET: | 
 |     case WSAENETRESET:  // Related to keep-alive | 
 |       return ERR_CONNECTION_RESET; | 
 |     case WSAECONNABORTED: | 
 |       return ERR_CONNECTION_ABORTED; | 
 |     case WSAECONNREFUSED: | 
 |       return ERR_CONNECTION_REFUSED; | 
 |     case WSA_IO_INCOMPLETE: | 
 |     case WSAEDISCON: | 
 |       return ERR_CONNECTION_CLOSED; | 
 |     case WSAEISCONN: | 
 |       return ERR_SOCKET_IS_CONNECTED; | 
 |     case WSAEHOSTUNREACH: | 
 |     case WSAENETUNREACH: | 
 |       return ERR_ADDRESS_UNREACHABLE; | 
 |     case WSAEADDRNOTAVAIL: | 
 |       return ERR_ADDRESS_INVALID; | 
 |     case WSAEMSGSIZE: | 
 |       return ERR_MSG_TOO_BIG; | 
 |     case WSAENOTCONN: | 
 |       return ERR_SOCKET_NOT_CONNECTED; | 
 |     case WSAEAFNOSUPPORT: | 
 |       return ERR_ADDRESS_UNREACHABLE; | 
 |     case WSAEINVAL: | 
 |       return ERR_INVALID_ARGUMENT; | 
 |     case WSAEADDRINUSE: | 
 |       return ERR_ADDRESS_IN_USE; | 
 |  | 
 |     // System errors. | 
 |     case ERROR_FILE_NOT_FOUND:  // The system cannot find the file specified. | 
 |       return ERR_FILE_NOT_FOUND; | 
 |     case ERROR_PATH_NOT_FOUND:  // The system cannot find the path specified. | 
 |       return ERR_FILE_NOT_FOUND; | 
 |     case ERROR_TOO_MANY_OPEN_FILES:  // The system cannot open the file. | 
 |       return ERR_INSUFFICIENT_RESOURCES; | 
 |     case ERROR_ACCESS_DENIED:  // Access is denied. | 
 |       return ERR_ACCESS_DENIED; | 
 |     case ERROR_INVALID_HANDLE:  // The handle is invalid. | 
 |       return ERR_INVALID_HANDLE; | 
 |     case ERROR_NOT_ENOUGH_MEMORY:  // Not enough storage is available to | 
 |       return ERR_OUT_OF_MEMORY;    // process this command. | 
 |     case ERROR_OUTOFMEMORY:      // Not enough storage is available to complete | 
 |       return ERR_OUT_OF_MEMORY;  // this operation. | 
 |     case ERROR_WRITE_PROTECT:  // The media is write protected. | 
 |       return ERR_ACCESS_DENIED; | 
 |     case ERROR_SHARING_VIOLATION:  // Cannot access the file because it is | 
 |       return ERR_ACCESS_DENIED;    // being used by another process. | 
 |     case ERROR_LOCK_VIOLATION:   // The process cannot access the file because | 
 |       return ERR_ACCESS_DENIED;  // another process has locked the file. | 
 |     case ERROR_HANDLE_EOF:  // Reached the end of the file. | 
 |       return ERR_FAILED; | 
 |     case ERROR_HANDLE_DISK_FULL:  // The disk is full. | 
 |       return ERR_FILE_NO_SPACE; | 
 |     case ERROR_FILE_EXISTS:  // The file exists. | 
 |       return ERR_FILE_EXISTS; | 
 |     case ERROR_INVALID_PARAMETER:  // The parameter is incorrect. | 
 |       return ERR_INVALID_ARGUMENT; | 
 |     case ERROR_BUFFER_OVERFLOW:  // The file name is too long. | 
 |       return ERR_FILE_PATH_TOO_LONG; | 
 |     case ERROR_DISK_FULL:  // There is not enough space on the disk. | 
 |       return ERR_FILE_NO_SPACE; | 
 |     case ERROR_CALL_NOT_IMPLEMENTED:  // This function is not supported on | 
 |       return ERR_NOT_IMPLEMENTED;     // this system. | 
 |     case ERROR_INVALID_NAME:        // The filename, directory name, or volume | 
 |       return ERR_INVALID_ARGUMENT;  // label syntax is incorrect. | 
 |     case ERROR_DIR_NOT_EMPTY:  // The directory is not empty. | 
 |       return ERR_FAILED; | 
 |     case ERROR_BUSY:  // The requested resource is in use. | 
 |       return ERR_ACCESS_DENIED; | 
 |     case ERROR_ALREADY_EXISTS:  // Cannot create a file when that file | 
 |       return ERR_FILE_EXISTS;   // already exists. | 
 |     case ERROR_FILENAME_EXCED_RANGE:  // The filename or extension is too long. | 
 |       return ERR_FILE_PATH_TOO_LONG; | 
 |     case ERROR_FILE_TOO_LARGE:   // The file size exceeds the limit allowed | 
 |       return ERR_FILE_NO_SPACE;  // and cannot be saved. | 
 |     case ERROR_VIRUS_INFECTED:         // Operation failed because the file | 
 |       return ERR_FILE_VIRUS_INFECTED;  // contains a virus. | 
 |     case ERROR_IO_DEVICE:        // The request could not be performed | 
 |       return ERR_ACCESS_DENIED;  // because of an I/O device error. | 
 |     case ERROR_POSSIBLE_DEADLOCK:  // A potential deadlock condition has | 
 |       return ERR_ACCESS_DENIED;    // been detected. | 
 |     case ERROR_BAD_DEVICE:  // The specified device name is invalid. | 
 |       return ERR_INVALID_ARGUMENT; | 
 |     case ERROR_BROKEN_PIPE:  // Pipe is not connected. | 
 |       return ERR_CONNECTION_RESET; | 
 |  | 
 |     case ERROR_SUCCESS: | 
 |       return OK; | 
 |     default: | 
 |       LOG(WARNING) << "Unknown error " << os_error | 
 |                    << " mapped to net::ERR_FAILED"; | 
 |       return ERR_FAILED; | 
 |   } | 
 | } | 
 |  | 
 | }  // namespace net |