MCPcopy Create free account
hub / github.com/Squirrel/Squirrel.Windows / lufopen

Function lufopen

src/Setup/unzip.cpp:2609–2648  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

2607
2608
2609LUFILE *lufopen(void *z,unsigned int len,DWORD flags,ZRESULT *err)
2610{ if (flags!=ZIP_HANDLE && flags!=ZIP_FILENAME && flags!=ZIP_MEMORY) {*err=ZR_ARGS; return NULL;}
2611 //
2612 HANDLE h=0; bool canseek=false; *err=ZR_OK;
2613 bool mustclosehandle=false;
2614 if (flags==ZIP_HANDLE||flags==ZIP_FILENAME)
2615 { if (flags==ZIP_HANDLE)
2616 { HANDLE hf = z;
2617 h=hf; mustclosehandle=false;
2618#ifdef DuplicateHandle
2619 BOOL res = DuplicateHandle(GetCurrentProcess(),hf,GetCurrentProcess(),&h,0,FALSE,DUPLICATE_SAME_ACCESS);
2620 if (!res) mustclosehandle=true;
2621#endif
2622 }
2623 else
2624 { h=CreateFile((const TCHAR*)z,GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
2625 if (h==INVALID_HANDLE_VALUE) {*err=ZR_NOFILE; return NULL;}
2626 mustclosehandle=true;
2627 }
2628 // test if we can seek on it. We can't use GetFileType(h)==FILE_TYPE_DISK since it's not on CE.
2629 DWORD res = SetFilePointer(h,0,0,FILE_CURRENT);
2630 canseek = (res!=0xFFFFFFFF);
2631 }
2632 LUFILE *lf = new LUFILE;
2633 if (flags==ZIP_HANDLE||flags==ZIP_FILENAME)
2634 { lf->is_handle=true; lf->mustclosehandle=mustclosehandle;
2635 lf->canseek=canseek;
2636 lf->h=h; lf->herr=false;
2637 lf->initial_offset=0;
2638 if (canseek) lf->initial_offset = SetFilePointer(h,0,NULL,FILE_CURRENT);
2639 }
2640 else
2641 { lf->is_handle=false;
2642 lf->canseek=true;
2643 lf->mustclosehandle=false;
2644 lf->buf=z; lf->len=len; lf->pos=0; lf->initial_offset=0;
2645 }
2646 *err=ZR_OK;
2647 return lf;
2648}
2649
2650
2651int lufclose(LUFILE *stream)

Callers 1

OpenMethod · 0.85

Calls

no outgoing calls

Tested by

no test coverage detected