Advertisement
Tyler_Elric

Untitled

May 28th, 2012
97
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.60 KB | None | 0 0
  1. # coding: utf-8
  2. # Offset collection
  3. # V2.0
  4. # By Full Metal
  5. # Feel free to use and redistribute
  6.  
  7. from time import time
  8. from os import listdir,path
  9. import threading
  10. import bottle
  11. import json
  12. from bottle import route, run, template, static_file, redirect, request
  13.  
  14. class DirectoryLoader:
  15.  
  16. refresh_rate=1.0
  17.  
  18. def __init__(self,directory,hook=None):
  19. self.hook=hook
  20. self.items,self.dir,self.update_timer=[],directory,None
  21. self.update()
  22.  
  23. def __enter__(self):return self
  24.  
  25. def update(self):
  26. #print("Directory loader update")
  27. items=[a for a in listdir(self.dir)]
  28. if self.hook:
  29. objs=[a for a in items if a not in self.items]
  30. if len(objs)>0:threading.Thread(target=self.hook,args=objs).start()
  31. self.items=items[:]
  32. self.update_timer=threading.Timer(self.refresh_rate,self.update)
  33. self.update_timer.start()
  34.  
  35. def list(self):return self.items
  36.  
  37. def __exit__(self, type, value, traceback):
  38. if self.update_timer:self.update_timer.cancel()
  39.  
  40. class Database:
  41.  
  42. refresh_rate=1.0 #Update loaded data twice per minute ( on request )
  43.  
  44. def __init__(self,dir_watch):
  45. self.dir=dir_watch
  46. self.objects={}
  47. self.directory=DirectoryLoader(self.dir,self.add_files)
  48. self.update()
  49.  
  50. def __enter__(self):return self
  51.  
  52. def update_file(self,fn):
  53. obj=self.objects[fn]
  54. fn=path.join(self.dir,fn)
  55. last_modified=path.getmtime(fn)
  56. if obj['mod']<last_modified or obj['obj'] is None:
  57. print(fn)
  58. obj['mod']=last_modified#If it fails, then don't try it again until it updates.
  59. try:
  60. obj['obj']=json.load(open(fn))
  61. print(obj['obj'])
  62. except:pass
  63.  
  64. def add_files(self,*files):
  65. for fn in files:
  66. self.objects[fn]={'obj':None,'mod':-1}
  67. self.update_file(fn)
  68.  
  69. def update(self):
  70. print("DBUPDATE")
  71. for fn in list(self.objects.keys()):self.update_file(fn)
  72. self.update_timer=threading.Timer(self.refresh_rate,self.update)
  73. self.update_timer.start()
  74.  
  75. def __exit__(self, type, value, traceback):
  76. if self.update_timer:self.update_timer.cancel()
  77.  
  78. def parse_number(v):
  79. if isinstance(v,str):
  80. base_prefix={'0x':16,'&h':16,'&b':2,'&o':8,'&d':10}
  81. if v[:2] in base_prefix.keys():return int(v[2:],base_prefix[v[:2]])
  82. return int(v)
  83. else:return v
  84.  
  85. def tag_list(t):
  86. if isinstance(t,str):return t.lower().split(' ')
  87. else: return t or []
  88.  
  89. def Rom(name,desc,shortname,tags):
  90. assert isinstance(name,str), isinstance(desc,str)
  91. return {'name':name,'desc':desc,'short':shortname,'tags':tag_list(tags),'offsets':[]}
  92.  
  93. def Offset(n,o,l,t,tags):
  94. assert isinstance(n,str), isinstance(desc,str)
  95. return {'name':n,'offset':parse_number(o),'size':parse_number(l),'tags':tag_list(tags),'type':t}
  96.  
  97. if __name__=="__main__":
  98. with Database('data') as db:pass
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement