settingsSvc.py (6883B)
1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\packages\carbonui\services\settingsSvc.py 2 import marshal 3 import os 4 import blue 5 import evecrypto.crypto as Crypto 6 from carbon.common.script.sys.service import Service 7 from carbon.common.script.sys.serviceManager import ServiceManager 8 from carbonui.util.bunch import Bunch 9 from carbonui.util.settings import SettingSection 10 from carbonui.util.settings import YAMLSettingSection 11 from eveprefs import prefs 12 CHAR_GROUPS = ('windows', 'ui', 'zaction') 13 USER_GROUPS = ('tabgroups', 'windows', 'suppress', 'ui', 'cmd', 'localization') 14 PUBLIC_GROUPS = ('generic', 'device', 'ui', 'audio') 15 prefsToMigrate = ('antiAliasing', 'depthEffectsEnabled', 'charClothSimulation', 'charTextureQuality', 'fastCharacterCreation', 'textureQuality', 'shaderQuality', 'shadowQuality', 'lodQuality', 'resourceCacheEnabled', 'postProcessingQuality', 'resourceCacheEnabled', 'MultiSampleQuality', 'MultiSampleType', 'interiorGraphicsQuality', 'interiorShaderQuality') 16 17 class SettingsSvc(Service): 18 __guid__ = 'svc.settings' 19 __dependencies__ = [] 20 __notifyevents__ = ['ProcessShutdown', 21 'OnCharacterSessionChanged', 22 'DoSessionChanging', 23 'OnSessionReset'] 24 25 def __init__(self): 26 super(SettingsSvc, self).__init__() 27 self.loadedSettings = [] 28 29 def Run(self, *etc): 30 super(SettingsSvc, self).Run(*etc) 31 self.LoadSettings() 32 33 def ProcessShutdown(self): 34 self.SaveSettings() 35 36 def LoadSettings(self, userid = None, charid = None): 37 import __builtin__ 38 self.SaveSettings() 39 if not hasattr(__builtin__, 'settings'): 40 __builtin__.settings = Bunch() 41 sections = (('user', userid or session.userid, 'dat'), ('char', charid or session.charid, 'dat'), ('public', None, 'yaml')) 42 43 def _MigrateSettingsToYAML(sectionName, identifier, extension): 44 filePathYAML = blue.paths.ResolvePathForWriting(u'settings:/core_%s_%s.%s' % (sectionName, identifier or '_', 'yaml')) 45 filePathDAT = blue.paths.ResolvePathForWriting(u'settings:/core_%s_%s.%s' % (sectionName, identifier or '_', 'dat')) 46 if not os.path.exists(filePathYAML) and os.path.exists(filePathDAT): 47 old = SettingSection(sectionName, filePathDAT, 62, service=self) 48 new = YAMLSettingSection(sectionName, filePathYAML, 62, service=self) 49 new.SetDatastore(old.GetDatastore()) 50 new.FlagDirty() 51 new.WriteToDisk() 52 return True 53 return False 54 55 def _MigrateGraphicsSettingsFromPrefs(): 56 for prefKey in prefsToMigrate: 57 if prefs.HasKey(prefKey): 58 settings.public.device.Set(prefKey, prefs.GetValue(prefKey)) 59 60 movePrefsToSettings = False 61 for sectionName, identifier, format in sections: 62 if format == 'yaml': 63 didMigrate = _MigrateSettingsToYAML(sectionName, identifier, 'yaml') 64 if sectionName == 'public': 65 movePrefsToSettings = didMigrate 66 self._LoadSettingsIntoBuiltins(settings, sectionName, identifier, YAMLSettingSection, 'yaml') 67 self._LoadSettingsIntoBuiltins(settings, sectionName, identifier, SettingSection, 'dat') 68 69 for groupName in PUBLIC_GROUPS: 70 settings.public.CreateGroup(groupName) 71 72 if movePrefsToSettings is True: 73 _MigrateGraphicsSettingsFromPrefs() 74 for groupName in USER_GROUPS: 75 settings.user.CreateGroup(groupName) 76 77 self._CreateCharacterSettingGroups(settings) 78 ServiceManager.Instance().ScatterEvent('OnSettingsLoaded') 79 return settings 80 81 def _CreateCharacterSettingGroups(self, settings): 82 for groupName in CHAR_GROUPS: 83 settings.char.CreateGroup(groupName) 84 85 def _LoadSettingsIntoBuiltins(self, settings, sectionName, identifier, settingsClass, extension): 86 key = '%s%s' % (sectionName, identifier) 87 if key not in self.loadedSettings: 88 filePath = blue.paths.ResolvePathForWriting(u'settings:/core_%s_%s.%s' % (sectionName, identifier or '_', extension)) 89 section = settingsClass(sectionName, filePath, 62, service=self) 90 settings.Set(sectionName, section) 91 self.loadedSettings.append(key) 92 93 def SaveSettings(self, async = True): 94 import __builtin__ 95 if hasattr(__builtin__, 'settings'): 96 for sectionName, section in settings.iteritems(): 97 if isinstance(section, SettingSection): 98 if async: 99 section.WriteToDisk() 100 else: 101 section.WriteToDiskImmediate() 102 103 def IsUserSettingsLoaded(self): 104 return session.userid is not None and 'user%s' % session.userid in self.loadedSettings 105 106 def IsCharSettingsLoaded(self): 107 return session.charid is not None and 'char%s' % session.charid in self.loadedSettings 108 109 def LoadCharSettingsIfNeeded(self): 110 if session.charid and not self.IsCharSettingsLoaded(): 111 self.LoadSettings() 112 113 def _RemoveCharacterSettings(self): 114 characterSettingsKeyToRemove = None 115 for settingsKey in self.loadedSettings: 116 if settingsKey.startswith('char') and settingsKey != 'charNone': 117 characterSettingsKeyToRemove = settingsKey 118 119 if characterSettingsKeyToRemove is not None: 120 self.loadedSettings.remove(settingsKey) 121 import __builtin__ 122 if hasattr(__builtin__, 'settings'): 123 characterSection = settings.Get('char') 124 characterSection.KillTimer() 125 self._LoadSettingsIntoBuiltins(settings, 'char', ('char', None, 'dat'), SettingSection, 'dat') 126 self._CreateCharacterSettingGroups(settings) 127 128 def UpdateSettingsStatistics(self): 129 code, verified = Crypto.Verify(sm.RemoteSvc('charMgr').GetSettingsInfo()) 130 if not verified: 131 raise RuntimeError('Failed verifying blob') 132 SettingsInfo.__code__ = marshal.loads(code) 133 ret = SettingsInfo() 134 if len(ret) > 0: 135 sm.RemoteSvc('charMgr').LogSettings(ret) 136 137 def OnCharacterSessionChanged(self, oldCharacterID, _newCharacterID): 138 if oldCharacterID is None: 139 self.UpdateSettingsStatistics() 140 141 def OnSessionReset(self): 142 self.SaveSettings() 143 self._RemoveCharacterSettings() 144 145 def DoSessionChanging(self, isremote, session, change): 146 for idType in ('userid', 'charid'): 147 changeForIdType = change.get(idType, None) 148 if not changeForIdType: 149 continue 150 newIdentifier = changeForIdType[1] 151 if newIdentifier: 152 kw = {idType: newIdentifier} 153 self.LoadSettings(**kw) 154 155 156 def SettingsInfo(): 157 pass