[Title] Implement html5 media capture UI.
authorHyerim Bae <hyerim.bae@samsung.com>
Mon, 20 Aug 2012 06:50:57 +0000 (15:50 +0900)
committerHyerim Bae <hyerim.bae@samsung.com>
Mon, 27 Aug 2012 13:05:37 +0000 (22:05 +0900)
[Issue#] N/A
[Problem] html5 media capure was not supported.
[Cause] Not implemented.
[Solution] Implement media capture UI.
[Team] Browser UI
[Developer] Hyerim Bae (hyerim.bae)
[Request] N/A

Change-Id: I18ee3bddf08e28403af52ebe714f84d7afccfce7

Source/WebKit2/UIProcess/API/efl/OpenPanel.cpp
Source/WebKit2/UIProcess/API/efl/OpenPanel.h

index 9c38d7a..271339d 100755 (executable)
@@ -124,8 +124,101 @@ static void destroy_cb(ui_gadget_h ug, void* priv)
     return;
 }
 
+static void _cameraResultCb(service_h request, service_h reply, service_result_e result, void* data)
+{
+    OpenPanel* openPanel = static_cast<OpenPanel*>(data);
+
+    if (result == SERVICE_RESULT_SUCCEEDED) {
+        char* resultFilename = 0;
+        int ret = service_get_extra_data(reply, SERVICE_DATA_SELECTED, &resultFilename);
+        if (ret != SERVICE_ERROR_NONE)
+            return;
+
+        if (resultFilename) {
+            Eina_List* list = 0;
+            int len = strlen(resultFilename) + 1;
+            char* fileName = static_cast<char*>(malloc(sizeof(char) * len));
+            memset(fileName, 0, sizeof(char) * len);
+            strcpy(fileName, resultFilename);
+            list = eina_list_append(list, fileName);
+            ewk_view_open_panel_reply(openPanel->ewkView(), list, true);
+        }
+    }
+}
+
+bool OpenPanel::_capturePicture()
+{
+    service_h svcHandle = 0;
+    if (service_create(&svcHandle) < 0 || !svcHandle)
+        return false;
+
+    service_set_operation(svcHandle, SERVICE_OPERATION_CREATE_CONTENT);
+    service_set_mime(svcHandle, "image/jpg");
+    service_add_extra_data(svcHandle, "CALLER", "webkit");
+
+    int ret = service_send_launch_request(svcHandle, _cameraResultCb, this);
+    if (ret != SERVICE_ERROR_NONE) {
+        service_destroy(svcHandle);
+        return false;
+    }
+
+    service_destroy(svcHandle);
+
+    return true;
+}
+
+bool OpenPanel::_recordVideo()
+{
+    service_h svcHandle = 0;
+    if (service_create(&svcHandle) < 0 || !svcHandle)
+        return false;
+
+    service_set_operation(svcHandle, SERVICE_OPERATION_CREATE_CONTENT);
+    service_set_mime(svcHandle, "video/3gp");
+    service_add_extra_data(svcHandle, "CALLER", "webkit");
+
+    int ret = service_send_launch_request(svcHandle, _cameraResultCb, this);
+    if (ret != SERVICE_ERROR_NONE) {
+        service_destroy(svcHandle);
+        return false;
+    }
+
+    service_destroy(svcHandle);
+
+    return true;
+}
+
+bool OpenPanel::_recordVoice()
+{
+    service_h svcHandle = 0;
+    if (service_create(&svcHandle) < 0 || !svcHandle)
+        return false;
+
+    service_set_operation(svcHandle, SERVICE_OPERATION_CREATE_CONTENT);
+    service_set_mime(svcHandle, "audio/amr");
+
+    int ret = service_send_launch_request(svcHandle, _cameraResultCb, this);
+    if (ret != SERVICE_ERROR_NONE) {
+        service_destroy(svcHandle);
+        return false;
+    }
+
+    service_destroy(svcHandle);
+
+    return true;
+}
+
 bool OpenPanel::openPanel(Evas_Object* ewkView, Eina_Bool allow_multiple_files, Eina_List* accepted_mime_types, const char* capture, void* userData)
 {
+    if (capture) {
+        if (!strcmp(capture, "camera"))
+            return _capturePicture();
+        else if (!strcmp(capture, "camcorder"))
+            return _recordVideo();
+        else if (!strcmp(capture, "microphone"))
+            return _recordVoice();
+    }
+
     unsigned int i, n;
 
     Eina_Bool is_audio_extension_type = EINA_FALSE;
index ecb0146..11049ff 100755 (executable)
@@ -36,6 +36,10 @@ public:
     void close();
 
 private:
+    bool _capturePicture();
+    bool _recordVideo();
+    bool _recordVoice();
+
     Evas_Object* m_ewkView;
 };