sl@0: // Copyright (c) 1998-2009 Nokia Corporation and/or its subsidiary(-ies). sl@0: // All rights reserved. sl@0: // This component and the accompanying materials are made available sl@0: // under the terms of "Eclipse Public License v1.0" sl@0: // which accompanies this distribution, and is available sl@0: // at the URL "http://www.eclipse.org/legal/epl-v10.html". sl@0: // sl@0: // Initial Contributors: sl@0: // Nokia Corporation - initial contribution. sl@0: // sl@0: // Contributors: sl@0: // sl@0: // Description: sl@0: // sl@0: sl@0: #include sl@0: #include sl@0: #include sl@0: #include sl@0: #include "ENVIRON.H" sl@0: #include sl@0: #include sl@0: sl@0: sl@0: class MSystemInterface sl@0: /** sl@0: @internalComponent sl@0: */ sl@0: { sl@0: public: sl@0: virtual MSystemInterface& Clone()=0; sl@0: virtual void Release()=0; sl@0: virtual void TerminateProcess(int status)=0; sl@0: sl@0: virtual int dup (int fid, int& anErrno)=0; sl@0: virtual int dup2 (int fid, int fid2, int& anErrno)=0; sl@0: virtual int open (const wchar_t* name, int mode, int perms, int& anErrno)=0; sl@0: virtual int read (int fid, char* buf, unsigned long len, int& anErrno)=0; sl@0: virtual int write (int fid, const char* buf, unsigned long len, int& anErrno)=0; sl@0: virtual int fsync (int fid, int& anErrno)=0; sl@0: virtual int close (int fid, int& anErrno)=0; sl@0: virtual int lseek (int fid, int offset, int whence, int& anErrno)=0; sl@0: virtual int fstat (int fid, struct stat* st, int& anErrno)=0; sl@0: virtual int ioctl (int fid, int cmd, void* param, int& anErrno)=0; sl@0: virtual int ioctl (int fid, int cmd, void* param, TRequestStatus& aStatus, int& anErrno)=0; sl@0: virtual int ioctl_complete (int fid, int cmd, void* param, TRequestStatus& aStatus, int& anErrno)=0; sl@0: virtual int ioctl_cancel (int fid, int& anErrno)=0; sl@0: sl@0: virtual wchar_t * getcwd (wchar_t * buf, unsigned long len, int& anErrno)=0; sl@0: virtual int chdir (const wchar_t* path, int& anErrno)=0; sl@0: virtual int mkdir (const wchar_t* path, int perms, int& anErrno)=0; sl@0: virtual int rmdir (const wchar_t* path, int& anErrno)=0; sl@0: virtual int chmod (const wchar_t* path, int perms, int& anErrno)=0; sl@0: virtual int unlink (const wchar_t* path, int& anErrno)=0; sl@0: virtual int stat (const wchar_t* name, struct stat* st, int& anErrno)=0; sl@0: virtual int rename (const wchar_t* oldname, const wchar_t* newname, int& anErrno)=0; sl@0: sl@0: virtual TInt ResolvePath (TParse& aResult, const wchar_t* path, TDes* aFilename)=0; sl@0: sl@0: virtual int socket (int family, int style, int protocol, int& anErrno)=0; sl@0: virtual int recvfrom (int fd, char* buf, unsigned long cnt, int flags, struct sockaddr* from, unsigned long* fromsize, int& anErrno)=0; sl@0: virtual int sendto (int fd, const char* buf, unsigned long cnt, int flags, struct sockaddr* to, unsigned long tosize, int& anErrno)=0; sl@0: virtual int shutdown (int fd, int how, int& anErrno)=0; sl@0: virtual int listen (int fd, int n, int& anErrno)=0; sl@0: virtual int accept (int fd, int& anErrno)=0; sl@0: virtual int bind (int fd, struct sockaddr* addr, unsigned long size, int& anErrno)=0; sl@0: virtual int connect (int fd, struct sockaddr* addr, unsigned long size, int& anErrno)=0; sl@0: virtual int sockname (int fd, struct sockaddr* addr, unsigned long* size, int anEnd, int& anErrno)=0; sl@0: virtual int getsockopt (int fd, int level, int opt, void* buf, unsigned long* len, int& anErrno)=0; sl@0: virtual int setsockopt (int fd, int level, int opt, void* buf, unsigned long len, int& anErrno)=0; sl@0: sl@0: virtual wchar_t* getenv (const wchar_t* name)=0; sl@0: virtual void unsetenv (const wchar_t* name)=0; sl@0: virtual int setenv (const wchar_t* name, const wchar_t* value, int rewrite, int& anErrno)=0; sl@0: sl@0: virtual int popen3 (const wchar_t *file, const wchar_t *cmd, const wchar_t *mode, wchar_t** envp, int fids[3], int& anErrno)=0; sl@0: virtual int waitpid (int pid, int* status, int options, int& anErrno)=0; sl@0: }; sl@0: sl@0: class CFileDescBase; sl@0: class CFileTable sl@0: /** sl@0: @internalComponent sl@0: */ sl@0: { sl@0: public: sl@0: CFileTable(); sl@0: ~CFileTable(); sl@0: sl@0: void InitL(); sl@0: void Close(); sl@0: void Default(CFileDescBase* aConsole); sl@0: TInt Reserve(); sl@0: TInt Attach(TInt aFid, CFileDescBase* aFile); sl@0: TInt Detach(TInt aFid, CFileDescBase*& aDetached); sl@0: TInt At(TInt aFid, CFileDescBase*& aFound) const; sl@0: TInt Reserve(TInt aFids[3]); sl@0: TInt Detach(TInt aFids[3]); sl@0: sl@0: int dup (int fid, int& anErrno); sl@0: int dup2 (int fid, int fid2, int& anErrno); sl@0: // int open (const wchar_t* name, int mode, int perms, int& anErrno, RFs& aFs); sl@0: int open (const wchar_t* name, int mode, int perms, int& anErrno, RSessionBase& aFs); sl@0: int close (int fid, int& anErrno); sl@0: sl@0: int userclose (int fid, int& anErrno); sl@0: sl@0: int lseek (int fid, int offset, int whence, int& anErrno); sl@0: int fstat (int fid, struct stat* st, int& anErrno); sl@0: int socket (int family, int style, int protocol, int& anErrno, RSocketServ& aSs); sl@0: int listen (int fd, int n, int& anErrno); sl@0: int bind (int fd, TSockAddr& address, int& anErrno); sl@0: int sockname (int fd, TSockAddr& address, int anEnd, int& anErrno); sl@0: int getsockopt (int fd, int level, int opt, void* buf, unsigned long* len, int& anErrno); sl@0: int setsockopt (int fd, int level, int opt, void* buf, unsigned long len, int& anErrno); sl@0: int ioctlcomplete (int fid, int cmd, void* param, TRequestStatus& aStatus, int& anErrno); sl@0: int ioctlcancel (int fid, int& anErrno); sl@0: sl@0: TInt Asynch (int fid, CFileDescBase*& aFile); sl@0: sl@0: private: sl@0: CArrayPtrSeg iFids; sl@0: TInt Dup(TInt& aFid); sl@0: TInt Dup2(TInt aFid, TInt aFid2); sl@0: void Release(TInt aFid); sl@0: }; sl@0: sl@0: class PosixFilesystem sl@0: /** sl@0: @internalComponent sl@0: */ sl@0: { sl@0: public: sl@0: static wchar_t* getcwd (RFs& aFs, wchar_t* buf, unsigned long len, int& anErrno); sl@0: static int chdir (RFs& aFs, const wchar_t* path, int& anErrno); sl@0: static int mkdir (RFs& aFs, const wchar_t* path, int perms, int& anErrno); sl@0: static int rmdir (RFs& aFs, const wchar_t* path, int& anErrno); sl@0: static int chmod (RFs& aFs, const wchar_t* path, int perms, int& anErrno); sl@0: static int unlink (RFs& aFs, const wchar_t* path, int& anErrno); sl@0: static int stat (RFs& aFs, const wchar_t* name, struct stat* st, int& anErrno); sl@0: static int rename (RFs& aFs, const wchar_t* oldname, const wchar_t* newname, int& anErrno); sl@0: static TInt ResolvePath (RFs& aFs, TParse& aResult, const wchar_t* path, TDes* aFilename); sl@0: static TInt SetDefaultDir (RFs& aFs); sl@0: }; sl@0: sl@0: NONSHARABLE_CLASS(CLocalSystemInterface) : public CBase, public MSystemInterface sl@0: /** sl@0: To make CleanupStack::PushL() and CleanupStack::Pop() work properly in the 2-phase constructor, sl@0: derivation order must be: public CBase, public MSystemInterface. sl@0: sl@0: @internalComponent sl@0: */ sl@0: { sl@0: public: sl@0: static CLocalSystemInterface* NewL(); sl@0: ~CLocalSystemInterface(); sl@0: sl@0: virtual MSystemInterface& Clone(); sl@0: virtual void Release(); sl@0: virtual void TerminateProcess(int status); sl@0: sl@0: virtual int dup (int fid, int& anErrno); sl@0: virtual int dup2 (int fid, int fid2, int& anErrno); sl@0: virtual int open (const wchar_t* name, int mode, int perms, int& anErrno); sl@0: virtual int read (int fid, char* buf, unsigned long len, int& anErrno); sl@0: virtual int write (int fid, const char* buf, unsigned long len, int& anErrno); sl@0: virtual int fsync (int fid, int& anErrno); sl@0: virtual int close (int fid, int& anErrno); sl@0: virtual int lseek (int fid, int offset, int whence, int& anErrno); sl@0: virtual int fstat (int fid, struct stat* st, int& anErrno); sl@0: virtual int ioctl (int fid, int cmd, void* param, int& anErrno); sl@0: virtual int ioctl (int fid, int cmd, void* param, TRequestStatus& aStatus, int& anErrno); sl@0: virtual int ioctl_complete (int fid, int cmd, void* param, TRequestStatus& aStatus, int& anErrno); sl@0: virtual int ioctl_cancel (int fid, int& anErrno); sl@0: sl@0: virtual wchar_t* getcwd (wchar_t* buf, unsigned long len, int& anErrno); sl@0: sl@0: sl@0: virtual int chdir (const wchar_t* path, int& anErrno); sl@0: virtual int mkdir (const wchar_t* path, int perms, int& anErrno); sl@0: virtual int rmdir (const wchar_t* path, int& anErrno); sl@0: virtual int chmod (const wchar_t* path, int perms, int& anErrno); sl@0: virtual int unlink (const wchar_t* path, int& anErrno); sl@0: virtual int stat (const wchar_t* name, struct stat* st, int& anErrno); sl@0: virtual int rename (const wchar_t* oldname, const wchar_t* newname, int& anErrno); sl@0: sl@0: virtual TInt ResolvePath (TParse& aResult, const wchar_t* path, TDes* aFilename); sl@0: sl@0: virtual int socket (int family, int style, int protocol, int& anErrno); sl@0: virtual int recvfrom (int fd, char* buf, unsigned long cnt, int flags, struct sockaddr* from, unsigned long* fromsize, int& anErrno); sl@0: virtual int sendto (int fd, const char* buf, unsigned long cnt, int flags, struct sockaddr* to, unsigned long tosize, int& anErrno); sl@0: virtual int shutdown (int fd, int how, int& anErrno); sl@0: virtual int listen (int fd, int n, int& anErrno); sl@0: virtual int accept (int fd, int& anErrno); sl@0: virtual int bind (int fd, struct sockaddr* addr, unsigned long size, int& anErrno); sl@0: virtual int connect (int fd, struct sockaddr* addr, unsigned long size, int& anErrno); sl@0: virtual int sockname (int fd, struct sockaddr* addr, unsigned long* size, int anEnd, int& anErrno); sl@0: virtual int getsockopt (int fd, int level, int opt, void* buf, unsigned long* len, int& anErrno); sl@0: virtual int setsockopt (int fd, int level, int opt, void* buf, unsigned long len, int& anErrno); sl@0: sl@0: virtual wchar_t* getenv (const wchar_t* name); sl@0: virtual void unsetenv (const wchar_t* name); sl@0: virtual int setenv (const wchar_t* name, const wchar_t* value, int rewrite, int& anErrno); sl@0: sl@0: virtual int popen3 (const wchar_t *file, const wchar_t *cmd, const wchar_t *mode, wchar_t** envp, int fids[3], int& anErrno); sl@0: virtual int waitpid (int pid, int* status, int options, int& anErrno); sl@0: sl@0: private: sl@0: CLocalSystemInterface(); sl@0: void ConstructL(); sl@0: sl@0: private: sl@0: TInt iUseCount; sl@0: CFileTable iFids; sl@0: RFs iFs; sl@0: RSocketServ iSs; sl@0: sl@0: RCommServ iCs; sl@0: sl@0: CEnvironment iEnv; sl@0: }; sl@0: sl@0: #include sl@0: /** sl@0: @internalComponent sl@0: */ sl@0: inline MSystemInterface& Interface(struct _reent* r) sl@0: { return (*REINTERPRET_CAST(MSystemInterface*,r->_system)); }