Tizen 2.1 base
[platform/core/uifw/ise-engine-sunpinyin.git] / src / ime-core / imi_plugin.h
1 // -*- mode: c++ -*-
2 /*
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
4  *
5  * Copyright (c) 2007 Sun Microsystems, Inc. All Rights Reserved.
6  *
7  * The contents of this file are subject to the terms of either the GNU Lesser
8  * General Public License Version 2.1 only ("LGPL") or the Common Development and
9  * Distribution License ("CDDL")(collectively, the "License"). You may not use this
10  * file except in compliance with the License. You can obtain a copy of the CDDL at
11  * http://www.opensource.org/licenses/cddl1.php and a copy of the LGPLv2.1 at
12  * http://www.opensource.org/licenses/lgpl-license.php. See the License for the
13  * specific language governing permissions and limitations under the License. When
14  * distributing the software, include this License Header Notice in each file and
15  * include the full text of the License in the License file as well as the
16  * following notice:
17  *
18  * NOTICE PURSUANT TO SECTION 9 OF THE COMMON DEVELOPMENT AND DISTRIBUTION LICENSE
19  * (CDDL)
20  * For Covered Software in this distribution, this License shall be governed by the
21  * laws of the State of California (excluding conflict-of-law provisions).
22  * Any litigation relating to this License shall be subject to the jurisdiction of
23  * the Federal Courts of the Northern District of California and the state courts
24  * of the State of California, with venue lying in Santa Clara County, California.
25  *
26  * Contributor(s):
27  *
28  * If you wish your version of this file to be governed by only the CDDL or only
29  * the LGPL Version 2.1, indicate your decision by adding "[Contributor]" elects to
30  * include this software in this distribution under the [CDDL or LGPL Version 2.1]
31  * license." If you don't indicate a single choice of license, a recipient has the
32  * option to distribute your version of this file under either the CDDL or the LGPL
33  * Version 2.1, or to extend the choice of license to its licensees as provided
34  * above. However, if you add LGPL Version 2.1 code and therefore, elected the LGPL
35  * Version 2 license, then the option applies only if the new code is made subject
36  * to such option by the copyright holder.
37  */
38
39 #include <string>
40 #include <vector>
41
42 #include "portability.h"
43 #include "utils.h"
44
45 typedef wstring TPluginPreedit;
46 typedef wstring TPluginCandidate;
47
48 struct TPluginCandidateItem
49 {
50     size_t m_rank;
51     TPluginCandidate m_candidate;
52     TPluginCandidateItem(size_t rank, TPluginCandidate candidate)
53         : m_rank(rank), m_candidate(candidate) {}
54 };
55
56 typedef std::vector<TPluginCandidateItem> TPluginCandidates;
57
58 enum TPluginTypeEnum
59 {
60     CIMI_PLUGIN_PYTHON,
61     CIMI_PLUGIN_UNKNOWN
62 };
63
64 class CIMIPlugin
65 {
66 private:
67     TPluginTypeEnum m_pluginType;
68 protected:
69     CIMIPlugin(TPluginTypeEnum pluginType);
70 public:
71     virtual ~CIMIPlugin();
72     virtual TPluginCandidates provide_candidates(const TPluginPreedit& str,
73                                                  int* waitTime) = 0;
74     virtual TPluginCandidate  translate_candidate(const TPluginCandidate& candi,
75                                                   int* waitTime) = 0;
76
77     virtual std::string getName() = 0;
78     virtual std::string getAuthor() = 0;
79     virtual std::string getDescription() = 0;
80
81     TPluginTypeEnum getPluginType() const { return m_pluginType; }
82 };
83
84 class CIMIPluginManager
85 {
86 public:
87     CIMIPluginManager();
88     virtual ~CIMIPluginManager();
89
90     void            initializePlugins();
91
92     TPluginTypeEnum detectPluginType(std::string filename);
93     CIMIPlugin*     loadPlugin(std::string filename);
94     CIMIPlugin*     createPlugin(std::string filename,
95                                  TPluginTypeEnum pluginType);
96     size_t          getPluginSize() const { return m_plugins.size(); }
97     CIMIPlugin*     getPlugin(size_t i) { return m_plugins[i]; }
98
99     bool        hasLastError() const { return m_hasError; }
100     std::string getLastError() const { return m_lastError; }
101     void        setLastError(std::string desc);
102     void        clearLastError();
103
104     void        markWaitTime(int waitTime);
105     int         getWaitTime() const { return m_waitTime; }
106     void        resetWaitTime() { m_waitTime = 0; }
107 private:
108     std::vector<CIMIPlugin*> m_plugins;
109
110     bool        m_hasError;
111     std::string m_lastError;
112     int         m_waitTime;
113 };
114
115 typedef SingletonHolder<CIMIPluginManager> AIMIPluginManager;