| // Copyright 2010-2015, Google Inc. |
| // All rights reserved. |
| // |
| // Redistribution and use in source and binary forms, with or without |
| // modification, are permitted provided that the following conditions are |
| // met: |
| // |
| // * Redistributions of source code must retain the above copyright |
| // notice, this list of conditions and the following disclaimer. |
| // * Redistributions in binary form must reproduce the above |
| // copyright notice, this list of conditions and the following disclaimer |
| // in the documentation and/or other materials provided with the |
| // distribution. |
| // * Neither the name of Google Inc. nor the names of its |
| // contributors may be used to endorse or promote products derived from |
| // this software without specific prior written permission. |
| // |
| // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
| // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
| // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
| // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
| // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
| // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
| // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
| // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
| // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
| // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
| // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
| |
| // A class handling the converter on the session layer. |
| |
| #ifndef MOZC_SESSION_SESSION_CONVERTER_H_ |
| #define MOZC_SESSION_SESSION_CONVERTER_H_ |
| |
| #include <string> |
| #include <vector> |
| |
| #include "base/port.h" |
| #include "base/scoped_ptr.h" |
| #include "session/session_converter_interface.h" |
| |
| namespace mozc { |
| namespace commands { |
| class CandidateList; |
| class Candidates; |
| class Context; |
| class Output; |
| class Preedit; |
| class Request; |
| class Result; |
| } // namespace commands |
| |
| namespace config { |
| class Config; |
| } // namespace config |
| |
| namespace session { |
| class CandidateList; |
| |
| // Class handling ConverterInterface with a session state. This class |
| // support stateful operations related with the converter. |
| class SessionConverter : public SessionConverterInterface { |
| public: |
| SessionConverter(const ConverterInterface *converter, |
| const commands::Request *request); |
| virtual ~SessionConverter(); |
| |
| // Updates OperationPreferences. |
| virtual void SetOperationPreferences(const OperationPreferences &preferences); |
| |
| // Checks if the current state is in the state bitmap. |
| virtual bool CheckState(States) const; |
| |
| // Indicates if the conversion session is active or not. In general, |
| // Convert functions make it active and Cancel, Reset and Commit |
| // functions make it deactive. |
| virtual bool IsActive() const; |
| |
| // Returns the default conversion preferences to be used for custom |
| // conversion. |
| virtual const ConversionPreferences &conversion_preferences() const; |
| |
| // Gets the selected candidate. If no candidate is selected, returns NULL. |
| virtual const Segment::Candidate * |
| GetSelectedCandidateOfFocusedSegment() const; |
| |
| // Sends a conversion request to the converter. |
| virtual bool Convert(const composer::Composer &composer); |
| virtual bool ConvertWithPreferences(const composer::Composer &composer, |
| const ConversionPreferences &preferences); |
| |
| // Gets reading text (e.g. from "猫" to "ねこ"). |
| virtual bool GetReadingText(const string &source_text, string *reading); |
| |
| // Sends a transliteration request to the converter. |
| virtual bool ConvertToTransliteration( |
| const composer::Composer &composer, |
| transliteration::TransliterationType type); |
| |
| // Converts the current composition to half-width characters. |
| // NOTE(komatsu): This function might be merged to ConvertToTransliteration. |
| virtual bool ConvertToHalfWidth(const composer::Composer &composer); |
| |
| // Switches the composition to Hiragana, full-width Katakana or |
| // half-width Katakana by rotation. |
| virtual bool SwitchKanaType(const composer::Composer &composer); |
| |
| // Sends a suggestion request to the converter. |
| virtual bool Suggest(const composer::Composer &composer); |
| virtual bool SuggestWithPreferences(const composer::Composer &composer, |
| const ConversionPreferences &preferences); |
| |
| // Sends a prediction request to the converter. |
| virtual bool Predict(const composer::Composer &composer); |
| virtual bool PredictWithPreferences(const composer::Composer &composer, |
| const ConversionPreferences &preferences); |
| |
| // Sends a prediction request to the converter. |
| // The result is added at the tail of existing candidate list as "suggestion" |
| // candidates. |
| virtual bool ExpandSuggestion(const composer::Composer &composer); |
| virtual bool ExpandSuggestionWithPreferences( |
| const composer::Composer &composer, |
| const ConversionPreferences &preferences); |
| |
| // Clears conversion segments, but keep the context. |
| virtual void Cancel(); |
| |
| // Clears conversion segments and the context. |
| virtual void Reset(); |
| |
| // Fixes the conversion with the current status. |
| virtual void Commit(const composer::Composer &composer, |
| const commands::Context &context); |
| |
| // Fixes the suggestion candidate. Stores the number of characters in the key |
| // of the committed candidate to committed_key_size. |
| // For example, assume that "日本語" was suggested as a candidate for "にほ". |
| // The key of the candidate is "にほんご". Therefore, when the candidate is |
| // committed by this function, consumed_key_size will be set to 4. |
| // |consumed_key_size| can be very large value |
| // (i.e. SessionConverter::kConsumedAllCharacters). |
| // In this case all the composition characters are consumed. |
| // Examples: |
| // - {composition: "にほんご|", value: "日本語", consumed_key_size: 4} |
| // This is usual case of suggestion/composition. |
| // - {composition: "にほんg|", value: "日本語", |
| // consumed_key_size: kConsumedAllCharacters} |
| // kConsumedAllCharacters can be very large value. |
| // - {composition: "わた|しのなまえ", value: "綿", |
| // consumed_key_size: 2} |
| // (Non-Auto) Partial suggestion. |
| // New composition is "しのなまえ". |
| // - {composition: "わたしのなまえ|", value: "私の", |
| // consumed_key_size: 4} |
| // Auto partial suggestion. |
| // Consumed the composition partially and "なまえ" becomes composition. |
| // - {composition: "じゅえり", value: "クエリ", |
| // consumed_key_size: 4} |
| // Typing correction. |
| // The value クエリ corresponds to raw composition "じゅえり". |
| // True is returned if the suggestion is successfully committed. |
| virtual bool CommitSuggestionByIndex(size_t index, |
| const composer::Composer &composer, |
| const commands::Context &context, |
| size_t *consumed_key_size); |
| |
| // Selects a candidate and commit the selected candidate. True is |
| // returned if the suggestion is successfully committed. |
| // c.f. CommitSuggestionInternal |
| virtual bool CommitSuggestionById(int id, |
| const composer::Composer &composer, |
| const commands::Context &context, |
| size_t *consumed_key_size); |
| |
| // Fixes only the conversion of the first segment, and keep the rest. |
| // The caller should delete characters from composer based on returned |
| // |committed_key_size|. |
| // If |consumed_key_size| is 0, this means that there is only a segment |
| // so Commit() method is called instead. In this case, the caller |
| // should not delete any characters. |
| // c.f. CommitSuggestionInternal |
| virtual void CommitFirstSegment(const composer::Composer &composer, |
| const commands::Context &context, |
| size_t *consumed_key_size); |
| |
| // Does allmost the same thing as CommitFirstSegment. |
| // The only difference is to fix the segments from the head to the focused. |
| virtual void CommitHeadToFocusedSegments(const composer::Composer &composer, |
| const commands::Context &context, |
| size_t *consumed_key_size); |
| |
| // Commits the preedit string represented by Composer. |
| virtual void CommitPreedit(const composer::Composer &composer, |
| const commands::Context &context); |
| |
| // Commits the specified number of characters at the head of the preedit |
| // string represented by Composer. |
| // The caller should delete characters from composer based on returned |
| // |consumed_key_size|. |
| // c.f. CommitSuggestionInternal |
| // TODO(yamaguchi): Enhance to support the conversion mode. |
| virtual void CommitHead(size_t count, |
| const composer::Composer &composer, |
| size_t *consumed_key_size); |
| |
| // Reverts the last "Commit" operation |
| virtual void Revert(); |
| |
| // Moves the focus of segments. |
| virtual void SegmentFocusRight(); |
| virtual void SegmentFocusLast(); |
| virtual void SegmentFocusLeft(); |
| virtual void SegmentFocusLeftEdge(); |
| |
| // Resizes the focused segment. |
| virtual void SegmentWidthExpand(const composer::Composer &composer); |
| virtual void SegmentWidthShrink(const composer::Composer &composer); |
| |
| // Moves the focus of candidates. |
| virtual void CandidateNext(const composer::Composer &composer); |
| virtual void CandidateNextPage(); |
| virtual void CandidatePrev(); |
| virtual void CandidatePrevPage(); |
| // Moves the focus to the candidate represented by the id. |
| virtual void CandidateMoveToId(int id, const composer::Composer &composer); |
| // Moves the focus to the index from the beginning of the current page. |
| virtual void CandidateMoveToPageIndex(size_t index); |
| // Moves the focus to the candidate represented by the shortcut. If |
| // the shortcut is not bound with any candidate, false is returned. |
| virtual bool CandidateMoveToShortcut(char shortcut); |
| |
| // Operation for the candidate list. |
| virtual void SetCandidateListVisible(bool visible); |
| |
| // Fills protocol buffers and update the internal status. |
| virtual void PopOutput(const composer::Composer &composer, |
| commands::Output *output); |
| |
| // Fills protocol buffers |
| virtual void FillOutput(const composer::Composer &composer, |
| commands::Output *output) const; |
| |
| // Sets setting by the request; |
| virtual void SetRequest(const commands::Request *request); |
| |
| // Set setting by the context. |
| virtual void OnStartComposition(const commands::Context &context); |
| |
| // Fills segments with the conversion preferences. |
| static void SetConversionPreferences( |
| const ConversionPreferences &preferences, |
| Segments *segments); |
| |
| // Copies SessionConverter |
| // TODO(hsumita): Copy all member variables. |
| // Currently, converter_ is not copied. |
| virtual SessionConverter *Clone() const; |
| |
| // Fills protocol buffers with all flatten candidate words. |
| void FillAllCandidateWords(commands::CandidateList *candidates) const; |
| |
| // Meaning that all the composition characters are consumed. |
| // c.f. CommitSuggestionInternal |
| static const size_t kConsumedAllCharacters; |
| |
| private: |
| friend class SessionConverterTest; |
| |
| // Resets the result value stored at the previous command. |
| void ResetResult(); |
| |
| // Resets the session state variables. |
| void ResetState(); |
| |
| // Notifies the converter that the current segment is focused. |
| void SegmentFocus(); |
| |
| // Notifies the converter that the current segment is fixed. |
| void SegmentFix(); |
| |
| // Fixes the conversion of the [0, segments_to_commit -1 ] segments, |
| // and keep the rest. |
| // Internal implementation for CommitFirstSegment and |
| // CommitHeadToFocusedSegment. |
| void CommitSegmentsInternal(const composer::Composer &composer, |
| const commands::Context &context, |
| size_t segments_to_commit, |
| size_t *consumed_key_size); |
| |
| // Gets preedit from segment(index) to segment(index + size). |
| void GetPreedit(size_t index, size_t size, string *preedit) const; |
| // Gets conversion from segment(index) to segment(index + size). |
| void GetConversion(size_t index, size_t size, string *conversion) const; |
| // Gets consumed size of the preedit characters. |
| // c.f. CommitSuggestionInternal |
| size_t GetConsumedPreeditSize(const size_t index, size_t size) const; |
| |
| // Performs the command if the command candidate is selected. True |
| // is returned if a command is performed. |
| bool MaybePerformCommandCandidate(size_t index, size_t size) const; |
| |
| // Updates internal states |
| bool UpdateResult(size_t index, size_t size, size_t *consumed_key_size); |
| |
| // Fills the candidate list with the focused segment's candidates. |
| // This method does not clear the candidate list before processing. |
| // Only the candidates of which id is not existent in the candidate list |
| // are appended. Other candidates are ignored. |
| void AppendCandidateList(); |
| // Clears the candidate list and fill it with the focused segment's |
| // candidates. |
| void UpdateCandidateList(); |
| |
| // Returns the candidate index to be used by the converter. |
| int GetCandidateIndexForConverter(const size_t segment_index) const; |
| |
| // If focus_id is pointing to the last of suggestions, |
| // call StartPrediction(). |
| void MaybeExpandPrediction(const composer::Composer &composer); |
| |
| // Returns the value of candidate to be used by the converter. |
| string GetSelectedCandidateValue(size_t segment_index) const; |
| |
| // Returns the candidate to be used by the converter. |
| const Segment::Candidate &GetSelectedCandidate(size_t segment_index) const; |
| |
| // Returns the length of committed candidate's key in characters. |
| // True is returned if the selected candidate is successfully committed. |
| bool CommitSuggestionInternal(const composer::Composer &composer, |
| const commands::Context &context, |
| size_t *committed_length); |
| |
| void SegmentFocusInternal(size_t segment_index); |
| void ResizeSegmentWidth(const composer::Composer &composer, int delta); |
| |
| void FillConversion(commands::Preedit *preedit) const; |
| void FillResult(commands::Result *result) const; |
| void FillCandidates(commands::Candidates *candidates) const; |
| |
| bool IsEmptySegment(const Segment &segment) const; |
| |
| // Handles selected_indices for usage stats. |
| void InitializeSelectedCandidateIndices(); |
| void UpdateSelectedCandidateIndex(); |
| void UpdateCandidateStats(const string &base_name, int32 index); |
| void CommitUsageStats( |
| SessionConverterInterface::State commit_state, |
| const commands::Context &context); |
| void CommitUsageStatsWithSegmentsSize( |
| SessionConverterInterface::State commit_state, |
| const commands::Context &context, |
| size_t submit_segment_size); |
| |
| SessionConverterInterface::State state_; |
| |
| const ConverterInterface *converter_; |
| scoped_ptr<Segments> segments_; |
| size_t segment_index_; |
| |
| // Previous suggestions to be merged with the current predictions. |
| Segment previous_suggestions_; |
| |
| // Default conversion preferences. |
| ConversionPreferences conversion_preferences_; |
| |
| // Preferences for user's operation. |
| OperationPreferences operation_preferences_; |
| |
| scoped_ptr<commands::Result> result_; |
| |
| scoped_ptr<CandidateList> candidate_list_; |
| bool candidate_list_visible_; |
| |
| const commands::Request *request_; |
| |
| // Selected index data of each segments for usage stats. |
| vector<int> selected_candidate_indices_; |
| |
| // Revision number of client context with which the converter determines when |
| // the history segments should be invalidated. See the implemenation of |
| // OnStartComposition for details. |
| int32 client_revision_; |
| |
| DISALLOW_COPY_AND_ASSIGN(SessionConverter); |
| }; |
| |
| } // namespace session |
| } // namespace mozc |
| |
| #endif // MOZC_SESSION_SESSION_CONVERTER_H_ |