Поделиться через


Блокировки документов

Протокол блокировки документов

Чтобы запросить блокировку документа для приложений на основе ACP, диспетчер TSF вызывает ITextStoreACP::RequestLock. Для приложений на основе привязки диспетчер TSF вызывает ITextStoreAnchor::RequestLock. Приложение предоставляет блокировку документа путем вызова ITextStoreACSink::OnLockGranted (приложения на основе ACP) или ITextStoreAnchorSink::OnLockGranted (приложения на основе привязки) внутри RequestLock. Блокировка действительна только во время вызова OnLockGranted. Когда OnLockGranted возвращается, документ считается разблокирован.

Типы блокировок документов

Существует два типа блокировок документов, доступных только для чтения и чтения и записи. Блокировка только для чтения позволяет руководителю читать текст, но он не может изменять или вставлять текст. Блокировка чтения и записи позволяет руководителю читать, изменять и вставлять текст. Блокировка только для чтения запрашивается путем указания TS_LF_READ в dwFlags. Блокировка чтения и записи запрашивается путем указания TS_LF_READWRITE в dwFlags.

Асинхронные и синхронные запросы

Запрос блокировки может быть синхронным или асинхронным. Диспетчер запрашивает синхронную блокировку с помощью флага TS_LF_SYNC в dwFlags. Если этот флаг отсутствует, запрос является асинхронным.

Предоставление блокировки

При вызове RequestLock приложение должно определить, заблокирован ли документ. Если документ не заблокирован, и нет другой причины запретить блокировку, приложение должно задать phrSession S_OK и вернуть S_OK.

Если документ заблокирован и запрос блокировки синхронен, приложение должно задать phrSession TS_E_SYNCHRONOUS и вернуть S_OK. Это означает, что синхронный запрос не может быть предоставлен.

Если документ заблокирован и запрос блокировки асинхронен, приложение должно очередью запроса, задайте phrSession TS_S_ASYNC и возвратить S_OK. Когда документ становится доступным, приложение должно удалить запрос из очереди и вызвать OnLockGranted. Эта очередь запросов на блокировку является необязательным; Существует один сценарий, который должен поддерживать приложение. Если документ имеет блокировку только для чтения, новый запрос блокировки считывается или записывается, и запрос асинхронный, приложение вызывается в OnLockGranted, что вызвало повторный вызов RequestLock. Приложение должно задать phrSession TS_S_ASYNC и вернуть S_OK. После вызова OnLockGranted приложение должно обработать запрос на обновление, вызвав OnLockGranted снова с TS_LF_READWRITE.

Принудительное применение блокировки

Приложение должно убедиться, что правильный тип блокировки существует, прежде чем разрешить доступ к документу. Например, приложение должно убедиться, что документ имеет по крайней мере блокировку только для чтения, прежде чем разрешить ITextStoreACP::GetText или ITextStoreAnchor::GetText продолжить. Если соответствующая блокировка не существует, приложение должно вернуть TF_E_NOLOCK.

текстовых хранилищ

ITextStoreACP::RequestLock

ITextStoreACPSink::OnLockGranted

ITextStoreACP::GetText

ITextStoreAnchor::RequestLock

ITextStoreAnchorSink::OnLockGranted

ITextStoreAnchor::GetText