The branch, dharma-pre has been updated
via 795918b04af0fb24c1a110013e6a4bca8afef346 (commit)
from ef7fbdb375abed8389992961ab19b7b5e3b9335e (commit)
- Log -----------------------------------------------------------------
http://xbmc.git.sourceforge.net/git/gitweb.cgi?p=xbmc/plugins;a=commit;h=795918b04af0fb24c1a110013e6a4bca8afef346
commit 795918b04af0fb24c1a110013e6a4bca8afef346
Author: spiff <[email protected]>
Date: Sat Oct 30 21:22:34 2010 +0200
[plugin.games.xbmame] updated to version 1.1.2
diff --git a/plugin.games.xbmame/addon.xml b/plugin.games.xbmame/addon.xml
index 52981c8..3452708 100644
--- a/plugin.games.xbmame/addon.xml
+++ b/plugin.games.xbmame/addon.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
-<addon id="plugin.games.xbmame" name="XBMC MAME Frontend" version="1.0.1"
provider-name="Akira76">
+<addon id="plugin.games.xbmame" name="XBMC MAME Frontend" version="1.1.2"
provider-name="Akira76">
<requires>
<import addon="xbmc.python" version="1.0"/>
<import addon="script.module.pysqlite" version="2.5.6"/>
@@ -12,13 +12,15 @@
<extension point="xbmc.addon.metadata">
<platform>all</platform>
<summary lang="en">Allows to use XBMC as a frontend to mame</summary>
- <description lang="en">First release :
- - Supports listing by Year, Bios, Manufacturer, Game Name, Games with
hard drive.
+ <description lang="en">XBMC MAME Frontend (XBMame) :
+ - Supports listing by Year, Bios, Manufacturer, Name, etc.
- Supports romset filtering on certain criteria.
+ - Supports BIOS selection for some drivers.
- Supports Video and Dipswitch settings from XBMC.
- Includes a basic name search engine.
- Please send comments and feature requests to [email protected]
+Support for OSX and Linux is work in progress.
+Please send comments and requests to [email protected]
</description>
</extension>
</addon>
diff --git a/plugin.games.xbmame/changelog.txt
b/plugin.games.xbmame/changelog.txt
index f13e011..03e9390 100644
--- a/plugin.games.xbmame/changelog.txt
+++ b/plugin.games.xbmame/changelog.txt
@@ -1,3 +1,9 @@
+2010-10-30 -> v1.1.0
+ Reworked the database for faster creation/indexing.
+ Fixed an issue where MAME couldn't start on windows XP
+ Fixed an issue where games with incorrect graphics were never displayed.
+ It's now possible to choos which bios to use if a driver supports more
than one.
+
2010-10-29 -> v1.0.1
Improved initial database creation process, now in three passes instead of
four.
Fixed an issue where game config file wasn't successfully created.
diff --git a/plugin.games.xbmame/resources/language/English/strings.xml
b/plugin.games.xbmame/resources/language/English/strings.xml
index 05ae1fe..65df216 100644
--- a/plugin.games.xbmame/resources/language/English/strings.xml
+++ b/plugin.games.xbmame/resources/language/English/strings.xml
@@ -93,5 +93,6 @@
<string id="30930">Rebuild database</string>
<string id="30931">Rebuild have/miss list</string>
<string id="30932">Rebuild thumbnails</string>
-
+ <string id="30937">BIOS Settings</string>
+ <string id="30938">Use the following BIOS :</string>
</strings>
diff --git a/plugin.games.xbmame/resources/lib/XBMame.py
b/plugin.games.xbmame/resources/lib/XBMame.py
index 56db918..fd9b2b0 100644
--- a/plugin.games.xbmame/resources/lib/XBMame.py
+++ b/plugin.games.xbmame/resources/lib/XBMame.py
@@ -29,6 +29,7 @@ from XMLHelper import XMLHelper
from GameItem import GameItem
from DIPSwitch import DIPSwitch
from DBHelper import DBHelper
+from BiosSet import BiosSet
FILTERS = {}
@@ -110,7 +111,7 @@ class XBMame:
if
__settings__.getSetting("hide_notworking")=="true":self._FILTERS += " AND
isworking"
if __settings__.getSetting("hide_impemul")=="true":self._FILTERS
+= " AND emul"
if __settings__.getSetting("hide_impcolor")=="true":self._FILTERS
+= " AND color"
- if __settings__.getSetting("hide_gfx")=="true":self._FILTERS += "
AND graphic"
+ if __settings__.getSetting("hide_graphics")=="true":self._FILTERS
+= " AND graphic"
if __settings__.getSetting("hide_impsound")=="true":self._FILTERS
+= " AND sound"
self._db = DBHelper(self._MAME_DATABASE_PATH)
if self._db.isEmpty():
@@ -170,7 +171,7 @@ class XBMame:
if (bios):
self._gameCollection(bios=bios)
else:
- sql = "select gamename, romset from games where isbios and romset
in (select romof from games where romof<>'' %s group by romof)" % self._FILTERS
+ sql = "select gamename, romset from games where isbios and romset
in (select romof from games where romof<>'' %s group by romof) ORDER BY
gamename" % self._FILTERS
bioses = self._db.getGames(sql, ())
for bios in bioses:
listitem = xbmcgui.ListItem(bios[0],
thumbnailImage=self._ICON_BIOS)
@@ -245,6 +246,17 @@ class XBMame:
settings_xml +="<setting label=\"%s\" type=\"bool\"
id=\"display_zoom\" default=\"%s\"/>" % (__language__(30928),
bool_by_value[game.zoom])
settings_xml +="</category>"
switches = self._db.getList("Dipswitches", ["id"],
{"romset_id=":romset_id})
+
+ if len(game.biossets):
+ values = ""
+ for biosset in game.biossets:
+ if game.biosset==biosset.name:default = biosset.description
+ values+="|%s" % biosset.description
+ settings_xml +="<category label=\"%s\">" % __language__(30937)
+ settings_xml +="<setting label=\"%s\" type=\"labelenum\"
id=\"biosset\" values=\"%s\" default=\"%s\"/>" % \
+ (__language__(30938), values[1:], default)
+ settings_xml +="</category>"
+
settings_xml +="<category label=\"%s\">" % __language__(30801)
for switch in switches:
switch = DIPSwitch(self._db, id=switch["id"])
@@ -273,19 +285,20 @@ class XBMame:
xml = re.sub("\r|\t|\n", "", xml)
settings = XMLHelper().getNodes(xml, "setting")
for setting in settings:
- if XMLHelper().getAttribute(setting, "setting",
"id")[0:8]=="display_":
- if XMLHelper().getAttribute(setting, "setting",
"id")=="display_view":
- game.view =
view_by_name[XMLHelper().getAttribute(setting, "setting", "value")]
- elif XMLHelper().getAttribute(setting, "setting",
"id")=="display_rotate":
- game.rotate =
rotate_by_name[XMLHelper().getAttribute(setting, "setting", "value")]
- elif XMLHelper().getAttribute(setting, "setting",
"id")=="display_backdrops":
- game.backdrops =
bool_by_name[XMLHelper().getAttribute(setting, "setting", "value")]
- elif XMLHelper().getAttribute(setting, "setting",
"id")=="display_overlays":
- game.overlays =
bool_by_name[XMLHelper().getAttribute(setting, "setting", "value")]
- elif XMLHelper().getAttribute(setting, "setting",
"id")=="display_bezels":
- game.bezels =
bool_by_name[XMLHelper().getAttribute(setting, "setting", "value")]
- elif XMLHelper().getAttribute(setting, "setting",
"id")=="display_zoom":
- game.zoom =
bool_by_name[XMLHelper().getAttribute(setting, "setting", "value")]
+ if XMLHelper().getAttribute(setting, "setting",
"id")=="display_view":
+ game.view = view_by_name[XMLHelper().getAttribute(setting,
"setting", "value")]
+ elif XMLHelper().getAttribute(setting, "setting",
"id")=="display_rotate":
+ game.rotate =
rotate_by_name[XMLHelper().getAttribute(setting, "setting", "value")]
+ elif XMLHelper().getAttribute(setting, "setting",
"id")=="display_backdrops":
+ game.backdrops =
bool_by_name[XMLHelper().getAttribute(setting, "setting", "value")]
+ elif XMLHelper().getAttribute(setting, "setting",
"id")=="display_overlays":
+ game.overlays =
bool_by_name[XMLHelper().getAttribute(setting, "setting", "value")]
+ elif XMLHelper().getAttribute(setting, "setting",
"id")=="display_bezels":
+ game.bezels =
bool_by_name[XMLHelper().getAttribute(setting, "setting", "value")]
+ elif XMLHelper().getAttribute(setting, "setting",
"id")=="display_zoom":
+ game.zoom = bool_by_name[XMLHelper().getAttribute(setting,
"setting", "value")]
+ elif XMLHelper().getAttribute(setting, "setting",
"id")=="biosset":
+ game.biosset =
BiosSet(self._db).getByDescription(XMLHelper().getAttribute(setting, "setting",
"value")).name
else:
switch = DIPSwitch(self._db,
id=XMLHelper().getAttribute(setting, "setting", "id")[1:])
value = XMLHelper().getAttribute(setting, "setting",
"value")
@@ -307,13 +320,35 @@ class XBMame:
os.remove(SETTINGS_PLUGIN_XML_DOCUMENT)
os.remove(SETTINGS_PLUGIN_XML_TEMPLATE)
+ def xpPath(self, path):
+ return "\"%s\"" % path.replace("\\", "/")
+
def _runGame(self, romset):
game = GameItem(self._db, id=romset)
if game.have:
- config_path =
xbmc.translatePath(self._MAME_CONFIG_PATH).replace("\\", "/")
- options = "-cfg_directory \\\"%s\\\" -rompath \\\"%s\\\" -video
d3d -triplebuffer -filter -switchres -multithreading -waitvsync -aspect 16:9
-view 16:9 -skip_gameinfo" % (config_path, self._MAME_ROM_PATH)
+ config_path = self.xpPath(self._MAME_CONFIG_PATH)
+ media_path = self.xpPath(MEDIA_PATH)
+ rom_path = self.xpPath(self._MAME_ROM_PATH)
+ sample_path = self.xpPath(self._MAME_SAMPLES_PATH)
+ params = {}
+ params ["-cfg_directory"] = config_path
+ params ["-rompath"] = rom_path
+ params ["-artpath"] = media_path
+ params ["-samplepath"] = sample_path
+ params ["-cheat"] = ""
+ params ["-switchres"] = ""
+ params ["-video"] = "d3d"
+ params ["-d3dversion"] = "9"
+ params ["-filter"] = ""
+ params ["-multithreading"] = ""
+ params ["-waitvsync"] = ""
+ params ["-skip_gameinfo"] = ""
+# params ["-resolution"] = "1280x...@60"
+ params ["-effect"] = "Scanlines75Dx4_j4"
if self._MAME_SAMPLES_PATH:
- options += " -samplepath \\\"%s\\\"" % self._MAME_SAMPLES_PATH
+ params ["-samplepath"] = sample_path
+ if game.biosset:
+ params ["-bios"] = game.biosset
cfgxml = "<?xml version=\"1.0\"?><mameconfig
version=\"10\"><system name=\"%s\"><input>" % game.romset
for switch in game.dipswitches:
switch = DIPSwitch(self._db, switch[0])
@@ -321,10 +356,14 @@ class XBMame:
cfgxml+="</input><video>"
cfgxml+="<target index=\"0\" view=\"%s\" rotate=\"%s\"
backdrops=\"%s\" overlays=\"%s\" bezels=\"%s\" zoom=\"%s\" />" % (game.view,
game.rotate, game.backdrops, game.overlays, game.bezels, game.zoom)
cfgxml+="</video></system></mameconfig>"
- cfg = open(os.path.join(config_path, "%s.cfg" % game.romset), "w")
+ cfg = open(os.path.join(self._MAME_CONFIG_PATH, "%s.cfg" %
game.romset), "w")
cfg.write(cfgxml)
cfg.close()
- command = "System.Exec(\"\\\"%s\\\" %s %s\")" %
(self._MAME_EXE_PATH, options, game.romset)
+ command = self._MAME_EXE_PATH
+ for key in params.keys():
+ command += " %s %s " % (key, params[key])
+ command+=game.romset
+ command = "System.Exec(\"%s\")" % command.replace("\"", "\\\"")
xbmc.executebuiltin(command)
else:
if dialog.yesno(__language__(30701), __language__(30702),
__language__(30703)):
@@ -388,11 +427,14 @@ class XBMame:
def _gameDatabase(self):
if len(self._db.runQuery("SELECT * FROM sqlite_master WHERE name=?",
("Games",))):
self._db.execute("DROP TABLE Games")
+ if len(self._db.runQuery("SELECT * FROM sqlite_master WHERE name=?",
("BiosSets",))):
+ self._db.execute("DROP TABLE BiosSets")
if len(self._db.runQuery("SELECT * FROM sqlite_master WHERE name=?",
("Dipswitches",))):
self._db.execute("DROP TABLE Dipswitches")
if len(self._db.runQuery("SELECT * FROM sqlite_master WHERE name=?",
("DipswitchesValues",))):
self._db.execute("DROP TABLE DipswitchesValues")
- self._db.execute("CREATE TABLE Games (id INTEGER PRIMARY KEY, romset
TEXT, cloneof TEXT, romof TEXT, driver TEXT, gamename TEXT, gamecomment TEXT,
manufacturer TEXT, year TEXT, isbios BOOLEAN, hasdisk BOOLEAN, isworking
BOOLEAN, emul BOOLEAN, color BOOLEAN, graphic BOOLEAN, sound BOOLEAN, hasdips
BOOLEAN, view INTEGER, rotate INTEGER, backdrops BOOLEAN, overlays BOOLEAN,
bezels BOOLEAN, zoom BOOLEAN, have BOOLEAN, thumb BOOLEAN)")
+ self._db.execute("CREATE TABLE Games (id INTEGER PRIMARY KEY, romset
TEXT, cloneof TEXT, romof TEXT, biosset TEXT, driver TEXT, gamename TEXT,
gamecomment TEXT, manufacturer TEXT, year TEXT, isbios BOOLEAN, hasdisk
BOOLEAN, isworking BOOLEAN, emul BOOLEAN, color BOOLEAN, graphic BOOLEAN, sound
BOOLEAN, hasdips BOOLEAN, view INTEGER, rotate INTEGER, backdrops BOOLEAN,
overlays BOOLEAN, bezels BOOLEAN, zoom BOOLEAN, have BOOLEAN, thumb BOOLEAN)")
+ self._db.execute("CREATE TABLE BiosSets (id INTEGER PRIMARY KEY,
romset_id INTEGER, name TEXT, description TEXT)")
self._db.execute("CREATE TABLE Dipswitches (id INTEGER PRIMARY KEY,
romset_id integer, name TEXT, tag TEXT, mask INTEGER, defvalue INTEGER, value
INTEGER)")
self._db.execute("CREATE TABLE DipswitchesValues (id INTEGER PRIMARY
KEY, dipswitch_id INTEGER, name TEXT, value TEXT)")
self._db.commit()
diff --git a/plugin.games.xbmame/resources/lib/obj/GameItem.py
b/plugin.games.xbmame/resources/lib/obj/GameItem.py
index 120b987..1f0293a 100644
--- a/plugin.games.xbmame/resources/lib/obj/GameItem.py
+++ b/plugin.games.xbmame/resources/lib/obj/GameItem.py
@@ -1,27 +1,12 @@
-# The contents of this file are subject to the Mozilla Public License
-# Version 1.1 (the "License"); you may not use this file except in
-# compliance with the License. You may obtain a copy of the License at
-# http://www.mozilla.org/MPL/
-#
-# Software distributed under the License is distributed on an "AS IS"
-# basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
-# License for the specific language governing rights and limitations
-# under the License.
-#
-# The Original Code is plugin.games.xbmame.
-#
-# The Initial Developer of the Original Code is Olivier LODY aka Akira76.
-# Portions created by the XBMC team are Copyright (C) 2003-2010 XBMC.
-# All Rights Reserved.
-
import re
from XMLHelper import XMLHelper
from DIPSwitch import DIPSwitch
+from BiosSet import BiosSet
class GameItem(object):
- def __init__(self, db, commands=(), id=0, xml=""):
+ def __init__(self, db, id=0, romset="", xml=""):
self._db=db
self.dipswitches = []
self.id=0
@@ -30,6 +15,8 @@ class GameItem(object):
self.cloneof=""
self.romof=""
self.isbios=""
+ self.biosset=""
+ self.biossets = []
self.gamename=""
self.gamecomment=""
self.manufacturer=""
@@ -48,35 +35,46 @@ class GameItem(object):
self.zoom=0
self.have=0
self.hasdips=False
-
- if id:self._fromDB(id)
+ if id:self._fromDB(id=id)
+ if romset:self._fromDB(romset=romset)
if xml:self._fromXML(xml)
- def _fromDB(self, id):
- data = self._db.getGames("SELECT id, romset, driver, cloneof, romof,
gamename, gamecomment, manufacturer, year, hasdisk, isworking, emul, color,
graphic, sound, view, rotate, backdrops, overlays, bezels, zoom, hasdips, have
FROM Games WHERE id=?", (id,))[0]
+ def _fromDB(self, id=0, romset=""):
+ if id:
+ data = self._db.getGames("SELECT id, romset, driver, cloneof,
romof, biosset, gamename, gamecomment, manufacturer, year, isbios, hasdisk,
isworking, emul, color, graphic, sound, view, rotate, backdrops, overlays,
bezels, zoom, hasdips, have FROM Games WHERE id=?", (id,))[0]
+ else:
+ data = self._db.getGames("SELECT id, romset, driver, cloneof,
romof, biosset, gamename, gamecomment, manufacturer, year, isbios, hasdisk,
isworking, emul, color, graphic, sound, view, rotate, backdrops, overlays,
bezels, zoom, hasdips, have FROM Games WHERE romset=?", (romset,))[0]
self.id=data[0]
self.romset=data[1]
self.driver=data[2]
self.cloneof=data[3]
self.romof=data[4]
- self.gamename=data[5]
- self.gamecomment=data[6]
- self.manufacturer=data[7]
- self.year=data[8]
- self.hasdisk=bool(data[9])
- self.isworking=bool(data[10])
- self.emul=bool(data[11])
- self.color=bool(data[12])
- self.graphic=bool(data[13])
- self.sound=bool(data[14])
- self.view=data[15]
- self.rotate=data[16]
- self.backdrops=data[17]
- self.overlays=data[18]
- self.bezels=data[19]
- self.zoom=data[20]
- self.hasdips=bool(data[21])
- self.have=bool(data[22])
+ if self.romof:
+ parent = GameItem(self._db, romset=self.romof)
+ self.biossets=parent.biossets
+ self.biosset=data[5]
+ self.gamename=data[6]
+ self.gamecomment=data[7]
+ self.manufacturer=data[8]
+ self.year=data[9]
+ self.isbios=data[10]
+ if self.isbios:
+ print "looking for biossets for %s" % self.romset
+ self.biossets=BiosSet(self._db).getByRomsetID(self.id)
+ self.hasdisk=bool(data[11])
+ self.isworking=bool(data[12])
+ self.emul=bool(data[13])
+ self.color=bool(data[14])
+ self.graphic=bool(data[15])
+ self.sound=bool(data[16])
+ self.view=data[17]
+ self.rotate=data[18]
+ self.backdrops=data[19]
+ self.overlays=data[20]
+ self.bezels=data[21]
+ self.zoom=data[22]
+ self.hasdips=bool(data[23])
+ self.have=bool(data[24])
self.dipswitches = self._db.getGames("SELECT id FROM Dipswitches WHERE
romset_id=? ORDER BY tag, mask", (self.id,))
def _fromXML(self, xml):
@@ -86,6 +84,12 @@ class GameItem(object):
self.cloneof = XMLHelper().getAttribute(xml,"game", "cloneof")
self.romof = XMLHelper().getAttribute(xml,"game", "romof")
self.isbios = int(XMLHelper().getAttribute(xml, "game", "isbios")!="")
+ for biosset in XMLHelper().getNodes(xml, "biosset"):
+ self.biossets.append(
+ BiosSet(self._db, name=XMLHelper().getAttribute(biosset,
"biosset", "name"),
+ description=XMLHelper().getAttribute(biosset, "biosset",
"description")))
+ if XMLHelper().getAttribute(biosset, "biosset", "default"):
+ self.biosset = XMLHelper().getAttribute(biosset, "biosset",
"name")
description = XMLHelper().getNodeValue(xml, "description")
self.gamename = re.sub(" \(.*?\)", "", description)
self.gamecomment = re.sub("[\(|\)]", "",
description[len(self.gamename)+1:])
@@ -100,16 +104,21 @@ class GameItem(object):
self.sound = int(XMLHelper().getAttribute(xml, "driver",
"sound")=="good")
self.manufacturer = XMLHelper().getNodeValue(xml, "manufacturer")
for dipswitch in XMLHelper().getNodes(xml, "dipswitch"):
- self.dipswitches.append(DIPSwitch(self._db, xml=dipswitch))
- self.hasdips=True
+ dipswitch = DIPSwitch(self._db, xml=dipswitch)
+ if dipswitch.name!="Unused" and dipswitch.name!="Unknown":
+ self.dipswitches.append(dipswitch)
+ self.hasdips=True
del xml
return self
def writeDB(self):
if not self.id:
- romset_id = self._db.execute("INSERT INTO Games VALUES(null, ?, ?,
?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)",
- (self.romset, self.cloneof, self.romof, self.driver,
self.gamename, self.gamecomment, self.manufacturer, self.year, self.isbios,
self.hasdisk, self.isworking, self.emul, self.color, self.graphic, self.sound,
self.hasdips, 0, 0, 1, 1, 1, 0, self.have, 0))
+ romset_id = self._db.execute("INSERT INTO Games VALUES(null, ?, ?,
?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)",
+ (self.romset, self.cloneof, self.romof, self.biosset, self.driver,
self.gamename, self.gamecomment, self.manufacturer, self.year, self.isbios,
self.hasdisk, self.isworking, self.emul, self.color, self.graphic, self.sound,
self.hasdips, 0, 0, 1, 1, 1, 0, self.have, 0))
+ for biosset in self.biossets:
+ biosset.setRomSetID(romset_id)
+ biosset.writeDB()
for dipswitch in self.dipswitches:
dipswitch.writeDB(romset_id)
else:
- self._db.execute("UPDATE Games SET view=?, rotate=?, backdrops=?,
overlays=?, bezels=?, zoom=? WHERE ID=?", (self.view, self.rotate,
self.backdrops, self.overlays, self.bezels, self.zoom, self.id))
+ self._db.execute("UPDATE Games SET biosset=?, view=?, rotate=?,
backdrops=?, overlays=?, bezels=?, zoom=? WHERE ID=?", (self.biosset,
self.view, self.rotate, self.backdrops, self.overlays, self.bezels, self.zoom,
self.id))
-----------------------------------------------------------------------
Summary of changes:
plugin.games.xbmame/addon.xml | 10 +-
plugin.games.xbmame/changelog.txt | 6 +
.../resources/language/English/strings.xml | 3 +-
plugin.games.xbmame/resources/lib/XBMame.py | 84 +++++++++++++----
plugin.games.xbmame/resources/lib/obj/BiosSet.py | 59 ++++++++++++
plugin.games.xbmame/resources/lib/obj/GameItem.py | 97 +++++++++++---------
.../resources/media/Scanlines25x4_j4.png | Bin 0 -> 157 bytes
.../resources/media/Scanlines75Dx4_j4.png | Bin 0 -> 156 bytes
.../resources/media/Scanlines75x2_j4.png | Bin 0 -> 145 bytes
.../resources/media/Scanlines75x3_j4.png | Bin 0 -> 152 bytes
.../resources/media/Scanlines75x4_j4.png | Bin 0 -> 157 bytes
11 files changed, 189 insertions(+), 70 deletions(-)
create mode 100644 plugin.games.xbmame/resources/lib/obj/BiosSet.py
create mode 100644 plugin.games.xbmame/resources/media/Scanlines25x4_j4.png
create mode 100644 plugin.games.xbmame/resources/media/Scanlines75Dx4_j4.png
create mode 100644 plugin.games.xbmame/resources/media/Scanlines75x2_j4.png
create mode 100644 plugin.games.xbmame/resources/media/Scanlines75x3_j4.png
create mode 100644 plugin.games.xbmame/resources/media/Scanlines75x4_j4.png
hooks/post-receive
--
Plugins
------------------------------------------------------------------------------
Nokia and AT&T present the 2010 Calling All Innovators-North America contest
Create new apps & games for the Nokia N8 for consumers in U.S. and Canada
$10 million total in prizes - $4M cash, 500 devices, nearly $6M in marketing
Develop with Nokia Qt SDK, Web Runtime, or Java and Publish to Ovi Store
http://p.sf.net/sfu/nokia-dev2dev
_______________________________________________
Xbmc-addons mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/xbmc-addons