/////////////////////////////////////////////////////////////////////// // FileHdlr.cpp - In-Process COM file handler // // // // Jim Fawcett, CSE775 - Distributed Objects, Spring 2007 // /////////////////////////////////////////////////////////////////////// #include "stdafx.h" #include #include "FileHdlr.h" #include "FileInfo.h" #include #include STDMETHODIMP CFileHdlr::SetReadPath(BSTR path) { _ReadPath = path; std::wcout << L"\n setting path: " << (BSTR)_ReadPath; return S_OK; } STDMETHODIMP CFileHdlr::SetWritePath(BSTR path) { _WritePath = path; std::wcout << L"\n setting path: " << (BSTR)_WritePath; return S_OK; } STDMETHODIMP CFileHdlr::GetFiles(SAFEARRAY ** files) { CComSafeArray _files; fileInfo f; f.setPath((BSTR)_ReadPath); if(!f.firstFile(L"*.*")) return S_OK; _files.Add(CComBSTR(f.name().c_str())); while(f.nextFile()) { _files.Add(CComBSTR(f.name().c_str())); } f.closeFile(); *files = _files.Detach(); return S_OK; } STDMETHODIMP CFileHdlr::PutBlock(int size, BYTE* fileBlock) { DWORD numBytesWritten; ::WriteFile(_hWriteFile,fileBlock,size,&numBytesWritten,NULL); return S_OK; } STDMETHODIMP CFileHdlr::GetBlock(int* pSize, BYTE** pFileBlock) { DWORD numBytesRead; BYTE* pBuffer = (BYTE*)CoTaskMemAlloc(1025); ::ReadFile(_hReadFile,pBuffer,1024,&numBytesRead,NULL); *pSize = numBytesRead; *pFileBlock = pBuffer; if(numBytesRead < 1024) pBuffer[numBytesRead] = 0; if(numBytesRead > 0) return S_OK; return E_FAIL; } // STDMETHODIMP CFileHdlr::OpenFileReader(BSTR file) { _hReadFile = CreateFile( file,GENERIC_READ, FILE_SHARE_READ,NULL,OPEN_EXISTING, FILE_FLAG_SEQUENTIAL_SCAN,NULL ); if(_hReadFile != INVALID_HANDLE_VALUE) { return S_OK; } return E_FAIL; } STDMETHODIMP CFileHdlr::OpenFileWriter(BSTR file) { CComBSTR _file(_WritePath); _file.Append(L"/"); _file.Append(file); _hWriteFile = CreateFile( _file,GENERIC_WRITE, 0,NULL,CREATE_ALWAYS, FILE_FLAG_SEQUENTIAL_SCAN,NULL ); if(_hWriteFile != INVALID_HANDLE_VALUE) { return S_OK; } return E_FAIL; } STDMETHODIMP CFileHdlr::CloseFileReader(BSTR file) { CloseHandle(_hReadFile); return S_OK; } STDMETHODIMP CFileHdlr::CloseFileWriter(BSTR file) { CloseHandle(_hWriteFile); return S_OK; }