bool MMapIndexInput::open(const char* path, IndexInput*& ret, CLuceneError& error, int32_t __bufferSize ) { //Func - Constructor. // Opens the file named path //Pre - path != NULL //Post - if the file could not be opened an exception is thrown. CND_PRECONDITION(path != NULL, "path is NULL"); Internal* _internal = _CLNEW Internal; #if defined(_CL_HAVE_FUNCTION_MAPVIEWOFFILE) _internal->mmaphandle = NULL; _internal->fhandle = CreateFileA(path,GENERIC_READ,FILE_SHARE_READ, 0,OPEN_EXISTING,0,0); //Check if a valid fhandle was retrieved if (_internal->fhandle < 0){ _cl_dword_t err = GetLastError(); if ( err == ERROR_FILE_NOT_FOUND ) error.set(CL_ERR_IO, "File does not exist"); else if ( err == ERROR_ACCESS_DENIED ) error.set(CL_ERR_IO, "File Access denied"); else if ( err == ERROR_TOO_MANY_OPEN_FILES ) error.set(CL_ERR_IO, "Too many open files"); else error.set(CL_ERR_IO, "Could not open file"); } _cl_dword_t dummy=0; _internal->_length = GetFileSize(_internal->fhandle, &dummy); if ( _internal->_length > 0 ){ _internal->mmaphandle = CreateFileMappingA(_internal->fhandle,NULL,PAGE_READONLY,0,0,NULL); if ( _internal->mmaphandle != NULL ){ void* address = MapViewOfFile(_internal->mmaphandle,FILE_MAP_READ,0,0,0); if ( address != NULL ){ _internal->data = (uint8_t*)address; ret = _CLNEW MMapIndexInput(_internal); return true; } } //failure: int errnum = GetLastError(); CloseHandle(_internal->mmaphandle); char* lpMsgBuf=strerror(errnum); size_t len = strlen(lpMsgBuf)+80; char* errstr = _CL_NEWARRAY(char, len); cl_sprintf(errstr, len, "MMapIndexInput::MMapIndexInput failed with error %d: %s", errnum, lpMsgBuf); error.set(CL_ERR_IO, errstr); _CLDELETE_CaARRAY(errstr); }