aboutsummaryrefslogtreecommitdiff
path: root/dep/CascLib/src/CascFiles.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'dep/CascLib/src/CascFiles.cpp')
-rw-r--r--dep/CascLib/src/CascFiles.cpp53
1 files changed, 35 insertions, 18 deletions
diff --git a/dep/CascLib/src/CascFiles.cpp b/dep/CascLib/src/CascFiles.cpp
index 550b558f7da..90544cb2031 100644
--- a/dep/CascLib/src/CascFiles.cpp
+++ b/dep/CascLib/src/CascFiles.cpp
@@ -274,9 +274,8 @@ static DWORD GetLocaleValue(LPCSTR szTag)
case 0x64654445: return CASC_LOCALE_DEDE;
case 0x72755255: return CASC_LOCALE_RURU;
case 0x69744954: return CASC_LOCALE_ITIT;
+ default: return CASC_LOCALE_NONE;
}
-
- return 0;
}
static bool CheckConfigFileVariable(
@@ -579,29 +578,41 @@ static DWORD GetDefaultCdnPath(TCascStorage * hs, const CASC_CSV_COLUMN & Column
return ERROR_SUCCESS;
}
-static DWORD GetDefaultLocaleMask(TCascStorage * hs, const CASC_CSV_COLUMN & Column)
+static DWORD GetDefaultLocaleByRegion(LPCSTR szRegion)
+{
+ #define CASC_REGION_INT(hi, lo) (((DWORD)(hi) << 0x08) | lo)
+
+ // Setup the default locale
+ switch(CASC_REGION_INT(szRegion[0], szRegion[1]))
+ {
+ case CASC_REGION_INT('u', 's'): return CASC_LOCALE_ENUS;
+ case CASC_REGION_INT('e', 'u'): return CASC_LOCALE_ENGB;
+ case CASC_REGION_INT('c', 'n'): return CASC_LOCALE_ZHCN;
+ case CASC_REGION_INT('k', 'r'): return CASC_LOCALE_KOKR;
+ case CASC_REGION_INT('t', 'w'): return CASC_LOCALE_ZHTW;
+// case CASC_REGION_INT('s', 'g'): return CASC_LOCALE_????;
+ default: return CASC_LOCALE_ENUS;
+ }
+}
+
+static DWORD GetDefaultLocaleMask(const CASC_CSV_COLUMN & Column)
{
LPCSTR szTagEnd = Column.szValue + Column.nLength - 4;
- LPCSTR szTagPtr = Column.szValue;
+ LPCSTR szTagPtr;
+ DWORD dwLocaleValue;
DWORD dwLocaleMask = 0;
- while(szTagPtr < szTagEnd)
+ // Go through the whole tag string
+ for(szTagPtr = Column.szValue; szTagPtr <= szTagEnd; szTagPtr++)
{
- DWORD dwLocaleValue = GetLocaleValue(szTagPtr);
-
- if(dwLocaleValue != 0)
+ // Try to recognize the 4-char locale code
+ if((dwLocaleValue = GetLocaleValue(szTagPtr)) != CASC_LOCALE_NONE)
{
- dwLocaleMask = dwLocaleMask | GetLocaleValue(szTagPtr);
- szTagPtr += 4;
- }
- else
- {
- szTagPtr++;
+ dwLocaleMask |= dwLocaleValue;
+ szTagPtr += 3; // Will be moved by 1 more at the end of the loop
}
}
-
- hs->dwDefaultLocale = dwLocaleMask;
- return ERROR_SUCCESS;
+ return dwLocaleMask;
}
static DWORD ParseFile_BuildInfo(TCascStorage * hs, CASC_CSV & Csv)
@@ -703,7 +714,7 @@ static DWORD ParseFile_BuildInfo(TCascStorage * hs, CASC_CSV & Csv)
return dwErrCode;
// If we found tags, we can extract language build from it
- GetDefaultLocaleMask(hs, Csv[nSelected]["Tags!STRING:0"]);
+ hs->dwDefaultLocale = GetDefaultLocaleMask(Csv[nSelected]["Tags!STRING:0"]);
// Get the CDN servers and hosts
if(hs->dwFeatures & CASC_FEATURE_ONLINE)
@@ -734,6 +745,9 @@ static DWORD ParseRegionLine_Versions(TCascStorage * hs, CASC_CSV & Csv, size_t
if(hs->szRegion == NULL)
hs->szRegion = CascNewStr(Csv[nLine]["Region!STRING:0"].szValue);
+ // Get the default locale mask based on the region
+ hs->dwDefaultLocale = GetDefaultLocaleByRegion(hs->szRegion);
+
// Extract the CDN build key
dwErrCode = LoadQueryKey(Csv[nLine]["BuildConfig!HEX:16"], hs->CdnBuildKey);
if(dwErrCode != ERROR_SUCCESS)
@@ -783,6 +797,9 @@ static DWORD ParseFile_BuildDb(TCascStorage * hs, CASC_CSV & Csv)
if(dwErrCode != ERROR_SUCCESS)
return dwErrCode;
+ // Extract tags
+ hs->dwDefaultLocale = GetDefaultLocaleMask(Csv[CSV_ZERO][2]);
+
// Verify all variables
return (hs->CdnBuildKey.pbData != NULL && hs->CdnConfigKey.pbData != NULL) ? ERROR_SUCCESS : ERROR_BAD_FORMAT;
}