00001 #include <qfile.h>
00002
00003 #include <mythtv/mythcontext.h>
00004 #include <mythtv/mythdbcon.h>
00005
00006 #include "rominfo.h"
00007 #include "romedit.h"
00008
00009 #define LOC_ERR QString("MythGame:ROMINFO Error: ")
00010 #define LOC QString("MythGame:ROMINFO: ")
00011
00012 bool operator==(const RomInfo& a, const RomInfo& b)
00013 {
00014 if (a.Romname() == b.Romname())
00015 return true;
00016 return false;
00017 }
00018
00019
00020 void RomInfo::edit_rominfo()
00021 {
00022 QString rom_ver = Version();
00023
00024 GameEditDialog romeditdlg(Romname());
00025
00026 DialogCode res = romeditdlg.exec();
00027
00028 if (kDialogCodeRejected == res)
00029 return;
00030
00031 if (res)
00032 {
00033 MSqlQuery query(MSqlQuery::InitCon());
00034 query.prepare("SELECT gamename,genre,year,country,publisher,favorite "
00035 "FROM gamemetadata "
00036 "WHERE gametype = :GAMETYPE "
00037 "AND romname = :ROMNAME");
00038
00039 query.bindValue(":GAMETYPE", GameType());
00040 query.bindValue(":ROMNAME", Romname());
00041
00042 if (!query.exec())
00043 {
00044 MythContext::DBError("RomInfo::edit_rominfo", query);
00045 return;
00046 }
00047
00048 if (query.isActive() && query.size() > 0);
00049 {
00050 QString t_gamename, t_genre, t_year, t_country, t_publisher;
00051 bool t_favourite;
00052
00053 query.next();
00054 t_gamename = query.value(0).toString();
00055 t_genre = query.value(1).toString();
00056 t_year = query.value(2).toString();
00057 t_country = query.value(3).toString();
00058 t_publisher = query.value(4).toString();
00059 t_favourite = query.value(5).toBool();
00060
00061 if ((t_gamename != Gamename()) || (t_genre != Genre()) || (t_year != Year())
00062 || (t_country != Country()) || (t_publisher != Publisher()) || (t_favourite != Favorite()))
00063 {
00064 query.prepare("UPDATE gamemetadata SET version = 'CUSTOM' "
00065 "WHERE gametype = :GAMETYPE "
00066 "AND romname = :ROMNAME");
00067 query.bindValue(":GAMETYPE", GameType());
00068 query.bindValue(":ROMNAME", Romname());
00069
00070 if (!query.exec())
00071 {
00072 MythContext::DBError("RomInfo::edit_rominfo", query);
00073 return;
00074 }
00075 }
00076 }
00077 }
00078 }
00079
00080
00081 int romInDB(QString rom, QString gametype)
00082 {
00083 MSqlQuery query(MSqlQuery::InitCon());
00084
00085 int count = 0;
00086
00087 query.prepare("SELECT count(*) FROM gamemetadata "
00088 "WHERE gametype = :GAMETYPE "
00089 "AND romname = :ROMNAME");
00090
00091 query.bindValue(":GAMETYPE", gametype);
00092 query.bindValue(":ROMNAME", rom);
00093
00094 if (!query.exec())
00095 {
00096 MythContext::DBError("romInDB", query);
00097 return -1;
00098 }
00099
00100
00101 if (query.isActive() && query.size() > 0);
00102 {
00103 query.next();
00104 count = query.value(0).toInt();
00105 };
00106
00107 return count;
00108 }
00109
00110
00111 bool RomInfo::FindImage(QString BaseFileName, QString *result)
00112 {
00113 QStringList graphic_formats;
00114 graphic_formats.append("png");
00115 graphic_formats.append("gif");
00116 graphic_formats.append("jpg");
00117 graphic_formats.append("jpeg");
00118 graphic_formats.append("xpm");
00119 graphic_formats.append("bmp");
00120 graphic_formats.append("pnm");
00121 graphic_formats.append("tif");
00122 graphic_formats.append("tiff");
00123
00124 int dotLocation = BaseFileName.findRev('.');
00125 if(dotLocation == -1)
00126 {
00127 BaseFileName.append('.');
00128 dotLocation = BaseFileName.length();
00129 }
00130
00131
00132 BaseFileName.truncate(dotLocation + 1);
00133 for (QStringList::Iterator i = graphic_formats.begin(); i != graphic_formats.end(); i++)
00134 {
00135 *result = BaseFileName + *i;
00136 if(QFile::exists(*result))
00137 return true;
00138 }
00139 return false;
00140 }
00141
00142 void RomInfo::setField(QString field, QString data)
00143 {
00144 if (field == "system")
00145 system = data;
00146 else if (field == "gamename")
00147 gamename = data;
00148 else if (field == "genre")
00149 genre = data;
00150 else if (field == "year")
00151 year = data;
00152 else if (field == "favorite")
00153 favorite = data.toInt();
00154 else if (field == "rompath")
00155 rompath = data;
00156 else if (field == "country")
00157 country = data;
00158 else if (field == "publisher")
00159 publisher = data;
00160 else if (field == "crc_value")
00161 crc_value = data;
00162 else if (field == "diskcount")
00163 diskcount = data.toInt();
00164 else if (field == "gametype")
00165 gametype = data;
00166 else if (field == "romcount")
00167 romcount = data.toInt();
00168 else
00169 VERBOSE(VB_GENERAL, LOC_ERR + QString("Invalid field %1").arg(field));
00170
00171 }
00172
00173 void RomInfo::setFavorite()
00174 {
00175 favorite = 1 - favorite;
00176
00177 MSqlQuery query(MSqlQuery::InitCon());
00178
00179 query.prepare("UPDATE gamemetadata SET favorite = :FAV "
00180 "WHERE romname = :ROMNAME");
00181
00182 query.bindValue(":FAV", favorite);
00183 query.bindValue(":ROMNAME",romname);
00184
00185 if (!query.exec())
00186 {
00187 MythContext::DBError("RomInfo::setFavorite", query);
00188 }
00189 }
00190
00191 QString RomInfo::getExtension()
00192 {
00193 int pos = Romname().findRev(".");
00194 if (pos == -1)
00195 return NULL;
00196
00197 pos = Romname().length() - pos;
00198 pos--;
00199
00200 QString ext = Romname().right(pos);
00201 return ext;
00202 }
00203
00204 void RomInfo::fillData()
00205 {
00206 if (gamename == "")
00207 {
00208 return;
00209 }
00210
00211 MSqlQuery query(MSqlQuery::InitCon());
00212
00213 QString systemtype;
00214 if (system != "") {
00215 systemtype += " AND system = :SYSTEM ";
00216 }
00217
00218 QString thequery = "SELECT system,gamename,genre,year,romname,favorite,"
00219 "rompath,country,crc_value,diskcount,gametype,publisher,"
00220 "version FROM gamemetadata WHERE gamename = :GAMENAME "
00221 + systemtype + " ORDER BY diskcount DESC";
00222
00223 query.prepare(thequery);
00224 query.bindValue(":SYSTEM", system);
00225 query.bindValue(":GAMENAME", gamename);
00226 query.exec();
00227
00228 if (query.isActive() && query.size() > 0);
00229 {
00230 query.next();
00231
00232 setSystem(query.value(0).toString());
00233 setGamename(query.value(1).toString());
00234 setGenre(query.value(2).toString());
00235 setYear(query.value(3).toString());
00236 setRomname(query.value(4).toString());
00237 setField("favorite",query.value(5).toString());
00238 setRompath(query.value(6).toString());
00239 setCountry(query.value(7).toString());
00240 setCRC_VALUE(query.value(8).toString());
00241 setDiskCount(query.value(9).toInt());
00242 setGameType(query.value(10).toString());
00243 setPublisher(query.value(11).toString());
00244 setVersion(query.value(12).toString());
00245 }
00246
00247 query.prepare("SELECT screenshots FROM gameplayers "
00248 "WHERE playername = :SYSTEM");
00249 query.bindValue(":SYSTEM",system);
00250 query.exec();
00251
00252 if (query.isActive() && query.size() > 0);
00253 {
00254 query.next();
00255 if (!query.value(0).toString().isEmpty())
00256 {
00257 QString Image = query.value(0).toString() + "/" + romname;
00258 if (FindImage(query.value(0).toString() + "/" + romname, &Image))
00259 setImagePath(Image);
00260 else
00261 setImagePath("");
00262 }
00263 }
00264
00265 setRomCount(romInDB(romname,gametype));
00266
00267
00268
00269 if (RomCount() > 1)
00270 {
00271 query.prepare("SELECT DISTINCT system FROM gamemetadata "
00272 "WHERE romname = :ROMNAME");
00273 query.bindValue(":ROMNAME", Romname());
00274 query.exec();
00275
00276 if (query.isActive() && query.size() > 0);
00277 {
00278 while(query.next())
00279 {
00280 if (allsystems == "")
00281 allsystems = query.value(0).toString();
00282 else
00283 allsystems += "," + query.value(0).toString();
00284 }
00285 }
00286 } else
00287 allsystems = system;
00288
00289 }
00290