You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
176 lines
6.4 KiB
176 lines
6.4 KiB
//========= Copyright Valve Corporation, All rights reserved. ============// |
|
// |
|
// Purpose: |
|
// |
|
// $NoKeywords: $ |
|
//=============================================================================// |
|
|
|
#include "cbase.h" |
|
|
|
#include "tf_notification.h" |
|
#include "gcsdk/enumutils.h" |
|
#include "schemainitutils.h" |
|
// memdbgon must be the last include file in a .cpp file!!! |
|
#ifdef GC |
|
IMPLEMENT_CLASS_MEMPOOL( CTFNotification, 1000, UTLMEMORYPOOL_GROW_SLOW ); |
|
#endif |
|
|
|
#include "tier0/memdbgon.h" |
|
|
|
using namespace GCSDK; |
|
|
|
#ifdef GC |
|
// See LOCALIZED NOTIFICATIONS note in header |
|
static bool BIsLocalizedNotificationType( CMsgGCNotification_NotificationType eType ) |
|
{ |
|
switch ( eType ) |
|
{ |
|
case CMsgGCNotification_NotificationType_NOTIFICATION_SUPPORT_MESSAGE: |
|
return true; |
|
case CMsgGCNotification_NotificationType_NOTIFICATION_REPORTED_PLAYER_BANNED: |
|
case CMsgGCNotification_NotificationType_NOTIFICATION_CUSTOM_STRING: |
|
case CMsgGCNotification_NotificationType_NOTIFICATION_MM_BAN_DUE_TO_EXCESSIVE_REPORTS: |
|
case CMsgGCNotification_NotificationType_NOTIFICATION_REPORTED_PLAYER_WAS_BANNED: |
|
case CMsgGCNotification_NotificationType_NOTIFICATION_NUM_TYPES: |
|
return false; |
|
default: |
|
Assert( !"Unknown notification type" ); |
|
return false; |
|
} |
|
} |
|
|
|
CTFNotification::CTFNotification() |
|
: m_eLocalizedToLanguage( k_Lang_None ) |
|
{ |
|
Obj().set_notification_id( 0 ); |
|
Obj().set_account_id( 0 ); |
|
Obj().set_expiration_time( 0 ); |
|
Obj().set_type( CMsgGCNotification_NotificationType_NOTIFICATION_NUM_TYPES ); // Invalid |
|
Obj().set_notification_string( "" ); |
|
} |
|
|
|
CTFNotification::CTFNotification( CMsgGCNotification msg, const char *pUnlocalizedString, ELanguage eLang ) |
|
: m_eLocalizedToLanguage( k_Lang_None ) |
|
{ |
|
Obj() = msg; |
|
|
|
if ( BIsLocalizedNotificationType( Obj().type() ) ) |
|
{ |
|
m_strUnlocalizedString = pUnlocalizedString; |
|
BLocalize( eLang ); |
|
} |
|
else |
|
{ |
|
Obj().set_notification_string( pUnlocalizedString ); |
|
} |
|
} |
|
|
|
bool CTFNotification::BLocalize( ELanguage eLang ) |
|
{ |
|
if ( !BIsLocalizedNotificationType( Obj().type() ) || eLang == m_eLocalizedToLanguage ) |
|
{ |
|
return false; |
|
} |
|
|
|
m_eLocalizedToLanguage = eLang; |
|
const char *pLocalized = GGCGameBase()->LocalizeToken( m_strUnlocalizedString.Get(), eLang, false ); |
|
|
|
// Try english fallback |
|
const ELanguage eFallback = k_Lang_English; |
|
if ( !pLocalized && eLang != eFallback ) |
|
{ |
|
pLocalized = GGCGameBase()->LocalizeToken( m_strUnlocalizedString.Get(), eFallback, false ); |
|
if ( pLocalized ) |
|
{ |
|
EmitError( SPEW_GC, |
|
"Notification has localized token \"%s\" that is not available in language %s, falling back to %s.\n", |
|
m_strUnlocalizedString.Get(), GetLanguageShortName( eLang ), GetLanguageShortName( eFallback ) ); |
|
} |
|
} |
|
|
|
if ( !pLocalized ) |
|
{ |
|
EmitError( SPEW_GC, "Notification has localized token \"%s\" that was not found in primary language %s *or* fallback to %s.\n", |
|
m_strUnlocalizedString.Get(), GetLanguageShortName( eLang ), GetLanguageShortName( eFallback ) ); |
|
pLocalized = m_strUnlocalizedString.Get(); |
|
} |
|
|
|
Obj().set_notification_string( pLocalized ? pLocalized : m_strUnlocalizedString.Get() ); |
|
|
|
return true; |
|
} |
|
|
|
bool CTFNotification::BYieldingAddInsertToTransaction( GCSDK::CSQLAccess & sqlAccess ) |
|
{ |
|
CSchNotification schNotification; |
|
WriteToRecord( &schNotification ); |
|
return CSchemaSharedObjectHelper::BYieldingAddInsertToTransaction( sqlAccess, &schNotification ); |
|
} |
|
|
|
bool CTFNotification::BYieldingAddWriteToTransaction( GCSDK::CSQLAccess & sqlAccess, const CUtlVector< int > &fields ) |
|
{ |
|
CSchNotification schNotification; |
|
WriteToRecord( &schNotification ); |
|
CColumnSet csDatabaseDirty( schNotification.GetPSchema()->GetRecordInfo() ); |
|
csDatabaseDirty.MakeEmpty(); |
|
FOR_EACH_VEC( fields, nField ) |
|
{ |
|
switch ( fields[nField] ) |
|
{ |
|
case CMsgGCNotification::kNotificationIdFieldNumber : csDatabaseDirty.BAddColumn( CSchNotification::k_iField_ulNotificationID ); break; |
|
case CMsgGCNotification::kAccountIdFieldNumber : csDatabaseDirty.BAddColumn( CSchNotification::k_iField_unAccountID ); break; |
|
case CMsgGCNotification::kExpirationTimeFieldNumber : csDatabaseDirty.BAddColumn( CSchNotification::k_iField_RTime32Expiration ); break; |
|
case CMsgGCNotification::kTypeFieldNumber : csDatabaseDirty.BAddColumn( CSchNotification::k_iField_unNotificationType ); break; |
|
case CMsgGCNotification::kNotificationStringFieldNumber : csDatabaseDirty.BAddColumn( CSchNotification::k_iField_VarCharData ); break; |
|
default: |
|
Assert( false ); |
|
} |
|
} |
|
return CSchemaSharedObjectHelper::BYieldingAddWriteToTransaction( sqlAccess, &schNotification, csDatabaseDirty ); |
|
} |
|
|
|
bool CTFNotification::BYieldingAddRemoveToTransaction( GCSDK::CSQLAccess & sqlAccess ) |
|
{ |
|
CSchNotification schNotification; |
|
WriteToRecord( &schNotification ); |
|
return CSchemaSharedObjectHelper::BYieldingAddRemoveToTransaction( sqlAccess, &schNotification ); |
|
} |
|
|
|
void CTFNotification::WriteToRecord( CSchNotification *pNotification ) const |
|
{ |
|
// Important: For localized notifications, the DB value is the localization key (#TF_Some_Thing), but the in-memory |
|
// shared object value is localized. See LOCALIZED NOTIFICATIONS note in header. |
|
pNotification->m_ulNotificationID = Obj().notification_id(); |
|
pNotification->m_unAccountID = Obj().account_id(); |
|
pNotification->m_RTime32Expiration = Obj().expiration_time(); |
|
pNotification->m_unNotificationType = Obj().type(); |
|
if ( BIsLocalizedNotificationType( Obj().type() ) ) |
|
{ |
|
WRITE_VAR_CHAR_FIELD_TRUNC( *pNotification, VarCharData, m_strUnlocalizedString.Get() ); |
|
} |
|
else |
|
{ |
|
WRITE_VAR_CHAR_FIELD_TRUNC( *pNotification, VarCharData, Obj().notification_string().c_str() ); |
|
} |
|
} |
|
|
|
void CTFNotification::ReadFromRecord( const CSchNotification & schNotification ) |
|
{ |
|
// Important: For localized notifications, the DB value is the localization key (#TF_Some_Thing), but the in-memory |
|
// shared object value is localized. See LOCALIZED NOTIFICATIONS note in header. |
|
m_strUnlocalizedString.Clear(); |
|
m_eLocalizedToLanguage = k_Lang_None; |
|
|
|
Obj().set_notification_id( schNotification.m_ulNotificationID ); |
|
Obj().set_account_id( schNotification.m_unAccountID ); |
|
Obj().set_expiration_time( schNotification.m_RTime32Expiration ); |
|
Obj().set_type( ( CMsgGCNotification::NotificationType ) schNotification.m_unNotificationType ); |
|
const char *pchNotificationString = READ_VAR_CHAR_FIELD( schNotification, m_VarCharData ); |
|
Obj().set_notification_string( pchNotificationString ); |
|
if ( BIsLocalizedNotificationType( Obj().type() ) ) |
|
{ |
|
m_strUnlocalizedString = pchNotificationString; |
|
} |
|
} |
|
|
|
#endif
|
|
|