Fix coverity issue
[platform/core/multimedia/libmm-camcorder.git] / src / mm_camcorder_util.c
index 37fdad7..55de4a2 100644 (file)
@@ -37,8 +37,6 @@
 #include <mm_util_imgp.h>
 #include <mm_util_jpeg.h>
 
-#include <storage.h>
-
 /*-----------------------------------------------------------------------
 |    GLOBAL VARIABLE DEFINITIONS for internal                          |
 -----------------------------------------------------------------------*/
@@ -48,6 +46,8 @@
 -----------------------------------------------------------------------*/
 #define TIME_STRING_MAX_LEN                     64
 #define __MMCAMCORDER_CAPTURE_WAIT_TIMEOUT      5
+#define __MMCAMCORDER_MAX_WIDTH                 8192
+#define __MMCAMCORDER_MAX_HEIGHT                8192
 
 #define FPUTC_CHECK(x_char, x_file) \
 { \
@@ -107,14 +107,14 @@ static int __gdbus_method_call_sync(GDBusConnection *conn, const char *bus_name,
                return MM_ERROR_INVALID_ARGUMENT;
        }
 
-       _mmcam_dbg_log("Dbus call - obj [%s], iface [%s], method [%s]", object, iface, method);
+       _mmcam_dbg_warn("Dbus call - obj [%s], iface [%s], method [%s]", object, iface, method);
 
        if (is_sync) {
                dbus_reply = g_dbus_connection_call_sync(conn,
                        bus_name, object, iface, method, args, NULL,
-                       G_DBUS_CALL_FLAGS_NONE, G_DBUS_REPLY_TIMEOUT, NULL, NULL);
+                       G_DBUS_CALL_FLAGS_NONE, G_DBUS_TIMEOUT, NULL, NULL);
                if (dbus_reply) {
-                       _mmcam_dbg_log("Method Call '%s.%s' Success", iface, method);
+                       _mmcam_dbg_warn("Method Call '%s.%s' Success", iface, method);
                        *result = dbus_reply;
                } else {
                        _mmcam_dbg_err("dbus method call sync reply failed");
@@ -122,9 +122,11 @@ static int __gdbus_method_call_sync(GDBusConnection *conn, const char *bus_name,
                }
        } else {
                g_dbus_connection_call(conn, bus_name, object, iface, method, args, NULL,
-                       G_DBUS_CALL_FLAGS_NONE, G_DBUS_REPLY_TIMEOUT, NULL, NULL, NULL);
+                       G_DBUS_CALL_FLAGS_NONE, G_DBUS_TIMEOUT, NULL, NULL, NULL);
        }
 
+       _mmcam_dbg_warn("done");
+
        return ret;
 }
 
@@ -164,8 +166,9 @@ static void __gdbus_stream_eos_cb(GDBusConnection *connection,
 {
        int played_idx = 0;
        _MMCamcorderGDbusCbInfo *gdbus_info = NULL;
+       mmf_camcorder_t *hcamcorder = NULL;
 
-       _mmcam_dbg_log("entered");
+       _mmcam_dbg_warn("entered");
 
        if (!param || !user_data) {
                _mmcam_dbg_err("invalid parameter %p %p", param, user_data);
@@ -173,13 +176,14 @@ static void __gdbus_stream_eos_cb(GDBusConnection *connection,
        }
 
        gdbus_info = (_MMCamcorderGDbusCbInfo *)user_data;
+       hcamcorder = (mmf_camcorder_t *)gdbus_info->mm_handle;
 
        g_variant_get(param, "(i)", &played_idx);
 
        g_mutex_lock(&gdbus_info->sync_mutex);
 
-       _mmcam_dbg_log("gdbus_info->param %d, played_idx : %d",
-               gdbus_info->param, played_idx);
+       _mmcam_dbg_warn("gdbus_info->param %d, played_idx : %d, handle : %p",
+               gdbus_info->param, played_idx, hcamcorder);
 
        if (gdbus_info->param == played_idx) {
                g_dbus_connection_signal_unsubscribe(connection, gdbus_info->subscribe_id);
@@ -193,6 +197,8 @@ static void __gdbus_stream_eos_cb(GDBusConnection *connection,
 
        g_mutex_unlock(&gdbus_info->sync_mutex);
 
+       _mmcam_dbg_warn("done");
+
        return;
 }
 
@@ -208,7 +214,7 @@ static int __gdbus_wait_for_cb_return(_MMCamcorderGDbusCbInfo *gdbus_info, int t
 
        g_mutex_lock(&gdbus_info->sync_mutex);
 
-       _mmcam_dbg_log("entered");
+       _mmcam_dbg_warn("entered");
 
        if (gdbus_info->is_playing == FALSE) {
                _mmcam_dbg_log("callback is already returned");
@@ -219,7 +225,7 @@ static int __gdbus_wait_for_cb_return(_MMCamcorderGDbusCbInfo *gdbus_info, int t
        end_time = g_get_monotonic_time() + (time_out * G_TIME_SPAN_MILLISECOND);
 
        if (g_cond_wait_until(&gdbus_info->sync_cond, &gdbus_info->sync_mutex, end_time)) {
-               _mmcam_dbg_log("wait signal received");
+               _mmcam_dbg_warn("wait signal received");
        } else {
                _mmcam_dbg_err("wait time is expired");
                ret = MM_ERROR_CAMCORDER_RESPONSE_TIMEOUT;
@@ -227,6 +233,8 @@ static int __gdbus_wait_for_cb_return(_MMCamcorderGDbusCbInfo *gdbus_info, int t
 
        g_mutex_unlock(&gdbus_info->sync_mutex);
 
+       _mmcam_dbg_warn("done");
+
        return ret;
 }
 
@@ -678,56 +686,90 @@ gboolean _mmcamcorder_update_composition_matrix(FILE *f, int orientation)
 }
 
 
-int _mmcamcorder_get_freespace(const gchar *path, const gchar *root_directory, guint64 *free_space)
+static int __mmcamcorder_storage_supported_cb(int storage_id, storage_type_e type,
+       storage_state_e state, const char *path, void *user_data)
 {
-       int ret = 0;
-       struct statvfs vfs;
+       _MMCamcorderStorageInfo *info = (_MMCamcorderStorageInfo *)user_data;
+
+       if (!info) {
+               _mmcam_dbg_err("NULL info");
+               return FALSE;
+       }
 
-       int is_internal = TRUE;
+       if (type == info->type) {
+               info->id = storage_id;
+               return FALSE;
+       }
+
+       return TRUE;
+}
+
+
+int _mmcamcorder_get_storage_info(const gchar *path, const gchar *root_directory, _MMCamcorderStorageInfo *info)
+{
+       int ret = 0;
        struct stat stat_path;
        struct stat stat_root;
 
-       if (path == NULL || free_space == NULL) {
-               _mmcam_dbg_err("invalid parameter %p, %p", path, free_space);
+       if (!path || !root_directory || !info) {
+               _mmcam_dbg_err("invalid parameter %p %p %p", path, root_directory, info);
                return -1;
        }
 
-       if (root_directory && strlen(root_directory) > 0) {
+       if (strlen(root_directory) > 0) {
                if (stat(path, &stat_path) != 0) {
-                       *free_space = 0;
                        _mmcam_dbg_err("failed to stat for [%s][errno %d]", path, errno);
                        return -1;
                }
 
                if (stat(root_directory, &stat_root) != 0) {
-                       *free_space = 0;
                        _mmcam_dbg_err("failed to stat for [%s][errno %d]", root_directory, errno);
                        return -1;
                }
 
-               if (stat_path.st_dev != stat_root.st_dev)
-                       is_internal = FALSE;
+               if (stat_path.st_dev == stat_root.st_dev)
+                       info->type = STORAGE_TYPE_INTERNAL;
+               else
+                       info->type = STORAGE_TYPE_EXTERNAL;
        } else {
-               _mmcam_dbg_warn("root_directory is NULL, assume that it's internal storage.");
+               info->type = STORAGE_TYPE_INTERNAL;
+               _mmcam_dbg_warn("invalid length of root directory, assume that it's internal storage.");
+       }
+
+       ret = storage_foreach_device_supported((storage_device_supported_cb)__mmcamcorder_storage_supported_cb, info);
+       if (ret != STORAGE_ERROR_NONE) {
+               _mmcam_dbg_err("storage_foreach_device_supported failed 0x%x", ret);
+               return -1;
        }
 
-       if (is_internal)
+       _mmcam_dbg_log("storage info - type %d, id %d", info->type, info->id);
+
+       return 0;
+}
+
+
+int _mmcamcorder_get_freespace(storage_type_e type, guint64 *free_space)
+{
+       int ret = 0;
+       struct statvfs vfs;
+
+       if (type == STORAGE_TYPE_INTERNAL)
                ret = storage_get_internal_memory_size(&vfs);
        else
                ret = storage_get_external_memory_size(&vfs);
 
-       if (ret < 0) {
+       if (ret != STORAGE_ERROR_NONE) {
                *free_space = 0;
-               _mmcam_dbg_err("failed to get memory size [%s]", path);
+               _mmcam_dbg_err("get memory size failed [type %d] 0x%x", type, ret);
                return -1;
-       } else {
-               *free_space = vfs.f_bsize * vfs.f_bavail;
-               /*
-               _mmcam_dbg_log("vfs.f_bsize [%lu], vfs.f_bavail [%lu]", vfs.f_bsize, vfs.f_bavail);
-               _mmcam_dbg_log("memory size %llu [%s]", *free_space, path);
-               */
-               return 1;
        }
+
+       *free_space = vfs.f_bsize * vfs.f_bavail;
+       /*
+       _mmcam_dbg_log("vfs.f_bsize [%lu], vfs.f_bavail [%lu]", vfs.f_bsize, vfs.f_bavail);
+       _mmcam_dbg_log("memory size %llu [%s]", *free_space, path);
+       */
+       return 0;
 }
 
 
@@ -786,7 +828,8 @@ int _mmcamcorder_send_sound_play_message(GDBusConnection *conn, _MMCamcorderGDbu
 {
        int get_value = 0;
        int ret = MM_ERROR_NONE;
-       GVariant *params = NULL, *result = NULL;
+       GVariant *params = NULL;
+       GVariant *result = NULL;
        guint subs_id = 0;
 
        if (!conn || !gdbus_info) {
@@ -836,12 +879,48 @@ int _mmcamcorder_send_sound_play_message(GDBusConnection *conn, _MMCamcorderGDbu
        g_mutex_unlock(&gdbus_info->sync_mutex);
 
        if (sync_play && ret == MM_ERROR_NONE)
-               ret = __gdbus_wait_for_cb_return(gdbus_info, G_DBUS_CB_TIMEOUT_MSEC);
+               ret = __gdbus_wait_for_cb_return(gdbus_info, G_DBUS_TIMEOUT);
 
        return ret;
 }
 
 
+void _mmcamcorder_request_dpm_popup(GDBusConnection *conn, const char *restricted_policy)
+{
+       int ret = MM_ERROR_NONE;
+       gboolean get_value = 0;
+       GVariant *params = NULL;
+       GVariant *result = NULL;
+
+       if (!conn || !restricted_policy) {
+               _mmcam_dbg_err("Invalid parameter %p %p", conn, restricted_policy);
+               return;
+       }
+
+       params = g_variant_new("(s)", restricted_policy);
+       result = g_variant_new("(b)", get_value);
+
+       ret = __gdbus_method_call_sync(conn,
+               "org.tizen.DevicePolicyManager",
+               "/org/tizen/DevicePolicyManager/Syspopup",
+               "org.tizen.DevicePolicyManager.Syspopup",
+               "show", params, &result, TRUE);
+       if (ret != MM_ERROR_NONE) {
+               _mmcam_dbg_err("Dbus Call on Client Error 0x%x", ret);
+               return;
+       }
+
+       if (result) {
+               g_variant_get(result, "(b)", &get_value);
+               _mmcam_dbg_log("request result : %d", get_value);
+       } else {
+               _mmcam_dbg_err("replied result is null");
+       }
+
+       return;
+}
+
+
 int _mmcamcorder_get_file_size(const char *filename, guint64 *size)
 {
        struct stat buf;
@@ -1135,16 +1214,17 @@ gboolean _mmcamcorder_msg_callback(void *data)
 
        /*_mmcam_dbg_log("msg id:%x, msg_cb:%p, msg_data:%p, item:%p", item->id, hcamcorder->msg_cb, hcamcorder->msg_data, item);*/
 
-       _MMCAMCORDER_LOCK((MMHandleType)hcamcorder);
+       _MMCAMCORDER_LOCK(hcamcorder);
 
        /* remove item from msg data */
        if (hcamcorder->msg_data) {
+               /*_mmcam_dbg_log("remove item %p", item);*/
                hcamcorder->msg_data = g_list_remove(hcamcorder->msg_data, item);
        } else {
                _mmcam_dbg_warn("msg_data is NULL but item[%p] will be removed", item);
        }
 
-       _MMCAMCORDER_UNLOCK((MMHandleType)hcamcorder);
+       _MMCAMCORDER_UNLOCK(hcamcorder);
 
        _MMCAMCORDER_LOCK_MESSAGE_CALLBACK(hcamcorder);
 
@@ -1169,10 +1249,9 @@ MSG_CALLBACK_DONE:
        } else if (item->id == MM_MESSAGE_CAMCORDER_VIDEO_CAPTURED || item->id == MM_MESSAGE_CAMCORDER_AUDIO_CAPTURED) {
                MMCamRecordingReport *report = (MMCamRecordingReport *)item->param.data;
                if (report) {
-                       if (report->recording_filename)
-                               SAFE_G_FREE(report->recording_filename);
-
-                       SAFE_G_FREE(report);
+                       SAFE_G_FREE(report->recording_filename);
+                       g_free(report);
+                       report = NULL;
                        item->param.data = NULL;
                }
        }
@@ -1784,7 +1863,7 @@ gboolean _mmcamcorder_encode_jpeg(void *src_data, unsigned int src_width, unsign
                return FALSE;
        }
 
-       ret = mm_util_jpeg_encode_to_memory(result_data, (int *)result_length,
+       ret = mm_util_jpeg_encode_to_memory(result_data, result_length,
                converted_src, src_width, src_height, jpeg_format, jpeg_quality);
 
        if (converted_src && (converted_src != src_data)) {
@@ -2163,6 +2242,12 @@ static gboolean _mmcamcorder_convert_NV12_to_I420(unsigned char *src, guint widt
                return FALSE;
        }
 
+       /* buffer overflow prevention check */
+       if (width > __MMCAMCORDER_MAX_WIDTH || height > __MMCAMCORDER_MAX_HEIGHT) {
+               _mmcam_dbg_err("too large size %d x %d", width, height);
+               return FALSE;
+       }
+
        dst_size = (width * height * 3) >> 1;
 
        _mmcam_dbg_log("NV12 -> I420 : %dx%d, dst size %d", width, height, dst_size);
@@ -2200,3 +2285,49 @@ static gboolean _mmcamcorder_convert_NV12_to_I420(unsigned char *src, guint widt
 
        return TRUE;
 }
+
+
+void _mmcamcorder_emit_dbus_signal(GDBusConnection *conn, const char *object_name,
+       const char *interface_name, const char *signal_name, int value)
+{
+       if (!conn || !object_name || !interface_name || !signal_name) {
+               _mmcam_dbg_err("NULL pointer %p %p %p %p",
+                       conn, object_name, interface_name, signal_name);
+               return;
+       }
+
+       if (!g_dbus_connection_emit_signal(conn, NULL,
+               object_name, interface_name, signal_name,
+               g_variant_new("(i)", value), NULL)) {
+               _mmcam_dbg_warn("failed to emit signal");
+       } else {
+               _mmcam_dbg_log("emit signal done - value 0x%.8x", value);
+               g_dbus_connection_flush(conn, NULL, NULL, NULL);
+               _mmcam_dbg_log("signal flush done");
+       }
+
+       return;
+}
+
+
+int _mmcamcorder_get_audiosrc_blocksize(int samplerate, int format, int channel, int interval, int *blocksize)
+{
+       int depth = 8;
+
+       if (!blocksize) {
+               _mmcam_dbg_err("NULL ptr");
+               return FALSE;
+       }
+
+       if (samplerate == 0 || channel == 0 || interval == 0) {
+               _mmcam_dbg_err("invalid param %d %d %d", samplerate, channel, interval);
+               return FALSE;
+       }
+
+       if (format == MM_CAMCORDER_AUDIO_FORMAT_PCM_S16_LE)
+               depth = 16;
+
+       *blocksize = samplerate * depth * channel * interval / 8000;
+
+       return TRUE;
+}