示例#1
0
//-----------------------------------------------------------------------------
int Profile::GetDoubleValues(const char* key, double* values, int num_vals) const
{
    JSON* value = NULL;
    if (ValMap.Get(key, &value) && value->Type == JSON_Array)
    {
        int val_count = Alg::Min(value->GetArraySize(), num_vals);
        JSON* item = value->GetFirstItem();
        int count=0;
        while (item && count < val_count)
        {
            if (item->Type == JSON_Number)
                values[count] = item->dValue;
            else
                break;

            count++;
            item = value->GetNextItem(item);
        }

        return count;
    }
    else
    {
        return 0;
    }
}
示例#2
0
//-----------------------------------------------------------------------------
int Profile::GetNumValues(const char* key) const
{
    JSON* value = NULL;
    if (ValMap.Get(key, &value))
    {  
        if (value->Type == JSON_Array)
            return value->GetArraySize();
        else
            return 1;
    }
    else
        return 0;        
}
示例#3
0
static JSON* FindTaggedData(JSON* data, const char** tag_names, const char** qtags, int num_qtags)
{
    if (data == NULL || !(data->Name == "TaggedData") || data->Type != JSON_Array)
        return NULL;

    JSON* tagged_item = data->GetFirstItem();
    while (tagged_item)
    {
        JSON* tags = tagged_item->GetItemByName("tags");
        if (tags->Type == JSON_Array && num_qtags == tags->GetArraySize())
        {   // Check for a full tag match on each item
            int num_matches = 0;
            
            for (int k=0; k<num_qtags; k++)
            {
                JSON* tag = tags->GetFirstItem();
                while (tag)
                {
                    JSON* tagval = tag->GetFirstItem();
                    if (tagval && tagval->Name == tag_names[k])
                    {
                        if (tagval->Value == qtags[k])
                            num_matches++;
                        break;
                    }
                    tag = tags->GetNextItem(tag);
                }
            }

            // if all tags were matched then copy the values into this Profile
            if (num_matches == num_qtags)
            {
                JSON* vals = tagged_item->GetItemByName("vals");
                return vals;
            }
        }

        tagged_item = data->GetNextItem(tagged_item);
    }

    return NULL;
}
示例#4
0
//-----------------------------------------------------------------------------
void Profile::SetDoubleValues(const char* key, const double* vals, int num_vals)
{
    JSON* value = NULL;
    int val_count = 0;
    if (ValMap.Get(key, &value))
    {
        if (value->Type == JSON_Array)
        {
            // truncate the existing array if fewer entries provided
            int num_existing_vals = value->GetArraySize();
            for (int i=num_vals; i<num_existing_vals; i++)
                value->RemoveLast();
            
            JSON* item = value->GetFirstItem();
            while (item && val_count < num_vals)
            {
                if (item->Type == JSON_Number)
                    item->dValue = vals[val_count];

                item = value->GetNextItem(item);
                val_count++;
            }
        }
        else
        {
            return;  // Maybe we should change the data type?
        }
    }
    else
    {
        value = JSON::CreateArray();
        value->Name = key;

        Values.PushBack(value);
        ValMap.Set(key, value);
    }

    for (; val_count < num_vals; val_count++)
        value->AddArrayNumber(vals[val_count]);
}
示例#5
0
//-----------------------------------------------------------------------------
bool ProfileManager::SetTaggedProfile(const char** tag_names, const char** tags, int num_tags, Profile* profile)
{
    Lock::Locker lockScope(&ProfileLock);

    if (ProfileCache == NULL)
    {   // Load the cache
        LoadCache(true);
        if (ProfileCache == NULL)
            return false;  // TODO: Generate a new profile DB
    }

    JSON* tagged_data = ProfileCache->GetItemByName("TaggedData");
    OVR_ASSERT(tagged_data);
    if (tagged_data == NULL)
        return false;

    // Get the cached tagged data section
    JSON* vals = FindTaggedData(tagged_data, tag_names, tags, num_tags);
    if (vals == NULL)
    {  
        JSON* tagged_item = JSON::CreateObject();
        JSON* taglist = JSON::CreateArray();
        for (int i=0; i<num_tags; i++)
        {
            JSON* k = JSON::CreateObject();
            k->AddStringItem(tag_names[i], tags[i]);
            taglist->AddArrayElement(k);
        }

        vals = JSON::CreateObject();
        
        tagged_item->AddItem("tags", taglist);
        tagged_item->AddItem("vals", vals);
        tagged_data->AddArrayElement(tagged_item);
    }

    // Now add or update each profile setting in cache
    for (unsigned int i=0; i<profile->Values.GetSize(); i++)
    {
        JSON* value = profile->Values[i];
        
        bool found = false;
        JSON* item = vals->GetFirstItem();
        while (item)
        {
            if (value->Name == item->Name)
            {
                // Don't allow a pre-existing type to be overridden
                OVR_ASSERT(value->Type == item->Type);

                if (value->Type == item->Type)
                {   // Check for the same value
                    if (value->Type == JSON_Array)
                    {   // Update each array item
                        if (item->GetArraySize() == value->GetArraySize())
                        {   // Update each value (assumed to be basic types and not array of objects)
                            JSON* value_element = value->GetFirstItem();
                            JSON* item_element = item->GetFirstItem();
                            while (item_element && value_element)
                            {
                                if (value_element->Type == JSON_String)
                                {
                                    if (item_element->Value != value_element->Value)
                                    {   // Overwrite the changed value and mark for file update
                                        item_element->Value = value_element->Value;
                                        Changed = true;
                                    }
                                }
                                else {
                                    if (item_element->dValue != value_element->dValue)
                                    {   // Overwrite the changed value and mark for file update
                                        item_element->dValue = value_element->dValue;
                                        Changed = true;
                                    }
                                }
                                
                                value_element = value->GetNextItem(value_element);
                                item_element = item->GetNextItem(item_element);
                            }
                        }
                        else
                        {   // if the array size changed, simply create a new one                            
// TODO: Create the new array
                        }
                    }
                    else if (value->Type == JSON_String)
                    {
                        if (item->Value != value->Value)
                        {   // Overwrite the changed value and mark for file update
                            item->Value = value->Value;
                            Changed = true;
                        }
                    }
                    else {
                        if (item->dValue != value->dValue)
                        {   // Overwrite the changed value and mark for file update
                            item->dValue = value->dValue;
                            Changed = true;
                        }
                    }
                }
                else
                {
                    return false;
                }

                found = true;
                break;
            }
            
            item = vals->GetNextItem(item);
        }

        if (!found)
        {   // Add the new value
            Changed = true;

            if (value->Type == JSON_String)
                vals->AddStringItem(value->Name, value->Value);
            else if (value->Type == JSON_Bool)
                vals->AddBoolItem(value->Name, ((int)value->dValue != 0));
            else if (value->Type == JSON_Number)
                vals->AddNumberItem(value->Name, value->dValue);
            else if (value->Type == JSON_Array)
                vals->AddItem(value->Name, value->Copy());
            else
            {
                OVR_ASSERT(false);
                Changed = false;
            }
        }
    }

    return true;
}
示例#6
0
		bool ProductInfo::FromJson(JSON* pJsonNode)
		{
			bool bRet = false;
			if (NameFromJson(pJsonNode) &&
				URLFromJson(pJsonNode) &&
				IDFromJson(pJsonNode))
			{
				JSON *pDisplay = pJsonNode->GetItemByName("Display");
				JSON *pLensSeparation = pJsonNode->GetItemByName("LensSeparation");
				JSON *pMobilePositon = pJsonNode->GetItemByName("MobilePositon");
				JSON *pGlassID = pJsonNode->GetItemByName("GlassID");
				
				JSON *pOS	 = pJsonNode->GetItemByName("OS");
				
				JSON *pMachineID = pJsonNode->GetItemByName("MachineID");

				if (pDisplay && ParseLanguageDisplay(&m_Display, pDisplay) &&
					pGlassID && ParseIDList(&m_AllGlassID, pGlassID))
				{
					if (pLensSeparation && pLensSeparation->Type == JSON_Array && pLensSeparation->GetArraySize() >= 1 && pLensSeparation->GetArraySize() <= 3)
					{
						if (pLensSeparation->GetArraySize() == 1)
						{
							SetLensSeparation(pLensSeparation->GetArrayNumber(0));
							SetLensSeparationMin(pLensSeparation->GetArrayNumber(0));
							SetLensSeparationMax(pLensSeparation->GetArrayNumber(0));
						}
						else if (pLensSeparation->GetArraySize() == 2)
						{
							SetLensSeparation((pLensSeparation->GetArrayNumber(0) + pLensSeparation->GetArrayNumber(1)) / 2);
							SetLensSeparationMin(pLensSeparation->GetArrayNumber(0));
							SetLensSeparationMax(pLensSeparation->GetArrayNumber(1));
						}
						else if (pLensSeparation->GetArraySize() == 3)
						{
							SetLensSeparation(pLensSeparation->GetArrayNumber(2));
							SetLensSeparationMin(pLensSeparation->GetArrayNumber(0));
							SetLensSeparationMax(pLensSeparation->GetArrayNumber(1));
						}
						/*以下是可选参数*/
						if (pMobilePositon && pMobilePositon->Type == JSON_Array)
						{// 手机摆放位置
							for (int i = 0; i < pMobilePositon->GetArraySize(); i++)
							{
								MobilePositionInfo *pNewItem = new MobilePositionInfo;
								if (pNewItem->FromJson(pMobilePositon->GetItemByIndex(i)))
								{
									m_MobilePositon.push_back(pNewItem);
								}
								else
								{
									delete pNewItem;
								}
							}
						}
						
						if (pOS && pOS->Type == JSON_String)
						{
							SetOS(pOS->GetStringValue());
						}
// 						if (pBrand && pBrand->Type == JSON_String)
// 						{
// 							SetBrand(pBrand->GetStringValue());
// 						}
// 						if (pModel && pModel->Type == JSON_String)
// 						{
// 							SetModel(pModel->GetStringValue());
// 						}
						if (pMachineID && pMachineID->Type == JSON_Number)
						{
							SetMachineID(pMachineID->GetInt32Value());
						}

						
						bRet = true;
					}// LensSeparation
				}// Display,GlassID
			}// Name , URL , ID
			return bRet;
		}