// Checks roll for valid dice values. bool IsRollValid(const Roll& roll) { // Iterate over the roll, testing the values for validity. Roll::const_iterator rollIterator; for (rollIterator = roll.begin(); rollIterator != roll.end(); ++rollIterator) { if (!IsValueValid(*rollIterator)) { return false; } } return true; }
void Searching(CharItem charItems[], CharValue charValues[], int index, ResultCallbackPtr callback) { if (index == max_char_count) { callback(charItems); return; } for (int i = 0; i < max_number_count; ++i) { if (IsValueValid(charItems[index], charValues[i])) { charItems[index].value = charValues[i].value; charValues[i].used = true; Searching(charItems, charValues, index + 1, callback); charValues[i].used = false; } } }
//通过暴力穷举法对每个字符进行匹配后验证 void SearchingResult(CHAR_ITEM ci[], CHAR_VALUE cv[], int index, CharListReadyFuncPtr callback) { int max_char_count = 9; //ci[]的长度 int max_number_count = 10; //0-9 if(index == max_char_count) //如果所有字符都已经匹配上数字,进行验证 { callback(ci); //验证函数 return; } for(int i = 0; i < max_number_count; ++i) { if(IsValueValid(ci[index], cv[i])) //去掉不需要匹配的情况 { cv[i].used = true;/*set used sign*/ ci[index].value = cv[i].value; SearchingResult(ci, cv, index + 1, callback); cv[i].used = false;/*clear used sign*/ } } }
AJ_Status AJCFG_UpdateConfigurationsHandler(AJ_Message* msg) { AJ_Status status = AJ_OK; AJ_Arg array; AJ_Arg dict; AJ_Message reply; char* key; char* sig; char* value; char* language; int8_t langIndex = AJSVC_PROPERTY_STORE_ERROR_LANGUAGE_INDEX; uint8_t numOfUpdatedItems = 0; uint8_t errorReply = FALSE; AJ_InfoPrintf(("Handling UpdateConfigurations request\n")); status = AJ_UnmarshalArgs(msg, "s", &language); if (status != AJ_OK) { goto Exit; } AJ_InfoPrintf(("Lang=%s\n", language)); errorReply = !AJSVC_IsLanguageSupported(msg, &reply, language, &langIndex); if (!errorReply) { status = AJ_UnmarshalContainer(msg, &array, AJ_ARG_ARRAY); if (status != AJ_OK) { goto Exit; } while (1) { status = AJ_UnmarshalContainer(msg, &dict, AJ_ARG_DICT_ENTRY); if (status != AJ_OK) { break; } status = AJ_UnmarshalArgs(msg, "s", &key); if (status != AJ_OK) { break; } status = AJ_UnmarshalVariant(msg, (const char**)&sig); if (status != AJ_OK) { break; } status = AJ_UnmarshalArgs(msg, sig, &value); if (status != AJ_OK) { break; } AJ_InfoPrintf(("key=%s value=%s\n", key, value)); if (IsValueValid(msg, &reply, key, value)) { status = AJSVC_PropertyStore_Update(key, langIndex, value); if (status == AJ_OK) { numOfUpdatedItems++; } else if (status == AJ_ERR_INVALID) { if (!errorReply) { AJ_MarshalErrorMsg(msg, &reply, AJSVC_ERROR_INVALID_VALUE); errorReply = TRUE; } } else if (status == AJ_ERR_FAILURE) { if (!errorReply) { AJ_MarshalErrorMsg(msg, &reply, AJSVC_ERROR_UPDATE_NOT_ALLOWED); errorReply = TRUE; } } } else { errorReply = TRUE; } status = AJ_UnmarshalCloseContainer(msg, &dict); if (status != AJ_OK) { break; } } if (status != AJ_OK && status != AJ_ERR_NO_MORE) { goto Exit; } status = AJ_UnmarshalCloseContainer(msg, &array); if (status != AJ_OK) { goto Exit; } } if (!errorReply) { status = AJ_MarshalReplyMsg(msg, &reply); if (status != AJ_OK) { goto Exit; } } status = AJ_DeliverMsg(&reply); if (status != AJ_OK) { goto Exit; } Exit: if (numOfUpdatedItems) { if (errorReply) { AJSVC_PropertyStore_LoadAll(); // Discard partial successful updates } else { AJSVC_PropertyStore_SaveAll(); AJ_AboutSetShouldAnnounce(); } } return status; }