void ReplaceCharacterWithString(const TCHAR *szBaseString, TCHAR *szOutput, UINT cchMax, TCHAR chToReplace, const TCHAR *szReplacement) { TCHAR szNewString[1024]; int iBase = 0; int i = 0; szNewString[0] = '\0'; for(i = 0; i < lstrlen(szBaseString); i++) { if(szBaseString[i] == chToReplace) { StringCchCatN(szNewString, SIZEOF_ARRAY(szNewString), &szBaseString[iBase], i - iBase); StringCchCat(szNewString, SIZEOF_ARRAY(szNewString), szReplacement); iBase = i + 1; } } StringCchCatN(szNewString, SIZEOF_ARRAY(szNewString), &szBaseString[iBase], i - iBase); StringCchCopy(szOutput, cchMax, szNewString); }
BOOL CreateHiddenWindow( HINSTANCE hInstance, TCHAR *szFile ) { TCHAR szTitle[MAX_PATH + sizeof(CUTSCENE_NAME) + 5]; // Set up and register window class WNDCLASS wc = {0}; wc.lpfnWndProc = (WNDPROC) WindowProc; wc.hInstance = hInstance; wc.lpszClassName = CUTSCENE_NAME; if (!RegisterClass(&wc)) return FALSE; // Prevent buffer overrun by restricting size of title to MAX_PATH (void)StringCchPrintf(szTitle, NUMELMS(szTitle), TEXT("%s: \0"), CUTSCENE_NAME); StringCchCatN(szTitle, NUMELMS(szTitle), szFile, MAX_PATH); // Create a window of zero size that will serve as the sink for // keyboard input. If this media file has a video component, then // a second ActiveMovie window will be displayed in which the video // will be rendered. Setting keyboard focus on this application window // will allow the user to move the video window around the screen, make // it full screen, resize, center, etc. independent of the application // window. If the media file has only an audio component, then this will // be the only window created. g_hwndMain = CreateWindowEx( 0, CUTSCENE_NAME, szTitle, 0, // not visible 0, 0, 0, 0, NULL, NULL, hInstance, NULL ); return (g_hwndMain != NULL); }
/// Function name : performXMLCharacterEntityReplacement // Description : // // TCHAR* szInput : [in] // CONST UINT iInputLength : [in] // // Return Value : New string length // UINT performXMLCharacterEntityReplacement(TCHAR* szInput, CONST UINT iInputLength) { CONST TCHAR *szPosition, // Current position *szEntity, // Entity being parsed *szSemiColon; // Semicolon marking the end of the entity TCHAR *szBuffer, // Output Assembly buffer szCharacter[2]; // Converted entity character as a string // Prepare szCharacter[1] = NULL; szPosition = szInput; // Create working buffer szBuffer = utilCreateEmptyString(iInputLength); /// [CHECK] Find next entity while (szPosition AND (szEntity = utilFindSubString(szPosition, "&#"))) { // Copy preceeding characters to output if (szEntity - szPosition) StringCchCatN(szBuffer, iInputLength, szPosition, szEntity - szPosition); /// [CHECK] Find end marker if (szSemiColon = utilFindCharacter(szEntity, ';')) { // [CHECK] Examine encoding type if (szEntity[2] == 'x') // [HEX] &#xhhhh utilScanf(&szEntity[3], TEXT("%04x"), &szCharacter[0]); else // [DECIMAL] &#nnnn szCharacter[0] = utilConvertStringToInteger(&szEntity[2]); /// [FOUND] Append entity and update position StringCchCat(szBuffer, iInputLength, szCharacter); szPosition = &szSemiColon[1]; } else { /// [NOT FOUND] Copy marker and remainder of string to the output buffer StringCchCat(szBuffer, iInputLength, szEntity); szPosition = NULL; } } /// [COMPLETE] Overwrite input buffer StringCchCopy(szInput, iInputLength, szBuffer); /// Append remainder of string if (szPosition) StringCchCat(szInput, iInputLength, szPosition); // Cleanup and return length utilDeleteString(szBuffer); return lstrlen(szInput); }
HRESULT CDIME::_HandleCandidateWorker(TfEditCookie ec, _In_ ITfContext *pContext) { debugPrint(L"CDIME::_HandleCandidateWorker() \n"); HRESULT hr = S_OK; CStringRange commitString, convertedString; CDIMEArray<CCandidateListItem> candidatePhraseList; CStringRange lastChar; CStringRange notify; if (nullptr == _pUIPresenter) { goto Exit; //should not happen } const WCHAR* pCandidateString = nullptr; DWORD_PTR candidateLen = 0; BOOL arrayUsingSPCode =FALSE; if (!_IsComposing()) _StartComposition(pContext); if (Global::imeMode == IME_MODE_ARRAY)// check if the _strokebuffer is array special code { candidateLen = _pCompositionProcessorEngine->CollectWordFromArraySpeicalCode(&pCandidateString); if(candidateLen) arrayUsingSPCode = TRUE; } candidateLen = 0; candidateLen = _pUIPresenter->_GetSelectedCandidateString(&pCandidateString); if (candidateLen == 0) { if(_candidateMode == CANDIDATE_WITH_NEXT_COMPOSITION || _candidateMode == CANDIDATE_PHRASE) { _HandleCancel(ec, pContext); goto Exit; } else { hr = S_FALSE; _HandleCancel(ec, pContext); DoBeep(BEEP_COMPOSITION_ERROR); //beep for no valid mapping found goto Exit; } } if (_pCompositionProcessorEngine->IsArrayShortCode() && candidateLen == 1 && *pCandidateString == 0x2394) // empty position in arry short code table. { hr = S_FALSE; if (Global::imeMode == IME_MODE_PHONETIC) DoBeep(BEEP_WARNING); else { if (CConfig::GetClearOnBeep()) _HandleCancel(ec, pContext); DoBeep(BEEP_COMPOSITION_ERROR); //beep for no valid mapping found } goto Exit; } StringCchCopy(_commitString, 1, L"\0"); StringCchCatN(_commitString, MAX_COMMIT_LENGTH, pCandidateString, candidateLen); commitString.Set(_commitString, candidateLen); //_commitString = commitString; PWCHAR pwch = new (std::nothrow) WCHAR[2]; // pCandidateString will be destroyed after _detelteCanddiateList was called. if(candidateLen > 1) { StringCchCopyN(pwch, 2, pCandidateString + candidateLen -1, 1); }else // cnadidateLen ==1 { StringCchCopyN(pwch, 2, pCandidateString, 1); } lastChar.Set(pwch, 1 ); //-----------------do reverse conversion notify. We should not show notify in UI-less mode, thus cancel reverse conversion notify in UILess Mode if (!_IsUILessMode()) { if (_pITfReverseConversion[Global::imeMode]) { _AsyncReverseConversion(pContext); //asynchronized the reverse conversion with editsession for better perfomance } //-----------------or complete real key code when input with wildcard else if (_isCandidateWithWildcard) { const WCHAR* pCandidateKeyCode = nullptr; DWORD_PTR keyCodeLen = _pUIPresenter->_GetSelectedCandidateKeyCode(&pCandidateKeyCode); StringCchCopy(_commitKeyCode, 1, L"\0"); StringCchCatN(_commitKeyCode, MAX_KEY_LENGTH, pCandidateKeyCode, keyCodeLen); CStringRange commitKeyCode, convertedKeyCode; _pCompositionProcessorEngine->GetReadingString(&convertedKeyCode, NULL, &commitKeyCode.Set(_commitKeyCode, wcslen(_commitKeyCode))); _pUIPresenter->ShowNotifyText(&convertedKeyCode); } } //-----------------do array spcial code notify. We should not show notify in UI-less mode, thus cancel forceSP mode in UILess Mode--- BOOL ArraySPFound = FALSE; if(Global::imeMode == IME_MODE_ARRAY && !_IsUILessMode() && !arrayUsingSPCode && (CConfig::GetArrayForceSP() || CConfig::GetArrayNotifySP())) { CStringRange specialCode; CStringRange notifyText; ArraySPFound = _pCompositionProcessorEngine->GetArraySpeicalCodeFromConvertedText(&commitString, &specialCode); if(specialCode.Get()) _pUIPresenter->ShowNotifyText(&specialCode); } convertedString = commitString; //----------------- do TC to SC covert if required---------------------------------------------------------------------------------- if(CConfig::GetDoHanConvert()) { _pCompositionProcessorEngine->GetSCFromTC(&commitString, &convertedString); } //----------------- commit the selected string ------------------------------------------------------------------------------------ if(Global::imeMode == IME_MODE_ARRAY && !_IsUILessMode() && !arrayUsingSPCode && CConfig::GetArrayForceSP() && ArraySPFound ) { _HandleCancel(ec, pContext); DoBeep(BEEP_WARNING); return hr; } else { hr = _AddComposingAndChar(ec, pContext, &convertedString); if (FAILED(hr)) return hr; // Do not send _endcandidatelist (or handleComplete) here to avoid cand dissapear in win8 metro _HandleComplete(ec,pContext); } //-----------------do accociated phrase (make phrase)-------------------------------------------------------------------------------- if (CConfig::GetMakePhrase()) { _pCompositionProcessorEngine->GetCandidateStringInConverted(lastChar, &candidatePhraseList); // We have a candidate list if candidatePhraseList.Cnt is not 0 // If we are showing reverse conversion, use UIPresenter if (candidatePhraseList.Count()) { CStringRange emptyComposition; if (!_IsComposing()) _StartComposition(pContext); //StartCandidateList require a valid selection from a valid pComposition to determine the location to show the candidate window _AddComposingAndChar(ec, pContext, &emptyComposition.Set(L" ",1)); _pUIPresenter->_ClearCandidateList(); _pUIPresenter->_SetCandidateTextColor(CConfig::GetPhraseColor(), CConfig::GetItemBGColor()); // Text color is green _pUIPresenter->_SetCandidateSelectedTextColor(CConfig::GetSelectedColor(), CConfig::GetSelectedBGColor()); _pUIPresenter->_SetCandidateNumberColor(CConfig::GetNumberColor(), CConfig::GetItemBGColor()); _pUIPresenter->_SetCandidateFillColor(CConfig::GetItemBGColor());//(HBRUSH)(COLOR_WINDOW+1)); // Background color is window _pUIPresenter->_SetCandidateText(&candidatePhraseList, _pCompositionProcessorEngine->GetCandidateListIndexRange(), TRUE, _pCompositionProcessorEngine->GetCandidateWindowWidth()); _pUIPresenter->_SetCandidateSelection(-1, FALSE); // set selected index to -1 if showing phrase candidates _candidateMode = CANDIDATE_PHRASE; _isCandidateWithWildcard = FALSE; } else { //cancel the composition if the phrase lookup return 0 results _HandleCancel(ec,pContext); } } else _DeleteCandidateList(TRUE, pContext); // endCanddiateUI if not doing associated phrase. Exit: return hr; }