1 // RegisterArc.h 2 3 #ifndef __REGISTER_ARC_H 4 #define __REGISTER_ARC_H 5 6 #include "../Archive/IArchive.h" 7 8 struct CArcInfo 9 { 10 UInt32 Flags; 11 Byte Id; 12 Byte SignatureSize; 13 UInt16 SignatureOffset; 14 15 const Byte *Signature; 16 const char *Name; 17 const char *Ext; 18 const char *AddExt; 19 20 UInt32 TimeFlags; 21 22 Func_CreateInArchive CreateInArchive; 23 Func_CreateOutArchive CreateOutArchive; 24 Func_IsArc IsArc; 25 IsMultiSignatureCArcInfo26 bool IsMultiSignature() const { return (Flags & NArcInfoFlags::kMultiSignature) != 0; } 27 }; 28 29 void RegisterArc(const CArcInfo *arcInfo) throw(); 30 31 32 #define IMP_CreateArcIn_2(c) \ 33 static IInArchive *CreateArc() { return new c; } 34 35 #define IMP_CreateArcIn IMP_CreateArcIn_2(CHandler()) 36 37 #ifdef EXTRACT_ONLY 38 #define IMP_CreateArcOut 39 #define CreateArcOut NULL 40 #else 41 #define IMP_CreateArcOut static IOutArchive *CreateArcOut() { return new CHandler(); } 42 #endif 43 44 #define REGISTER_ARC_V(n, e, ae, id, sigSize, sig, offs, flags, tf, crIn, crOut, isArc) \ 45 static const CArcInfo g_ArcInfo = { flags, id, sigSize, offs, sig, n, e, ae, tf, crIn, crOut, isArc } ; \ 46 47 #define REGISTER_ARC_R(n, e, ae, id, sigSize, sig, offs, flags, tf, crIn, crOut, isArc) \ 48 REGISTER_ARC_V (n, e, ae, id, sigSize, sig, offs, flags, tf, crIn, crOut, isArc) \ 49 struct CRegisterArc { CRegisterArc() { RegisterArc(&g_ArcInfo); }}; \ 50 static CRegisterArc g_RegisterArc; 51 52 53 #define REGISTER_ARC_I_CLS(cls, n, e, ae, id, sig, offs, flags, isArc) \ 54 IMP_CreateArcIn_2(cls) \ 55 REGISTER_ARC_R(n, e, ae, id, ARRAY_SIZE(sig), sig, offs, flags, 0, CreateArc, NULL, isArc) 56 57 #define REGISTER_ARC_I_CLS_NO_SIG(cls, n, e, ae, id, offs, flags, isArc) \ 58 IMP_CreateArcIn_2(cls) \ 59 REGISTER_ARC_R(n, e, ae, id, 0, NULL, offs, flags, 0, CreateArc, NULL, isArc) 60 61 #define REGISTER_ARC_I(n, e, ae, id, sig, offs, flags, isArc) \ 62 REGISTER_ARC_I_CLS(CHandler(), n, e, ae, id, sig, offs, flags, isArc) 63 64 #define REGISTER_ARC_I_NO_SIG(n, e, ae, id, offs, flags, isArc) \ 65 REGISTER_ARC_I_CLS_NO_SIG(CHandler(), n, e, ae, id, offs, flags, isArc) 66 67 68 #define REGISTER_ARC_IO(n, e, ae, id, sig, offs, flags, tf, isArc) \ 69 IMP_CreateArcIn \ 70 IMP_CreateArcOut \ 71 REGISTER_ARC_R(n, e, ae, id, ARRAY_SIZE(sig), sig, offs, flags, tf, CreateArc, CreateArcOut, isArc) 72 73 #define REGISTER_ARC_IO_DECREMENT_SIG(n, e, ae, id, sig, offs, flags, tf, isArc) \ 74 IMP_CreateArcIn \ 75 IMP_CreateArcOut \ 76 REGISTER_ARC_V(n, e, ae, id, ARRAY_SIZE(sig), sig, offs, flags, tf, CreateArc, CreateArcOut, isArc) \ 77 struct CRegisterArcDecSig { CRegisterArcDecSig() { sig[0]--; RegisterArc(&g_ArcInfo); }}; \ 78 static CRegisterArcDecSig g_RegisterArc; 79 80 #endif 81