/*********************************************************************** * LZCopy (KERNEL32.@) * * Copies everything from src to dest * if src is a LZ compressed file, it will be uncompressed. * will return the number of bytes written to dest or errors. */ LONG WINAPI LZCopy( HFILE src, HFILE dest ) { int usedlzinit = 0, ret, wret; LONG len; HFILE oldsrc = src, srcfd; FILETIME filetime; struct lzstate *lzs; #define BUFLEN 1000 CHAR buf[BUFLEN]; /* we need that weird typedef, for i can't seem to get function pointer * casts right. (Or they probably just do not like WINAPI in general) */ typedef UINT (WINAPI *_readfun)(HFILE,LPVOID,UINT); _readfun xread; TRACE("(%d,%d)\n",src,dest); if (!IS_LZ_HANDLE(src)) { src = LZInit(src); if ((INT)src <= 0) return 0; if (src != oldsrc) usedlzinit=1; } /* not compressed? just copy */ if (!IS_LZ_HANDLE(src)) #ifdef __REACTOS__ xread=(_readfun)_hread; // ROSHACK #else xread=_lread; #endif else
/*********************************************************************** * LZCopy (KERNEL32.@) * * Copies everything from src to dest * if src is a LZ compressed file, it will be uncompressed. * will return the number of bytes written to dest or errors. */ LONG WINAPI LZCopy( HFILE src, HFILE dest ) { int usedlzinit = 0, ret, wret; LONG len; HFILE oldsrc = src, srcfd; FILETIME filetime; struct lzstate *lzs; #define BUFLEN 1000 CHAR buf[BUFLEN]; /* we need that weird typedef, for i can't seem to get function pointer * casts right. (Or they probably just do not like WINAPI in general) */ typedef UINT (WINAPI *_readfun)(HFILE,LPVOID,UINT); _readfun xread; DPRINT("(%d,%d)\n",src,dest); if (!IS_LZ_HANDLE(src)) { src = LZInit(src); if ((INT)src <= 0) return 0; if (src != oldsrc) usedlzinit=1; } /* not compressed? just copy */ if (!IS_LZ_HANDLE(src)) xread=_lread; else xread=(_readfun)LZRead; len=0; while (1) { ret=xread(src,buf,BUFLEN); if (ret<=0) { if (ret==0) break; if (ret==-1) return LZERROR_READ; return ret; } len += ret; wret = _hwrite(dest,buf,ret); if (wret!=ret) return LZERROR_WRITE; } /* Maintain the timestamp of source file to destination file */ srcfd = (!(lzs = GET_LZ_STATE(src))) ? src : lzs->realfd; GetFileTime( LongToHandle(srcfd), NULL, NULL, &filetime ); SetFileTime( LongToHandle(dest), NULL, NULL, &filetime ); /* close handle */ if (usedlzinit) LZClose(src); return len; #undef BUFLEN }
/*********************************************************************** * LZInit (LZEXPAND.3) */ HFILE16 WINAPI LZInit16( HFILE16 hfSrc ) { HFILE ret = LZInit( (HFILE)DosFileHandleToWin32Handle(hfSrc) ); if (IS_LZ_HANDLE(ret)) return ret; if ((INT)ret <= 0) return ret; return hfSrc; }
/*********************************************************************** * LZCopy (LZEXPAND.1) * */ LONG WINAPI LZCopy16( HFILE16 src, HFILE16 dest ) { /* already a LZ handle? */ if (IS_LZ_HANDLE(src)) return LZCopy( src, (HFILE)DosFileHandleToWin32Handle(dest) ); /* no, try to open one */ src = LZInit16(src); if ((INT16)src <= 0) return 0; if (IS_LZ_HANDLE(src)) { LONG ret = LZCopy( src, (HFILE)DosFileHandleToWin32Handle(dest) ); LZClose( src ); return ret; } /* it was not a compressed file */ return LZCopy( (HFILE)DosFileHandleToWin32Handle(src), (HFILE)DosFileHandleToWin32Handle(dest) ); }
/*********************************************************************** * LZOpenFile (LZEXPAND.2) */ HFILE16 WINAPI LZOpenFile16( LPSTR fn, LPOFSTRUCT ofs, UINT16 mode ) { HFILE hfret = LZOpenFileA( fn, ofs, mode ); /* return errors and LZ handles unmodified */ if ((INT)hfret <= 0) return hfret; if (IS_LZ_HANDLE(hfret)) return hfret; /* but allocate a dos handle for 'normal' files */ return Win32HandleToDosFileHandle((HANDLE)hfret); }
/*********************************************************************** * LZSeek (LZEXPAND.4) */ LONG WINAPI LZSeek16( HFILE16 fd, LONG off, INT16 type ) { if (IS_LZ_HANDLE(fd)) return LZSeek( fd, off, type ); return _llseek( (HFILE)DosFileHandleToWin32Handle(fd), off, type ); }
/*********************************************************************** * LZRead (LZEXPAND.5) */ INT16 WINAPI LZRead16( HFILE16 fd, LPVOID buf, UINT16 toread ) { if (IS_LZ_HANDLE(fd)) return LZRead( fd, buf, toread ); return _lread( (HFILE)DosFileHandleToWin32Handle(fd), buf, toread ); }
/*********************************************************************** * LZClose (LZEXPAND.6) */ void WINAPI LZClose16( HFILE16 fd ) { if (IS_LZ_HANDLE(fd)) LZClose( fd ); else DisposeLZ32Handle( DosFileHandleToWin32Handle((HFILE)fd) ); }