Управление групповыми записями
Запись группы — это определенные данные, опубликованные для всех активных участников одноранговой группы, например сообщение чата или обновление состояния конкретного приложения. Запись представлена структурой PEER_RECORD и содержит следующие сведения о одноранговом узле:
- Идентификатор записи — это значение, которое однозначно идентифицирует запись в одноранговой группе.
- Guid, указывающий тип записи. Приложения могут поддерживать различные типы записей. Приложение интерпретирует поле данных записи на основе типа записи. Некоторые идентификаторы GUID зарезервированы, и вызов API возвращает PEER_E_NOT_AUTHORIZED , когда приложение пытается их использовать.
- Набор атрибутов записи, описываемых как строка XML. Атрибуты используются при поиске записей. Дополнительные сведения об атрибутах см. в разделе Схема атрибутов записи.
- Время создания записи в одноранговом узле.
- Время однорангового узла, в течение которого истекает срок действия записи.
- Время изменения записи в одноранговом узле.
- Создатель записи.
- Элемент, изменяющий запись.
- Структура PEER_DATA , содержащая криптографическую сигнатуру для всех полей в этой PEER_RECORD структуре. Одноранговый узел не может напрямую обновить или изменить это поле.
- Структура PEER_DATA , содержащая данные конкретного приложения, связанные с этой записью в виде массива байтов. Тип данных, присутствующих в этом поле, определяется типом записей, определяемым приложением.
Получение записей группы одноранговых узлов
Отдельные записи получаются путем вызова PeerGroupGetRecord с идентификатором записи. При обработке всех записей определенного типа перечисляемый набор всех записей текущей одноранговой группы получается путем вызова PeerGroupEnumRecords для открытия перечисления, а затем итеративного вызова PeerGetNextItem до тех пор, пока не будут получены все записи. По завершении закройте перечисление и освободите связанную с ним память, вызвав PeerEndEnumeration.
Когда одноранговый узел создает, удаляет или обновляет запись, затронутая запись публикуется для всех членов одноранговой группы с помощью события PEER_GROUP_EVENT_RECORD_CHANGE . Обратите внимание, что если одноранговый узел не подключен к группе, он получит обновленную запись, а затем при следующем подключении. Важно зарегистрироваться для этого события в PeerGroupRegisterEvent , если приложение поддерживает записи или управляет ими каким-либо значимым образом. Кроме того, приложение может запрашивать базу данных записей по запросу с помощью PeerGroupSearchRecords.
При возникновении события PEER_GROUP_EVENT_RECORD_CHANGE в качестве структуры PEER_EVENT_RECORD_CHANGE_DATA получается конкретный идентификатор и тип записи, а также тип изменения (добавление, обновление, удаление). Эта структура получается с помощью вызова PeerGroupGetEventData. Если изменение является добавлением или обновлением, следует использовать PeerGroupGetRecord , чтобы получить запись с указанным идентификатором. Локальная база данных записей для инфраструктуры обновляется автоматически.
Вы также можете искать определенные записи на основе определенных настраиваемых атрибутов, предоставленных в поле pwzAttributesPEER_RECORD, а также любых предопределенных атрибутов. Для этого используйте функцию PeerGroupSearchRecords с поисковым запросом XML в формате, указанном в разделе Формат запроса поиска записей .
Дополнительные сведения о работе с записями в одноранговой инфраструктуре см. в разделе Записистатьи Использование одноранговой инфраструктуры.
Администрирование записей одноранговых групп
Когда первоначальные приглашения выдаются создателем одноранговой группы, он может указать, что некоторые участники выполняют административную роль (PEER_GROUP_ROLE_ADMIN) всякий раз, когда он выдает новые учетные данные пользователю (через PeerGroupCreateInvitation или PeerGroupIssueCredentials). Администратор может напрямую добавлять, удалять и обновлять любые записи группы одноранговых узлов. И наоборот, член одноранговой группы с ролью PEER_GROUP_ROLE_MEMBER или PEER_GROUP_ROLE_INVITING_MEMBER может добавлять, обновлять и удалять только свои собственные записи.
Создатель по умолчанию имеет роль администратора.
Чтобы обновить запись, получите запись с помощью PeerGroupGetRecord или PeerGroupEnumRecords, внесите изменения и передайте обновленную запись в PeerGroupUpdateRecord.
Чтобы удалить запись, передайте идентификатор записи для удаления в PeerGroupDeleteRecord.
Чтобы добавить запись, создайте новую структуру PEER_RECORD и заполните следующие поля:
- dwSize. Это поле содержит значение sizeof(PEER_RECORD).
- ftExpiration. Это поле содержит дату и время окончания срока действия этой записи, выраженные в одноранговом времени в виде структуры FILETIME .
- type. Это поле содержит значение GUID , определяющее тип записи для приложения. Если этот тип является пользовательским для инфраструктуры приложения, необходимо также заполнить поле данных .
Следующие поля заполняются инфраструктурой и будут игнорироваться, если они заданы приложением:
- идентификатор
- pwzCreatorId
- pwzLastModifiedById
- ftCreation
- ftLastModified
- securityData
Остальные поля являются необязательными. Чтобы добавить эту новую запись в группу одноранговых узлов, передайте ее в PeerGroupAddRecord.
Импорт и экспорт записей
Одноранговые записи групп хранятся локально как база данных. Чтобы сохранить текущую snapshot базы данных записей одноранговой группы в локальный файл, вызовите PeerGroupExportDatabase и передайте его дескриптор группе одноранговых узлов. Затем этот файл можно перенести на другой компьютер или приложение, которое может извлечь и использовать эту базу данных записей, вызвав PeerGroupImportDatabase.