############################################################################# ## This file is part of the Ostendo Resource Manager. ## ##-------------------------------------------------------------------------## ## Copyright 2007-2008 Bryce Schroeder ## ## bryce.schroeder@gmail.com ## ## http://www.ferazelhosting.net/~bryce/ ## ##-------------------------------------------------------------------------## ## This program is free software: you can redistribute it and/or modify ## ## it under the terms of the GNU General Public License as published by ## ## the Free Software Foundation, either version 3 of the License, or ## ## (at your option) any later version. ## ## This program is distributed in the hope that it will be useful, ## ## but WITHOUT ANY WARRANTY; without even the implied warranty of ## ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ## ## GNU General Public License for more details. ## ## You should have received a copy of the GNU General Public License ## ## along with this program. If not, see . ## ############################################################################# from .g import g # This file contains the directory of standard interpreters. # don't add interpreters to it directly. # this is the list of canonical types. import error from . import util from .util import D from copy import copy ERROR_DOMAIN = "Resource Manager" ERROR_INDENT = 2 # all of the headers are followed by a parameter line, # which is a python tuple prefixed by a length byte. HEADER_LOAD = "~OSTENDO-01 LOAD\n" # (server name, pack name, number of restypes) HEADER_RESTYPE = "\n\n~OSTENDO-01 RESTYPE\n" # (typename, number of resources of this type) HEADER_RESOURCE = "\n\n~OSTENDO-01 RESOURCE\n" # parameters: (part count, name) HEADER_PART = "\n\n~OSTENDO-01 PART\n" # (part name, part length) e = error.Error_Messenger(ERROR_DOMAIN,ERROR_INDENT) class R: """Resource reference""" def __init__(self, type, name, func=(lambda x: x)): self.type = type self.name = name self.func = func def resolve(self, resman): return self.func(resman.get(self.type, self.name)) class Resource(object): """This class is the base class for a resource interpreter. it gets a list of strings and presents them however it likes. The list data is of the form [(data,part-name), ...]""" MANDATORY = [] CONSTANTS = {} __OSTENDO_RESOURCE__ = True #OPTIONAL = [] def __init__(self, manager, type, name, data_list): self.manager = manager self.name = name self.type = type self.parts = {} for data, part in data_list: self.parts[part] = data for needed in self.MANDATORY: if not self.parts.has_key(needed): e.err("(%s:'%s') is missing required part '%s'."%( self.type,self.name,needed)) self.init() def resolve(self, dict = None): """This function is called after all resources are loaded.""" if not dict: dict = self.__dict__ for k,v in dict.items(): if isinstance(v, R): dict[k] = v.resolve(self.manager) if self.__dict__.has_key('meta'): for k,v in self.meta.items(): if isinstance(v,R): self.meta[k] = v.resolve(self.manager) if dict is self.__dict__: self.user_resolve() def user_resolve(self): return def open(self, part=None): if part: return cStringIO.StringIO(self.parts[part]) else: return cStringIO.StringIO(self.parts.values()[0]) def parts(self): return self.parts.keys() def write_out(self, file): file.write(HEADER_RESOURCE) parameters = "(%d, '%s')\n"%(len(self.parts), self.name) file.write(chr(len(parameters))+parameters) for partname, part in self.parts.items(): file.write(HEADER_PART) parameters = "('%s', %d)\n"%(partname, len(part)) file.write(chr(len(parameters))+parameters) file.write(part) def process_meta(self, data): """Process standard-format Ostendo meta-data.""" tdict = copy(self.CONSTANTS) exec(data, globals(), tdict) return tdict def integrate_dict(self, mydict): for k,v in mydict.items(): self.__dict__[k] = v def get_meta(self,key): return self.meta[key] def __getitem__(self, key): if self.meta.has_key(key): return self.meta[key] else: return None def integrate(self): pass def init(self): pass import glob, os.path CANON = {} if __name__ == 'standard_interpreters': import standard_interpreters path = os.path.split(standard_interpreters.__file__)[0] types = glob.glob(os.path.join(path, '*.py')) for item in types: item = os.path.splitext(os.path.split(item)[1])[0] if item == '__init__': continue _mod = __import__('standard_interpreters.' + item, fromlist=[item]) if hasattr(_mod, item): CANON[item] = getattr(_mod, item) print "\t * Standard Resource Interpreter Classes:" for item in CANON: print "\t\t%s"%item