-
Notifications
You must be signed in to change notification settings - Fork 57
Expand file tree
/
Copy pathAddressManager.py
More file actions
49 lines (40 loc) · 1.69 KB
/
AddressManager.py
File metadata and controls
49 lines (40 loc) · 1.69 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
import inspect
import os
from . import FFxiv_Version
from .Storage import ModuleStorage, BASE_PATH
from .memory import BASE_ADDR
from .Logger import Logger
_logger = Logger("AddressManager")
_storage = ModuleStorage(BASE_PATH / "Address")
_storage.data = dict()
_storage.save()
force_search = bool(os.environ['address_search'])
class AddressSearchError(Exception):
def __init__(self, name):
msg = "searching address of [%s] is failed" % name
_logger.error(msg)
super(AddressSearchError, self).__init__(msg)
class AddressManager(object):
def __init__(self, storage=None, logger=None):
self.storage = storage.setdefault(FFxiv_Version, dict()) if storage is not None else None
self.logger = logger or _logger
def get(self, name, call, param, add=0, **kwargs):
frame = inspect.stack()[1]
_storage.data.setdefault('prev', list()).append([f"{frame.filename}:{frame.lineno}", name, param])
if self.storage is not None and name in self.storage and not force_search:
offset = self.storage[name]
addr = offset + BASE_ADDR
msg = "address load [{addr}] [+{offset}] \"{name}\""
else:
addr = call(param, **kwargs)
if addr is None:
raise AddressSearchError(name)
addr += add
offset = addr - BASE_ADDR
if self.storage is not None:
self.storage[name] = offset
msg = "address found [{addr}] [+{offset}] \"{name}\""
_storage.data.setdefault(FFxiv_Version, dict())[name] = offset
_storage.save()
self.logger.debug(msg.format(name=name, addr=hex(addr), offset=hex(offset)))
return addr