2 * Copyright (c) 2014 Samsung Electronics Co., Ltd.
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
19 #include "clipboard-impl.h"
23 #include <Ecore_Wayland.h>
24 #include <dali/public-api/object/any.h>
25 #include <dali/public-api/object/type-registry.h>
26 #include <dali/integration-api/debug.h>
29 #ifdef DALI_ELDBUS_AVAILABLE
31 #endif // DALI_ELDBUS_AVAILABLE
34 #include <singleton-service-impl.h>
36 #define CBHM_DBUS_OBJPATH "/org/tizen/cbhm/dbus"
37 #ifndef CBHM_DBUS_INTERFACE
38 #define CBHM_DBUS_INTERFACE "org.tizen.cbhm.dbus"
39 #endif /* CBHM_DBUS_INTERFACE */
41 #define CLIPBOARD_STR "CLIPBOARD_STR"
42 #define CLIPBOARD_BUFFER_SIZE 512
44 ///////////////////////////////////////////////////////////////////////////////////////////////////
46 ///////////////////////////////////////////////////////////////////////////////////////////////////
57 struct Clipboard::Impl
61 Eldbus_Object *eldbus_obj;
62 cbhm_conn = eldbus_connection_get(ELDBUS_CONNECTION_TYPE_SESSION);
63 eldbus_obj = eldbus_object_get(cbhm_conn, CBHM_DBUS_INTERFACE, CBHM_DBUS_OBJPATH);
64 eldbus_proxy = eldbus_proxy_get(eldbus_obj, CBHM_DBUS_INTERFACE);
65 eldbus_name_owner_changed_callback_add(cbhm_conn, CBHM_DBUS_INTERFACE, NULL, cbhm_conn, EINA_TRUE);
66 eldbus_proxy_signal_handler_add(eldbus_proxy, "ItemClicked", _on_item_clicked, this);
68 mIsFirstTimeHidden = true;
74 eldbus_connection_unref(cbhm_conn);
77 Eldbus_Proxy* cbhm_proxy_get()
82 Eldbus_Connection* cbhm_connection_get()
87 void SetItem( const std::string &itemData )
89 const char *data = itemData.c_str();
90 const char *types[10] = {0, };
97 strcpy(mSendBuf, data);
99 // ELM_SEL_TYPE_CLIPBOARD - To distinguish clipboard selection in cbhm
100 types[++i] = "CLIPBOARD_BEGIN";
102 types[++i] = "application/x-elementary-markup";
103 types[++i] = "text/plain";
104 types[++i] = "text/plain;charset=utf-8";
106 // ELM_SEL_TYPE_CLIPBOARD - To distinguish clipboard selection in cbhm
107 types[++i] = "CLIPBOARD_END";
108 ecore_wl_dnd_selection_set(ecore_wl_input_get(), types);
113 const char *types[10] = {0, };
116 types[++i] = "application/x-elementary-markup";
117 types[++i] = "text/plain";
118 types[++i] = "text/plain;charset=utf-8";
119 ecore_wl_dnd_selection_get(ecore_wl_input_get(), *types);
122 char *ExcuteSend( void *event )
124 Ecore_Wl_Event_Data_Source_Send *ev = (Ecore_Wl_Event_Data_Source_Send *)event;
125 int len_buf = strlen(mSendBuf);
126 int len_remained = len_buf;
127 int len_written = 0, ret;
128 char *buf = mSendBuf;
130 while (len_written < len_buf)
132 ret = write(ev->fd, buf, len_remained);
133 if (ret == -1) break;
139 return (char *)mSendBuf;
142 char *ExcuteReceive( void *event )
144 Ecore_Wl_Event_Selection_Data_Ready *ev = (Ecore_Wl_Event_Selection_Data_Ready *)event;
146 strncpy(mReceiveBuf, (char *)ev->data, ev->len);
147 mReceiveBuf[ev->len] = '\0';
148 return (char *)mReceiveBuf;
153 Eldbus_Message *reply, *req;
154 const char *errname = NULL, *errmsg = NULL;
157 if (!(req = eldbus_proxy_method_call_new(eldbus_proxy, "CbhmGetCount")))
159 DALI_LOG_ERROR("Failed to create method call on org.freedesktop.DBus.Properties.Get");
163 eldbus_message_ref(req);
164 reply = eldbus_proxy_send_and_block(eldbus_proxy, req, 100);
165 if (!reply || eldbus_message_error_get(reply, &errname, &errmsg))
167 DALI_LOG_ERROR("Unable to call method org.freedesktop.DBus.Properties.Get: %s %s",
169 eldbus_message_unref(req);
173 if (!eldbus_message_arguments_get(reply, "i", &count))
175 DALI_LOG_ERROR("Cannot get arguments from eldbus");
176 eldbus_message_unref(req);
180 eldbus_message_unref(req);
181 DALI_LOG_ERROR("cbhm item count(%d)", count);
187 eldbus_proxy_call(cbhm_proxy_get(), "CbhmShow", NULL, NULL, -1, "s", "0");
188 mIsFirstTimeHidden = true;
192 void HideClipboard( bool skipFirstHide )
194 if ( skipFirstHide && mIsFirstTimeHidden )
196 mIsFirstTimeHidden = false;
199 eldbus_proxy_call(cbhm_proxy_get(), "CbhmHide", NULL, NULL, -1, "");
200 mIsFirstTimeHidden = false;
204 bool IsVisible() const
209 static void _on_item_clicked(void *data, const Eldbus_Message *msg EINA_UNUSED)
211 static_cast<Clipboard::Impl*>(data)->RequestItem();
214 Eldbus_Proxy *eldbus_proxy;
215 Eldbus_Connection *cbhm_conn;
217 char mSendBuf[CLIPBOARD_BUFFER_SIZE];
218 char mReceiveBuf[CLIPBOARD_BUFFER_SIZE];
220 bool mIsFirstTimeHidden;
223 Clipboard::Clipboard(Impl* impl)
228 Clipboard::~Clipboard()
232 Dali::Clipboard Clipboard::Get()
234 Dali::Clipboard clipboard;
236 Dali::SingletonService service( SingletonService::Get() );
239 // Check whether the singleton is already created
240 Dali::BaseHandle handle = service.GetSingleton( typeid( Dali::Clipboard ) );
243 // If so, downcast the handle
244 clipboard = Dali::Clipboard( dynamic_cast< Clipboard* >( handle.GetObjectPtr() ) );
248 Clipboard::Impl* impl( new Clipboard::Impl() );
249 clipboard = Dali::Clipboard( new Clipboard(impl) );
250 service.Register( typeid(Dali::Clipboard), clipboard );
257 bool Clipboard::SetItem(const std::string &itemData )
259 mImpl->SetItem( itemData );
264 * Request clipboard service to give an item
266 void Clipboard::RequestItem()
268 mImpl->RequestItem();
272 * Get number of items in clipboard
274 unsigned int Clipboard::NumberOfItems()
276 return mImpl->GetCount();
279 void Clipboard::ShowClipboard()
281 mImpl->ShowClipboard();
284 void Clipboard::HideClipboard(bool skipFirstHide)
286 mImpl->HideClipboard(skipFirstHide);
289 bool Clipboard::IsVisible() const
291 return mImpl->IsVisible();
294 char* Clipboard::ExcuteBuffered( bool type, void *event )
296 return (type ? mImpl->ExcuteSend( event ) : mImpl->ExcuteReceive( event ));
299 } // namespace Adaptor
301 } // namespace Internal