26 #include <sys/types.h> 30 #include <sys/socket.h> 31 #include <netinet/in.h> 33 #include <arpa/inet.h> 42 #define MS_ABSOLUTE 0x01 45 #define BTN_USE_NAME 0x01 48 #define BTN_USE_AMOUNT 0x08 49 #define BTN_QUEUE 0x10 50 #define BTN_NO_REPEAT 0x20 56 #define PT_BUTTON 0x03 59 #define PT_BROADCAST 0x06 60 #define PT_NOTIFICATION 0x07 63 #define PT_ACTION 0x0A 66 #define ICON_NONE 0x00 67 #define ICON_JPEG 0x01 71 #define MAX_PACKET_SIZE 1024 72 #define HEADER_SIZE 32 73 #define MAX_PAYLOAD_SIZE (MAX_PACKET_SIZE - HEADER_SIZE) 75 #define MAJOR_VERSION 2 76 #define MINOR_VERSION 0 87 #define ACTION_EXECBUILTIN 0x01 88 #define ACTION_BUTTON 0x02 93 struct sockaddr_in m_Addr;
97 m_Addr.sin_family = AF_INET;
98 m_Addr.sin_port = htons(Port);
99 m_Addr.sin_addr.s_addr = INADDR_ANY;
100 memset(m_Addr.sin_zero,
'\0',
sizeof m_Addr.sin_zero);
103 CAddress(
const char *Address,
int Port = STD_PORT)
105 m_Addr.sin_port = htons(Port);
108 if (Address == NULL || (h=gethostbyname(Address)) == NULL)
111 printf(
"Error: Get host by name\n");
113 m_Addr.sin_addr.s_addr = INADDR_ANY;
114 m_Addr.sin_family = AF_INET;
118 m_Addr.sin_family = h->h_addrtype;
119 m_Addr.sin_addr = *((
struct in_addr *)h->h_addr);
121 memset(m_Addr.sin_zero,
'\0',
sizeof m_Addr.sin_zero);
124 void SetPort(
int port)
126 m_Addr.sin_port = htons(port);
129 const sockaddr *GetAddress()
131 return ((
struct sockaddr *)&m_Addr);
134 bool Bind(
int Sockfd)
136 return (bind(Sockfd, (
struct sockaddr *)&m_Addr,
sizeof m_Addr) == 0);
145 static unsigned int GetUniqueIdentifier()
147 static time_t
id = time(NULL);
158 static bool Initialize()
162 if (WSAStartup(MAKEWORD(1, 1), &wsaData))
201 bool Send(
int Socket,
CAddress &Addr,
unsigned int UID = XBMCClientUtils::GetUniqueIdentifier())
203 if (m_Payload.empty())
205 bool SendSuccessful =
true;
206 int NbrOfPackages = (m_Payload.size() / MAX_PAYLOAD_SIZE) + 1;
209 int Left = m_Payload.size();
210 for (
int Package = 1; Package <= NbrOfPackages; Package++)
212 if (Left > MAX_PAYLOAD_SIZE)
214 Send = MAX_PAYLOAD_SIZE;
223 ConstructHeader(m_PacketType, NbrOfPackages, Package, Send, UID, m_Header);
224 char t[MAX_PACKET_SIZE];
226 for (i = 0; i < 32; i++)
229 for (j = 0; j < Send; j++)
230 t[(32 + j)] = m_Payload[j + Sent];
232 int rtn = sendto(Socket, t, (32 + Send), 0, Addr.GetAddress(),
sizeof(
struct sockaddr));
234 if (rtn != (32 + Send))
235 SendSuccessful =
false;
239 return SendSuccessful;
242 char m_Header[HEADER_SIZE];
243 unsigned short m_PacketType;
245 std::vector<char> m_Payload;
247 static void ConstructHeader(
int PacketType,
int NumberOfPackets,
int CurrentPacket,
unsigned short PayloadSize,
unsigned int UniqueToken,
char *Header)
249 sprintf(Header,
"XBMC");
250 for (
int i = 4; i < HEADER_SIZE; i++)
252 Header[4] = MAJOR_VERSION;
253 Header[5] = MINOR_VERSION;
254 if (CurrentPacket == 1)
256 Header[6] = ((PacketType & 0xff00) >> 8);
257 Header[7] = (PacketType & 0x00ff);
261 Header[6] = ((PT_BLOB & 0xff00) >> 8);
262 Header[7] = (PT_BLOB & 0x00ff);
264 Header[8] = ((CurrentPacket & 0xff000000) >> 24);
265 Header[9] = ((CurrentPacket & 0x00ff0000) >> 16);
266 Header[10] = ((CurrentPacket & 0x0000ff00) >> 8);
267 Header[11] = (CurrentPacket & 0x000000ff);
269 Header[12] = ((NumberOfPackets & 0xff000000) >> 24);
270 Header[13] = ((NumberOfPackets & 0x00ff0000) >> 16);
271 Header[14] = ((NumberOfPackets & 0x0000ff00) >> 8);
272 Header[15] = (NumberOfPackets & 0x000000ff);
274 Header[16] = ((PayloadSize & 0xff00) >> 8);
275 Header[17] = (PayloadSize & 0x00ff);
277 Header[18] = ((UniqueToken & 0xff000000) >> 24);
278 Header[19] = ((UniqueToken & 0x00ff0000) >> 16);
279 Header[20] = ((UniqueToken & 0x0000ff00) >> 8);
280 Header[21] = (UniqueToken & 0x000000ff);
283 virtual void ConstructPayload()
299 std::vector<char> m_DeviceName;
300 unsigned short m_IconType;
302 unsigned short m_IconSize;
304 void ConstructPayload()
override 308 for (
unsigned int i = 0; i < m_DeviceName.size(); i++)
309 m_Payload.push_back(m_DeviceName[i]);
311 m_Payload.push_back(
'\0');
313 m_Payload.push_back(m_IconType);
315 m_Payload.push_back(0);
316 m_Payload.push_back(
'\0');
318 for (
int j = 0; j < 8; j++)
319 m_Payload.push_back(0);
321 for (
int ico = 0; ico < m_IconSize; ico++)
322 m_Payload.push_back(m_IconData[ico]);
325 CPacketHELO(
const char *DevName,
unsigned short IconType,
const char *IconFile = NULL) :
CPacket()
327 m_PacketType = PT_HELO;
329 unsigned int len = strlen(DevName);
330 for (
unsigned int i = 0; i < len; i++)
331 m_DeviceName.push_back(DevName[i]);
333 m_IconType = IconType;
335 if (IconType == ICON_NONE || IconFile == NULL)
342 std::ifstream::pos_type size;
344 std::ifstream file (IconFile, std::ios::in|std::ios::binary|std::ios::ate);
348 m_IconData =
new char [size];
349 file.seekg (0, std::ios::beg);
350 file.read (m_IconData, size);
356 m_IconType = ICON_NONE;
363 m_DeviceName.clear();
379 std::vector<char> m_Title;
380 std::vector<char> m_Message;
381 unsigned short m_IconType;
383 unsigned short m_IconSize;
385 void ConstructPayload()
override 389 for (
unsigned int i = 0; i < m_Title.size(); i++)
390 m_Payload.push_back(m_Title[i]);
392 m_Payload.push_back(
'\0');
394 for (
unsigned int i = 0; i < m_Message.size(); i++)
395 m_Payload.push_back(m_Message[i]);
397 m_Payload.push_back(
'\0');
399 m_Payload.push_back(m_IconType);
401 for (
int i = 0; i < 4; i++)
402 m_Payload.push_back(0);
404 for (
int ico = 0; ico < m_IconSize; ico++)
405 m_Payload.push_back(m_IconData[ico]);
410 m_PacketType = PT_NOTIFICATION;
413 unsigned int len = 0;
417 for (
unsigned int i = 0; i < len; i++)
418 m_Title.push_back(Title[i]);
423 len = strlen(Message);
424 for (
unsigned int i = 0; i < len; i++)
425 m_Message.push_back(Message[i]);
427 m_IconType = IconType;
429 if (IconType == ICON_NONE || IconFile == NULL)
432 std::ifstream::pos_type size;
434 std::ifstream file (IconFile, std::ios::in|std::ios::binary|std::ios::ate);
438 m_IconData =
new char [size];
439 file.seekg (0, std::ios::beg);
440 file.read (m_IconData, size);
445 m_IconType = ICON_NONE;
484 std::vector<char> m_DeviceMap;
485 std::vector<char> m_Button;
486 unsigned short m_ButtonCode;
487 unsigned short m_Amount;
488 unsigned short m_Flags;
490 void ConstructPayload()
override 494 if (m_Button.size() != 0)
496 if (!(m_Flags & BTN_USE_NAME))
497 m_Flags |= BTN_USE_NAME;
505 if (!(m_Flags & BTN_USE_AMOUNT))
506 m_Flags |= BTN_USE_AMOUNT;
508 if (!((m_Flags & BTN_DOWN) || (m_Flags & BTN_UP)))
511 m_Payload.push_back(((m_ButtonCode & 0xff00) >> 8));
512 m_Payload.push_back( (m_ButtonCode & 0x00ff));
514 m_Payload.push_back(((m_Flags & 0xff00) >> 8) );
515 m_Payload.push_back( (m_Flags & 0x00ff));
517 m_Payload.push_back(((m_Amount & 0xff00) >> 8) );
518 m_Payload.push_back( (m_Amount & 0x00ff));
521 for (
unsigned int i = 0; i < m_DeviceMap.size(); i++)
522 m_Payload.push_back(m_DeviceMap[i]);
524 m_Payload.push_back(
'\0');
526 for (
unsigned int i = 0; i < m_Button.size(); i++)
527 m_Payload.push_back(m_Button[i]);
529 m_Payload.push_back(
'\0');
534 m_PacketType = PT_BUTTON;
539 unsigned int len = strlen(DeviceMap);
540 for (
unsigned int i = 0; i < len; i++)
541 m_DeviceMap.push_back(DeviceMap[i]);
543 len = strlen(Button);
544 for (
unsigned int i = 0; i < len; i++)
545 m_Button.push_back(Button[i]);
548 CPacketBUTTON(
unsigned short ButtonCode,
const char *DeviceMap,
unsigned short Flags,
unsigned short Amount = 0) :
CPacket()
550 m_PacketType = PT_BUTTON;
552 m_ButtonCode = ButtonCode;
555 unsigned int len = strlen(DeviceMap);
556 for (
unsigned int i = 0; i < len; i++)
557 m_DeviceMap.push_back(DeviceMap[i]);
560 CPacketBUTTON(
unsigned short ButtonCode,
unsigned short Flags,
unsigned short Amount = 0) :
CPacket()
562 m_PacketType = PT_BUTTON;
564 m_ButtonCode = ButtonCode;
571 m_PacketType = PT_BUTTON;
583 inline unsigned short GetFlags() {
return m_Flags; }
584 inline unsigned short GetButtonCode() {
return m_ButtonCode; }
595 m_PacketType = PT_PING;
608 m_PacketType = PT_BYE;
625 unsigned char m_Flag;
627 CPacketMOUSE(
int X,
int Y,
unsigned char Flag = MS_ABSOLUTE)
629 m_PacketType = PT_MOUSE;
635 void ConstructPayload()
override 639 m_Payload.push_back(m_Flag);
641 m_Payload.push_back(((m_X & 0xff00) >> 8));
642 m_Payload.push_back( (m_X & 0x00ff));
644 m_Payload.push_back(((m_Y & 0xff00) >> 8));
645 m_Payload.push_back( (m_Y & 0x00ff));
659 std::vector<char> m_Message;
660 unsigned char m_LogLevel;
663 CPacketLOG(
int LogLevel,
const char *Message,
bool AutoPrintf =
true)
665 m_PacketType = PT_LOG;
667 unsigned int len = strlen(Message);
668 for (
unsigned int i = 0; i < len; i++)
669 m_Message.push_back(Message[i]);
671 m_LogLevel = LogLevel;
672 m_AutoPrintf = AutoPrintf;
675 void ConstructPayload()
override 679 m_Payload.push_back( (m_LogLevel & 0x00ff) );
683 char* str=&m_Message[0];
686 for (
unsigned int i = 0; i < m_Message.size(); i++)
687 m_Payload.push_back(m_Message[i]);
689 m_Payload.push_back(
'\0');
703 unsigned char m_ActionType;
704 std::vector<char> m_Action;
706 CPacketACTION(
const char *Action,
unsigned char ActionType = ACTION_EXECBUILTIN)
708 m_PacketType = PT_ACTION;
710 m_ActionType = ActionType;
711 unsigned int len = strlen(Action);
712 for (
unsigned int i = 0; i < len; i++)
713 m_Action.push_back(Action[i]);
716 void ConstructPayload()
override 720 m_Payload.push_back(m_ActionType);
721 for (
unsigned int i = 0; i < m_Action.size(); i++)
722 m_Payload.push_back(m_Action[i]);
724 m_Payload.push_back(
'\0');
737 CXBMCClient(
const char *IP =
"127.0.0.1",
int Port = 9777,
int Socket = -1,
unsigned int UID = 0)
741 m_Socket =
socket(AF_INET, SOCK_DGRAM, 0);
748 m_UID = XBMCClientUtils::GetUniqueIdentifier();
751 void SendNOTIFICATION(
const char *Title,
const char *Message,
unsigned short IconType,
const char *IconFile = NULL)
757 notification.Send(m_Socket, m_Addr, m_UID);
760 void SendHELO(
const char *DevName,
unsigned short IconType,
const char *IconFile = NULL)
766 helo.Send(m_Socket, m_Addr, m_UID);
769 void SendButton(
const char *Button,
const char *DeviceMap,
unsigned short Flags,
unsigned short Amount = 0)
775 button.Send(m_Socket, m_Addr, m_UID);
778 void SendButton(
unsigned short ButtonCode,
const char *DeviceMap,
unsigned short Flags,
unsigned short Amount = 0)
784 button.Send(m_Socket, m_Addr, m_UID);
787 void SendButton(
unsigned short ButtonCode,
unsigned Flags,
unsigned short Amount = 0)
793 button.Send(m_Socket, m_Addr, m_UID);
796 void SendMOUSE(
int X,
int Y,
unsigned char Flag = MS_ABSOLUTE)
802 mouse.Send(m_Socket, m_Addr, m_UID);
805 void SendLOG(
int LogLevel,
const char *Message,
bool AutoPrintf =
true)
810 CPacketLOG log(LogLevel, Message, AutoPrintf);
811 log.Send(m_Socket, m_Addr, m_UID);
814 void SendACTION(
const char *ActionMessage,
int ActionType = ACTION_EXECBUILTIN)
820 action.Send(m_Socket, m_Addr, m_UID);
Definition: xbmcclient.h:90
Definition: xbmcclient.h:695
Definition: xbmcclient.h:600
Definition: xbmcclient.h:368
Definition: xbmcclient.h:587
Definition: xbmcclient.h:730
Definition: xbmcclient.h:169
Definition: xbmcclient.h:651
Definition: xbmcclient.h:140
Definition: xbmcclient.h:287
Definition: xbmcclient.h:613
Definition: TestJobManager.cpp:22