&ConnectionManager::SendAppControl, connmgr_.get(),
std::placeholders::_1, std::placeholders::_2, std::placeholders::_3));
+ DBusService::RegisterSendFileHandler("SendFile", std::bind(
+ &ConnectionManager::SendFile, connmgr_.get(),
+ std::placeholders::_1, std::placeholders::_2));
+
return true;
}
virtual void ExchangeCapabilities() = 0;
virtual bool SendAppControl(const std::string& device_id,
const unsigned char* data, size_t len) = 0;
+ virtual bool SendFile(const std::string& device_id,
+ const std::string& file_path) = 0;
protected:
CapabilityManager* capmgr_;
" <arg type='u' name='len' direction='in'/>"
" <arg type='b' name='result' direction='out'/>"
" </method>"
+ " <method name='SendFile'>"
+ " <arg type='s' name='device_id' direction='in'/>"
+ " <arg type='s' name='file_path' direction='in'/>"
+ " </method>"
" </interface>"
"</node>";
const char kDBusServiceName[] = "org.tizen.capmgr";
EventHandler().send_app_control_event.connect(handler);
}
+void DBusService::RegisterSendFileHandler(const std::string& method,
+ std::function<bool(const std::string&, const std::string&)> handler) {
+ if (method == "SendFile")
+ EventHandler().send_file_event.connect(handler);
+}
+
bool DBusService::HandleDiscoverUnownedDevices(GVariant* params,
GDBusMethodInvocation* invocation) {
EventHandler().on_event();
bool DBusService::HandleSendRemoteAppControl(GVariant* params,
GDBusMethodInvocation* invocation) {
- LOG(INFO) << "HandleSendRemoteCapabilities ";
+ LOG(INFO) << "HandleSendRemoteAppControl ";
gchar* device_id;
GVariantIter* iter;
guchar* data;
return true;
}
+bool DBusService::HandleSendFile(GVariant* params,
+ GDBusMethodInvocation* invocation) {
+ LOG(INFO) << "HandleSendFile ";
+ gchar* device_id;
+ gchar* file_path;
+
+ g_variant_get(params, "(&s&s)", &device_id, &file_path);
+
+ LOG(INFO) << "To: " << device_id;
+ LOG(INFO) << "Path: " << file_path;
+
+ EventHandler().send_file_event(device_id, file_path);
+ return true;
+}
+
void DBusService::HandleMethodCall(GDBusConnection* /* connection */,
const gchar* /* sender */, const gchar* /* object_path */,
const gchar* /* interface_name */, const gchar* method_name,
LOG(INFO) << " method call: " << method_name;
HandleSendRemoteAppControl(parameters, invocation);
return;
+ } else if (g_strcmp0("SendFile", method_name) == 0) {
+ HandleSendFile(parameters, invocation);
+ return;
}
g_dbus_method_invocation_return_value(invocation, g_variant_new("(b)", r));
static void RegisterSendAppcontrolHandler(const std::string& method,
std::function<bool(const std::string&, const unsigned char*,
size_t)> handler);
+ static void RegisterSendFileHandler(const std::string& method,
+ std::function<bool(const std::string&, const std::string&)> handler);
private:
class DBusMethodHandler {
boost::signals2::signal<void()> on_event2;
boost::signals2::signal<bool(const std::string&, const unsigned char*,
size_t)> send_app_control_event;
+ boost::signals2::signal<void(const std::string&,
+ const std::string&)> send_file_event;
};
static DBusMethodHandler& EventHandler() {
GDBusMethodInvocation* invocation);
bool HandleSendRemoteAppControl(GVariant* params,
GDBusMethodInvocation* invocation);
+ bool HandleSendFile(GVariant* params,
+ GDBusMethodInvocation* invocation);
void HandleMethodCall(GDBusConnection* connection,
const gchar* sender, const gchar* object_path,
#include <glib.h>
#include <mdg.h>
+#include <mdg_internal.h>
+#include <stdint.h>
#include <sys/types.h>
#include <unistd.h>
<< ", msg_id: " << msg_id;
}
+void SendFileProgressCb(const char* file_path, int64_t send_size,
+ int64_t total_size, int percent, void* user_data) {
+ LOG(INFO) << "SendFileProgressCb called. "
+ << "file_path: " << file_path
+ << "send_size: " << send_size
+ << "total_size: " << total_size
+ << "percent: " << percent;
+}
+
+void SendFileFinishCb(int result, mdg_device_h device,
+ void* user_data) {
+ LOG(INFO) << "SendFileFinishCb called. "
+ << "result: " << result;
+}
+
std::string GetDeviceIdFromHandle(const mdg_device_h device) {
char* val;
int ret = mdg_device_info_get_device_id(device, &val);
return true;
}
-bool MDGManager::SendData(const std::string& device_id, Command cmd,
- const unsigned char* data, size_t len) {
- LOG(INFO) << "SendData to " << device_id;
-
+mdg_device_h MDGManager::GetDeviceHandleFromId(const std::string& device_id) {
mdg_device_h device = nullptr;
for (auto& dev : GListRange<mdg_device_h>(device_list_)) {
char* dev_id;
break;
}
+ return device;
+}
+
+bool MDGManager::SendData(const std::string& device_id, Command cmd,
+ const unsigned char* data, size_t len) {
+ LOG(INFO) << "SendData to " << device_id;
+
+ mdg_device_h device = nullptr;
+
+ device = GetDeviceHandleFromId(device_id);
+
if (!device) {
LOG(ERROR) << "There is no such device in list!";
return false;
return true;
}
+bool MDGManager::SendFile(const std::string& device_id,
+ const std::string& file_path) {
+ LOG(INFO) << "SendFile to " << device_id;
+ LOG(INFO) << "File: " << file_path;
+
+ mdg_device_h device = nullptr;
+
+ device = GetDeviceHandleFromId(device_id);
+
+ if (!device) {
+ LOG(ERROR) << "There is no such device in list!";
+ return false;
+ }
+
+ int ret = mdg_device_send_file(mdg_handle_, device,
+ const_cast<char*>(file_path.c_str()), SendFileProgressCb,
+ SendFileFinishCb, this);
+
+ if (ret != MDG_ERROR_NONE)
+ LOG(ERROR) << "Failed to send file: " << MDGErrorToString(ret);
+
+ return true;
+}
+
void MDGManager::FindDevices() {
int ret = mdg_device_find(mdg_handle_, kRequestTimeout, false,
&MDGManager::DeviceFoundCb, &MDGManager::DeviceFinishCb, this);
bool AddDevice(const mdg_device_h device);
bool SendData(const std::string& device_id, Command cmd,
const unsigned char* data, size_t len);
+ bool SendFile(const std::string& device_id, const std::string& file_path);
+ mdg_device_h GetDeviceHandleFromId(const std::string& device_id);
static void ReceiveDataCb(int result, char* device_id, char* channel_id,
int msg_id, unsigned char* data, int len, void* user_data);
Client();
~Client();
- void Discover(GVariant* params);
void CapExchange(GVariant* params);
void SendAppControl(const std::string& device_id, const std::string& appid);
+ void SendFile(const std::string& device_id, const std::string& file_path);
void ListDevices();
private:
g_object_unref(conn_);
}
-void Client::Discover(GVariant* params) {
- GVariant* ret = ProxyCallSync("DiscoverUnownedDevices", params);
- if (!ret)
- return;
-
- g_variant_unref(ret);
-}
-
void Client::CapExchange(GVariant* params) {
GVariant* ret = ProxyCallSync("ExchangeCapabilities", params);
if (!ret)
<< std::endl;
}
+void Client::SendFile(const std::string& device_id,
+ const std::string& file_path) {
+ if (device_id.empty()) {
+ std::cout << "Target device is missing!" << std::endl;
+ return;
+ }
+
+ if (file_path.empty()) {
+ std::cout << "File path is missing!" << std::endl;
+ return;
+ }
+
+ std::cout << "Send file " << file_path << " to " << device_id << std::endl;
+
+ GVariant* params = g_variant_new("(ss)", device_id.c_str(),
+ file_path.c_str());
+ if (!params) {
+ std::cout << "out of memory" << std::endl;
+ return;
+ }
+
+ GVariant* ret = ProxyCallSync("SendFile", params);
+
+ g_object_unref(params);
+ g_object_unref(ret);
+}
+
GVariant* Client::ProxyCallSync(const char* method, GVariant* params) {
GError* error = nullptr;
GVariant* ret = g_dbus_proxy_call_sync(proxy_, method,
try {
options.add_options()
("help,h", "help")
- ("discovery,f", "discover devices&capabilities")
("capexchange,c", "capability exchange")
("device,d", bpo::value<std::string>(), "device id")
("send-appcontrol,s", bpo::value<std::string>(),
"send remote app-control")
- ("list-devices,l", "list remote devices");
+ ("list-devices,l", "list remote devices")
+ ("send-file,f", bpo::value<std::string>(), "send file");
bpo::store(bpo::parse_command_line(argc, argv, options), opt_map);
if (opt_map.count("help"))
std::cout << options << std::endl;
- else if (opt_map.count("discovery"))
- client.Discover(nullptr);
else if (opt_map.count("capexchange"))
client.CapExchange(nullptr);
else if (opt_map.count("send-appcontrol"))
opt_map["send-appcontrol"].as<std::string>());
else if (opt_map.count("list-devices"))
client.ListDevices();
+ else if (opt_map.count("send-file"))
+ client.SendFile(opt_map["device"].as<std::string>(),
+ opt_map["send-file"].as<std::string>());
+ else
+ std::cout << options << std::endl;
} catch (...) {
std::cout << "Exception occured" << std::endl;
}