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
71 lines
2.4 KiB
Python
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
|