Files
Hippolyzer/hippolyzer/lib/proxy/viewer_settings.py
Salad Dais 2608a02d5c Use viewer's object cache to better handle ObjectUpdateCached hits
Without this we end up in weird cases where the viewer gets a cache
hit and never request the object data, creating link heirarchies where
the viewer knows about all the prims but Hippolyzer only knows some
of them and orphans them.

Since we don't know what viewer the user is using, we scan around
the disk for object caches and try to use those. 99% of the time the
connection will be coming from localhost so this is fine.

Fixes #11
2021-05-28 02:18:20 +00:00

71 lines
2.4 KiB
Python

import itertools
import sys
from pathlib import Path
from hippolyzer.lib.base import llsd
def iter_viewer_data_dirs():
if sys.platform.startswith("linux"):
paths = (x for x in Path.home().iterdir() if x.name.startswith("."))
elif sys.platform == "darwin":
paths = (Path.home() / "Library" / "Application Support").iterdir()
elif sys.platform in ("win32", "msys", "cygwin"):
app_data = Path.home() / "AppData"
# On Windows the cache directory is in Local, the settings are in Roaming. I think.
paths = itertools.chain((app_data / "Local").iterdir(), (app_data / "Roaming").iterdir())
else:
raise Exception("Unknown OS, can't locate viewer config dirs!")
for path in paths:
if not path.is_dir():
continue
if not has_settings_file(path) and not has_cache_file(path):
continue
yield path
def has_cache_file(path: Path):
try:
return (path / "avatar_name_cache.xml").exists()
except PermissionError:
return False
def has_settings_file(path: Path):
try:
return (path / "user_settings" / "settings.xml").exists()
except PermissionError:
return False
def iter_viewer_config_dirs():
for viewer_dir in iter_viewer_data_dirs():
if has_settings_file(viewer_dir):
yield viewer_dir
def iter_viewer_cache_dirs():
for viewer_dir in iter_viewer_data_dirs():
# Is this a settings dir
if has_settings_file(viewer_dir):
# Users can choose custom locations for the cache directory, we need to parse
# their settings to see if they've done so.
with open(viewer_dir / "user_settings" / "settings.xml", "rb") as fh:
config: dict = llsd.parse_xml(fh.read())
# TODO: is this the case on all platforms?
cache_location = None
cache_elem = config.get("CacheLocation")
if cache_elem:
cache_location = cache_elem.get("Value")
if cache_location:
cache_location = Path(cache_location)
if has_cache_file(cache_location):
yield cache_location
# Cache may be in the base dir on Windows
if has_cache_file(viewer_dir):
yield viewer_dir
# but it might also be in a subfolder
if has_cache_file(viewer_dir / "cache"):
yield viewer_dir