diff options
author | Nick Pelly <npelly@google.com> | 2010-09-23 12:47:58 -0700 |
---|---|---|
committer | Nick Pelly <npelly@google.com> | 2010-09-23 13:53:18 -0700 |
commit | 5d9927ba30ba449badb9f6df0fbeb4d6aedc6e2a (patch) | |
tree | 190f9251c6db03d3550ec7f30b51a2561c01d9cf /src/phFriNfc_NdefReg.c | |
parent | 4ff7c86a2c706b150078274455406f1b04966e1a (diff) | |
download | external_libnfc-nxp-5d9927ba30ba449badb9f6df0fbeb4d6aedc6e2a.zip external_libnfc-nxp-5d9927ba30ba449badb9f6df0fbeb4d6aedc6e2a.tar.gz external_libnfc-nxp-5d9927ba30ba449badb9f6df0fbeb4d6aedc6e2a.tar.bz2 |
Initial libnfc checkin
Source: Trusted_NFC_Device_Host_AA03.01e02_google.zip code drop (23-Sep-2010)
Change-Id: Ie47f18423f949a8d3e0815d13f55c814312add24
Signed-off-by: Nick Pelly <npelly@google.com>
Diffstat (limited to 'src/phFriNfc_NdefReg.c')
-rw-r--r-- | src/phFriNfc_NdefReg.c | 679 |
1 files changed, 679 insertions, 0 deletions
diff --git a/src/phFriNfc_NdefReg.c b/src/phFriNfc_NdefReg.c new file mode 100644 index 0000000..b39bf04 --- /dev/null +++ b/src/phFriNfc_NdefReg.c @@ -0,0 +1,679 @@ +/* + * Copyright (C) 2010 NXP Semiconductors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/*! + * \file phFriNfc_NdefReg.c + * \Contains Registry and module functions. + * + * Project: NDEFT + * + * $Date: Mon May 25 13:59:32 2009 $ + * $Author: ing08150 $ + * $Revision: 1.4 $ + * $Aliases: NFC_FRI1.1_WK920_R25_1,NFC_FRI1.1_WK922_PREP1,NFC_FRI1.1_WK922_R26_1,NFC_FRI1.1_WK924_PREP1,NFC_FRI1.1_WK924_R27_1,NFC_FRI1.1_WK926_R28_1,NFC_FRI1.1_WK928_R29_1,NFC_FRI1.1_WK930_R30_1,NFC_FRI1.1_WK934_PREP_1,NFC_FRI1.1_WK934_R31_1,NFC_FRI1.1_WK941_PREP1,NFC_FRI1.1_WK941_PREP2,NFC_FRI1.1_WK941_1,NFC_FRI1.1_WK943_R32_1,NFC_FRI1.1_WK949_PREP1,NFC_FRI1.1_WK943_R32_10,NFC_FRI1.1_WK943_R32_13,NFC_FRI1.1_WK943_R32_14,NFC_FRI1.1_WK1007_R33_1,NFC_FRI1.1_WK1007_R33_4,NFC_FRI1.1_WK1017_PREP1,NFC_FRI1.1_WK1017_R34_1,NFC_FRI1.1_WK1017_R34_2,NFC_FRI1.1_WK1023_R35_1 $ + * + */ + + +#include "phNfcTypes.h" +#include "phNfcStatus.h" +#include "phNfcCompId.h" +#include "phNfcHalTypes.h" +#include "phFriNfc.h" +#include "phFriNfc_NdefReg.h" +#include "phFriNfc_NdefRecord.h" + +/* Harsha: To Fix: 0000358: phFriNfc_NdefRecord.h: includes should be moved */ +#include <string.h> +static int16_t phFriNfc_NdefReg_Strncmp (const int8_t *s1, const int8_t *s2, uint32_t count); + +/********* String functions *********/ + +static int16_t phFriNfc_NdefReg_Strncmp (const int8_t *s1, const int8_t *s2, uint32_t count) +{ + return (int16_t)strncmp((const char*)s1,(const char*)s2, count); +} +int16_t phFriNfc_NdefReg_Strnicmp(const int8_t *s1, const int8_t *s2, uint32_t count) +{ + int8_t c1, c2; + int16_t returnvalue; + do + { + c1 = *s1; + s1++; + if (c1 >=97) + c1 = (c1 - 32); + c2 = *s2; + s2++; + if (c2 >=97) + c2 = (c2 - 32); + --count; + } + while ( (c1 == c2) && (c1 != '\0') && (c2 != '\0') && (count > 0) ); + + if ( (count == 0) || (c1 == c2) ) + returnvalue = 0; + + else if ( (c1 > c2) ) + returnvalue = 1; + else + returnvalue = -1; + + return(returnvalue); +} + +/********* REGISTRY AND LISTENER MODULE *********/ + +NFCSTATUS phFriNfc_NdefReg_Reset(phFriNfc_NdefReg_t *NdefReg, + uint8_t **NdefTypesarray, + phFriNfc_NdefRecord_t *RecordsExtracted, + phFriNfc_NdefReg_CbParam_t *CbParam, + uint8_t *ChunkedRecordsarray, + uint32_t NumberOfRecords) +{ + NFCSTATUS status = NFCSTATUS_SUCCESS; + + /* Reset/Initialise the values of the Context structure */ + /* Store the required pointers in the context structure */ + if(NdefReg == NULL || NdefTypesarray == NULL || RecordsExtracted == NULL || CbParam == NULL) + { + status = PHNFCSTVAL(CID_FRI_NFC_NDEF_REGISTRY, NFCSTATUS_INVALID_PARAMETER); + } + else + { + NdefReg->State=PH_FRINFC_NDEFREG_STATE_INIT; + NdefReg->NdefData=NULL; + NdefReg->NdefDataLength=0; + NdefReg->NdefTypeList=NULL; + NdefReg->NdefTypes = NdefTypesarray ; + NdefReg->RecordsExtracted = RecordsExtracted; + NdefReg->CbParam = CbParam; + NdefReg->validPreviousTnf = 0xff; + NdefReg->IsChunked = ChunkedRecordsarray; + NdefReg->NumberOfRecords = NumberOfRecords; + NdefReg->newRecordextracted = 0; + NdefReg->MainTnfFound = 0; + } + return(status); +} + +/* Adds a NDEF type listener to the internal list of listeners*/ +/*Libraray does no allocation of the memory*/ +NFCSTATUS phFriNfc_NdefReg_AddCb(phFriNfc_NdefReg_t *NdefReg, + phFriNfc_NdefReg_Cb_t *NdefCb) +{ + NFCSTATUS status = NFCSTATUS_SUCCESS; + + if( NdefReg == NULL || NdefCb ==NULL) + { + status = PHNFCSTVAL(CID_FRI_NFC_NDEF_REGISTRY, NFCSTATUS_INVALID_PARAMETER); + } + else + { + /* Check whether we can accomodate all these records in a single node */ + if(NdefCb->NumberOfRTDs <= PH_FRINFC_NDEFREG_MAX_RTD_REGISTERED) + { + /* Yes, all these Records can be accomodated in a single node */ + /* No existing node. This will be the first Node */ + if(NdefReg->NdefTypeList==NULL) + { + NdefCb->Previous =NULL; + NdefCb->Next =NULL; + NdefReg->NdefTypeList = NdefCb; + } + else + { + /* Some nodes are existing. Add the new CB node at the front + of the List and update pointers */ + NdefCb->Next = NdefReg->NdefTypeList; + NdefCb->Previous = NULL; + NdefReg->NdefTypeList->Previous = NdefCb; + NdefReg->NdefTypeList = NdefReg->NdefTypeList->Previous; + } + } + else + { + /* We cannot accomodate more records than PH_FRINFC_NDEFREG_MAX_RTD_REGISTERED + in this node. + So return warning NFCSTATUS_INVALID_PARAMETER. */ + status = PHNFCSTVAL(CID_FRI_NFC_NDEF_REGISTRY, + NFCSTATUS_INVALID_PARAMETER); + } + } + + return(status); +} + +/*Removes a specific listener from the list. The element to remove is specified by its address.*/ +/*Libraray does no deallocation of the memory*/ +NFCSTATUS phFriNfc_NdefReg_RmCb(phFriNfc_NdefReg_t *NdefReg, + phFriNfc_NdefReg_Cb_t *NdefCb) +{ + NFCSTATUS status = NFCSTATUS_SUCCESS; + phFriNfc_NdefReg_Cb_t *tempNode; + uint8_t found=0;/* to check for the node present or not */ + + if( NdefReg==NULL || NdefCb ==NULL) + { + status = PHNFCSTVAL(CID_FRI_NFC_NDEF_REGISTRY, NFCSTATUS_INVALID_PARAMETER); + } + else + { + tempNode = NdefReg->NdefTypeList; + /* if the list is empty */ + if(NdefReg->NdefTypeList == NULL) + { + status = PHNFCSTVAL(CID_FRI_NFC_NDEF_REGISTRY, NFCSTATUS_NOT_REGISTERED); + } + else + { + while(tempNode!=NULL) + { + if(NdefCb == tempNode) + { + found=1;/* if the node is present */ + + /* node is present in the front of the list so + update the NdefReg->NdefTypeList pointer */ + if(tempNode->Previous==NULL && tempNode->Next!=NULL) + { + NdefReg->NdefTypeList =NdefReg->NdefTypeList->Next; + NdefReg->NdefTypeList->Previous = NULL; + break; + } + /* only one node in the list so update the head node */ + if(tempNode->Next==NULL && tempNode->Previous==NULL) + { + NdefReg->NdefTypeList=NULL; + break; + } + if (tempNode->Previous != NULL) + { + tempNode->Previous->Next = tempNode->Next; + } + if (tempNode->Next != NULL) + { + tempNode->Next->Previous = tempNode->Previous; + } + break; + } + /* move to the next node */ + tempNode = tempNode->Next; + } + } + if(!found ) + { + status = PHNFCSTVAL(CID_FRI_NFC_NDEF_REGISTRY, NFCSTATUS_NOT_REGISTERED); + } + } + return(status); +} + +/* Copy the relevant pointers to the context structure, change the +FSM state, so as to trigger the process and return pending. This function is non-blocking, +it returns once the operation is initiated or an error occurs */ + +NFCSTATUS phFriNfc_NdefReg_DispatchPacket(phFriNfc_NdefReg_t *NdefReg, + uint8_t *PacketData, + uint16_t PacketDataLength) +{ + NFCSTATUS status = NFCSTATUS_SUCCESS; + + if(NdefReg==NULL ||PacketData==NULL || PacketDataLength==0) + { + status = PHNFCSTVAL(CID_FRI_NFC_NDEF_REGISTRY, NFCSTATUS_INVALID_PARAMETER); + } + else + { + NdefReg->NdefData = PacketData; + NdefReg->NdefDataLength = PacketDataLength; + NdefReg->State = PH_FRINFC_NDEFREG_STATE_DIS_PKT; + NdefReg->NumberOfNdefTypes = 0; + NdefReg->RecordIndex = 0; + NdefReg->RtdIndex = 0; + status = PHNFCSTVAL(CID_NFC_NONE, NFCSTATUS_SUCCESS); + } + return(status); +} + +/* Copy the relevant pointers to the context structure, change the +FSM state, so as to trigger the process and return pending */ +NFCSTATUS phFriNfc_NdefReg_DispatchRecord(phFriNfc_NdefReg_t *NdefReg, + phFriNfc_NdefRecord_t *RecordsExtracted) +{ + NFCSTATUS status = NFCSTATUS_SUCCESS; + if(NdefReg==NULL || RecordsExtracted==NULL) + { + status = PHNFCSTVAL(CID_FRI_NFC_NDEF_REGISTRY, NFCSTATUS_INVALID_PARAMETER); + } + else + { + NdefReg->RecordsExtracted = RecordsExtracted; + NdefReg->State = PH_FRINFC_NDEFREG_STATE_DIS_RCD; + + status = PHNFCSTVAL(CID_NFC_NONE, NFCSTATUS_SUCCESS); + } + return(status); +} + +uint8_t phFriNfc_NdefReg_Process(phFriNfc_NdefReg_t *NdefReg, + NFCSTATUS *Status) +{ + uint8_t count = 0, + ret_val=0, + TnfMatchFound = 0, + index = 0, + matchFound = 0; + + + + if(NdefReg->NdefTypeList == NULL) + { + /* No Nodes added. Return error */ + *Status = PHNFCSTVAL(CID_FRI_NFC_NDEF_REGISTRY, NFCSTATUS_NOT_REGISTERED); + return(1); + } + + *Status = NFCSTATUS_SUCCESS; + switch(NdefReg->State) + { + case PH_FRINFC_NDEFREG_STATE_DIS_RCD: + + /* for START ( each node in the list NdefReg->NdefTypeList), do the following */ + for(index=0;index<NdefReg->NdefTypeList->NumberOfRTDs;index++) + { + /* First, Match should be done with The TNF*/ + if( (NdefReg->NdefTypeList->Tnf[index] & PH_FRINFC_NDEFRECORD_TNF_MASK ) == + (NdefReg->RecordsExtracted->Tnf & PH_FRINFC_NDEFRECORD_TNF_MASK ) ) + { + /* Second, Match should be done with The Typelength*/ + if( NdefReg->NdefTypeList->NdeftypeLength[index] == \ + NdefReg->RecordsExtracted->TypeLength ) + { + /* Third, Match should be done with The Type*/ + matchFound = 0; + switch(NdefReg->NdefTypeList->Tnf[index]) + { + case 1: + /* TNF = 0X01 NFC Forum well-known type : Case sensitive */ + /* comparison is to be made. */ + if( !phFriNfc_NdefReg_Strncmp( (const int8_t *)NdefReg->NdefTypeList->NdefType[index] , + (const int8_t *)(NdefReg->RecordsExtracted->Type), + NdefReg->RecordsExtracted->TypeLength)) + { + matchFound = 1; + } + break; + + case 2: + case 4: + /* For TNF = 0X02 Media-type as defined in RFC 2046 + From iana.org, it has never been found any registered media type + with non-ascii character ==> Comparison to be used for *types* in + *registry*: case INSENSITIVE comparison. + + For TNF = 0X04 NFC Forum external type : ==> Comparison to be used + for *types* in *registry* : case INSENSITIVE comparison */ + if( !phFriNfc_NdefReg_Strnicmp( (int8_t *)NdefReg->NdefTypeList->NdefType[index] , + (int8_t *)(NdefReg->RecordsExtracted->Type), + NdefReg->RecordsExtracted->TypeLength)) + { + matchFound = 1; + } + break; + + case 3: + /* TNF = 0X03 Absolute URI as defined in RFC 3986 [RFC 3986] + Big issue concerning the Encoding, which is actually determined + by the application.Conclusion is that: Comparison to be used for + *types* in *registry*: NONE. only TNF ; type should be ignored, + and its comparison shall be done by the application. */ + matchFound = 1; + break; + default: + break; + } + if(matchFound) + { + /* Copy the chunked flag info to the callback parameter */ + NdefReg->CbParam->Chunked[count] = (NdefReg->RecordsExtracted->Flags & \ + PH_FRINFC_NDEFRECORD_FLAGS_CF ); + + /* NOTE: Raw record and the raw record size cannot be + copied as this itself is an extracted record ! */ + + /* Copy the record in the format phFriNfc_NdefRecord_t + to the callback parameter */ + (void) memcpy( &NdefReg->CbParam->Records[count], + NdefReg->RecordsExtracted, + sizeof(phFriNfc_NdefRecord_t)); + count++; + } + } + } + } + + /* now, we have all the matching entries for the RTDs present + in this particular node NdefReg->NdefTypeList. + call the callback */ + if(count>0) + { + NdefReg->CbParam->Count = count; + NdefReg->CbParam->CbContext = NdefReg->NdefTypeList->CbContext; + NdefReg->NdefTypeList->NdefCallback (NdefReg->CbParam); + } + else + { + NdefReg->CbParam->Count = 0; + } + + /* for END ( each node in the list NdefReg->NdefTypeList), do the following */ + if(NdefReg->NdefTypeList->Next==NULL) + { + NdefReg->State = PH_FRINFC_NDEFREG_STATE_INIT; + while(NdefReg->NdefTypeList->Previous!=NULL) + { + NdefReg->NdefTypeList = NdefReg->NdefTypeList->Previous; + } + /* No further node present in the list. End of process function call */ + ret_val=1; + } + else + { + /* Move the linked list by one node.*/ + NdefReg->NdefTypeList = NdefReg->NdefTypeList->Next; + /* list is not empty so come again */ + ret_val=0; + } + break; + + case PH_FRINFC_NDEFREG_STATE_DIS_PKT: + + if(NdefReg->NumberOfNdefTypes == 0) + { + /* First, Get all the records present in the data packet NdefReg->NdefData + using NDEF tool library */ + /* and, get the NumberOfNdefTypes from NdefData */ + *Status = phFriNfc_NdefRecord_GetRecords( NdefReg->NdefData, + NdefReg->NdefDataLength, + NULL, + NdefReg->IsChunked, + &NdefReg->NumberOfNdefTypes); + if((*Status)!= NFCSTATUS_SUCCESS) + { + /* Error in the Packet. Exit from the process */ + ret_val = 1; + NdefReg->NumberOfNdefTypes = 0; + break; + } + + if(NdefReg->NumberOfNdefTypes > NdefReg->NumberOfRecords) + { + /* There is not enough space in the arrays NdefReg->NdefTypes + and NdefReg->IsChunked, to write NdefReg->NumberOfRecords + number of records. Return error. */ + *Status = PHNFCSTVAL(CID_FRI_NFC_NDEF_REGISTRY, NFCSTATUS_BUFFER_TOO_SMALL); + ret_val = 1; + NdefReg->NumberOfNdefTypes = 0; + break; + } + + /* Now, get the NdefTypes */ + *Status = phFriNfc_NdefRecord_GetRecords( NdefReg->NdefData, + NdefReg->NdefDataLength, + NdefReg->NdefTypes, + NdefReg->IsChunked, + &NdefReg->NumberOfNdefTypes); + if((*Status)!= NFCSTATUS_SUCCESS) + { + /* Error in the Packet. Exit from the process */ + ret_val = 1; + NdefReg->NumberOfNdefTypes = 0; + break; + } + } + + /* For each record, in the arry NdefReg->NdefTypes, check + whether it matches with any of the registered RTD in the + present node. If it matches, copy this to the Callback + parameter array and increment count. + If count is 8, call the callback function. + Remember the record index that we last processed, before + calling the callback. */ + + /* for each record in the Message */ + while(NdefReg->RecordIndex < NdefReg->NumberOfNdefTypes) + { + /* Extract a record from the Message */ + *Status = phFriNfc_NdefRecord_Parse(NdefReg->RecordsExtracted, + NdefReg->NdefTypes[NdefReg->RecordIndex]); + if((*Status)!= NFCSTATUS_SUCCESS) + { + /* Error in the Record. Exit from the process */ + NdefReg->NumberOfNdefTypes = 0; + return 1; + } + + NdefReg->newRecordextracted = 1; + + /* for each RTD in the present node */ + while(NdefReg->RtdIndex < NdefReg->NdefTypeList->NumberOfRTDs) + { + /* Harsha: Fix for 0000243: [JF] phFriNfc_NdefReg_Process + won't parse correctly chunked records */ + + /* Check whether the TNF = 0x06 + PH_FRINFC_NDEFRECORD_TNF_UNCHANGED */ + + if((NdefReg->RecordsExtracted->Tnf & PH_FRINFC_NDEFRECORD_TNF_MASK ) == + PH_FRINFC_NDEFRECORD_TNF_UNCHANGED) + { + if(NdefReg->MainTnfFound == 1) + { + /* Matching RTD is there */ + TnfMatchFound = 1; + } + } + else + { + if(NdefReg->newRecordextracted) + { + NdefReg->MainTnfFound = 0; + } + /* This is a tnf other than 0x06. + that means, this is a valid tnf */ + NdefReg->validPreviousTnf = NdefReg->RecordsExtracted->Tnf; + + /* First, Match should be done with The TNF*/ + /* Second, Match should be done with The Typelength*/ + /* Third, Match should be done with The Type*/ + if((NdefReg->NdefTypeList->Tnf[NdefReg->RtdIndex] & + PH_FRINFC_NDEFRECORD_TNF_MASK ) == + (NdefReg->RecordsExtracted->Tnf & PH_FRINFC_NDEFRECORD_TNF_MASK ) && + (NdefReg->NdefTypeList->NdeftypeLength[NdefReg->RtdIndex] == + NdefReg->RecordsExtracted->TypeLength)) + { + matchFound = 0; + switch(NdefReg->NdefTypeList->Tnf[NdefReg->RtdIndex]) + { + case 1: + /* TNF = 0X01 NFC Forum well-known type : Case sensitive + comparison is to be made. */ + if(!phFriNfc_NdefReg_Strncmp((const int8_t *)NdefReg->NdefTypeList->NdefType[NdefReg->RtdIndex], + (const int8_t *)(NdefReg->RecordsExtracted->Type), + NdefReg->RecordsExtracted->TypeLength)) + { + matchFound = 1; + } + break; + + case 2: + case 4: + /* For TNF = 0X02 Media-type as defined in RFC 2046 + From iana.org, it has never been found any registered media type + with non-ascii character ==> Comparison to be used for *types* in + *registry*: case INSENSITIVE comparison. */ + + /* For TNF = 0X04 NFC Forum external type : ==> Comparison to be used + for *types* in *registry* : case INSENSITIVE comparison */ + if( !phFriNfc_NdefReg_Strnicmp( (int8_t *)NdefReg->NdefTypeList->NdefType[NdefReg->RtdIndex], + (int8_t *)(NdefReg->RecordsExtracted->Type), + NdefReg->RecordsExtracted->TypeLength)) + { + matchFound = 1; + } + break; + + case 3: + /* TNF = 0X03 Absolute URI as defined in RFC 3986 [RFC 3986] + Big issue concerning the Encoding, which is actually determined + by the application.Conclusion is that: Comparison to be used for + *types* in *registry*: NONE. only TNF ; type should be ignored, + and its comparison shall be done by the application. */ + matchFound = 1; + break; + default: + break; + } + if(matchFound == 1) + { + TnfMatchFound = 1; + NdefReg->MainTnfFound = 1; + } + else + { + TnfMatchFound = 0; + } + } + else + { + TnfMatchFound = 0; + } + } + + /* we have found a matching TNF */ + if(TnfMatchFound == 1) + { + /* Copy the chunked flag info to the callback parameter */ + NdefReg->CbParam->Chunked[count] = NdefReg->IsChunked[NdefReg->RecordIndex]; + + /* Copy the raw record to the callback parameter */ + NdefReg->CbParam->RawRecord[count] = NdefReg->NdefTypes[NdefReg->RecordIndex]; + + /* Copy the raw record size to the callback parameter */ + NdefReg->CbParam->RawRecordSize[count] = phFriNfc_NdefRecord_GetLength(NdefReg->RecordsExtracted); + + /* Copy the record in the format phFriNfc_NdefRecord_t + to the callback parameter */ + (void) memcpy( &NdefReg->CbParam->Records[count], + NdefReg->RecordsExtracted, + sizeof(phFriNfc_NdefRecord_t)); + + + /*if count is greater than PH_FRINFC_NDEFREG_MAX_RTD (presently 8) + then call the callback since there can be more than + PH_FRINFC_NDEFREG_MAX_RTD of a single type with in the packet,as a result + call the callback and initialize count to zero.This may also happen + when there are chunked records */ + + count++; + if(count >= PH_FRINFC_NDEFREG_MAX_RTD ) + { + NdefReg->CbParam->Count = count; + NdefReg->CbParam->CbContext = NdefReg->NdefTypeList->CbContext; + NdefReg->NdefTypeList->NdefCallback (NdefReg->CbParam); + count=0; + /* Only one callback per node. */ + NdefReg->RecordIndex++; + return(0); + } + } + + /* If the match is already found for the UNCHANGED_TNF, + don't comapre it again */ + if((NdefReg->RecordsExtracted->Tnf & PH_FRINFC_NDEFRECORD_TNF_MASK ) + == PH_FRINFC_NDEFRECORD_TNF_UNCHANGED && + TnfMatchFound == 1) + { + TnfMatchFound = 0; + break; + } + + NdefReg->RtdIndex++; + + NdefReg->newRecordextracted = 0; + } /* for each RTD in the present node + while(NdefReg->RtdIndex < NdefReg->NdefTypeList->NumberOfRTDs) */ + + /* One Record processing done for this node */ + + NdefReg->RtdIndex = 0; + NdefReg->RecordIndex++; + } /* while(NdefReg->RecordIndex<NdefReg->NumberOfNdefTypes) */ + + /* One node has been checked. Move to the next node */ + + if(count>0) + { + NdefReg->CbParam->Count = count; + NdefReg->CbParam->CbContext = NdefReg->NdefTypeList->CbContext; + NdefReg->NdefTypeList->NdefCallback (NdefReg->CbParam); + } + else + { + NdefReg->CbParam->Count = 0; + } + + if(NdefReg->NdefTypeList->Next==NULL) + { + /* All the nodes have been checked. Return */ + NdefReg->State = PH_FRINFC_NDEFREG_STATE_INIT; + while(NdefReg->NdefTypeList->Previous!=NULL) + { + NdefReg->NdefTypeList = NdefReg->NdefTypeList->Previous; + } + /* No further node present in the list. + End of Dispatch packet function. Return TRUE*/ + ret_val = 1; + } + else + { + /* Move the linked list by one node.*/ + NdefReg->NdefTypeList = NdefReg->NdefTypeList->Next; + /* list is not empty so come again */ + ret_val = 0; + } + + /* Start from the first record again. */ + NdefReg->RecordIndex = 0; + NdefReg->RtdIndex = 0; + + break; + + default: + /* return error */ + *Status = PHNFCSTVAL(CID_FRI_NFC_NDEF_REGISTRY, NFCSTATUS_INVALID_DEVICE_REQUEST); + /* Unknown state Error exit from the process function */ + ret_val= 1; + break; + + } + + return(ret_val); + +} + + |