示例#1
0
    def search(self, start, max):
        """run searching Web"""
        engine = self.getEngine()

        result = {}
        rank = 1
        if engine == "tsubaki":
            url = self.getResultURI(start, max)
            if self.is_available_caching():
                xmlstr = self.runCacheFunc(url)
                doc = ElementTree(fromstring(xmlstr))
            else:
                fd = file(url, "rb")
                doc = ElementTree(file=fd)
            for e in doc.findall("//Result"):
                tmp = {
                    "title":
                    e.find("Title").text,
                    "url":
                    e.find("Url").text,
                    "snippet":
                    e.find("Snippet").text,
                    "cache":
                    "http://tsubaki.ixnlp.nii.ac.jp/api.cgi?id=" +
                    e.attrib["Id"] + "&format=html"
                }
                result[rank] = tmp
                rank += 1

        return result
示例#2
0
	def search(self, start, max):
		"""run searching Web"""
		engine = self.getEngine()
		
		result = {}
		rank = 1
		if engine == "tsubaki":
			url = self.getResultURI(start, max)
			if self.is_available_caching():
				xmlstr = self.runCacheFunc(url)
				doc = ElementTree(fromstring(xmlstr))
			else:
				fd = file(url, "rb")
				doc = ElementTree(file=fd)
			for e in doc.findall("//Result"):
				tmp = {"title":e.find("Title").text, "url":e.find("Url").text, "snippet":e.find("Snippet").text, "cache":"http://tsubaki.ixnlp.nii.ac.jp/api.cgi?id=" + e.attrib["Id"] + "&format=html"}
				result[rank] = tmp
				rank += 1

		return result
class ConfigXmlWriter:
    def __init__(self, createNew):

        Logutil.log('init ConfigXmlWriter', util.LOG_LEVEL_INFO)

        self.createNew = createNew

        if (createNew):
            configFile = os.path.join(util.getAddonInstallPath(), 'resources',
                                      'database', 'config_template.xml')
        else:
            configFile = util.getConfigXmlPath()

        if (not os.path.isfile(configFile)):
            Logutil.log(
                'File config.xml does not exist. Place a valid config file here: '
                + str(configFile), util.LOG_LEVEL_ERROR)
            return False, util.localize(35003)

        self.tree = ElementTree().parse(configFile)

    def writeRomCollections(self, romCollections, isEdit):

        Logutil.log('write Rom Collections', util.LOG_LEVEL_INFO)

        romCollectionsXml = self.tree.find('RomCollections')

        #HACK: remove all Rom Collections and create new
        if (isEdit):
            for romCollectionXml in romCollectionsXml.findall('RomCollection'):
                romCollectionsXml.remove(romCollectionXml)

        for romCollection in romCollections.values():

            Logutil.log('write Rom Collection: ' + str(romCollection.name),
                        util.LOG_LEVEL_INFO)

            romCollectionXml = SubElement(romCollectionsXml, 'RomCollection', {
                'id': str(romCollection.id),
                'name': romCollection.name
            })
            SubElement(romCollectionXml, 'useBuiltinEmulator').text = str(
                romCollection.useBuiltinEmulator)
            SubElement(romCollectionXml,
                       'gameclient').text = romCollection.gameclient
            SubElement(romCollectionXml,
                       'emulatorCmd').text = romCollection.emulatorCmd
            SubElement(romCollectionXml,
                       'emulatorParams').text = romCollection.emulatorParams

            for romPath in romCollection.romPaths:
                SubElement(romCollectionXml, 'romPath').text = romPath

            SubElement(romCollectionXml,
                       'saveStatePath').text = romCollection.saveStatePath
            SubElement(romCollectionXml,
                       'saveStateParams').text = romCollection.saveStateParams

            for mediaPath in romCollection.mediaPaths:

                success, message = self.searchConfigObjects(
                    'FileTypes/FileType', mediaPath.fileType.name, 'FileType')
                if (not success):
                    return False, message

                SubElement(romCollectionXml, 'mediaPath', {
                    'type': mediaPath.fileType.name
                }).text = mediaPath.path

            SubElement(romCollectionXml, 'preCmd').text = romCollection.preCmd
            SubElement(romCollectionXml,
                       'postCmd').text = romCollection.postCmd
            SubElement(romCollectionXml,
                       'useEmuSolo').text = str(romCollection.useEmuSolo)
            SubElement(romCollectionXml,
                       'usePopen').text = str(romCollection.usePopen)
            SubElement(romCollectionXml,
                       'ignoreOnScan').text = str(romCollection.ignoreOnScan)
            SubElement(romCollectionXml,
                       'allowUpdate').text = str(romCollection.allowUpdate)
            SubElement(romCollectionXml, 'autoplayVideoMain').text = str(
                romCollection.autoplayVideoMain)
            SubElement(romCollectionXml, 'autoplayVideoInfo').text = str(
                romCollection.autoplayVideoInfo)
            SubElement(romCollectionXml, 'useFoldernameAsGamename').text = str(
                romCollection.useFoldernameAsGamename)
            SubElement(romCollectionXml, 'maxFolderDepth').text = str(
                romCollection.maxFolderDepth)
            SubElement(romCollectionXml, 'doNotExtractZipFiles').text = str(
                romCollection.doNotExtractZipFiles)
            SubElement(romCollectionXml,
                       'diskPrefix').text = str(romCollection.diskPrefix)

            if (os.environ.get("OS", "xbox") == "xbox"):
                SubElement(romCollectionXml, 'xboxCreateShortcut').text = str(
                    romCollection.xboxCreateShortcut)
                SubElement(romCollectionXml,
                           'xboxCreateShortcutAddRomfile').text = str(
                               romCollection.xboxCreateShortcutAddRomfile)
                SubElement(
                    romCollectionXml,
                    'xboxCreateShortcutUseShortGamename').text = str(
                        romCollection.xboxCreateShortcutUseShortGamename)

            #image placing
            if (not self.createNew):
                #in case of an update we have to create new options
                if (romCollection.name == 'MAME' and not self.createNew):
                    self.addFileTypesForMame()
                    self.addImagePlacingForMame()

            if (romCollection.imagePlacingMain != None
                    and romCollection.imagePlacingMain.name != ''):
                success, message = self.searchConfigObjects(
                    'ImagePlacing/fileTypeFor',
                    romCollection.imagePlacingMain.name, 'ImagePlacing')
                if (not success):
                    return False, message
                SubElement(romCollectionXml, 'imagePlacingMain'
                           ).text = romCollection.imagePlacingMain.name
            else:
                SubElement(romCollectionXml,
                           'imagePlacingMain').text = 'gameinfobig'

            if (romCollection.imagePlacingInfo != None
                    and romCollection.imagePlacingInfo.name != ''):
                success, message = self.searchConfigObjects(
                    'ImagePlacing/fileTypeFor',
                    romCollection.imagePlacingInfo.name, 'ImagePlacing')
                if (not success):
                    return False, message
                SubElement(romCollectionXml, 'imagePlacingInfo'
                           ).text = romCollection.imagePlacingInfo.name
            else:
                SubElement(romCollectionXml,
                           'imagePlacingInfo').text = 'gameinfosmall'

            if (romCollection.scraperSites == None
                    or len(romCollection.scraperSites) == 0):
                SubElement(
                    romCollectionXml, 'scraper', {
                        'name': 'thegamesdb.net',
                        'replaceKeyString': '',
                        'replaceValueString': ''
                    })
                SubElement(
                    romCollectionXml, 'scraper', {
                        'name': 'archive.vg',
                        'replaceKeyString': '',
                        'replaceValueString': ''
                    })
                SubElement(
                    romCollectionXml, 'scraper', {
                        'name': 'mobygames.com',
                        'replaceKeyString': '',
                        'replaceValueString': ''
                    })
            else:
                for scraperSite in romCollection.scraperSites:

                    if (scraperSite == None):
                        continue

                    #HACK: use replaceKey and -Value only from first scraper
                    firstScraper = scraperSite.scrapers[0]
                    SubElement(
                        romCollectionXml, 'scraper', {
                            'name': scraperSite.name,
                            'replaceKeyString': firstScraper.replaceKeyString,
                            'replaceValueString':
                            firstScraper.replaceValueString
                        })

                    #create Scraper element
                    scrapersXml = self.tree.find('Scrapers')

                    #check if the current scraper already exists
                    siteExists = False
                    sitesXml = scrapersXml.findall('Site')
                    for site in sitesXml:
                        name = site.attrib.get('name')
                        if name == scraperSite.name:
                            siteExists = True
                            break

                    if not siteExists:
                        #HACK: this only covers the first scraper (for offline scrapers)
                        site = SubElement(
                            scrapersXml, 'Site', {
                                'name':
                                scraperSite.name,
                                'descFilePerGame':
                                str(scraperSite.descFilePerGame),
                                'searchGameByCRC':
                                str(scraperSite.searchGameByCRC),
                                'useFoldernameAsCRC':
                                str(scraperSite.useFoldernameAsCRC),
                                'useFilenameAsCRC':
                                str(scraperSite.useFilenameAsCRC)
                            })

                        scraper = scraperSite.scrapers[0]

                        SubElement(
                            site, 'Scraper', {
                                'parseInstruction': scraper.parseInstruction,
                                'source': scraper.source,
                                'encoding': scraper.encoding
                            })

        success, message = self.writeFile()
        return success, message

    def writeScrapers(self, scrapers):

        Logutil.log('write scraper sites', util.LOG_LEVEL_INFO)

        scraperSitesXml = self.tree.find('Scrapers')

        #HACK: remove all scrapers and create new
        for scraperSiteXml in scraperSitesXml.findall('Site'):
            scraperSitesXml.remove(scraperSiteXml)

        for scraperSite in scrapers.values():

            Logutil.log('write scraper site: ' + str(scraperSite.name),
                        util.LOG_LEVEL_INFO)

            #Don't write None-Scraper
            if (scraperSite.name == util.localize(56004)):
                Logutil.log('None scraper will be skipped',
                            util.LOG_LEVEL_INFO)
                continue

            scraperSiteXml = SubElement(
                scraperSitesXml, 'Site', {
                    'name': scraperSite.name,
                    'descFilePerGame': str(scraperSite.descFilePerGame),
                    'searchGameByCRC': str(scraperSite.searchGameByCRC),
                    'useFoldernameAsCRC': str(scraperSite.useFoldernameAsCRC),
                    'useFilenameAsCRC': str(scraperSite.useFilenameAsCRC)
                })

            for scraper in scraperSite.scrapers:

                #check if we can use a relative path to parseInstructions
                rcbScraperPath = os.path.join(util.RCBHOME, 'resources',
                                              'scraper')
                pathParts = os.path.split(scraper.parseInstruction)
                if (pathParts[0].upper() == rcbScraperPath.upper()):
                    scraper.parseInstruction = pathParts[1]

                scraperXml = SubElement(
                    scraperSiteXml, 'Scraper', {
                        'parseInstruction': scraper.parseInstruction,
                        'source': scraper.source,
                        'encoding': scraper.encoding,
                        'returnUrl': str(scraper.returnUrl)
                    })

        success, message = self.writeFile()
        return success, message

    def writeMissingFilter(self, showHideOption, artworkOrGroup,
                           artworkAndGroup, infoOrGroup, infoAndGroup):

        Logutil.log('write Missing Info Filter', util.LOG_LEVEL_INFO)

        missingFilterXml = self.tree.find('MissingFilter')

        #HACK: remove MissingFilter-element
        if (missingFilterXml != None):
            self.tree.remove(missingFilterXml)

        missingFilterXml = SubElement(self.tree, 'MissingFilter')
        SubElement(missingFilterXml, 'showHideOption').text = showHideOption

        if (len(artworkOrGroup) > 0 or len(artworkAndGroup) > 0):
            missingArtworkXml = SubElement(missingFilterXml,
                                           'missingArtworkFilter')
            self.addMissingFilterItems(missingArtworkXml, artworkOrGroup,
                                       'orGroup')
            self.addMissingFilterItems(missingArtworkXml, artworkAndGroup,
                                       'andGroup')
        if (len(infoOrGroup) > 0 or len(infoAndGroup) > 0):
            missingInfoXml = SubElement(missingFilterXml, 'missingInfoFilter')
            self.addMissingFilterItems(missingInfoXml, infoOrGroup, 'orGroup')
            self.addMissingFilterItems(missingInfoXml, infoAndGroup,
                                       'andGroup')

        success, message = self.writeFile()
        return success, message

    def addMissingFilterItems(self, missingXml, group, groupName):
        if (len(group) > 0):
            groupXml = SubElement(missingXml, groupName)
            for item in group:
                SubElement(groupXml, 'item').text = item

    def searchConfigObjects(self, xPath, nameToCompare, objectType):
        objects = self.tree.findall(xPath)
        objectFound = False
        for obj in objects:
            objectName = obj.attrib.get('name')
            if (objectName == nameToCompare):
                objectFound = True
                break

        if (not objectFound):
            return False, util.localize(35009) % (objectType, nameToCompare)

        return True, ''

    def removeRomCollection(self, RCName):

        Logutil.log('removeRomCollection', util.LOG_LEVEL_INFO)

        configFile = util.getConfigXmlPath()
        self.tree = ElementTree().parse(configFile)
        romCollectionsXml = self.tree.find('RomCollections')
        for romCollectionXml in romCollectionsXml.findall('RomCollection'):
            name = romCollectionXml.attrib.get('name')
            if (name == RCName):
                romCollectionsXml.remove(romCollectionXml)

        success, message = self.writeFile()
        return success, message

    def addFileTypesForMame(self):
        Logutil.log('addFileTypesForMame', util.LOG_LEVEL_INFO)

        fileTypesXml = self.tree.find('FileTypes')

        #check if the MAME FileTypes already exist
        cabinetExists = False
        marqueeExists = False
        actionExists = False
        titleExists = False
        highestId = 0
        fileTypeXml = fileTypesXml.findall('FileType')
        for fileType in fileTypeXml:
            name = fileType.attrib.get('name')
            if name == 'cabinet':
                cabinetExists = True
            elif name == 'marquee':
                marqueeExists = True
            elif name == 'action':
                actionExists = True
            elif name == 'title':
                titleExists = True

            id = fileType.attrib.get('id')
            if int(id) > highestId:
                highestId = int(id)

        if not cabinetExists:
            self.createFileType(fileTypesXml, str(highestId + 1), 'cabinet',
                                'image', 'game')
        if not marqueeExists:
            self.createFileType(fileTypesXml, str(highestId + 2), 'marquee',
                                'image', 'game')
        if not actionExists:
            self.createFileType(fileTypesXml, str(highestId + 3), 'action',
                                'image', 'game')
        if not titleExists:
            self.createFileType(fileTypesXml, str(highestId + 4), 'title',
                                'image', 'game')

    def createFileType(self, fileTypesXml, id, name, type, parent):
        fileType = SubElement(fileTypesXml, 'FileType', {
            'id': str(id),
            'name': name
        })
        SubElement(fileType, 'type').text = type
        SubElement(fileType, 'parent').text = parent

    def addImagePlacingForMame(self):
        Logutil.log('addImagePlacingForMame', util.LOG_LEVEL_INFO)

        imagePlacingXml = self.tree.find('ImagePlacing')

        #check if the MAME ImagePlacing options already exist
        cabinetExists = False
        marqueeExists = False
        fileTypeForXml = imagePlacingXml.findall('fileTypeFor')
        for fileTypeFor in fileTypeForXml:
            name = fileTypeFor.attrib.get('name')
            if name == 'gameinfomamecabinet':
                cabinetExists = True
            elif name == 'gameinfomamemarquee':
                marqueeExists = True

        if not cabinetExists:
            fileTypeFor = SubElement(imagePlacingXml, 'fileTypeFor',
                                     {'name': 'gameinfomamecabinet'})
            SubElement(fileTypeFor, 'fileTypeForGameList').text = 'cabinet'
            SubElement(fileTypeFor, 'fileTypeForGameList').text = 'boxfront'
            SubElement(fileTypeFor, 'fileTypeForGameList').text = 'title'
            SubElement(fileTypeFor,
                       'fileTypeForGameListSelected').text = 'cabinet'
            SubElement(fileTypeFor,
                       'fileTypeForGameListSelected').text = 'boxfront'
            SubElement(fileTypeFor,
                       'fileTypeForGameListSelected').text = 'title'
            SubElement(fileTypeFor,
                       'fileTypeForMainViewBackground').text = 'boxfront'
            SubElement(fileTypeFor,
                       'fileTypeForMainViewBackground').text = 'title'
            SubElement(fileTypeFor,
                       'fileTypeForMainViewBackground').text = 'action'
            SubElement(fileTypeFor,
                       'fileTypeForMainViewGameInfoUpperLeft').text = 'title'
            SubElement(fileTypeFor,
                       'fileTypeForMainViewGameInfoUpperRight').text = 'action'
            SubElement(fileTypeFor,
                       'fileTypeForMainViewGameInfoLower').text = 'marquee'

        if not marqueeExists:
            fileTypeFor = SubElement(imagePlacingXml, 'fileTypeFor',
                                     {'name': 'gameinfomamemarquee'})
            SubElement(fileTypeFor, 'fileTypeForGameList').text = 'marquee'
            SubElement(fileTypeFor, 'fileTypeForGameList').text = 'boxfront'
            SubElement(fileTypeFor, 'fileTypeForGameList').text = 'title'
            SubElement(fileTypeFor,
                       'fileTypeForGameListSelected').text = 'marquee'
            SubElement(fileTypeFor,
                       'fileTypeForGameListSelected').text = 'boxfront'
            SubElement(fileTypeFor,
                       'fileTypeForGameListSelected').text = 'title'
            SubElement(fileTypeFor,
                       'fileTypeForMainViewBackground').text = 'boxfront'
            SubElement(fileTypeFor,
                       'fileTypeForMainViewBackground').text = 'title'
            SubElement(fileTypeFor,
                       'fileTypeForMainViewBackground').text = 'action'
            SubElement(fileTypeFor,
                       'fileTypeForMainViewGameInfoLeft').text = 'cabinet'
            SubElement(fileTypeFor,
                       'fileTypeForMainViewGameInfoUpperRight').text = 'action'
            SubElement(fileTypeFor,
                       'fileTypeForMainViewGameInfoLowerRight').text = 'title'

    def writeFile(self):
        Logutil.log('writeFile', util.LOG_LEVEL_INFO)
        #write file
        try:
            configFile = util.getConfigXmlPath()

            util.indentXml(self.tree)
            treeToWrite = ElementTree(self.tree)
            treeToWrite.write(configFile)

            return True, ""

        except Exception, (exc):
            print("Error: Cannot write config.xml: " + str(exc))
            return False, util.localize(35008) + ": " + str(exc)
示例#4
0
class ConfigXmlWriter:
	
	def __init__(self, createNew):
		
		Logutil.log('init ConfigXmlWriter', util.LOG_LEVEL_INFO)
		
		self.createNew = createNew
		
		if(createNew):
			configFile = os.path.join(util.getAddonInstallPath(), 'resources', 'database', 'config_template.xml')
		else:
			configFile = util.getConfigXmlPath()
		
		if(not os.path.isfile(configFile)):
			Logutil.log('File config.xml does not exist. Place a valid config file here: ' +str(configFile), util.LOG_LEVEL_ERROR)
			return False, 'Error: File config.xml does not exist'
		
		self.tree = ElementTree().parse(configFile)
	
	
	def writeRomCollections(self, romCollections, isEdit):
				
		Logutil.log('write Rom Collections', util.LOG_LEVEL_INFO)
				
		romCollectionsXml = self.tree.find('RomCollections')
		
		#HACK: remove all Rom Collections and create new
		if(isEdit):
			for romCollectionXml in romCollectionsXml.findall('RomCollection'):				
				romCollectionsXml.remove(romCollectionXml)
				
		
		for romCollection in romCollections.values():
			
			Logutil.log('write Rom Collection: ' +str(romCollection.name), util.LOG_LEVEL_INFO)
			
			romCollectionXml = SubElement(romCollectionsXml, 'RomCollection', {'id' : str(romCollection.id), 'name' : romCollection.name})
			SubElement(romCollectionXml, 'emulatorCmd').text = romCollection.emulatorCmd
			SubElement(romCollectionXml, 'emulatorParams').text = romCollection.emulatorParams
			
			for romPath in romCollection.romPaths:
				SubElement(romCollectionXml, 'romPath').text = str(romPath)
				
			SubElement(romCollectionXml, 'saveStatePath').text = romCollection.saveStatePath
			SubElement(romCollectionXml, 'saveStateParams').text = romCollection.saveStateParams
				
			for mediaPath in romCollection.mediaPaths:
				
				success, message = self.searchConfigObjects('FileTypes/FileType', mediaPath.fileType.name, 'FileType')
				if(not success):
					return False, message								
												
				SubElement(romCollectionXml, 'mediaPath', {'type' : mediaPath.fileType.name}).text = mediaPath.path
				
			SubElement(romCollectionXml, 'useEmuSolo').text = str(romCollection.useEmuSolo)
			SubElement(romCollectionXml, 'ignoreOnScan').text = str(romCollection.ignoreOnScan)
			SubElement(romCollectionXml, 'allowUpdate').text = str(romCollection.allowUpdate)
			SubElement(romCollectionXml, 'autoplayVideoMain').text = str(romCollection.autoplayVideoMain)
			SubElement(romCollectionXml, 'autoplayVideoInfo').text = str(romCollection.autoplayVideoInfo)
			SubElement(romCollectionXml, 'useFoldernameAsGamename').text = str(romCollection.useFoldernameAsGamename)
			SubElement(romCollectionXml, 'maxFolderDepth').text = str(romCollection.maxFolderDepth)
			SubElement(romCollectionXml, 'doNotExtractZipFiles').text = str(romCollection.doNotExtractZipFiles)
			SubElement(romCollectionXml, 'diskPrefix').text = str(romCollection.diskPrefix)
			
			if (os.environ.get( "OS", "xbox" ) == "xbox"):
				SubElement(romCollectionXml, 'xboxCreateShortcut').text = str(romCollection.xboxCreateShortcut)
				SubElement(romCollectionXml, 'xboxCreateShortcutAddRomfile').text = str(romCollection.xboxCreateShortcutAddRomfile)
				SubElement(romCollectionXml, 'xboxCreateShortcutUseShortGamename').text = str(romCollection.xboxCreateShortcutUseShortGamename)
				
			#image placing
			if(romCollection.imagePlacingMain != None and romCollection.imagePlacingMain.name != ''):
				success, message = self.searchConfigObjects('ImagePlacing/fileTypeFor', romCollection.imagePlacingMain.name, 'ImagePlacing')
				if(not success):
					return False, message
				SubElement(romCollectionXml, 'imagePlacingMain').text = romCollection.imagePlacingMain.name 
			else:
				SubElement(romCollectionXml, 'imagePlacingMain').text = 'gameinfobig'
				
			if(romCollection.imagePlacingInfo != None and romCollection.imagePlacingInfo.name != ''):
				success, message = self.searchConfigObjects('ImagePlacing/fileTypeFor', romCollection.imagePlacingInfo.name, 'ImagePlacing')
				if(not success):
					return False, message
				SubElement(romCollectionXml, 'imagePlacingInfo').text = romCollection.imagePlacingInfo.name 
			else:
				SubElement(romCollectionXml, 'imagePlacingInfo').text = 'gameinfosmall'
			
			if(romCollection.scraperSites == None or len(romCollection.scraperSites) == 0):
				SubElement(romCollectionXml, 'scraper', {'name' : 'thegamesdb.net', 'replaceKeyString' : '', 'replaceValueString' : ''})
				SubElement(romCollectionXml, 'scraper', {'name' : 'archive.vg', 'replaceKeyString' : '', 'replaceValueString' : ''})
				SubElement(romCollectionXml, 'scraper', {'name' : 'mobygames.com', 'replaceKeyString' : '', 'replaceValueString' : ''})
			else:
				for scraperSite in romCollection.scraperSites:
				
					if(scraperSite == None):
						continue
						
					#HACK: use replaceKey and -Value only from first scraper
					firstScraper = scraperSite.scrapers[0]
					SubElement(romCollectionXml, 'scraper', {'name' : scraperSite.name, 'replaceKeyString' : firstScraper.replaceKeyString, 'replaceValueString' : firstScraper.replaceValueString})
					
					#create Scraper element
					scrapersXml = self.tree.find('Scrapers')
					
					#check if the current scraper already exists
					siteExists = False
					sitesXml = scrapersXml.findall('Site')
					for site in sitesXml:
						name = site.attrib.get('name')
						if name == scraperSite.name:
							siteExists = True
							break
						
					if not siteExists:
						#HACK: this only covers the first scraper (for offline scrapers)
						site = SubElement(scrapersXml, 'Site', 
							{ 
							'name' : scraperSite.name,
							'descFilePerGame' : str(scraperSite.descFilePerGame),
							'searchGameByCRC' : str(scraperSite.searchGameByCRC),
							'useFoldernameAsCRC' : str(scraperSite.useFoldernameAsCRC),
							'useFilenameAsCRC' : str(scraperSite.useFilenameAsCRC)
							})
																		
						scraper = scraperSite.scrapers[0]
						SubElement(site, 'Scraper', 
							{ 
							'parseInstruction' : scraper.parseInstruction,
							'source' : scraper.source,
							'encoding' : scraper.encoding
							})
			
			if(not self.createNew):	
				#in case of an update we have to create new options
				if(romCollection.name == 'MAME' and not self.createNew):					
					self.addFileTypesForMame()
					self.addImagePlacingForMame()
				
		success, message = self.writeFile()
		return success, message
	
	
	def writeScrapers(self, scrapers):
		
		Logutil.log('write scraper sites', util.LOG_LEVEL_INFO)
				
		scraperSitesXml = self.tree.find('Scrapers')
				
		#HACK: remove all scrapers and create new
		for scraperSiteXml in scraperSitesXml.findall('Site'):				
			scraperSitesXml.remove(scraperSiteXml)
			
		for scraperSite in scrapers.values():
			
			Logutil.log('write scraper site: ' +str(scraperSite.name), util.LOG_LEVEL_INFO)
			
			#Don't write None-Scraper
			if(scraperSite.name == 'None'):
				Logutil.log('None scraper will be skipped', util.LOG_LEVEL_INFO)
				continue
			
			scraperSiteXml = SubElement(scraperSitesXml, 'Site', 
					{ 
					'name' : scraperSite.name,
					'descFilePerGame' : str(scraperSite.descFilePerGame),
					'searchGameByCRC' : str(scraperSite.searchGameByCRC),
					'useFoldernameAsCRC' : str(scraperSite.useFoldernameAsCRC),
					'useFilenameAsCRC' : str(scraperSite.useFilenameAsCRC)
					})
			
			for scraper in scraperSite.scrapers:
				
				#check if we can use a relative path to parseInstructions
				rcbScraperPath = os.path.join(util.RCBHOME, 'resources', 'scraper')
				pathParts = os.path.split(scraper.parseInstruction)
				if(pathParts[0].upper() == rcbScraperPath.upper()):
					scraper.parseInstruction = pathParts[1]
				
				scraperXml = SubElement(scraperSiteXml, 'Scraper', 
					{ 
					'parseInstruction' : scraper.parseInstruction,
					'source' : scraper.source,
					'encoding' : scraper.encoding,
					'returnUrl' : str(scraper.returnUrl)
					})
		
		success, message = self.writeFile()
		return success, message
	
	
	def searchConfigObjects(self, xPath, nameToCompare, objectType):		
		objects = self.tree.findall(xPath)
		objectFound = False
		for obj in objects:
			objectName = obj.attrib.get('name')
			if(objectName == nameToCompare):
				objectFound = True
				break
		
		if(not objectFound):
			return False, '%s %s could not be found in config.xml' %(objectType, nameToCompare)
		
		return True, ''
	
		
	def removeRomCollection(self, RCName):
		configFile = util.getConfigXmlPath()
		self.tree = ElementTree().parse(configFile)
		romCollectionsXml = self.tree.find('RomCollections')
		for romCollectionXml in romCollectionsXml.findall('RomCollection'):
			name = romCollectionXml.attrib.get('name')
			if(name == RCName):
				romCollectionsXml.remove(romCollectionXml)	
				
		success, message = self.writeFile()
		return success, message
		
	def addFileTypesForMame(self):
		
		fileTypesXml = self.tree.find('FileTypes')
				
		#check if the MAME FileTypes already exist
		cabinetExists = False
		marqueeExists = False
		actionExists = False
		titleExists = False
		highestId = 0
		fileTypeXml = fileTypesXml.findall('FileType')
		for fileType in fileTypeXml:
			name = fileType.attrib.get('name')
			if name == 'cabinet':
				cabinetExists = True
			elif name == 'marquee':
				marqueeExists = True
			elif name == 'action':
				actionExists = True
			elif name == 'marquee':
				titleExists = True
			
			id = fileType.attrib.get('id')
			if int(id) > highestId:
				highestId = int(id)
		
		if not cabinetExists:
			self.createFileType(fileTypesXml, str(highestId +1), 'cabinet', 'image', 'game')
		if not marqueeExists:
			self.createFileType(fileTypesXml, str(highestId +2), 'marquee', 'image', 'game')			
		if not actionExists:
			self.createFileType(fileTypesXml, str(highestId +3), 'action', 'image', 'game')
		if not titleExists:
			self.createFileType(fileTypesXml, str(highestId +4), 'title', 'image', 'game')			
			
		
	def createFileType(self, fileTypesXml, id, name, type, parent):
		fileType = SubElement(fileTypesXml, 'FileType', {'id' : str(id), 'name' : name})
		SubElement(fileType, 'type').text = type
		SubElement(fileType, 'parent').text = parent
		
		
	def addImagePlacingForMame(self):
		
		imagePlacingXml = self.tree.find('ImagePlacing')
		
		#check if the MAME ImagePlacing options already exist
		cabinetExists = False
		marqueeExists = False		
		fileTypeForXml = imagePlacingXml.findall('fileTypeFor')
		for fileTypeFor in fileTypeForXml:
			name = fileTypeFor.attrib.get('name')
			if name == 'gameinfomamecabinet':
				cabinetExists = True
			elif name == 'gameinfomamemarquee':
				marqueeExists = True
				
		if not cabinetExists:
			fileTypeFor = SubElement(imagePlacingXml, 'fileTypeFor', {'name' : 'gameinfomamecabinet'})
			SubElement(fileTypeFor, 'fileTypeForGameList').text = 'cabinet'
			SubElement(fileTypeFor, 'fileTypeForGameList').text = 'boxfront'
			SubElement(fileTypeFor, 'fileTypeForGameList').text = 'title'
			SubElement(fileTypeFor, 'fileTypeForGameListSelected').text = 'cabinet'
			SubElement(fileTypeFor, 'fileTypeForGameListSelected').text = 'boxfront'
			SubElement(fileTypeFor, 'fileTypeForGameListSelected').text = 'title'			
			SubElement(fileTypeFor, 'fileTypeForMainViewBackground').text = 'boxfront'
			SubElement(fileTypeFor, 'fileTypeForMainViewBackground').text = 'title'
			SubElement(fileTypeFor, 'fileTypeForMainViewBackground').text = 'action'
			SubElement(fileTypeFor, 'fileTypeForMainViewGameInfoUpperLeft').text = 'title'
			SubElement(fileTypeFor, 'fileTypeForMainViewGameInfoUpperRight').text = 'action'
			SubElement(fileTypeFor, 'fileTypeForMainViewGameInfoLower').text = 'marquee'
			
		if not marqueeExists:
			fileTypeFor = SubElement(imagePlacingXml, 'fileTypeFor', {'name' : 'gameinfomamemarquee'})
			SubElement(fileTypeFor, 'fileTypeForGameList').text = 'marquee'
			SubElement(fileTypeFor, 'fileTypeForGameList').text = 'boxfront'
			SubElement(fileTypeFor, 'fileTypeForGameList').text = 'title'
			SubElement(fileTypeFor, 'fileTypeForGameListSelected').text = 'marquee'
			SubElement(fileTypeFor, 'fileTypeForGameListSelected').text = 'boxfront'
			SubElement(fileTypeFor, 'fileTypeForGameListSelected').text = 'title'			
			SubElement(fileTypeFor, 'fileTypeForMainViewBackground').text = 'boxfront'
			SubElement(fileTypeFor, 'fileTypeForMainViewBackground').text = 'title'
			SubElement(fileTypeFor, 'fileTypeForMainViewBackground').text = 'action'
			SubElement(fileTypeFor, 'fileTypeForMainViewGameInfoLeft').text = 'cabinet'
			SubElement(fileTypeFor, 'fileTypeForMainViewGameInfoUpperRight').text = 'action'
			SubElement(fileTypeFor, 'fileTypeForMainViewGameInfoLowerRight').text = 'title'
		
						
	def writeFile(self):
		#write file		
		try:
			configFile = util.getConfigXmlPath()
			
			util.indentXml(self.tree)
			treeToWrite = ElementTree(self.tree)			
			treeToWrite.write(configFile)
			
			return True, ""
			
		except Exception, (exc):
			print("Error: Cannot write config.xml: " +str(exc))
			return False, "Error: Cannot write config.xml: " +str(exc)