#include <fcntl.h>
#include <unistd.h>
#include <errno.h>
-#include <stdio.h> /* fopen() */
-#include <system_info.h>
+#include <gio/gio.h>
#include "mm_util_gif.h"
#include "mm_util_gif_private.h"
#include "mm_util_debug.h"
#include <limits.h>
-#define GIF_TMP_FILE "/tmp/libmm_gif.gif"
+#define GIF_TMP_FILE "/tmp/.libmm_gif.gif"
#define COLORMAP_FREE(map) { if (map != NULL) { GifFreeMapObject(map); map = NULL; } }
#define RGB_ALLOC(r, g, b, number, size) { r = calloc(1, number * size); g = calloc(1, number * size); b = calloc(1, number * size); }
GifByteType *redP, *greenP, *blueP;
GifByteType *buffer = (GifByteType*)gif_image->image_data;
- mm_util_debug("__gif_extract_rgb_from_image");
+ mm_util_debug("__gif_extract_rgb");
RGB_ALLOC(redP, greenP, blueP, num_of_pixels, sizeof(GifByteType));
return MM_UTIL_ERROR_NONE;
}
-int _gif_encode_move_to_origin(const char *origin)
+int _gif_encode_move_to_file(const char *dst)
{
- const char *command = "/bin/cp";
- long ARG_MAX = sysconf(_SC_ARG_MAX);
- char *command_line = NULL;
-
- mm_util_retvm_if((((long)strlen(command) + (long)strlen(GIF_TMP_FILE) + (long)strlen(origin) + 3) >= ARG_MAX),
- MM_UTIL_ERROR_INVALID_OPERATION, "command is too long");
-
- command_line = (char *)calloc(1, ARG_MAX);
- mm_util_retvm_if(command_line == NULL, MM_UTIL_ERROR_OUT_OF_MEMORY, "memory allocation failed");
+ int ret = MM_UTIL_ERROR_NONE;
+ GFile *source = g_file_new_for_path(GIF_TMP_FILE);
+ GFile *destination = g_file_new_for_path(dst);
+ GError *error = NULL;
- snprintf(command_line, ARG_MAX, "%s %s %s", command, GIF_TMP_FILE, origin);
+ if (source == NULL || destination == NULL) {
+ mm_util_error("could not open file");
+ if (source)
+ g_object_unref(source);
+ if (destination)
+ g_object_unref(destination);
+ return MM_UTIL_ERROR_INVALID_OPERATION;
+ }
- mm_util_debug("[MV COMMAND: %s]", command_line);
- WEXITSTATUS(system(command_line));
+ gboolean result = g_file_copy(source, destination, G_FILE_COPY_OVERWRITE, NULL, NULL, NULL, &error);
+ if (!result) {
+ mm_util_error("g_file_copy failed: %s", error ? error->message : "none");
+ ret = MM_UTIL_ERROR_INVALID_OPERATION;
+ }
- MMUTIL_SAFE_FREE(command_line);
+ if (error)
+ g_error_free(error);
+ g_object_unref(source);
+ g_object_unref(destination);
- return MM_UTIL_ERROR_NONE;
+ return ret;
}
-int _gif_encode_move_to_origin_mem(const unsigned char *src, unsigned long src_size, void **dst, unsigned long *dst_size)
+int _gif_encode_move_to_mem(const unsigned char *src, unsigned long src_size, void **dst, unsigned long *dst_size)
{
unsigned char *buffer = NULL;
mm_util_retvm_if(src == NULL || dst == NULL || dst_size == NULL, MM_UTIL_ERROR_INVALID_PARAMETER, "Invalid parameter");
mm_util_retvm_if(src_size == 0, MM_UTIL_ERROR_INVALID_PARAMETER, "Invalid parameter");
+ mm_util_debug("src_size: %lu", src_size);
+
buffer = (unsigned char *)calloc(1, src_size);
mm_util_retvm_if(buffer == NULL, MM_UTIL_ERROR_OUT_OF_MEMORY, "memory allocation failed");
- mm_util_debug("src_size: %lu", src_size);
-
memcpy(buffer, src, src_size);
*dst = buffer;
mm_util_retvm_if(ret != MM_UTIL_ERROR_NONE, ret, "_gif_encode_close_file failed");
if (gif_file->filename != NULL) {
- ret= _gif_encode_move_to_origin(gif_file->filename);
+ ret= _gif_encode_move_to_file(gif_file->filename);
mm_util_retvm_if(ret != MM_UTIL_ERROR_NONE, ret, "__move_tmp_to_origin failed");
} else if (gif_file->write_data_ptr.mem != NULL) {
- ret = _gif_encode_move_to_origin_mem(gif_file->buffer, gif_file->write_data_ptr.size,
+ ret = _gif_encode_move_to_mem(gif_file->buffer, gif_file->write_data_ptr.size,
gif_file->enc_buffer, gif_file->enc_buffer_size);
MMUTIL_SAFE_FREE(gif_file->buffer);
gif_file->write_data_ptr.size = 0;
mm_util_retvm_if(gif_file == NULL, MM_UTIL_ERROR_INVALID_PARAMETER, "Invalid parameter");
mm_util_retvm_if(gif_file->saved_image == NULL, MM_UTIL_ERROR_INVALID_OPERATION, "Invalid parameter");
+ /* this way is for image_util_encode_run(), remove it later */
ret = mm_util_gif_encode_start(gif_file_h);
mm_util_retvm_if(ret != MM_UTIL_ERROR_NONE, ret, "mm_util_gif_encode_start failed");
gif_file_s *gif_file = (gif_file_s *)gif_file_h;
mm_util_retm_if(gif_file == NULL, "Invalid parameter");
- mm_util_retm_if(gif_file->GifFile == NULL, "GifFile is already closed");
+ mm_util_retm_if(gif_file->GifFile == NULL, "GifFile has already closed");
if (gif_file->GifFile != NULL) {
ret = _gif_encode_close_file(gif_file);