xref: /aosp_15_r20/external/lzma/CPP/7zip/UI/Far/Plugin.cpp (revision f6dc9357d832569d4d1f5d24eacdb3935a1ae8e6)
1*f6dc9357SAndroid Build Coastguard Worker // Plugin.cpp
2*f6dc9357SAndroid Build Coastguard Worker 
3*f6dc9357SAndroid Build Coastguard Worker #include "StdAfx.h"
4*f6dc9357SAndroid Build Coastguard Worker 
5*f6dc9357SAndroid Build Coastguard Worker #include "../../../Common/IntToString.h"
6*f6dc9357SAndroid Build Coastguard Worker #include "../../../Common/StringConvert.h"
7*f6dc9357SAndroid Build Coastguard Worker #include "../../../Common/Wildcard.h"
8*f6dc9357SAndroid Build Coastguard Worker 
9*f6dc9357SAndroid Build Coastguard Worker #include "../../../Windows/FileDir.h"
10*f6dc9357SAndroid Build Coastguard Worker #include "../../../Windows/PropVariantConv.h"
11*f6dc9357SAndroid Build Coastguard Worker 
12*f6dc9357SAndroid Build Coastguard Worker #include "../Common/PropIDUtils.h"
13*f6dc9357SAndroid Build Coastguard Worker 
14*f6dc9357SAndroid Build Coastguard Worker #include "FarUtils.h"
15*f6dc9357SAndroid Build Coastguard Worker #include "Messages.h"
16*f6dc9357SAndroid Build Coastguard Worker #include "Plugin.h"
17*f6dc9357SAndroid Build Coastguard Worker 
18*f6dc9357SAndroid Build Coastguard Worker using namespace NWindows;
19*f6dc9357SAndroid Build Coastguard Worker using namespace NFile;
20*f6dc9357SAndroid Build Coastguard Worker using namespace NDir;
21*f6dc9357SAndroid Build Coastguard Worker using namespace NFar;
22*f6dc9357SAndroid Build Coastguard Worker 
23*f6dc9357SAndroid Build Coastguard Worker // This function is used by CAgentFolder
24*f6dc9357SAndroid Build Coastguard Worker int CompareFileNames_ForFolderList(const wchar_t *s1, const wchar_t *s2);
CompareFileNames_ForFolderList(const wchar_t * s1,const wchar_t * s2)25*f6dc9357SAndroid Build Coastguard Worker int CompareFileNames_ForFolderList(const wchar_t *s1, const wchar_t *s2)
26*f6dc9357SAndroid Build Coastguard Worker {
27*f6dc9357SAndroid Build Coastguard Worker   return MyStringCompareNoCase(s1, s2);
28*f6dc9357SAndroid Build Coastguard Worker }
29*f6dc9357SAndroid Build Coastguard Worker 
CPlugin(const FString & fileName,CAgent * agent,UString archiveTypeName)30*f6dc9357SAndroid Build Coastguard Worker CPlugin::CPlugin(const FString &fileName, CAgent *agent, UString archiveTypeName):
31*f6dc9357SAndroid Build Coastguard Worker     _agent(agent),
32*f6dc9357SAndroid Build Coastguard Worker     m_FileName(fileName),
33*f6dc9357SAndroid Build Coastguard Worker     _archiveTypeName(archiveTypeName),
34*f6dc9357SAndroid Build Coastguard Worker     PasswordIsDefined(false)
35*f6dc9357SAndroid Build Coastguard Worker {
36*f6dc9357SAndroid Build Coastguard Worker   m_ArchiveHandler = agent;
37*f6dc9357SAndroid Build Coastguard Worker   if (!m_FileInfo.Find(m_FileName))
38*f6dc9357SAndroid Build Coastguard Worker     throw "error";
39*f6dc9357SAndroid Build Coastguard Worker   m_ArchiveHandler->BindToRootFolder(&_folder);
40*f6dc9357SAndroid Build Coastguard Worker }
41*f6dc9357SAndroid Build Coastguard Worker 
~CPlugin()42*f6dc9357SAndroid Build Coastguard Worker CPlugin::~CPlugin() {}
43*f6dc9357SAndroid Build Coastguard Worker 
MyGetFileTime(IFolderFolder * folder,UInt32 itemIndex,PROPID propID,FILETIME & fileTime)44*f6dc9357SAndroid Build Coastguard Worker static void MyGetFileTime(IFolderFolder *folder, UInt32 itemIndex,
45*f6dc9357SAndroid Build Coastguard Worker     PROPID propID, FILETIME &fileTime)
46*f6dc9357SAndroid Build Coastguard Worker {
47*f6dc9357SAndroid Build Coastguard Worker   NCOM::CPropVariant prop;
48*f6dc9357SAndroid Build Coastguard Worker   if (folder->GetProperty(itemIndex, propID, &prop) != S_OK)
49*f6dc9357SAndroid Build Coastguard Worker     throw 271932;
50*f6dc9357SAndroid Build Coastguard Worker   if (prop.vt == VT_EMPTY)
51*f6dc9357SAndroid Build Coastguard Worker   {
52*f6dc9357SAndroid Build Coastguard Worker     fileTime.dwHighDateTime = 0;
53*f6dc9357SAndroid Build Coastguard Worker     fileTime.dwLowDateTime = 0;
54*f6dc9357SAndroid Build Coastguard Worker   }
55*f6dc9357SAndroid Build Coastguard Worker   else
56*f6dc9357SAndroid Build Coastguard Worker   {
57*f6dc9357SAndroid Build Coastguard Worker     if (prop.vt != VT_FILETIME)
58*f6dc9357SAndroid Build Coastguard Worker       throw 4191730;
59*f6dc9357SAndroid Build Coastguard Worker     fileTime = prop.filetime;
60*f6dc9357SAndroid Build Coastguard Worker   }
61*f6dc9357SAndroid Build Coastguard Worker }
62*f6dc9357SAndroid Build Coastguard Worker 
63*f6dc9357SAndroid Build Coastguard Worker #define kDotsReplaceString "[[..]]"
64*f6dc9357SAndroid Build Coastguard Worker #define kDotsReplaceStringU L"[[..]]"
65*f6dc9357SAndroid Build Coastguard Worker 
CopyStrLimited(char * dest,const AString & src,unsigned len)66*f6dc9357SAndroid Build Coastguard Worker static void CopyStrLimited(char *dest, const AString &src, unsigned len)
67*f6dc9357SAndroid Build Coastguard Worker {
68*f6dc9357SAndroid Build Coastguard Worker   len--;
69*f6dc9357SAndroid Build Coastguard Worker   if (src.Len() < len)
70*f6dc9357SAndroid Build Coastguard Worker     len = src.Len();
71*f6dc9357SAndroid Build Coastguard Worker   memcpy(dest, src, sizeof(dest[0]) * len);
72*f6dc9357SAndroid Build Coastguard Worker   dest[len] = 0;
73*f6dc9357SAndroid Build Coastguard Worker }
74*f6dc9357SAndroid Build Coastguard Worker 
75*f6dc9357SAndroid Build Coastguard Worker #define COPY_STR_LIMITED(dest, src) CopyStrLimited(dest, src, Z7_ARRAY_SIZE(dest))
76*f6dc9357SAndroid Build Coastguard Worker 
ReadPluginPanelItem(PluginPanelItem & panelItem,UInt32 itemIndex)77*f6dc9357SAndroid Build Coastguard Worker void CPlugin::ReadPluginPanelItem(PluginPanelItem &panelItem, UInt32 itemIndex)
78*f6dc9357SAndroid Build Coastguard Worker {
79*f6dc9357SAndroid Build Coastguard Worker   NCOM::CPropVariant prop;
80*f6dc9357SAndroid Build Coastguard Worker   if (_folder->GetProperty(itemIndex, kpidName, &prop) != S_OK)
81*f6dc9357SAndroid Build Coastguard Worker     throw 271932;
82*f6dc9357SAndroid Build Coastguard Worker 
83*f6dc9357SAndroid Build Coastguard Worker   if (prop.vt != VT_BSTR)
84*f6dc9357SAndroid Build Coastguard Worker     throw 272340;
85*f6dc9357SAndroid Build Coastguard Worker 
86*f6dc9357SAndroid Build Coastguard Worker   AString oemString (UnicodeStringToMultiByte(prop.bstrVal, CP_OEMCP));
87*f6dc9357SAndroid Build Coastguard Worker   if (oemString == "..")
88*f6dc9357SAndroid Build Coastguard Worker     oemString = kDotsReplaceString;
89*f6dc9357SAndroid Build Coastguard Worker 
90*f6dc9357SAndroid Build Coastguard Worker   COPY_STR_LIMITED(panelItem.FindData.cFileName, oemString);
91*f6dc9357SAndroid Build Coastguard Worker   panelItem.FindData.cAlternateFileName[0] = 0;
92*f6dc9357SAndroid Build Coastguard Worker 
93*f6dc9357SAndroid Build Coastguard Worker   if (_folder->GetProperty(itemIndex, kpidAttrib, &prop) != S_OK)
94*f6dc9357SAndroid Build Coastguard Worker     throw 271932;
95*f6dc9357SAndroid Build Coastguard Worker   if (prop.vt == VT_UI4)
96*f6dc9357SAndroid Build Coastguard Worker     panelItem.FindData.dwFileAttributes  = prop.ulVal;
97*f6dc9357SAndroid Build Coastguard Worker   else if (prop.vt == VT_EMPTY)
98*f6dc9357SAndroid Build Coastguard Worker     panelItem.FindData.dwFileAttributes = m_FileInfo.Attrib;
99*f6dc9357SAndroid Build Coastguard Worker   else
100*f6dc9357SAndroid Build Coastguard Worker     throw 21631;
101*f6dc9357SAndroid Build Coastguard Worker 
102*f6dc9357SAndroid Build Coastguard Worker   if (_folder->GetProperty(itemIndex, kpidIsDir, &prop) != S_OK)
103*f6dc9357SAndroid Build Coastguard Worker     throw 271932;
104*f6dc9357SAndroid Build Coastguard Worker   if (prop.vt == VT_BOOL)
105*f6dc9357SAndroid Build Coastguard Worker   {
106*f6dc9357SAndroid Build Coastguard Worker     if (VARIANT_BOOLToBool(prop.boolVal))
107*f6dc9357SAndroid Build Coastguard Worker       panelItem.FindData.dwFileAttributes |= FILE_ATTRIBUTE_DIRECTORY;
108*f6dc9357SAndroid Build Coastguard Worker   }
109*f6dc9357SAndroid Build Coastguard Worker   else if (prop.vt != VT_EMPTY)
110*f6dc9357SAndroid Build Coastguard Worker     throw 21632;
111*f6dc9357SAndroid Build Coastguard Worker 
112*f6dc9357SAndroid Build Coastguard Worker   if (_folder->GetProperty(itemIndex, kpidSize, &prop) != S_OK)
113*f6dc9357SAndroid Build Coastguard Worker     throw 271932;
114*f6dc9357SAndroid Build Coastguard Worker   UInt64 length = 0;
115*f6dc9357SAndroid Build Coastguard Worker   ConvertPropVariantToUInt64(prop, length);
116*f6dc9357SAndroid Build Coastguard Worker   panelItem.FindData.nFileSizeLow = (UInt32)length;
117*f6dc9357SAndroid Build Coastguard Worker   panelItem.FindData.nFileSizeHigh = (UInt32)(length >> 32);
118*f6dc9357SAndroid Build Coastguard Worker 
119*f6dc9357SAndroid Build Coastguard Worker   MyGetFileTime(_folder, itemIndex, kpidCTime, panelItem.FindData.ftCreationTime);
120*f6dc9357SAndroid Build Coastguard Worker   MyGetFileTime(_folder, itemIndex, kpidATime, panelItem.FindData.ftLastAccessTime);
121*f6dc9357SAndroid Build Coastguard Worker   MyGetFileTime(_folder, itemIndex, kpidMTime, panelItem.FindData.ftLastWriteTime);
122*f6dc9357SAndroid Build Coastguard Worker 
123*f6dc9357SAndroid Build Coastguard Worker   if (panelItem.FindData.ftLastWriteTime.dwHighDateTime == 0 &&
124*f6dc9357SAndroid Build Coastguard Worker       panelItem.FindData.ftLastWriteTime.dwLowDateTime == 0)
125*f6dc9357SAndroid Build Coastguard Worker     panelItem.FindData.ftLastWriteTime = m_FileInfo.MTime;
126*f6dc9357SAndroid Build Coastguard Worker 
127*f6dc9357SAndroid Build Coastguard Worker   if (_folder->GetProperty(itemIndex, kpidPackSize, &prop) != S_OK)
128*f6dc9357SAndroid Build Coastguard Worker     throw 271932;
129*f6dc9357SAndroid Build Coastguard Worker   length = 0;
130*f6dc9357SAndroid Build Coastguard Worker   ConvertPropVariantToUInt64(prop, length);
131*f6dc9357SAndroid Build Coastguard Worker   panelItem.PackSize = UInt32(length);
132*f6dc9357SAndroid Build Coastguard Worker   panelItem.PackSizeHigh = UInt32(length >> 32);
133*f6dc9357SAndroid Build Coastguard Worker 
134*f6dc9357SAndroid Build Coastguard Worker   panelItem.Flags = 0;
135*f6dc9357SAndroid Build Coastguard Worker   panelItem.NumberOfLinks = 0;
136*f6dc9357SAndroid Build Coastguard Worker 
137*f6dc9357SAndroid Build Coastguard Worker   panelItem.Description = NULL;
138*f6dc9357SAndroid Build Coastguard Worker   panelItem.Owner = NULL;
139*f6dc9357SAndroid Build Coastguard Worker   panelItem.CustomColumnData = NULL;
140*f6dc9357SAndroid Build Coastguard Worker   panelItem.CustomColumnNumber = 0;
141*f6dc9357SAndroid Build Coastguard Worker 
142*f6dc9357SAndroid Build Coastguard Worker   panelItem.CRC32 = 0;
143*f6dc9357SAndroid Build Coastguard Worker   panelItem.Reserved[0] = 0;
144*f6dc9357SAndroid Build Coastguard Worker   panelItem.Reserved[1] = 0;
145*f6dc9357SAndroid Build Coastguard Worker }
146*f6dc9357SAndroid Build Coastguard Worker 
GetFindData(PluginPanelItem ** panelItems,int * itemsNumber,int opMode)147*f6dc9357SAndroid Build Coastguard Worker int CPlugin::GetFindData(PluginPanelItem **panelItems, int *itemsNumber, int opMode)
148*f6dc9357SAndroid Build Coastguard Worker {
149*f6dc9357SAndroid Build Coastguard Worker   // CScreenRestorer screenRestorer;
150*f6dc9357SAndroid Build Coastguard Worker   if ((opMode & OPM_SILENT) == 0 && (opMode & OPM_FIND ) == 0)
151*f6dc9357SAndroid Build Coastguard Worker   {
152*f6dc9357SAndroid Build Coastguard Worker     /*
153*f6dc9357SAndroid Build Coastguard Worker     screenRestorer.Save();
154*f6dc9357SAndroid Build Coastguard Worker     const char *msgItems[]=
155*f6dc9357SAndroid Build Coastguard Worker     {
156*f6dc9357SAndroid Build Coastguard Worker       g_StartupInfo.GetMsgString(NMessageID::kWaitTitle),
157*f6dc9357SAndroid Build Coastguard Worker         g_StartupInfo.GetMsgString(NMessageID::kReadingList)
158*f6dc9357SAndroid Build Coastguard Worker     };
159*f6dc9357SAndroid Build Coastguard Worker     g_StartupInfo.ShowMessage(0, NULL, msgItems, Z7_ARRAY_SIZE(msgItems), 0);
160*f6dc9357SAndroid Build Coastguard Worker     */
161*f6dc9357SAndroid Build Coastguard Worker   }
162*f6dc9357SAndroid Build Coastguard Worker 
163*f6dc9357SAndroid Build Coastguard Worker   UInt32 numItems;
164*f6dc9357SAndroid Build Coastguard Worker   _folder->GetNumberOfItems(&numItems);
165*f6dc9357SAndroid Build Coastguard Worker   *panelItems = new PluginPanelItem[numItems];
166*f6dc9357SAndroid Build Coastguard Worker   try
167*f6dc9357SAndroid Build Coastguard Worker   {
168*f6dc9357SAndroid Build Coastguard Worker     for (UInt32 i = 0; i < numItems; i++)
169*f6dc9357SAndroid Build Coastguard Worker     {
170*f6dc9357SAndroid Build Coastguard Worker       PluginPanelItem &panelItem = (*panelItems)[i];
171*f6dc9357SAndroid Build Coastguard Worker       ReadPluginPanelItem(panelItem, i);
172*f6dc9357SAndroid Build Coastguard Worker       panelItem.UserData = i;
173*f6dc9357SAndroid Build Coastguard Worker     }
174*f6dc9357SAndroid Build Coastguard Worker   }
175*f6dc9357SAndroid Build Coastguard Worker   catch(...)
176*f6dc9357SAndroid Build Coastguard Worker   {
177*f6dc9357SAndroid Build Coastguard Worker     delete [](*panelItems);
178*f6dc9357SAndroid Build Coastguard Worker     throw;
179*f6dc9357SAndroid Build Coastguard Worker   }
180*f6dc9357SAndroid Build Coastguard Worker   *itemsNumber = (int)numItems;
181*f6dc9357SAndroid Build Coastguard Worker   return(TRUE);
182*f6dc9357SAndroid Build Coastguard Worker }
183*f6dc9357SAndroid Build Coastguard Worker 
FreeFindData(struct PluginPanelItem * panelItems,int itemsNumber)184*f6dc9357SAndroid Build Coastguard Worker void CPlugin::FreeFindData(struct PluginPanelItem *panelItems, int itemsNumber)
185*f6dc9357SAndroid Build Coastguard Worker {
186*f6dc9357SAndroid Build Coastguard Worker   for (int i = 0; i < itemsNumber; i++)
187*f6dc9357SAndroid Build Coastguard Worker     if (panelItems[i].Description != NULL)
188*f6dc9357SAndroid Build Coastguard Worker       delete []panelItems[i].Description;
189*f6dc9357SAndroid Build Coastguard Worker   delete []panelItems;
190*f6dc9357SAndroid Build Coastguard Worker }
191*f6dc9357SAndroid Build Coastguard Worker 
EnterToDirectory(const UString & dirName)192*f6dc9357SAndroid Build Coastguard Worker void CPlugin::EnterToDirectory(const UString &dirName)
193*f6dc9357SAndroid Build Coastguard Worker {
194*f6dc9357SAndroid Build Coastguard Worker   CMyComPtr<IFolderFolder> newFolder;
195*f6dc9357SAndroid Build Coastguard Worker   UString s = dirName;
196*f6dc9357SAndroid Build Coastguard Worker   if (dirName == kDotsReplaceStringU)
197*f6dc9357SAndroid Build Coastguard Worker     s = "..";
198*f6dc9357SAndroid Build Coastguard Worker   _folder->BindToFolder(s, &newFolder);
199*f6dc9357SAndroid Build Coastguard Worker   if (!newFolder)
200*f6dc9357SAndroid Build Coastguard Worker   {
201*f6dc9357SAndroid Build Coastguard Worker     if (dirName.IsEmpty())
202*f6dc9357SAndroid Build Coastguard Worker       return;
203*f6dc9357SAndroid Build Coastguard Worker     else
204*f6dc9357SAndroid Build Coastguard Worker       throw 40325;
205*f6dc9357SAndroid Build Coastguard Worker   }
206*f6dc9357SAndroid Build Coastguard Worker   _folder = newFolder;
207*f6dc9357SAndroid Build Coastguard Worker }
208*f6dc9357SAndroid Build Coastguard Worker 
SetDirectory(const char * aszDir,int)209*f6dc9357SAndroid Build Coastguard Worker int CPlugin::SetDirectory(const char *aszDir, int /* opMode */)
210*f6dc9357SAndroid Build Coastguard Worker {
211*f6dc9357SAndroid Build Coastguard Worker   UString path = MultiByteToUnicodeString(aszDir, CP_OEMCP);
212*f6dc9357SAndroid Build Coastguard Worker   if (path == WSTRING_PATH_SEPARATOR)
213*f6dc9357SAndroid Build Coastguard Worker   {
214*f6dc9357SAndroid Build Coastguard Worker     _folder.Release();
215*f6dc9357SAndroid Build Coastguard Worker     m_ArchiveHandler->BindToRootFolder(&_folder);
216*f6dc9357SAndroid Build Coastguard Worker   }
217*f6dc9357SAndroid Build Coastguard Worker   else if (path == L"..")
218*f6dc9357SAndroid Build Coastguard Worker   {
219*f6dc9357SAndroid Build Coastguard Worker     CMyComPtr<IFolderFolder> newFolder;
220*f6dc9357SAndroid Build Coastguard Worker     _folder->BindToParentFolder(&newFolder);
221*f6dc9357SAndroid Build Coastguard Worker     if (!newFolder)
222*f6dc9357SAndroid Build Coastguard Worker       throw 40312;
223*f6dc9357SAndroid Build Coastguard Worker     _folder = newFolder;
224*f6dc9357SAndroid Build Coastguard Worker   }
225*f6dc9357SAndroid Build Coastguard Worker   else if (path.IsEmpty())
226*f6dc9357SAndroid Build Coastguard Worker     EnterToDirectory(path);
227*f6dc9357SAndroid Build Coastguard Worker   else
228*f6dc9357SAndroid Build Coastguard Worker   {
229*f6dc9357SAndroid Build Coastguard Worker     if (path[0] == WCHAR_PATH_SEPARATOR)
230*f6dc9357SAndroid Build Coastguard Worker     {
231*f6dc9357SAndroid Build Coastguard Worker       _folder.Release();
232*f6dc9357SAndroid Build Coastguard Worker       m_ArchiveHandler->BindToRootFolder(&_folder);
233*f6dc9357SAndroid Build Coastguard Worker       path.DeleteFrontal(1);
234*f6dc9357SAndroid Build Coastguard Worker     }
235*f6dc9357SAndroid Build Coastguard Worker     UStringVector pathParts;
236*f6dc9357SAndroid Build Coastguard Worker     SplitPathToParts(path, pathParts);
237*f6dc9357SAndroid Build Coastguard Worker     FOR_VECTOR (i, pathParts)
238*f6dc9357SAndroid Build Coastguard Worker       EnterToDirectory(pathParts[i]);
239*f6dc9357SAndroid Build Coastguard Worker   }
240*f6dc9357SAndroid Build Coastguard Worker   SetCurrentDirVar();
241*f6dc9357SAndroid Build Coastguard Worker   return TRUE;
242*f6dc9357SAndroid Build Coastguard Worker }
243*f6dc9357SAndroid Build Coastguard Worker 
GetPathParts(UStringVector & pathParts)244*f6dc9357SAndroid Build Coastguard Worker void CPlugin::GetPathParts(UStringVector &pathParts)
245*f6dc9357SAndroid Build Coastguard Worker {
246*f6dc9357SAndroid Build Coastguard Worker   pathParts.Clear();
247*f6dc9357SAndroid Build Coastguard Worker   CMyComPtr<IFolderFolder> folderItem = _folder;
248*f6dc9357SAndroid Build Coastguard Worker   for (;;)
249*f6dc9357SAndroid Build Coastguard Worker   {
250*f6dc9357SAndroid Build Coastguard Worker     CMyComPtr<IFolderFolder> newFolder;
251*f6dc9357SAndroid Build Coastguard Worker     folderItem->BindToParentFolder(&newFolder);
252*f6dc9357SAndroid Build Coastguard Worker     if (!newFolder)
253*f6dc9357SAndroid Build Coastguard Worker       break;
254*f6dc9357SAndroid Build Coastguard Worker     NCOM::CPropVariant prop;
255*f6dc9357SAndroid Build Coastguard Worker     if (folderItem->GetFolderProperty(kpidName, &prop) == S_OK)
256*f6dc9357SAndroid Build Coastguard Worker       if (prop.vt == VT_BSTR)
257*f6dc9357SAndroid Build Coastguard Worker         pathParts.Insert(0, (const wchar_t *)prop.bstrVal);
258*f6dc9357SAndroid Build Coastguard Worker     folderItem = newFolder;
259*f6dc9357SAndroid Build Coastguard Worker   }
260*f6dc9357SAndroid Build Coastguard Worker }
261*f6dc9357SAndroid Build Coastguard Worker 
SetCurrentDirVar()262*f6dc9357SAndroid Build Coastguard Worker void CPlugin::SetCurrentDirVar()
263*f6dc9357SAndroid Build Coastguard Worker {
264*f6dc9357SAndroid Build Coastguard Worker   m_CurrentDir.Empty();
265*f6dc9357SAndroid Build Coastguard Worker 
266*f6dc9357SAndroid Build Coastguard Worker   /*
267*f6dc9357SAndroid Build Coastguard Worker   // kpidPath path has tail slash, but we don't need it for compatibility with default FAR style
268*f6dc9357SAndroid Build Coastguard Worker   NCOM::CPropVariant prop;
269*f6dc9357SAndroid Build Coastguard Worker   if (_folder->GetFolderProperty(kpidPath, &prop) == S_OK)
270*f6dc9357SAndroid Build Coastguard Worker     if (prop.vt == VT_BSTR)
271*f6dc9357SAndroid Build Coastguard Worker     {
272*f6dc9357SAndroid Build Coastguard Worker       m_CurrentDir = (wchar_t *)prop.bstrVal;
273*f6dc9357SAndroid Build Coastguard Worker       // if (!m_CurrentDir.IsEmpty())
274*f6dc9357SAndroid Build Coastguard Worker     }
275*f6dc9357SAndroid Build Coastguard Worker   m_CurrentDir.InsertAtFront(WCHAR_PATH_SEPARATOR);
276*f6dc9357SAndroid Build Coastguard Worker   */
277*f6dc9357SAndroid Build Coastguard Worker 
278*f6dc9357SAndroid Build Coastguard Worker   UStringVector pathParts;
279*f6dc9357SAndroid Build Coastguard Worker   GetPathParts(pathParts);
280*f6dc9357SAndroid Build Coastguard Worker   FOR_VECTOR (i, pathParts)
281*f6dc9357SAndroid Build Coastguard Worker   {
282*f6dc9357SAndroid Build Coastguard Worker     m_CurrentDir.Add_PathSepar();
283*f6dc9357SAndroid Build Coastguard Worker     m_CurrentDir += pathParts[i];
284*f6dc9357SAndroid Build Coastguard Worker   }
285*f6dc9357SAndroid Build Coastguard Worker }
286*f6dc9357SAndroid Build Coastguard Worker 
287*f6dc9357SAndroid Build Coastguard Worker static const char * const kPluginFormatName = "7-ZIP";
288*f6dc9357SAndroid Build Coastguard Worker 
289*f6dc9357SAndroid Build Coastguard Worker 
FindPropNameID(PROPID propID)290*f6dc9357SAndroid Build Coastguard Worker static int FindPropNameID(PROPID propID)
291*f6dc9357SAndroid Build Coastguard Worker {
292*f6dc9357SAndroid Build Coastguard Worker   if (propID > NMessageID::k_Last_PropId_supported_by_plugin)
293*f6dc9357SAndroid Build Coastguard Worker     return -1;
294*f6dc9357SAndroid Build Coastguard Worker   return NMessageID::kNoProperty + (int)propID;
295*f6dc9357SAndroid Build Coastguard Worker }
296*f6dc9357SAndroid Build Coastguard Worker 
297*f6dc9357SAndroid Build Coastguard Worker /*
298*f6dc9357SAndroid Build Coastguard Worker struct CPropertyIDInfo
299*f6dc9357SAndroid Build Coastguard Worker {
300*f6dc9357SAndroid Build Coastguard Worker   PROPID PropID;
301*f6dc9357SAndroid Build Coastguard Worker   const char *FarID;
302*f6dc9357SAndroid Build Coastguard Worker   int Width;
303*f6dc9357SAndroid Build Coastguard Worker   // char CharID;
304*f6dc9357SAndroid Build Coastguard Worker };
305*f6dc9357SAndroid Build Coastguard Worker 
306*f6dc9357SAndroid Build Coastguard Worker static CPropertyIDInfo kPropertyIDInfos[] =
307*f6dc9357SAndroid Build Coastguard Worker {
308*f6dc9357SAndroid Build Coastguard Worker   { kpidName, "N", 0},
309*f6dc9357SAndroid Build Coastguard Worker   { kpidSize, "S", 8},
310*f6dc9357SAndroid Build Coastguard Worker   { kpidPackSize, "P", 8},
311*f6dc9357SAndroid Build Coastguard Worker   { kpidAttrib, "A", 0},
312*f6dc9357SAndroid Build Coastguard Worker   { kpidCTime, "DC", 14},
313*f6dc9357SAndroid Build Coastguard Worker   { kpidATime, "DA", 14},
314*f6dc9357SAndroid Build Coastguard Worker   { kpidMTime, "DM", 14},
315*f6dc9357SAndroid Build Coastguard Worker 
316*f6dc9357SAndroid Build Coastguard Worker   { kpidSolid, NULL, 0, 'S'},
317*f6dc9357SAndroid Build Coastguard Worker   { kpidEncrypted, NULL, 0, 'P'},
318*f6dc9357SAndroid Build Coastguard Worker 
319*f6dc9357SAndroid Build Coastguard Worker   { kpidDictionarySize, IDS_PROPERTY_DICTIONARY_SIZE },
320*f6dc9357SAndroid Build Coastguard Worker   { kpidSplitBefore, NULL, 'B'},
321*f6dc9357SAndroid Build Coastguard Worker   { kpidSplitAfter, NULL, 'A'},
322*f6dc9357SAndroid Build Coastguard Worker   { kpidComment, NULL, 'C'},
323*f6dc9357SAndroid Build Coastguard Worker   { kpidCRC, IDS_PROPERTY_CRC }
324*f6dc9357SAndroid Build Coastguard Worker   // { kpidType, L"Type" }
325*f6dc9357SAndroid Build Coastguard Worker };
326*f6dc9357SAndroid Build Coastguard Worker 
327*f6dc9357SAndroid Build Coastguard Worker static const int kNumPropertyIDInfos = Z7_ARRAY_SIZE(kPropertyIDInfos);
328*f6dc9357SAndroid Build Coastguard Worker 
329*f6dc9357SAndroid Build Coastguard Worker static int FindPropertyInfo(PROPID propID)
330*f6dc9357SAndroid Build Coastguard Worker {
331*f6dc9357SAndroid Build Coastguard Worker   for (int i = 0; i < kNumPropertyIDInfos; i++)
332*f6dc9357SAndroid Build Coastguard Worker     if (kPropertyIDInfos[i].PropID == propID)
333*f6dc9357SAndroid Build Coastguard Worker       return i;
334*f6dc9357SAndroid Build Coastguard Worker   return -1;
335*f6dc9357SAndroid Build Coastguard Worker }
336*f6dc9357SAndroid Build Coastguard Worker */
337*f6dc9357SAndroid Build Coastguard Worker 
338*f6dc9357SAndroid Build Coastguard Worker // char *g_Titles[] = { "a", "f", "v" };
339*f6dc9357SAndroid Build Coastguard Worker /*
340*f6dc9357SAndroid Build Coastguard Worker static void SmartAddToString(AString &destString, const char *srcString)
341*f6dc9357SAndroid Build Coastguard Worker {
342*f6dc9357SAndroid Build Coastguard Worker   if (!destString.IsEmpty())
343*f6dc9357SAndroid Build Coastguard Worker     destString += ',';
344*f6dc9357SAndroid Build Coastguard Worker   destString += srcString;
345*f6dc9357SAndroid Build Coastguard Worker }
346*f6dc9357SAndroid Build Coastguard Worker */
347*f6dc9357SAndroid Build Coastguard Worker 
348*f6dc9357SAndroid Build Coastguard Worker /*
349*f6dc9357SAndroid Build Coastguard Worker void CPlugin::AddColumn(PROPID propID)
350*f6dc9357SAndroid Build Coastguard Worker {
351*f6dc9357SAndroid Build Coastguard Worker   int index = FindPropertyInfo(propID);
352*f6dc9357SAndroid Build Coastguard Worker   if (index >= 0)
353*f6dc9357SAndroid Build Coastguard Worker   {
354*f6dc9357SAndroid Build Coastguard Worker     for (int i = 0; i < m_ProxyHandler->m_InternalProperties.Size(); i++)
355*f6dc9357SAndroid Build Coastguard Worker     {
356*f6dc9357SAndroid Build Coastguard Worker       const CArchiveItemProperty &aHandlerProperty = m_ProxyHandler->m_InternalProperties[i];
357*f6dc9357SAndroid Build Coastguard Worker       if (aHandlerProperty.ID == propID)
358*f6dc9357SAndroid Build Coastguard Worker         break;
359*f6dc9357SAndroid Build Coastguard Worker     }
360*f6dc9357SAndroid Build Coastguard Worker     if (i == m_ProxyHandler->m_InternalProperties.Size())
361*f6dc9357SAndroid Build Coastguard Worker       return;
362*f6dc9357SAndroid Build Coastguard Worker 
363*f6dc9357SAndroid Build Coastguard Worker     const CPropertyIDInfo &propertyIDInfo = kPropertyIDInfos[index];
364*f6dc9357SAndroid Build Coastguard Worker     SmartAddToString(PanelModeColumnTypes, propertyIDInfo.FarID);
365*f6dc9357SAndroid Build Coastguard Worker     char tmp[32];
366*f6dc9357SAndroid Build Coastguard Worker     itoa(propertyIDInfo.Width, tmp, 10);
367*f6dc9357SAndroid Build Coastguard Worker     SmartAddToString(PanelModeColumnWidths, tmp);
368*f6dc9357SAndroid Build Coastguard Worker     return;
369*f6dc9357SAndroid Build Coastguard Worker   }
370*f6dc9357SAndroid Build Coastguard Worker }
371*f6dc9357SAndroid Build Coastguard Worker */
372*f6dc9357SAndroid Build Coastguard Worker 
GetNameOfProp(PROPID propID,const wchar_t * name)373*f6dc9357SAndroid Build Coastguard Worker static AString GetNameOfProp(PROPID propID, const wchar_t *name)
374*f6dc9357SAndroid Build Coastguard Worker {
375*f6dc9357SAndroid Build Coastguard Worker   int farID = FindPropNameID(propID);
376*f6dc9357SAndroid Build Coastguard Worker   if (farID >= 0)
377*f6dc9357SAndroid Build Coastguard Worker     return (AString)g_StartupInfo.GetMsgString(farID);
378*f6dc9357SAndroid Build Coastguard Worker   if (name)
379*f6dc9357SAndroid Build Coastguard Worker     return UnicodeStringToMultiByte(name, CP_OEMCP);
380*f6dc9357SAndroid Build Coastguard Worker   char s[16];
381*f6dc9357SAndroid Build Coastguard Worker   ConvertUInt32ToString(propID, s);
382*f6dc9357SAndroid Build Coastguard Worker   return (AString)s;
383*f6dc9357SAndroid Build Coastguard Worker }
384*f6dc9357SAndroid Build Coastguard Worker 
GetNameOfProp2(PROPID propID,const wchar_t * name)385*f6dc9357SAndroid Build Coastguard Worker static AString GetNameOfProp2(PROPID propID, const wchar_t *name)
386*f6dc9357SAndroid Build Coastguard Worker {
387*f6dc9357SAndroid Build Coastguard Worker   AString s (GetNameOfProp(propID, name));
388*f6dc9357SAndroid Build Coastguard Worker   if (s.Len() > (kInfoPanelLineSize - 1))
389*f6dc9357SAndroid Build Coastguard Worker     s.DeleteFrom(kInfoPanelLineSize - 1);
390*f6dc9357SAndroid Build Coastguard Worker   return s;
391*f6dc9357SAndroid Build Coastguard Worker }
392*f6dc9357SAndroid Build Coastguard Worker 
ConvertSizeToString(UInt64 value)393*f6dc9357SAndroid Build Coastguard Worker static AString ConvertSizeToString(UInt64 value)
394*f6dc9357SAndroid Build Coastguard Worker {
395*f6dc9357SAndroid Build Coastguard Worker   char s[32];
396*f6dc9357SAndroid Build Coastguard Worker   ConvertUInt64ToString(value, s);
397*f6dc9357SAndroid Build Coastguard Worker   unsigned i = MyStringLen(s);
398*f6dc9357SAndroid Build Coastguard Worker   unsigned pos = Z7_ARRAY_SIZE(s);
399*f6dc9357SAndroid Build Coastguard Worker   s[--pos] = 0;
400*f6dc9357SAndroid Build Coastguard Worker   while (i > 3)
401*f6dc9357SAndroid Build Coastguard Worker   {
402*f6dc9357SAndroid Build Coastguard Worker     s[--pos] = s[--i];
403*f6dc9357SAndroid Build Coastguard Worker     s[--pos] = s[--i];
404*f6dc9357SAndroid Build Coastguard Worker     s[--pos] = s[--i];
405*f6dc9357SAndroid Build Coastguard Worker     s[--pos] = ' ';
406*f6dc9357SAndroid Build Coastguard Worker   }
407*f6dc9357SAndroid Build Coastguard Worker   while (i > 0)
408*f6dc9357SAndroid Build Coastguard Worker     s[--pos] = s[--i];
409*f6dc9357SAndroid Build Coastguard Worker   return (AString)(s + pos);
410*f6dc9357SAndroid Build Coastguard Worker }
411*f6dc9357SAndroid Build Coastguard Worker 
PropToString(const NCOM::CPropVariant & prop,PROPID propID)412*f6dc9357SAndroid Build Coastguard Worker static AString PropToString(const NCOM::CPropVariant &prop, PROPID propID)
413*f6dc9357SAndroid Build Coastguard Worker {
414*f6dc9357SAndroid Build Coastguard Worker   if (prop.vt == VT_BSTR)
415*f6dc9357SAndroid Build Coastguard Worker   {
416*f6dc9357SAndroid Build Coastguard Worker     AString s (UnicodeStringToMultiByte(prop.bstrVal, CP_OEMCP));
417*f6dc9357SAndroid Build Coastguard Worker     s.Replace((char)0xA, ' ');
418*f6dc9357SAndroid Build Coastguard Worker     s.Replace((char)0xD, ' ');
419*f6dc9357SAndroid Build Coastguard Worker     return s;
420*f6dc9357SAndroid Build Coastguard Worker   }
421*f6dc9357SAndroid Build Coastguard Worker   if (prop.vt == VT_BOOL)
422*f6dc9357SAndroid Build Coastguard Worker   {
423*f6dc9357SAndroid Build Coastguard Worker     int messageID = VARIANT_BOOLToBool(prop.boolVal) ?
424*f6dc9357SAndroid Build Coastguard Worker       NMessageID::kYes : NMessageID::kNo;
425*f6dc9357SAndroid Build Coastguard Worker     return (AString)g_StartupInfo.GetMsgString(messageID);
426*f6dc9357SAndroid Build Coastguard Worker   }
427*f6dc9357SAndroid Build Coastguard Worker   if (prop.vt != VT_EMPTY)
428*f6dc9357SAndroid Build Coastguard Worker   {
429*f6dc9357SAndroid Build Coastguard Worker     if ((prop.vt == VT_UI8 || prop.vt == VT_UI4) && (
430*f6dc9357SAndroid Build Coastguard Worker         propID == kpidSize ||
431*f6dc9357SAndroid Build Coastguard Worker         propID == kpidPackSize ||
432*f6dc9357SAndroid Build Coastguard Worker         propID == kpidNumSubDirs ||
433*f6dc9357SAndroid Build Coastguard Worker         propID == kpidNumSubFiles ||
434*f6dc9357SAndroid Build Coastguard Worker         propID == kpidNumBlocks ||
435*f6dc9357SAndroid Build Coastguard Worker         propID == kpidPhySize ||
436*f6dc9357SAndroid Build Coastguard Worker         propID == kpidHeadersSize ||
437*f6dc9357SAndroid Build Coastguard Worker         propID == kpidClusterSize ||
438*f6dc9357SAndroid Build Coastguard Worker         propID == kpidUnpackSize
439*f6dc9357SAndroid Build Coastguard Worker         ))
440*f6dc9357SAndroid Build Coastguard Worker     {
441*f6dc9357SAndroid Build Coastguard Worker       UInt64 v = 0;
442*f6dc9357SAndroid Build Coastguard Worker       ConvertPropVariantToUInt64(prop, v);
443*f6dc9357SAndroid Build Coastguard Worker       return ConvertSizeToString(v);
444*f6dc9357SAndroid Build Coastguard Worker     }
445*f6dc9357SAndroid Build Coastguard Worker     {
446*f6dc9357SAndroid Build Coastguard Worker       char sz[64];
447*f6dc9357SAndroid Build Coastguard Worker       ConvertPropertyToShortString2(sz, prop, propID);
448*f6dc9357SAndroid Build Coastguard Worker       return (AString)sz;
449*f6dc9357SAndroid Build Coastguard Worker     }
450*f6dc9357SAndroid Build Coastguard Worker   }
451*f6dc9357SAndroid Build Coastguard Worker   return AString();
452*f6dc9357SAndroid Build Coastguard Worker }
453*f6dc9357SAndroid Build Coastguard Worker 
PropToString2(const NCOM::CPropVariant & prop,PROPID propID)454*f6dc9357SAndroid Build Coastguard Worker static AString PropToString2(const NCOM::CPropVariant &prop, PROPID propID)
455*f6dc9357SAndroid Build Coastguard Worker {
456*f6dc9357SAndroid Build Coastguard Worker   AString s (PropToString(prop, propID));
457*f6dc9357SAndroid Build Coastguard Worker   if (s.Len() > (kInfoPanelLineSize - 1))
458*f6dc9357SAndroid Build Coastguard Worker     s.DeleteFrom(kInfoPanelLineSize - 1);
459*f6dc9357SAndroid Build Coastguard Worker   return s;
460*f6dc9357SAndroid Build Coastguard Worker }
461*f6dc9357SAndroid Build Coastguard Worker 
AddPropertyString(InfoPanelLine * lines,unsigned & numItems,PROPID propID,const wchar_t * name,const NCOM::CPropVariant & prop)462*f6dc9357SAndroid Build Coastguard Worker static void AddPropertyString(InfoPanelLine *lines, unsigned &numItems, PROPID propID, const wchar_t *name,
463*f6dc9357SAndroid Build Coastguard Worker     const NCOM::CPropVariant &prop)
464*f6dc9357SAndroid Build Coastguard Worker {
465*f6dc9357SAndroid Build Coastguard Worker   if (prop.vt != VT_EMPTY)
466*f6dc9357SAndroid Build Coastguard Worker   {
467*f6dc9357SAndroid Build Coastguard Worker     AString val (PropToString2(prop, propID));
468*f6dc9357SAndroid Build Coastguard Worker     if (!val.IsEmpty())
469*f6dc9357SAndroid Build Coastguard Worker     {
470*f6dc9357SAndroid Build Coastguard Worker       InfoPanelLine &item = lines[numItems++];
471*f6dc9357SAndroid Build Coastguard Worker       COPY_STR_LIMITED(item.Text, GetNameOfProp2(propID, name));
472*f6dc9357SAndroid Build Coastguard Worker       COPY_STR_LIMITED(item.Data, val);
473*f6dc9357SAndroid Build Coastguard Worker     }
474*f6dc9357SAndroid Build Coastguard Worker   }
475*f6dc9357SAndroid Build Coastguard Worker }
476*f6dc9357SAndroid Build Coastguard Worker 
InsertSeparator(InfoPanelLine * lines,unsigned & numItems)477*f6dc9357SAndroid Build Coastguard Worker static void InsertSeparator(InfoPanelLine *lines, unsigned &numItems)
478*f6dc9357SAndroid Build Coastguard Worker {
479*f6dc9357SAndroid Build Coastguard Worker   if (numItems < kNumInfoLinesMax)
480*f6dc9357SAndroid Build Coastguard Worker   {
481*f6dc9357SAndroid Build Coastguard Worker     InfoPanelLine &item = lines[numItems++];
482*f6dc9357SAndroid Build Coastguard Worker     *item.Text = 0;
483*f6dc9357SAndroid Build Coastguard Worker     *item.Data = 0;
484*f6dc9357SAndroid Build Coastguard Worker     item.Separator = TRUE;
485*f6dc9357SAndroid Build Coastguard Worker   }
486*f6dc9357SAndroid Build Coastguard Worker }
487*f6dc9357SAndroid Build Coastguard Worker 
GetOpenPluginInfo(struct OpenPluginInfo * info)488*f6dc9357SAndroid Build Coastguard Worker void CPlugin::GetOpenPluginInfo(struct OpenPluginInfo *info)
489*f6dc9357SAndroid Build Coastguard Worker {
490*f6dc9357SAndroid Build Coastguard Worker   info->StructSize = sizeof(*info);
491*f6dc9357SAndroid Build Coastguard Worker   info->Flags = OPIF_USEFILTER | OPIF_USESORTGROUPS | OPIF_USEHIGHLIGHTING |
492*f6dc9357SAndroid Build Coastguard Worker               OPIF_ADDDOTS | OPIF_COMPAREFATTIME;
493*f6dc9357SAndroid Build Coastguard Worker 
494*f6dc9357SAndroid Build Coastguard Worker   COPY_STR_LIMITED(m_FileNameBuffer, UnicodeStringToMultiByte(fs2us(m_FileName), CP_OEMCP));
495*f6dc9357SAndroid Build Coastguard Worker   info->HostFile = m_FileNameBuffer; // test it it is not static
496*f6dc9357SAndroid Build Coastguard Worker 
497*f6dc9357SAndroid Build Coastguard Worker   COPY_STR_LIMITED(m_CurrentDirBuffer, UnicodeStringToMultiByte(m_CurrentDir, CP_OEMCP));
498*f6dc9357SAndroid Build Coastguard Worker   info->CurDir = m_CurrentDirBuffer;
499*f6dc9357SAndroid Build Coastguard Worker 
500*f6dc9357SAndroid Build Coastguard Worker   info->Format = kPluginFormatName;
501*f6dc9357SAndroid Build Coastguard Worker 
502*f6dc9357SAndroid Build Coastguard Worker   {
503*f6dc9357SAndroid Build Coastguard Worker   UString name;
504*f6dc9357SAndroid Build Coastguard Worker   {
505*f6dc9357SAndroid Build Coastguard Worker     FString dirPrefix, fileName;
506*f6dc9357SAndroid Build Coastguard Worker     GetFullPathAndSplit(m_FileName, dirPrefix, fileName);
507*f6dc9357SAndroid Build Coastguard Worker     name = fs2us(fileName);
508*f6dc9357SAndroid Build Coastguard Worker   }
509*f6dc9357SAndroid Build Coastguard Worker 
510*f6dc9357SAndroid Build Coastguard Worker   m_PannelTitle = ' ';
511*f6dc9357SAndroid Build Coastguard Worker   m_PannelTitle += _archiveTypeName;
512*f6dc9357SAndroid Build Coastguard Worker   m_PannelTitle.Add_Colon();
513*f6dc9357SAndroid Build Coastguard Worker   m_PannelTitle += name;
514*f6dc9357SAndroid Build Coastguard Worker   m_PannelTitle.Add_Space();
515*f6dc9357SAndroid Build Coastguard Worker   if (!m_CurrentDir.IsEmpty())
516*f6dc9357SAndroid Build Coastguard Worker   {
517*f6dc9357SAndroid Build Coastguard Worker     // m_PannelTitle += '\\';
518*f6dc9357SAndroid Build Coastguard Worker     m_PannelTitle += m_CurrentDir;
519*f6dc9357SAndroid Build Coastguard Worker   }
520*f6dc9357SAndroid Build Coastguard Worker 
521*f6dc9357SAndroid Build Coastguard Worker   COPY_STR_LIMITED(m_PannelTitleBuffer, UnicodeStringToMultiByte(m_PannelTitle, CP_OEMCP));
522*f6dc9357SAndroid Build Coastguard Worker   info->PanelTitle = m_PannelTitleBuffer;
523*f6dc9357SAndroid Build Coastguard Worker 
524*f6dc9357SAndroid Build Coastguard Worker   }
525*f6dc9357SAndroid Build Coastguard Worker 
526*f6dc9357SAndroid Build Coastguard Worker   memset(m_InfoLines, 0, sizeof(m_InfoLines));
527*f6dc9357SAndroid Build Coastguard Worker   m_InfoLines[0].Text[0] = 0;
528*f6dc9357SAndroid Build Coastguard Worker   m_InfoLines[0].Separator = TRUE;
529*f6dc9357SAndroid Build Coastguard Worker 
530*f6dc9357SAndroid Build Coastguard Worker   MyStringCopy(m_InfoLines[1].Text, g_StartupInfo.GetMsgString(NMessageID::kArchiveType));
531*f6dc9357SAndroid Build Coastguard Worker   MyStringCopy(m_InfoLines[1].Data, (const char *)UnicodeStringToMultiByte(_archiveTypeName, CP_OEMCP));
532*f6dc9357SAndroid Build Coastguard Worker 
533*f6dc9357SAndroid Build Coastguard Worker   unsigned numItems = 2;
534*f6dc9357SAndroid Build Coastguard Worker 
535*f6dc9357SAndroid Build Coastguard Worker   {
536*f6dc9357SAndroid Build Coastguard Worker     CMyComPtr<IFolderProperties> folderProperties;
537*f6dc9357SAndroid Build Coastguard Worker     _folder.QueryInterface(IID_IFolderProperties, &folderProperties);
538*f6dc9357SAndroid Build Coastguard Worker     if (folderProperties)
539*f6dc9357SAndroid Build Coastguard Worker     {
540*f6dc9357SAndroid Build Coastguard Worker       UInt32 numProps;
541*f6dc9357SAndroid Build Coastguard Worker       if (folderProperties->GetNumberOfFolderProperties(&numProps) == S_OK)
542*f6dc9357SAndroid Build Coastguard Worker       {
543*f6dc9357SAndroid Build Coastguard Worker         for (UInt32 i = 0; i < numProps && numItems < kNumInfoLinesMax; i++)
544*f6dc9357SAndroid Build Coastguard Worker         {
545*f6dc9357SAndroid Build Coastguard Worker           CMyComBSTR name;
546*f6dc9357SAndroid Build Coastguard Worker           PROPID propID;
547*f6dc9357SAndroid Build Coastguard Worker           VARTYPE vt;
548*f6dc9357SAndroid Build Coastguard Worker           if (folderProperties->GetFolderPropertyInfo(i, &name, &propID, &vt) != S_OK)
549*f6dc9357SAndroid Build Coastguard Worker             continue;
550*f6dc9357SAndroid Build Coastguard Worker           NCOM::CPropVariant prop;
551*f6dc9357SAndroid Build Coastguard Worker           if (_folder->GetFolderProperty(propID, &prop) != S_OK || prop.vt == VT_EMPTY)
552*f6dc9357SAndroid Build Coastguard Worker             continue;
553*f6dc9357SAndroid Build Coastguard Worker 
554*f6dc9357SAndroid Build Coastguard Worker           InfoPanelLine &item = m_InfoLines[numItems++];
555*f6dc9357SAndroid Build Coastguard Worker           COPY_STR_LIMITED(item.Text, GetNameOfProp2(propID, name));
556*f6dc9357SAndroid Build Coastguard Worker           COPY_STR_LIMITED(item.Data, PropToString2(prop, propID));
557*f6dc9357SAndroid Build Coastguard Worker         }
558*f6dc9357SAndroid Build Coastguard Worker       }
559*f6dc9357SAndroid Build Coastguard Worker     }
560*f6dc9357SAndroid Build Coastguard Worker   }
561*f6dc9357SAndroid Build Coastguard Worker 
562*f6dc9357SAndroid Build Coastguard Worker   /*
563*f6dc9357SAndroid Build Coastguard Worker   if (numItems < kNumInfoLinesMax)
564*f6dc9357SAndroid Build Coastguard Worker   {
565*f6dc9357SAndroid Build Coastguard Worker     InsertSeparator(m_InfoLines, numItems);
566*f6dc9357SAndroid Build Coastguard Worker   }
567*f6dc9357SAndroid Build Coastguard Worker   */
568*f6dc9357SAndroid Build Coastguard Worker 
569*f6dc9357SAndroid Build Coastguard Worker   {
570*f6dc9357SAndroid Build Coastguard Worker     CMyComPtr<IGetFolderArcProps> getFolderArcProps;
571*f6dc9357SAndroid Build Coastguard Worker     _folder.QueryInterface(IID_IGetFolderArcProps, &getFolderArcProps);
572*f6dc9357SAndroid Build Coastguard Worker     if (getFolderArcProps)
573*f6dc9357SAndroid Build Coastguard Worker     {
574*f6dc9357SAndroid Build Coastguard Worker       CMyComPtr<IFolderArcProps> getProps;
575*f6dc9357SAndroid Build Coastguard Worker       getFolderArcProps->GetFolderArcProps(&getProps);
576*f6dc9357SAndroid Build Coastguard Worker       if (getProps)
577*f6dc9357SAndroid Build Coastguard Worker       {
578*f6dc9357SAndroid Build Coastguard Worker         UInt32 numLevels;
579*f6dc9357SAndroid Build Coastguard Worker         if (getProps->GetArcNumLevels(&numLevels) != S_OK)
580*f6dc9357SAndroid Build Coastguard Worker           numLevels = 0;
581*f6dc9357SAndroid Build Coastguard Worker         for (UInt32 level2 = 0; level2 < numLevels; level2++)
582*f6dc9357SAndroid Build Coastguard Worker         {
583*f6dc9357SAndroid Build Coastguard Worker           {
584*f6dc9357SAndroid Build Coastguard Worker             UInt32 level = numLevels - 1 - level2;
585*f6dc9357SAndroid Build Coastguard Worker             UInt32 numProps;
586*f6dc9357SAndroid Build Coastguard Worker             if (getProps->GetArcNumProps(level, &numProps) == S_OK)
587*f6dc9357SAndroid Build Coastguard Worker             {
588*f6dc9357SAndroid Build Coastguard Worker               InsertSeparator(m_InfoLines, numItems);
589*f6dc9357SAndroid Build Coastguard Worker               for (Int32 i = -3; i < (Int32)numProps && numItems < kNumInfoLinesMax; i++)
590*f6dc9357SAndroid Build Coastguard Worker               {
591*f6dc9357SAndroid Build Coastguard Worker                 CMyComBSTR name;
592*f6dc9357SAndroid Build Coastguard Worker                 PROPID propID;
593*f6dc9357SAndroid Build Coastguard Worker                 VARTYPE vt;
594*f6dc9357SAndroid Build Coastguard Worker                 switch (i)
595*f6dc9357SAndroid Build Coastguard Worker                 {
596*f6dc9357SAndroid Build Coastguard Worker                   case -3: propID = kpidPath; break;
597*f6dc9357SAndroid Build Coastguard Worker                   case -2: propID = kpidType; break;
598*f6dc9357SAndroid Build Coastguard Worker                   case -1: propID = kpidError; break;
599*f6dc9357SAndroid Build Coastguard Worker                   default:
600*f6dc9357SAndroid Build Coastguard Worker                     if (getProps->GetArcPropInfo(level, (UInt32)i, &name, &propID, &vt) != S_OK)
601*f6dc9357SAndroid Build Coastguard Worker                       continue;
602*f6dc9357SAndroid Build Coastguard Worker                 }
603*f6dc9357SAndroid Build Coastguard Worker                 NCOM::CPropVariant prop;
604*f6dc9357SAndroid Build Coastguard Worker                 if (getProps->GetArcProp(level, propID, &prop) != S_OK)
605*f6dc9357SAndroid Build Coastguard Worker                   continue;
606*f6dc9357SAndroid Build Coastguard Worker                 AddPropertyString(m_InfoLines, numItems, propID, name, prop);
607*f6dc9357SAndroid Build Coastguard Worker               }
608*f6dc9357SAndroid Build Coastguard Worker             }
609*f6dc9357SAndroid Build Coastguard Worker           }
610*f6dc9357SAndroid Build Coastguard Worker           if (level2 != numLevels - 1)
611*f6dc9357SAndroid Build Coastguard Worker           {
612*f6dc9357SAndroid Build Coastguard Worker             UInt32 level = numLevels - 1 - level2;
613*f6dc9357SAndroid Build Coastguard Worker             UInt32 numProps;
614*f6dc9357SAndroid Build Coastguard Worker             if (getProps->GetArcNumProps2(level, &numProps) == S_OK)
615*f6dc9357SAndroid Build Coastguard Worker             {
616*f6dc9357SAndroid Build Coastguard Worker               InsertSeparator(m_InfoLines, numItems);
617*f6dc9357SAndroid Build Coastguard Worker               for (Int32 i = 0; i < (Int32)numProps && numItems < kNumInfoLinesMax; i++)
618*f6dc9357SAndroid Build Coastguard Worker               {
619*f6dc9357SAndroid Build Coastguard Worker                 CMyComBSTR name;
620*f6dc9357SAndroid Build Coastguard Worker                 PROPID propID;
621*f6dc9357SAndroid Build Coastguard Worker                 VARTYPE vt;
622*f6dc9357SAndroid Build Coastguard Worker                 if (getProps->GetArcPropInfo2(level, (UInt32)i, &name, &propID, &vt) != S_OK)
623*f6dc9357SAndroid Build Coastguard Worker                   continue;
624*f6dc9357SAndroid Build Coastguard Worker                 NCOM::CPropVariant prop;
625*f6dc9357SAndroid Build Coastguard Worker                 if (getProps->GetArcProp2(level, propID, &prop) != S_OK)
626*f6dc9357SAndroid Build Coastguard Worker                   continue;
627*f6dc9357SAndroid Build Coastguard Worker                 AddPropertyString(m_InfoLines, numItems, propID, name, prop);
628*f6dc9357SAndroid Build Coastguard Worker               }
629*f6dc9357SAndroid Build Coastguard Worker             }
630*f6dc9357SAndroid Build Coastguard Worker           }
631*f6dc9357SAndroid Build Coastguard Worker         }
632*f6dc9357SAndroid Build Coastguard Worker       }
633*f6dc9357SAndroid Build Coastguard Worker     }
634*f6dc9357SAndroid Build Coastguard Worker   }
635*f6dc9357SAndroid Build Coastguard Worker 
636*f6dc9357SAndroid Build Coastguard Worker   //m_InfoLines[1].Separator = 0;
637*f6dc9357SAndroid Build Coastguard Worker 
638*f6dc9357SAndroid Build Coastguard Worker   info->InfoLines = m_InfoLines;
639*f6dc9357SAndroid Build Coastguard Worker   info->InfoLinesNumber = (int)numItems;
640*f6dc9357SAndroid Build Coastguard Worker 
641*f6dc9357SAndroid Build Coastguard Worker 
642*f6dc9357SAndroid Build Coastguard Worker   info->DescrFiles = NULL;
643*f6dc9357SAndroid Build Coastguard Worker   info->DescrFilesNumber = 0;
644*f6dc9357SAndroid Build Coastguard Worker 
645*f6dc9357SAndroid Build Coastguard Worker   PanelModeColumnTypes.Empty();
646*f6dc9357SAndroid Build Coastguard Worker   PanelModeColumnWidths.Empty();
647*f6dc9357SAndroid Build Coastguard Worker 
648*f6dc9357SAndroid Build Coastguard Worker   /*
649*f6dc9357SAndroid Build Coastguard Worker   AddColumn(kpidName);
650*f6dc9357SAndroid Build Coastguard Worker   AddColumn(kpidSize);
651*f6dc9357SAndroid Build Coastguard Worker   AddColumn(kpidPackSize);
652*f6dc9357SAndroid Build Coastguard Worker   AddColumn(kpidMTime);
653*f6dc9357SAndroid Build Coastguard Worker   AddColumn(kpidCTime);
654*f6dc9357SAndroid Build Coastguard Worker   AddColumn(kpidATime);
655*f6dc9357SAndroid Build Coastguard Worker   AddColumn(kpidAttrib);
656*f6dc9357SAndroid Build Coastguard Worker 
657*f6dc9357SAndroid Build Coastguard Worker   _panelMode.ColumnTypes = (char *)(const char *)PanelModeColumnTypes;
658*f6dc9357SAndroid Build Coastguard Worker   _panelMode.ColumnWidths = (char *)(const char *)PanelModeColumnWidths;
659*f6dc9357SAndroid Build Coastguard Worker   _panelMode.ColumnTitles = NULL;
660*f6dc9357SAndroid Build Coastguard Worker   _panelMode.FullScreen = TRUE;
661*f6dc9357SAndroid Build Coastguard Worker   _panelMode.DetailedStatus = FALSE;
662*f6dc9357SAndroid Build Coastguard Worker   _panelMode.AlignExtensions = FALSE;
663*f6dc9357SAndroid Build Coastguard Worker   _panelMode.CaseConversion = FALSE;
664*f6dc9357SAndroid Build Coastguard Worker   _panelMode.StatusColumnTypes = "N";
665*f6dc9357SAndroid Build Coastguard Worker   _panelMode.StatusColumnWidths = "0";
666*f6dc9357SAndroid Build Coastguard Worker   _panelMode.Reserved[0] = 0;
667*f6dc9357SAndroid Build Coastguard Worker   _panelMode.Reserved[1] = 0;
668*f6dc9357SAndroid Build Coastguard Worker 
669*f6dc9357SAndroid Build Coastguard Worker   info->PanelModesArray = &_panelMode;
670*f6dc9357SAndroid Build Coastguard Worker   info->PanelModesNumber = 1;
671*f6dc9357SAndroid Build Coastguard Worker   */
672*f6dc9357SAndroid Build Coastguard Worker 
673*f6dc9357SAndroid Build Coastguard Worker   info->PanelModesArray = NULL;
674*f6dc9357SAndroid Build Coastguard Worker   info->PanelModesNumber = 0;
675*f6dc9357SAndroid Build Coastguard Worker 
676*f6dc9357SAndroid Build Coastguard Worker   info->StartPanelMode = 0;
677*f6dc9357SAndroid Build Coastguard Worker   info->StartSortMode = 0;
678*f6dc9357SAndroid Build Coastguard Worker   info->KeyBar = NULL;
679*f6dc9357SAndroid Build Coastguard Worker   info->ShortcutData = NULL;
680*f6dc9357SAndroid Build Coastguard Worker }
681*f6dc9357SAndroid Build Coastguard Worker 
682*f6dc9357SAndroid Build Coastguard Worker struct CArchiveItemProperty
683*f6dc9357SAndroid Build Coastguard Worker {
684*f6dc9357SAndroid Build Coastguard Worker   AString Name;
685*f6dc9357SAndroid Build Coastguard Worker   PROPID ID;
686*f6dc9357SAndroid Build Coastguard Worker   VARTYPE Type;
687*f6dc9357SAndroid Build Coastguard Worker };
688*f6dc9357SAndroid Build Coastguard Worker 
GetHex_A_minus10(unsigned v,unsigned a10)689*f6dc9357SAndroid Build Coastguard Worker static inline char GetHex_A_minus10(unsigned v, unsigned a10)
690*f6dc9357SAndroid Build Coastguard Worker {
691*f6dc9357SAndroid Build Coastguard Worker   return (char)(v < 10 ? v + '0' : v + a10);
692*f6dc9357SAndroid Build Coastguard Worker }
693*f6dc9357SAndroid Build Coastguard Worker 
ShowAttributesWindow()694*f6dc9357SAndroid Build Coastguard Worker HRESULT CPlugin::ShowAttributesWindow()
695*f6dc9357SAndroid Build Coastguard Worker {
696*f6dc9357SAndroid Build Coastguard Worker   PluginPanelItem pluginPanelItem;
697*f6dc9357SAndroid Build Coastguard Worker   if (!g_StartupInfo.ControlGetActivePanelCurrentItemInfo(pluginPanelItem))
698*f6dc9357SAndroid Build Coastguard Worker     return S_FALSE;
699*f6dc9357SAndroid Build Coastguard Worker   if (strcmp(pluginPanelItem.FindData.cFileName, "..") == 0 &&
700*f6dc9357SAndroid Build Coastguard Worker         NFind::NAttributes::IsDir(pluginPanelItem.FindData.dwFileAttributes))
701*f6dc9357SAndroid Build Coastguard Worker     return S_FALSE;
702*f6dc9357SAndroid Build Coastguard Worker   const UInt32 itemIndex = (UInt32)pluginPanelItem.UserData;
703*f6dc9357SAndroid Build Coastguard Worker 
704*f6dc9357SAndroid Build Coastguard Worker   CObjectVector<CArchiveItemProperty> properties;
705*f6dc9357SAndroid Build Coastguard Worker   UInt32 numProps;
706*f6dc9357SAndroid Build Coastguard Worker   RINOK(_folder->GetNumberOfProperties(&numProps))
707*f6dc9357SAndroid Build Coastguard Worker   unsigned i;
708*f6dc9357SAndroid Build Coastguard Worker   for (i = 0; i < numProps; i++)
709*f6dc9357SAndroid Build Coastguard Worker   {
710*f6dc9357SAndroid Build Coastguard Worker     CMyComBSTR name;
711*f6dc9357SAndroid Build Coastguard Worker     PROPID propID;
712*f6dc9357SAndroid Build Coastguard Worker     VARTYPE vt;
713*f6dc9357SAndroid Build Coastguard Worker     RINOK(_folder->GetPropertyInfo(i, &name, &propID, &vt))
714*f6dc9357SAndroid Build Coastguard Worker     CArchiveItemProperty prop;
715*f6dc9357SAndroid Build Coastguard Worker     prop.Type = vt;
716*f6dc9357SAndroid Build Coastguard Worker     prop.ID = propID;
717*f6dc9357SAndroid Build Coastguard Worker     if (prop.ID  == kpidPath)
718*f6dc9357SAndroid Build Coastguard Worker       prop.ID = kpidName;
719*f6dc9357SAndroid Build Coastguard Worker     prop.Name = GetNameOfProp(propID, name);
720*f6dc9357SAndroid Build Coastguard Worker     properties.Add(prop);
721*f6dc9357SAndroid Build Coastguard Worker   }
722*f6dc9357SAndroid Build Coastguard Worker 
723*f6dc9357SAndroid Build Coastguard Worker   int size = 2;
724*f6dc9357SAndroid Build Coastguard Worker   CRecordVector<CInitDialogItem> initDialogItems;
725*f6dc9357SAndroid Build Coastguard Worker 
726*f6dc9357SAndroid Build Coastguard Worker   int xSize = 70;
727*f6dc9357SAndroid Build Coastguard Worker   {
728*f6dc9357SAndroid Build Coastguard Worker     const CInitDialogItem idi =
729*f6dc9357SAndroid Build Coastguard Worker       { DI_DOUBLEBOX, 3, 1, xSize - 4, size - 2, false, false, 0, false, NMessageID::kProperties, NULL, NULL };
730*f6dc9357SAndroid Build Coastguard Worker     initDialogItems.Add(idi);
731*f6dc9357SAndroid Build Coastguard Worker   }
732*f6dc9357SAndroid Build Coastguard Worker 
733*f6dc9357SAndroid Build Coastguard Worker   AStringVector values;
734*f6dc9357SAndroid Build Coastguard Worker 
735*f6dc9357SAndroid Build Coastguard Worker   const int kStartY = 3;
736*f6dc9357SAndroid Build Coastguard Worker 
737*f6dc9357SAndroid Build Coastguard Worker   for (i = 0; i < properties.Size(); i++)
738*f6dc9357SAndroid Build Coastguard Worker   {
739*f6dc9357SAndroid Build Coastguard Worker     const CArchiveItemProperty &property = properties[i];
740*f6dc9357SAndroid Build Coastguard Worker 
741*f6dc9357SAndroid Build Coastguard Worker     const int startY = kStartY + (int)values.Size();
742*f6dc9357SAndroid Build Coastguard Worker 
743*f6dc9357SAndroid Build Coastguard Worker     {
744*f6dc9357SAndroid Build Coastguard Worker       CInitDialogItem idi =
745*f6dc9357SAndroid Build Coastguard Worker         { DI_TEXT, 5, startY, 0, 0, false, false, 0, false, 0, NULL, NULL };
746*f6dc9357SAndroid Build Coastguard Worker       idi.DataMessageId = FindPropNameID(property.ID);
747*f6dc9357SAndroid Build Coastguard Worker       if (idi.DataMessageId < 0)
748*f6dc9357SAndroid Build Coastguard Worker         idi.DataString = property.Name;
749*f6dc9357SAndroid Build Coastguard Worker       initDialogItems.Add(idi);
750*f6dc9357SAndroid Build Coastguard Worker     }
751*f6dc9357SAndroid Build Coastguard Worker 
752*f6dc9357SAndroid Build Coastguard Worker     NCOM::CPropVariant prop;
753*f6dc9357SAndroid Build Coastguard Worker     RINOK(_folder->GetProperty(itemIndex, property.ID, &prop))
754*f6dc9357SAndroid Build Coastguard Worker     values.Add(PropToString(prop, property.ID));
755*f6dc9357SAndroid Build Coastguard Worker 
756*f6dc9357SAndroid Build Coastguard Worker     {
757*f6dc9357SAndroid Build Coastguard Worker       const CInitDialogItem idi =
758*f6dc9357SAndroid Build Coastguard Worker         { DI_TEXT, 30, startY, 0, 0, false, false, 0, false, -1, NULL, NULL };
759*f6dc9357SAndroid Build Coastguard Worker       initDialogItems.Add(idi);
760*f6dc9357SAndroid Build Coastguard Worker     }
761*f6dc9357SAndroid Build Coastguard Worker   }
762*f6dc9357SAndroid Build Coastguard Worker 
763*f6dc9357SAndroid Build Coastguard Worker   CMyComPtr<IArchiveGetRawProps> _folderRawProps;
764*f6dc9357SAndroid Build Coastguard Worker   _folder.QueryInterface(IID_IArchiveGetRawProps, &_folderRawProps);
765*f6dc9357SAndroid Build Coastguard Worker 
766*f6dc9357SAndroid Build Coastguard Worker   CObjectVector<CArchiveItemProperty> properties2;
767*f6dc9357SAndroid Build Coastguard Worker 
768*f6dc9357SAndroid Build Coastguard Worker   if (_folderRawProps)
769*f6dc9357SAndroid Build Coastguard Worker   {
770*f6dc9357SAndroid Build Coastguard Worker     _folderRawProps->GetNumRawProps(&numProps);
771*f6dc9357SAndroid Build Coastguard Worker 
772*f6dc9357SAndroid Build Coastguard Worker     for (i = 0; i < numProps; i++)
773*f6dc9357SAndroid Build Coastguard Worker     {
774*f6dc9357SAndroid Build Coastguard Worker       CMyComBSTR name;
775*f6dc9357SAndroid Build Coastguard Worker       PROPID propID;
776*f6dc9357SAndroid Build Coastguard Worker       if (_folderRawProps->GetRawPropInfo(i, &name, &propID) != S_OK)
777*f6dc9357SAndroid Build Coastguard Worker         continue;
778*f6dc9357SAndroid Build Coastguard Worker       CArchiveItemProperty prop;
779*f6dc9357SAndroid Build Coastguard Worker       prop.Type = VT_EMPTY;
780*f6dc9357SAndroid Build Coastguard Worker       prop.ID = propID;
781*f6dc9357SAndroid Build Coastguard Worker       if (prop.ID  == kpidPath)
782*f6dc9357SAndroid Build Coastguard Worker         prop.ID = kpidName;
783*f6dc9357SAndroid Build Coastguard Worker       prop.Name = GetNameOfProp(propID, name);
784*f6dc9357SAndroid Build Coastguard Worker       properties2.Add(prop);
785*f6dc9357SAndroid Build Coastguard Worker     }
786*f6dc9357SAndroid Build Coastguard Worker 
787*f6dc9357SAndroid Build Coastguard Worker     for (i = 0; i < properties2.Size(); i++)
788*f6dc9357SAndroid Build Coastguard Worker     {
789*f6dc9357SAndroid Build Coastguard Worker       const CArchiveItemProperty &property = properties2[i];
790*f6dc9357SAndroid Build Coastguard Worker       CMyComBSTR name;
791*f6dc9357SAndroid Build Coastguard Worker 
792*f6dc9357SAndroid Build Coastguard Worker       const void *data;
793*f6dc9357SAndroid Build Coastguard Worker       UInt32 dataSize;
794*f6dc9357SAndroid Build Coastguard Worker       UInt32 propType;
795*f6dc9357SAndroid Build Coastguard Worker       if (_folderRawProps->GetRawProp(itemIndex, property.ID, &data, &dataSize, &propType) != S_OK)
796*f6dc9357SAndroid Build Coastguard Worker         continue;
797*f6dc9357SAndroid Build Coastguard Worker 
798*f6dc9357SAndroid Build Coastguard Worker       if (dataSize != 0)
799*f6dc9357SAndroid Build Coastguard Worker       {
800*f6dc9357SAndroid Build Coastguard Worker         AString s;
801*f6dc9357SAndroid Build Coastguard Worker         if (property.ID == kpidNtSecure)
802*f6dc9357SAndroid Build Coastguard Worker           ConvertNtSecureToString((const Byte *)data, dataSize, s);
803*f6dc9357SAndroid Build Coastguard Worker         else
804*f6dc9357SAndroid Build Coastguard Worker         {
805*f6dc9357SAndroid Build Coastguard Worker           const UInt32 kMaxDataSize = 64;
806*f6dc9357SAndroid Build Coastguard Worker           if (dataSize > kMaxDataSize)
807*f6dc9357SAndroid Build Coastguard Worker           {
808*f6dc9357SAndroid Build Coastguard Worker             s += "data:";
809*f6dc9357SAndroid Build Coastguard Worker             s.Add_UInt32(dataSize);
810*f6dc9357SAndroid Build Coastguard Worker           }
811*f6dc9357SAndroid Build Coastguard Worker           else
812*f6dc9357SAndroid Build Coastguard Worker           {
813*f6dc9357SAndroid Build Coastguard Worker             const unsigned a = dataSize <= 8
814*f6dc9357SAndroid Build Coastguard Worker                 && (property.ID == kpidCRC || property.ID == kpidChecksum)
815*f6dc9357SAndroid Build Coastguard Worker                 ? 'A' - 10 : 'a' - 10;
816*f6dc9357SAndroid Build Coastguard Worker             for (UInt32 k = 0; k < dataSize; k++)
817*f6dc9357SAndroid Build Coastguard Worker             {
818*f6dc9357SAndroid Build Coastguard Worker               const unsigned b = ((const Byte *)data)[k];
819*f6dc9357SAndroid Build Coastguard Worker               s += GetHex_A_minus10(b >> 4, a);
820*f6dc9357SAndroid Build Coastguard Worker               s += GetHex_A_minus10(b & 15, a);
821*f6dc9357SAndroid Build Coastguard Worker             }
822*f6dc9357SAndroid Build Coastguard Worker           }
823*f6dc9357SAndroid Build Coastguard Worker         }
824*f6dc9357SAndroid Build Coastguard Worker 
825*f6dc9357SAndroid Build Coastguard Worker         const int startY = kStartY + (int)values.Size();
826*f6dc9357SAndroid Build Coastguard Worker 
827*f6dc9357SAndroid Build Coastguard Worker         {
828*f6dc9357SAndroid Build Coastguard Worker           CInitDialogItem idi =
829*f6dc9357SAndroid Build Coastguard Worker             { DI_TEXT, 5, startY, 0, 0, false, false, 0, false, 0, NULL, NULL };
830*f6dc9357SAndroid Build Coastguard Worker           idi.DataMessageId = FindPropNameID(property.ID);
831*f6dc9357SAndroid Build Coastguard Worker           if (idi.DataMessageId < 0)
832*f6dc9357SAndroid Build Coastguard Worker             idi.DataString = property.Name;
833*f6dc9357SAndroid Build Coastguard Worker           initDialogItems.Add(idi);
834*f6dc9357SAndroid Build Coastguard Worker         }
835*f6dc9357SAndroid Build Coastguard Worker 
836*f6dc9357SAndroid Build Coastguard Worker         values.Add(s);
837*f6dc9357SAndroid Build Coastguard Worker 
838*f6dc9357SAndroid Build Coastguard Worker         {
839*f6dc9357SAndroid Build Coastguard Worker           const CInitDialogItem idi =
840*f6dc9357SAndroid Build Coastguard Worker             { DI_TEXT, 30, startY, 0, 0, false, false, 0, false, -1, NULL, NULL };
841*f6dc9357SAndroid Build Coastguard Worker           initDialogItems.Add(idi);
842*f6dc9357SAndroid Build Coastguard Worker         }
843*f6dc9357SAndroid Build Coastguard Worker       }
844*f6dc9357SAndroid Build Coastguard Worker     }
845*f6dc9357SAndroid Build Coastguard Worker   }
846*f6dc9357SAndroid Build Coastguard Worker 
847*f6dc9357SAndroid Build Coastguard Worker   const unsigned numLines = values.Size();
848*f6dc9357SAndroid Build Coastguard Worker   for (i = 0; i < numLines; i++)
849*f6dc9357SAndroid Build Coastguard Worker   {
850*f6dc9357SAndroid Build Coastguard Worker     CInitDialogItem &idi = initDialogItems[1 + i * 2 + 1];
851*f6dc9357SAndroid Build Coastguard Worker     idi.DataString = values[i];
852*f6dc9357SAndroid Build Coastguard Worker   }
853*f6dc9357SAndroid Build Coastguard Worker 
854*f6dc9357SAndroid Build Coastguard Worker   const unsigned numDialogItems = initDialogItems.Size();
855*f6dc9357SAndroid Build Coastguard Worker 
856*f6dc9357SAndroid Build Coastguard Worker   CObjArray<FarDialogItem> dialogItems(numDialogItems);
857*f6dc9357SAndroid Build Coastguard Worker   g_StartupInfo.InitDialogItems(initDialogItems.ConstData(), dialogItems, numDialogItems);
858*f6dc9357SAndroid Build Coastguard Worker 
859*f6dc9357SAndroid Build Coastguard Worker   unsigned maxLen = 0;
860*f6dc9357SAndroid Build Coastguard Worker 
861*f6dc9357SAndroid Build Coastguard Worker   for (i = 0; i < numLines; i++)
862*f6dc9357SAndroid Build Coastguard Worker   {
863*f6dc9357SAndroid Build Coastguard Worker     FarDialogItem &dialogItem = dialogItems[1 + i * 2];
864*f6dc9357SAndroid Build Coastguard Worker     unsigned len = (unsigned)strlen(dialogItem.Data);
865*f6dc9357SAndroid Build Coastguard Worker     if (len > maxLen)
866*f6dc9357SAndroid Build Coastguard Worker       maxLen = len;
867*f6dc9357SAndroid Build Coastguard Worker   }
868*f6dc9357SAndroid Build Coastguard Worker 
869*f6dc9357SAndroid Build Coastguard Worker   unsigned maxLen2 = 0;
870*f6dc9357SAndroid Build Coastguard Worker   const unsigned kSpace = 10;
871*f6dc9357SAndroid Build Coastguard Worker 
872*f6dc9357SAndroid Build Coastguard Worker   for (i = 0; i < numLines; i++)
873*f6dc9357SAndroid Build Coastguard Worker   {
874*f6dc9357SAndroid Build Coastguard Worker     FarDialogItem &dialogItem = dialogItems[1 + i * 2 + 1];
875*f6dc9357SAndroid Build Coastguard Worker     const unsigned len = (unsigned)strlen(dialogItem.Data);
876*f6dc9357SAndroid Build Coastguard Worker     if (len > maxLen2)
877*f6dc9357SAndroid Build Coastguard Worker       maxLen2 = len;
878*f6dc9357SAndroid Build Coastguard Worker     dialogItem.X1 = (int)(maxLen + kSpace);
879*f6dc9357SAndroid Build Coastguard Worker   }
880*f6dc9357SAndroid Build Coastguard Worker 
881*f6dc9357SAndroid Build Coastguard Worker   size = (int)numLines + 6;
882*f6dc9357SAndroid Build Coastguard Worker   xSize = (int)(maxLen + kSpace + maxLen2 + 5);
883*f6dc9357SAndroid Build Coastguard Worker   FarDialogItem &firstDialogItem = dialogItems[0];
884*f6dc9357SAndroid Build Coastguard Worker   firstDialogItem.Y2 = size - 2;
885*f6dc9357SAndroid Build Coastguard Worker   firstDialogItem.X2 = xSize - 4;
886*f6dc9357SAndroid Build Coastguard Worker 
887*f6dc9357SAndroid Build Coastguard Worker   /* int askCode = */ g_StartupInfo.ShowDialog(xSize, size, NULL, dialogItems, numDialogItems);
888*f6dc9357SAndroid Build Coastguard Worker   return S_OK;
889*f6dc9357SAndroid Build Coastguard Worker }
890*f6dc9357SAndroid Build Coastguard Worker 
ProcessKey(int key,unsigned controlState)891*f6dc9357SAndroid Build Coastguard Worker int CPlugin::ProcessKey(int key, unsigned controlState)
892*f6dc9357SAndroid Build Coastguard Worker {
893*f6dc9357SAndroid Build Coastguard Worker   if (key == VK_F7 && controlState == 0)
894*f6dc9357SAndroid Build Coastguard Worker   {
895*f6dc9357SAndroid Build Coastguard Worker     CreateFolder();
896*f6dc9357SAndroid Build Coastguard Worker     return TRUE;
897*f6dc9357SAndroid Build Coastguard Worker   }
898*f6dc9357SAndroid Build Coastguard Worker 
899*f6dc9357SAndroid Build Coastguard Worker   if (controlState == PKF_CONTROL && key == 'A')
900*f6dc9357SAndroid Build Coastguard Worker   {
901*f6dc9357SAndroid Build Coastguard Worker     HRESULT result = ShowAttributesWindow();
902*f6dc9357SAndroid Build Coastguard Worker     if (result == S_OK)
903*f6dc9357SAndroid Build Coastguard Worker       return TRUE;
904*f6dc9357SAndroid Build Coastguard Worker     if (result == S_FALSE)
905*f6dc9357SAndroid Build Coastguard Worker       return FALSE;
906*f6dc9357SAndroid Build Coastguard Worker     throw "Error";
907*f6dc9357SAndroid Build Coastguard Worker   }
908*f6dc9357SAndroid Build Coastguard Worker 
909*f6dc9357SAndroid Build Coastguard Worker   if ((controlState & PKF_ALT) != 0 && key == VK_F6)
910*f6dc9357SAndroid Build Coastguard Worker   {
911*f6dc9357SAndroid Build Coastguard Worker     FString folderPath;
912*f6dc9357SAndroid Build Coastguard Worker     if (!GetOnlyDirPrefix(m_FileName, folderPath))
913*f6dc9357SAndroid Build Coastguard Worker       return FALSE;
914*f6dc9357SAndroid Build Coastguard Worker     PanelInfo panelInfo;
915*f6dc9357SAndroid Build Coastguard Worker     g_StartupInfo.ControlGetActivePanelInfo(panelInfo);
916*f6dc9357SAndroid Build Coastguard Worker     GetFilesReal(panelInfo.SelectedItems,
917*f6dc9357SAndroid Build Coastguard Worker         (unsigned)panelInfo.SelectedItemsNumber, FALSE,
918*f6dc9357SAndroid Build Coastguard Worker         UnicodeStringToMultiByte(fs2us(folderPath), CP_OEMCP), OPM_SILENT, true);
919*f6dc9357SAndroid Build Coastguard Worker     g_StartupInfo.Control(this, FCTL_UPDATEPANEL, NULL);
920*f6dc9357SAndroid Build Coastguard Worker     g_StartupInfo.Control(this, FCTL_REDRAWPANEL, NULL);
921*f6dc9357SAndroid Build Coastguard Worker     g_StartupInfo.Control(this, FCTL_UPDATEANOTHERPANEL, NULL);
922*f6dc9357SAndroid Build Coastguard Worker     g_StartupInfo.Control(this, FCTL_REDRAWANOTHERPANEL, NULL);
923*f6dc9357SAndroid Build Coastguard Worker     return TRUE;
924*f6dc9357SAndroid Build Coastguard Worker   }
925*f6dc9357SAndroid Build Coastguard Worker 
926*f6dc9357SAndroid Build Coastguard Worker   return FALSE;
927*f6dc9357SAndroid Build Coastguard Worker }
928