1*f6dc9357SAndroid Build Coastguard Worker // RarVol.h 2*f6dc9357SAndroid Build Coastguard Worker 3*f6dc9357SAndroid Build Coastguard Worker #ifndef ZIP7_INC_ARCHIVE_RAR_VOL_H 4*f6dc9357SAndroid Build Coastguard Worker #define ZIP7_INC_ARCHIVE_RAR_VOL_H 5*f6dc9357SAndroid Build Coastguard Worker 6*f6dc9357SAndroid Build Coastguard Worker #include "../../../Common/StringConvert.h" 7*f6dc9357SAndroid Build Coastguard Worker 8*f6dc9357SAndroid Build Coastguard Worker #include "RarHeader.h" 9*f6dc9357SAndroid Build Coastguard Worker 10*f6dc9357SAndroid Build Coastguard Worker namespace NArchive { 11*f6dc9357SAndroid Build Coastguard Worker namespace NRar { 12*f6dc9357SAndroid Build Coastguard Worker IsDigit(wchar_t c)13*f6dc9357SAndroid Build Coastguard Workerinline bool IsDigit(wchar_t c) 14*f6dc9357SAndroid Build Coastguard Worker { 15*f6dc9357SAndroid Build Coastguard Worker return c >= L'0' && c <= L'9'; 16*f6dc9357SAndroid Build Coastguard Worker } 17*f6dc9357SAndroid Build Coastguard Worker 18*f6dc9357SAndroid Build Coastguard Worker class CVolumeName 19*f6dc9357SAndroid Build Coastguard Worker { 20*f6dc9357SAndroid Build Coastguard Worker bool _needChangeForNext; 21*f6dc9357SAndroid Build Coastguard Worker UString _before; 22*f6dc9357SAndroid Build Coastguard Worker UString _changed; 23*f6dc9357SAndroid Build Coastguard Worker UString _after; 24*f6dc9357SAndroid Build Coastguard Worker public: CVolumeName()25*f6dc9357SAndroid Build Coastguard Worker CVolumeName(): _needChangeForNext(true) {} 26*f6dc9357SAndroid Build Coastguard Worker 27*f6dc9357SAndroid Build Coastguard Worker bool InitName(const UString &name, bool newStyle = true) 28*f6dc9357SAndroid Build Coastguard Worker { 29*f6dc9357SAndroid Build Coastguard Worker _needChangeForNext = true; 30*f6dc9357SAndroid Build Coastguard Worker _after.Empty(); 31*f6dc9357SAndroid Build Coastguard Worker UString base (name); 32*f6dc9357SAndroid Build Coastguard Worker const int dotPos = name.ReverseFind_Dot(); 33*f6dc9357SAndroid Build Coastguard Worker 34*f6dc9357SAndroid Build Coastguard Worker if (dotPos >= 0) 35*f6dc9357SAndroid Build Coastguard Worker { 36*f6dc9357SAndroid Build Coastguard Worker const UString ext (name.Ptr(dotPos + 1)); 37*f6dc9357SAndroid Build Coastguard Worker if (ext.IsEqualTo_Ascii_NoCase("rar")) 38*f6dc9357SAndroid Build Coastguard Worker { 39*f6dc9357SAndroid Build Coastguard Worker _after = name.Ptr(dotPos); 40*f6dc9357SAndroid Build Coastguard Worker base.DeleteFrom(dotPos); 41*f6dc9357SAndroid Build Coastguard Worker } 42*f6dc9357SAndroid Build Coastguard Worker else if (ext.IsEqualTo_Ascii_NoCase("exe")) 43*f6dc9357SAndroid Build Coastguard Worker { 44*f6dc9357SAndroid Build Coastguard Worker _after = ".rar"; 45*f6dc9357SAndroid Build Coastguard Worker base.DeleteFrom(dotPos); 46*f6dc9357SAndroid Build Coastguard Worker } 47*f6dc9357SAndroid Build Coastguard Worker else if (!newStyle) 48*f6dc9357SAndroid Build Coastguard Worker { 49*f6dc9357SAndroid Build Coastguard Worker if (ext.IsEqualTo_Ascii_NoCase("000") || 50*f6dc9357SAndroid Build Coastguard Worker ext.IsEqualTo_Ascii_NoCase("001") || 51*f6dc9357SAndroid Build Coastguard Worker ext.IsEqualTo_Ascii_NoCase("r00") || 52*f6dc9357SAndroid Build Coastguard Worker ext.IsEqualTo_Ascii_NoCase("r01")) 53*f6dc9357SAndroid Build Coastguard Worker { 54*f6dc9357SAndroid Build Coastguard Worker _changed = ext; 55*f6dc9357SAndroid Build Coastguard Worker _before.SetFrom(name.Ptr(), (unsigned)dotPos + 1); 56*f6dc9357SAndroid Build Coastguard Worker return true; 57*f6dc9357SAndroid Build Coastguard Worker } 58*f6dc9357SAndroid Build Coastguard Worker } 59*f6dc9357SAndroid Build Coastguard Worker } 60*f6dc9357SAndroid Build Coastguard Worker 61*f6dc9357SAndroid Build Coastguard Worker if (newStyle) 62*f6dc9357SAndroid Build Coastguard Worker { 63*f6dc9357SAndroid Build Coastguard Worker unsigned k = base.Len(); 64*f6dc9357SAndroid Build Coastguard Worker 65*f6dc9357SAndroid Build Coastguard Worker for (; k != 0; k--) 66*f6dc9357SAndroid Build Coastguard Worker if (IsDigit(base[k - 1])) 67*f6dc9357SAndroid Build Coastguard Worker break; 68*f6dc9357SAndroid Build Coastguard Worker 69*f6dc9357SAndroid Build Coastguard Worker unsigned i = k; 70*f6dc9357SAndroid Build Coastguard Worker 71*f6dc9357SAndroid Build Coastguard Worker for (; i != 0; i--) 72*f6dc9357SAndroid Build Coastguard Worker if (!IsDigit(base[i - 1])) 73*f6dc9357SAndroid Build Coastguard Worker break; 74*f6dc9357SAndroid Build Coastguard Worker 75*f6dc9357SAndroid Build Coastguard Worker if (i != k) 76*f6dc9357SAndroid Build Coastguard Worker { 77*f6dc9357SAndroid Build Coastguard Worker _before.SetFrom(base.Ptr(), i); 78*f6dc9357SAndroid Build Coastguard Worker _changed.SetFrom(base.Ptr(i), k - i); 79*f6dc9357SAndroid Build Coastguard Worker _after.Insert(0, base.Ptr(k)); 80*f6dc9357SAndroid Build Coastguard Worker return true; 81*f6dc9357SAndroid Build Coastguard Worker } 82*f6dc9357SAndroid Build Coastguard Worker } 83*f6dc9357SAndroid Build Coastguard Worker 84*f6dc9357SAndroid Build Coastguard Worker _after.Empty(); 85*f6dc9357SAndroid Build Coastguard Worker _before = base; 86*f6dc9357SAndroid Build Coastguard Worker _before.Add_Dot(); 87*f6dc9357SAndroid Build Coastguard Worker _changed = "r00"; 88*f6dc9357SAndroid Build Coastguard Worker _needChangeForNext = false; 89*f6dc9357SAndroid Build Coastguard Worker return true; 90*f6dc9357SAndroid Build Coastguard Worker } 91*f6dc9357SAndroid Build Coastguard Worker 92*f6dc9357SAndroid Build Coastguard Worker /* 93*f6dc9357SAndroid Build Coastguard Worker void MakeBeforeFirstName() 94*f6dc9357SAndroid Build Coastguard Worker { 95*f6dc9357SAndroid Build Coastguard Worker unsigned len = _changed.Len(); 96*f6dc9357SAndroid Build Coastguard Worker _changed.Empty(); 97*f6dc9357SAndroid Build Coastguard Worker for (unsigned i = 0; i < len; i++) 98*f6dc9357SAndroid Build Coastguard Worker _changed += L'0'; 99*f6dc9357SAndroid Build Coastguard Worker } 100*f6dc9357SAndroid Build Coastguard Worker */ 101*f6dc9357SAndroid Build Coastguard Worker GetNextName()102*f6dc9357SAndroid Build Coastguard Worker UString GetNextName() 103*f6dc9357SAndroid Build Coastguard Worker { 104*f6dc9357SAndroid Build Coastguard Worker if (_needChangeForNext) 105*f6dc9357SAndroid Build Coastguard Worker { 106*f6dc9357SAndroid Build Coastguard Worker unsigned i = _changed.Len(); 107*f6dc9357SAndroid Build Coastguard Worker if (i == 0) 108*f6dc9357SAndroid Build Coastguard Worker return UString(); 109*f6dc9357SAndroid Build Coastguard Worker for (;;) 110*f6dc9357SAndroid Build Coastguard Worker { 111*f6dc9357SAndroid Build Coastguard Worker wchar_t c = _changed[--i]; 112*f6dc9357SAndroid Build Coastguard Worker if (c == L'9') 113*f6dc9357SAndroid Build Coastguard Worker { 114*f6dc9357SAndroid Build Coastguard Worker c = L'0'; 115*f6dc9357SAndroid Build Coastguard Worker _changed.ReplaceOneCharAtPos(i, c); 116*f6dc9357SAndroid Build Coastguard Worker if (i == 0) 117*f6dc9357SAndroid Build Coastguard Worker { 118*f6dc9357SAndroid Build Coastguard Worker _changed.InsertAtFront(L'1'); 119*f6dc9357SAndroid Build Coastguard Worker break; 120*f6dc9357SAndroid Build Coastguard Worker } 121*f6dc9357SAndroid Build Coastguard Worker continue; 122*f6dc9357SAndroid Build Coastguard Worker } 123*f6dc9357SAndroid Build Coastguard Worker c++; 124*f6dc9357SAndroid Build Coastguard Worker _changed.ReplaceOneCharAtPos(i, c); 125*f6dc9357SAndroid Build Coastguard Worker break; 126*f6dc9357SAndroid Build Coastguard Worker } 127*f6dc9357SAndroid Build Coastguard Worker } 128*f6dc9357SAndroid Build Coastguard Worker 129*f6dc9357SAndroid Build Coastguard Worker _needChangeForNext = true; 130*f6dc9357SAndroid Build Coastguard Worker return _before + _changed + _after; 131*f6dc9357SAndroid Build Coastguard Worker } 132*f6dc9357SAndroid Build Coastguard Worker }; 133*f6dc9357SAndroid Build Coastguard Worker 134*f6dc9357SAndroid Build Coastguard Worker }} 135*f6dc9357SAndroid Build Coastguard Worker 136*f6dc9357SAndroid Build Coastguard Worker #endif 137