xref: /reactos/dll/shellext/zipfldr/zippidl.cpp (revision fb5d5ecd)
1 /*
2  * PROJECT:     ReactOS Zip Shell Extension
3  * LICENSE:     GPL-2.0+ (https://spdx.org/licenses/GPL-2.0+)
4  * PURPOSE:     zip pidl handling
5  * COPYRIGHT:   Copyright 2017 Mark Jansen (mark.jansen@reactos.org)
6  */
7 
8 #include "precomp.h"
9 
10 LPITEMIDLIST _ILCreate(ZipPidlType Type, LPCSTR lpString, unz_file_info64& info)
11 {
12     int cbData = sizeof(ZipPidlEntry) + strlen(lpString);
13     ZipPidlEntry* pidl = (ZipPidlEntry*)SHAlloc(cbData + sizeof(WORD));
14     if (!pidl)
15         return NULL;
16 
17     ZeroMemory(pidl, cbData + sizeof(WORD));
18 
19     pidl->cb = cbData;
20     pidl->MagicType = 'z';
21     pidl->ZipType = Type;
22 
23     if (Type != ZIP_PIDL_DIRECTORY)
24     {
25         pidl->CompressedSize = info.compressed_size;
26         pidl->UncompressedSize = info.uncompressed_size;
27         pidl->DosDate = info.dosDate;
28         pidl->Password = info.flag & 1;
29     }
30 
31     strcpy(pidl->Name, lpString);
32     *(WORD*)((char*)pidl + cbData) = 0;
33 
34     return (LPITEMIDLIST)pidl;
35 }
36 
37 
38 const ZipPidlEntry* _ZipFromIL(LPCITEMIDLIST pidl)
39 {
40     const ZipPidlEntry* zipPidl = (const ZipPidlEntry*)pidl;
41     if (zipPidl->MagicType == 'z')
42         return zipPidl;
43     return NULL;
44 }
45