]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
FS-11310 #resolve add optional switch_core_file_pre_close() to stop writing to file...
authorLiyang <liyang@x-y-t.cn>
Mon, 23 Jul 2018 13:40:29 +0000 (21:40 +0800)
committerSeven Du <dujinfang@gmail.com>
Fri, 3 Aug 2018 13:54:47 +0000 (21:54 +0800)
src/include/switch_core.h
src/include/switch_module_interfaces.h
src/include/switch_types.h
src/switch_core_file.c

index a07ea36a1ea69618084f1d9f2a2e86e566b9fd8d..3ec8130d984ec50412800326db421e944169011a 100644 (file)
@@ -1941,6 +1941,12 @@ SWITCH_DECLARE(switch_status_t) switch_core_file_set_string(_In_ switch_file_han
 */
 SWITCH_DECLARE(switch_status_t) switch_core_file_get_string(_In_ switch_file_handle_t *fh, switch_audio_col_t col, const char **string);
 
+/*!
+  \brief Pre close an open file handle, then can get file size etc., no more wirte to the file
+  \param fh the file handle to close
+  \return SWITCH_STATUS_SUCCESS if the file handle was pre closed
+*/
+SWITCH_DECLARE(switch_status_t) switch_core_file_pre_close(_In_ switch_file_handle_t *fh);
 
 /*!
   \brief Close an open file handle
index da6d6be91e2f56a3db4152fe91877460a224ce91..902c5c4c984ae4c00418a0bf6ba9c5cdf937ede4 100644 (file)
@@ -298,6 +298,8 @@ struct switch_file_interface {
        switch_status_t (*file_set_string) (switch_file_handle_t *fh, switch_audio_col_t col, const char *string);
        /*! function to get meta data */
        switch_status_t (*file_get_string) (switch_file_handle_t *fh, switch_audio_col_t col, const char **string);
+       /*! function to pre close the file to read params */
+       switch_status_t (*file_pre_close) (switch_file_handle_t *fh);
        /*! function to control the underlying tech of the file  */
        switch_status_t (*file_command) (switch_file_handle_t *fh, switch_file_command_t command);
        /*! list of supported file extensions */
index 652836b17cf5b9eb17a004ae8aaa3585f8860e40..a44d97dafef05b977efd1e07051153ec8023d216 100644 (file)
@@ -583,12 +583,22 @@ typedef enum {
 typedef uint32_t switch_caller_profile_flag_t;
 
 typedef enum {
+       // flags matching libsndfile
        SWITCH_AUDIO_COL_STR_TITLE = 0x01,
        SWITCH_AUDIO_COL_STR_COPYRIGHT = 0x02,
        SWITCH_AUDIO_COL_STR_SOFTWARE = 0x03,
        SWITCH_AUDIO_COL_STR_ARTIST = 0x04,
        SWITCH_AUDIO_COL_STR_COMMENT = 0x05,
-       SWITCH_AUDIO_COL_STR_DATE = 0x06
+       SWITCH_AUDIO_COL_STR_DATE = 0x06,
+       SWITCH_AUDIO_COL_STR_ALBUM = 0x07,
+       SWITCH_AUDIO_COL_STR_LICENSE = 0x08,
+       SWITCH_AUDIO_COL_STR_TRACKNUMBER = 0x09,
+       SWITCH_AUDIO_COL_STR_GENRE = 0x10,
+
+       // custom flags
+       SWITCH_AUDIO_COL_STR_FILE_SIZE = 0xF0,
+       SWITCH_AUDIO_COL_STR_FILE_TRIMMED = 0xF1,
+       SWITCH_AUDIO_COL_STR_FILE_TRIMMED_MS = 0xF2
 } switch_audio_col_t;
 
 typedef enum {
index f7cfd7b1c3e39e175e06ae0171091fb744b4366f..e2b71d19d162e7da6a5fd39754f94ea42498e0c1 100644 (file)
 #include <switch.h>
 #include "private/switch_core_pvt.h"
 
+
+static switch_status_t get_file_size(switch_file_handle_t *fh, const char **string)
+{
+       switch_status_t status;
+       switch_file_t *newfile;
+       switch_size_t size = 0;
+
+       status = switch_file_open(&newfile, fh->spool_path ? fh->spool_path : fh->file_path, SWITCH_FOPEN_READ, SWITCH_FPROT_OS_DEFAULT, fh->memory_pool);
+
+       if (status != SWITCH_STATUS_SUCCESS) {
+               return status;
+       }
+
+       size = switch_file_get_size(newfile);
+
+       if (size) {
+               *string = switch_core_sprintf(fh->memory_pool, "%" SWITCH_SIZE_T_FMT, size);
+       }
+
+       status = switch_file_close(newfile);
+
+       return status;
+}
+
 SWITCH_DECLARE(switch_status_t) switch_core_perform_file_open(const char *file, const char *func, int line,
                                                                                                                          switch_file_handle_t *fh,
                                                                                                                          const char *file_path,
@@ -751,18 +775,32 @@ SWITCH_DECLARE(switch_status_t) switch_core_file_set_string(switch_file_handle_t
 
 SWITCH_DECLARE(switch_status_t) switch_core_file_get_string(switch_file_handle_t *fh, switch_audio_col_t col, const char **string)
 {
+       switch_status_t status;
+
        switch_assert(fh != NULL);
        switch_assert(fh->file_interface != NULL);
 
-       if (!switch_test_flag(fh, SWITCH_FILE_OPEN)) {
+       if (!switch_test_flag(fh, SWITCH_FILE_OPEN) && col < SWITCH_AUDIO_COL_STR_FILE_SIZE) {
                return SWITCH_STATUS_FALSE;
        }
 
        if (!fh->file_interface->file_get_string) {
+               if (col == SWITCH_AUDIO_COL_STR_FILE_SIZE) {
+                       return get_file_size(fh, string);
+               }
+
                return SWITCH_STATUS_FALSE;
        }
 
-       return fh->file_interface->file_get_string(fh, col, string);
+       status = fh->file_interface->file_get_string(fh, col, string);
+
+       if (status == SWITCH_STATUS_SUCCESS && string) return status;
+
+       if (col == SWITCH_AUDIO_COL_STR_FILE_SIZE) {
+               return get_file_size(fh, string);
+       }
+
+       return status;
 }
 
 SWITCH_DECLARE(switch_status_t) switch_core_file_truncate(switch_file_handle_t *fh, int64_t offset)
@@ -825,17 +863,20 @@ SWITCH_DECLARE(switch_status_t) switch_core_file_command(switch_file_handle_t *f
        return status;
 }
 
-
-SWITCH_DECLARE(switch_status_t) switch_core_file_close(switch_file_handle_t *fh)
+SWITCH_DECLARE(switch_status_t) switch_core_file_pre_close(switch_file_handle_t *fh)
 {
-       switch_status_t status;
+       switch_status_t status = SWITCH_STATUS_SUCCESS;
 
        switch_assert(fh != NULL);
 
-       if (!fh->file_interface || !switch_test_flag(fh, SWITCH_FILE_OPEN)) {
+       if (!fh->file_interface) {
                return SWITCH_STATUS_FALSE;
        }
 
+       if (!switch_test_flag(fh, SWITCH_FILE_OPEN)) {
+               return SWITCH_STATUS_SUCCESS;
+       }
+
        if (fh->pre_buffer) {
                if (switch_test_flag(fh, SWITCH_FILE_FLAG_WRITE)) {
                        switch_size_t rlen, blen;
@@ -859,7 +900,23 @@ SWITCH_DECLARE(switch_status_t) switch_core_file_close(switch_file_handle_t *fh)
        }
 
        switch_clear_flag_locked(fh, SWITCH_FILE_OPEN);
-       status = fh->file_interface->file_close(fh);
+
+       if (fh->file_interface->file_pre_close) {
+               status = fh->file_interface->file_pre_close(fh);
+       }
+
+       return status;
+}
+
+SWITCH_DECLARE(switch_status_t) switch_core_file_close(switch_file_handle_t *fh)
+{
+       switch_status_t status = SWITCH_STATUS_SUCCESS;
+
+       if (switch_test_flag(fh, SWITCH_FILE_OPEN)) {
+               status = switch_core_file_pre_close(fh);
+       }
+
+       fh->file_interface->file_close(fh);
 
        if (fh->params) {
                switch_event_destroy(&fh->params);