Commits

Anonymous committed 7cfb032

CWS-TOOLING: integrate CWS tkr23
2009-07-21 15:03:57 +0200 tkr r274199 : #i64277# open file only if needed and close immediately after use
2009-07-17 12:25:41 +0200 tkr r274087 : #i96743# patch minizip to provide stream operations
2009-07-17 12:21:13 +0200 tkr r274086 : #i96743# add new ifilter interface: IPersistStream

Comments (0)

Files changed (23)

shell/inc/internal/basereader.hxx

 protected: // protected because its only an implementation relevant class
 	CBaseReader( const std::string& DocumentName );
 
+	CBaseReader( void* stream, zlib_filefunc_def* fa );
+
 	virtual void start_document();
 	
 	virtual void end_document();

shell/inc/internal/contentreader.hxx

 	//CContentReader( const std::string& DocumentName );
 	CContentReader( const std::string& DocumentName, LocaleSet_t const & DocumentLocale );
 
+	CContentReader( void* stream, LocaleSet_t const & DocumentLocale, zlib_filefunc_def* fa );
+
+
 	/** Get the chunkbuffer.
 
 		@return 

shell/inc/internal/metainforeader.hxx

 	virtual ~CMetaInfoReader();
 
 	CMetaInfoReader( const std::string& DocumentName );
+
+	CMetaInfoReader( void* stream, zlib_filefunc_def* fa);
+
 	/** check if the Tag is in the target meta.xml file.
 
 		@param TagName

shell/inc/internal/propsheets.hxx

 private:
 	long m_RefCnt;
 	char m_szFileName[MAX_PATH];
-	std::auto_ptr<CMetaInfoReader> m_pMetaInfo;
 };
 
 #endif 

shell/inc/internal/types.hxx

 #include <utility>
 #include <vector>
 #include <stack>
+#include <external/zlib/zlib.h>
+#include <external/zlib/ioapi.h>
+
 
 typedef std::vector<std::wstring> StringList_t;
 

shell/inc/internal/zipfile.hxx

 #define _WINDOWS
 #endif
 
-#include <external/zlib/unzip.h>
+
+#include <external/zlib/unzip.h>
+
 
 #include <string>
 #include <vector>
 			AccessViolationException if read access to the file is denied			
 	*/
 	static bool IsZipFile(const std::string& FileName);
+
+	static bool IsZipFile(void* stream);
+
 	
 	/** Returns wheter the version of the specified zip file may be uncompressed with the
 	      currently used zlib version or not
 	*/
 	static bool IsValidZipFileVersionNumber(const std::string& FileName);
 		
-	
+	static bool IsValidZipFileVersionNumber(void* stream);
+
 public:
 	
 	/** Constructs a zip file from a zip file
 			with the used zlib version
 	*/
 	ZipFile(const std::string& FileName);
+
+	ZipFile(void* stream, zlib_filefunc_def* fa);
+
 		
 	/** Destroys a zip file
 	*/

shell/source/all/makefile.mk

 TARGET=xmlparser
 ENABLE_EXCEPTIONS=TRUE
 
+
 # --- Settings -----------------------------------------------------
 
 .INCLUDE :  settings.mk
 .ENDIF
 
 SLOFILES=$(SLO)$/xml_parser.obj
+          
 .IF "$(BUILD_X64)"!=""
 SLOFILES_X64=$(SLO_X64)$/xml_parser.obj
 .ENDIF # "$(BUILD_X64)"!=""

shell/source/all/ooofilereader/basereader.cxx

 //
 //------------------------------
 
+CBaseReader::CBaseReader(void * sw, zlib_filefunc_def* fa):
+m_ZipFile( sw , fa )
+{
+}
+
+//------------------------------
+//
+//------------------------------
+
 CBaseReader::~CBaseReader()
 {
 }

shell/source/all/ooofilereader/contentreader.cxx

     }
 }
 
+CContentReader::CContentReader( void* stream, LocaleSet_t const & DocumentLocale, zlib_filefunc_def* fa ) :
+CBaseReader( stream, fa )
+{
+try
+    {
+		m_DefaultLocale = DocumentLocale;
+        Initialize( DOC_CONTENT_NAME );
+    }
+    catch(xml_parser_exception&
+    #if OSL_DEBUG_LEVEL > 0
+    ex
+    #endif
+    )
+    {
+        ENSURE(false, ex.what());
+    }
+    catch(...)
+    {
+        ENSURE(false, "Unknown error");
+    }
+}
+
+
 /** destructor.
 */
 

shell/source/all/ooofilereader/makefile.mk

 LIBTARGET=NO
 ENABLE_EXCEPTIONS=TRUE
 
+
 # --- Settings -----------------------------------------------------
 
 .INCLUDE :  settings.mk
 LIB1OBJFILES=$(SLOFILES)
 LIB1FILES=$(SLB)$/zipfile.lib\
           $(SLB)$/xmlparser.lib
-
+          
 .IF "$(BUILD_X64)"!=""
 SLOFILES_X64=$(SLO_X64)$/basereader.obj\
          $(SLO_X64)$/metainforeader.obj\

shell/source/all/ooofilereader/metainforeader.cxx

     }
 }
 
+CMetaInfoReader::CMetaInfoReader( void* stream, zlib_filefunc_def* fa) :
+CBaseReader( stream, fa)
+{
+try
+    {
+		m_pKeywords_Builder = new CKeywordsTag( );
+		m_pSimple_Builder = new CSimpleTag( );
+		m_pDummy_Builder   = new CDummyTag( );
+
+        //retrieve all infomation that is useful
+        m_AllMetaInfo[META_INFO_AUTHOR]               = EMPTY_XML_TAG;
+        m_AllMetaInfo[META_INFO_TITLE]                = EMPTY_XML_TAG;
+        m_AllMetaInfo[META_INFO_SUBJECT]              = EMPTY_XML_TAG;
+        m_AllMetaInfo[META_INFO_KEYWORDS]             = EMPTY_XML_TAG;
+        m_AllMetaInfo[META_INFO_DESCRIPTION]          = EMPTY_XML_TAG;
+        m_AllMetaInfo[META_INFO_DOCUMENT_STATISTIC]   = EMPTY_XML_TAG;
+
+        m_AllMetaInfo[META_INFO_GENERATOR]            = EMPTY_XML_TAG;
+        m_AllMetaInfo[META_INFO_CREATION]             = EMPTY_XML_TAG;
+        m_AllMetaInfo[META_INFO_CREATOR]              = EMPTY_XML_TAG;
+        m_AllMetaInfo[META_INFO_MODIFIED]             = EMPTY_XML_TAG;
+        m_AllMetaInfo[META_INFO_LANGUAGE]             = EMPTY_XML_TAG;
+        m_AllMetaInfo[META_INFO_DOCUMENT_NUMBER]      = EMPTY_XML_TAG;
+        m_AllMetaInfo[META_INFO_EDITING_TIME]         = EMPTY_XML_TAG;
+
+		Initialize( META_CONTENT_NAME );
+    }
+    catch(xml_parser_exception&
+    #if OSL_DEBUG_LEVEL > 0
+    ex
+    #endif
+    )
+    {
+        ENSURE(false, ex.what());
+    }
+    catch(...)
+    {
+        ENSURE(false, "Unknown error");
+    }
+
+}
+
 /** destructor.
 */
 

shell/source/all/zipfile/makefile.mk

 PRJNAME=shell
 TARGET=zipfile
 ENABLE_EXCEPTIONS=TRUE
+EXTERNAL_WARNINGS_NOT_ERRORS := TRUE
+
+
 
 # --- Settings -----------------------------------------------------
 
     $(SLO)$/zipexcptn.obj
 
 SLOFILES_X64=$(SLO_X64)$/zipfile.obj\
-    $(SLO_X64)$/zipexcptn.obj
-
+			 $(SLO_X64)$/zipexcptn.obj
+			 
 # --- Targets ------------------------------------------------------
 
 .INCLUDE :	set_wntx64.mk

shell/source/all/zipfile/zipfile.cxx

 	return true;
 }
 
+bool ZipFile::IsZipFile(void* /*stream*/)
+{
+	return true;
+}
+
+
 /** Returns wheter the version of the specified zip file may be uncompressed with the
 	      currently used zlib version or not
 	      
 	return true;
 }
 
+bool ZipFile::IsValidZipFileVersionNumber(void* /* stream*/)
+{
+	return true;
+}
+
+
 /** Constructs a zip file from a zip file
 	
 	@precond	The given parameter must be a string with length > 0
 		throw IOException(-1);
 }
 
+ZipFile::ZipFile(void* stream, zlib_filefunc_def* fa) 
+{
+	fa->opaque = stream;
+	m_uzFile = unzOpen2((const char *)NULL, fa);
+
+	if (0 == m_uzFile)
+		throw IOException(-1);
+}
+
+
 /** Destroys a zip file
 */
 ZipFile::~ZipFile()

shell/source/win32/shlxthandler/ooofilt/makefile.mk

 ENABLE_EXCEPTIONS=TRUE
 USE_DEFFILE=TRUE
 
+# Do not use the dynamic STLport library.
+# NO_DEFAULT_STL=YES
+
+# Do not use the uwinapi library
+UWINAPILIB=
+
+
 # --- Settings -----------------------------------------------------
 
 .INCLUDE :  settings.mk
 CFLAGS+=-DISOLATION_AWARE_ENABLED -DWIN32_LEAN_AND_MEAN -DXML_UNICODE -D_NTSDK -DUNICODE -D_UNICODE -D_WIN32_WINNT=0x0501
 CFLAGS+=-wd4710 -wd4711 -wd4514 -wd4619 -wd4217 -wd4820
 CDEFS+=-D_WIN32_IE=0x501
+# SCPCDEFS+=-D_STLP_USE_STATIC_LIB 
 
 # --- Files --------------------------------------------------------
 
-#UWINAPILIB=
-
 SLOFILES=$(SLO)$/ooofilt.obj\
         $(SLO)$/propspec.obj
 
      $(SHELL32LIB)\
      $(KERNEL32LIB)\
      $(OLDNAMESLIB)
-
+	 
+#     $(LIBSTLPORTST)
+     
 SHL1LIBS+=$(SLB)$/util.lib\
     $(SLB)$/ooofilereader.lib
-
+    
 SHL1DEPN=
 SHL1OBJS=$(SLOFILES)
 SHL1DEF=$(MISC)$/$(SHL1TARGET).def

shell/source/win32/shlxthandler/ooofilt/ooofilt.cxx

 //--------------------------------------------------------------------------
 #include "internal/contentreader.hxx"
 #include "internal/metainforeader.hxx"
-#include "internal/utilities.hxx"
+//#include "internal/utilities.hxx"
 #include "internal/registry.hxx"
 #include "internal/fileextensions.hxx"
 
 #include <ntquery.h>
 #include "assert.h"
 #include "ooofilt.hxx"
+#include <objidl.h>
+#include <stdio.h>
 #include "propspec.hxx"
 #ifdef __MINGW32__
 #include <algorithm>
     m_fEof(FALSE),    
     m_ChunkPosition(0),
     m_cAttributes(0),
-    m_pAttributes(0)
+    m_pAttributes(0),
+	m_pStream(NULL)
+
 {
     InterlockedIncrement( &g_lInstances );
 }
         pUnkTemp = (IUnknown *)(IPersistFile *)this;
     else if ( IID_IPersist == riid )
         pUnkTemp = (IUnknown *)(IPersist *)(IPersistFile *)this;
+	else if (IID_IPersistStream == riid)
+		pUnkTemp = (IUnknown *)(IPersistStream *)this;
     else if ( IID_IUnknown == riid )
         pUnkTemp = (IUnknown *)(IPersist *)(IPersistFile *)this;
     else
     // File is opened read-only, so "save" is always finished
     return S_OK;
 }
+
+//M-------------------------------------------------------------------------
+//
+//  Method:     COooFilter::Load      (IPersistStream::Load)
+//
+//  Summary:    Initializes an object from the stream where it was previously saved
+//
+//  Arguments:  pStm
+//                  [in] Pointer to stream from which object should be loaded
+//                    
+//
+//  Returns:    S_OK
+//				E_OUTOFMEMORY
+//				E_FAIL
+//                 
+//
+//--------------------------------------------------------------------------
+SCODE STDMETHODCALLTYPE COooFilter::Load(IStream *pStm)
+{
+
+	// These next few lines work around the "Seek pointer" bug found on Vista.
+	
+	char buf[20];
+	unsigned long count;
+	HRESULT hr;
+	ULARGE_INTEGER NewPosition;
+	LARGE_INTEGER Move;	
+	Move.QuadPart = 0;	
+	hr = pStm->Seek (Move, STREAM_SEEK_SET, &NewPosition);	
+	hr = pStm->Read (buf, 20, &count);
+				
+	zlib_filefunc_def z_filefunc;
+	fill_stream_filefunc (&z_filefunc);
+	z_filefunc.opaque = (void*)pStm;
+
+    m_pStream = pStm;
+  
+	try
+    {
+        if (m_pMetaInfoReader)
+            delete m_pMetaInfoReader;             
+		m_pMetaInfoReader = new CMetaInfoReader((void*)m_pStream, &z_filefunc);
+		
+		if (m_pContentReader)
+		    delete m_pContentReader;
+		m_pContentReader = new CContentReader((void*)m_pStream, m_pMetaInfoReader->getDefaultLocale(), &z_filefunc);
+    }
+    catch (const std::exception&)
+    {
+        return E_FAIL;
+    }
+    return S_OK;
+}
+
+//M-------------------------------------------------------------------------
+//
+//  Method:     COooFilter::GetSizeMax      (IPersistStream::GetSizeMax)
+//
+//  Summary:    Returns the size in bytes of the stream neede to save the object.
+//
+//  Arguments:  pcbSize
+//                  [out] Pointer to a 64 bit unsigned int indicating the size needed 
+//
+//  Returns:    E_NOTIMPL
+//                  
+//
+//--------------------------------------------------------------------------
+SCODE STDMETHODCALLTYPE COooFilter::GetSizeMax(ULARGE_INTEGER * /*pcbSize*/)
+{
+    // 
+    return E_NOTIMPL;
+}
+
+//M-------------------------------------------------------------------------
+//
+//  Method:     COooFilter::Save      (IPersistStream::Save)
+//
+//  Summary:    Save object to specified stream
+//
+//  Arguments:  pStm
+//                  [in] Pointer to stream
+//
+//              fClearDirty
+//					[in] Indicates whether to clear dirty flag
+//				
+//  Returns:    E_NOTIMPL
+//                 
+//
+//--------------------------------------------------------------------------
+SCODE STDMETHODCALLTYPE COooFilter::Save(IStream * /*pStm*/, BOOL )
+{
+    // 
+    return E_NOTIMPL;
+}
+
 //M-------------------------------------------------------------------------
 //
 //  Method:     COooFilter::GetCurFile          (IPersistFile::GetCurFile)
         std::string ClsidEntry_Persist = CLSID_GUID_ENTRY;
         SubstitutePlaceholder(ClsidEntry_Persist, GUID_PLACEHOLDER, ClsidToString(PersistentGuid));
     
+		
 		if (!SetRegistryKey(HKEY_CLASSES_ROOT, ClsidEntry_Persist.c_str(), "", "OpenOffice.org Persistent Handler"))
             return E_FAIL;	
+
+		// Add missing entry 
+		std::string ClsidEntry_Persist_Entry = CLSID_PERSIST_ENTRY;
+        SubstitutePlaceholder(ClsidEntry_Persist_Entry, 
+			                  GUID_PLACEHOLDER, 
+							  ClsidToString(PersistentGuid));		
+
+		if (!SetRegistryKey(HKEY_CLASSES_ROOT, ClsidEntry_Persist_Entry.c_str(), "", ClsidToString(PersistentGuid).c_str()));
+
         
         std::string ClsidEntry_Persist_Addin = CLSID_GUID_PERSIST_ADDIN_ENTRY;
         SubstitutePlaceholder(ClsidEntry_Persist_Addin, 
 	*/
 	return S_OK;
 }
+
+extern "C" {
+
+	// IStream callback
+	voidpf ZCALLBACK cb_sopen (voidpf opaque, const char* filename, int mode) {		
+		return opaque;
+	}
+
+	uLong ZCALLBACK cb_sread (voidpf opaque, voidpf stream, void* buf, uLong size) {
+		unsigned long newsize;
+		HRESULT hr;
+	
+		hr = ((IStream *)stream)->Read (buf, size, &newsize);
+		if (hr == S_OK){
+			return (unsigned long)newsize;
+		}
+		else {			
+			return (uLong)0;
+		}
+	}
+
+	long ZCALLBACK cb_sseek (voidpf opaque, voidpf stream, uLong offset, int origin) {
+		// IStream::Seek parameters
+		HRESULT hr;
+		LARGE_INTEGER Move;
+		DWORD dwOrigin;		
+		Move.QuadPart = (__int64)offset;	
+
+		switch (origin) {
+			case SEEK_CUR:
+				dwOrigin = STREAM_SEEK_CUR;
+				break;
+			case SEEK_END:
+				dwOrigin = STREAM_SEEK_END;
+				break;
+			case SEEK_SET:
+				dwOrigin = STREAM_SEEK_SET;
+				break;
+			default:
+				return -1;
+		}
+	
+		hr = ((IStream*)stream)->Seek (Move, dwOrigin, NULL);
+		if (hr == S_OK){	
+			return 0;
+		}
+		else {			
+			return -1;
+		}
+	}
+
+	long ZCALLBACK cb_stell (voidpf opaque, voidpf stream) {
+		// IStream::Seek parameters
+		HRESULT hr;
+		LARGE_INTEGER Move;
+		ULARGE_INTEGER NewPosition;
+		Move.QuadPart = 0;
+		NewPosition.QuadPart = 0;
+		
+		hr = ((IStream*)stream)->Seek (Move, STREAM_SEEK_CUR, &NewPosition);
+		if (hr == S_OK){			
+			return (long) NewPosition.QuadPart;
+		}
+		else {
+			return -1;
+		}
+	}
+
+	int ZCALLBACK cb_sclose (voidpf opaque, voidpf stream) {
+		return 0;
+	}
+
+	int ZCALLBACK cb_serror (voidpf opaque, voidpf stream) {
+		return 0;  //RJK - for now
+	}
+
+	uLong ZCALLBACK cb_swrite (voidpf opaque, voidpf stream, const void* buf, uLong size) {
+		HRESULT hr;
+		unsigned long writecount;
+		hr = ((IStream*)stream)->Write (buf, size, &writecount);
+		if (hr == S_OK)
+			return (unsigned int)writecount;
+		else
+			return (uLong)0;
+	}
+
+	void fill_stream_filefunc (zlib_filefunc_def* pzlib_filefunc_def) {
+		pzlib_filefunc_def->zopen_file = cb_sopen;
+		pzlib_filefunc_def->zread_file = cb_sread;
+		pzlib_filefunc_def->zwrite_file = cb_swrite;
+		pzlib_filefunc_def->ztell_file = cb_stell;
+		pzlib_filefunc_def->zseek_file = cb_sseek;
+		pzlib_filefunc_def->zclose_file = cb_sclose;
+		pzlib_filefunc_def->zerror_file = cb_serror;		
+	}
+}
+

shell/source/win32/shlxthandler/ooofilt/ooofilt.hxx

     FilteringContent,                           // Filtering the content property
     FilteringProperty                           // Filtering the pseudo property
 };
-
-class COooFilter : public IFilter, public IPersistFile
+class COooFilter : public IFilter, public IPersistFile, public IPersistStream
 {
 public:
     // From IUnknown
     virtual  SCODE STDMETHODCALLTYPE  GetCurFile(
         LPWSTR  * ppszFileName);
 
+	// From IPersistStream
+	virtual SCODE STDMETHODCALLTYPE  Load(
+		IStream *pStm);
+
+	virtual SCODE STDMETHODCALLTYPE Save(
+		IStream *pStm,
+		BOOL fClearDirty);
+
+	virtual SCODE STDMETHODCALLTYPE  GetSizeMax(
+		ULARGE_INTEGER *pcbSize);
+
+
 private:
     friend class COooFilterCF;
 
     ULONG			          m_ChunkPosition;          // Chunk pointer to specify the current Chunk;
     ULONG                     m_cAttributes;            // Count of attributes
     CFullPropSpec *           m_pAttributes;            // Attributes to filter
+	IStream *                 m_pStream;
+
 };
 
 //C-------------------------------------------------------------------------
     long m_lRefs;           // Reference count
 };
 
+extern "C" {
+
+	voidpf ZCALLBACK cb_sopen OF((voidpf opaque, const char * filename, int mode));
+	uLong ZCALLBACK cb_sread OF((voidpf opaque, voidpf stream, void* vuf, uLong size));
+	uLong ZCALLBACK cb_swrite OF((voidpf opaque, voidpf stream, const void* buf, uLong size));
+	long ZCALLBACK cb_stell OF((voidpf opaque, voidpf stream));
+	long ZCALLBACK cb_sseek OF((voidpf opaque, voidpf stream, uLong offset, int origin));
+	int ZCALLBACK cb_sclose OF((voidpf opaque, voidpf stream));
+	int ZCALLBACK cb_serror OF((voidpf opaque, voidpf stream));
+
+	void fill_stream_filefunc (zlib_filefunc_def* pzlib_filefunc_def);	
+	
+}
+
 
 
 
 
 
 
+
+

shell/source/win32/shlxthandler/ooofilt/proxy/ooofiltproxy.cxx

 
 extern "C" HRESULT __stdcall DllRegisterServer()
 {	
-    Init();
-    
+	Init();
     if (Forward_DllRegisterServer)
 	    return Forward_DllRegisterServer();
     else

shell/source/win32/shlxthandler/propsheets/propsheets.cxx

 
 HRESULT STDMETHODCALLTYPE CPropertySheet::AddPages(LPFNADDPROPSHEETPAGE lpfnAddPage, LPARAM lParam)
 {
-	try
-	{
-		m_pMetaInfo = std::auto_ptr<CMetaInfoReader>(new CMetaInfoReader(m_szFileName));
-	}	
-    catch (const std::exception&)
-    {
-		return E_FAIL;
-    }
-
+	
 	PROPSHEETPAGE psp;
 
 	// add the summary property page
 		else
 			DestroyPropertySheetPage(hPage);
 	}
-	
+
 	// always return success else
 	// no property sheet will be 
 	// displayed at all
 
 //##################################
 void CPropertySheet::InitPropPageSummary(HWND hwnd, LPPROPSHEETPAGE /*lppsp*/)
-{	
-	SetWindowText(GetDlgItem(hwnd,IDC_TITLE),    m_pMetaInfo->getTagData( META_INFO_TITLE ).c_str() );
-	SetWindowText(GetDlgItem(hwnd,IDC_AUTHOR),   m_pMetaInfo->getTagData( META_INFO_AUTHOR ).c_str() );
-	SetWindowText(GetDlgItem(hwnd,IDC_SUBJECT),  m_pMetaInfo->getTagData( META_INFO_SUBJECT ).c_str() );
-	SetWindowText(GetDlgItem(hwnd,IDC_KEYWORDS), m_pMetaInfo->getTagData( META_INFO_KEYWORDS ).c_str() );
+{
+
+	CMetaInfoReader metaInfo(m_szFileName);
+
+	SetWindowText(GetDlgItem(hwnd,IDC_TITLE),    metaInfo.getTagData( META_INFO_TITLE ).c_str() );
+	SetWindowText(GetDlgItem(hwnd,IDC_AUTHOR),   metaInfo.getTagData( META_INFO_AUTHOR ).c_str() );
+	SetWindowText(GetDlgItem(hwnd,IDC_SUBJECT),  metaInfo.getTagData( META_INFO_SUBJECT ).c_str() );
+	SetWindowText(GetDlgItem(hwnd,IDC_KEYWORDS), metaInfo.getTagData( META_INFO_KEYWORDS ).c_str() );
 
 	// comments read from meta.xml use "\n" for return, but this will not displayable in Edit control, add
 	// "\r" before "\n" to form "\r\n" in order to display return in Edit control.
-	std::wstring tempStr = m_pMetaInfo->getTagData( META_INFO_DESCRIPTION ).c_str();
+	std::wstring tempStr = metaInfo.getTagData( META_INFO_DESCRIPTION ).c_str();
 	std::wstring::size_type itor = tempStr.find ( L"\n" , 0 );
 	while (itor != std::wstring::npos)
 	{
 		itor = tempStr.find(L"\n", itor + 2);
 	}
 	SetWindowText(GetDlgItem(hwnd,IDC_COMMENTS), tempStr.c_str());	
+
 }
 
 //---------------------------------
 /**
 */
 void CPropertySheet::InitPropPageStatistics(HWND hwnd, LPPROPSHEETPAGE /*lppsp*/)
-{				
-	document_statistic_reader_ptr doc_stat_reader = create_document_statistic_reader(m_szFileName, m_pMetaInfo.get());
+{	
+
+	CMetaInfoReader metaInfo(m_szFileName);
+
+	document_statistic_reader_ptr doc_stat_reader = create_document_statistic_reader(m_szFileName, &metaInfo);
 	
 	statistic_group_list_t sgl;
 	doc_stat_reader->read(&sgl);
 		GetResString(IDS_PROPERTY_VALUE));         
 	    
 	lv_builder->build(sgl);  	
+
 }
 
 

shell/source/win32/shlxthandler/util/makefile.mk

 #LIBTARGET=NO
 ENABLE_EXCEPTIONS=TRUE
 
+
 # --- Settings -----------------------------------------------------
 
 .INCLUDE :  settings.mk

shell/source/win32/shlxthandler/util/utilities.cxx

         return GetSystemDefaultLCID();                    //System Default Locale 
 
 	return MAKELCID( MAKELANGID( usPrimaryLang, usSubLang ), SORT_DEFAULT );
-
 }
 OUT2INC= \
 	zlib.h \
 	zconf.h \
-	contrib$/minizip$/unzip.h
+	contrib$/minizip$/unzip.h \
+	contrib$/minizip$/ioapi.h
 
 PATCHED_HEADERS=$(INCCOM)$/patched$/zlib.h
 
 
 ..\%__SRC%\inc\patched\zlib.h %_DEST%\inc%_EXT%\external\zlib\zlib.h
 ..\%__SRC%\inc\unzip.h %_DEST%\inc%_EXT%\external\zlib\unzip.h
+..\%__SRC%\inc\ioapi.h %_DEST%\inc%_EXT%\external\zlib\ioapi.h
 ..\%__SRC%\inc\zconf.h %_DEST%\inc%_EXT%\external\zlib\zconf.h
 
 ..\%__SRC%\lib\libzlib.a %_DEST%\lib%_EXT%\libzlib.a

zlib/zlib-1.1.4.patch

---- misc/zlib-1.1.4/contrib/minizip/unzip.h	Thu Mar 19 00:15:00 1998
-+++ misc/build/zlib-1.1.4/contrib/minizip/unzip.h	Fri Mar 14 10:15:45 2008
-@@ -46,7 +46,7 @@
- #endif
- 
- #ifndef _ZLIB_H
--#include "zlib.h"
-+#include "zlib/zlib.h"
- #endif
- 
- #if defined(STRICTUNZIP) || defined(STRICTZIPUNZIP)
 --- misc/zlib-1.1.4/makefile.mk	Fri Mar 14 10:17:06 2008
 +++ misc/build/zlib-1.1.4/makefile.mk	Fri Mar 14 10:16:56 2008
-@@ -1 +1,77 @@
+@@ -1 +1,79 @@
 -dummy
 +#*************************************************************************
 +#
 +			$(SLO)$/infutil.obj		\
 +			$(SLO)$/trees.obj		\
 +			$(SLO)$/zutil.obj       \
-+			$(SLO)$/unzip.obj
++			$(SLO)$/unzip.obj		\
++			$(SLO)$/ioapi.obj
 +
 +
 +LIB1TARGET=$(SLB)$/$(TARGET).lib
 +			$(SLO_X64)$/infutil.obj		\
 +			$(SLO_X64)$/trees.obj		\
 +			$(SLO_X64)$/zutil.obj       \
-+			$(SLO_X64)$/unzip.obj
++			$(SLO_X64)$/unzip.obj		\
++			$(SLO)$/ioapi.obj
 +
 +LIB1TARGET_X64=$(SLB_X64)$/$(TARGET).lib
 +LIB1OBJFILES_X64=$(SLOFILES_X64)
 +#endif
  #include "zutil.h"
  
- struct internal_state      {int dummy;}; /* for buggy compilers */
+ struct internal_state      {int dummy;}; /* for buggy compilers */ 
+--- misc/zlib-1.1.4/contrib/minizip/unzip.c	1998-06-15 17:34:20.000000000 +0200
++++ misc/build/zlib-1.1.4/contrib/minizip/unzip.c	2009-07-17 10:15:05.156250000 +0200
+@@ -1,9 +1,39 @@
+-/* unzip.c -- IO on .zip files using zlib 
+-   Version 0.15 beta, Mar 19th, 1998,
++/* unzip.c -- IO for uncompress .zip files using zlib
++   Version 1.01e, February 12th, 2005
++
++   Copyright (C) 1998-2005 Gilles Vollant
+ 
+    Read unzip.h for more info
+ */
+ 
++/* Decryption code comes from crypt.c by Info-ZIP but has been greatly reduced in terms of
++compatibility with older software. The following is from the original crypt.c. Code
++woven in by Terry Thorsen 1/2003.
++*/
++/*
++  Copyright (c) 1990-2000 Info-ZIP.  All rights reserved.
++
++  See the accompanying file LICENSE, version 2000-Apr-09 or later
++  (the contents of which are also included in zip.h) for terms of use.
++  If, for some reason, all these files are missing, the Info-ZIP license
++  also may be found at:  ftp://ftp.info-zip.org/pub/infozip/license.html
++*/
++/*
++  crypt.c (full version) by Info-ZIP.      Last revised:  [see crypt.h]
++
++  The encryption/decryption parts of this source code (as opposed to the
++  non-echoing password parts) were originally written in Europe.  The
++  whole source package can be freely distributed, including from the USA.
++  (Prior to January 2000, re-export from the US was a violation of US law.)
++ */
++
++/*
++  This encryption code is a direct transcription of the algorithm from
++  Roger Schlafly, described by Phil Katz in the file appnote.txt.  This
++  file (appnote.txt) is distributed with the PKZIP program (even in the
++  version without encryption capabilities).
++ */
++
+ 
+ #include <stdio.h>
+ #include <stdlib.h>
+@@ -29,10 +59,10 @@
+ /* compile with -Dlocal if your debugger can't find static symbols */
+ 
+ 
+-
+-#if !defined(unix) && !defined(CASESENSITIVITYDEFAULT_YES) && \
+-                      !defined(CASESENSITIVITYDEFAULT_NO)
+-#define CASESENSITIVITYDEFAULT_NO
++#ifndef CASESENSITIVITYDEFAULT_NO
++#  if !defined(unix) && !defined(CASESENSITIVITYDEFAULT_YES)
++#    define CASESENSITIVITYDEFAULT_NO
++#  endif
+ #endif
+ 
+ 
+@@ -55,22 +85,10 @@
+ #define SIZEZIPLOCALHEADER (0x1e)
+ 
+ 
+-/* I've found an old Unix (a SunOS 4.1.3_U1) without all SEEK_* defined.... */
+-
+-#ifndef SEEK_CUR
+-#define SEEK_CUR    1
+-#endif
+-
+-#ifndef SEEK_END
+-#define SEEK_END    2
+-#endif
+ 
+-#ifndef SEEK_SET
+-#define SEEK_SET    0
+-#endif
+ 
+ const char unz_copyright[] =
+-   " unzip 0.15 Copyright 1998 Gilles Vollant ";
++   " unzip 1.01 Copyright 1998-2004 Gilles Vollant - http://www.winimage.com/zLibDll";
+ 
+ /* unz_file_info_interntal contain internal info about a file in zipfile*/
+ typedef struct unz_file_info_internal_s
+@@ -83,23 +101,25 @@
+     when reading and decompress it */
+ typedef struct
+ {
+-	char  *read_buffer;         /* internal buffer for compressed data */
+-	z_stream stream;            /* zLib stream structure for inflate */
++    char  *read_buffer;         /* internal buffer for compressed data */
++    z_stream stream;            /* zLib stream structure for inflate */
+ 
+-	uLong pos_in_zipfile;       /* position in byte on the zipfile, for fseek*/
+-	uLong stream_initialised;   /* flag set if stream structure is initialised*/
++    uLong pos_in_zipfile;       /* position in byte on the zipfile, for fseek*/
++    uLong stream_initialised;   /* flag set if stream structure is initialised*/
+ 
+-	uLong offset_local_extrafield;/* offset of the local extra field */
+-	uInt  size_local_extrafield;/* size of the local extra field */
+-	uLong pos_local_extrafield;   /* position in the local extra field in read*/
+-
+-	uLong crc32;                /* crc32 of all data uncompressed */
+-	uLong crc32_wait;           /* crc32 we must obtain after decompress all */
+-	uLong rest_read_compressed; /* number of byte to be decompressed */
+-	uLong rest_read_uncompressed;/*number of byte to be obtained after decomp*/
+-	FILE* file;                 /* io structore of the zipfile */
+-	uLong compression_method;   /* compression method (0==store) */
+-	uLong byte_before_the_zipfile;/* byte before the zipfile, (>0 for sfx)*/
++    uLong offset_local_extrafield;/* offset of the local extra field */
++    uInt  size_local_extrafield;/* size of the local extra field */
++    uLong pos_local_extrafield;   /* position in the local extra field in read*/
++
++    uLong crc32;                /* crc32 of all data uncompressed */
++    uLong crc32_wait;           /* crc32 we must obtain after decompress all */
++    uLong rest_read_compressed; /* number of byte to be decompressed */
++    uLong rest_read_uncompressed;/*number of byte to be obtained after decomp*/
++    zlib_filefunc_def z_filefunc;
++    voidpf filestream;        /* io structore of the zipfile */
++    uLong compression_method;   /* compression method (0==store) */
++    uLong byte_before_the_zipfile;/* byte before the zipfile, (>0 for sfx)*/
++    int   raw;
+ } file_in_zip_read_info_s;
+ 
+ 
+@@ -107,25 +127,35 @@
+ */
+ typedef struct
+ {
+-	FILE* file;                 /* io structore of the zipfile */
+-	unz_global_info gi;       /* public global information */
+-	uLong byte_before_the_zipfile;/* byte before the zipfile, (>0 for sfx)*/
+-	uLong num_file;             /* number of the current file in the zipfile*/
+-	uLong pos_in_central_dir;   /* pos of the current file in the central dir*/
+-	uLong current_file_ok;      /* flag about the usability of the current file*/
+-	uLong central_pos;          /* position of the beginning of the central dir*/
+-
+-	uLong size_central_dir;     /* size of the central directory  */
+-	uLong offset_central_dir;   /* offset of start of central directory with
+-								   respect to the starting disk number */
++    zlib_filefunc_def z_filefunc;
++    voidpf filestream;        /* io structore of the zipfile */
++    unz_global_info gi;       /* public global information */
++    uLong byte_before_the_zipfile;/* byte before the zipfile, (>0 for sfx)*/
++    uLong num_file;             /* number of the current file in the zipfile*/
++    uLong pos_in_central_dir;   /* pos of the current file in the central dir*/
++    uLong current_file_ok;      /* flag about the usability of the current file*/
++    uLong central_pos;          /* position of the beginning of the central dir*/
++
++    uLong size_central_dir;     /* size of the central directory  */
++    uLong offset_central_dir;   /* offset of start of central directory with
++                                   respect to the starting disk number */
+ 
+-	unz_file_info cur_file_info; /* public info about the current file in zip*/
+-	unz_file_info_internal cur_file_info_internal; /* private info about it*/
++    unz_file_info cur_file_info; /* public info about the current file in zip*/
++    unz_file_info_internal cur_file_info_internal; /* private info about it*/
+     file_in_zip_read_info_s* pfile_in_zip_read; /* structure about the current
+-	                                    file if we are decompressing it */
++                                        file if we are decompressing it */
++    int encrypted;
++#    ifndef NOUNCRYPT
++    unsigned long keys[3];     /* keys defining the pseudo-random sequence */
++    const unsigned long* pcrc_32_tab;
++#    endif
+ } unz_s;
+ 
+ 
++#ifndef NOUNCRYPT
++#include "crypt.h"
++#endif
++
+ /* ===========================================================================
+      Read a byte from a gz_stream; update next_in and avail_in. Return EOF
+    for end of file.
+@@ -133,12 +163,18 @@
+ */
+ 
+ 
+-local int unzlocal_getByte(fin,pi)
+-	FILE *fin;
+-	int *pi;
++local int unzlocal_getByte OF((
++    const zlib_filefunc_def* pzlib_filefunc_def,
++    voidpf filestream,
++    int *pi));
++
++local int unzlocal_getByte(pzlib_filefunc_def,filestream,pi)
++    const zlib_filefunc_def* pzlib_filefunc_def;
++    voidpf filestream;
++    int *pi;
+ {
+     unsigned char c;
+-	int err = fread(&c, 1, 1, fin);
++    int err = (int)ZREAD(*pzlib_filefunc_def,filestream,&c,1);
+     if (err==1)
+     {
+         *pi = (int)c;
+@@ -146,7 +182,7 @@
+     }
+     else
+     {
+-        if (ferror(fin)) 
++        if (ZERROR(*pzlib_filefunc_def,filestream))
+             return UNZ_ERRNO;
+         else
+             return UNZ_EOF;
+@@ -155,23 +191,29 @@
+ 
+ 
+ /* ===========================================================================
+-   Reads a long in LSB order from the given gz_stream. Sets 
++   Reads a long in LSB order from the given gz_stream. Sets
+ */
+-local int unzlocal_getShort (fin,pX)
+-	FILE* fin;
++local int unzlocal_getShort OF((
++    const zlib_filefunc_def* pzlib_filefunc_def,
++    voidpf filestream,
++    uLong *pX));
++
++local int unzlocal_getShort (pzlib_filefunc_def,filestream,pX)
++    const zlib_filefunc_def* pzlib_filefunc_def;
++    voidpf filestream;
+     uLong *pX;
+ {
+     uLong x ;
+     int i;
+     int err;
+ 
+-    err = unzlocal_getByte(fin,&i);
++    err = unzlocal_getByte(pzlib_filefunc_def,filestream,&i);
+     x = (uLong)i;
+-    
++
+     if (err==UNZ_OK)
+-        err = unzlocal_getByte(fin,&i);
++        err = unzlocal_getByte(pzlib_filefunc_def,filestream,&i);
+     x += ((uLong)i)<<8;
+-   
++
+     if (err==UNZ_OK)
+         *pX = x;
+     else
+@@ -179,29 +221,35 @@
+     return err;
+ }
+ 
+-local int unzlocal_getLong (fin,pX)
+-	FILE* fin;
++local int unzlocal_getLong OF((
++    const zlib_filefunc_def* pzlib_filefunc_def,
++    voidpf filestream,
++    uLong *pX));
++
++local int unzlocal_getLong (pzlib_filefunc_def,filestream,pX)
++    const zlib_filefunc_def* pzlib_filefunc_def;
++    voidpf filestream;
+     uLong *pX;
+ {
+     uLong x ;
+     int i;
+     int err;
+ 
+-    err = unzlocal_getByte(fin,&i);
++    err = unzlocal_getByte(pzlib_filefunc_def,filestream,&i);
+     x = (uLong)i;
+-    
++
+     if (err==UNZ_OK)
+-        err = unzlocal_getByte(fin,&i);
++        err = unzlocal_getByte(pzlib_filefunc_def,filestream,&i);
+     x += ((uLong)i)<<8;
+ 
+     if (err==UNZ_OK)
+-        err = unzlocal_getByte(fin,&i);
++        err = unzlocal_getByte(pzlib_filefunc_def,filestream,&i);
+     x += ((uLong)i)<<16;
+ 
+     if (err==UNZ_OK)
+-        err = unzlocal_getByte(fin,&i);
++        err = unzlocal_getByte(pzlib_filefunc_def,filestream,&i);
+     x += ((uLong)i)<<24;
+-   
++
+     if (err==UNZ_OK)
+         *pX = x;
+     else
+@@ -212,26 +260,26 @@
+ 
+ /* My own strcmpi / strcasecmp */
+ local int strcmpcasenosensitive_internal (fileName1,fileName2)
+-	const char* fileName1;
+-	const char* fileName2;
++    const char* fileName1;
++    const char* fileName2;
+ {
+-	for (;;)
+-	{
+-		char c1=*(fileName1++);
+-		char c2=*(fileName2++);
+-		if ((c1>='a') && (c1<='z'))
+-			c1 -= 0x20;
+-		if ((c2>='a') && (c2<='z'))
+-			c2 -= 0x20;
+-		if (c1=='\0')
+-			return ((c2=='\0') ? 0 : -1);
+-		if (c2=='\0')
+-			return 1;
+-		if (c1<c2)
+-			return -1;
+-		if (c1>c2)
+-			return 1;
+-	}
++    for (;;)
++    {
++        char c1=*(fileName1++);
++        char c2=*(fileName2++);
++        if ((c1>='a') && (c1<='z'))
++            c1 -= 0x20;
++        if ((c2>='a') && (c2<='z'))
++            c2 -= 0x20;
++        if (c1=='\0')
++            return ((c2=='\0') ? 0 : -1);
++        if (c2=='\0')
++            return 1;
++        if (c1<c2)
++            return -1;
++        if (c1>c2)
++            return 1;
++    }
+ }
+ 
+ 
+@@ -245,7 +293,7 @@
+ #define STRCMPCASENOSENTIVEFUNCTION strcmpcasenosensitive_internal
+ #endif
+ 
+-/* 
++/*
+    Compare two filename (fileName1,fileName2).
+    If iCaseSenisivity = 1, comparision is case sensitivity (like strcmp)
+    If iCaseSenisivity = 2, comparision is not case sensitivity (like strcmpi
+@@ -255,203 +303,225 @@
+ 
+ */
+ extern int ZEXPORT unzStringFileNameCompare (fileName1,fileName2,iCaseSensitivity)
+-	const char* fileName1;
+-	const char* fileName2;
+-	int iCaseSensitivity;
++    const char* fileName1;
++    const char* fileName2;
++    int iCaseSensitivity;
+ {
+-	if (iCaseSensitivity==0)
+-		iCaseSensitivity=CASESENSITIVITYDEFAULTVALUE;
++    if (iCaseSensitivity==0)
++        iCaseSensitivity=CASESENSITIVITYDEFAULTVALUE;
+ 
+-	if (iCaseSensitivity==1)
+-		return strcmp(fileName1,fileName2);
++    if (iCaseSensitivity==1)
++        return strcmp(fileName1,fileName2);
+ 
+-	return STRCMPCASENOSENTIVEFUNCTION(fileName1,fileName2);
+-} 
++    return STRCMPCASENOSENTIVEFUNCTION(fileName1,fileName2);
++}
+ 
++#ifndef BUFREADCOMMENT
+ #define BUFREADCOMMENT (0x400)
++#endif
+ 
+ /*
+   Locate the Central directory of a zipfile (at the end, just before
+     the global comment)
+ */
+-local uLong unzlocal_SearchCentralDir(fin)
+-	FILE *fin;
++local uLong unzlocal_SearchCentralDir OF((
++    const zlib_filefunc_def* pzlib_filefunc_def,
++    voidpf filestream));
++
++local uLong unzlocal_SearchCentralDir(pzlib_filefunc_def,filestream)
++    const zlib_filefunc_def* pzlib_filefunc_def;
++    voidpf filestream;
+ {
+-	unsigned char* buf;
+-	uLong uSizeFile;
+-	uLong uBackRead;
+-	uLong uMaxBack=0xffff; /* maximum size of global comment */
+-	uLong uPosFound=0;
+-	
+-	if (fseek(fin,0,SEEK_END) != 0)
+-		return 0;
+-
+-
+-	uSizeFile = ftell( fin );
+-	
+-	if (uMaxBack>uSizeFile)
+-		uMaxBack = uSizeFile;
+-
+-	buf = (unsigned char*)ALLOC(BUFREADCOMMENT+4);
+-	if (buf==NULL)
+-		return 0;
+-
+-	uBackRead = 4;
+-	while (uBackRead<uMaxBack)
+-	{
+-		uLong uReadSize,uReadPos ;
+-		int i;
+-		if (uBackRead+BUFREADCOMMENT>uMaxBack) 
+-			uBackRead = uMaxBack;
+-		else
+-			uBackRead+=BUFREADCOMMENT;
+-		uReadPos = uSizeFile-uBackRead ;
+-		
+-		uReadSize = ((BUFREADCOMMENT+4) < (uSizeFile-uReadPos)) ? 
++    unsigned char* buf;
++    uLong uSizeFile;
++    uLong uBackRead;
++    uLong uMaxBack=0xffff; /* maximum size of global comment */
++    uLong uPosFound=0;
++
++    if (ZSEEK(*pzlib_filefunc_def,filestream,0,ZLIB_FILEFUNC_SEEK_END) != 0)
++        return 0;
++
++
++    uSizeFile = ZTELL(*pzlib_filefunc_def,filestream);
++
++    if (uMaxBack>uSizeFile)
++        uMaxBack = uSizeFile;
++
++    buf = (unsigned char*)ALLOC(BUFREADCOMMENT+4);
++    if (buf==NULL)
++        return 0;
++
++    uBackRead = 4;
++    while (uBackRead<uMaxBack)
++    {
++        uLong uReadSize,uReadPos ;
++        int i;
++        if (uBackRead+BUFREADCOMMENT>uMaxBack)
++            uBackRead = uMaxBack;
++        else
++            uBackRead+=BUFREADCOMMENT;
++        uReadPos = uSizeFile-uBackRead ;
++
++        uReadSize = ((BUFREADCOMMENT+4) < (uSizeFile-uReadPos)) ?
+                      (BUFREADCOMMENT+4) : (uSizeFile-uReadPos);
+-		if (fseek(fin,uReadPos,SEEK_SET)!=0)
+-			break;
++        if (ZSEEK(*pzlib_filefunc_def,filestream,uReadPos,ZLIB_FILEFUNC_SEEK_SET)!=0)
++            break;
+ 
+-		if (fread(buf,(uInt)uReadSize,1,fin)!=1)
+-			break;
++        if (ZREAD(*pzlib_filefunc_def,filestream,buf,uReadSize)!=uReadSize)
++            break;
+ 
+-                for (i=(int)uReadSize-3; (i--)>0;)
+-			if (((*(buf+i))==0x50) && ((*(buf+i+1))==0x4b) && 
+-				((*(buf+i+2))==0x05) && ((*(buf+i+3))==0x06))
+-			{
+-				uPosFound = uReadPos+i;
+-				break;
+-			}
+-
+-		if (uPosFound!=0)
+-			break;
+-	}
+-	TRYFREE(buf);
+-	return uPosFound;
++        for (i=(int)uReadSize-3; (i--)>0;)
++            if (((*(buf+i))==0x50) && ((*(buf+i+1))==0x4b) &&
++                ((*(buf+i+2))==0x05) && ((*(buf+i+3))==0x06))
++            {
++                uPosFound = uReadPos+i;
++                break;
++            }
++
++        if (uPosFound!=0)
++            break;
++    }
++    TRYFREE(buf);
++    return uPosFound;
+ }
+ 
+ /*
+   Open a Zip file. path contain the full pathname (by example,
+-     on a Windows NT computer "c:\\test\\zlib109.zip" or on an Unix computer
+-	 "zlib/zlib109.zip".
+-	 If the zipfile cannot be opened (file don't exist or in not valid), the
+-	   return value is NULL.
++     on a Windows NT computer "c:\\test\\zlib114.zip" or on an Unix computer
++     "zlib/zlib114.zip".
++     If the zipfile cannot be opened (file doesn't exist or in not valid), the
++       return value is NULL.
+      Else, the return value is a unzFile Handle, usable with other function
+-	   of this unzip package.
++       of this unzip package.
+ */
+-extern unzFile ZEXPORT unzOpen (path)
+-	const char *path;
+-{
+-	unz_s us;
+-	unz_s *s;
+-	uLong central_pos,uL;
+-	FILE * fin ;
+-
+-	uLong number_disk;          /* number of the current dist, used for 
+-								   spaning ZIP, unsupported, always 0*/
+-	uLong number_disk_with_CD;  /* number the the disk with central dir, used
+-								   for spaning ZIP, unsupported, always 0*/
+-	uLong number_entry_CD;      /* total number of entries in
+-	                               the central dir 
+-	                               (same than number_entry on nospan) */
++extern unzFile ZEXPORT unzOpen2 (path, pzlib_filefunc_def)
++    const char *path;
++    zlib_filefunc_def* pzlib_filefunc_def;
++{
++    unz_s us;
++    unz_s *s;
++    uLong central_pos,uL;
++
++    uLong number_disk;          /* number of the current dist, used for
++                                   spaning ZIP, unsupported, always 0*/
++    uLong number_disk_with_CD;  /* number the the disk with central dir, used
++                                   for spaning ZIP, unsupported, always 0*/
++    uLong number_entry_CD;      /* total number of entries in
++                                   the central dir
++                                   (same than number_entry on nospan) */
+ 
+-	int err=UNZ_OK;
++    int err=UNZ_OK;
+ 
+     if (unz_copyright[0]!=' ')
+         return NULL;
+ 
+-    fin=fopen(path,"rb");
+-	if (fin==NULL)
+-		return NULL;
+-
+-	central_pos = unzlocal_SearchCentralDir(fin);
+-	if (central_pos==0)
+-		err=UNZ_ERRNO;
+-
+-	if (fseek(fin,central_pos,SEEK_SET)!=0)
+-		err=UNZ_ERRNO;
+-
+-	/* the signature, already checked */
+-	if (unzlocal_getLong(fin,&uL)!=UNZ_OK)
+-		err=UNZ_ERRNO;
+-
+-	/* number of this disk */
+-	if (unzlocal_getShort(fin,&number_disk)!=UNZ_OK)
+-		err=UNZ_ERRNO;
+-
+-	/* number of the disk with the start of the central directory */
+-	if (unzlocal_getShort(fin,&number_disk_with_CD)!=UNZ_OK)
+-		err=UNZ_ERRNO;
+-
+-	/* total number of entries in the central dir on this disk */
+-	if (unzlocal_getShort(fin,&us.gi.number_entry)!=UNZ_OK)
+-		err=UNZ_ERRNO;
+-
+-	/* total number of entries in the central dir */
+-	if (unzlocal_getShort(fin,&number_entry_CD)!=UNZ_OK)
+-		err=UNZ_ERRNO;
+-
+-	if ((number_entry_CD!=us.gi.number_entry) ||
+-		(number_disk_with_CD!=0) ||
+-		(number_disk!=0))
+-		err=UNZ_BADZIPFILE;
+-
+-	/* size of the central directory */
+-	if (unzlocal_getLong(fin,&us.size_central_dir)!=UNZ_OK)
+-		err=UNZ_ERRNO;
+-
+-	/* offset of start of central directory with respect to the 
+-	      starting disk number */
+-	if (unzlocal_getLong(fin,&us.offset_central_dir)!=UNZ_OK)
+-		err=UNZ_ERRNO;
+-
+-	/* zipfile comment length */
+-	if (unzlocal_getShort(fin,&us.gi.size_comment)!=UNZ_OK)
+-		err=UNZ_ERRNO;
+-
+-	if ((central_pos<us.offset_central_dir+us.size_central_dir) && 
+-		(err==UNZ_OK))
+-		err=UNZ_BADZIPFILE;
+-
+-	if (err!=UNZ_OK)
+-	{
+-		fclose(fin);
+-		return NULL;
+-	}
+-
+-	us.file=fin;
+-	us.byte_before_the_zipfile = central_pos -
+-		                    (us.offset_central_dir+us.size_central_dir);
+-	us.central_pos = central_pos;
++    if (pzlib_filefunc_def==NULL)
++        fill_fopen_filefunc(&us.z_filefunc);
++    else
++        us.z_filefunc = *pzlib_filefunc_def;
++
++    us.filestream= (*(us.z_filefunc.zopen_file))(us.z_filefunc.opaque,
++                                                 path,
++                                                 ZLIB_FILEFUNC_MODE_READ |
++                                                 ZLIB_FILEFUNC_MODE_EXISTING);
++    if (us.filestream==NULL)
++        return NULL;
++
++    central_pos = unzlocal_SearchCentralDir(&us.z_filefunc,us.filestream);
++    if (central_pos==0)
++        err=UNZ_ERRNO;
++
++    if (ZSEEK(us.z_filefunc, us.filestream,
++                                      central_pos,ZLIB_FILEFUNC_SEEK_SET)!=0)
++        err=UNZ_ERRNO;
++
++    /* the signature, already checked */
++    if (unzlocal_getLong(&us.z_filefunc, us.filestream,&uL)!=UNZ_OK)
++        err=UNZ_ERRNO;
++
++    /* number of this disk */
++    if (unzlocal_getShort(&us.z_filefunc, us.filestream,&number_disk)!=UNZ_OK)
++        err=UNZ_ERRNO;
++
++    /* number of the disk with the start of the central directory */
++    if (unzlocal_getShort(&us.z_filefunc, us.filestream,&number_disk_with_CD)!=UNZ_OK)
++        err=UNZ_ERRNO;
++
++    /* total number of entries in the central dir on this disk */
++    if (unzlocal_getShort(&us.z_filefunc, us.filestream,&us.gi.number_entry)!=UNZ_OK)
++        err=UNZ_ERRNO;
++
++    /* total number of entries in the central dir */
++    if (unzlocal_getShort(&us.z_filefunc, us.filestream,&number_entry_CD)!=UNZ_OK)
++        err=UNZ_ERRNO;
++
++    if ((number_entry_CD!=us.gi.number_entry) ||
++        (number_disk_with_CD!=0) ||
++        (number_disk!=0))
++        err=UNZ_BADZIPFILE;
++
++    /* size of the central directory */
++    if (unzlocal_getLong(&us.z_filefunc, us.filestream,&us.size_central_dir)!=UNZ_OK)
++        err=UNZ_ERRNO;
++
++    /* offset of start of central directory with respect to the
++          starting disk number */
++    if (unzlocal_getLong(&us.z_filefunc, us.filestream,&us.offset_central_dir)!=UNZ_OK)
++        err=UNZ_ERRNO;
++
++    /* zipfile comment length */
++    if (unzlocal_getShort(&us.z_filefunc, us.filestream,&us.gi.size_comment)!=UNZ_OK)
++        err=UNZ_ERRNO;
++
++    if ((central_pos<us.offset_central_dir+us.size_central_dir) &&
++        (err==UNZ_OK))
++        err=UNZ_BADZIPFILE;
++
++    if (err!=UNZ_OK)
++    {
++        ZCLOSE(us.z_filefunc, us.filestream);
++        return NULL;
++    }
++
++    us.byte_before_the_zipfile = central_pos -
++                            (us.offset_central_dir+us.size_central_dir);
++    us.central_pos = central_pos;
+     us.pfile_in_zip_read = NULL;
+-	
++    us.encrypted = 0;
+ 
+-	s=(unz_s*)ALLOC(sizeof(unz_s));
+-	*s=us;
+-	unzGoToFirstFile((unzFile)s);	
+-	return (unzFile)s;	
++
++    s=(unz_s*)ALLOC(sizeof(unz_s));
++    *s=us;
++    unzGoToFirstFile((unzFile)s);
++    return (unzFile)s;
+ }
+ 
+ 
++extern unzFile ZEXPORT unzOpen (path)
++    const char *path;
++{
++    return unzOpen2(path, NULL);
++}
++
+ /*
+   Close a ZipFile opened with unzipOpen.
+   If there is files inside the .Zip opened with unzipOpenCurrentFile (see later),
+     these files MUST be closed with unzipCloseCurrentFile before call unzipClose.
+   return UNZ_OK if there is no problem. */
+ extern int ZEXPORT unzClose (file)
+-	unzFile file;
++    unzFile file;
+ {
+-	unz_s* s;
+-	if (file==NULL)
+-		return UNZ_PARAMERROR;
+-	s=(unz_s*)file;
++    unz_s* s;
++    if (file==NULL)
++        return UNZ_PARAMERROR;
++    s=(unz_s*)file;
+ 
+     if (s->pfile_in_zip_read!=NULL)
+         unzCloseCurrentFile(file);
+ 
+-	fclose(s->file);
+-	TRYFREE(s);
+-	return UNZ_OK;
++    ZCLOSE(s->z_filefunc, s->filestream);
++    TRYFREE(s);
++    return UNZ_OK;
+ }
+ 
+ 
+@@ -460,15 +530,15 @@
+   No preparation of the structure is needed
+   return UNZ_OK if there is no problem. */
+ extern int ZEXPORT unzGetGlobalInfo (file,pglobal_info)
+-	unzFile file;
+-	unz_global_info *pglobal_info;
++    unzFile file;
++    unz_global_info *pglobal_info;
+ {
+-	unz_s* s;
+-	if (file==NULL)
+-		return UNZ_PARAMERROR;
+-	s=(unz_s*)file;
+-	*pglobal_info=s->gi;
+-	return UNZ_OK;
++    unz_s* s;
++    if (file==NULL)
++        return UNZ_PARAMERROR;
++    s=(unz_s*)file;
++    *pglobal_info=s->gi;
++    return UNZ_OK;
+ }
+ 
+ 
+@@ -495,14 +565,14 @@
+ */
+ local int unzlocal_GetCurrentFileInfoInternal OF((unzFile file,
+                                                   unz_file_info *pfile_info,
+-                                                  unz_file_info_internal 
++                                                  unz_file_info_internal
+                                                   *pfile_info_internal,
+                                                   char *szFileName,
+-												  uLong fileNameBufferSize,
++                                                  uLong fileNameBufferSize,
+                                                   void *extraField,
+-												  uLong extraFieldBufferSize,
++                                                  uLong extraFieldBufferSize,
+                                                   char *szComment,
+-												  uLong commentBufferSize));
++                                                  uLong commentBufferSize));
+ 
+ local int unzlocal_GetCurrentFileInfoInternal (file,
+                                               pfile_info,
+@@ -510,156 +580,158 @@
+                                               szFileName, fileNameBufferSize,
+                                               extraField, extraFieldBufferSize,
+                                               szComment,  commentBufferSize)
+-	unzFile file;
+-	unz_file_info *pfile_info;
+-	unz_file_info_internal *pfile_info_internal;
+-	char *szFileName;
+-	uLong fileNameBufferSize;
+-	void *extraField;
+-	uLong extraFieldBufferSize;
+-	char *szComment;
+-	uLong commentBufferSize;
+-{
+-	unz_s* s;
+-	unz_file_info file_info;
+-	unz_file_info_internal file_info_internal;
+-	int err=UNZ_OK;
+-	uLong uMagic;
+-	long lSeek=0;
+-
+-	if (file==NULL)
+-		return UNZ_PARAMERROR;
+-	s=(unz_s*)file;
+-	if (fseek(s->file,s->pos_in_central_dir+s->byte_before_the_zipfile,SEEK_SET)!=0)
+-		err=UNZ_ERRNO;
+-
+-
+-	/* we check the magic */
+-	if (err==UNZ_OK)
+-		if (unzlocal_getLong(s->file,&uMagic) != UNZ_OK)
+-			err=UNZ_ERRNO;
+-		else if (uMagic!=0x02014b50)
+-			err=UNZ_BADZIPFILE;
+-
+-	if (unzlocal_getShort(s->file,&file_info.version) != UNZ_OK)
+-		err=UNZ_ERRNO;
+-
+-	if (unzlocal_getShort(s->file,&file_info.version_needed) != UNZ_OK)
+-		err=UNZ_ERRNO;
++    unzFile file;
++    unz_file_info *pfile_info;
++    unz_file_info_internal *pfile_info_internal;
++    char *szFileName;
++    uLong fileNameBufferSize;
++    void *extraField;
++    uLong extraFieldBufferSize;
++    char *szComment;
++    uLong commentBufferSize;
++{
++    unz_s* s;
++    unz_file_info file_info;
++    unz_file_info_internal file_info_internal;
++    int err=UNZ_OK;
++    uLong uMagic;
++    long lSeek=0;
++
++    if (file==NULL)
++        return UNZ_PARAMERROR;
++    s=(unz_s*)file;
++    if (ZSEEK(s->z_filefunc, s->filestream,
++              s->pos_in_central_dir+s->byte_before_the_zipfile,
++              ZLIB_FILEFUNC_SEEK_SET)!=0)
++        err=UNZ_ERRNO;
++
++
++    /* we check the magic */
++    if (err==UNZ_OK)
++        if (unzlocal_getLong(&s->z_filefunc, s->filestream,&uMagic) != UNZ_OK)
++            err=UNZ_ERRNO;
++        else if (uMagic!=0x02014b50)
++            err=UNZ_BADZIPFILE;
++
++    if (unzlocal_getShort(&s->z_filefunc, s->filestream,&file_info.version) != UNZ_OK)
++        err=UNZ_ERRNO;
+ 
+-	if (unzlocal_getShort(s->file,&file_info.flag) != UNZ_OK)
+-		err=UNZ_ERRNO;
++    if (unzlocal_getShort(&s->z_filefunc, s->filestream,&file_info.version_needed) != UNZ_OK)
++        err=UNZ_ERRNO;
+ 
+-	if (unzlocal_getShort(s->file,&file_info.compression_method) != UNZ_OK)
+-		err=UNZ_ERRNO;
++    if (unzlocal_getShort(&s->z_filefunc, s->filestream,&file_info.flag) != UNZ_OK)
++        err=UNZ_ERRNO;
+ 
+-	if (unzlocal_getLong(s->file,&file_info.dosDate) != UNZ_OK)
+-		err=UNZ_ERRNO;
++    if (unzlocal_getShort(&s->z_filefunc, s->filestream,&file_info.compression_method) != UNZ_OK)
++        err=UNZ_ERRNO;
++
++    if (unzlocal_getLong(&s->z_filefunc, s->filestream,&file_info.dosDate) != UNZ_OK)
++        err=UNZ_ERRNO;
+ 
+     unzlocal_DosDateToTmuDate(file_info.dosDate,&file_info.tmu_date);
+ 
+-	if (unzlocal_getLong(s->file,&file_info.crc) != UNZ_OK)
+-		err=UNZ_ERRNO;
++    if (unzlocal_getLong(&s->z_filefunc, s->filestream,&file_info.crc) != UNZ_OK)
++        err=UNZ_ERRNO;
++
++    if (unzlocal_getLong(&s->z_filefunc, s->filestream,&file_info.compressed_size) != UNZ_OK)
++        err=UNZ_ERRNO;
++
++    if (unzlocal_getLong(&s->z_filefunc, s->filestream,&file_info.uncompressed_size) != UNZ_OK)
++        err=UNZ_ERRNO;
++
++    if (unzlocal_getShort(&s->z_filefunc, s->filestream,&file_info.size_filename) != UNZ_OK)
++        err=UNZ_ERRNO;
++
++    if (unzlocal_getShort(&s->z_filefunc, s->filestream,&file_info.size_file_extra) != UNZ_OK)
++        err=UNZ_ERRNO;
++
++    if (unzlocal_getShort(&s->z_filefunc, s->filestream,&file_info.size_file_comment) != UNZ_OK)
++        err=UNZ_ERRNO;
++
++    if (unzlocal_getShort(&s->z_filefunc, s->filestream,&file_info.disk_num_start) != UNZ_OK)
++        err=UNZ_ERRNO;
++
++    if (unzlocal_getShort(&s->z_filefunc, s->filestream,&file_info.internal_fa) != UNZ_OK)
++        err=UNZ_ERRNO;
++
++    if (unzlocal_getLong(&s->z_filefunc, s->filestream,&file_info.external_fa) != UNZ_OK)
++        err=UNZ_ERRNO;
++
++    if (unzlocal_getLong(&s->z_filefunc, s->filestream,&file_info_internal.offset_curfile) != UNZ_OK)
++        err=UNZ_ERRNO;
++
++    lSeek+=file_info.size_filename;
++    if ((err==UNZ_OK) && (szFileName!=NULL))
++    {
++        uLong uSizeRead ;
++        if (file_info.size_filename<fileNameBufferSize)
++        {
++            *(szFileName+file_info.size_filename)='\0';
++            uSizeRead = file_info.size_filename;
++        }
++        else
++            uSizeRead = fileNameBufferSize;
++
++        if ((file_info.size_filename>0) && (fileNameBufferSize>0))
++            if (ZREAD(s->z_filefunc, s->filestream,szFileName,uSizeRead)!=uSizeRead)
++                err=UNZ_ERRNO;
++        lSeek -= uSizeRead;
++    }
++
++
++    if ((err==UNZ_OK) && (extraField!=NULL))
++    {
++        uLong uSizeRead ;
++        if (file_info.size_file_extra<extraFieldBufferSize)
++            uSizeRead = file_info.size_file_extra;
++        else
++            uSizeRead = extraFieldBufferSize;
++
++        if (lSeek!=0)
++            if (ZSEEK(s->z_filefunc, s->filestream,lSeek,ZLIB_FILEFUNC_SEEK_CUR)==0)
++                lSeek=0;
++            else
++                err=UNZ_ERRNO;
++        if ((file_info.size_file_extra>0) && (extraFieldBufferSize>0))
++            if (ZREAD(s->z_filefunc, s->filestream,extraField,uSizeRead)!=uSizeRead)
++                err=UNZ_ERRNO;
++        lSeek += file_info.size_file_extra - uSizeRead;
++    }
++    else
++        lSeek+=file_info.size_file_extra;
+ 
+-	if (unzlocal_getLong(s->file,&file_info.compressed_size) != UNZ_OK)
+-		err=UNZ_ERRNO;
+ 
+-	if (unzlocal_getLong(s->file,&file_info.uncompressed_size) != UNZ_OK)
+-		err=UNZ_ERRNO;
++    if ((err==UNZ_OK) && (szComment!=NULL))
++    {
++        uLong uSizeRead ;
++        if (file_info.size_file_comment<commentBufferSize)
++        {
++            *(szComment+file_info.size_file_comment)='\0';
++            uSizeRead = file_info.size_file_comment;
++        }
++        else
++            uSizeRead = commentBufferSize;
+ 
+-	if (unzlocal_getShort(s->file,&file_info.size_filename) != UNZ_OK)
+-		err=UNZ_ERRNO;
+-
+-	if (unzlocal_getShort(s->file,&file_info.size_file_extra) != UNZ_OK)
+-		err=UNZ_ERRNO;
+-
+-	if (unzlocal_getShort(s->file,&file_info.size_file_comment) != UNZ_OK)
+-		err=UNZ_ERRNO;
+-
+-	if (unzlocal_getShort(s->file,&file_info.disk_num_start) != UNZ_OK)
+-		err=UNZ_ERRNO;
+-
+-	if (unzlocal_getShort(s->file,&file_info.internal_fa) != UNZ_OK)
+-		err=UNZ_ERRNO;
+-
+-	if (unzlocal_getLong(s->file,&file_info.external_fa) != UNZ_OK)
+-		err=UNZ_ERRNO;
+-
+-	if (unzlocal_getLong(s->file,&file_info_internal.offset_curfile) != UNZ_OK)
+-		err=UNZ_ERRNO;
+-
+-	lSeek+=file_info.size_filename;
+-	if ((err==UNZ_OK) && (szFileName!=NULL))
+-	{
+-		uLong uSizeRead ;
+-		if (file_info.size_filename<fileNameBufferSize)
+-		{
+-			*(szFileName+file_info.size_filename)='\0';
+-			uSizeRead = file_info.size_filename;
+-		}
+-		else
+-			uSizeRead = fileNameBufferSize;
+-
+-		if ((file_info.size_filename>0) && (fileNameBufferSize>0))
+-			if (fread(szFileName,(uInt)uSizeRead,1,s->file)!=1)
+-				err=UNZ_ERRNO;
+-		lSeek -= uSizeRead;
+-	}
+-
+-	
+-	if ((err==UNZ_OK) && (extraField!=NULL))
+-	{
+-		uLong uSizeRead ;
+-		if (file_info.size_file_extra<extraFieldBufferSize)
+-			uSizeRead = file_info.size_file_extra;
+-		else
+-			uSizeRead = extraFieldBufferSize;
+-
+-		if (lSeek!=0)
+-			if (fseek(s->file,lSeek,SEEK_CUR)==0)
+-				lSeek=0;
+-			else
+-				err=UNZ_ERRNO;
+-		if ((file_info.size_file_extra>0) && (extraFieldBufferSize>0))
+-			if (fread(extraField,(uInt)uSizeRead,1,s->file)!=1)
+-				err=UNZ_ERRNO;
+-		lSeek += file_info.size_file_extra - uSizeRead;
+-	}
+-	else
+-		lSeek+=file_info.size_file_extra; 
+-
+-	
+-	if ((err==UNZ_OK) && (szComment!=NULL))
+-	{
+-		uLong uSizeRead ;
+-		if (file_info.size_file_comment<commentBufferSize)
+-		{
+-			*(szComment+file_info.size_file_comment)='\0';
+-			uSizeRead = file_info.size_file_comment;
+-		}
+-		else
+-			uSizeRead = commentBufferSize;
+-
+-		if (lSeek!=0)
+-			if (fseek(s->file,lSeek,SEEK_CUR)==0)
+-				lSeek=0;
+-			else
+-				err=UNZ_ERRNO;
+-		if ((file_info.size_file_comment>0) && (commentBufferSize>0))
+-			if (fread(szComment,(uInt)uSizeRead,1,s->file)!=1)
+-				err=UNZ_ERRNO;
+-		lSeek+=file_info.size_file_comment - uSizeRead;
+-	}
+-	else
+-		lSeek+=file_info.size_file_comment;
++        if (lSeek!=0)
++            if (ZSEEK(s->z_filefunc, s->filestream,lSeek,ZLIB_FILEFUNC_SEEK_CUR)==0)
++                lSeek=0;
++            else
++                err=UNZ_ERRNO;
++        if ((file_info.size_file_comment>0) && (commentBufferSize>0))
++            if (ZREAD(s->z_filefunc, s->filestream,szComment,uSizeRead)!=uSizeRead)
++                err=UNZ_ERRNO;
++        lSeek+=file_info.size_file_comment - uSizeRead;
++    }
++    else
++        lSeek+=file_info.size_file_comment;
+ 
+-	if ((err==UNZ_OK) && (pfile_info!=NULL))
+-		*pfile_info=file_info;
++    if ((err==UNZ_OK) && (pfile_info!=NULL))
++        *pfile_info=file_info;
+ 
+-	if ((err==UNZ_OK) && (pfile_info_internal!=NULL))
+-		*pfile_info_internal=file_info_internal;
++    if ((err==UNZ_OK) && (pfile_info_internal!=NULL))
++        *pfile_info_internal=file_info_internal;
+ 
+-	return err;
++    return err;
+ }
+ 
+ 
+@@ -670,23 +742,23 @@
+   return UNZ_OK if there is no problem.
+ */
+ extern int ZEXPORT unzGetCurrentFileInfo (file,
+-                                                  pfile_info,
+-                                                  szFileName, fileNameBufferSize,
+-                                                  extraField, extraFieldBufferSize,
+-                                                  szComment,  commentBufferSize)
+-	unzFile file;
+-	unz_file_info *pfile_info;
+-	char *szFileName;
+-	uLong fileNameBufferSize;
+-	void *extraField;
+-	uLong extraFieldBufferSize;
+-	char *szComment;
+-	uLong commentBufferSize;
+-{
+-	return unzlocal_GetCurrentFileInfoInternal(file,pfile_info,NULL,
+-												szFileName,fileNameBufferSize,
+-												extraField,extraFieldBufferSize,
+-												szComment,commentBufferSize);
++                                          pfile_info,
++                                          szFileName, fileNameBufferSize,
++                                          extraField, extraFieldBufferSize,
++                                          szComment,  commentBufferSize)
++    unzFile file;
++    unz_file_info *pfile_info;
++    char *szFileName;
++    uLong fileNameBufferSize;
++    void *extraField;
++    uLong extraFieldBufferSize;
++    char *szComment;
++    uLong commentBufferSize;
++{
++    return unzlocal_GetCurrentFileInfoInternal(file,pfile_info,NULL,
++                                                szFileName,fileNameBufferSize,
++                                                extraField,extraFieldBufferSize,
++                                                szComment,commentBufferSize);
+ }
+ 
+ /*
+@@ -694,50 +766,50 @@
+   return UNZ_OK if there is no problem
+ */
+ extern int ZEXPORT unzGoToFirstFile (file)
+-	unzFile file;
++    unzFile file;
+ {
+-	int err=UNZ_OK;
+-	unz_s* s;
+-	if (file==NULL)
+-		return UNZ_PARAMERROR;
+-	s=(unz_s*)file;
+-	s->pos_in_central_dir=s->offset_central_dir;
+-	s->num_file=0;
+-	err=unzlocal_GetCurrentFileInfoInternal(file,&s->cur_file_info,
+-											 &s->cur_file_info_internal,
+-											 NULL,0,NULL,0,NULL,0);
+-	s->current_file_ok = (err == UNZ_OK);
+-	return err;
++    int err=UNZ_OK;
++    unz_s* s;
++    if (file==NULL)
++        return UNZ_PARAMERROR;
++    s=(unz_s*)file;
++    s->pos_in_central_dir=s->offset_central_dir;
++    s->num_file=0;
++    err=unzlocal_GetCurrentFileInfoInternal(file,&s->cur_file_info,
++                                             &s->cur_file_info_internal,
++                                             NULL,0,NULL,0,NULL,0);
++    s->current_file_ok = (err == UNZ_OK);
++    return err;
+ }
+ 
+-
+ /*
+   Set the current file of the zipfile to the next file.
+   return UNZ_OK if there is no problem
+   return UNZ_END_OF_LIST_OF_FILE if the actual file was the latest.
+ */
+ extern int ZEXPORT unzGoToNextFile (file)
+-	unzFile file;
++    unzFile file;
+ {
+-	unz_s* s;	
+-	int err;
++    unz_s* s;
++    int err;
+ 
+-	if (file==NULL)
+-		return UNZ_PARAMERROR;
+-	s=(unz_s*)file;
+-	if (!s->current_file_ok)
+-		return UNZ_END_OF_LIST_OF_FILE;
+-	if (s->num_file+1==s->gi.number_entry)
+-		return UNZ_END_OF_LIST_OF_FILE;
+-
+-	s->pos_in_central_dir += SIZECENTRALDIRITEM + s->cur_file_info.size_filename +
+-			s->cur_file_info.size_file_extra + s->cur_file_info.size_file_comment ;
+-	s->num_file++;