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

📄 obexbinding.c

📁 SyncML手册及其编程
💻 C
📖 第 1 页 / 共 5 页
字号:
    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, &param, &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, &param, &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 + -