changed: moved url and isFolder arguments back to XBMC_setDirectoryEntry
[xbmc:xbmc-antiquated.git] / xbmc / lib / libPython / xbmcmodule / xbmcmodule.cpp
1 #include "stdafx.h"
2 #include "../python/Python.h"
3 #include "player.h"
4 #include "pyplaylist.h"
5 #include "keyboard.h"
6 #include "../../../xbox/IoSupport.h"
7 #include <ConIo.h>
8 #include "infotagvideo.h"
9 #include "infotagmusic.h"
10 #include "../../libGoAhead/XBMChttp.h"
11 #include "../../../utils/GUIInfoManager.h"
12 #include "../../../../guilib/GUIAudioManager.h"
13 #include "../../../Application.h"
14 #include "../../../Crc32.h"
15 #include "../../../Util.h"
16 #include "FileSystem/PluginDirectory.h"
17
18 // include for constants
19 #include "pyutil.h"
20 #include "../../../PlayListPlayer.h"
21 #include "listitem.h"
22
23 using namespace XFILE;
24
25 #pragma code_seg("PY_TEXT")
26 #pragma data_seg("PY_DATA")
27 #pragma bss_seg("PY_BSS")
28 #pragma const_seg("PY_RDATA")
29
30 #ifdef __cplusplus
31 extern "C" {
32 #endif
33
34 namespace PYXBMC
35 {
36 /*****************************************************************
37  * start of xbmc methods
38  *****************************************************************/
39   PyDoc_STRVAR(setDirectoryEntry__doc__,
40     "setDirectoryEntry(handle, url, listitem [,isFolder]) -- Callback function to pass directory contents back to XBMC.\n"
41     "\n"
42     "handle      : Integer - handle the plugin was started with.\n"
43     "url         : string - url of the entry. would be plugin:// for another virtual directory\n"
44     "listitem    : ListItem - item to add.\n"
45     "isFolder    : [opt] bool - True=folder / False=not a folder(default).\n"
46     "\n"
47     "example:\n"
48     "  - xbmc.setDirectoryEntry(handle, 'F:\\\\Trailers\\\\300.mov', listitem)\n");
49
50   PyObject* XBMC_setDirectoryEntry(PyTypeObject *type, PyObject *args, PyObject *kwds)
51   {
52     static char *keywords[] = {"handle", "url", "listitem", "isFolder", NULL };
53     int handle = -1;
54     PyObject *pURL = NULL;
55     PyObject *pItem = NULL;
56     bool bIsFolder = false;
57     // parse arguments
58     if (!PyArg_ParseTupleAndKeywords(
59       args,
60       kwds,
61       "iOO|b",
62       keywords,
63       &handle,
64       &pURL,
65       &pItem,
66       &bIsFolder
67       ))
68     {
69       return NULL;
70     };
71
72     string url;
73     if (!PyGetUnicodeString(url, pURL, 1) || !ListItem_CheckExact(pItem)) return NULL;
74     
75     ListItem *pListItem = (ListItem *)pItem;
76     pListItem->item->m_strPath = url;
77     pListItem->item->m_bIsFolder = bIsFolder;
78
79     // call the directory class to add our item
80     DIRECTORY::CPluginDirectory::AddItem(handle, pListItem->item);
81
82     Py_INCREF(Py_None);
83     return Py_None;
84   }
85
86   PyDoc_STRVAR(endOfDirectory__doc__,
87     "endOfDirectory(handle) -- Callback function to tell XBMC that the end of the directory listing in a virtualPythonFolder module is reached.\n"
88     "\n"
89     "handle      : Integer - handle the plugin was started with.\n"
90     "\n"
91     "example:\n"
92     "  - xbmc.enoOfDirectory(handle)\n");
93
94   PyObject* XBMC_endOfDirectory(PyTypeObject *type, PyObject *args, PyObject *kwds)
95   {
96     static char *keywords[] = {"handle", NULL };
97     int handle = 0;
98     // parse arguments to constructor
99     if (!PyArg_ParseTupleAndKeywords(
100       args,
101       kwds,
102       "i",
103       keywords,
104       &handle
105       ))
106     {
107       return NULL;
108     };
109     // tell the directory class that we're done
110     DIRECTORY::CPluginDirectory::EndOfDirectory(handle);
111
112     Py_INCREF(Py_None);
113     return Py_None;
114   }
115
116   // output() method
117   PyDoc_STRVAR(output__doc__,
118     "output(text) -- Write a string to XBMC's log file and the debug window.\n"
119     "\n"
120     "text           : string - text to output.\n"
121     "\n"
122     "*Note, Text is written to the log only when <loglevel>1</loglevel> (DEBUG)\n"
123     "       or higher is set in AdvancedSettings.xml.\n"
124     "\n"
125     "example:\n"
126     "  - xbmc.output('This is a test string.')\n");
127
128   PyObject* XBMC_Output(PyObject *self, PyObject *args)
129   {
130     char *s_line = NULL;
131     if (!PyArg_ParseTuple(args, "s:xb_output", &s_line)) return NULL;
132
133     CLog::Log(LOGINFO, s_line);
134
135     ThreadMessage tMsg = {TMSG_WRITE_SCRIPT_OUTPUT};
136     tMsg.strParam = s_line;
137     g_applicationMessenger.SendMessage(tMsg);
138
139     Py_INCREF(Py_None);
140     return Py_None;
141   }
142
143   // log() method
144   PyDoc_STRVAR(log__doc__,
145     "log(text) -- Write a string to XBMC's log file.\n"
146     "\n"
147     "text           : string - text to write to log.\n"
148     "\n"
149     "example:\n"
150     "  - xbmc.log('This is a test string.')\n");
151
152   PyObject* XBMC_Log(PyObject *self, PyObject *args)
153   {
154     char *s_line = NULL;
155     if (!PyArg_ParseTuple(args, "s", &s_line)) return NULL;
156
157     CLog::Log(LOGFATAL, s_line);
158
159     Py_INCREF(Py_None);
160     return Py_None;
161   }
162
163   // shutdown() method
164   PyDoc_STRVAR(shutdown__doc__,
165     "shutdown() -- Shutdown the xbox.\n"
166     "\n"
167     "example:\n"
168     "  - xbmc.shutdown()\n");
169
170   PyObject* XBMC_Shutdown(PyObject *self, PyObject *args)
171   {
172     ThreadMessage tMsg = {TMSG_SHUTDOWN};
173     g_applicationMessenger.SendMessage(tMsg);
174
175     Py_INCREF(Py_None);
176     return Py_None;
177   }
178
179   // dashboard() method
180   PyDoc_STRVAR(dashboard__doc__,
181     "dashboard() -- Boot to dashboard as set in My Pograms/General.\n"
182     "\n"
183     "example:\n"
184     "  - xbmc.dashboard()\n");
185
186   PyObject* XBMC_Dashboard(PyObject *self, PyObject *args)
187   {
188     ThreadMessage tMsg = {TMSG_DASHBOARD};
189     g_applicationMessenger.SendMessage(tMsg);
190
191     Py_INCREF(Py_None);
192     return Py_None;
193   }
194
195   // restart() method
196   PyDoc_STRVAR(restart__doc__,
197     "restart() -- Restart the xbox.\n"
198     "\n"
199     "example:\n"
200     "  - xbmc.restart()\n");
201
202   PyObject* XBMC_Restart(PyObject *self, PyObject *args)
203   {
204     ThreadMessage tMsg = {TMSG_RESTART};
205     g_applicationMessenger.SendMessage(tMsg);
206
207     Py_INCREF(Py_None);
208     return Py_None;
209   }
210
211   // executescript() method
212   PyDoc_STRVAR(executeScript__doc__,
213     "executescript(script) -- Execute a python script.\n"
214     "\n"
215     "script         : string - script filename to execute.\n"
216     "\n"
217     "example:\n"
218     "  - xbmc.executescript('q:\\\\scripts\\\\update.py')\n");
219
220   PyObject* XBMC_ExecuteScript(PyObject *self, PyObject *args)
221   {
222     char *cLine = NULL;
223     if (!PyArg_ParseTuple(args, "s", &cLine)) return NULL;
224
225     ThreadMessage tMsg = {TMSG_EXECUTE_SCRIPT};
226     tMsg.strParam = cLine;
227     g_applicationMessenger.SendMessage(tMsg);
228
229     Py_INCREF(Py_None);
230     return Py_None;
231   }
232
233   // executebuiltin() method
234   PyDoc_STRVAR(executeBuiltIn__doc__,
235     "executebuiltin(function) -- Execute a built in XBMC function.\n"
236     "\n"
237     "function       : string - builtin function to execute.\n"
238     "\n"
239     "List of functions - http://www.xbmc.xbox-scene.com/wiki/index.php?title=List_of_Built_In_Functions \n"
240     "\n"
241     "example:\n"
242     "  - xbmc.executebuiltin('XBMC.RunXBE(c:\\\\avalaunch.xbe)')\n");
243
244   PyObject* XBMC_ExecuteBuiltIn(PyObject *self, PyObject *args)
245   {
246     char *cLine = NULL;
247     if (!PyArg_ParseTuple(args, "s", &cLine)) return NULL;
248
249     g_applicationMessenger.ExecBuiltIn(cLine);
250
251     Py_INCREF(Py_None);
252     return Py_None;
253   }
254
255   // executehttpapi() method
256   PyDoc_STRVAR(executeHttpApi__doc__,
257     "executehttpapi(httpcommand) -- Execute an HTTP API command.\n"
258     "\n"
259     "httpcommand    : string - http command to execute.\n"
260     "\n"
261     "List of commands - http://www.xbmc.xbox-scene.com/wiki/index.php?title=WebServerHTTP-API#The_Commands \n"
262     "\n"
263     "example:\n"
264     "  - response = xbmc.executehttpapi('TakeScreenShot(q:\\\\test.jpg,0,false,200,-1,90)')\n");
265
266    PyObject* XBMC_ExecuteHttpApi(PyObject *self, PyObject *args)
267   {
268     char *cLine = NULL;
269     CStdString ret;
270     if (!PyArg_ParseTuple(args, "s", &cLine)) return NULL;
271     if (!pXbmcHttpShim)
272     {
273       pXbmcHttpShim = new CXbmcHttpShim();
274       if (!pXbmcHttpShim)
275         return NULL;
276     }
277     ret=pXbmcHttpShim->xbmcExternalCall(cLine);
278
279     return PyString_FromString(ret.c_str());
280   }
281
282   // sleep() method
283   PyDoc_STRVAR(sleep__doc__,
284     "sleep(time) -- Sleeps for 'time' msec.\n"
285     "\n"
286     "time           : integer - number of msec to sleep.\n"
287     "\n"
288     "*Note, This is useful if you have for example a Player class that is waiting\n"
289     "       for onPlayBackEnded() calls.\n"
290     "\n"
291     "Throws: PyExc_TypeError, if time is not an integer.\n"
292     "\n"
293     "example:\n"
294     "  - xbmc.sleep(2000) # sleeps for 2 seconds\n");
295
296   PyObject* XBMC_Sleep(PyObject *self, PyObject *args)
297   {
298     PyObject *pObject;
299     if (!PyArg_ParseTuple(args, "O", &pObject)) return NULL;
300     if (!PyInt_Check(pObject))
301     {
302       PyErr_Format(PyExc_TypeError, "argument must be a bool(integer) value");
303       return NULL;
304     }
305
306     long i = PyInt_AsLong(pObject);
307     //while(i != 0)
308     //{
309       Py_BEGIN_ALLOW_THREADS
310       Sleep(i);//(500);
311       Py_END_ALLOW_THREADS
312
313       Py_MakePendingCalls();
314       //i = PyInt_AsLong(pObject);
315     //}
316
317     Py_INCREF(Py_None);
318     return Py_None;
319   }
320
321   // getLocalizedString() method
322   PyDoc_STRVAR(getLocalizedString__doc__,
323     "getLocalizedString(id) -- Returns a localized 'unicode string'.\n"
324     "\n"
325     "id             : integer - id# for string you want to localize.\n"
326     "\n"
327     "*Note, See strings.xml in \\language\\{yourlanguage}\\ for which id\n"
328     "       you need for a string.\n"
329     "\n"
330     "example:\n"
331     "  - locstr = xbmc.getLocalizedString(6)\n");
332
333   PyObject* XBMC_GetLocalizedString(PyObject *self, PyObject *args)
334   {
335     int iString;
336     if (!PyArg_ParseTuple(args, "i", &iString)) return NULL;
337
338     CStdStringW unicodeLabel;
339     g_charsetConverter.utf8ToUTF16(g_localizeStrings.Get(iString), unicodeLabel);
340
341     return Py_BuildValue("u", unicodeLabel.c_str());
342   }
343
344   // getSkinDir() method
345   PyDoc_STRVAR(getSkinDir__doc__,
346     "getSkinDir() -- Returns the active skin directory as a string.\n"
347     "\n"
348     "*Note, This is not the full path like 'q:\\skins\\MediaCenter', but only 'MediaCenter'.\n"
349     "\n"
350     "example:\n"
351     "  - skindir = xbmc.getSkinDir()\n");
352
353   PyObject* XBMC_GetSkinDir(PyObject *self, PyObject *args)
354   {
355     return PyString_FromString(g_guiSettings.GetString("lookandfeel.skin"));
356   }
357
358   // getLanguage() method
359   PyDoc_STRVAR(getLanguage__doc__,
360     "getLanguage() -- Returns the active language as a string.\n"
361     "\n"
362     "example:\n"
363     "  - language = xbmc.getLanguage()\n");
364
365   PyObject* XBMC_GetLanguage(PyObject *self, PyObject *args)
366   {
367     return PyString_FromString(g_guiSettings.GetString("locale.language"));
368   }
369
370   // getIPAddress() method
371   PyDoc_STRVAR(getIPAddress__doc__,
372     "getIPAddress() -- Returns the current ip address as a string.\n"
373     "\n"
374     "example:\n"
375     "  - ip = xbmc.getIPAddress()\n");
376
377   PyObject* XBMC_GetIPAddress(PyObject *self, PyObject *args)
378   {
379     char cTitleIP[32];
380 #ifdef HAS_XBOX_NETWORK
381     XNADDR xna;
382     XNetGetTitleXnAddr(&xna);
383     XNetInAddrToString(xna.ina, cTitleIP, 32);
384 #else
385     sprintf(cTitleIP, "127.0.0.1");
386 #endif
387     return PyString_FromString(cTitleIP);
388   }
389
390   // getDVDState() method
391   PyDoc_STRVAR(getDVDState__doc__,
392     "getDVDState() -- Returns the dvd state as an integer.\n"
393     "\n"
394     "return values are:\n"
395     "   1 : xbmc.DRIVE_NOT_READY\n"
396     "  16 : xbmc.TRAY_OPEN\n"
397     "  64 : xbmc.TRAY_CLOSED_NO_MEDIA\n"
398     "  96 : xbmc.TRAY_CLOSED_MEDIA_PRESENT\n"
399     "\n"
400     "example:\n"
401     "  - dvdstate = xbmc.getDVDState()\n");
402
403   PyObject* XBMC_GetDVDState(PyObject *self, PyObject *args)
404   {
405     return PyInt_FromLong(CIoSupport::GetTrayState());
406   }
407
408   // getFreeMem() method
409   PyDoc_STRVAR(getFreeMem__doc__,
410     "getFreeMem() -- Returns the amount of free memory in MB as an integer.\n"
411     "\n"
412     "example:\n"
413     "  - freemem = xbmc.getFreeMem()\n");
414
415   PyObject* XBMC_GetFreeMem(PyObject *self, PyObject *args)
416   {
417     MEMORYSTATUS stat;
418     GlobalMemoryStatus(&stat);
419     return PyInt_FromLong( stat.dwAvailPhys  / ( 1024 * 1024 ) );
420   }
421
422   // getCpuTemp() method
423   // ## Doesn't work right, use getInfoLabel('System.CPUTemperature') instead.
424   /*PyDoc_STRVAR(getCpuTemp__doc__,
425     "getCpuTemp() -- Returns the current cpu temperature as an integer.\n"
426     "\n"
427     "example:\n"
428     "  - cputemp = xbmc.getCpuTemp()\n");
429
430   PyObject* XBMC_GetCpuTemp(PyObject *self, PyObject *args)
431   {
432     unsigned short cputemp;
433     unsigned short cpudec;
434
435     _outp(0xc004, (0x4c<<1)|0x01);
436     _outp(0xc008, 0x01);
437     _outpw(0xc000, _inpw(0xc000));
438     _outp(0xc002, (0) ? 0x0b : 0x0a);
439     while ((_inp(0xc000) & 8));
440     cputemp = _inpw(0xc006);
441
442     _outp(0xc004, (0x4c<<1)|0x01);
443     _outp(0xc008, 0x10);
444     _outpw(0xc000, _inpw(0xc000));
445     _outp(0xc002, (0) ? 0x0b : 0x0a);
446     while ((_inp(0xc000) & 8));
447     cpudec = _inpw(0xc006);
448
449     if (cpudec<10) cpudec = cpudec * 100;
450     if (cpudec<100) cpudec = cpudec *10;
451
452     return PyInt_FromLong((long)(cputemp + cpudec / 1000.0f));
453   }*/
454
455   // getInfolabel() method
456   PyDoc_STRVAR(getInfoLabel__doc__,
457     "getInfoLabel(infotag) -- Returns an InfoLabel as a string.\n"
458     "\n"
459     "infotag        : string - infoTag for value you want returned.\n"
460     "\n"
461     "List of InfoTags - http://www.xbmc.xbox-scene.com/wiki/index.php?title=InfoLabels \n"
462     "\n"
463     "example:\n"
464     "  - label = xbmc.getInfoLabel('Weather.Conditions')\n");
465
466   PyObject* XBMC_GetInfoLabel(PyObject *self, PyObject *args)
467   {
468     char *cLine;
469     if (!PyArg_ParseTuple(args, "s", &cLine)) return NULL;
470
471     int ret = g_infoManager.TranslateString(cLine);
472     return Py_BuildValue("s", g_infoManager.GetLabel(ret).c_str());
473   }
474
475   // getInfoImage() method
476   PyDoc_STRVAR(getInfoImage__doc__,
477     "getInfoImage(infotag) -- Returns a filename including path to the InfoImage's\n"
478     "                         thumbnail as a string.\n"
479     "\n"
480     "infotag        : string - infotag for value you want returned.\n"
481     "\n"
482     "List of InfoTags - http://www.xbmc.xbox-scene.com/wiki/index.php?title=InfoLabels \n"
483     "\n"
484     "example:\n"
485     "  - filename = xbmc.getInfoImage('Weather.Conditions')\n");
486
487   PyObject* XBMC_GetInfoImage(PyObject *self, PyObject *args)
488   {
489     char *cLine = NULL;
490     if (!PyArg_ParseTuple(args, "s", &cLine)) return NULL;
491
492     int ret = g_infoManager.TranslateString(cLine);
493     return Py_BuildValue("s", g_infoManager.GetImage(ret, WINDOW_INVALID).c_str());
494   }
495
496   // playSFX() method
497   PyDoc_STRVAR(playSFX__doc__,
498     "playSFX(filename) -- Plays a wav file by filename\n"
499     "\n"
500     "filename       : string - filename of the wav file to play.\n"
501     "\n"
502     "example:\n"
503     "  - xbmc.playSFX('Q:\\\\scripts\\\\dingdong.wav')\n");
504
505   PyObject* XBMC_PlaySFX(PyObject *self, PyObject *args)
506   {
507     const char *cFile = NULL;
508
509     if (!PyArg_ParseTuple(args, "s", &cFile)) return NULL;
510
511     if (CFile::Exists(cFile))
512     {
513       g_audioManager.PlayPythonSound(cFile);
514     }
515
516     Py_INCREF(Py_None);
517     return Py_None;
518   }
519
520   // enableNavSounds() method
521   PyDoc_STRVAR(enableNavSounds__doc__,
522     "enableNavSounds(yesNo) -- Enables/Disables nav sounds\n"
523     "\n"
524     "yesNo          : integer - enable (True) or disable (False) nav sounds\n"
525     "\n"
526     "example:\n"
527     "  - xbmc.enableNavSounds(True)\n");
528
529   PyObject* XBMC_EnableNavSounds(PyObject *self, PyObject *args)
530   {
531     int yesNo = 1;
532
533     if (!PyArg_ParseTuple(args, "i", &yesNo)) return NULL;
534
535     g_audioManager.Enable(yesNo==1);
536
537     Py_INCREF(Py_None);
538     return Py_None;
539   }
540
541   // getCondVisibility() method
542   PyDoc_STRVAR(getCondVisibility__doc__,
543     "getCondVisibility(condition) -- Returns True (1) or False (0) as a bool.\n"
544     "\n"
545     "condition      : string - condition to check.\n"
546     "\n"
547     "List of Conditions - http://www.xbmc.xbox-scene.com/wiki/index.php?title=List_of_Boolean_Conditions \n"
548     "\n"
549     "*Note, You can combine two (or more) of the above settings by using \"+\" as an AND operator,\n"
550     "\"|\" as an OR operator, \"!\" as a NOT operator, and \"[\" and \"]\" to bracket expressions.\n"
551     "\n"
552     "example:\n"
553     "  - visible = xbmc.getCondVisibility('[System.KaiEnabled + !Skin.String(KAI)]')\n");
554
555   PyObject* XBMC_GetCondVisibility(PyObject *self, PyObject *args)
556   {
557     char *cLine = NULL;
558     if (!PyArg_ParseTuple(args, "s", &cLine)) return NULL;
559
560     PyGUILock();
561     DWORD dwId = m_gWindowManager.GetTopMostModalDialogID();
562     if (dwId == WINDOW_INVALID) DWORD dwId = m_gWindowManager.GetActiveWindow();
563     PyGUIUnlock();
564
565     int ret = g_infoManager.TranslateString(cLine);
566     return Py_BuildValue("b", g_infoManager.GetBool(ret,dwId));
567   }
568
569   // getGlobalIdleTime() method
570   PyDoc_STRVAR(getGlobalIdleTime__doc__,
571     "getGlobalIdleTime() -- Returns the elapsed idle time in seconds as an integer.\n"
572     "\n"
573     "example:\n"
574     "  - t = xbmc.getGlobalIdleTime()");
575
576   PyObject* XBMC_GetGlobalIdleTime(PyObject *self)
577   {
578     return Py_BuildValue("i", g_application.GlobalIdleTime());
579   }
580
581   // getCacheThumbName function
582   PyDoc_STRVAR(getCacheThumbName__doc__,
583     "getCacheThumbName(path) -- Returns a thumb cache filename.\n"
584     "\n"
585     "path           : string or unicode - path to file\n"
586     "\n"
587     "example:\n"
588     "  - thumb = xbmc.getCacheThumbName('f:\\\\videos\\\\movie.avi')\n");
589
590   PyObject* XBMC_GetCacheThumbName(PyObject *self, PyObject *args)
591   {
592     PyObject *pObjectText;
593     if (!PyArg_ParseTuple(args, "O", &pObjectText)) return NULL;
594  
595     string strText;
596     if (!PyGetUnicodeString(strText, pObjectText, 1)) return NULL;
597
598     Crc32 crc;
599     CStdString strPath;
600     crc.ComputeFromLowerCase(strText);
601     strPath.Format("%08x.tbn", (unsigned __int32)crc);
602     return Py_BuildValue("s", strPath.c_str());
603   }
604
605   // makeLegalFilename function
606   PyDoc_STRVAR(makeLegalFilename__doc__,
607     "makeLegalFilename(filename[, fatX]) -- Returns a legal filename or path as a string.\n"
608     "\n"
609     "filename       : string - filename/path to make legal\n"
610     "fatX           : [opt] bool - True=Xbox file system(Default)\n"
611     "\n"
612     "*Note, If fatX is true you should pass a full path. If fatX is false only pass\n"
613     "       the basename of the path.\n"
614     "\n"
615     "example:\n"
616     "  - filename = xbmc.makeLegalFilename('F:\\Trailers\\Ice Age: The Meltdown.avi')\n");
617
618   PyObject* XBMC_MakeLegalFilename(PyObject *self, PyObject *args)
619   {
620     char *cFilename = NULL;
621     bool bIsFatX = true;
622     if (!PyArg_ParseTuple(args, "s|b", &cFilename, &bIsFatX)) return NULL;
623
624     CStdString strFilename;
625     strFilename = CUtil::MakeLegalFileName(cFilename,bIsFatX);
626     return Py_BuildValue("s", strFilename.c_str());
627   }
628
629   // translatePath function
630   PyDoc_STRVAR(translatePath__doc__,
631     "translatePath(path) -- Returns the translated path.\n"
632     "\n"
633     "path           : string or unicode - Path to format\n"
634     "\n"
635     "*Note, Only useful if you are coding for both Linux and the Xbox.\n"
636     "       e.g. Converts 'T:\\script_data' -> '/home/user/XBMC/UserData/script_data'\n"
637     "       on Linux. Would return 'T:\\script_data' on the Xbox.\n"
638     "\n"
639     "example:\n"
640     "  - fpath = xbmc.translatePath('T:\\script_data')\n");
641
642   PyObject* XBMC_TranslatePath(PyObject *self, PyObject *args)
643   {
644     PyObject *pObjectText;
645     if (!PyArg_ParseTuple(args, "O", &pObjectText)) return NULL;
646
647     CStdString strText;
648     if (!PyGetUnicodeString(strText, pObjectText, 1)) return NULL;
649
650     CStdString strPath;
651     strPath = strText;
652
653     return Py_BuildValue("s", strPath.c_str());
654   }
655
656   // define c functions to be used in python here
657   PyMethodDef xbmcMethods[] = {
658     {"output", (PyCFunction)XBMC_Output, METH_VARARGS, output__doc__},
659     {"log", (PyCFunction)XBMC_Log, METH_VARARGS, log__doc__},
660     {"executescript", (PyCFunction)XBMC_ExecuteScript, METH_VARARGS, executeScript__doc__},
661     {"executebuiltin", (PyCFunction)XBMC_ExecuteBuiltIn, METH_VARARGS, executeBuiltIn__doc__},
662     {"setDirectoryEntry", (PyCFunction)XBMC_setDirectoryEntry, METH_VARARGS|METH_KEYWORDS, setDirectoryEntry__doc__},
663     {"endOfDirectory", (PyCFunction)XBMC_endOfDirectory, METH_VARARGS|METH_KEYWORDS, endOfDirectory__doc__},
664     {"sleep", (PyCFunction)XBMC_Sleep, METH_VARARGS, sleep__doc__},
665     {"shutdown", (PyCFunction)XBMC_Shutdown, METH_VARARGS, shutdown__doc__},
666     {"dashboard", (PyCFunction)XBMC_Dashboard, METH_VARARGS, dashboard__doc__},
667     {"restart", (PyCFunction)XBMC_Restart, METH_VARARGS, restart__doc__},
668     {"getSkinDir", (PyCFunction)XBMC_GetSkinDir, METH_VARARGS, getSkinDir__doc__},
669     {"getLocalizedString", (PyCFunction)XBMC_GetLocalizedString, METH_VARARGS, getLocalizedString__doc__},
670
671     {"getLanguage", (PyCFunction)XBMC_GetLanguage, METH_VARARGS, getLanguage__doc__},
672     {"getIPAddress", (PyCFunction)XBMC_GetIPAddress, METH_VARARGS, getIPAddress__doc__},
673     {"getDVDState", (PyCFunction)XBMC_GetDVDState, METH_VARARGS, getDVDState__doc__},
674     {"getFreeMem", (PyCFunction)XBMC_GetFreeMem, METH_VARARGS, getFreeMem__doc__},
675     //{"getCpuTemp", (PyCFunction)XBMC_GetCpuTemp, METH_VARARGS, getCpuTemp__doc__},
676
677     {"executehttpapi", (PyCFunction)XBMC_ExecuteHttpApi, METH_VARARGS, executeHttpApi__doc__},
678     {"getInfoLabel", (PyCFunction)XBMC_GetInfoLabel, METH_VARARGS, getInfoLabel__doc__},
679     {"getInfoImage", (PyCFunction)XBMC_GetInfoImage, METH_VARARGS, getInfoImage__doc__},
680     {"getCondVisibility", (PyCFunction)XBMC_GetCondVisibility, METH_VARARGS, getCondVisibility__doc__},
681     {"getGlobalIdleTime", (PyCFunction)XBMC_GetGlobalIdleTime, METH_VARARGS, getGlobalIdleTime__doc__},
682
683     {"playSFX", (PyCFunction)XBMC_PlaySFX, METH_VARARGS, playSFX__doc__},
684     {"enableNavSounds", (PyCFunction)XBMC_EnableNavSounds, METH_VARARGS, enableNavSounds__doc__},
685
686     {"getCacheThumbName", (PyCFunction)XBMC_GetCacheThumbName, METH_VARARGS, getCacheThumbName__doc__},
687
688     {"makeLegalFilename", (PyCFunction)XBMC_MakeLegalFilename, METH_VARARGS, makeLegalFilename__doc__},
689     {"translatePath", (PyCFunction)XBMC_TranslatePath, METH_VARARGS, translatePath__doc__},
690     {NULL, NULL, 0, NULL}
691   };
692
693 /*****************************************************************
694  * end of methods and python objects
695  * initxbmc(void);
696  *****************************************************************/
697
698   PyMODINIT_FUNC
699   initxbmc(void)
700   {
701     // init general xbmc modules
702     PyObject* pXbmcModule;
703
704     initKeyboard_Type();
705     initPlayer_Type();
706     initPlayList_Type();
707     initPlayListItem_Type();
708     initInfoTagMusic_Type();
709     initInfoTagVideo_Type();
710
711     if (PyType_Ready(&Keyboard_Type) < 0 ||
712         PyType_Ready(&Player_Type) < 0 ||
713         PyType_Ready(&PlayList_Type) < 0 ||
714         PyType_Ready(&PlayListItem_Type) < 0 ||
715         PyType_Ready(&InfoTagMusic_Type) < 0 ||
716         PyType_Ready(&InfoTagVideo_Type) < 0) return;
717
718     Py_INCREF(&Keyboard_Type);
719     Py_INCREF(&Player_Type);
720     Py_INCREF(&PlayList_Type);
721     Py_INCREF(&PlayListItem_Type);
722     Py_INCREF(&InfoTagMusic_Type);
723     Py_INCREF(&InfoTagVideo_Type);
724     pXbmcModule = Py_InitModule("xbmc", xbmcMethods);
725     if (pXbmcModule == NULL) return;
726         
727         PyModule_AddObject(pXbmcModule, "Keyboard", (PyObject*)&Keyboard_Type);
728     PyModule_AddObject(pXbmcModule, "Player", (PyObject*)&Player_Type);
729     PyModule_AddObject(pXbmcModule, "PlayList", (PyObject*)&PlayList_Type);
730     PyModule_AddObject(pXbmcModule, "PlayListItem", (PyObject*)&PlayListItem_Type);
731     PyModule_AddObject(pXbmcModule, "InfoTagMusic", (PyObject*)&InfoTagMusic_Type);
732     PyModule_AddObject(pXbmcModule, "InfoTagVideo", (PyObject*)&InfoTagVideo_Type);
733
734     // constants
735     PyModule_AddStringConstant(pXbmcModule, "__author__", PY_XBMC_AUTHOR);
736     PyModule_AddStringConstant(pXbmcModule, "__date__", "15 November 2005");
737     PyModule_AddStringConstant(pXbmcModule, "__version__", "1.3");
738     PyModule_AddStringConstant(pXbmcModule, "__credits__", PY_XBMC_CREDITS);
739     PyModule_AddStringConstant(pXbmcModule, "__platform__", PY_XBMC_PLATFORM);
740
741     // playlist constants
742     PyModule_AddIntConstant(pXbmcModule, "PLAYLIST_MUSIC", PLAYLIST_MUSIC);
743     //PyModule_AddIntConstant(pXbmcModule, "PLAYLIST_MUSIC_TEMP", PLAYLIST_MUSIC_TEMP);
744     PyModule_AddIntConstant(pXbmcModule, "PLAYLIST_VIDEO", PLAYLIST_VIDEO);
745     //PyModule_AddIntConstant(pXbmcModule, "PLAYLIST_VIDEO_TEMP", PLAYLIST_VIDEO_TEMP);
746
747     // player constants
748     PyModule_AddIntConstant(pXbmcModule, "PLAYER_CORE_AUTO", EPC_NONE);
749     PyModule_AddIntConstant(pXbmcModule, "PLAYER_CORE_DVDPLAYER", EPC_DVDPLAYER);
750     PyModule_AddIntConstant(pXbmcModule, "PLAYER_CORE_MPLAYER", EPC_MPLAYER);
751     PyModule_AddIntConstant(pXbmcModule, "PLAYER_CORE_PAPLAYER", EPC_PAPLAYER);
752     PyModule_AddIntConstant(pXbmcModule, "PLAYER_CORE_MODPLAYER", EPC_MODPLAYER);
753
754     // dvd state constants
755     PyModule_AddIntConstant(pXbmcModule, "TRAY_OPEN", TRAY_OPEN);
756     PyModule_AddIntConstant(pXbmcModule, "DRIVE_NOT_READY", DRIVE_NOT_READY);
757     PyModule_AddIntConstant(pXbmcModule, "TRAY_CLOSED_NO_MEDIA", TRAY_CLOSED_NO_MEDIA);
758     PyModule_AddIntConstant(pXbmcModule, "TRAY_CLOSED_MEDIA_PRESENT", TRAY_CLOSED_MEDIA_PRESENT);
759   }
760 }
761
762 #ifdef __cplusplus
763 }
764 #endif