⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 chatprocessmessage.c

📁 基于cc1010的设计实例
💻 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 + -