JsonObjectPtr HueComm::getSuccessItem(JsonObjectPtr aResult, int aIndex) { if (aResult && aIndex<aResult->arrayLength()) { JsonObjectPtr responseItem = aResult->arrayGet(aIndex); JsonObjectPtr successItem; if (responseItem && responseItem->get("success", successItem)) { return successItem; } } return JsonObjectPtr(); }
void HueApiOperation::processAnswer(JsonObjectPtr aJsonResponse, ErrorPtr aError) { error = aError; if (Error::isOK(error)) { // pre-process response in case of non-GET if (method!=httpMethodGET) { // Expected: // [{"error":{"type":xxx,"address":"yyy","description":"zzz"}}] // or // [{"success": { "xxx": "xxxxxxxx" }] int errCode = HueCommErrorInvalidResponse; string errMessage = "invalid response"; for (int i=0; i<aJsonResponse->arrayLength(); i++) { JsonObjectPtr responseItem = aJsonResponse->arrayGet(i); responseItem->resetKeyIteration(); JsonObjectPtr responseParams; string statusToken; if (responseItem->nextKeyValue(statusToken, responseParams)) { if (statusToken=="success" && responseParams) { // apparently successful, return entire response // Note: use getSuccessItem() to get success details data = aJsonResponse; errCode = HueCommErrorOK; // ok break; } else if (statusToken=="error" && responseParams) { // make Error object out of it JsonObjectPtr e = responseParams->get("type"); if (e) errCode = e->int32Value(); e = responseParams->get("description"); if (e) errMessage = e->stringValue(); break; } } } // for if (errCode!=HueCommErrorOK) { error = ErrorPtr(new HueCommError(errCode, errMessage)); } } else { // GET, just return entire data data = aJsonResponse; } } // done completed = true; // have queue reprocessed hueComm.processOperations(); }