AmigaFileStream.h
上传用户:hy_wanghao
上传日期:2007-01-08
资源大小:279k
文件大小:5k
- #if !defined(AFX_AMIGAFILESTREAM_H__20001229_27CD_6704_50F9_0080AD509054__INCLUDED_)
- #define AFX_AMIGAFILESTREAM_H__20001229_27CD_6704_50F9_0080AD509054__INCLUDED_
- #if _MSC_VER > 1000
- #pragma once
- #endif // _MSC_VER > 1000
- /////////////////////////////////////////////////////////////////////////////
- // CAmigaFileStream
- // This IStream implementation wraps a file from the Amiga device.
- // It is used to pass files onto the clipboard.
- // Only the basic methods need implementation because the Shell
- // doesn't use much of the IStream functionality.
- class CAmigaFileStream :
- public CComObjectRootEx<CComSingleThreadModel>,
- public IStream
- {
- public:
- BEGIN_COM_MAP(CAmigaFileStream)
- COM_INTERFACE_ENTRY(IStream)
- COM_INTERFACE_ENTRY(ISequentialStream)
- END_COM_MAP()
- CAdfDevice m_dev;
- CAdfVolume m_vol;
- CAdfFile m_file;
- HRESULT _Init(LPCITEMIDLIST pidlDevPath, LPCTSTR pstrPath, LPCTSTR pstrFileName)
- {
- ATLASSERT(pidlDevPath);
- ATLASSERT(pstrPath);
- ATLASSERT(pstrFileName);
- HRESULT Hr;
- CShellPidlPath sDevPath(pidlDevPath);
- HR( ::OpenAmigaDevice(sDevPath, TRUE, NULL, m_dev, m_vol) );
- if( m_vol.ChangeDirectory(pstrPath)==FALSE ) return E_FAIL;
- if( m_vol.GetFile( pstrFileName, _T("r"), m_file )==FALSE ) return E_FAIL;
- return S_OK;
- }
- STDMETHOD(Read)(LPVOID pv, ULONG cb, ULONG *pcbRead)
- {
- if( pcbRead!=NULL ) *pcbRead = 0;
- if( !m_file.IsOpen() ) return E_FAIL;
- if( m_file.Eof() ) return S_FALSE;
- if( m_file.GetSize()==0 ) return S_FALSE;
- ULONG act = m_file.Read(pv, cb);
- if( pcbRead!=NULL ) *pcbRead = act;
- return act>0 ? S_OK : S_FALSE;
- }
- STDMETHOD(Write)(LPCVOID /*pv*/, ULONG /*cb*/, ULONG *pcbWritten)
- {
- if( pcbWritten!=NULL ) *pcbWritten = 0;
- ATLTRACENOTIMPL(_T("CAmigaFileStream::Write"));
- }
- STDMETHOD(Seek)(LARGE_INTEGER dlibMove,
- DWORD dwOrigin,
- ULARGE_INTEGER *plibNewPosition)
- {
- ATLTRACE(_T("CAmigaFileStream::Seekn"));
- switch( dwOrigin ) {
- case STREAM_SEEK_SET:
- m_file.Seek(dlibMove.LowPart);
- break;
- case STREAM_SEEK_CUR:
- m_file.Seek(m_file.GetPos()+dlibMove.LowPart);
- break;
- case STREAM_SEEK_END:
- m_file.Seek(m_file.GetSize()-dlibMove.LowPart);
- break;
- }
- if( plibNewPosition!=NULL ) plibNewPosition->QuadPart = m_file.GetPos();
- return S_OK;
- }
- STDMETHOD(SetSize)(ULARGE_INTEGER /*libNewSize*/)
- {
- ATLTRACENOTIMPL(_T("CAmigaFileStream::SetSize"));
- }
- // Apparently the Shell calls this because it needs
- // to marshal the IStream between two Explorer processes.
- STDMETHOD(CopyTo)(
- IStream *pstm,
- ULARGE_INTEGER cb,
- ULARGE_INTEGER *pcbRead,
- ULARGE_INTEGER *pcbWritten)
- {
- ATLTRACE(_T("CAmigaFileStream::CopyTon"));
- ATLASSERT(pstm);
- const int COPYBUFFERSIZE = 400;
- HRESULT Hr;
- ULARGE_INTEGER size = { 0 };
- if( pcbRead!=NULL ) pcbRead->QuadPart = 0;
- if( pcbWritten!=NULL ) pcbWritten->QuadPart = 0;
- while( cb.QuadPart>0 ) {
- BYTE buf[COPYBUFFERSIZE];
- DWORD dwRead;
- HR( Read(buf, COPYBUFFERSIZE, &dwRead) );
- if( Hr==S_FALSE ) break; // No more to read! Stop!
- DWORD dwWritten;
- HR( pstm->Write(buf, dwRead, &dwWritten) );
- ATLASSERT(dwRead==dwWritten); // BUG: Don't assume this
- cb.QuadPart -= dwWritten;
- size.QuadPart += dwWritten;
- }
- if( pcbRead!=NULL ) pcbRead->QuadPart = size.QuadPart;
- if( pcbWritten!=NULL ) pcbWritten->QuadPart = size.QuadPart;
- return S_OK;
- }
- STDMETHOD(Commit)(DWORD /*grfCommitFlags*/)
- {
- ATLTRACENOTIMPL(_T("CAmigaFileStream::Commit"));
- }
- STDMETHOD(Revert)(void)
- {
- ATLTRACENOTIMPL(_T("CAmigaFileStream::Revert"));
- }
- STDMETHOD(LockRegion)(
- ULARGE_INTEGER /*libOffset*/,
- ULARGE_INTEGER /*cb*/,
- DWORD /*dwLockType*/)
- {
- ATLTRACENOTIMPL(_T("CAmigaFileStream::LockRegion"));
- }
- STDMETHOD(UnlockRegion)(
- ULARGE_INTEGER /*libOffset*/,
- ULARGE_INTEGER /*cb*/,
- DWORD /*dwLockType*/)
- {
- ATLTRACENOTIMPL(_T("CAmigaFileStream::UnlockRegion"));
- }
- STDMETHOD(Stat)(STATSTG* /*pstatstg*/, DWORD /*grfStatFlag*/)
- {
- ATLTRACENOTIMPL(_T("CAmigaFileStream::Stat"));
- }
- STDMETHOD(Clone)(IStream** /*ppstm*/)
- {
- ATLTRACENOTIMPL(_T("CAmigaFileStream::Clone"));
- }
- };
- #endif // !defined(AFX_AMIGAFILESTREAM_H__20001229_27CD_6704_50F9_0080AD509054__INCLUDED_)