// Set resource item bool CLngRc::SetResource(MArray<LngRcItem>& arr, int idx, LPCWSTR asValue, bool bLocalized) { if (idx < 0) { _ASSERTE(idx >= 0); return false; } _ASSERTE(!bLocalized || (asValue && *asValue)); if (idx >= arr.size()) { LngRcItem dummy = {}; arr.set_at(idx, dummy); } bool bOk = false; LngRcItem& item = arr[idx]; // Caching: no resource was found for that id if (!asValue || !*asValue) { if (item.Str) item.Str[0] = 0; item.Processed = true; item.Localized = false; return true; } size_t iLen = wcslen(asValue); if (iLen >= (u16)-1) { // Too long string? _ASSERTE(iLen < (u16)-1); } else { if (item.Str && (item.MaxLen >= iLen)) { _wcscpy_c(item.Str, item.MaxLen, asValue); } else { //TODO: thread-safe SafeFree(item.Str); item.MaxLen = iLen; item.Str = lstrdup(asValue); } bOk = (item.Str != NULL); } item.Processed = bOk; item.Localized = (bOk && bLocalized); return bOk; }