c9469b64fc3933d0565ffba8a45be8a39df6b927
Stefan Schuermans added support for creating/...

Stefan Schuermans authored 12 years ago

BlinkenLib/BlinkenProto.c   1) /* BlinkenLib
Stefan Schuermans update email address of author

Stefan Schuermans authored 10 years ago

BlinkenLib/BlinkenProto.c   2)    Copyright 2004-2014 Stefan Schuermans <stefan@schuermans.info>
Stefan Schuermans added support for creating/...

Stefan Schuermans authored 12 years ago

BlinkenLib/BlinkenProto.c   3)    Copyleft GNU public license - http://www.gnu.org/copyleft/gpl.html
BlinkenLib/BlinkenProto.c   4)    a blinkenarea.org project */
BlinkenLib/BlinkenProto.c   5) 
BlinkenLib/BlinkenProto.c   6) #include <string.h>
BlinkenLib/BlinkenProto.c   7) #ifdef WIN32
BlinkenLib/BlinkenProto.c   8) #include <winsock2.h>
BlinkenLib/BlinkenProto.c   9) #include <windows.h>
BlinkenLib/BlinkenProto.c  10) typedef WORD uint16_t;
BlinkenLib/BlinkenProto.c  11) typedef DWORD uint32_t;
BlinkenLib/BlinkenProto.c  12) #else
BlinkenLib/BlinkenProto.c  13) #include <stdint.h>
BlinkenLib/BlinkenProto.c  14) #include <netinet/in.h>
BlinkenLib/BlinkenProto.c  15) #endif
BlinkenLib/BlinkenProto.c  16) 
BlinkenLib/BlinkenProto.c  17) #include <BlinkenLib/BlinkenProto.h>
BlinkenLib/BlinkenProto.c  18) 
Stefan Schuermans restructure directories

Stefan Schuermans authored 5 years ago

src/BlinkenProto.c         19) #include "BlinkenProtoIntern.h"
Stefan Schuermans added support for creating/...

Stefan Schuermans authored 12 years ago

BlinkenLib/BlinkenProto.c  20) 
BlinkenLib/BlinkenProto.c  21) int BlinkenProtoMakePacket(etBlinkenProto proto, etBlinkenPacket packet,
BlinkenLib/BlinkenProto.c  22)                            char *pData, int maxLength)
BlinkenLib/BlinkenProto.c  23) // returns length or -1 on error
BlinkenLib/BlinkenProto.c  24) {
BlinkenLib/BlinkenProto.c  25)   uint32_t magic;
BlinkenLib/BlinkenProto.c  26)   char *body;
BlinkenLib/BlinkenProto.c  27)   int len;
BlinkenLib/BlinkenProto.c  28) 
BlinkenLib/BlinkenProto.c  29)   magic = 0;
BlinkenLib/BlinkenProto.c  30)   len = -1;
BlinkenLib/BlinkenProto.c  31) 
BlinkenLib/BlinkenProto.c  32)   // info packet processing: body identical for all protocols
BlinkenLib/BlinkenProto.c  33)   switch (packet) {
BlinkenLib/BlinkenProto.c  34)     case BlinkenPacketStreamEnd:
BlinkenLib/BlinkenProto.c  35)       body = "END\0\0\0\0\0";
BlinkenLib/BlinkenProto.c  36)       len = 8;
BlinkenLib/BlinkenProto.c  37)       break;
BlinkenLib/BlinkenProto.c  38)     case BlinkenPacketNone:
BlinkenLib/BlinkenProto.c  39)     case BlinkenPacketFrame:
BlinkenLib/BlinkenProto.c  40)     case BlinkenPacketRequest:
BlinkenLib/BlinkenProto.c  41)     case BlinkenPacketEndRequest:
BlinkenLib/BlinkenProto.c  42)       // keep compiler happy
BlinkenLib/BlinkenProto.c  43)       break;
BlinkenLib/BlinkenProto.c  44)   }
BlinkenLib/BlinkenProto.c  45) 
BlinkenLib/BlinkenProto.c  46)   switch (proto) {
BlinkenLib/BlinkenProto.c  47)   case BlinkenProtoNone:
BlinkenLib/BlinkenProto.c  48)     break;
BlinkenLib/BlinkenProto.c  49)   case BlinkenProtoBlp:
BlinkenLib/BlinkenProto.c  50)     switch (packet) {
BlinkenLib/BlinkenProto.c  51)       case BlinkenPacketFrame:
BlinkenLib/BlinkenProto.c  52)         magic = BlinkenProtoBlpMagic;
BlinkenLib/BlinkenProto.c  53)         body = "\0\0\0\0\0\0\0\0"; // size 0x0
BlinkenLib/BlinkenProto.c  54)         len = 8;
BlinkenLib/BlinkenProto.c  55)         break;
BlinkenLib/BlinkenProto.c  56)       case BlinkenPacketRequest:
BlinkenLib/BlinkenProto.c  57)         magic = BlinkenProtoBlpReqMagic;
BlinkenLib/BlinkenProto.c  58)         body = "REFRESH";
BlinkenLib/BlinkenProto.c  59)         len = 7;
BlinkenLib/BlinkenProto.c  60)         break;
BlinkenLib/BlinkenProto.c  61)       case BlinkenPacketEndRequest:
BlinkenLib/BlinkenProto.c  62)         magic = BlinkenProtoBlpReqMagic;
BlinkenLib/BlinkenProto.c  63)         body = "CLOSE";
BlinkenLib/BlinkenProto.c  64)         len = 5;
BlinkenLib/BlinkenProto.c  65)         break;
BlinkenLib/BlinkenProto.c  66)       default: // might be info packet, set only magic
BlinkenLib/BlinkenProto.c  67)         magic = BlinkenProtoBlpInfoMagic;
BlinkenLib/BlinkenProto.c  68)         break;
BlinkenLib/BlinkenProto.c  69)     }
BlinkenLib/BlinkenProto.c  70)     break;
BlinkenLib/BlinkenProto.c  71)   case BlinkenProtoEblp:
BlinkenLib/BlinkenProto.c  72)     switch (packet) {
BlinkenLib/BlinkenProto.c  73)       case BlinkenPacketFrame:
BlinkenLib/BlinkenProto.c  74)         magic = BlinkenProtoEblpMagic;
BlinkenLib/BlinkenProto.c  75)         body = "\0\0\0\0\0\0\0\0"; // size 0x0
BlinkenLib/BlinkenProto.c  76)         len = 8;
BlinkenLib/BlinkenProto.c  77)         break;
BlinkenLib/BlinkenProto.c  78)       case BlinkenPacketRequest:
BlinkenLib/BlinkenProto.c  79)         magic = BlinkenProtoBlpReqMagic;
BlinkenLib/BlinkenProto.c  80)         body = "REFRESH256";
BlinkenLib/BlinkenProto.c  81)         len = 10;
BlinkenLib/BlinkenProto.c  82)         break;
BlinkenLib/BlinkenProto.c  83)       case BlinkenPacketEndRequest:
BlinkenLib/BlinkenProto.c  84)         magic = BlinkenProtoBlpReqMagic;
BlinkenLib/BlinkenProto.c  85)         body = "CLOSE256";
BlinkenLib/BlinkenProto.c  86)         len = 8;
BlinkenLib/BlinkenProto.c  87)         break;
BlinkenLib/BlinkenProto.c  88)       default: // might be info packet, set only magic
BlinkenLib/BlinkenProto.c  89)         magic = BlinkenProtoEblpInfoMagic;
BlinkenLib/BlinkenProto.c  90)         break;
BlinkenLib/BlinkenProto.c  91)     }
BlinkenLib/BlinkenProto.c  92)     break;
BlinkenLib/BlinkenProto.c  93)   case BlinkenProtoMcuf:
BlinkenLib/BlinkenProto.c  94)     switch (packet) {
BlinkenLib/BlinkenProto.c  95)       case BlinkenPacketFrame:
BlinkenLib/BlinkenProto.c  96)         magic = BlinkenProtoMcufMagic;
BlinkenLib/BlinkenProto.c  97)         body = "\0\0\0\0\0\0\0\0"; // size 0x0
BlinkenLib/BlinkenProto.c  98)         len = 8;
BlinkenLib/BlinkenProto.c  99)         break;
BlinkenLib/BlinkenProto.c 100)       case BlinkenPacketRequest:
BlinkenLib/BlinkenProto.c 101)         magic = BlinkenProtoMcufReqMagic;
BlinkenLib/BlinkenProto.c 102)         body = "\0\0\0\0\0\0\0\0";
BlinkenLib/BlinkenProto.c 103)         len = 8;
BlinkenLib/BlinkenProto.c 104)         break;
BlinkenLib/BlinkenProto.c 105)       case BlinkenPacketEndRequest:
BlinkenLib/BlinkenProto.c 106)         magic = BlinkenProtoMcufEndReqMagic;
BlinkenLib/BlinkenProto.c 107)         body = "\0\0\0\0\0\0\0\0";
BlinkenLib/BlinkenProto.c 108)         len = 8;
BlinkenLib/BlinkenProto.c 109)         break;
BlinkenLib/BlinkenProto.c 110)       default: // might be info packet, set only magic
BlinkenLib/BlinkenProto.c 111)         magic = BlinkenProtoMcufInfoMagic;
BlinkenLib/BlinkenProto.c 112)         break;
BlinkenLib/BlinkenProto.c 113)     }
BlinkenLib/BlinkenProto.c 114)     break;
BlinkenLib/BlinkenProto.c 115)   }
BlinkenLib/BlinkenProto.c 116) 
BlinkenLib/BlinkenProto.c 117)   // magic not set or body not set -> error
BlinkenLib/BlinkenProto.c 118)   if (magic == 0 || len < 0)
BlinkenLib/BlinkenProto.c 119)     return -1;
BlinkenLib/BlinkenProto.c 120) 
BlinkenLib/BlinkenProto.c 121)   // fill buffer
BlinkenLib/BlinkenProto.c 122)   if (maxLength < (int)sizeof(magic))
BlinkenLib/BlinkenProto.c 123)     return -1;
BlinkenLib/BlinkenProto.c 124)   *(uint32_t *)pData = htonl(magic);
BlinkenLib/BlinkenProto.c 125)   if (maxLength < (int)sizeof(magic) + len) {
BlinkenLib/BlinkenProto.c 126)     memcpy(pData + sizeof(magic), body, maxLength - sizeof(magic));
BlinkenLib/BlinkenProto.c 127)     return -1;
BlinkenLib/BlinkenProto.c 128)   }
BlinkenLib/BlinkenProto.c 129)   memcpy(pData + sizeof(magic), body, len);
BlinkenLib/BlinkenProto.c 130)   return sizeof(magic) + len;
BlinkenLib/BlinkenProto.c 131) }
BlinkenLib/BlinkenProto.c 132) 
BlinkenLib/BlinkenProto.c 133) void BlinkenProtoDetectPacket(const char *pData, int length,
BlinkenLib/BlinkenProto.c 134)                               etBlinkenProto * pProto,
BlinkenLib/BlinkenProto.c 135)                               etBlinkenPacket * pPacket)
BlinkenLib/BlinkenProto.c 136) // returns protocol in *pProto if pProto not NULL
BlinkenLib/BlinkenProto.c 137) // returns packet type in *pPacket if pPacket not NULL
BlinkenLib/BlinkenProto.c 138) {
BlinkenLib/BlinkenProto.c 139)   uint32_t magic;
BlinkenLib/BlinkenProto.c 140)   int info;
BlinkenLib/BlinkenProto.c 141) 
BlinkenLib/BlinkenProto.c 142)   // get magic
BlinkenLib/BlinkenProto.c 143)   if (length < (int)sizeof(magic)) {
BlinkenLib/BlinkenProto.c 144)     if (pProto)
BlinkenLib/BlinkenProto.c 145)       *pProto = BlinkenProtoNone;
BlinkenLib/BlinkenProto.c 146)     if (pPacket)
BlinkenLib/BlinkenProto.c 147)       *pPacket = BlinkenPacketNone;
BlinkenLib/BlinkenProto.c 148)     return;
BlinkenLib/BlinkenProto.c 149)   }
BlinkenLib/BlinkenProto.c 150)   magic = ntohl(*(uint32_t *)pData);
BlinkenLib/BlinkenProto.c 151) 
BlinkenLib/BlinkenProto.c 152)   info = 0;
BlinkenLib/BlinkenProto.c 153)   switch (magic) {
BlinkenLib/BlinkenProto.c 154)   case BlinkenProtoBlpMagic:
BlinkenLib/BlinkenProto.c 155)     if (length >= (int)sizeof(stBlinkenProtoBlpHdr)) {
BlinkenLib/BlinkenProto.c 156)       if (pProto)
BlinkenLib/BlinkenProto.c 157)         *pProto = BlinkenProtoBlp;
BlinkenLib/BlinkenProto.c 158)       if (pPacket)
BlinkenLib/BlinkenProto.c 159)         *pPacket = BlinkenPacketFrame;
BlinkenLib/BlinkenProto.c 160)       return;
BlinkenLib/BlinkenProto.c 161)     }
BlinkenLib/BlinkenProto.c 162)     break;
BlinkenLib/BlinkenProto.c 163)   case BlinkenProtoBlpReqMagic:
BlinkenLib/BlinkenProto.c 164)     if (length >= (int)sizeof(magic) + 10 && !memcmp(pData + sizeof(magic), "REFRESH256", 10)) {
BlinkenLib/BlinkenProto.c 165)       if (pProto)
BlinkenLib/BlinkenProto.c 166)         *pProto = BlinkenProtoEblp;
BlinkenLib/BlinkenProto.c 167)       if (pPacket)
BlinkenLib/BlinkenProto.c 168)         *pPacket = BlinkenPacketRequest;
BlinkenLib/BlinkenProto.c 169)       return;
BlinkenLib/BlinkenProto.c 170)     }
BlinkenLib/BlinkenProto.c 171)     if (length >= (int)sizeof(magic) + 8 && !memcmp(pData + sizeof(magic), "CLOSE256", 8)) {
BlinkenLib/BlinkenProto.c 172)       if (pProto)
BlinkenLib/BlinkenProto.c 173)         *pProto = BlinkenProtoEblp;
BlinkenLib/BlinkenProto.c 174)       if (pPacket)
BlinkenLib/BlinkenProto.c 175)         *pPacket = BlinkenPacketEndRequest;
BlinkenLib/BlinkenProto.c 176)       return;
BlinkenLib/BlinkenProto.c 177)     }
BlinkenLib/BlinkenProto.c 178)     if (length >= (int)sizeof(magic) + 7 && !memcmp(pData + sizeof(magic), "REFRESH", 7)) {
BlinkenLib/BlinkenProto.c 179)       if (pProto)
BlinkenLib/BlinkenProto.c 180)         *pProto = BlinkenProtoBlp;
BlinkenLib/BlinkenProto.c 181)       if (pPacket)
BlinkenLib/BlinkenProto.c 182)         *pPacket = BlinkenPacketRequest;
BlinkenLib/BlinkenProto.c 183)       return;
BlinkenLib/BlinkenProto.c 184)     }
BlinkenLib/BlinkenProto.c 185)     if (length >= (int)sizeof(magic) + 5 && !memcmp(pData + sizeof(magic), "CLOSE", 5)) {
BlinkenLib/BlinkenProto.c 186)       if (pProto)
BlinkenLib/BlinkenProto.c 187)         *pProto = BlinkenProtoBlp;
BlinkenLib/BlinkenProto.c 188)       if (pPacket)
BlinkenLib/BlinkenProto.c 189)         *pPacket = BlinkenPacketEndRequest;
BlinkenLib/BlinkenProto.c 190)       return;
BlinkenLib/BlinkenProto.c 191)     }
BlinkenLib/BlinkenProto.c 192)     break;
BlinkenLib/BlinkenProto.c 193)   case BlinkenProtoBlpInfoMagic:
BlinkenLib/BlinkenProto.c 194)     if (length >= (int)sizeof(magic) + 8) {
BlinkenLib/BlinkenProto.c 195)       if (pProto)
BlinkenLib/BlinkenProto.c 196)         *pProto = BlinkenProtoBlp;
BlinkenLib/BlinkenProto.c 197)       info = 1; // further processing of info packet below
BlinkenLib/BlinkenProto.c 198)     }
BlinkenLib/BlinkenProto.c 199)     break;
BlinkenLib/BlinkenProto.c 200)   case BlinkenProtoEblpMagic:
BlinkenLib/BlinkenProto.c 201)     if (length >= (int)sizeof(stBlinkenProtoEblpHdr)) {
BlinkenLib/BlinkenProto.c 202)       if (pProto)
BlinkenLib/BlinkenProto.c 203)         *pProto = BlinkenProtoEblp;
BlinkenLib/BlinkenProto.c 204)       if (pPacket)
BlinkenLib/BlinkenProto.c 205)         *pPacket = BlinkenPacketFrame;
BlinkenLib/BlinkenProto.c 206)       return;
BlinkenLib/BlinkenProto.c 207)     }
BlinkenLib/BlinkenProto.c 208)     break;
BlinkenLib/BlinkenProto.c 209)   case BlinkenProtoEblpInfoMagic:
BlinkenLib/BlinkenProto.c 210)     if (length >= (int)sizeof(magic) + 8) {
BlinkenLib/BlinkenProto.c 211)       if (pProto)
BlinkenLib/BlinkenProto.c 212)         *pProto = BlinkenProtoEblp;
BlinkenLib/BlinkenProto.c 213)       info = 1; // further processing of info packet below
BlinkenLib/BlinkenProto.c 214)     }
BlinkenLib/BlinkenProto.c 215)     break;
BlinkenLib/BlinkenProto.c 216)   case BlinkenProtoMcufMagic:
BlinkenLib/BlinkenProto.c 217)     if (length >= (int)sizeof(stBlinkenProtoMcufHdr)) {
BlinkenLib/BlinkenProto.c 218)       if (pProto)
BlinkenLib/BlinkenProto.c 219)         *pProto = BlinkenProtoMcuf;
BlinkenLib/BlinkenProto.c 220)       if (pPacket)
BlinkenLib/BlinkenProto.c 221)         *pPacket = BlinkenPacketFrame;
BlinkenLib/BlinkenProto.c 222)       return;
BlinkenLib/BlinkenProto.c 223)     }
BlinkenLib/BlinkenProto.c 224)     break;
BlinkenLib/BlinkenProto.c 225)   case BlinkenProtoMcufReqMagic:
BlinkenLib/BlinkenProto.c 226)     if (pProto)
BlinkenLib/BlinkenProto.c 227)       *pProto = BlinkenProtoMcuf;
BlinkenLib/BlinkenProto.c 228)     if (pPacket)
BlinkenLib/BlinkenProto.c 229)       *pPacket = BlinkenPacketRequest;
BlinkenLib/BlinkenProto.c 230)     return;
BlinkenLib/BlinkenProto.c 231)   case BlinkenProtoMcufEndReqMagic:
BlinkenLib/BlinkenProto.c 232)     if (pProto)
BlinkenLib/BlinkenProto.c 233)       *pProto = BlinkenProtoMcuf;
BlinkenLib/BlinkenProto.c 234)     if (pPacket)
BlinkenLib/BlinkenProto.c 235)       *pPacket = BlinkenPacketEndRequest;
BlinkenLib/BlinkenProto.c 236)     return;
BlinkenLib/BlinkenProto.c 237)   case BlinkenProtoMcufInfoMagic:
Stefan Schuermans implemented rotationg and m...

Stefan Schuermans authored 11 years ago

BlinkenLib/BlinkenProto.c 238)     if (length >= (int)sizeof(magic) + 8) {