/** Load the variable data from file and set to variable data base. @param[in] FileHandle The file to be read. @param[in] Name The name of the variables to be loaded. @param[in] Guid The guid of the variables to be loaded. @param[out] Found TRUE when at least one variable was loaded and set. @retval SHELL_DEVICE_ERROR Cannot access the file. @retval SHELL_VOLUME_CORRUPTED The file is in bad format. @retval SHELL_OUT_OF_RESOURCES There is not enough memory to perform the operation. @retval SHELL_SUCCESS Successfully load and set the variables. **/ SHELL_STATUS LoadVariablesFromFile ( IN SHELL_FILE_HANDLE FileHandle, IN CONST CHAR16 *Name, IN CONST EFI_GUID *Guid, OUT BOOLEAN *Found ) { EFI_STATUS Status; SHELL_STATUS ShellStatus; UINT32 NameSize; UINT32 DataSize; UINTN BufferSize; UINTN RemainingSize; UINT64 Position; UINT64 FileSize; LIST_ENTRY List; DMP_STORE_VARIABLE *Variable; LIST_ENTRY *Link; CHAR16 *Attributes; UINT8 *Buffer; UINT32 Crc32; Status = ShellGetFileSize (FileHandle, &FileSize); if (EFI_ERROR (Status)) { return SHELL_DEVICE_ERROR; } ShellStatus = SHELL_SUCCESS; InitializeListHead (&List); Position = 0; while (Position < FileSize) { // // NameSize // BufferSize = sizeof (NameSize); Status = ShellReadFile (FileHandle, &BufferSize, &NameSize); if (EFI_ERROR (Status) || (BufferSize != sizeof (NameSize))) { ShellStatus = SHELL_VOLUME_CORRUPTED; break; } // // DataSize // BufferSize = sizeof (DataSize); Status = ShellReadFile (FileHandle, &BufferSize, &DataSize); if (EFI_ERROR (Status) || (BufferSize != sizeof (DataSize))) { ShellStatus = SHELL_VOLUME_CORRUPTED; break; } // // Name, Guid, Attributes, Data, Crc32 // RemainingSize = NameSize + sizeof (EFI_GUID) + sizeof (UINT32) + DataSize + sizeof (Crc32); BufferSize = sizeof (NameSize) + sizeof (DataSize) + RemainingSize; Buffer = AllocatePool (BufferSize); if (Buffer == NULL) { ShellStatus = SHELL_OUT_OF_RESOURCES; break; } BufferSize = RemainingSize; Status = ShellReadFile (FileHandle, &BufferSize, (UINT32 *) Buffer + 2); if (EFI_ERROR (Status) || (BufferSize != RemainingSize)) { ShellStatus = SHELL_VOLUME_CORRUPTED; FreePool (Buffer); break; } // // Check Crc32 // * (UINT32 *) Buffer = NameSize; * ((UINT32 *) Buffer + 1) = DataSize; BufferSize = RemainingSize + sizeof (NameSize) + sizeof (DataSize) - sizeof (Crc32); gBS->CalculateCrc32 ( Buffer, BufferSize, &Crc32 ); if (Crc32 != * (UINT32 *) (Buffer + BufferSize)) { FreePool (Buffer); ShellStatus = SHELL_VOLUME_CORRUPTED; break; } Position += BufferSize + sizeof (Crc32); Variable = AllocateZeroPool (sizeof (*Variable) + NameSize + DataSize); if (Variable == NULL) { FreePool (Buffer); ShellStatus = SHELL_OUT_OF_RESOURCES; break; } Variable->Signature = DMP_STORE_VARIABLE_SIGNATURE; Variable->Name = (CHAR16 *) (Variable + 1); Variable->DataSize = DataSize; Variable->Data = (UINT8 *) Variable->Name + NameSize; CopyMem (Variable->Name, Buffer + sizeof (NameSize) + sizeof (DataSize), NameSize); CopyMem (&Variable->Guid, Buffer + sizeof (NameSize) + sizeof (DataSize) + NameSize, sizeof (EFI_GUID)); CopyMem (&Variable->Attributes, Buffer + sizeof (NameSize) + sizeof (DataSize) + NameSize + sizeof (EFI_GUID), sizeof (UINT32)); CopyMem (Variable->Data, Buffer + sizeof (NameSize) + sizeof (DataSize) + NameSize + sizeof (EFI_GUID) + sizeof (UINT32), DataSize); InsertTailList (&List, &Variable->Link); FreePool (Buffer); } if ((Position != FileSize) || (ShellStatus != SHELL_SUCCESS)) { ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_DMPSTORE_LOAD_BAD_FILE), gShellDebug1HiiHandle, L"dmpstore"); if (Position != FileSize) { ShellStatus = SHELL_VOLUME_CORRUPTED; } } for ( Link = GetFirstNode (&List) ; !IsNull (&List, Link) && (ShellStatus == SHELL_SUCCESS) ; Link = GetNextNode (&List, Link) ) { Variable = CR (Link, DMP_STORE_VARIABLE, Link, DMP_STORE_VARIABLE_SIGNATURE); if (((Name == NULL) || gUnicodeCollation->MetaiMatch (gUnicodeCollation, Variable->Name, (CHAR16 *) Name)) && ((Guid == NULL) || CompareGuid (&Variable->Guid, Guid)) ) { Attributes = GetAttrType (Variable->Attributes); ShellPrintHiiEx ( -1, -1, NULL, STRING_TOKEN(STR_DMPSTORE_HEADER_LINE), gShellDebug1HiiHandle, Attributes, &Variable->Guid, Variable->Name, Variable->DataSize ); SHELL_FREE_NON_NULL(Attributes); *Found = TRUE; Status = gRT->SetVariable ( Variable->Name, &Variable->Guid, Variable->Attributes, Variable->DataSize, Variable->Data ); if (EFI_ERROR (Status)) { ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_DMPSTORE_LOAD_GEN_FAIL), gShellDebug1HiiHandle, L"dmpstore", Variable->Name, Status); } } } for (Link = GetFirstNode (&List); !IsNull (&List, Link); ) { Variable = CR (Link, DMP_STORE_VARIABLE, Link, DMP_STORE_VARIABLE_SIGNATURE); Link = RemoveEntryList (&Variable->Link); FreePool (Variable); } return ShellStatus; }
/** * \en * \_en * \ru * \brief Возвращает тип пользовательского поля объекта * * \param obj - объект, тип атрибута которого надо получить * \param attr - название атрибута * \param table - необязательный, таблица объекта (для документов) * \return тип атрибута, например "O 115" * * Пример использования * \code * cat = new Catalogue("Номенклатура"); * meta = new Meta(); * type = meta.GetAttrType(cat, "Наименование"); * \endcode * \_ru */ QString AExtMeta::GetAttrType(aObject * aobj, QString attr, QString table) { return GetAttrType( db->cfg.attr(aobj->obj, mda_name), attr, table ); }