(
MSG_ID INTEGER PRIMARY KEY ,
CB_MSG_ID INTEGER NOT NULL ,
+ SERIAL_NUM INTEGER NOT NULL ,
FOREIGN KEY(MSG_ID) REFERENCES MSG_MESSAGE_TABLE(MSG_ID)
);
MSG_SEC_DEBUG("SUCCESS : alter %s.", MSGFW_MESSAGE_TABLE_NAME);
else
MSG_SEC_DEBUG("FAIL : create %s [%d].", MSGFW_MESSAGE_TABLE_NAME, err);
+
+ memset(sqlQuery, 0x00, sizeof(sqlQuery));
+ snprintf(sqlQuery, sizeof(sqlQuery),
+ "ALTER TABLE %s "
+ "ADD COLUMN SERIAL_NUM INTEGER NOT NULL;",
+ MSGFW_CB_MSG_TABLE_NAME);
+
+ err = dbHandle->execQuery(sqlQuery);
+
+ if (err == MSG_SUCCESS)
+ MSG_SEC_DEBUG("SUCCESS : alter %s.", MSGFW_CB_MSG_TABLE_NAME);
+ else
+ MSG_SEC_DEBUG("FAIL : create %s [%d].", MSGFW_CB_MSG_TABLE_NAME, err);
}
return MSG_ERR_DB_EXEC;
}
- if (msgType.subType == MSG_CB_SMS || msgType.subType == MSG_JAVACB_SMS) {
+ if (msgType.subType == MSG_CB_SMS || msgType.subType == MSG_JAVACB_SMS
+ || (msgType.subType >= MSG_CMAS_PRESIDENTIAL && msgType.subType <= MSG_CMAS_OPERATOR_DEFINED)) {
memset(sqlQuery, 0x00, sizeof(sqlQuery));
snprintf(sqlQuery, sizeof(sqlQuery), "DELETE FROM %s WHERE MSG_ID = %d;",
MSGFW_CB_MSG_TABLE_NAME, msgId);
/** Add CB Msg in MSG_CBMSG_TABLE */
memset(sqlQuery, 0x00, sizeof(sqlQuery));
- snprintf(sqlQuery, sizeof(sqlQuery), "INSERT INTO %s VALUES (%d, %d);",
- MSGFW_CB_MSG_TABLE_NAME, rowId, cbMsgId);
+ snprintf(sqlQuery, sizeof(sqlQuery), "INSERT INTO %s VALUES (%d, %d, %d);",
+ MSGFW_CB_MSG_TABLE_NAME, rowId, cbMsgId, pMsgInfo->serialNum);
if (dbHandle->execQuery(sqlQuery) != MSG_SUCCESS) {
dbHandle->endTrans(false);
int sim_idx;
char msgURL[MMS_LOCATION_LEN + 1];
bool bRestricted; /**< Indicates whether the message is restricted by DPM(Device Policy Manager) or not. */
+ unsigned short serialNum; /**< Indicates the serial number of a cell broadcast message. */
} MSG_MESSAGE_INFO_S;
err = SmsPluginStorage::instance()->checkMessage(&msgInfo);
if (err == MSG_SUCCESS) {
- MSG_CB_MSG_S cbOutMsg = {0, };
-
- /*cbOutMsg.type = MSG_CB_SMS; */
- cbOutMsg.type = msgInfo.msgType.subType;
- cbOutMsg.receivedTime = cbMsg->recvTime;
- cbOutMsg.serialNum = encodeCbSerialNum(CbMsgPage.pageHeader.serialNum);
- cbOutMsg.messageId = cbMsg->msgId;
- cbOutMsg.dcs = CbMsgPage.pageHeader.dcs.rawData;
- memset (cbOutMsg.cbText, 0x00, sizeof(cbOutMsg.cbText));
-
- cbOutMsg.cbTextLen = convertTextToUtf8((unsigned char*)cbOutMsg.cbText, sizeof(cbOutMsg.cbText), cbMsg);
- memset(cbOutMsg.language_type, 0x00, sizeof(cbOutMsg.language_type));
- memcpy(cbOutMsg.language_type, CbMsgPage.pageHeader.dcs.iso639Lang, 3);
- err = SmsPluginEventHandler::instance()->callbackCBMsgIncoming(&cbOutMsg, &msgInfo);
- if (err != MSG_SUCCESS)
- MSG_WARN("callbackMsgIncoming() Error !! [%d]", err);
+ bool is_duplicated = SmsPluginStorage::instance()->isDuplicatedCBMsg(&msgInfo);
+ if (is_duplicated == false) {
+ MSG_CB_MSG_S cbOutMsg = {0, };
+
+ /*cbOutMsg.type = MSG_CB_SMS; */
+ cbOutMsg.type = msgInfo.msgType.subType;
+ cbOutMsg.receivedTime = cbMsg->recvTime;
+ cbOutMsg.serialNum = cbMsg->serialNum;
+ cbOutMsg.messageId = cbMsg->msgId;
+ cbOutMsg.dcs = CbMsgPage.pageHeader.dcs.rawData;
+ memset (cbOutMsg.cbText, 0x00, sizeof(cbOutMsg.cbText));
+
+ cbOutMsg.cbTextLen = convertTextToUtf8((unsigned char*)cbOutMsg.cbText, sizeof(cbOutMsg.cbText), cbMsg);
+ memset(cbOutMsg.language_type, 0x00, sizeof(cbOutMsg.language_type));
+ memcpy(cbOutMsg.language_type, CbMsgPage.pageHeader.dcs.iso639Lang, 3);
+ err = SmsPluginEventHandler::instance()->callbackCBMsgIncoming(&cbOutMsg, &msgInfo);
+ if (err != MSG_SUCCESS)
+ MSG_WARN("callbackMsgIncoming() Error !! [%d]", err);
+ } else {
+ MSG_DEBUG("This cb message is duplicated");
+ }
} else {
MSG_WARN("checkMessage() Error !! [%d]", err);
}
pCbMsg->classType = CbPage->pageHeader.dcs.classType;
pCbMsg->codingScheme = CbPage->pageHeader.dcs.codingScheme;
pCbMsg->recvTime = CbPage->pageHeader.recvTime;
+ pCbMsg->serialNum = encodeCbSerialNum(CbPage->pageHeader.serialNum);
cbPageMap::iterator it;
int offset = 0;
void SmsPluginCbMsgHandler::convertCbMsgToMsginfo(SMS_CBMSG_S *pCbMsg, MSG_MESSAGE_INFO_S *pMsgInfo, msg_sim_slot_id_t simIndex)
{
pMsgInfo->msgId = (msg_message_id_t)pCbMsg->msgId;
+ pMsgInfo->serialNum = pCbMsg->serialNum;
pMsgInfo->folderId = MSG_CBMSGBOX_ID;
MSG_END();
return MSG_SUCCESS;
}
+
+
+bool SmsPluginStorage::isDuplicatedCBMsg(MSG_MESSAGE_INFO_S *pMsgInfo)
+{
+ msg_error_t err = MSG_SUCCESS;
+ MsgDbHandler *dbHandle = getDbHandle();
+ char sqlQuery[MAX_QUERY_LEN+1] = {0};
+ int rowCnt = 0;
+
+ snprintf(sqlQuery, sizeof(sqlQuery), "SELECT MSG_ID FROM %s WHERE SERIAL_NUM = %d",
+ MSGFW_CB_MSG_TABLE_NAME, pMsgInfo->serialNum);
+
+ err = dbHandle->getTable(sqlQuery, &rowCnt, NULL);
+ if (err == MSG_SUCCESS) {
+ dbHandle->freeTable();
+ return true;
+ }
+
+ dbHandle->freeTable();
+
+ return false;
+}
msg_error_t getnthPushEvent(int index, int *appcode);
msg_error_t releasePushEvent();
msg_error_t updateSmsMessage(MSG_MESSAGE_INFO_S *pMsgInfo);
+ bool isDuplicatedCBMsg(MSG_MESSAGE_INFO_S *pMsgInfo);
private:
SmsPluginStorage();
~SmsPluginStorage();
typedef struct _SMS_CBMSG_S {
SMS_CBMSG_TYPE_T cbMsgType; /*CBS Msg or SCHEDULE Msg or CBS41 Msg */
unsigned short msgId; /**< Message identifier code */
+ unsigned short serialNum; /* Serial number */
SMS_MSG_CLASS_T classType; /**< The message class */
SMS_CODING_SCHEME_T codingScheme; /**< How to encode a message. */
time_t recvTime; /**< Msg Recv Time */