OSStatus HKhandleIncomeingMessage(int sockfd, HTTPHeader_t *httpHeader, HK_Notify_t** notifyList, HK_Context_t *inHkContext, mico_Context_t * const inContext) { OSStatus err = kNoErr; HkStatus hkErr = kNoErr; printbuf *buffer = NULL; uint32_t idx; size_t arrayLen; err = HKSocketReadHTTPHeader( sockfd, httpHeader, inHkContext->session ); int accessoryID, serviceID, characteristicID; json_object *characteristics, *characteristic, *outCharacteristics, *outCharacteristic, *event_obj; json_object *value_obj = NULL; json_object *inhapJsonObject = NULL, *outhapJsonObject = NULL; value_union value; bool event, isFound; int status = kStatusOK; int aid, iid; HK_Char_ID_t id; switch ( err ) { case kNoErr: err = HKSocketReadHTTPBody( sockfd, httpHeader, inHkContext->session ); require_noerr(err, exit); /*Pair set engine*/ if(HTTPHeaderMatchURL( httpHeader, kPAIRSETUP ) == kNoErr) { err = HTTPHeaderMatchMethod( httpHeader, "POST"); require_noerr_action(err, exit, status = kStatusMethodNotAllowed); err = HKPairSetupEngine( sockfd, httpHeader, &inHkContext->pairInfo, inContext ); require_noerr( err, exit ); if(inContext->appStatus.haPairSetupRunning == false){err = kConnectionErr; goto exit;}; } /*Pair verify engine*/ else if(HTTPHeaderMatchURL( httpHeader, kPAIRVERIFY ) == kNoErr){ err = HTTPHeaderMatchMethod( httpHeader, "POST"); require_noerr_action(err, exit, status = kStatusMethodNotAllowed); if(inHkContext->pairVerifyInfo == NULL){ inHkContext->pairVerifyInfo = HKCreatePairVerifyInfo(); require_action( inHkContext->pairVerifyInfo, exit, err = kNoMemoryErr ); } err = HKPairVerifyEngine( sockfd, httpHeader, inHkContext->pairVerifyInfo, inContext ); require_noerr_action( err, exit, HKCleanPairVerifyInfo(&inHkContext->pairVerifyInfo)); if(inHkContext->pairVerifyInfo->verifySuccess){ inHkContext->session->established = true; memcpy(inHkContext->session->InputKey, inHkContext->pairVerifyInfo->C2AKey, 32); memcpy(inHkContext->session->OutputKey, inHkContext->pairVerifyInfo->A2CKey, 32); strncpy(inHkContext->session->controllerIdentifier, inHkContext->pairVerifyInfo->pControllerIdentifier, 64); HKCleanPairVerifyInfo(&inHkContext->pairVerifyInfo); } } /* Add or remove pairs */ else if(HTTPHeaderMatchURL( httpHeader, kPAIRINGS ) == kNoErr){ err = HTTPHeaderMatchMethod( httpHeader, "POST"); require_noerr_action(err, exit, status = kStatusMethodNotAllowed); require_action( inHkContext->session->established == true, exit, err = kAuthenticationErr; status = kStatusAuthenticationErr ); err = HKPairAddRemoveEngine( sockfd, httpHeader, inHkContext->session ); require_noerr( err, exit ); } /* Identity routine under unpaired */ else if(HTTPHeaderMatchURL( httpHeader, kIdentity ) == kNoErr){
OSStatus _LocalConfigRespondInComingMessage(int fd, HTTPHeader_t* inHeader, mico_Context_t * const inContext) { OSStatus err = kUnknownErr; const char * json_str; uint8_t *httpResponse = NULL; size_t httpResponseLen = 0; json_object* report = NULL; config_log_trace(); if(HTTPHeaderMatchURL( inHeader, kCONFIGURLRead ) == kNoErr){ report = ConfigCreateReportJsonMessage( inContext ); require( report, exit ); json_str = json_object_to_json_string(report); require_action( json_str, exit, err = kNoMemoryErr ); config_log("Send config object=%s", json_str); err = CreateSimpleHTTPMessageNoCopy( kMIMEType_JSON, strlen(json_str), &httpResponse, &httpResponseLen ); require_noerr( err, exit ); require( httpResponse, exit ); err = SocketSend( fd, httpResponse, httpResponseLen ); require_noerr( err, exit ); err = SocketSend( fd, (uint8_t *)json_str, strlen(json_str) ); require_noerr( err, exit ); config_log("Current configuration sent"); goto exit; } else if(HTTPHeaderMatchURL( inHeader, kCONFIGURLWrite ) == kNoErr){ if(inHeader->contentLength > 0){ config_log("Recv new configuration, apply and reset"); err = ConfigIncommingJsonMessage( inHeader->extraDataPtr, inContext); require_noerr( err, exit ); inContext->flashContentInRam.micoSystemConfig.configured = allConfigured; MICOUpdateConfiguration(inContext); err = CreateSimpleHTTPOKMessage( &httpResponse, &httpResponseLen ); require_noerr( err, exit ); require( httpResponse, exit ); err = SocketSend( fd, httpResponse, httpResponseLen ); SocketClose(&fd); inContext->micoStatus.sys_state = eState_Software_Reset; if(inContext->micoStatus.sys_state_change_sem != NULL ); mico_rtos_set_semaphore(&inContext->micoStatus.sys_state_change_sem); mico_thread_sleep(MICO_WAIT_FOREVER); } goto exit; } else if(HTTPHeaderMatchURL( inHeader, kCONFIGURLWriteByUAP ) == kNoErr){ if(inHeader->contentLength > 0){ config_log("Recv new configuration from uAP, apply and connect to AP"); err = ConfigIncommingJsonMessageUAP( inHeader->extraDataPtr, inContext); require_noerr( err, exit ); MICOUpdateConfiguration(inContext); err = CreateSimpleHTTPOKMessage( &httpResponse, &httpResponseLen ); require_noerr( err, exit ); require( httpResponse, exit ); err = SocketSend( fd, httpResponse, httpResponseLen ); require_noerr( err, exit ); sleep(1); micoWlanSuspendSoftAP(); _easylinkConnectWiFi( inContext ); err = kConnectionErr; //Return an err to close socket and exit the current thread } goto exit; } #ifdef MICO_FLASH_FOR_UPDATE else if(HTTPHeaderMatchURL( inHeader, kCONFIGURLOTA ) == kNoErr){ if(inHeader->contentLength > 0){ config_log("Receive OTA data!"); memset(&inContext->flashContentInRam.bootTable, 0, sizeof(boot_table_t)); inContext->flashContentInRam.bootTable.length = inHeader->contentLength; inContext->flashContentInRam.bootTable.start_address = UPDATE_START_ADDRESS; inContext->flashContentInRam.bootTable.type = 'A'; inContext->flashContentInRam.bootTable.upgrade_type = 'U'; if(inContext->flashContentInRam.micoSystemConfig.configured != allConfigured) inContext->flashContentInRam.micoSystemConfig.easyLinkByPass = EASYLINK_SOFT_AP_BYPASS; MICOUpdateConfiguration(inContext); SocketClose(&fd); inContext->micoStatus.sys_state = eState_Software_Reset; if(inContext->micoStatus.sys_state_change_sem != NULL ); mico_rtos_set_semaphore(&inContext->micoStatus.sys_state_change_sem); mico_thread_sleep(MICO_WAIT_FOREVER); } goto exit; } #endif else{ return kNotFoundErr; }; exit: if(inHeader->persistent == false) //Return an err to close socket and exit the current thread err = kConnectionErr; if(httpResponse) free(httpResponse); if(report) json_object_put(report); return err; }