From: <svn...@op...> - 2010-03-01 17:37:35
|
Author: bellmich Date: Mon Mar 1 18:37:25 2010 New Revision: 1363 URL: http://libsyncml.opensync.org/changeset/1363 Log: fixed ticket #262 Modified: trunk/libsyncml/sml_session.c trunk/tests/check_session.c Modified: trunk/libsyncml/sml_session.c ============================================================================== --- trunk/libsyncml/sml_session.c Mon Mar 1 18:36:57 2010 (r1362) +++ trunk/libsyncml/sml_session.c Mon Mar 1 18:37:25 2010 (r1363) @@ -762,6 +762,36 @@ return; } +void +smlSessionIgnoreCommandStatusCallback (SmlSession *session, + SmlStatus *status, + void *userdata) +{ + smlTrace(TRACE_ENTRY, "%s(%p, %p, %p)", __func__, session, status, userdata); + SmlCommand *cmd = userdata; + SmlErrorType errorCode = atoi(smlStatusGetData(status)); + if ((errorCode < 199 || 300 < errorCode) && + errorCode != 508) + { + /* This is an error. */ + if (smlCommandGetAlertType(cmd) == SML_ALERT_NEXT_MESSAGE) + { + /* The status of this command must be ignored + * because some mobiles like LG KM900 support large objects + * but do not understand the next message alert. + */ + smlTrace(TRACE_INTERNAL, "%s: Ignoring error status for next message alert.", __func__); + } + g_warning("The commmand %d of message %d was replied with status code %d.", + smlStatusGetCommandRef(status), + smlStatusGetMessageRef(status), + errorCode); + } + smlCommandUnref(cmd); + + smlTrace(TRACE_EXIT, "%s", __func__); +} + gboolean smlSessionReceiveHeader (SmlSession *session, SmlHeader *header, @@ -1314,6 +1344,7 @@ if (smlCommandGetType(cmd) == SML_COMMAND_TYPE_ALERT) { smlTrace(TRACE_INTERNAL, "%s: ALERT with RESULT_NORMAL", __func__); if (smlCommandGetAlertType(cmd) == SML_ALERT_NEXT_MESSAGE) { + smlTrace(TRACE_INTERNAL, "%s: NEXT MESSAGE", __func__); SmlStatus *reply = smlCommandNewReply(cmd, SML_NO_ERROR, error); if (!reply) goto error; @@ -1743,7 +1774,23 @@ if (!_smlSessionEndCommandInternal(session, NULL, error)) goto error; - smlCommandUnref(alert); + /* The status of this command must be ignored + * because some mobiles like LG KM900 support large objects + * but do not understand the next message alert. + */ + SmlPendingStatus *pending = smlTryMalloc0(sizeof(SmlPendingStatus), error); + if (!pending) { + session->lastCommandID--; + goto error; + } + + pending->callback = smlSessionIgnoreCommandStatusCallback; + pending->userdata = alert; + pending->cmdID = smlCommandGetID(alert); + pending->msgID = session->lastMessageID; + + smlTrace(TRACE_INTERNAL, "%s: Appending pending next message status with cmdID %i and msgID %i", __func__, pending->cmdID, pending->msgID); + session->pendingReplies = g_list_append(session->pendingReplies, pending); } /* Anything is fine and nobody else want to send a reply * to the received message. So the library flushs now. Modified: trunk/tests/check_session.c ============================================================================== --- trunk/tests/check_session.c Mon Mar 1 18:36:57 2010 (r1362) +++ trunk/tests/check_session.c Mon Mar 1 18:37:25 2010 (r1363) @@ -1433,7 +1433,7 @@ smlTransportDataDeref(to_session2); to_session2 = NULL; - const char *input2 = "<SyncML xmlns=\"SYNCML:SYNCML1.1\"><SyncHdr><VerProto>SyncML/1.1</VerProto><VerDTD>1.1</VerDTD><MsgID>2</MsgID><SessionID>1</SessionID><Target><LocURI>/vcards</LocURI></Target><Source><LocURI>/vcards</LocURI></Source></SyncHdr><SyncBody><Sync><CmdID>1</CmdID><Target><LocURI>/vcards</LocURI></Target><Source><LocURI>/vcards</LocURI></Source><Add><CmdID>2</CmdID><Meta><Type xmlns=\"syncml:metinf\">text/x-vcard</Type></Meta><Item><Source><LocURI>uid</LocURI></Source><Data><![CDATA[data]]></Data></Item></Add></Sync><Final></Final></SyncBody></SyncML>"; + const char *input2 = "<SyncML xmlns=\"SYNCML:SYNCML1.1\"><SyncHdr><VerProto>SyncML/1.1</VerProto><VerDTD>1.1</VerDTD><MsgID>2</MsgID><SessionID>1</SessionID><Target><LocURI>/vcards</LocURI></Target><Source><LocURI>/vcards</LocURI></Source></SyncHdr><SyncBody><Status><CmdID>1</CmdID><MsgRef>1</MsgRef><CmdRef>4</CmdRef><Cmd>Alert</Cmd><Data>200</Data></Status><Sync><CmdID>2</CmdID><Target><LocURI>/vcards</LocURI></Target><Source><LocURI>/vcards</LocURI></Source><Add><CmdID>3</CmdID><Meta><Type xmlns=\"syncml:metinf\">text/x-vcard</Type></Meta><Item><Source><LocURI>uid</LocURI></Source><Data><![CDATA[data]]></Data></Item></Add></Sync><Final></Final></SyncBody></SyncML>"; parser = smlParserNew(SML_MIMETYPE_XML, 0, &error); sml_fail_unless(parser != NULL, NULL); @@ -1514,7 +1514,7 @@ smlTransportDataDeref(to_session2); to_session2 = NULL; - const char *input2 = "<SyncML xmlns=\"SYNCML:SYNCML1.1\"><SyncHdr><VerProto>SyncML/1.1</VerProto><VerDTD>1.1</VerDTD><MsgID>2</MsgID><SessionID>1</SessionID><Target><LocURI>/vcards</LocURI></Target><Source><LocURI>/vcards</LocURI></Source></SyncHdr><SyncBody><Sync><CmdID>1</CmdID><Target><LocURI>/vcards</LocURI></Target><Source><LocURI>/vcards</LocURI></Source><Add><CmdID>2</CmdID><Meta><Type xmlns=\"syncml:metinf\">text/x-vcard</Type></Meta><Item><Source><LocURI>uid</LocURI></Source><Data><![CDATA[data]]></Data><MoreData/></Item></Add></Sync></SyncBody></SyncML>"; + const char *input2 = "<SyncML xmlns=\"SYNCML:SYNCML1.1\"><SyncHdr><VerProto>SyncML/1.1</VerProto><VerDTD>1.1</VerDTD><MsgID>2</MsgID><SessionID>1</SessionID><Target><LocURI>/vcards</LocURI></Target><Source><LocURI>/vcards</LocURI></Source></SyncHdr><SyncBody><Status><CmdID>1</CmdID><MsgRef>1</MsgRef><CmdRef>4</CmdRef><Cmd>Alert</Cmd><Data>200</Data></Status><Sync><CmdID>2</CmdID><Target><LocURI>/vcards</LocURI></Target><Source><LocURI>/vcards</LocURI></Source><Add><CmdID>3</CmdID><Meta><Type xmlns=\"syncml:metinf\">text/x-vcard</Type></Meta><Item><Source><LocURI>uid</LocURI></Source><Data><![CDATA[data]]></Data><MoreData/></Item></Add></Sync></SyncBody></SyncML>"; parser = smlParserNew(SML_MIMETYPE_XML, 0, &error); sml_fail_unless(parser != NULL, NULL); @@ -1544,7 +1544,7 @@ smlTransportDataDeref(to_session2); to_session2 = NULL; - input2 = "<SyncML xmlns=\"SYNCML:SYNCML1.1\"><SyncHdr><VerProto>SyncML/1.1</VerProto><VerDTD>1.1</VerDTD><MsgID>3</MsgID><SessionID>1</SessionID><Target><LocURI>/vcards</LocURI></Target><Source><LocURI>/vcards</LocURI></Source></SyncHdr><SyncBody><Sync><CmdID>1</CmdID><Target><LocURI>/vcards</LocURI></Target><Source><LocURI>/vcards</LocURI></Source><Add><CmdID>2</CmdID><Meta><Type xmlns=\"syncml:metinf\">text/x-vcard</Type></Meta><Item><Source><LocURI>uid</LocURI></Source><Data><![CDATA[data]]></Data><MoreData/></Item></Add></Sync></SyncBody></SyncML>"; + input2 = "<SyncML xmlns=\"SYNCML:SYNCML1.1\"><SyncHdr><VerProto>SyncML/1.1</VerProto><VerDTD>1.1</VerDTD><MsgID>3</MsgID><SessionID>1</SessionID><Target><LocURI>/vcards</LocURI></Target><Source><LocURI>/vcards</LocURI></Source></SyncHdr><SyncBody><Status><CmdID>1</CmdID><MsgRef>2</MsgRef><CmdRef>8</CmdRef><Cmd>Alert</Cmd><Data>200</Data></Status><Sync><CmdID>2</CmdID><Target><LocURI>/vcards</LocURI></Target><Source><LocURI>/vcards</LocURI></Source><Add><CmdID>3</CmdID><Meta><Type xmlns=\"syncml:metinf\">text/x-vcard</Type></Meta><Item><Source><LocURI>uid</LocURI></Source><Data><![CDATA[data]]></Data><MoreData/></Item></Add></Sync></SyncBody></SyncML>"; parser = smlParserNew(SML_MIMETYPE_XML, 0, &error); sml_fail_unless(parser != NULL, NULL); @@ -1574,7 +1574,7 @@ smlTransportDataDeref(to_session2); to_session2 = NULL; - input2 = "<SyncML xmlns=\"SYNCML:SYNCML1.1\"><SyncHdr><VerProto>SyncML/1.1</VerProto><VerDTD>1.1</VerDTD><MsgID>4</MsgID><SessionID>1</SessionID><Target><LocURI>/vcards</LocURI></Target><Source><LocURI>/vcards</LocURI></Source></SyncHdr><SyncBody><Sync><CmdID>1</CmdID><Target><LocURI>/vcards</LocURI></Target><Source><LocURI>/vcards</LocURI></Source><Add><CmdID>2</CmdID><Meta><Type xmlns=\"syncml:metinf\">text/x-vcard</Type></Meta><Item><Source><LocURI>uid</LocURI></Source><Data><![CDATA[datatest]]></Data></Item></Add></Sync><Final></Final></SyncBody></SyncML>"; + input2 = "<SyncML xmlns=\"SYNCML:SYNCML1.1\"><SyncHdr><VerProto>SyncML/1.1</VerProto><VerDTD>1.1</VerDTD><MsgID>4</MsgID><SessionID>1</SessionID><Target><LocURI>/vcards</LocURI></Target><Source><LocURI>/vcards</LocURI></Source></SyncHdr><SyncBody><Status><CmdID>1</CmdID><MsgRef>3</MsgRef><CmdRef>12</CmdRef><Cmd>Alert</Cmd><Data>200</Data></Status><Sync><CmdID>2</CmdID><Target><LocURI>/vcards</LocURI></Target><Source><LocURI>/vcards</LocURI></Source><Add><CmdID>3</CmdID><Meta><Type xmlns=\"syncml:metinf\">text/x-vcard</Type></Meta><Item><Source><LocURI>uid</LocURI></Source><Data><![CDATA[datatest]]></Data></Item></Add></Sync><Final></Final></SyncBody></SyncML>"; parser = smlParserNew(SML_MIMETYPE_XML, 0, &error); sml_fail_unless(parser != NULL, NULL); |