2025-11-28 00:35:46 +09:00

106 lines
5.0 KiB
C++

// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF
// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO
// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
// PARTICULAR PURPOSE.
//
// Copyright © Microsoft Corporation. All rights reserved
/****************************************************************************
* recomgr.h
* Support for queuing insertion points and correctly placing
* recognized text
*****************************************************************************/
#pragma once
#ifndef __RECOMGR_H
#define __RECOMGR_H
// A structure that represents a range waiting for a possible dictation result
typedef struct LISTENPOINT
{
CComPtr<ITextRange> cpRangeToReplace; // The entire range to be replaced
// when a recognition comes back
FILETIME ftTime;
bool fFromPhraseStart; // Indicates that this
// listening point was added
// because a phrasestart
// happened
bool fHasHypothesisText; // Indicates that this listen point
// has some hypothesis text associated
// with it
LISTENPOINT *pNext;
} LISTENPOINT;
// A queued message
typedef struct QUEUEDWM
{
HWND hWnd;
UINT message;
WPARAM wParam;
LPARAM lParam;
QUEUEDWM *pNext;
} QUEUEDWM;
/*****************************************************************************
* CRecoEventMgr *
*---------------*
* Handles the placement of recognized text according to the timing of
* the events
******************************************************************************/
class CRecoEventMgr
{
public:
CRecoEventMgr( HINSTANCE hInstance );
~CRecoEventMgr();
void SetTextSel( ITextSelection *pTextSel ) { m_pTextSel = pTextSel; }
bool IsProcessingPhrase() { return m_fPhraseStarted; }
// Methods called by app to notify CRecoEventMgr of events
HRESULT PhraseStart( ITextRange &rSelRange );
// Called when a PHRASE_START
// notification is received
HRESULT SelNotify( ITextRange &rSelRange ); // Called whenever the
// selection has changed
bool IsEditable( ITextRange *pRange, ITextRange **ppNextEditableRange );
// Returns false iff there is
// currently a reco computation
// going on and the current sel
// overlaps a listen point
void QueueCommand( HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam );
// Called when a WM_ messsage
// is received during a
// reco computation
ITextRange * Hypothesis( FILETIME ftRecoTime );
HRESULT Recognition( FILETIME ftRecoTime, ITextRange **ppRecoRange );
void FalseRecognition();
// Methods called by app when phrase-computation is over
void DoneProcessingPhrase(); // Turns off m_fPhraseStarted
// and cleans up the list
private:
void CleanUp(); // Frees up the lists and
// unleashes the waiting WM_s
void DeleteAfter( LISTENPOINT *pCutoff );
// Will delete all points in
// in the listening point list
// after pCutoff
// the head of the list
HINSTANCE m_hInst; // HINSTANCE for LoadString()
bool m_fPhraseStarted; // true iff there is a phrase being processed
ITextSelection *m_pTextSel; // The selection in DictationPad's window
LISTENPOINT *m_pHeadLP; // List of listening points, most recent first
QUEUEDWM *m_pHeadWM; // Queue of WM_s
QUEUEDWM *m_pTailWM;
}; /* class CRecoEventMgr */
// Helper function
int CompareFiletimes( FILETIME ft1, FILETIME ft2 );
bool AreDisjointRanges( ITextRange *pRange1, ITextRange *pRange2 );
bool AreNonOverlappingRanges( ITextRange *pRange1, ITextRange *pRange2 );
#endif // __RECOMGR_H