📄 obexbinding.c
字号:
int typeHeaderCount=0; int connectionIDHeaderCount=0; XPTDEBUG(("OBX obxGetDocumentInfo()\n")); CHECK_PARM( privateConnectionInfo, "obxGetDocumentInfo()", "privateConnectionInfo" ); CHECK_PARM( pDoc, "obxGetDocumentInfo()", "pDoc" ); if ( !ocb->docInfo ) { if (ocb->role == XPT_REQUEST_RECEIVER) { /* we are Server -> waiting for PUT */ request = ObxObjectNew( ocb->obxHandle, OBEX_CMD_NULL); if ( request == NULL ) { return OBX_RC_OBEX_HEADER; } rc = ObxTransactionRecv( ocb->obxHandle, request, TRUE ); if (rc != OBX_RC_OK) { ObxObjectFree(ocb->obxHandle, request); return rc; }//We can only get commands of Put and Abort here. if( request->cmd != (OBEX_CMD_PUT|OBEX_CMD_FINAL) && request->cmd != (OBEX_CMD_ABORT|OBEX_CMD_FINAL) ) { ObxObjectFree(ocb->obxHandle, request); return OBX_RC_GENERAL_ERROR; } /* ok we received the PUT - now lets ript the headers apart */ if ( !(iterator = ObxIteratorReset( ObxListGetIterator( ObxObjectGetHeaderList( request ) ) )) ) { return OBX_RC_ERR_MEMORY; } docInfo = (XptCommunicationInfo_t*)malloc(sizeof(XptCommunicationInfo_t)); if (!docInfo) return OBX_RC_ERR_MEMORY; memset(docInfo, 0, sizeof(XptCommunicationInfo_t)); docInfo->cbLength = -1; while ( ObxIteratorHasNext( iterator ) ) { if ( (header = (ObxHeader *)ObxIteratorNext( iterator )) ) { /* ** Which header is it ? */ switch (header->identifier) { case OBEX_HEADER_CONNECTION://Check if ConnectionID in the request command is equal to the one we've assigned in the response of Connect command. XPTDEBUG(("OBX obxGetDocumentInfo() The ConnectionID carried in request command is %d and the one we assign is %d\n", header->value.fourBytevalue, ocb->obxHandle->OBEXConnectionID )); if(header->value.fourBytevalue!=ocb->obxHandle->OBEXConnectionID) return OBX_RC_ERR_SML_CONNECTIONID_HDR; connectionIDHeaderCount++; break; case OBEX_HEADER_TYPE: length = ObxBufSize(header->value.byteSequenceValue);//Need byte '0' to be a complete C string// someBuf = (unsigned char *)malloc( length ); someBuf = (unsigned char *)malloc( length+1 ); memset(someBuf,0,length+1); ObxBufRead( header->value.byteSequenceValue, someBuf, length ); strcpy(docInfo->mimeType, (const char *)someBuf); // %%% luz 2002-04-16: added cast free( someBuf ); typeHeaderCount++; break; case OBEX_HEADER_LENGTH: docInfo->cbLength = header->value.fourBytevalue; break; case OBEX_HEADER_DESCRIPTION: if (strlen(docInfo->mimeType) > 1) break; length = ObxBufSize(header->value.unicodeValue); someBuf = (unsigned char *)malloc( length ); ObxBufRead( header->value.unicodeValue, someBuf, length ); inboundbuffer = ObxUnicodeToUTF8( (const unsigned char *)docInfo->mimeType, length ); // %%% luz 2002-04-16: added cast ObxBufRead( inboundbuffer, someBuf, min( length, ObxBufSize( inboundbuffer ) ) ); ObxBufFree( inboundbuffer ); strcpy(docInfo->mimeType, (const char *)someBuf); // %%% luz 2002-04-16: added cast free(someBuf); break; case OBEX_HEADER_NAME: length = ObxBufSize(header->value.unicodeValue); someBuf = (unsigned char *)malloc( length ); ObxBufRead( header->value.unicodeValue, someBuf, length ); inboundbuffer = ObxUnicodeToUTF8( someBuf, length ); ObxBufRead( inboundbuffer, someBuf, min( length, ObxBufSize( inboundbuffer ) ) ); ObxBufFree( inboundbuffer ); strcpy(docInfo->docName, (const char *)someBuf); // %%% luz 2002-04-16: added cast free(someBuf); break; case OBEX_HEADER_XSYNCMLHMAC: length = ObxBufSize(header->value.unicodeValue); someBuf = (unsigned char *)malloc( length ); ObxBufRead( header->value.unicodeValue, someBuf, length ); inboundbuffer = ObxUnicodeToUTF8( someBuf, length ); ObxBufRead( inboundbuffer, someBuf, min( length, ObxBufSize( inboundbuffer ) ) ); ObxBufFree( inboundbuffer ); ocb->pchXSyncmlHmac = (char *)someBuf; // %%% luz 2002-04-16: added cast docInfo->hmacInfo = (XptHmacInfo_t *)malloc(sizeof (XptHmacInfo_t)); while (someBuf != NULL) { someBuf = splitParmValue(someBuf, ¶m, &value); if ((param != NULL) && (param [0] != '\0')) { if (!strcmp ((const char *)param, "algorithm")) // %%% luz 2002-04-16: added cast docInfo->hmacInfo->algorithm = (const char *) value; // %%% luz 2002-04-16: added cast else if (!strcmp ((const char *)param, "username")) // %%% luz 2002-04-16: added cast docInfo->hmacInfo->username = (const char *) value; // %%% luz 2002-04-16: added cast else if (!strcmp ((const char *)param, "mac")) // %%% luz 2002-04-16: added cast docInfo->hmacInfo->mac = (const char *) value; // %%% luz 2002-04-16: added cast } } XPTDEBUG(("OBX obxGetDocumentInfo() HMAC: algorithm: '%s' username: '%s' mac: '%s'\n", docInfo->hmacInfo->algorithm, docInfo->hmacInfo->username, docInfo->hmacInfo->mac )); break;// %%% luz 2003-07-07 - added Mickey 2003.1.28 code from client case to server, too//Both OBEX_HEADER_BODY and OBEX_HEADER_BODY_END can carry payload data. case OBEX_HEADER_BODY: case OBEX_HEADER_BODY_END: length = ObxBufSize(header->value.byteSequenceValue);// %%% luz 2003-07-07 - added Mickey 2003.1.28 code from client case to server, too//There may be no OBEX_HEADER_LENGTH header in Put command. docInfo->cbLength=length; buffer = (unsigned char *)malloc( length ); ObxBufRead( header->value.byteSequenceValue, buffer, length ); bodyHeaderCount++; break; default: break; /* ignore */ } } } ObxIteratorFree( iterator );//We check Abort command here because we must check header of ConnectionID first. if( request->cmd == OBEX_CMD_ABORT ) { ObxObjectFree(ocb->obxHandle, request); return OBX_RC_ERR_GET_ABORT; }//There must be data returned in Put command. if(bodyHeaderCount==0) { ObxObjectFree(ocb->obxHandle, request); return OBX_RC_ERR_SML_BODY_HDR; }//There must be Type and ConnectionID header in Put command. if(typeHeaderCount!=1) { ObxObjectFree(ocb->obxHandle, request); return OBX_RC_ERR_SML_TYPE_HDR; } if(connectionIDHeaderCount!=1) { ObxObjectFree(ocb->obxHandle, request); return OBX_RC_ERR_SML_CONNECTIONID_HDR; } /* EOF - processing headers */ ocb->docInfo = docInfo; ocb->dataToRead = (ObxBuf *)ALLOC_MEM( sizeof( ObxBuf ) ); if (!ocb->dataToRead) { ObxObjectFree(ocb->obxHandle, request);// ObxObjectFree(ocb->obxHandle, response); return OBX_RC_ERR_MEMORY; } ocb->dataToRead->buf = (unsigned char *)ALLOC_MEM( ocb->docInfo->cbLength ); if (!ocb->dataToRead) { ObxObjectFree(ocb->obxHandle, request);// ObxObjectFree(ocb->obxHandle, response); return OBX_RC_ERR_MEMORY; } ocb->dataToRead->cursor = ocb->dataToRead->buf; ocb->dataToRead->length = ocb->docInfo->cbLength; COPY_MEM(buffer, ocb->dataToRead->buf, ocb->docInfo->cbLength ); ObxObjectFree(ocb->obxHandle, request); } else if (ocb->role == XPT_REQUEST_SENDER) { /* we are a client -> using GET */ if ( !(request = ObxObjectNew( ocb->obxHandle, OBEX_CMD_GET )) ) { ObxObjectFree(ocb->obxHandle, request); return rc; } else if ( !(response = ObxObjectNew(ocb->obxHandle, OBEX_CMD_NULL))) { ObxObjectFree(ocb->obxHandle, request); return rc; }//We must embed ConnectionID header in Get command. header = ObxHeaderNew( OBEX_HEADER_CONNECTION ); rc = ( header == NULL ) ? OBX_RC_OBEX_HEADER : OBX_RC_OK; if ( rc == OBX_RC_OK ) { XPTDEBUG(("OBX obxGetDocumentInfo() Add header '%s' value '%x'\n", "OBEX_HEADER_CONNECTION", ocb->obxHandle->OBEXConnectionID )); rc = ObxHeaderSetIntValue( header, ocb->obxHandle->OBEXConnectionID ); if ( rc == OBX_RC_OK ) { rc = ObxObjectAddHeader( ocb->obxHandle, request, header ); if ( rc == OBX_RC_OK ) { header = NULL; // we no longer own the header } // end if } // end if } // end if // Clean up from an error if ( rc != OBX_RC_OK ) { obxRecordError( OBX_ERRORMSG_OBEX_HEADER, "obxGetDocumentInfo()", "OBEX_HEADER_CONNECTION" ); if ( header != NULL ) { ObxHeaderFree( header ); } // end if if ( request != NULL ) { ObxObjectFree( ocb->obxHandle, request ); } // end if return OBX_RC_OBEX_HEADER; } // end if//Add Type header into Get command. header = ObxHeaderNew( OBEX_HEADER_TYPE ); rc = ( header == NULL ) ? OBX_RC_OBEX_HEADER : OBX_RC_OK; if ( rc == OBX_RC_OK ) { XPTDEBUG(("OBX obxGetDocumentInfo() Add header '%s' value '%s'\n", "OBEX_HEADER_TYPE", pDoc->mimeType )); bufferx = ObxBufNew( strlen( pDoc->mimeType ) + 1 ); rc = ( bufferx == NULL ) ? OBX_RC_MEMORY_ERROR : OBX_RC_OK; if ( rc == OBX_RC_OK ) { ObxBufWrite( bufferx, pDoc->mimeType, strlen( pDoc->mimeType ) + 1 ); rc = ObxHeaderSetByteSequenceValue( header, bufferx ); if ( rc == OBX_RC_OK ) { bufferx = NULL; // we no longer own the buffer rc = ObxObjectAddHeader( ocb->obxHandle, request, header ); if ( rc == OBX_RC_OK ) { header = NULL; // we no longer own the header } // end if } // end if } // end if } // end if // Clean up from an error if ( rc != OBX_RC_OK ) { obxRecordError( OBX_ERRORMSG_OBEX_HEADER, "obxGetDocumentInfo()", "OBEX_HEADER_TYPE" ); if ( bufferx != NULL ) { ObxBufFree( bufferx ); } // end if if ( header != NULL ) { ObxHeaderFree( header ); } // end if if ( request != NULL ) { ObxObjectFree( ocb->obxHandle, request ); } // end if return OBX_RC_OBEX_HEADER; } // end if if ((rc = ObxGetRecv( ocb->obxHandle, request, response)) != 0) { ObxObjectFree(ocb->obxHandle, request); ObxObjectFree(ocb->obxHandle, response); return rc; } /* ok we received the GET answer - now lets ript the headers apart */ if ( !(iterator = ObxIteratorReset( ObxListGetIterator( ObxObjectGetHeaderList( response ) ) )) ) { ObxObjectFree(ocb->obxHandle, request); ObxObjectFree(ocb->obxHandle, response); return OBX_RC_ERR_MEMORY; } docInfo = (XptCommunicationInfo_t*)malloc(sizeof(XptCommunicationInfo_t)); if (!docInfo) return OBX_RC_ERR_MEMORY; memset(docInfo, 0, sizeof(XptCommunicationInfo_t)); docInfo->cbLength = -1; while ( ObxIteratorHasNext( iterator ) ) { if ( (header = (ObxHeader *)ObxIteratorNext( iterator )) ) { /* ** Which header is it ? */ switch (header->identifier) { case OBEX_HEADER_TYPE: length = ObxBufSize(header->value.byteSequenceValue); someBuf = (unsigned char *)malloc( length ); ObxBufRead( header->value.byteSequenceValue, someBuf, length ); strcpy(docInfo->mimeType, (const char *) someBuf); // %%% luz 2002-04-16: added cast free( someBuf );// typeHeaderCount++; break; case OBEX_HEADER_LENGTH: docInfo->cbLength = header->value.fourBytevalue; break; case OBEX_HEADER_DESCRIPTION: if (strlen(docInfo->mimeType) > 1) break; length = ObxBufSize(header->value.unicodeValue); someBuf = (unsigned char *)malloc( length ); ObxBufRead( header->value.unicodeValue, someBuf, length ); inboundbuffer = ObxUnicodeToUTF8( (const unsigned char *)docInfo->mimeType, length ); // %%% luz 2002-04-16: added cast ObxBufRead( inboundbuffer, someBuf, min( length, ObxBufSize( inboundbuffer ) ) ); ObxBufFree( inboundbuffer ); strcpy(docInfo->mimeType, (const char *)someBuf); // %%% luz 2002-04-16: added cast free(someBuf); break; case OBEX_HEADER_NAME: length = ObxBufSize(header->value.unicodeValue); someBuf = (unsigned char *)malloc( length ); ObxBufRead( header->value.unicodeValue, someBuf, length ); inboundbuffer = ObxUnicodeToUTF8( someBuf, length ); ObxBufRead( inboundbuffer, someBuf, min( length, ObxBufSize( inboundbuffer ) ) ); ObxBufFree( inboundbuffer ); strcpy(docInfo->docName, (const char*) someBuf); // %%% luz 2002-04-16: added cast free(someBuf); break; case OBEX_HEADER_XSYNCMLHMAC: length = ObxBufSize(header->value.unicodeValue); someBuf = (unsigned char *)malloc( length ); ObxBufRead( header->value.unicodeValue, someBuf, length ); inboundbuffer = ObxUnicodeToUTF8( someBuf, length ); ObxBufRead( inboundbuffer, someBuf, min( length, ObxBufSize( inboundbuffer ) ) ); ObxBufFree( inboundbuffer ); ocb->pchXSyncmlHmac = (char *)someBuf; // %%% luz 2002-04-16: added cast docInfo->hmacInfo = (XptHmacInfo_t *)malloc(sizeof (XptHmacInfo_t)); while (someBuf != NULL) { someBuf = splitParmValue(someBuf, ¶m, &value); if ((param != NULL) && (param [0] != '\0')) { if (!strcmp ((const char *)param, "algorithm")) // %%% luz 2002-04-16: added cast docInfo->hmacInfo->algorithm = (const char *)value; // %%% luz 2002-04-16: added cast else if (!strcmp ((const char *)param, "username")) // %%% luz 2002-04-16: added cast docInfo->hmacInfo->username = (const char *)value; // %%% luz 2002-04-16: added cast else if (!strcmp ((const char *)param, "mac")) // %%% luz 2002-04-16: added cast docInfo->hmacInfo->mac = (const char *)value; // %%% luz 2002-04-16: added cast } } XPTDEBUG(("OBX obxGetDocumentInfo() HMAC: algorithm: '%s' username: '%s' mac: '%s'\n", docInfo->hmacInfo->algorithm, docInfo->hmacInfo->username, docInfo->hmacInfo->mac ));
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -