Improved to "half-way usable" (version 0.5)
[pierogi] / pirkeysetmanager.cpp
1 #include "pirkeysetmanager.h"
2 #include "pirkeysetmetadata.h"
3 #include "keysets/apple.h"
4 #include "keysets/denon.h"
5 #include "keysets/ei.h"
6 #include "keysets/elgato.h"
7 #include "keysets/goldstar.h"
8 #include "keysets/hauppauge.h"
9 #include "keysets/hitachi.h"
10 #include "keysets/jvc.h"
11 #include "keysets/lg.h"
12 #include "keysets/magnavox.h"
13 #include "keysets/mitsubishi.h"
14 #include "keysets/nokia.h"
15 #include "keysets/panasonic.h"
16 #include "keysets/philips.h"
17 #include "keysets/pinnacle.h"
18 #include "keysets/raite.h"
19 #include "keysets/rca.h"
20 #include "keysets/sagem.h"
21 #include "keysets/samsung.h"
22 #include "keysets/sanyo.h"
23 #include "keysets/sharp.h"
24 #include "keysets/sony.h"
25 #include "keysets/tivo.h"
26 #include "keysets/toshiba.h"
27 #include "keysets/westinghouse.h"
28 #include "keysets/yamaha.h"
29 #include "keysets/zenith.h"
30 #include "pirmakenames.h"
31
32 #include "pirexception.h"
33
34 #include <QObject>
35
36 // I'll be handling the threading of the keyset commands in this object:
37 #include <QMutex>
38
39 // Global communications mechanism:
40 extern bool stopRepeatingFlag;
41 extern QMutex stopRepeatingMutex;
42
43 // Global helper objects:
44 PIRMakeMgr makeManager;
45 PIRDeviceTypeMgr deviceManager;
46
47 // Now, on to the actual method definitions:
48
49 PIRKeysetManager::PIRKeysetManager(
50   QObject *guiObject)
51   : counter(0)
52 {
53   // Create the keysets.  Ugly!  This needs to be worked on!
54   populateKeyset(new AppleWhiteRemote(guiObject, counter++));
55
56   populateKeyset(new DenonDVD1(guiObject, counter++));
57   populateKeyset(new DenonDVD2(guiObject, counter++));
58   populateKeyset(new DenonDVD3(guiObject, counter++));
59   populateKeyset(new DenonReceiver1(guiObject, counter++));
60   populateKeyset(new DenonReceiver1a(guiObject, counter++));
61   populateKeyset(new DenonReceiver1b(guiObject, counter++));
62   populateKeyset(new DenonReceiver1c(guiObject, counter++));
63   populateKeyset(new DenonReceiver2(guiObject, counter++));
64   populateKeyset(new DenonReceiver2a(guiObject, counter++));
65   populateKeyset(new DenonReceiver3(guiObject, counter++));
66   populateKeyset(new DenonReceiver3a(guiObject, counter++));
67   populateKeyset(new DenonReceiver4(guiObject, counter++));
68   populateKeyset(new DenonReceiver5(guiObject, counter++));
69   populateKeyset(new DenonAudio1(guiObject, counter++));
70   populateKeyset(new DenonAudio1a(guiObject, counter++));
71   populateKeyset(new DenonAudio1b(guiObject, counter++));
72   populateKeyset(new DenonAudio1c(guiObject, counter++));
73   populateKeyset(new DenonAudio1d(guiObject, counter++));
74   populateKeyset(new DenonAudio2(guiObject, counter++));
75   populateKeyset(new DenonAudio3(guiObject, counter++));
76   populateKeyset(new DenonAudio4(guiObject, counter++));
77   populateKeyset(new DenonAudio5(guiObject, counter++));
78
79   populateKeyset(new EiTV1(guiObject, counter++));
80
81   populateKeyset(new ElgatoEyeTV1(guiObject, counter++));
82
83   populateKeyset(new GoldStarTV1(guiObject, counter++));
84   populateKeyset(new GoldStarTV2(guiObject, counter++));
85   populateKeyset(new GoldStarVCR1(guiObject, counter++));
86   populateKeyset(new GoldStarVCR1a(guiObject, counter++));
87   populateKeyset(new GoldStarVCR1b(guiObject, counter++));
88   populateKeyset(new GoldStarVCR1c(guiObject, counter++));
89   populateKeyset(new GoldStarCD1(guiObject, counter++));
90
91   populateKeyset(new HauppaugePCTV1(guiObject, counter++));
92   populateKeyset(new HauppaugePCTV1a(guiObject, counter++));
93   populateKeyset(new HauppaugePCTV1b(guiObject, counter++));
94   populateKeyset(new HauppaugePCTV1c(guiObject, counter++));
95   populateKeyset(new HauppaugePCTV2(guiObject, counter++));
96
97   populateKeyset(new JVCSat1(guiObject, counter++));
98   populateKeyset(new JVCSat2(guiObject, counter++));
99   populateKeyset(new JVCVCR1(guiObject, counter++));
100   populateKeyset(new JVCVCR1a(guiObject, counter++));
101   populateKeyset(new JVCVCRBmode1(guiObject, counter++));
102   populateKeyset(new JVCVCRBmode1a(guiObject, counter++));
103   populateKeyset(new JVCTV1(guiObject, counter++));
104   populateKeyset(new JVCTV1a(guiObject, counter++));
105   populateKeyset(new JVCTV1b(guiObject, counter++));
106   populateKeyset(new JVCTV1c(guiObject, counter++));
107   populateKeyset(new JVCTV1d(guiObject, counter++));
108   populateKeyset(new JVCDAT1(guiObject, counter++));
109   populateKeyset(new JVCCarDeck1(guiObject, counter++));
110   populateKeyset(new JVCAudio1(guiObject, counter++));
111   populateKeyset(new JVCAudio1a(guiObject, counter++));
112   populateKeyset(new JVCAudio1b(guiObject, counter++));
113   populateKeyset(new JVCAudio2(guiObject, counter++));
114   populateKeyset(new JVCDVD1(guiObject, counter++));
115
116   populateKeyset(new LGTV1(guiObject, counter++));
117   populateKeyset(new LGTV1a(guiObject, counter++));
118   populateKeyset(new LGTV1b(guiObject, counter++));
119   populateKeyset(new LGTV1c(guiObject, counter++));
120   populateKeyset(new LGTV2(guiObject, counter++));
121   populateKeyset(new LGTV2a(guiObject, counter++));
122   populateKeyset(new LGTV2b(guiObject, counter++));
123   populateKeyset(new LGDisc1(guiObject, counter++));
124   populateKeyset(new LGDisc2(guiObject, counter++));
125   populateKeyset(new LGDisc2a(guiObject, counter++));
126   populateKeyset(new LGVCR1(guiObject, counter++));
127   populateKeyset(new LGVCR1a(guiObject, counter++));
128   populateKeyset(new LGVCR1b(guiObject, counter++));
129
130   populateKeyset(new MagnavoxDVD1(guiObject, counter++));
131   populateKeyset(new MagnavoxVCR1(guiObject, counter++));
132   populateKeyset(new MagnavoxConverterBox1(guiObject, counter++));
133   populateKeyset(new MagnavoxTV1(guiObject, counter++));
134
135   populateKeyset(new MitsubishiTV1(guiObject, counter++));
136   populateKeyset(new MitsubishiTV1a(guiObject, counter++));
137   populateKeyset(new MitsubishiVCR1(guiObject, counter++));
138   populateKeyset(new MitsubishiVCR1a(guiObject, counter++));
139
140   populateKeyset(new NokiaGenericVCR(guiObject, counter++));
141
142   populateKeyset(new PanasonicAmp(guiObject, counter++));
143   populateKeyset(new PanasonicCarAudio(guiObject, counter++));
144   populateKeyset(new PanasonicSat1(guiObject, counter++));
145   populateKeyset(new PanasonicSat1a(guiObject, counter++));
146   populateKeyset(new PanasonicTV1(guiObject, counter++));
147   populateKeyset(new PanasonicTV1a(guiObject, counter++));
148   populateKeyset(new PanasonicTV1b(guiObject, counter++));
149   populateKeyset(new PanasonicVCR1(guiObject, counter++));
150   populateKeyset(new PanasonicVCR1a(guiObject, counter++));
151   populateKeyset(new PanasonicVCR1b(guiObject, counter++));
152   populateKeyset(new PanasonicVCR1c(guiObject, counter++));
153   populateKeyset(new PanasonicDVD1(guiObject, counter++));
154   populateKeyset(new PanasonicDVD1a(guiObject, counter++));
155   populateKeyset(new PanasonicAudio1(guiObject, counter++));
156   populateKeyset(new PanasonicAudio1a(guiObject, counter++));
157
158   populateKeyset(new PhilipsTV1(guiObject, counter++));
159   populateKeyset(new PhilipsTV1a(guiObject, counter++));
160   populateKeyset(new PhilipsTV1b(guiObject, counter++));
161   populateKeyset(new PhilipsTV1c(guiObject, counter++));
162   populateKeyset(new PhilipsTV1d(guiObject, counter++));
163   populateKeyset(new PhilipsTV1e(guiObject, counter++));
164   populateKeyset(new PhilipsTV1f(guiObject, counter++));
165   populateKeyset(new PhilipsTV2(guiObject, counter++));
166   populateKeyset(new PhilipsTV2a(guiObject, counter++));
167   populateKeyset(new PhilipsTV2b(guiObject, counter++));
168   populateKeyset(new PhilipsTV3(guiObject, counter++));
169   populateKeyset(new PhilipsDVD1(guiObject, counter++));
170   populateKeyset(new PhilipsDVD1a(guiObject, counter++));
171   populateKeyset(new PhilipsDVD1b(guiObject, counter++));
172   populateKeyset(new PhilipsDVD1c(guiObject, counter++));
173   populateKeyset(new PhilipsDVD1d(guiObject, counter++));
174   populateKeyset(new PhilipsDVD2(guiObject, counter++));
175   populateKeyset(new PhilipsDVD3(guiObject, counter++));
176   populateKeyset(new PhilipsDVD4(guiObject, counter++));
177   populateKeyset(new PhilipsVCR1(guiObject, counter++));
178   populateKeyset(new PhilipsVCR1a(guiObject, counter++));
179   populateKeyset(new PhilipsVCR1b(guiObject, counter++));
180   populateKeyset(new PhilipsVCR1c(guiObject, counter++));
181   populateKeyset(new PhilipsSat1(guiObject, counter++));
182   populateKeyset(new PhilipsSat2(guiObject, counter++));
183   populateKeyset(new PhilipsSat2a(guiObject, counter++));
184   populateKeyset(new PhilipsSat3(guiObject, counter++));
185   populateKeyset(new PhilipsAudio1(guiObject, counter++));
186   populateKeyset(new PhilipsAudio1a(guiObject, counter++));
187   populateKeyset(new PhilipsAudio1b(guiObject, counter++));
188   populateKeyset(new PhilipsAudio2(guiObject, counter++));
189   populateKeyset(new PhilipsAudio3(guiObject, counter++));
190   populateKeyset(new PhilipsAudio4(guiObject, counter++));
191
192   populateKeyset(new PinnaclePCTV1(guiObject, counter++));
193   populateKeyset(new PinnaclePCTV2(guiObject, counter++));
194   populateKeyset(new PinnaclePCTV3(guiObject, counter++));
195
196   populateKeyset(new RaiteDVD1(guiObject, counter++));
197
198   populateKeyset(new RCATV1(guiObject, counter++));
199   populateKeyset(new RCATV1a(guiObject, counter++));
200   populateKeyset(new RCATV2(guiObject, counter++));
201   populateKeyset(new RCAAux1(guiObject, counter++));
202   populateKeyset(new RCAAux2(guiObject, counter++));
203   populateKeyset(new RCAAux2a(guiObject, counter++));
204   populateKeyset(new RCAVCR1(guiObject, counter++));
205   populateKeyset(new RCAVCR2(guiObject, counter++));
206   populateKeyset(new RCADVD1(guiObject, counter++));
207   populateKeyset(new RCADVD1a(guiObject, counter++));
208   populateKeyset(new RCASat1(guiObject, counter++));
209   populateKeyset(new RCASat2(guiObject, counter++));
210
211   populateKeyset(new SagemTVBox1(guiObject, counter++));
212   populateKeyset(new SagemTVBox1a(guiObject, counter++));
213
214   populateKeyset(new SamsungTV1(guiObject, counter++));
215   populateKeyset(new SamsungTV1a(guiObject, counter++));
216   populateKeyset(new SamsungTV1b(guiObject, counter++));
217   populateKeyset(new SamsungTV1c(guiObject, counter++));
218   populateKeyset(new SamsungTV1d(guiObject, counter++));
219   populateKeyset(new SamsungTV1e(guiObject, counter++));
220   populateKeyset(new SamsungTV1f(guiObject, counter++));
221   populateKeyset(new SamsungTV2(guiObject, counter++));
222   populateKeyset(new SamsungTV2a(guiObject, counter++));
223   populateKeyset(new SamsungVCR1(guiObject, counter++));
224   populateKeyset(new SamsungVCR1a(guiObject, counter++));
225   populateKeyset(new SamsungVCR1b(guiObject, counter++));
226   populateKeyset(new SamsungVCR1c(guiObject, counter++));
227   populateKeyset(new SamsungVCR1d(guiObject, counter++));
228   populateKeyset(new SamsungVCR1e(guiObject, counter++));
229   populateKeyset(new SamsungDVD1(guiObject, counter++));
230   populateKeyset(new SamsungDVD1a(guiObject, counter++));
231   populateKeyset(new SamsungDVD1b(guiObject, counter++));
232   populateKeyset(new SamsungDVD2(guiObject, counter++));
233   populateKeyset(new SamsungAC1(guiObject, counter++));
234
235   populateKeyset(new SanyoVCR1(guiObject, counter++));
236   populateKeyset(new SanyoDVD1(guiObject, counter++));
237   populateKeyset(new SanyoTV1(guiObject, counter++));
238   populateKeyset(new SanyoTV1a(guiObject, counter++));
239   populateKeyset(new SanyoTV1b(guiObject, counter++));
240   populateKeyset(new SanyoTV1c(guiObject, counter++));
241   populateKeyset(new SanyoTV1d(guiObject, counter++));
242   populateKeyset(new SanyoTV1e(guiObject, counter++));
243   populateKeyset(new SanyoProjector(guiObject, counter++));
244
245   populateKeyset(new SharpTV1(guiObject, counter++));
246   populateKeyset(new SharpTV1a(guiObject, counter++));
247   populateKeyset(new SharpTV1b(guiObject, counter++));
248   populateKeyset(new SharpTV1c(guiObject, counter++));
249   populateKeyset(new SharpTV1d(guiObject, counter++));
250   populateKeyset(new SharpTV1e(guiObject, counter++));
251   populateKeyset(new SharpVCR1(guiObject, counter++));
252   populateKeyset(new SharpReceiver1(guiObject, counter++));
253
254   populateKeyset(new SonyTV1(guiObject, counter++));
255   populateKeyset(new SonyTV1a(guiObject, counter++));
256   populateKeyset(new SonyTV1b(guiObject, counter++));
257   populateKeyset(new SonyTV1c(guiObject, counter++));
258   populateKeyset(new SonyAmp1(guiObject, counter++));
259   populateKeyset(new SonyAmp2(guiObject, counter++));
260   populateKeyset(new SonyAudio1(guiObject, counter++));
261   populateKeyset(new SonyAudio1a(guiObject, counter++));
262   populateKeyset(new SonyDAT1(guiObject, counter++));
263   populateKeyset(new SonyDVD1(guiObject, counter++));
264   populateKeyset(new SonyDVD1a(guiObject, counter++));
265   populateKeyset(new SonyDVD1b(guiObject, counter++));
266   populateKeyset(new SonyDVD1c(guiObject, counter++));
267   populateKeyset(new SonyVCR1(guiObject, counter++));
268   populateKeyset(new SonyVCR1a(guiObject, counter++));
269   populateKeyset(new SonyVCR1b(guiObject, counter++));
270   populateKeyset(new SonyReceiver1(guiObject, counter++));
271
272   populateKeyset(new Tivo1(guiObject, counter++));
273   populateKeyset(new Tivo1a(guiObject, counter++));
274   populateKeyset(new Tivo1b(guiObject, counter++));
275   populateKeyset(new Tivo1c(guiObject, counter++));
276   populateKeyset(new Tivo1d(guiObject, counter++));
277
278   populateKeyset(new ToshibaTV1(guiObject, counter++));
279   populateKeyset(new ToshibaTV1a(guiObject, counter++));
280   populateKeyset(new ToshibaTV1b(guiObject, counter++));
281   populateKeyset(new ToshibaTV1c(guiObject, counter++));
282   populateKeyset(new ToshibaTV1d(guiObject, counter++));
283   populateKeyset(new ToshibaTV1e(guiObject, counter++));
284   populateKeyset(new ToshibaTV1f(guiObject, counter++));
285   populateKeyset(new ToshibaTV1g(guiObject, counter++));
286   populateKeyset(new ToshibaVCR1(guiObject, counter++));
287   populateKeyset(new ToshibaVCR1a(guiObject, counter++));
288   populateKeyset(new ToshibaDisc1(guiObject, counter++));
289   populateKeyset(new ToshibaDisc1a(guiObject, counter++));
290   populateKeyset(new ToshibaDisc1b(guiObject, counter++));
291   populateKeyset(new ToshibaDisc1c(guiObject, counter++));
292   populateKeyset(new ToshibaDisc1d(guiObject, counter++));
293
294   populateKeyset(new WestinghouseTV1(guiObject, counter++));
295   populateKeyset(new WestinghouseTV2(guiObject, counter++));
296
297   populateKeyset(new YamahaDVD1(guiObject, counter++));
298   populateKeyset(new YamahaDVD1a(guiObject, counter++));
299   populateKeyset(new YamahaAudio1(guiObject, counter++));
300   populateKeyset(new YamahaAudio1a(guiObject, counter++));
301   populateKeyset(new YamahaAudio2(guiObject, counter++));
302   populateKeyset(new YamahaAudio2a(guiObject, counter++));
303   populateKeyset(new YamahaAudio2b(guiObject, counter++));
304   populateKeyset(new YamahaAudio2c(guiObject, counter++));
305   populateKeyset(new YamahaAudio2d(guiObject, counter++));
306   populateKeyset(new YamahaAudio3(guiObject, counter++));
307   populateKeyset(new YamahaAudio4(guiObject, counter++));
308   populateKeyset(new YamahaAudio5(guiObject, counter++));
309   populateKeyset(new YamahaAudio6(guiObject, counter++));
310   populateKeyset(new YamahaAudio7(guiObject, counter++));
311   populateKeyset(new YamahaTV1(guiObject, counter++));
312   populateKeyset(new YamahaKaraoke1(guiObject, counter++));
313
314   populateKeyset(new ZenithC32V37(guiObject, counter++));
315
316   // Start the thread running:
317   commandThread.start();
318 }
319
320
321 PIRKeysetManager::~PIRKeysetManager()
322 {
323   // Tell the keysets to stop doing any work:
324   {
325     QMutexLocker locker(&stopRepeatingMutex);
326     stopRepeatingFlag = true;
327   }
328
329   // Tell the thread that we want it to stop:
330   commandThread.exit();
331
332   // Wait for the thread to stop:
333   commandThread.wait();
334
335   // Delete all the keysets:
336   PIRKeysetCollection::iterator i = keysetsInfo.begin();
337   while (i != keysetsInfo.end())
338   {
339     if ((*i).second) delete (*i).second;
340     ++i;
341   }
342 }
343
344
345 bool PIRKeysetManager::keysetExists(
346   unsigned int keysetID)
347 {
348   PIRKeysetCollection::const_iterator i = keysetsInfo.find(keysetID);
349
350   return (i != keysetsInfo.end());
351 }
352
353
354 bool PIRKeysetManager::findKeysetID(
355   QString make,
356   QString name,
357   unsigned int &id)
358 {
359   // Only modify the id if we actually find a match!
360
361   PIRKeysetMakeIndex::const_iterator i = makeIndex.find(make);
362   if (i == makeIndex.end())
363   {
364     return false;
365   }
366
367   PIRKeysetNameIndex::const_iterator ii = (*i).second.find(name);
368   if (ii == (*i).second.end())
369   {
370     return false;
371   }
372
373   //  Ok, we've found it, pull out the id:
374   id = (*ii).second;
375   return true;
376 }
377
378
379 PIRKeysetWidgetItem *PIRKeysetManager::makeKeysetItem(
380   QString make,
381   QString name)
382 {
383   unsigned int id;
384
385   if (!findKeysetID(make, name, id))
386   {
387     return NULL;
388   }
389
390   QString fullname = make;
391   fullname.append(" ");
392   fullname.append(name);
393
394   return new PIRKeysetWidgetItem(fullname, id, getMake(id));
395 }
396
397
398 bool PIRKeysetManager::hasKey(
399   unsigned int keysetID,
400   PIRKeyName name)
401 {
402   PIRKeysetMetaData *meta = keysetsInfo[keysetID];
403
404   if (!meta) return false;
405
406   return meta->hasKey(name);
407 }
408
409
410 PIRMakeName PIRKeysetManager::getMake(
411   unsigned int keysetID)
412 {
413   PIRKeysetMetaData *meta = keysetsInfo[keysetID];
414
415   if (!meta) return Any_Make; // Work on this!
416
417   return meta->getMake();
418 }
419
420
421 QString PIRKeysetManager::getDisplayName(
422   unsigned int keysetID)
423 {
424   PIRKeysetMetaData *meta = keysetsInfo[keysetID];
425
426   if (!meta) return QString("Database Error");
427
428   return QString(meta->getKeysetName());
429 }
430
431
432 void PIRKeysetManager::populateKeyset(
433   PIRKeysetMetaData *keyset)
434 {
435   // Set up the keyset collection:
436   keysetsInfo[keyset->getID()] = keyset;
437
438   keyset->moveProtocolToThread(commandThread);
439
440   // Also, set up a name-based index into the collection:
441   makeIndex
442     [QString(makeManager.getMakeString(keyset->getMake()))]
443     [QString(keyset->getKeysetName())]
444     = keyset->getID();
445 }
446
447
448 void PIRKeysetManager::populateGuiWidget(
449   PIRSelectKeysetForm *skf)
450 {
451   PIRMakeName make;
452   PIRKeysetWidgetItem *kwi;
453
454   PIRKeysetCollection::const_iterator i = keysetsInfo.begin();
455
456   while (i != keysetsInfo.end())
457   {
458     make = i->second->getMake();
459     QString tempString = makeManager.getMakeString(make);
460     tempString.append(" ");
461     tempString.append(i->second->getKeysetName());
462     kwi = new PIRKeysetWidgetItem(tempString, i->first, make);
463     i->second->populateDeviceTypes(kwi);
464     skf->addWidgetItem(kwi);
465     ++i;
466   }
467 }
468
469
470 void PIRKeysetManager::populateDeviceTypes(
471   PIRKeysetWidgetItem *kwi,
472   unsigned int keysetID)
473 {
474   // Pass the buck:  (Need to check for bad keysetID here?)
475   keysetsInfo[keysetID]->populateDeviceTypes(kwi);
476 }