1 // Agent/Agent.h 2 3 #ifndef ZIP7_INC_AGENT_AGENT_H 4 #define ZIP7_INC_AGENT_AGENT_H 5 6 #include "../../../Common/MyCom.h" 7 8 #include "../../../Windows/PropVariant.h" 9 10 #include "../Common/LoadCodecs.h" 11 #include "../Common/OpenArchive.h" 12 #include "../Common/UpdateAction.h" 13 14 #include "../FileManager/IFolder.h" 15 16 #include "AgentProxy.h" 17 #include "IFolderArchive.h" 18 19 extern CCodecs *g_CodecsObj; 20 HRESULT LoadGlobalCodecs(); 21 void FreeGlobalCodecs(); 22 23 class CAgentFolder; 24 25 Z7_PURE_INTERFACES_BEGIN 26 27 #define Z7_IFACEM_IArchiveFolderInternal(x) \ 28 x(GetAgentFolder(CAgentFolder **agentFolder)) 29 Z7_IFACE_CONSTR_FOLDERARC(IArchiveFolderInternal, 0xC) 30 31 Z7_PURE_INTERFACES_END 32 33 struct CProxyItem 34 { 35 unsigned DirIndex; 36 unsigned Index; 37 }; 38 39 class CAgent; 40 41 enum AGENT_OP 42 { 43 AGENT_OP_Uni, 44 AGENT_OP_Delete, 45 AGENT_OP_CreateFolder, 46 AGENT_OP_Rename, 47 AGENT_OP_CopyFromFile, 48 AGENT_OP_Comment 49 }; 50 51 class CAgentFolder Z7_final: 52 public IFolderFolder, 53 public IFolderAltStreams, 54 public IFolderProperties, 55 public IArchiveGetRawProps, 56 public IGetFolderArcProps, 57 public IFolderCompare, 58 public IFolderGetItemName, 59 public IArchiveFolder, 60 public IArchiveFolderInternal, 61 public IInArchiveGetStream, 62 public IFolderSetZoneIdMode, 63 public IFolderSetZoneIdFile, 64 public IFolderOperations, 65 public IFolderSetFlatMode, 66 public CMyUnknownImp 67 { 68 Z7_COM_QI_BEGIN2(IFolderFolder) 69 Z7_COM_QI_ENTRY(IFolderAltStreams) 70 Z7_COM_QI_ENTRY(IFolderProperties) 71 Z7_COM_QI_ENTRY(IArchiveGetRawProps) 72 Z7_COM_QI_ENTRY(IGetFolderArcProps) 73 Z7_COM_QI_ENTRY(IFolderCompare) 74 Z7_COM_QI_ENTRY(IFolderGetItemName) 75 Z7_COM_QI_ENTRY(IArchiveFolder) 76 Z7_COM_QI_ENTRY(IArchiveFolderInternal) 77 Z7_COM_QI_ENTRY(IInArchiveGetStream) 78 Z7_COM_QI_ENTRY(IFolderSetZoneIdMode) 79 Z7_COM_QI_ENTRY(IFolderSetZoneIdFile) 80 Z7_COM_QI_ENTRY(IFolderOperations) 81 Z7_COM_QI_ENTRY(IFolderSetFlatMode) 82 Z7_COM_QI_END 83 Z7_COM_ADDREF_RELEASE 84 85 Z7_IFACE_COM7_IMP(IFolderFolder) 86 Z7_IFACE_COM7_IMP(IFolderAltStreams) 87 Z7_IFACE_COM7_IMP(IFolderProperties) 88 Z7_IFACE_COM7_IMP(IArchiveGetRawProps) 89 Z7_IFACE_COM7_IMP(IGetFolderArcProps) 90 Z7_IFACE_COM7_IMP(IFolderCompare) 91 Z7_IFACE_COM7_IMP(IFolderGetItemName) 92 Z7_IFACE_COM7_IMP(IArchiveFolder) 93 Z7_IFACE_COM7_IMP(IArchiveFolderInternal) 94 Z7_IFACE_COM7_IMP(IInArchiveGetStream) 95 Z7_IFACE_COM7_IMP(IFolderSetZoneIdMode) 96 Z7_IFACE_COM7_IMP(IFolderSetZoneIdFile) 97 Z7_IFACE_COM7_IMP(IFolderOperations) 98 Z7_IFACE_COM7_IMP(IFolderSetFlatMode) 99 100 void LoadFolder(unsigned proxyDirIndex); 101 public: 102 HRESULT BindToFolder_Internal(unsigned proxyDirIndex, IFolderFolder **resultFolder); 103 HRESULT BindToAltStreams_Internal(unsigned proxyDirIndex, IFolderFolder **resultFolder); 104 int GetRealIndex(unsigned index) const; 105 void GetRealIndices(const UInt32 *indices, UInt32 numItems, 106 bool includeAltStreams, bool includeFolderSubItemsInFlatMode, CUIntVector &realIndices) const; 107 108 int CompareItems3(UInt32 index1, UInt32 index2, PROPID propID); 109 int CompareItems2(UInt32 index1, UInt32 index2, PROPID propID, Int32 propIsRaw); 110 CAgentFolder()111 CAgentFolder(): 112 _isAltStreamFolder(false), 113 _flatMode(false), 114 _loadAltStreams(false), // _loadAltStreams alt streams works in flat mode, but we don't use it now 115 _proxyDirIndex(0), 116 _zoneMode(NExtract::NZoneIdMode::kNone) 117 /* , _replaceAltStreamCharsMode(0) */ 118 {} 119 Init(const CProxyArc * proxy,const CProxyArc2 * proxy2,unsigned proxyDirIndex,CAgent * agent)120 void Init(const CProxyArc *proxy, const CProxyArc2 *proxy2, 121 unsigned proxyDirIndex, 122 /* IFolderFolder *parentFolder, */ 123 CAgent *agent) 124 { 125 _proxy = proxy; 126 _proxy2 = proxy2; 127 _proxyDirIndex = proxyDirIndex; 128 _isAltStreamFolder = false; 129 if (_proxy2) 130 _isAltStreamFolder = _proxy2->IsAltDir(proxyDirIndex); 131 // _parentFolder = parentFolder; 132 _agent = (IInFolderArchive *)agent; 133 _agentSpec = agent; 134 } 135 136 void GetPathParts(UStringVector &pathParts, bool &isAltStreamFolder); 137 HRESULT CommonUpdateOperation( 138 AGENT_OP operation, 139 bool moveMode, 140 const wchar_t *newItemName, 141 const NUpdateArchive::CActionSet *actionSet, 142 const UInt32 *indices, UInt32 numItems, 143 IProgress *progress); 144 145 146 void GetPrefix(UInt32 index, UString &prefix) const; 147 UString GetName(UInt32 index) const; 148 UString GetFullPrefix(UInt32 index) const; // relative too root folder of archive 149 150 public: 151 bool _isAltStreamFolder; 152 bool _flatMode; 153 bool _loadAltStreams; // in Flat mode 154 const CProxyArc *_proxy; 155 const CProxyArc2 *_proxy2; 156 unsigned _proxyDirIndex; 157 NExtract::NZoneIdMode::EEnum _zoneMode; 158 CByteBuffer _zoneBuf; 159 // Int32 _replaceAltStreamCharsMode; 160 // CMyComPtr<IFolderFolder> _parentFolder; 161 CMyComPtr<IInFolderArchive> _agent; 162 CAgent *_agentSpec; 163 CRecordVector<CProxyItem> _items; 164 }; 165 166 167 168 class CAgent Z7_final: 169 public IInFolderArchive, 170 public IFolderArcProps, 171 #ifndef Z7_EXTRACT_ONLY 172 public IOutFolderArchive, 173 public ISetProperties, 174 #endif 175 public CMyUnknownImp 176 { 177 Z7_COM_QI_BEGIN2(IInFolderArchive) 178 Z7_COM_QI_ENTRY(IFolderArcProps) 179 #ifndef Z7_EXTRACT_ONLY 180 Z7_COM_QI_ENTRY(IOutFolderArchive) 181 Z7_COM_QI_ENTRY(ISetProperties) 182 #endif 183 Z7_COM_QI_END 184 Z7_COM_ADDREF_RELEASE 185 186 Z7_IFACE_COM7_IMP(IInFolderArchive) 187 Z7_IFACE_COM7_IMP(IFolderArcProps) 188 189 #ifndef Z7_EXTRACT_ONLY 190 Z7_IFACE_COM7_IMP(ISetProperties) 191 192 public: 193 Z7_IFACE_COM7_IMP(IOutFolderArchive) 194 HRESULT CommonUpdate(ISequentialOutStream *outArchiveStream, 195 unsigned numUpdateItems, IArchiveUpdateCallback *updateCallback); 196 197 HRESULT CreateFolder(ISequentialOutStream *outArchiveStream, 198 const wchar_t *folderName, IFolderArchiveUpdateCallback *updateCallback100); 199 200 HRESULT RenameItem(ISequentialOutStream *outArchiveStream, 201 const UInt32 *indices, UInt32 numItems, const wchar_t *newItemName, 202 IFolderArchiveUpdateCallback *updateCallback100); 203 204 HRESULT CommentItem(ISequentialOutStream *outArchiveStream, 205 const UInt32 *indices, UInt32 numItems, const wchar_t *newItemName, 206 IFolderArchiveUpdateCallback *updateCallback100); 207 208 HRESULT UpdateOneFile(ISequentialOutStream *outArchiveStream, 209 const UInt32 *indices, UInt32 numItems, const wchar_t *diskFilePath, 210 IFolderArchiveUpdateCallback *updateCallback100); 211 #endif 212 213 private: 214 HRESULT ReadItems(); 215 216 public: 217 CProxyArc *_proxy; 218 CProxyArc2 *_proxy2; 219 CArchiveLink _archiveLink; 220 221 UString ArchiveType; 222 223 FStringVector _names; 224 FString _folderPrefix; // for new files from disk 225 226 UString _updatePathPrefix; 227 CAgentFolder *_agentFolder; 228 229 UString _archiveFilePath; // it can be path of non-existing file if file is virtual 230 231 DWORD _attrib; 232 bool _updatePathPrefix_is_AltFolder; 233 bool ThereIsPathProp; 234 bool _isDeviceFile; 235 bool _isHashHandler; 236 237 FString _hashBaseFolderPrefix; 238 239 #ifndef Z7_EXTRACT_ONLY 240 CObjectVector<UString> m_PropNames; 241 CObjectVector<NWindows::NCOM::CPropVariant> m_PropValues; 242 #endif 243 244 CAgent(); 245 ~CAgent(); 246 GetArc()247 const CArc &GetArc() const { return _archiveLink.Arcs.Back(); } GetArchive()248 IInArchive *GetArchive() const { if ( _archiveLink.Arcs.IsEmpty()) return NULL; return GetArc().Archive; } 249 bool CanUpdate() const; 250 Is_Attrib_ReadOnly()251 bool Is_Attrib_ReadOnly() const 252 { 253 return _attrib != INVALID_FILE_ATTRIBUTES && (_attrib & FILE_ATTRIBUTE_READONLY); 254 } 255 IsThere_ReadOnlyArc()256 bool IsThere_ReadOnlyArc() const 257 { 258 FOR_VECTOR (i, _archiveLink.Arcs) 259 { 260 const CArc &arc = _archiveLink.Arcs[i]; 261 if (arc.FormatIndex < 0 262 || arc.IsReadOnly 263 || !g_CodecsObj->Formats[arc.FormatIndex].UpdateEnabled) 264 return true; 265 } 266 return false; 267 } 268 GetTypeOfArc(const CArc & arc)269 UString GetTypeOfArc(const CArc &arc) const 270 { 271 if (arc.FormatIndex < 0) 272 return UString("Parser"); 273 return g_CodecsObj->GetFormatNamePtr(arc.FormatIndex); 274 } 275 GetErrorMessage()276 UString GetErrorMessage() const 277 { 278 UString s; 279 for (int i = (int)_archiveLink.Arcs.Size() - 1; i >= 0; i--) 280 { 281 const CArc &arc = _archiveLink.Arcs[i]; 282 283 UString s2; 284 if (arc.ErrorInfo.ErrorFormatIndex >= 0) 285 { 286 if (arc.ErrorInfo.ErrorFormatIndex == arc.FormatIndex) 287 s2 += "Warning: The archive is open with offset"; 288 else 289 { 290 s2 += "Cannot open the file as ["; 291 s2 += g_CodecsObj->GetFormatNamePtr(arc.ErrorInfo.ErrorFormatIndex); 292 s2 += "] archive"; 293 } 294 } 295 296 if (!arc.ErrorInfo.ErrorMessage.IsEmpty()) 297 { 298 if (!s2.IsEmpty()) 299 s2.Add_LF(); 300 s2 += "\n["; 301 s2 += GetTypeOfArc(arc); 302 s2 += "]: "; 303 s2 += arc.ErrorInfo.ErrorMessage; 304 } 305 306 if (!s2.IsEmpty()) 307 { 308 if (!s.IsEmpty()) 309 s += "--------------------\n"; 310 s += arc.Path; 311 s.Add_LF(); 312 s += s2; 313 s.Add_LF(); 314 } 315 } 316 return s; 317 } 318 KeepModeForNextOpen()319 void KeepModeForNextOpen() { _archiveLink.KeepModeForNextOpen(); } 320 }; 321 322 323 // #ifdef NEW_FOLDER_INTERFACE 324 325 struct CCodecIcons 326 { 327 struct CIconPair 328 { 329 UString Ext; 330 int IconIndex; 331 }; 332 CObjectVector<CIconPair> IconPairs; 333 334 // void Clear() { IconPairs.Clear(); } 335 void LoadIcons(HMODULE m); 336 bool FindIconIndex(const UString &ext, int &iconIndex) const; 337 }; 338 339 340 Z7_CLASS_IMP_COM_1( 341 CArchiveFolderManager 342 , IFolderManager 343 ) 344 CObjectVector<CCodecIcons> CodecIconsVector; 345 CCodecIcons InternalIcons; 346 bool WasLoaded; 347 348 void LoadFormats(); 349 // int FindFormat(const UString &type); 350 public: CArchiveFolderManager()351 CArchiveFolderManager(): 352 WasLoaded(false) 353 {} 354 }; 355 356 // #endif 357 358 #endif 359