// ========================================================== // FreeImageIO.Net // // Design and implementation by // - Marcos Pernambuco Motta (marcos.pernambuco@gmail.com) // // This file is part of FreeImage 3 // // COVERED CODE IS PROVIDED UNDER THIS LICENSE ON AN "AS IS" BASIS, WITHOUT WARRANTY // OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, WITHOUT LIMITATION, WARRANTIES // THAT THE COVERED CODE IS FREE OF DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE // OR NON-INFRINGING. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE COVERED // CODE IS WITH YOU. SHOULD ANY COVERED CODE PROVE DEFECTIVE IN ANY RESPECT, YOU (NOT // THE INITIAL DEVELOPER OR ANY OTHER CONTRIBUTOR) ASSUME THE COST OF ANY NECESSARY // SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER OF WARRANTY CONSTITUTES AN ESSENTIAL // PART OF THIS LICENSE. NO USE OF ANY COVERED CODE IS AUTHORIZED HEREUNDER EXCEPT UNDER // THIS DISCLAIMER. // // Use at your own risk! // ========================================================== #include "stdafx.h" #include "FreeImageIO.Net.h" extern "C" static unsigned __stdcall ReadProc (void *buffer, unsigned size, unsigned count, fi_handle handle) { int total_read = 0; struct UNMANAGED_HANDLER* puh = (struct UNMANAGED_HANDLER*)handle; gcroot mbuffer = new unsigned char __gc[size]; try { total_read = puh->_stream->Read(mbuffer,0,size); Marshal::Copy(mbuffer,0,buffer,total_read); } __finally { mbuffer=NULL; } return (unsigned)total_read; } extern "C" static unsigned __stdcall WriteProc (void *buffer, unsigned size, unsigned count, fi_handle handle) { struct UNMANAGED_HANDLER* puh = (struct UNMANAGED_HANDLER*)handle; gcroot mbuffer = new unsigned char __gc[size*count]; try { unsigned char __pin* pbuffer = &mbuffer[0]; memcpy(pbuffer,buffer,size*count); puh->_stream->Write(mbuffer,0,size); } __finally { mbuffer=NULL; } return count; } extern "C" static int __stdcall SeekProc (fi_handle handle, long offset, int origin) { struct UNMANAGED_HANDLER* puh = (struct UNMANAGED_HANDLER*)handle; return (int)puh->_stream->Seek(offset,(SeekOrigin) origin); } extern "C" static long __stdcall TellProc(fi_handle handle) { struct UNMANAGED_HANDLER* puh = (struct UNMANAGED_HANDLER*)handle; return (long)puh->_stream->Position; }