Advertisement
Guest User

IRserver XBMC module source

a guest
Mar 14th, 2015
432
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 8.99 KB | None | 0 0
  1. /*
  2. * Copyright (c) 2007, IRTrans GmbH
  3. * All rights reserved.
  4. *
  5. * Redistribution and use in source and binary forms, with or without
  6. * modification, are permitted provided that the following conditions are met:
  7. * * Redistributions of source code must retain the above copyright
  8. * notice, this list of conditions and the following disclaimer.
  9. * * Redistributions in binary form must reproduce the above copyright
  10. * notice, this list of conditions and the following disclaimer in the
  11. * documentation and/or other materials provided with the distribution.
  12. * * Neither the name of IRTrans GmbH nor the
  13. * names of its contributors may be used to endorse or promote products
  14. * derived from this software without specific prior written permission.
  15. *
  16. * THIS SOFTWARE IS PROVIDED BY IRTrans GmbH ``AS IS'' AND ANY
  17. * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
  18. * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
  19. * DISCLAIMED. IN NO EVENT SHALL IRTrans GmbH BE LIABLE FOR ANY
  20. * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
  21. * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
  22. * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
  23. * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  24. * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
  25. * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  26. */
  27.  
  28.  
  29.  
  30. #ifdef WIN32
  31.  
  32. #define _WIN32_WINNT 0x501
  33.  
  34. #ifndef VC6
  35. #include "winsock2.h"
  36. #endif
  37.  
  38. #include <windows.h>
  39. #include <winuser.h>
  40. #include <io.h>
  41. #include <direct.h>
  42. #include <stdio.h>
  43. #include <sys/timeb.h>
  44. #include <tlhelp32.h>
  45.  
  46. #endif
  47.  
  48. #include <stdio.h>
  49.  
  50. #ifdef LINUX
  51.  
  52. #include <stdlib.h>
  53. #include <sys/types.h>
  54. #include <sys/socket.h>
  55. #include <netinet/in.h>
  56. #include <sys/un.h>
  57. #include <arpa/inet.h>
  58. #include <dirent.h>
  59. #include <sys/stat.h>
  60. #include <errno.h>
  61. #include <fcntl.h>
  62. #include <signal.h>
  63. #include <stdint.h>
  64.  
  65. typedef int DWORD;
  66. #define closesocket close
  67.  
  68. #endif
  69.  
  70.  
  71. #include "remote.h"
  72. #include "global.h"
  73. #include "network.h"
  74. #include "lowlevel.h"
  75. #include "dbstruct.h"
  76.  
  77.  
  78.  
  79.  
  80. #define BTN_USE_NAME 0x01
  81. #define BTN_DOWN 0x02
  82. #define BTN_UP 0x04
  83. #define BTN_USE_AMOUNT 0x08
  84. #define BTN_QUEUE 0x10
  85. #define BTN_NO_REPEAT 0x20
  86. #define BTN_VKEY 0x40
  87. #define BTN_AXIS 0x80
  88.  
  89. #define PT_HELO 0x01
  90. #define PT_BYE 0x02
  91. #define PT_BUTTON 0x03
  92. #define PT_MOUSE 0x04
  93. #define PT_PING 0x05
  94. #define PT_BROADCAST 0x06
  95. #define PT_NOTIFICATION 0x07
  96. #define PT_BLOB 0x08
  97. #define PT_LOG 0x09
  98. #define PT_ACTION 0x0A
  99. #define PT_DEBUG 0xFF
  100.  
  101. #define ICON_NONE 0x00
  102. #define ICON_JPEG 0x01
  103. #define ICON_PNG 0x02
  104. #define ICON_GIF 0x03
  105.  
  106. #define MAX_PACKET_SIZE 1024
  107. #define HEADER_SIZE 32
  108. #define MAX_PAYLOAD_SIZE (MAX_PACKET_SIZE - HEADER_SIZE)
  109.  
  110. #define MAJOR_VERSION 2
  111. #define MINOR_VERSION 0
  112.  
  113. extern byte xbmc_mode;
  114.  
  115. #define ACTION_EXECBUILTIN 1
  116. #define ACTION_BUTTON 2
  117.  
  118.  
  119.  
  120. DWORD xbmc_pid;
  121. unsigned int xbmc_uid;
  122. unsigned int xbmc_seq;
  123. unsigned long XBMC_last_ping;
  124. int xbmc_remote;
  125. byte xbmc_init;
  126.  
  127. SOCKET xbmc_socket;
  128.  
  129.  
  130.  
  131.  
  132. void XBMC_SendBye ()
  133. {
  134. int res;
  135. byte data[1024];
  136.  
  137. if (!xbmc_init) return;
  138.  
  139. res = BuildXBMCHeader (data,PT_BYE,0);
  140. send (xbmc_socket,(const char *)data,res,0);
  141. }
  142.  
  143. void XBMC_SendPing ()
  144. {
  145. int res;
  146. byte data[1024];
  147.  
  148. if (!xbmc_init) return;
  149.  
  150. res = BuildXBMCHeader (data,PT_PING,0);
  151. send (xbmc_socket,(const char *)data,res,0);
  152.  
  153. XBMC_last_ping = time (0);
  154. }
  155.  
  156. void StartXBMC (APP *app)
  157. {
  158. int i;
  159. char *progdir;
  160. char prog[1024],appname[1024];
  161. if (!xbmc_mode) return;
  162.  
  163. if (xbmc_init) closesocket (xbmc_socket);
  164. xbmc_init = 0;
  165. xbmc_pid = 0;
  166.  
  167. #ifdef WIN32
  168. if (app->appname[0] == '%') {
  169. strcpy (appname,app->appname);
  170. i = 1;
  171. while (appname[i] && appname[i] != '%') i++;
  172. appname[i++] = 0;
  173. progdir = getenv (appname + 1);
  174. if (!progdir) progdir = getenv ("ProgramFiles");
  175. if (!progdir) return;
  176. sprintf (prog,"%s%s",progdir,appname+i);
  177. }
  178. else strcpy (prog,app->appname);
  179.  
  180. WinExec (prog,SW_SHOWMAXIMIZED);
  181. #endif
  182.  
  183. #ifdef LINUX
  184. system (app->appname);
  185. #endif
  186.  
  187. }
  188.  
  189.  
  190. #ifdef WIN32
  191.  
  192. byte XBMC_CheckRunning (void)
  193. {
  194. HANDLE pHandle;
  195.  
  196. pHandle = OpenProcess(PROCESS_QUERY_INFORMATION, FALSE, xbmc_pid);
  197.  
  198. if (pHandle == NULL) {
  199. xbmc_pid = 0;
  200. return (0);
  201. }
  202.  
  203. CloseHandle(pHandle);
  204.  
  205. return (1);
  206. }
  207.  
  208. DWORD XBMC_GetPID (void)
  209. {
  210. HANDLE hProcessSnap;
  211. PROCESSENTRY32 peStruct;
  212.  
  213. xbmc_pid = 0;
  214.  
  215. hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
  216. if(hProcessSnap == INVALID_HANDLE_VALUE) return (0);
  217.  
  218. peStruct.dwSize = sizeof(PROCESSENTRY32);
  219.  
  220. if(Process32First(hProcessSnap, &peStruct) == FALSE){
  221. CloseHandle(hProcessSnap);
  222. return (0);
  223. }
  224.  
  225. do {
  226. if (!strcmp (peStruct.szExeFile,"xbmc.exe") || !strcmp (peStruct.szExeFile,"XBMC.exe") || !strcmp (peStruct.szExeFile,"XBMC.EXE")) {
  227. xbmc_pid = peStruct.th32ProcessID;
  228. break;
  229. }
  230. }
  231. while(Process32Next(hProcessSnap, &peStruct));
  232.  
  233. CloseHandle(hProcessSnap);
  234.  
  235. return xbmc_pid;
  236. }
  237.  
  238. #endif
  239.  
  240.  
  241.  
  242. #ifdef LINUX
  243.  
  244. byte XBMC_CheckRunning (void)
  245. {
  246. if (kill (xbmc_pid,0)) {
  247. xbmc_pid = 0;
  248. return (0);
  249. }
  250. return (1);
  251. }
  252.  
  253. DWORD XBMC_GetPID (void)
  254. {
  255. int i;
  256. char ln[200];
  257. FILE *fp;
  258.  
  259. xbmc_pid = 0;
  260.  
  261. fp = popen( "ps aux|grep -v grep|grep -i xbmc.bin", "r");
  262.  
  263. fgets (ln,sizeof (ln),fp);
  264.  
  265. pclose (fp);
  266.  
  267. i = 0;
  268. while (ln[i] && ln[i] != ' ' && ln[i] != '\t') i++;
  269.  
  270. if (!ln[i]) return;
  271.  
  272. while (ln[i] == ' ' || ln[i] == '\t') i++;
  273.  
  274. if (!ln[i]) return;
  275.  
  276. xbmc_pid = atoi (ln + i);
  277.  
  278. printf ("PID: %d\n",xbmc_pid);
  279.  
  280. return xbmc_pid;
  281. }
  282.  
  283. #endif
  284.  
  285.  
  286.  
  287.  
  288. void SendXBMC (APPCOMMAND *appcom)
  289. {
  290. int res;
  291. byte data[1024];
  292.  
  293. if (!xbmc_mode) return;
  294.  
  295. if (!xbmc_init || !XBMC_CheckRunning ()) {
  296. res = InitXBMC ();
  297. if (res) return;
  298. }
  299.  
  300. res = 0;
  301.  
  302. if (appcom->type[0] == TYPE_STR || appcom->type[0] == TYPE_XBMC_BUTTON) {
  303. res = BuildXBMCKey (data,appcom->function.name);
  304. }
  305. else if (appcom->type[0] == TYPE_XBMC_ACTION) {
  306. res = BuildXBMCAction (data,ACTION_BUTTON,appcom->function.name);
  307. }
  308. else if (appcom->type[0] == TYPE_XBMC_ACTION_BUILTIN) {
  309. res = BuildXBMCAction (data,ACTION_EXECBUILTIN,appcom->function.name);
  310. }
  311.  
  312. if (!res) return;
  313.  
  314. send (xbmc_socket,(const char *)data,res,0);
  315.  
  316. XBMC_last_ping = time (0);
  317. }
  318.  
  319.  
  320. int InitXBMC (void)
  321. {
  322. int res;
  323. byte data[1024];
  324. struct sockaddr_in serv_addr;
  325.  
  326. if (!xbmc_mode) return (1);
  327.  
  328. if (!XBMC_GetPID ()) return (1);
  329.  
  330. xbmc_socket = socket (PF_INET,SOCK_DGRAM,0);
  331. if (xbmc_socket < 0) return (1);
  332.  
  333. memset (&serv_addr,0,sizeof (serv_addr));
  334. serv_addr.sin_family = AF_INET;
  335.  
  336. serv_addr.sin_addr.s_addr = inet_addr ("127.0.0.1");
  337. serv_addr.sin_port = htons ((word)9777);
  338.  
  339. res = connect (xbmc_socket,(struct sockaddr *)&serv_addr,sizeof (serv_addr));
  340. if (res) return (res);
  341.  
  342. xbmc_uid = time (0);
  343.  
  344. res = BuildXBMCHelo (data,"IRTrans Server");
  345. send (xbmc_socket,(const char *)data,res,0);
  346.  
  347. xbmc_init = 1;
  348.  
  349. XBMC_last_ping = time (0);
  350.  
  351. return (0);
  352. }
  353.  
  354.  
  355. int BuildXBMCHeader (byte *data,short type,int payload_len)
  356. {
  357. unsigned short u16;
  358. unsigned int u32;
  359.  
  360. memset (data,0,HEADER_SIZE + payload_len);
  361.  
  362. memcpy (data + 0,"XBMC",4); // Signature
  363.  
  364. data[4] = MAJOR_VERSION; // Major Version
  365. data[5] = MINOR_VERSION; // Minor Version
  366.  
  367. u16 = htons (type);
  368. memcpy (data + 6,&u16,2); // Packet Type
  369.  
  370. u32 = htonl (xbmc_seq++);
  371. memcpy (data + 8,&u32,4); // SEQ Number
  372.  
  373. u32 = htonl (1);
  374. memcpy (data + 12,&u32,4); // Number of packets
  375.  
  376. u16 = htons ((word)payload_len);
  377. memcpy (data + 16,&u16,2); // LEN of Payload
  378.  
  379. u32 = htonl (xbmc_uid);
  380. memcpy (data + 18,&u32,4); // UID
  381.  
  382. return (payload_len + HEADER_SIZE);
  383. }
  384.  
  385.  
  386. int BuildXBMCHelo (byte *data,char *name)
  387. {
  388. int len;
  389.  
  390. len = BuildXBMCHeader (data,PT_HELO,strlen (name) + 12);
  391.  
  392. strcpy ((char *)data + HEADER_SIZE,name);
  393.  
  394. return (len);
  395. }
  396.  
  397.  
  398. int BuildXBMCAction (byte *data,byte type,char *action)
  399. {
  400. int len;
  401. unsigned short u16;
  402.  
  403. len = BuildXBMCHeader (data,PT_ACTION,strlen (action) + 2);
  404. data[HEADER_SIZE] = type;
  405. strcpy ((char *)data + HEADER_SIZE + 1,action);
  406.  
  407. return (len);
  408. }
  409.  
  410.  
  411. int BuildXBMCKey (byte *data,char *button)
  412. {
  413. int len;
  414. unsigned short u16;
  415.  
  416. len = BuildXBMCHeader (data,PT_BUTTON,strlen (button) + 10);
  417.  
  418.  
  419. u16 = htons (0);
  420. memcpy (data + HEADER_SIZE + 0,&u16,2); // Button Code
  421.  
  422. u16 = htons (0x2b);
  423. memcpy (data + HEADER_SIZE + 2,&u16,2); // Flags
  424.  
  425. u16 = htons (0);
  426. memcpy (data + HEADER_SIZE + 4,&u16,2); // Amount
  427.  
  428. strcpy ((char *)data + HEADER_SIZE + 6,"R1"); // Device Map
  429.  
  430. strcpy ((char *)data + HEADER_SIZE + 9,button); // Button Name
  431.  
  432. return (len);
  433. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement