From a17b46aaed7ad824486880ebb22d1282f06fb5a9 Mon Sep 17 00:00:00 2001
From: Emmanuel Lepage <emmanuel.lepage@savoirfairelinux.com>
Date: Tue, 5 Jun 2012 17:11:01 -0400
Subject: [PATCH] [ #12008 ] Add ConfigurationManager::getRingtoneList()

---
 .../dbus/configurationmanager-introspec.xml   |  9 +++++++
 daemon/src/dbus/configurationmanager.cpp      | 24 +++++++++++++++++++
 daemon/src/dbus/configurationmanager.h        |  2 ++
 daemon/src/fileutils.cpp                      |  7 ++++++
 daemon/src/fileutils.h                        |  1 +
 5 files changed, 43 insertions(+)

diff --git a/daemon/src/dbus/configurationmanager-introspec.xml b/daemon/src/dbus/configurationmanager-introspec.xml
index a3de1b2053..5a891dca25 100644
--- a/daemon/src/dbus/configurationmanager-introspec.xml
+++ b/daemon/src/dbus/configurationmanager-introspec.xml
@@ -334,6 +334,15 @@
            </arg>
        </method>
 
+       <method name="getRingtoneList" tp:name-for-bindings="getRingtoneList">
+           <tp:added version="1.1.1"/>
+           <tp:docstring>
+                Get a map [Path,Filename] of available ringtone. Note, set the ringtone with the complete path
+           </tp:docstring>
+           <arg type="a{ss}" name="state" direction="out">
+           </arg>
+       </method>
+
        <method name="setEchoCancelState" tp:name-for-bindings="setEchoCancelState">
                <arg type="s" name="state" direction="in">
                </arg>
diff --git a/daemon/src/dbus/configurationmanager.cpp b/daemon/src/dbus/configurationmanager.cpp
index 126d3fadb8..dbc9753f1e 100644
--- a/daemon/src/dbus/configurationmanager.cpp
+++ b/daemon/src/dbus/configurationmanager.cpp
@@ -41,6 +41,7 @@
 #include "sip/siptransport.h"
 #include "account.h"
 #include "logger.h"
+#include "fileutils.h"
 #include "sip/sipaccount.h"
 
 namespace {
@@ -283,6 +284,29 @@ std::string ConfigurationManager::getEchoCancelState()
     return Manager::instance().getEchoCancelState() ? "enabled" : "disabled";
 }
 
+std::map<std::string, std::string> ConfigurationManager::getRingtoneList()
+{
+    std::map<std::string, std::string> ringToneList;
+    std::string r_path = fileutils::get_data_dir();
+    struct dirent **namelist;
+    int n = scandir(r_path.c_str(), &namelist, 0, alphasort);
+    while(n--) {
+        if (strcmp(namelist[n]->d_name,".") && strcmp(namelist[n]->d_name,"..")) {
+           std::string file(namelist[n]->d_name);
+        
+           if (file.find(".wav") != std::string::npos)
+              file.replace(file.find(".wav"),4,"");
+           else
+              file.replace(file.size()-3,3,"");
+           if (file[0] <= 0x7A && file[0] >= 0x61) file[0] = file[0]-32;
+           ringToneList[r_path+namelist[n]->d_name] = file;
+        }
+        free(namelist[n]);
+    }
+    free(namelist);
+    return ringToneList;
+}
+
 void ConfigurationManager::setEchoCancelState(const std::string& state)
 {
     Manager::instance().setEchoCancelState(state);
diff --git a/daemon/src/dbus/configurationmanager.h b/daemon/src/dbus/configurationmanager.h
index e1262836c6..d99c6fd3b3 100644
--- a/daemon/src/dbus/configurationmanager.h
+++ b/daemon/src/dbus/configurationmanager.h
@@ -95,6 +95,8 @@ class ConfigurationManager
         void setEchoCancelDelay(const int32_t& length);
         int getEchoCancelDelay();
 
+        std::map<std::string, std::string> getRingtoneList();
+
         std::string getAudioManager();
         void setAudioManager(const std::string& api);
 
diff --git a/daemon/src/fileutils.cpp b/daemon/src/fileutils.cpp
index ca03a4a266..35bea50e82 100644
--- a/daemon/src/fileutils.cpp
+++ b/daemon/src/fileutils.cpp
@@ -69,6 +69,13 @@ const char *get_program_dir()
     return program_dir;
 }
 
+//TODO it is faking this, implement proper system 
+const char *get_data_dir()
+{
+    std::string path = std::string(get_program_dir()) + "/../../share/sflphone/ringtones/";
+    return path.c_str();
+}
+
 bool create_pidfile()
 {
     const char * const xdg_env = XDG_CACHE_HOME;
diff --git a/daemon/src/fileutils.h b/daemon/src/fileutils.h
index c513daed12..ece20c45b5 100644
--- a/daemon/src/fileutils.h
+++ b/daemon/src/fileutils.h
@@ -45,6 +45,7 @@ namespace fileutils {
     bool check_dir(const char *path);
     void set_program_dir(char *program_path);
     const char *get_program_dir();
+    const char *get_data_dir();
     bool create_pidfile();
 }
 
-- 
GitLab