1*f6dc9357SAndroid Build Coastguard Worker // Common/Wildcard.h 2*f6dc9357SAndroid Build Coastguard Worker 3*f6dc9357SAndroid Build Coastguard Worker #ifndef ZIP7_INC_COMMON_WILDCARD_H 4*f6dc9357SAndroid Build Coastguard Worker #define ZIP7_INC_COMMON_WILDCARD_H 5*f6dc9357SAndroid Build Coastguard Worker 6*f6dc9357SAndroid Build Coastguard Worker #include "MyString.h" 7*f6dc9357SAndroid Build Coastguard Worker 8*f6dc9357SAndroid Build Coastguard Worker int CompareFileNames(const wchar_t *s1, const wchar_t *s2) STRING_UNICODE_THROW; 9*f6dc9357SAndroid Build Coastguard Worker #ifndef USE_UNICODE_FSTRING 10*f6dc9357SAndroid Build Coastguard Worker int CompareFileNames(const char *s1, const char *s2); 11*f6dc9357SAndroid Build Coastguard Worker #endif 12*f6dc9357SAndroid Build Coastguard Worker 13*f6dc9357SAndroid Build Coastguard Worker bool IsPath1PrefixedByPath2(const wchar_t *s1, const wchar_t *s2); 14*f6dc9357SAndroid Build Coastguard Worker 15*f6dc9357SAndroid Build Coastguard Worker void SplitPathToParts(const UString &path, UStringVector &pathParts); 16*f6dc9357SAndroid Build Coastguard Worker void SplitPathToParts_2(const UString &path, UString &dirPrefix, UString &name); 17*f6dc9357SAndroid Build Coastguard Worker void SplitPathToParts_Smart(const UString &path, UString &dirPrefix, UString &name); // ignores dir delimiter at the end of (path) 18*f6dc9357SAndroid Build Coastguard Worker 19*f6dc9357SAndroid Build Coastguard Worker UString ExtractDirPrefixFromPath(const UString &path); 20*f6dc9357SAndroid Build Coastguard Worker UString ExtractFileNameFromPath(const UString &path); 21*f6dc9357SAndroid Build Coastguard Worker 22*f6dc9357SAndroid Build Coastguard Worker bool DoesNameContainWildcard(const UString &path); 23*f6dc9357SAndroid Build Coastguard Worker bool DoesWildcardMatchName(const UString &mask, const UString &name); 24*f6dc9357SAndroid Build Coastguard Worker 25*f6dc9357SAndroid Build Coastguard Worker namespace NWildcard { 26*f6dc9357SAndroid Build Coastguard Worker 27*f6dc9357SAndroid Build Coastguard Worker #ifdef _WIN32 28*f6dc9357SAndroid Build Coastguard Worker // returns true, if name is like "a:", "c:", ... 29*f6dc9357SAndroid Build Coastguard Worker bool IsDriveColonName(const wchar_t *s); 30*f6dc9357SAndroid Build Coastguard Worker unsigned GetNumPrefixParts_if_DrivePath(UStringVector &pathParts); 31*f6dc9357SAndroid Build Coastguard Worker #endif 32*f6dc9357SAndroid Build Coastguard Worker 33*f6dc9357SAndroid Build Coastguard Worker struct CItem 34*f6dc9357SAndroid Build Coastguard Worker { 35*f6dc9357SAndroid Build Coastguard Worker UStringVector PathParts; 36*f6dc9357SAndroid Build Coastguard Worker bool Recursive; 37*f6dc9357SAndroid Build Coastguard Worker bool ForFile; 38*f6dc9357SAndroid Build Coastguard Worker bool ForDir; 39*f6dc9357SAndroid Build Coastguard Worker bool WildcardMatching; 40*f6dc9357SAndroid Build Coastguard Worker 41*f6dc9357SAndroid Build Coastguard Worker #ifdef _WIN32 IsDriveItemCItem42*f6dc9357SAndroid Build Coastguard Worker bool IsDriveItem() const 43*f6dc9357SAndroid Build Coastguard Worker { 44*f6dc9357SAndroid Build Coastguard Worker return PathParts.Size() == 1 && !ForFile && ForDir && IsDriveColonName(PathParts[0]); 45*f6dc9357SAndroid Build Coastguard Worker } 46*f6dc9357SAndroid Build Coastguard Worker #endif 47*f6dc9357SAndroid Build Coastguard Worker 48*f6dc9357SAndroid Build Coastguard Worker // CItem(): WildcardMatching(true) {} 49*f6dc9357SAndroid Build Coastguard Worker 50*f6dc9357SAndroid Build Coastguard Worker bool AreAllAllowed() const; 51*f6dc9357SAndroid Build Coastguard Worker bool CheckPath(const UStringVector &pathParts, bool isFile) const; 52*f6dc9357SAndroid Build Coastguard Worker }; 53*f6dc9357SAndroid Build Coastguard Worker 54*f6dc9357SAndroid Build Coastguard Worker 55*f6dc9357SAndroid Build Coastguard Worker 56*f6dc9357SAndroid Build Coastguard Worker const Byte kMark_FileOrDir = 0; 57*f6dc9357SAndroid Build Coastguard Worker const Byte kMark_StrictFile = 1; 58*f6dc9357SAndroid Build Coastguard Worker const Byte kMark_StrictFile_IfWildcard = 2; 59*f6dc9357SAndroid Build Coastguard Worker 60*f6dc9357SAndroid Build Coastguard Worker struct CCensorPathProps 61*f6dc9357SAndroid Build Coastguard Worker { 62*f6dc9357SAndroid Build Coastguard Worker bool Recursive; 63*f6dc9357SAndroid Build Coastguard Worker bool WildcardMatching; 64*f6dc9357SAndroid Build Coastguard Worker Byte MarkMode; 65*f6dc9357SAndroid Build Coastguard Worker CCensorPathPropsCCensorPathProps66*f6dc9357SAndroid Build Coastguard Worker CCensorPathProps(): 67*f6dc9357SAndroid Build Coastguard Worker Recursive(false), 68*f6dc9357SAndroid Build Coastguard Worker WildcardMatching(true), 69*f6dc9357SAndroid Build Coastguard Worker MarkMode(kMark_FileOrDir) 70*f6dc9357SAndroid Build Coastguard Worker {} 71*f6dc9357SAndroid Build Coastguard Worker }; 72*f6dc9357SAndroid Build Coastguard Worker 73*f6dc9357SAndroid Build Coastguard Worker 74*f6dc9357SAndroid Build Coastguard Worker class CCensorNode MY_UNCOPYABLE 75*f6dc9357SAndroid Build Coastguard Worker { 76*f6dc9357SAndroid Build Coastguard Worker CCensorNode *Parent; 77*f6dc9357SAndroid Build Coastguard Worker 78*f6dc9357SAndroid Build Coastguard Worker bool CheckPathCurrent(bool include, const UStringVector &pathParts, bool isFile) const; 79*f6dc9357SAndroid Build Coastguard Worker void AddItemSimple(bool include, CItem &item); 80*f6dc9357SAndroid Build Coastguard Worker public: 81*f6dc9357SAndroid Build Coastguard Worker // bool ExcludeDirItems; 82*f6dc9357SAndroid Build Coastguard Worker CCensorNode()83*f6dc9357SAndroid Build Coastguard Worker CCensorNode(): 84*f6dc9357SAndroid Build Coastguard Worker Parent(NULL) 85*f6dc9357SAndroid Build Coastguard Worker // , ExcludeDirItems(false) 86*f6dc9357SAndroid Build Coastguard Worker {} 87*f6dc9357SAndroid Build Coastguard Worker CCensorNode(const UString & name,CCensorNode * parent)88*f6dc9357SAndroid Build Coastguard Worker CCensorNode(const UString &name, CCensorNode *parent): 89*f6dc9357SAndroid Build Coastguard Worker Parent(parent) 90*f6dc9357SAndroid Build Coastguard Worker // , ExcludeDirItems(false) 91*f6dc9357SAndroid Build Coastguard Worker , Name(name) 92*f6dc9357SAndroid Build Coastguard Worker {} 93*f6dc9357SAndroid Build Coastguard Worker 94*f6dc9357SAndroid Build Coastguard Worker UString Name; // WIN32 doesn't support wildcards in file names 95*f6dc9357SAndroid Build Coastguard Worker CObjectVector<CCensorNode> SubNodes; 96*f6dc9357SAndroid Build Coastguard Worker CObjectVector<CItem> IncludeItems; 97*f6dc9357SAndroid Build Coastguard Worker CObjectVector<CItem> ExcludeItems; 98*f6dc9357SAndroid Build Coastguard Worker Find_SubNode_Or_Add_New(const UString & name)99*f6dc9357SAndroid Build Coastguard Worker CCensorNode &Find_SubNode_Or_Add_New(const UString &name) 100*f6dc9357SAndroid Build Coastguard Worker { 101*f6dc9357SAndroid Build Coastguard Worker int i = FindSubNode(name); 102*f6dc9357SAndroid Build Coastguard Worker if (i >= 0) 103*f6dc9357SAndroid Build Coastguard Worker return SubNodes[(unsigned)i]; 104*f6dc9357SAndroid Build Coastguard Worker // return SubNodes.Add(CCensorNode(name, this)); 105*f6dc9357SAndroid Build Coastguard Worker CCensorNode &node = SubNodes.AddNew(); 106*f6dc9357SAndroid Build Coastguard Worker node.Parent = this; 107*f6dc9357SAndroid Build Coastguard Worker node.Name = name; 108*f6dc9357SAndroid Build Coastguard Worker return node; 109*f6dc9357SAndroid Build Coastguard Worker } 110*f6dc9357SAndroid Build Coastguard Worker 111*f6dc9357SAndroid Build Coastguard Worker bool AreAllAllowed() const; 112*f6dc9357SAndroid Build Coastguard Worker 113*f6dc9357SAndroid Build Coastguard Worker int FindSubNode(const UString &path) const; 114*f6dc9357SAndroid Build Coastguard Worker 115*f6dc9357SAndroid Build Coastguard Worker void AddItem(bool include, CItem &item, int ignoreWildcardIndex = -1); 116*f6dc9357SAndroid Build Coastguard Worker // void AddItem(bool include, const UString &path, const CCensorPathProps &props); Add_Wildcard()117*f6dc9357SAndroid Build Coastguard Worker void Add_Wildcard() 118*f6dc9357SAndroid Build Coastguard Worker { 119*f6dc9357SAndroid Build Coastguard Worker CItem item; 120*f6dc9357SAndroid Build Coastguard Worker item.PathParts.Add(L"*"); 121*f6dc9357SAndroid Build Coastguard Worker item.Recursive = false; 122*f6dc9357SAndroid Build Coastguard Worker item.ForFile = true; 123*f6dc9357SAndroid Build Coastguard Worker item.ForDir = true; 124*f6dc9357SAndroid Build Coastguard Worker item.WildcardMatching = true; 125*f6dc9357SAndroid Build Coastguard Worker AddItem( 126*f6dc9357SAndroid Build Coastguard Worker true // include 127*f6dc9357SAndroid Build Coastguard Worker , item); 128*f6dc9357SAndroid Build Coastguard Worker } 129*f6dc9357SAndroid Build Coastguard Worker 130*f6dc9357SAndroid Build Coastguard Worker // NeedCheckSubDirs() returns true, if there are IncludeItems rules that affect items in subdirs 131*f6dc9357SAndroid Build Coastguard Worker bool NeedCheckSubDirs() const; 132*f6dc9357SAndroid Build Coastguard Worker bool AreThereIncludeItems() const; 133*f6dc9357SAndroid Build Coastguard Worker 134*f6dc9357SAndroid Build Coastguard Worker /* 135*f6dc9357SAndroid Build Coastguard Worker CheckPathVect() doesn't check path in Parent CCensorNode 136*f6dc9357SAndroid Build Coastguard Worker so use CheckPathVect() for root CCensorNode 137*f6dc9357SAndroid Build Coastguard Worker OUT: 138*f6dc9357SAndroid Build Coastguard Worker returns (true) && (include = false) - file in exlude list 139*f6dc9357SAndroid Build Coastguard Worker returns (true) && (include = true) - file in include list and is not in exlude list 140*f6dc9357SAndroid Build Coastguard Worker returns (false) - file is not in (include/exlude) list 141*f6dc9357SAndroid Build Coastguard Worker */ 142*f6dc9357SAndroid Build Coastguard Worker bool CheckPathVect(const UStringVector &pathParts, bool isFile, bool &include) const; 143*f6dc9357SAndroid Build Coastguard Worker 144*f6dc9357SAndroid Build Coastguard Worker // bool CheckPath2(bool isAltStream, const UString &path, bool isFile, bool &include) const; 145*f6dc9357SAndroid Build Coastguard Worker // bool CheckPath(bool isAltStream, const UString &path, bool isFile) const; 146*f6dc9357SAndroid Build Coastguard Worker 147*f6dc9357SAndroid Build Coastguard Worker // CheckPathToRoot_Change() changes pathParts !!! 148*f6dc9357SAndroid Build Coastguard Worker bool CheckPathToRoot_Change(bool include, UStringVector &pathParts, bool isFile) const; 149*f6dc9357SAndroid Build Coastguard Worker bool CheckPathToRoot(bool include, const UStringVector &pathParts, bool isFile) const; 150*f6dc9357SAndroid Build Coastguard Worker 151*f6dc9357SAndroid Build Coastguard Worker // bool CheckPathToRoot(const UString &path, bool isFile, bool include) const; 152*f6dc9357SAndroid Build Coastguard Worker void ExtendExclude(const CCensorNode &fromNodes); 153*f6dc9357SAndroid Build Coastguard Worker }; 154*f6dc9357SAndroid Build Coastguard Worker 155*f6dc9357SAndroid Build Coastguard Worker 156*f6dc9357SAndroid Build Coastguard Worker struct CPair MY_UNCOPYABLE 157*f6dc9357SAndroid Build Coastguard Worker { 158*f6dc9357SAndroid Build Coastguard Worker UString Prefix; 159*f6dc9357SAndroid Build Coastguard Worker CCensorNode Head; 160*f6dc9357SAndroid Build Coastguard Worker 161*f6dc9357SAndroid Build Coastguard Worker // CPair(const UString &prefix): Prefix(prefix) { }; 162*f6dc9357SAndroid Build Coastguard Worker }; 163*f6dc9357SAndroid Build Coastguard Worker 164*f6dc9357SAndroid Build Coastguard Worker 165*f6dc9357SAndroid Build Coastguard Worker enum ECensorPathMode 166*f6dc9357SAndroid Build Coastguard Worker { 167*f6dc9357SAndroid Build Coastguard Worker k_RelatPath, // absolute prefix as Prefix, remain path in Tree 168*f6dc9357SAndroid Build Coastguard Worker k_FullPath, // drive prefix as Prefix, remain path in Tree 169*f6dc9357SAndroid Build Coastguard Worker k_AbsPath // full path in Tree 170*f6dc9357SAndroid Build Coastguard Worker }; 171*f6dc9357SAndroid Build Coastguard Worker 172*f6dc9357SAndroid Build Coastguard Worker 173*f6dc9357SAndroid Build Coastguard Worker struct CCensorPath 174*f6dc9357SAndroid Build Coastguard Worker { 175*f6dc9357SAndroid Build Coastguard Worker UString Path; 176*f6dc9357SAndroid Build Coastguard Worker bool Include; 177*f6dc9357SAndroid Build Coastguard Worker CCensorPathProps Props; 178*f6dc9357SAndroid Build Coastguard Worker CCensorPathCCensorPath179*f6dc9357SAndroid Build Coastguard Worker CCensorPath(): 180*f6dc9357SAndroid Build Coastguard Worker Include(true) 181*f6dc9357SAndroid Build Coastguard Worker {} 182*f6dc9357SAndroid Build Coastguard Worker }; 183*f6dc9357SAndroid Build Coastguard Worker 184*f6dc9357SAndroid Build Coastguard Worker 185*f6dc9357SAndroid Build Coastguard Worker class CCensor MY_UNCOPYABLE 186*f6dc9357SAndroid Build Coastguard Worker { 187*f6dc9357SAndroid Build Coastguard Worker int FindPairForPrefix(const UString &prefix) const; 188*f6dc9357SAndroid Build Coastguard Worker public: 189*f6dc9357SAndroid Build Coastguard Worker CObjectVector<CPair> Pairs; 190*f6dc9357SAndroid Build Coastguard Worker 191*f6dc9357SAndroid Build Coastguard Worker bool ExcludeDirItems; 192*f6dc9357SAndroid Build Coastguard Worker bool ExcludeFileItems; 193*f6dc9357SAndroid Build Coastguard Worker CCensor()194*f6dc9357SAndroid Build Coastguard Worker CCensor(): 195*f6dc9357SAndroid Build Coastguard Worker ExcludeDirItems(false), 196*f6dc9357SAndroid Build Coastguard Worker ExcludeFileItems(false) 197*f6dc9357SAndroid Build Coastguard Worker {} 198*f6dc9357SAndroid Build Coastguard Worker 199*f6dc9357SAndroid Build Coastguard Worker CObjectVector<NWildcard::CCensorPath> CensorPaths; 200*f6dc9357SAndroid Build Coastguard Worker AllAreRelative()201*f6dc9357SAndroid Build Coastguard Worker bool AllAreRelative() const 202*f6dc9357SAndroid Build Coastguard Worker { return (Pairs.Size() == 1 && Pairs.Front().Prefix.IsEmpty()); } 203*f6dc9357SAndroid Build Coastguard Worker 204*f6dc9357SAndroid Build Coastguard Worker void AddItem(ECensorPathMode pathMode, bool include, const UString &path, const CCensorPathProps &props); 205*f6dc9357SAndroid Build Coastguard Worker // bool CheckPath(bool isAltStream, const UString &path, bool isFile) const; 206*f6dc9357SAndroid Build Coastguard Worker void ExtendExclude(); 207*f6dc9357SAndroid Build Coastguard Worker 208*f6dc9357SAndroid Build Coastguard Worker void AddPathsToCensor(NWildcard::ECensorPathMode censorPathMode); 209*f6dc9357SAndroid Build Coastguard Worker void AddPreItem(bool include, const UString &path, const CCensorPathProps &props); 210*f6dc9357SAndroid Build Coastguard Worker AddPreItem_NoWildcard(const UString & path)211*f6dc9357SAndroid Build Coastguard Worker void AddPreItem_NoWildcard(const UString &path) 212*f6dc9357SAndroid Build Coastguard Worker { 213*f6dc9357SAndroid Build Coastguard Worker CCensorPathProps props; 214*f6dc9357SAndroid Build Coastguard Worker props.WildcardMatching = false; 215*f6dc9357SAndroid Build Coastguard Worker AddPreItem( 216*f6dc9357SAndroid Build Coastguard Worker true, // include 217*f6dc9357SAndroid Build Coastguard Worker path, props); 218*f6dc9357SAndroid Build Coastguard Worker } AddPreItem_Wildcard()219*f6dc9357SAndroid Build Coastguard Worker void AddPreItem_Wildcard() 220*f6dc9357SAndroid Build Coastguard Worker { 221*f6dc9357SAndroid Build Coastguard Worker CCensorPathProps props; 222*f6dc9357SAndroid Build Coastguard Worker // props.WildcardMatching = true; 223*f6dc9357SAndroid Build Coastguard Worker AddPreItem( 224*f6dc9357SAndroid Build Coastguard Worker true, // include 225*f6dc9357SAndroid Build Coastguard Worker UString("*"), props); 226*f6dc9357SAndroid Build Coastguard Worker } 227*f6dc9357SAndroid Build Coastguard Worker }; 228*f6dc9357SAndroid Build Coastguard Worker 229*f6dc9357SAndroid Build Coastguard Worker } 230*f6dc9357SAndroid Build Coastguard Worker 231*f6dc9357SAndroid Build Coastguard Worker #endif 232