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