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; }
//----------------------------------------------------------------------------- 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; }
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; }