Home | History | Annotate | Download | only in android
      1 /* ------------------------------------------------------------------
      2  * Copyright (C) 1998-2009 PacketVideo
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
     13  * express or implied.
     14  * See the License for the specific language governing permissions
     15  * and limitations under the License.
     16  * -------------------------------------------------------------------
     17  */
     18 // -*- c++ -*-
     19 // = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
     20 
     21 //     O S C L C O N F I G _ I O
     22 
     23 // = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
     24 
     25 
     26 /*! \file osclconfig_io.h
     27  *  \brief This file contains common typedefs based on the ANSI C limits.h header
     28  *
     29  *  This header file should work for any ANSI C compiler to determine the
     30  *  proper native C types to use for OSCL integer types.
     31  */
     32 
     33 
     34 #ifndef OSCLCONFIG_IO_H_INCLUDED
     35 #define OSCLCONFIG_IO_H_INCLUDED
     36 
     37 #ifndef OSCLCONFIG_H_INCLUDED
     38 #include "osclconfig.h"
     39 #endif
     40 
     41 #if (OSCL_HAS_ANDROID_SUPPORT) && (ENABLE_MEMORY_PLAYBACK)
     42 #include <media/MediaPlayerInterface.h>
     43 #endif
     44 
     45 #include <stdio.h>
     46 #include <stdlib.h>
     47 #include <stdarg.h>
     48 #include <sys/socket.h>
     49 #include <netinet/in.h>
     50 #include <arpa/inet.h>
     51 #include <fcntl.h>
     52 #include <signal.h>
     53 #include <netdb.h>
     54 #include <sys/mman.h>
     55 #include <sys/types.h>
     56 #include <errno.h>
     57 #include <sys/vfs.h>
     58 #include <dirent.h>
     59 //#include <glob.h>
     60 #if (OSCL_HAS_ANSI_STDLIB_SUPPORT)
     61 #if (OSCL_HAS_UNIX_SUPPORT)
     62 #include <sys/stat.h>
     63 #endif
     64 #endif
     65 
     66 //For File I/O
     67 #define OSCL_HAS_GLOB 0
     68 #define OSCL_HAS_ANSI_FILE_IO_SUPPORT 1
     69 #define OSCL_HAS_SYMBIAN_COMPATIBLE_IO_FUNCTION 0
     70 #define OSCL_HAS_NATIVE_FILE_CACHE_ENABLE 1
     71 #define OSCL_FILE_BUFFER_MAX_SIZE   32768
     72 #define OSCL_HAS_PV_FILE_CACHE  0
     73 #define OSCL_HAS_LARGE_FILE_SUPPORT 1
     74 
     75 //For Sockets
     76 #define OSCL_HAS_SYMBIAN_SOCKET_SERVER 0
     77 #define OSCL_HAS_SYMBIAN_DNS_SERVER 0
     78 #define OSCL_HAS_BERKELEY_SOCKETS 1
     79 #define OSCL_HAS_SOCKET_SUPPORT 1
     80 
     81 //basic socket types
     82 typedef int TOsclSocket;
     83 typedef struct sockaddr_in TOsclSockAddr;
     84 typedef socklen_t TOsclSockAddrLen;
     85 
     86 //Init addr macro, inet_addr returns an uint32
     87 #define OsclValidInetAddr(addr) (inet_addr(addr)!=INADDR_NONE)
     88 
     89 //address conversion macro-- from string to network address.
     90 #define OsclMakeSockAddr(sockaddr,port,addrstr,ok)\
     91     sockaddr.sin_family=OSCL_AF_INET;\
     92     sockaddr.sin_port=htons(port);\
     93     int32 result=inet_aton((const char*)addrstr,&sockaddr.sin_addr);\
     94     ok=(result!=0);
     95 
     96 //address conversion macro-- from network address to string
     97 #define OsclUnMakeSockAddr(sockaddr,addrstr)\
     98     addrstr=inet_ntoa(sockaddr.sin_addr);
     99 
    100 //wrappers for berkeley socket calls
    101 #define OsclSetRecvBufferSize(s,val,ok,err) \
    102         ok=(setsockopt(s,SOL_SOCKET,SO_RCVBUF,(char*)&val, sizeof(int)) !=-1);\
    103         if (!ok)err=errno
    104 
    105 #define OsclBind(s,addr,ok,err)\
    106     TOsclSockAddr* tmpadr = &addr;\
    107     sockaddr* sadr = OSCL_STATIC_CAST(sockaddr*, tmpadr);\
    108     ok=(bind(s,sadr,sizeof(addr))!=(-1));\
    109     if (!ok)err=errno
    110 
    111 #define OsclJoin(s,addr,ok,err)\
    112 {\
    113         struct ip_mreq mreq; \
    114             void* p = &addr; \
    115         ok=(bind(s,(sockaddr*)p,sizeof(addr))!=(-1));\
    116         mreq.imr_multiaddr.s_addr = addr.sin_addr.s_addr ; \
    117         mreq.imr_interface.s_addr = htonl(INADDR_ANY); \
    118         ok=(setsockopt(s, IPPROTO_IP, IP_ADD_MEMBERSHIP, &mreq, sizeof(struct ip_mreq))!=(-1)); \
    119         if (!ok)err=errno;\
    120 }
    121 
    122 
    123 #define OsclListen(s,size,ok,err)\
    124     ok=(listen(iSocket,qSize)!=(-1));\
    125     if (!ok)err=errno
    126 
    127 #define OsclAccept(s,accept_s,ok,err,wouldblock)\
    128     accept_s=accept(s,NULL,NULL);\
    129     ok=(accept_s!=(-1));\
    130     if (!ok){err=errno;wouldblock=(err==EAGAIN||err==EWOULDBLOCK);}
    131 
    132 #define OsclSetNonBlocking(s,ok,err)\
    133     ok=(fcntl(s,F_SETFL,O_NONBLOCK)!=(-1));\
    134     if (!ok)err=errno
    135 
    136 #define OsclShutdown(s,how,ok,err)\
    137     ok=(shutdown(iSocket,how)!=(-1));\
    138     if (!ok)err=errno
    139 
    140 #define OsclSocket(s,fam,type,prot,ok,err)\
    141     s=socket(fam,type,prot);\
    142     ok=(s!=(-1));\
    143     if (!ok)err=errno
    144 
    145 #define OsclSendTo(s,buf,len,addr,ok,err,nbytes,wouldblock)\
    146     TOsclSockAddr* tmpadr = &addr;\
    147     sockaddr* sadr = OSCL_STATIC_CAST(sockaddr*, tmpadr);\
    148     nbytes=sendto(s,(const void*)(buf),(size_t)(len),0,sadr,(socklen_t)sizeof(addr));\
    149     ok=(nbytes!=(-1));\
    150     if (!ok){err=errno;wouldblock=(err==EAGAIN||err==EWOULDBLOCK);}
    151 
    152 #define OsclSend(s,buf,len,ok,err,nbytes,wouldblock)\
    153     nbytes=send(s,(const void*)(buf),(size_t)(len),0);\
    154     ok=(nbytes!=(-1));\
    155     if (!ok){err=errno;wouldblock=(err==EAGAIN||err==EWOULDBLOCK);}
    156 
    157 #define OsclCloseSocket(s,ok,err)\
    158     ok=(close(s)!=(-1));\
    159     if (!ok)err=errno
    160 
    161 #define OsclConnect(s,addr,ok,err,wouldblock)\
    162     TOsclSockAddr* tmpadr = &addr;\
    163     sockaddr* sadr = OSCL_STATIC_CAST(sockaddr*, tmpadr);\
    164     ok=(connect(s,sadr,sizeof(addr))!=(-1));\
    165     if (!ok){err=errno;wouldblock=(err==EINPROGRESS);}
    166 
    167 #define OsclGetAsyncSockErr(s,ok,err)\
    168     int opterr;socklen_t optlen=sizeof(opterr);\
    169     ok=(getsockopt(s,SOL_SOCKET,SO_ERROR,(void *)&opterr,&optlen)!=(-1));\
    170     if(ok)err=opterr;else err=errno;
    171 
    172 //unix reports connect completion in write set in the getsockopt
    173 //error.
    174 #define OsclConnectComplete(s,wset,eset,success,fail,ok,err)\
    175     success=fail=false;\
    176     if (FD_ISSET(s,&eset))\
    177     {fail=true;OsclGetAsyncSockErr(s,ok,err);}\
    178     else if (FD_ISSET(s,&wset))\
    179     {OsclGetAsyncSockErr(s,ok,err);if (ok && err==0)success=true;else fail=true;}
    180 
    181 #define OsclRecv(s,buf,len,ok,err,nbytes,wouldblock)\
    182     nbytes=recv(s,(void *)(buf),(size_t)(len),0);\
    183     ok=(nbytes!=(-1));\
    184     if (!ok){err=errno;wouldblock=(err==EAGAIN);}
    185 
    186 #define OsclRecvFrom(s,buf,len,paddr,paddrlen,ok,err,nbytes,wouldblock)\
    187 {\
    188 void* p=paddr;\
    189 nbytes=recvfrom(s,(void*)(buf),(size_t)(len),0,(struct sockaddr*)p,paddrlen);\
    190     ok=(nbytes!=(-1));\
    191     if (!ok){err=errno;wouldblock=(err==EAGAIN);}\
    192 }
    193 
    194 
    195 #define OsclSocketSelect(nfds,rd,wr,ex,timeout,ok,err,nhandles)\
    196     nhandles=select(nfds,&rd,&wr,&ex,&timeout);\
    197     ok=(nhandles!=(-1));\
    198     if (!ok)err=errno
    199 
    200 //there's not really any socket startup needed on unix, but
    201 //you need to define a signal handler for SIGPIPE to avoid
    202 //broken pipe crashes.
    203 #define OsclSocketStartup(ok)\
    204     signal(SIGPIPE,SIG_IGN);\
    205     ok=true
    206 
    207 #define OsclSocketCleanup(ok)\
    208     signal(SIGPIPE,SIG_DFL);\
    209     ok=true
    210 
    211 //hostent type
    212 typedef struct hostent TOsclHostent;
    213 
    214 //wrapper for gethostbyname
    215 #define OsclGethostbyname(name,hostent,ok,err)\
    216     hostent=gethostbyname((const char*)name);\
    217     ok=(hostent!=NULL);\
    218     if (!ok)err=errno;
    219 
    220 //extract dotted address from a hostent
    221 #define OsclGetDottedAddr(hostent,dottedaddr,ok)\
    222     long *_hostaddr=(long*)hostent->h_addr_list[0];\
    223     struct in_addr _inaddr;\
    224     _inaddr.s_addr=*_hostaddr;\
    225     dottedaddr=inet_ntoa(_inaddr);\
    226     ok=(dottedaddr!=NULL);
    227 
    228 //socket shutdown codes
    229 #define OSCL_SD_RECEIVE SHUT_RD
    230 #define OSCL_SD_SEND SHUT_WR
    231 #define OSCL_SD_BOTH SHUT_RDWR
    232 
    233 //address family codes
    234 #define OSCL_AF_INET AF_INET
    235 
    236 //socket type codes
    237 #define OSCL_SOCK_STREAM SOCK_STREAM
    238 #define OSCL_SOCK_DATAGRAM SOCK_DGRAM
    239 
    240 //IP protocol codes
    241 #define OSCL_IPPROTO_TCP IPPROTO_TCP
    242 #define OSCL_IPPROTO_UDP IPPROTO_UDP
    243 
    244 //End sockets
    245 // file IO support
    246 #if (OSCL_HAS_LARGE_FILE_SUPPORT)
    247 #define _FILE_OFFSET_BITS 64
    248 typedef off_t TOsclFileOffset;
    249 #else
    250 typedef int32 TOsclFileOffset;
    251 #endif
    252 
    253 #include "osclconfig_io_check.h"
    254 
    255 #endif
    256 
    257