190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber/*
2f71323e297a928af368937089d3ed71239786f86Andreas Huber *  Copyright (c) 2010 The WebM project authors. All Rights Reserved.
390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber *
4f71323e297a928af368937089d3ed71239786f86Andreas Huber *  Use of this source code is governed by a BSD-style license
5f71323e297a928af368937089d3ed71239786f86Andreas Huber *  that can be found in the LICENSE file in the root of the source
6f71323e297a928af368937089d3ed71239786f86Andreas Huber *  tree. An additional intellectual property rights grant can be found
7f71323e297a928af368937089d3ed71239786f86Andreas Huber *  in the file PATENTS.  All contributing project authors may
8f71323e297a928af368937089d3ed71239786f86Andreas Huber *  be found in the AUTHORS file in the root of the source tree.
990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber */
1090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
1190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
1290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#ifndef _duck_io_h
1390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#define _duck_io_h
1490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
1590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#if defined(__cplusplus)
1690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberextern "C" {
1790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#endif
1890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
1990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#if defined (_WIN32)
2090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    typedef __int64 int64_t;
2190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#elif defined(__MWERKS__)
2290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    typedef long long int64_t;
2390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#elif defined(__APPLE__) || defined(__POWERPC)
2490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#include <ppc/types.h>
2590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#else
2690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    typedef long long int64_t;
2790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#endif
2890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
2990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    typedef struct
3090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {
3190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        int64_t  offset;     // offset to start from
3290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        int    blocking;    // non-zero for blocking
3390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    } re_open_t;
3490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
3590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
3690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    typedef enum
3790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {
3890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        SAL_ERR_MAX                 = -10,
3990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        SAL_ERROR                   = -11, // Default error
4090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        SAL_ERR_WSASTARTUP          = -12,
4190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        SAL_ERR_SOCKET_CREATE       = -13,
4290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        SAL_ERR_RESOLVING_HOSTNAME  = -14,
4390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        SAL_ERR_SERVER_CONNECTION   = -15,
4490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        SAL_ERR_SENDING_DATA        = -16,
4590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        SAL_ERR_RECEIVING_DATA      = -17,
4690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        SAL_ERR_404_FILE_NOT_FOUND  = -18,
4790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        SAL_ERR_PARSING_HTTP_HEADER = -19,
4890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        SAL_ERR_PARSING_CONTENT_LEN = -20,
4990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        SAL_ERR_CONNECTION_TIMEOUT  = -21,
5090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        SAL_ERR_FILE_OPEN_FAILED    = -22,
5190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        SAL_ERR_MIN                 = -23
5290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    } SAL_ERR; /* EMH 1-15-03 */
5390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
5490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
5590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    typedef struct sal_err_map_temp
5690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {
5790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        SAL_ERR code;
5890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        const char *decode;
5990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
6090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    } sal_err_map_t;
6190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
6290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
6390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    static char *sal_err_text(SAL_ERR e)
6490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {
6590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        int t;
6690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        const sal_err_map_t g_sal_err_map[] =
6790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        {
6890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            {   SAL_ERR_WSASTARTUP,             "Error with WSAStartup"         },
6990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            {   SAL_ERR_SOCKET_CREATE,          "Error creating socket"         },
7090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            {   SAL_ERR_RESOLVING_HOSTNAME,     "Error resolving hostname"      },
7190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            {   SAL_ERR_SERVER_CONNECTION,      "Error connecting to server"    },
7290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            {   SAL_ERR_SENDING_DATA,           "Error sending data"            },
7390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            {   SAL_ERR_RECEIVING_DATA,         "Error receiving data"          },
7490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            {   SAL_ERR_404_FILE_NOT_FOUND,     "Error file not found "         },
7590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            {   SAL_ERR_PARSING_HTTP_HEADER,    "Error parsing http header"     },
7690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            {   SAL_ERR_PARSING_CONTENT_LEN,    "Error parsing content length"  },
7790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            {   SAL_ERR_CONNECTION_TIMEOUT,     "Error Connection timed out"    },
7890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            {   SAL_ERR_FILE_OPEN_FAILED,       "Error opening file"            }
7990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        };
8090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
8190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        for (t = 0; t < sizeof(g_sal_err_map) / sizeof(sal_err_map_t); t++)
8290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        {
8390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            if (e == g_sal_err_map[t].code)
8490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                return (char *) g_sal_err_map[t].decode;
8590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        }
8690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
8790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        return 0;
8890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
8990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
9090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
9190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
9290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
9390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
9490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
9590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
9690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    int duck_open(const char *fname, unsigned long user_data);
9790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
9890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    void duck_close(int ghndl);
9990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
10090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    int duck_read(int ghndl, unsigned char *buf, int nbytes);
10190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
10290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    int64_t duck_seek(int g_hndl, int64_t offs, int origin);
10390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
10490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    int duck_read_finished(int han, int flag); /* FWG 7-9-99 */
10590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
10690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    int duck_name(int handle, char name[], size_t max_len); /* EMH 9-23-03 */
10790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
10890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    int duck_read_blocking(int handle, unsigned char *buffer, int bytes); /* EMH 9-23-03 */
10990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
11090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    int64_t duck_available_data(int handle); /* EMH 10-23-03 */
11190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
11290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#if defined(__cplusplus)
11390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}
11490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#endif
11590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
11690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#endif
117