fio.h
来自「著名的 helix realplayer 基于手机 symbian 系统的 播放」· C头文件 代码 · 共 395 行
H
395 行
/* ***** BEGIN LICENSE BLOCK *****
* Version: RCSL 1.0/RPSL 1.0
*
* Portions Copyright (c) 1995-2002 RealNetworks, Inc. All Rights Reserved.
*
* The contents of this file, and the files included with this file, are
* subject to the current version of the RealNetworks Public Source License
* Version 1.0 (the "RPSL") available at
* http://www.helixcommunity.org/content/rpsl unless you have licensed
* the file under the RealNetworks Community Source License Version 1.0
* (the "RCSL") available at http://www.helixcommunity.org/content/rcsl,
* in which case the RCSL will apply. You may also obtain the license terms
* directly from RealNetworks. You may not use this file except in
* compliance with the RPSL or, if you have a valid RCSL with RealNetworks
* applicable to this file, the RCSL. Please see the applicable RPSL or
* RCSL for the rights, obligations and limitations governing use of the
* contents of the file.
*
* This file is part of the Helix DNA Technology. RealNetworks is the
* developer of the Original Code and owns the copyrights in the portions
* it created.
*
* This file, and the files included with this file, is distributed and made
* available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
* EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS ALL SUCH WARRANTIES,
* INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS
* FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
*
* Technology Compatibility Kit Test Suite(s) Location:
* http://www.helixcommunity.org/content/tck
*
* Contributor(s):
*
* ***** END LICENSE BLOCK ***** */
#ifndef _MACFIO_H_
#define _MACFIO_H_
#include <stdlib.h>
#include "bio.h"
#include "macFD.h"
#include "CMacFile.h"
#include "assert.h"
#ifdef _MAC_MACHO
#include <sys/stat.h>
#else
#include "stat.h"
#include "errno.h"
#include "oterrs.h"
//#define OTUNIXERRORS 1
//#include "OpenTransport.h"
#include "MacTCP.h"
#endif
extern Boolean gFDInitialized;
class FileIO : public IO
{
public:
FileIO(const char* file, LONG32 flags,
mode_t mode = 0666);
~FileIO();
virtual LONG32 close();
virtual LONG32 read(void* buf, LONG32 size);
virtual LONG32 write(const void* buf, LONG32 size);
virtual off_t seek(off_t off, LONG32 whence);
virtual LONG32 error();
virtual LONG32 flags();
virtual off_t file_size();
int status(struct stat *st); //mac
static void local_path(char* path);
#ifdef _MAC_MACHO
#define MAXPATH 1024
#else
static const enum { MAXPATH = 1024 };
#endif
static const char PATH_SEP;
static int is_directory(char* path);
static const char* NEWLINE;
static int UNIXError(OSErr theErr);
protected:
int fd;
LONG32 err;
LONG32 _flags;
private:
void *mFile; // pointer to the actual Mac file object
};
#ifndef _CARBON
#define ENFILE 23 /* Too many open files in system */
#define ENOSPC 28 /* No space left on device */
#endif
#define EROFS 30 /* Read-only file system */
inline int
FileIO::UNIXError(OSErr theErr)
{
int err;
switch(theErr)
{
case noErr:
case eofErr:
err = 0;
break;
case permErr:
err = EACCES;
break;
case fBsyErr:
err = EBUSY;
break;
case dupFNErr:
err = EEXIST;
break;
case ioErr:
err = EIO;
break;
case tmfoErr:
err = ENFILE;
break;
case fnfErr:
err = ENOENT;
break;
case dskFulErr:
err = ENOSPC;
break;
case wPrErr:
err = EROFS;
break;
#ifndef _MAC_MACHO
case ipBadLapErr:
case ipBadCnfgErr:
case ipNoCnfgErr:
case ipLoadErr:
case ipBadAddr:
err = ENXIO; /* device not configured */ /* a cheap cop out */
break;
case connectionClosing:
err = ESHUTDOWN; /* Can't send after socket shutdown */
break;
case connectionExists:
err = EISCONN; /* Socket is already connected */
break;
case connectionTerminated:
err = ENOTCONN; /* Connection reset by peer */ /* one of many possible */
break;
case openFailed:
err = ECONNREFUSED; /* Connection refused */
break;
case duplicateSocket: /* technically, duplicate port */
err = EADDRINUSE; /* Address already in use */
break;
case ipDestDeadErr:
err = EHOSTDOWN; /* Host is down */
break;
case ipRouteErr:
err = EHOSTUNREACH; /* No route to host */
break;
#endif
default:
err = EINVAL; /* cop out; an internal err, unix err, or no err */
break;
}
return err;
}
inline
FileIO::FileIO(const char* file, LONG32 flags, mode_t mode)
{
if (gFDInitialized == FALSE)
{
init_fds();
}
mFile = NULL;
fd = -1;
// create a new CMacFile object
CMacFile *theFile = new CMacFile;
OSErr theErr = noErr;
// get a file descriptor and register the CMacFile object as its owner
if(theFile)
{
fd = get_free_fd();
assert(fd != -1);
if(fd != -1)
{
fd_register(fd, (void *)theFile,FD_FILE);
}
}
if(theFile && fd != -1)
theErr = theFile->Open(file, flags);
if(!theErr && theFile && fd != -1 && flags & O_RDONLY)
{
theFile->set_buffered_read(TRUE);
}
if(!theErr && theFile && fd != -1)
{
_flags = flags;
mFile = theFile;
}
if(theErr)
{
free_fd(fd);
if(mFile)
delete mFile;
mFile = NULL;
fd = -1;
}
err = UNIXError(theErr);
}
inline LONG32
FileIO::close()
{
if(fd >= 0)
{
free_fd(fd);
fd = -1;
}
return 0;
}
inline
FileIO::~FileIO()
{
if(mFile)
{
CMacFile *temp = (CMacFile *)mFile;
delete temp;
}
if (fd >= 0)
close();
fd = -1;
}
inline off_t
FileIO::seek(off_t off, LONG32 whence)
{
CMacFile *temp = (CMacFile *)mFile;
if(fd == -1 || temp == NULL)
{
err = EINVAL;
return -1;
}
OSErr theErr = temp->Seek(off,whence);
err = UNIXError(theErr);
return (theErr != 0 ? (off_t) -1 : off);
}
inline LONG32
FileIO::read(void * buf, LONG32 len)
{
CMacFile *temp = (CMacFile *)mFile;
if(fd == -1 || temp == NULL)
{
err = EINVAL;
return -1;
}
INT32 actualLen = 0;
OSErr theErr = temp->Read((char *)buf,len,&actualLen);
err = UNIXError(theErr);
return actualLen;
}
inline LONG32
FileIO::write(const void * buf, LONG32 len)
{
CMacFile *temp = (CMacFile *)mFile;
if(fd == -1 || temp == NULL)
{
err = EINVAL;
return -1;
}
INT32 actualLen = 0;
OSErr theErr = temp->Write((char *)buf,len,&actualLen);
err = UNIXError(theErr);
return actualLen;
}
// Note: status only implements file size (st_size)
inline int
FileIO::status(struct stat* st) {
CMacFile *temp = (CMacFile *)mFile;
if(fd == -1 || temp == NULL)
{
err = EINVAL;
return -1;
}
long theSize;
OSErr theErr = temp->FileSize(&theSize);
st->st_size = theSize;
err = UNIXError(theErr);
return err;
}
inline off_t
FileIO::file_size()
{
struct stat st;
if (status(&st) < 0)
{
return (off_t)-1;
}
return st.st_size;
}
inline LONG32
FileIO::error()
{
return err;
}
inline LONG32
FileIO::flags()
{
return _flags;
}
inline void
FileIO::local_path(char* path)
{
}
inline int
FileIO::is_directory(char* path)
{
#ifdef UNIMPLEMENTED
struct _stat st;
if (_stat(path, &st) < 0)
{
return 0;
}
return st.st_mode & S_IFDIR;
#endif
return 0;
}
#endif /* _MACFIO_H_ */
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?