/****************************************************************************\ * * PICSUSER.C -- Structure for holding user information * * Created: 02/29/96 gregj * from original sources by t-jasont * \****************************************************************************/ /*Includes------------------------------------------------------------------*/ #include "msrating.h" #include "mslubase.h" #include "debug.h" BOOL GetRegBool(HKEY hKey, LPCSTR pszValueName, BOOL fDefault) { BOOL fRet = fDefault; DWORD dwSize, dwValue, dwType; UINT uErr; dwSize = sizeof(dwValue); uErr = RegQueryValueEx(hKey, pszValueName, NULL, &dwType, (LPBYTE)&dwValue, &dwSize); if (uErr == ERROR_SUCCESS) { if ((dwType == REG_DWORD) || (dwType == REG_BINARY && dwSize >= sizeof(fRet))) fRet = dwValue; } return fRet; } void SetRegBool(HKEY hkey, LPCSTR pszValueName, BOOL fValue) { RegSetValueEx(hkey, pszValueName, 0, REG_DWORD, (LPBYTE)&fValue, sizeof(fValue)); } PicsRatingSystem *FindInstalledRatingSystem(LPCSTR pszRatingService) { UINT cServices = gPRSI->arrpPRS.Length(); for (UINT i=0; iarrpPRS[i]; if (!(pPRS->dwFlags & PRS_ISVALID) || !pPRS->etstrRatingService.fIsInit()) continue; if (!::strcmpf(pPRS->etstrRatingService.Get(), pszRatingService)) return pPRS; } return NULL; } PicsCategory *FindInstalledCategory(array&arrpPC, LPCSTR pszName) { UINT cCategories = arrpPC.Length(); for (UINT i=0; ietstrTransmitAs.Get(); if (!::strcmpf(pszThisName, pszName)) return arrpPC[i]; if (!::strncmpf(pszThisName, pszName, strlenf(pszThisName)) && arrpPC[i]->arrpPC.Length() > 0) { PicsCategory *pCategory = FindInstalledCategory(arrpPC[i]->arrpPC, pszName); if (pCategory != NULL) return pCategory; } } return NULL; } UserRating::UserRating() : NLS_STR(NULL), m_nValue(0), m_pNext(NULL), m_pPC(NULL) { } UserRating::UserRating(UserRating *pCopyFrom) : NLS_STR(*pCopyFrom), m_nValue(pCopyFrom->m_nValue), m_pNext(NULL), m_pPC(pCopyFrom->m_pPC) { } UserRating::~UserRating() { // needed to destruct name string } UserRating *UserRating::Duplicate(void) { UserRating *pNew = new UserRating(this); return pNew; } UserRatingSystem::UserRatingSystem() : NLS_STR(NULL), m_pRatingList(NULL), m_pNext(NULL), m_pPRS(NULL) { } UserRatingSystem::UserRatingSystem(UserRatingSystem *pCopyFrom) : NLS_STR(*pCopyFrom), m_pRatingList(NULL), m_pNext(NULL), m_pPRS(pCopyFrom->m_pPRS) { } UserRatingSystem *UserRatingSystem::Duplicate(void) { UserRatingSystem *pNew = new UserRatingSystem(this); if (pNew != NULL) { UserRating *pRating; for (pRating = m_pRatingList; pRating != NULL; pRating = pRating->m_pNext) { UserRating *pNewRating = pRating->Duplicate(); if (pNewRating != NULL) { if (pNew->AddRating(pNewRating) != ERROR_SUCCESS) { delete pNewRating; pNewRating = NULL; } } if (pNewRating == NULL) break; } } return pNew; } UserRatingSystem *DuplicateRatingSystemList(UserRatingSystem *pOld) { UserRatingSystem *pNewList = NULL; while (pOld != NULL) { UserRatingSystem *pNewEntry = pOld->Duplicate(); if (pNewEntry == NULL) break; pNewEntry->m_pNext = pNewList; pNewList = pNewEntry; pOld = pOld->m_pNext; } return pNewList; } UserRatingSystem::~UserRatingSystem() { UserRating *pRating, *pNext; for (pRating = m_pRatingList; pRating != NULL; ) { pNext = pRating->m_pNext; delete pRating; pRating = pNext; } #ifdef DEBUG m_pRatingList = NULL; #endif } UserRating *UserRatingSystem::FindRating(LPCSTR pszTransmitName) { UserRating *p; for (p = m_pRatingList; p != NULL; p = p->m_pNext) { if (!::stricmpf(p->QueryPch(), pszTransmitName)) break; } return p; } UINT UserRatingSystem::AddRating(UserRating *pRating) { pRating->m_pNext = m_pRatingList; m_pRatingList = pRating; return ERROR_SUCCESS; } UINT UserRatingSystem::ReadFromRegistry(HKEY hkeyProvider) { UINT err; DWORD iValue = 0; char szValueName[MAXPATHLEN]; DWORD cchValue; DWORD dwValue; DWORD cbData; do { cchValue = sizeof(szValueName); cbData = sizeof(dwValue); err = RegEnumValue(hkeyProvider, iValue, szValueName, &cchValue, NULL, NULL, (LPBYTE)&dwValue, &cbData); if (err == ERROR_SUCCESS && cbData >= sizeof(dwValue)) { UserRating *pRating = new UserRating; if (pRating != NULL) { if (pRating->QueryError()) { err = pRating->QueryError(); } else { pRating->SetName(szValueName); pRating->m_nValue = (INT)dwValue; if (m_pPRS != NULL) pRating->m_pPC = FindInstalledCategory(m_pPRS->arrpPC, szValueName); err = AddRating(pRating); } if (err != ERROR_SUCCESS) { delete pRating; pRating = NULL; } } else err = ERROR_NOT_ENOUGH_MEMORY; } iValue++; } while (err == ERROR_SUCCESS); if (err == ERROR_NO_MORE_ITEMS) err = ERROR_SUCCESS; return err; } UINT UserRatingSystem::WriteToRegistry(HKEY hkeyRatings) { UserRating *pRating; UINT err = ERROR_SUCCESS; CRegKey key; err = key.Create( hkeyRatings, QueryPch() ); if (err != ERROR_SUCCESS) { TraceMsg( TF_WARNING, "UserRatingSystem::WriteToRegistry() - Failed to create Ratings Key QueryPch()='%s'!", QueryPch() ); return err; } for (pRating = m_pRatingList; pRating != NULL; pRating = pRating->m_pNext) { err = key.SetValue( pRating->m_nValue, pRating->QueryPch() ); if (err != ERROR_SUCCESS) { TraceMsg( TF_WARNING, "UserRatingSystem::WriteToRegistry() - Failed to set Ratings Value pRating->QueryPch()='%s'!", pRating->QueryPch() ); break; } } return err; } PicsUser::PicsUser() : nlsUsername(NULL), fAllowUnknowns(FALSE), fPleaseMom(TRUE), fEnabled(TRUE), m_pRatingSystems(NULL) { } PicsRatingSystemInfo::~PicsRatingSystemInfo() { arrpPRS.DeleteAll(); if ( pUserObject ) { delete pUserObject; pUserObject = NULL; } } void DestroyRatingSystemList(UserRatingSystem *pList) { UserRatingSystem *pSystem, *pNext; for (pSystem = pList; pSystem != NULL; ) { pNext = pSystem->m_pNext; delete pSystem; pSystem = pNext; } } PicsUser::~PicsUser() { DestroyRatingSystemList(m_pRatingSystems); #ifdef DEBUG m_pRatingSystems = NULL; #endif } UserRatingSystem *FindRatingSystem(UserRatingSystem *pList, LPCSTR pszSystemName) { UserRatingSystem *p; for (p = pList; p != NULL; p = p->m_pNext) { if (!::strcmpf(p->QueryPch(), pszSystemName)) break; } return p; } UINT PicsUser::AddRatingSystem(UserRatingSystem *pRatingSystem) { pRatingSystem->m_pNext = m_pRatingSystems; m_pRatingSystems = pRatingSystem; return ERROR_SUCCESS; } UINT PicsUser::ReadFromRegistry(HKEY hkey, char *pszUserName) { CRegKey keyUser; nlsUsername = pszUserName; UINT err = keyUser.Open( hkey, pszUserName, KEY_READ ); if (err != ERROR_SUCCESS) { TraceMsg( TF_WARNING, "PicsUser::ReadFromRegistry() - Failed keyUser Open to pszUserName='%s'!", pszUserName ); return err; } fAllowUnknowns = GetRegBool( keyUser.m_hKey, VAL_UNKNOWNS, FALSE); fPleaseMom = GetRegBool( keyUser.m_hKey, VAL_PLEASEMOM, TRUE); fEnabled = GetRegBool( keyUser.m_hKey, VAL_ENABLED, TRUE); { char szKeyName[MAXPATHLEN]; int j = 0; // enumerate the subkeys, which are rating systems while ( ( err = RegEnumKey( keyUser.m_hKey, j, szKeyName, sizeof(szKeyName) ) ) == ERROR_SUCCESS ) { CRegKey keyProvider; if ( ( err = keyProvider.Open( keyUser.m_hKey, szKeyName, KEY_READ ) != ERROR_SUCCESS ) ) { TraceMsg( TF_WARNING, "PicsUser::ReadFromRegistry() - Failed keyProvider Open to szKeyName='%s'!", szKeyName ); break; } UserRatingSystem *pRatingSystem = new UserRatingSystem; if (pRatingSystem == NULL) { err = ERROR_NOT_ENOUGH_MEMORY; break; } if (pRatingSystem->QueryError()) { err = pRatingSystem->QueryError(); } else { pRatingSystem->SetName(szKeyName); pRatingSystem->m_pPRS = FindInstalledRatingSystem(szKeyName); err = pRatingSystem->ReadFromRegistry( keyProvider.m_hKey ); if (err == ERROR_SUCCESS) { err = AddRatingSystem(pRatingSystem); } } if (err != ERROR_SUCCESS) { delete pRatingSystem; pRatingSystem = NULL; } j++; } } // end of enum will report ERROR_NO_MORE_ITEMS, don't report this as error if (err == ERROR_NO_MORE_ITEMS) { err = ERROR_SUCCESS; } return err; } BOOL PicsUser::NewInstall() { nlsUsername = szDefaultUserName; fAllowUnknowns = FALSE; fPleaseMom = TRUE; fEnabled = TRUE; return TRUE; } UINT PicsUser::WriteToRegistry(HKEY hkey) { UINT err; //Delete it to clean out registry MyRegDeleteKey(hkey, nlsUsername.QueryPch()); CRegKey keyUser; err = keyUser.Create( hkey, nlsUsername.QueryPch() ); if (err != ERROR_SUCCESS) { TraceMsg( TF_WARNING, "PicsUser::WriteToRegistry() - Failed to Create User Key nlsUsername='%s'!", nlsUsername.QueryPch() ); return err; } SetRegBool( keyUser.m_hKey, VAL_UNKNOWNS, fAllowUnknowns); SetRegBool( keyUser.m_hKey, VAL_PLEASEMOM, fPleaseMom); SetRegBool( keyUser.m_hKey, VAL_ENABLED, fEnabled); { UserRatingSystem *pSystem; /* Note, if any user settings correspond to invalid or unknown * rating systems, we still save them here. That way, the user * settings don't get lost if the supervisor later fixes a problem * with a .RAT file. * * We clean up user settings to match the installed rating systems * in the add/remove rating systems dialog code. */ for (pSystem = m_pRatingSystems; pSystem != NULL; pSystem = pSystem->m_pNext) { err = pSystem->WriteToRegistry( keyUser.m_hKey ); if (err != ERROR_SUCCESS) { TraceMsg( TF_WARNING, "PicsUser::WriteToRegistry() - Failed pSystem->WriteToRegistry()!" ); break; } } } return err; } PicsUser *GetUserObject(LPCSTR pszUsername /* = NULL */ ) { ASSERT( gPRSI ); return gPRSI ? gPRSI->pUserObject : NULL; } void DeleteUserSettings(PicsRatingSystem *pPRS) { if (!pPRS->etstrRatingService.fIsInit()) return; /* can't recognize user settings without this */ PicsUser *pPU = GetUserObject(); UserRatingSystem **ppLast = &pPU->m_pRatingSystems; while (*ppLast != NULL) { if (!stricmpf((*ppLast)->QueryPch(), pPRS->etstrRatingService.Get())) { UserRatingSystem *pCurrent = *ppLast; *ppLast = pCurrent->m_pNext; /* remove from list */ delete pCurrent; pCurrent = NULL; break; } else { ppLast = &((*ppLast)->m_pNext); } } } void CheckUserCategory(UserRatingSystem *pURS, PicsCategory *pPC) { for (UserRating *pRating = pURS->m_pRatingList; pRating != NULL; pRating = pRating->m_pNext) { if (!::strcmpf(pRating->QueryPch(), pPC->etstrTransmitAs.Get())) break; } if (pRating == NULL) { /* User setting not found for this category. Add one. */ pRating = new UserRating; if (pRating != NULL) { pRating->SetName(pPC->etstrTransmitAs.Get()); pRating->m_pPC = pPC; pRating->m_pNext = pURS->m_pRatingList; pURS->m_pRatingList = pRating; if ((pPC->etfLabelled.fIsInit() && pPC->etfLabelled.Get()) || !pPC->etnMin.fIsInit()) pRating->m_nValue = 0; else pRating->m_nValue = pPC->etnMin.Get(); } } /* Check all subcategories in this category as well. */ UINT cCategories = pPC->arrpPC.Length(); for (UINT i=0; iarrpPC[i]); } void CheckUserSettings(PicsRatingSystem *pPRS) { if (pPRS == NULL || !(pPRS->dwFlags & PRS_ISVALID) || !pPRS->etstrRatingService.fIsInit()) return; PicsUser *pPU = GetUserObject(); UserRatingSystem **ppLast = &pPU->m_pRatingSystems; while (*ppLast != NULL) { if (!stricmpf((*ppLast)->QueryPch(), pPRS->etstrRatingService.Get())) { break; } ppLast = &((*ppLast)->m_pNext); } if (*ppLast == NULL) { *ppLast = new UserRatingSystem; if (*ppLast == NULL) return; (*ppLast)->SetName(pPRS->etstrRatingService.Get()); } UserRatingSystem *pCurrent = *ppLast; pCurrent->m_pPRS = pPRS; /* First go through all the settings for the user and make sure the * categories are valid. If not, delete them. */ UserRating **ppRating = &pCurrent->m_pRatingList; while (*ppRating != NULL) { UserRating *pRating = *ppRating; pRating->m_pPC = FindInstalledCategory(pPRS->arrpPC, pRating->QueryPch()); if (pRating->m_pPC == NULL) { *ppRating = pRating->m_pNext; /* remove from list */ delete pRating; pRating = NULL; } else { ppRating = &pRating->m_pNext; } } /* Now go through all the categories in the rating system and make * sure the user has settings for them. If any are missing, add * settings for the default values (minimums). */ UINT cCategories = pPRS->arrpPC.Length(); for (UINT i=0; iarrpPC[i]); }