示例#1
0
bool ProfileManager::CreateUser(const char* user, const char* name)
{
    Lock::Locker lockScope(&ProfileLock);

    if (ProfileCache == NULL)
    {   // Load the cache
        LoadCache(true);
        if (ProfileCache == NULL)
            return false;
    }

    JSON* users = ProfileCache->GetItemByName("Users");
    if (users == NULL)
    {   // Generate the User section
        users = JSON::CreateArray();
        ProfileCache->AddItem("Users", users);
//TODO: Insert this before the TaggedData
    }

    // Search for the pre-existence of this user
    JSON* user_item = users->GetFirstItem();
    int index = 0;
    while (user_item)
    {
        JSON* userid = user_item->GetItemByName("User");
        int compare = OVR_strcmp(user, userid->Value);
        if (compare == 0)
        {   // The user already exists so simply update the fields
            JSON* name_item = user_item->GetItemByName("Name");
            if (name_item && OVR_strcmp(name, name_item->Value) != 0)
            {
                name_item->Value = name;
                Changed = true;
            }
            return true;
        }
        else if (compare < 0)
        {   // A new user should be placed before this item
            break;
        }
        
        user_item = users->GetNextItem(user_item);
        index++;
    }

    // Create and fill the user struct
    JSON* new_user = JSON::CreateObject();
    new_user->AddStringItem(OVR_KEY_USER, user);
    new_user->AddStringItem(OVR_KEY_NAME, name);
    // user_item->AddStringItem("Password", password);

    if (user_item == NULL)
        users->AddArrayElement(new_user);
    else
        users->InsertArrayElement(index, new_user);

    Changed = true;
    return true;
}
示例#2
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;
}
示例#3
0
JSON* GetSystemSpecs() {
  JSON* specs = JSON::CreateObject();
  HRESULT hres;

  IWbemLocator* pLoc = NULL;

  hres = CoCreateInstance(
      CLSID_WbemLocator, 0, CLSCTX_INPROC_SERVER, IID_IWbemLocator, (LPVOID*)&pLoc);

  if (FAILED(hres)) {
    return specs; // Program has failed.
  }

  IWbemServices* pSvc = NULL;

  // Connect to the root\cimv2 namespace with
  // the current user and obtain pointer pSvc
  // to make IWbemServices calls.
  hres = pLoc->ConnectServer(
      _bstr_t(L"ROOT\\CIMV2"), // Object path of WMI namespace
      NULL, // User name. NULL = current user
      NULL, // User password. NULL = current
      0, // Locale. NULL indicates current
      NULL, // Security flags.
      0, // Authority (for example, Kerberos)
      0, // Context object
      &pSvc // pointer to IWbemServices proxy
  );

  if (FAILED(hres)) {
    pLoc->Release();
    return specs; // Program has failed.
  }

  hres = CoSetProxyBlanket(
      pSvc, // Indicates the proxy to set
      RPC_C_AUTHN_WINNT, // RPC_C_AUTHN_xxx
      RPC_C_AUTHZ_NONE, // RPC_C_AUTHZ_xxx
      NULL, // Server principal name
      RPC_C_AUTHN_LEVEL_CALL, // RPC_C_AUTHN_LEVEL_xxx
      RPC_C_IMP_LEVEL_IMPERSONATE, // RPC_C_IMP_LEVEL_xxx
      NULL, // client identity
      EOAC_NONE // proxy capabilities
  );

  if (FAILED(hres)) {
    pSvc->Release();
    pLoc->Release();
    return specs; // Program has failed.
  }

  IEnumWbemClassObject* pEnumerator = NULL;
  hres = pSvc->ExecQuery(
      bstr_t("WQL"),
      bstr_t("SELECT Caption FROM Win32_OperatingSystem"),
      WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY,
      NULL,
      &pEnumerator);

  if (FAILED(hres)) {
    pSvc->Release();
    pLoc->Release();
    return specs; // Program has failed.
  }

  IWbemClassObject* pclsObj;
  ULONG uReturn = 0;

  while (pEnumerator) {
    HRESULT hr = pEnumerator->Next(WBEM_INFINITE, 1, &pclsObj, &uReturn);

    if (0 == uReturn) {
      break;
    }

    VARIANT vtProp;

    // Get the value of the Name property
    hr = pclsObj->Get(L"Caption", 0, &vtProp, 0, 0);
    specs->AddStringItem("Operating System", WCHAR_TO_OVR_STRING(vtProp.bstrVal));
    VariantClear(&vtProp);

    pclsObj->Release();
  }
  pEnumerator = NULL;
  hres = pSvc->ExecQuery(
      bstr_t("WQL"),
      bstr_t("SELECT Name FROM Win32_processor"),
      WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY,
      NULL,
      &pEnumerator);

  if (FAILED(hres)) {
    pSvc->Release();
    pLoc->Release();
    return specs; // Program has failed.
  }

  uReturn = 0;
  while (pEnumerator) {
    HRESULT hr = pEnumerator->Next(WBEM_INFINITE, 1, &pclsObj, &uReturn);

    if (0 == uReturn) {
      break;
    }

    VARIANT vtProp;

    // Get the value of the Name property
    hr = pclsObj->Get(L"Name", 0, &vtProp, 0, 0);
    specs->AddStringItem("Processor", WCHAR_TO_OVR_STRING(vtProp.bstrVal));
    VariantClear(&vtProp);

    pclsObj->Release();
  }

  pEnumerator = NULL;
  hres = pSvc->ExecQuery(
      bstr_t("WQL"),
      bstr_t(
          "SELECT Name , AdapterRam, DriverVersion, VideoModeDescription FROM Win32_VideoController"),
      WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY,
      NULL,
      &pEnumerator);

  if (FAILED(hres)) {
    pSvc->Release();
    pLoc->Release();
    return specs; // Program has failed.
  }

  JSON* graphicsadapters = JSON::CreateArray();

  uReturn = 0;
  while (pEnumerator) {
    JSON* graphicscard = JSON::CreateObject();
    HRESULT hr = pEnumerator->Next(WBEM_INFINITE, 1, &pclsObj, &uReturn);

    if (0 == uReturn) {
      break;
    }

    VARIANT vtProp;

    // Get the value of the Name property
    hr = pclsObj->Get(L"Name", 0, &vtProp, 0, 0);
    graphicscard->AddStringItem("Name", WCHAR_TO_OVR_STRING(vtProp.bstrVal));
    VariantClear(&vtProp);

    // Get the value of the Name property
    hr = pclsObj->Get(L"AdapterRam", 0, &vtProp, 0, 0);
    uint32_t capacity = vtProp.uintVal;
    graphicscard->AddNumberItem("Video Controller RAM (MB)", capacity / 1048576);
    VariantClear(&vtProp);

    // get driver version
    hr = pclsObj->Get(L"DriverVersion", 0, &vtProp, 0, 0);
    graphicscard->AddStringItem("Driver Version", WCHAR_TO_OVR_STRING(vtProp.bstrVal));

    // get resolution
    hr = pclsObj->Get(L"VideoModeDescription", 0, &vtProp, 0, 0);
    graphicscard->AddStringItem("Video Mode", WCHAR_TO_OVR_STRING(vtProp.bstrVal));

    VariantClear(&vtProp);
    pclsObj->Release();

    graphicsadapters->AddArrayElement(graphicscard);
  }

  specs->AddItem("Graphics Adapters", graphicsadapters);

  pEnumerator = NULL;
  hres = pSvc->ExecQuery(
      bstr_t("WQL"),
      bstr_t("SELECT Capacity FROM Win32_PhysicalMemory"),
      WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY,
      NULL,
      &pEnumerator);

  if (FAILED(hres)) {
    pSvc->Release();
    pLoc->Release();
    return specs; // Program has failed.
  }

  uint64_t totalram = 0;
  uReturn = 0;
  while (pEnumerator) {
    HRESULT hr = pEnumerator->Next(WBEM_INFINITE, 1, &pclsObj, &uReturn);

    if (0 == uReturn) {
      break;
    }

    VARIANT vtProp;

    // Get the value of the Name property
    hr = pclsObj->Get(L"Capacity", 0, &vtProp, 0, 0);
    uint64_t capacity = QString::fromWCharArray(vtProp.bstrVal).toLongLong();
    totalram += capacity;
    VariantClear(&vtProp);
    pclsObj->Release();
  }

  specs->AddNumberItem("Total RAM (GB)", totalram / 1073741824.0);

  JSON* usbtree = JSON::CreateArray();

  QMap<QString, QStringList> antecedents;

  pEnumerator = NULL;
  hres = pSvc->ExecQuery(
      bstr_t("WQL"),
      bstr_t("SELECT Antecedent,Dependent FROM Win32_USBControllerDevice"),
      WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY,
      NULL,
      &pEnumerator);

  if (FAILED(hres)) {
    pSvc->Release();
    pLoc->Release();
    return specs; // Program has failed.
  }

  VARIANT vtProp;

  while (pEnumerator) {
    HRESULT hr = pEnumerator->Next(WBEM_INFINITE, 1, &pclsObj, &uReturn);

    if (0 == uReturn) {
      break;
    }

    // Get the reference value of the Antecedent property.  There is not a function to dereference
    // the value.
    hr = pclsObj->Get(L"Antecedent", 0, &vtProp, 0, 0);
    BSTR name = vtProp.bstrVal;
    // sanitize the string input to just the output
    QString antecedent = QString::fromWCharArray(name).split("=")[1].replace("\"", "");
    VariantClear(&vtProp);

    // Get the reference value of the Dependent property.  There is not a function to dereference
    // the value.
    hr = pclsObj->Get(L"Dependent", 0, &vtProp, 0, 0);
    name = vtProp.bstrVal;
    // sanitize the string input to just the output
    QString dependent = QString::fromWCharArray(name).split("=")[1].replace("\"", "");
    antecedents[antecedent].append(dependent);
    VariantClear(&vtProp);
  }
  for (int ant = 0; ant < antecedents.size(); ant++) {
    QString antecedent_name = antecedents.keys()[ant];
    // get antecedent object in a new enumerator
    IEnumWbemClassObject* pEnumerator2 = NULL;
    IWbemClassObject* pclsObj2;
    hres = pSvc->ExecQuery(
        bstr_t("WQL"),
        bstr_t(
            "SELECT Manufacturer, Name, DeviceID, Caption FROM WIN32_USBController where deviceid = '") +
            bstr_t(antecedent_name.toUtf8()) + bstr_t("'"),
        WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY,
        NULL,
        &pEnumerator2);
    if (FAILED(hres)) {
      pSvc->Release();
      pLoc->Release();
      return specs; // Program has failed.
    }

    JSON* USBAntecedent = JSON::CreateObject();

    while (pEnumerator2) {
      HRESULT hr = pEnumerator2->Next(WBEM_INFINITE, 1, &pclsObj2, &uReturn);

      if (0 == uReturn) {
        break;
      }

      VARIANT vtProp;

      // Get the value of the Name property
      hr = pclsObj2->Get(L"Name", 0, &vtProp, 0, 0);
      USBAntecedent->AddStringItem("name", WCHAR_TO_OVR_STRING(vtProp.bstrVal));
      VariantClear(&vtProp);

      // Get the value of the DeviceID property
      hr = pclsObj2->Get(L"DeviceID", 0, &vtProp, 0, 0);
      USBAntecedent->AddStringItem("deviceid", WCHAR_TO_OVR_STRING(vtProp.bstrVal));
      VariantClear(&vtProp);

      // Get the value of the caption property
      hr = pclsObj2->Get(L"Caption", 0, &vtProp, 0, 0);
      USBAntecedent->AddStringItem("caption", WCHAR_TO_OVR_STRING(vtProp.bstrVal));
      VariantClear(&vtProp);

      // Get the value of the manufacturer property
      hr = pclsObj2->Get(L"Manufacturer", 0, &vtProp, 0, 0);
      USBAntecedent->AddStringItem("manufacturer", WCHAR_TO_OVR_STRING(vtProp.bstrVal));
      VariantClear(&vtProp);

      pclsObj2->Release();
    }
    JSON* devices = JSON::CreateArray();
    for (int dev = 0; dev < antecedents[antecedent_name].size(); ++dev) {
      // get antecedent object in a new enumerator
      pEnumerator2 = NULL;
      if (!pclsObj2)
        pclsObj2->Release();
      hres = pSvc->ExecQuery(
          bstr_t("WQL"),
          bstr_t("SELECT Manufacturer,Name FROM Win32_PnPEntity where DeviceID = '") +
              bstr_t(antecedents[antecedent_name][dev].toUtf8()) + bstr_t("'"),
          WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY,
          NULL,
          &pEnumerator2);
      if (FAILED(hres)) {
        pSvc->Release();
        pLoc->Release();
        return specs; // Program has failed.
      }

      while (pEnumerator2) {
        HRESULT hr = pEnumerator2->Next(WBEM_INFINITE, 1, &pclsObj2, &uReturn);

        if (0 == uReturn) {
          break;
        }

        VARIANT vtProp;

        JSON* properties = JSON::CreateObject();

        // Get the value of the Manufacturer property
        hr = pclsObj2->Get(L"Manufacturer", 0, &vtProp, 0, 0);
        properties->AddStringItem("manufacturer", WCHAR_TO_OVR_STRING(vtProp.bstrVal));
        VariantClear(&vtProp);

        // Get the value of the Manufacturer property
        hr = pclsObj2->Get(L"Name", 0, &vtProp, 0, 0);
        properties->AddStringItem("name", WCHAR_TO_OVR_STRING(vtProp.bstrVal));
        VariantClear(&vtProp);

        pclsObj2->Release();
        devices->AddArrayElement(properties);
      }
    }

    USBAntecedent->AddItem("Devices", devices);
    usbtree->AddArrayElement(USBAntecedent);
  }

  specs->AddItem("USB Tree", usbtree);

  // Cleanup
  // ========
  pSvc->Release();
  pLoc->Release();
  pEnumerator->Release();
  if (!pclsObj)
    pclsObj->Release();
  return specs;
}