| 2607 | |
| 2608 | |
| 2609 | LUFILE *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 | |
| 2651 | int lufclose(LUFILE *stream) |