📄 chatprocessmessage.c
字号:
/*****************************************************************************
* *
* ********** *
* ************ *
* *** *** *
* *** +++ *** *
* *** + + *** *
* *** + CHIPCON CC1010 EXAMPLE PROGRAM *
* *** + + *** CC1010 CHAT *
* *** +++ *** *
* *** *** *
* *********** *
* ********* *
* *
*****************************************************************************
* Author: JOL *
*****************************************************************************
* Revision history: *
* *
* $Log: chatProcessMessage.c,v $
* Revision 1.1 2002/10/14 10:02:28 tos
* Initial version in CVS.
*
* *
****************************************************************************/
/*****************************************************************************
*****************************************************************************
************* PROCESSING OF INCOMING MESSAGES *************
*****************************************************************************
****************************************************************************/
#include "chat.h"
//----------------------------------------------------------------------------
// void printMessage(char *pName, bool isPrivate, char *pMessage, ...)
//
// Description:
// Processes all incoming messages. The function assumes that the packet
// is valid.
//
// Note: Only chat messages will be checked for toggled sequence bit.
// It is done to detect retransmitted messages.
//----------------------------------------------------------------------------
void processMessage(void) {
CLIENT_INFO xdata *pSourceCI;
byte xdata sourceAddress;
sourceAddress = RXI.source;
// The upper 4 bits of RXI.flags contain the message code
switch (RXI.flags & MSG_MASK) {
//--------------------------------------------------
// PING [Valid address bitmask, 2 bytes]
// SERVER -> ALL CLIENTS (SPP_BROADCAST)
// Data: 16 bits, containing an address mask (15-0)
// The bit index equals the SPP address.
// '1' = valid address, '0' = invalid address.
// Example: 0x1086 -> 1, 2, 8 and 12 are valid
case MSG_PING:
BLED = ~BLED;
// Perform the address validity check. Reset the countdown if OK
if (pMyCI->address < 8) {
if (RXI.pDataBuffer[1] & (0x01 << (pMyCI->address))) {
SPP_CHANGE_TICKS (noPingTicks, NO_PING_TIMEOUT);
} else {
disconnected();
}
} else {
if (RXI.pDataBuffer[0] & (0x01 << pMyCI->address - 8)) {
SPP_CHANGE_TICKS (noPingTicks, NO_PING_TIMEOUT);
} else {
disconnected();
}
}
break;
//--------------------------------------------------
// JOIN REQUEST
// SERVER -> CLIENT
// Data: [Name]
case MSG_JOIN_REQUEST:
// Send join accepted/denied to the new client,
// update and print the client info table
if (regClient(&sourceAddress, RXI.pDataBuffer)) {
sendJoinAccepted(sourceAddress, RXI.pDataBuffer);
broadcastClientList();
printClientList();
} else {
sendJoinDenied();
}
break;
//--------------------------------------------------
// NEW CLIENT LIST
// SERVER -> CLIENT
// Data: [(CI.addr|CI.name) list]
case MSG_NEW_CLIENT_LIST:
// Replace the client info table, then print it
replaceClientInfo(RXI.pDataBuffer, RXI.dataLen / 11);
SPP_CHANGE_TICKS (noPingTicks, NO_PING_TIMEOUT);
printClientList();
break;
//--------------------------------------------------
// CHAT UP
// Broadcasted chat message: CLIENT -> SERVER
// Data: [The message]
case MSG_CHAT_UP:
// Perform some checks, if OK; print and broadcast the message (server function)
if (pSourceCI = getClientInfo(sourceAddress)) {
if (SPP_SEQUENCE_BIT & (pSourceCI->rxFlags ^ RXI.flags)) {
printMessage(pSourceCI->name, FALSE, RXI.pDataBuffer, RXI.dataLen);
broadcastMessage(sourceAddress, RXI.pDataBuffer, RXI.dataLen);
}
pSourceCI->rxFlags = RXI.flags;
}
break;
//--------------------------------------------------
// CHAT DOWN
// Broadcasted chat message: SERVER -> CLIENT
// Data: [The message][original source address]
//
// Private message: CLIENT/SERVER -> CLIENT/SERVER
// Data: [The message]
case MSG_CHAT_DOWN:
// PRIVATE
if (RXI.flags & SPP_ENCRYPTED_DATA) {
if (pSourceCI = getClientInfo(sourceAddress)) {
// Reset the ping countdown if pSourceCI = server
if (pSourceCI->address == SERVER_ADDRESS) {
SPP_CHANGE_TICKS (noPingTicks, NO_PING_TIMEOUT);
}
if (SPP_SEQUENCE_BIT & (pSourceCI->rxFlags ^ RXI.flags)) {
// Decrypt the message before printing it (this is a private message - no address in RXI.pDataBuffer)
if (!noDecryption) {
halDES(DES_SINGLE_DES | DES_ENCRYPT | DES_OFB_MODE, RXI.pDataBuffer, pSourceCI->pDESKey, RXI.dataLen);
}
printMessage(pSourceCI->name, TRUE, (RXI.pDataBuffer + 3), (RXI.dataLen - 3));
}
pSourceCI->rxFlags = RXI.flags;
}
// BROADCASTED
} else {
// Reset the ping countdown
SPP_CHANGE_TICKS (noPingTicks, NO_PING_TIMEOUT);
// Perform some checks, if OK; print the message
if (pSourceCI = getClientInfo(sourceAddress)) {
if (SPP_SEQUENCE_BIT & (pSourceCI->rxFlags ^ RXI.flags)) {
printMessage(getClientInfo(RXI.pDataBuffer[RXI.dataLen - 1])->name, FALSE, RXI.pDataBuffer, (RXI.dataLen - 1));
}
pSourceCI->rxFlags = RXI.flags;
}
}
break;
//--------------------------------------------------
// DIFFIE-HELLMAN UP
// Data: [Key generation material from pSourceCI]
case MSG_DIFFIE_HELLMAN_UP: // BOTH
if (pSourceCI = getClientInfo(sourceAddress)) {
diffieHellmanDown(pSourceCI, RXI.pDataBuffer);
}
break;
//--------------------------------------------------
// MSG_JOIN_ACCEPTED and MSG_JOIN_DENIED are only
// received during client startup.
// MSG_DIFFIE_HELLMAN_DOWN is only received in the
// diffieHellmanUp(...) function.
default:
break;
}
} // processMessage
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -