diff --git a/mms-engine/main.c b/mms-engine/main.c
index 89bd6e5..2d862c3 100644
--- a/mms-engine/main.c
+++ b/mms-engine/main.c
@@ -30,6 +30,7 @@ typedef struct mms_app_options {
int flags;
char* dir;
char* user_agent;
+ char* uaprof;
MMSConfig config;
MMSSettingsSimData settings;
} MMSAppOptions;
@@ -192,7 +193,9 @@ mms_app_parse_options(
{ "pix-limit", 'p', 0, G_OPTION_ARG_DOUBLE,
&megapixels, "Maximum pixel count for outgoing images", "MPIX" },
{ "user-agent", 'u', 0, G_OPTION_ARG_STRING,
- &opt->user_agent, "User-Agent header", "STRING" },
+ &opt->user_agent, "The value of the User-Agent header", "STRING" },
+ { "x-wap-profile", 'x', 0, G_OPTION_ARG_STRING,
+ &opt->uaprof, "User agent profile", "URL" },
{ "keep-running", 'k', 0, G_OPTION_ARG_NONE, &keep_running,
"Keep running after everything is done", NULL },
{ "keep-temp-files", 't', 0, G_OPTION_ARG_NONE,
@@ -266,6 +269,10 @@ mms_app_parse_options(
opt->settings.user_agent = opt->user_agent;
opt->flags |= MMS_ENGINE_FLAG_OVERRIDE_USER_AGENT;
}
+ if (opt->uaprof) {
+ opt->settings.uaprof = opt->uaprof;
+ opt->flags |= MMS_ENGINE_FLAG_OVERRIDE_UAPROF;
+ }
if (opt->dir) opt->config.root_dir = opt->dir;
if (keep_running) opt->flags |= MMS_ENGINE_FLAG_KEEP_RUNNING;
if (session_bus) {
@@ -322,6 +329,7 @@ int main(int argc, char* argv[])
}
g_free(opt.dir);
g_free(opt.user_agent);
+ g_free(opt.uaprof);
mms_lib_deinit();
return result;
}
diff --git a/mms-engine/mms_engine.c b/mms-engine/mms_engine.c
index 79b9e6c..c902f05 100644
--- a/mms-engine/mms_engine.c
+++ b/mms-engine/mms_engine.c
@@ -405,6 +405,12 @@ mms_engine_new(
settings->sim_defaults.data.user_agent =
settings->sim_defaults.user_agent = g_strdup(override->user_agent);
}
+ if (flags & MMS_ENGINE_FLAG_OVERRIDE_UAPROF) {
+ settings->flags |= MMS_SETTINGS_FLAG_OVERRIDE_UAPROF;
+ g_free(settings->sim_defaults.uaprof);
+ settings->sim_defaults.data.uaprof =
+ settings->sim_defaults.uaprof = g_strdup(override->uaprof);
+ }
if (flags & MMS_ENGINE_FLAG_OVERRIDE_SIZE_LIMIT) {
settings->flags |= MMS_SETTINGS_FLAG_OVERRIDE_SIZE_LIMIT;
settings->sim_defaults.data.size_limit = override->size_limit;
diff --git a/mms-engine/mms_engine.h b/mms-engine/mms_engine.h
index 27dd2bf..e1a47fd 100644
--- a/mms-engine/mms_engine.h
+++ b/mms-engine/mms_engine.h
@@ -27,6 +27,7 @@
#define MMS_ENGINE_FLAG_OVERRIDE_USER_AGENT (0x02)
#define MMS_ENGINE_FLAG_OVERRIDE_SIZE_LIMIT (0x04)
#define MMS_ENGINE_FLAG_OVERRIDE_MAX_PIXELS (0x08)
+#define MMS_ENGINE_FLAG_OVERRIDE_UAPROF (0x10)
typedef struct mms_engine MMSEngine;
diff --git a/mms-lib/include/mms_settings.h b/mms-lib/include/mms_settings.h
index d309fee..dad50a1 100644
--- a/mms-lib/include/mms_settings.h
+++ b/mms-lib/include/mms_settings.h
@@ -29,6 +29,7 @@ struct mms_config {
/* Persistent mutable per-SIM settings */
struct mms_settings_sim_data {
const char* user_agent; /* User agent string */
+ const char* uaprof; /* User agent profile string */
unsigned int size_limit; /* Maximum size of m-Send.req PDU */
unsigned int max_pixels; /* Pixel limit for outbound images */
gboolean allow_dr; /* Allow sending delivery reports */
@@ -38,6 +39,7 @@ struct mms_settings_sim_data {
typedef struct mms_settings_sim_data_copy {
MMSSettingsSimData data; /* Settings data */
char* user_agent; /* Allocated copy of user_agent */
+ char* uaprof; /* Allocated copy of uaprof */
} MMSSettingsSimDataCopy;
/* Instance */
@@ -51,6 +53,7 @@ struct mms_settings {
#define MMS_SETTINGS_FLAG_OVERRIDE_SIZE_LIMIT (0x02)
#define MMS_SETTINGS_FLAG_OVERRIDE_MAX_PIXELS (0x04)
#define MMS_SETTINGS_FLAG_OVERRIDE_ALLOW_DR (0x08)
+#define MMS_SETTINGS_FLAG_OVERRIDE_UAPROF (0x10)
};
/* Class */
@@ -61,11 +64,14 @@ typedef struct mms_settings_class {
const char* imsi);
} MMSSettingsClass;
-/* Default values */
-#define MMS_SETTINGS_DEFAULT_USER_AGENT "Mozilla/5.0 (Sailfish; Jolla)"
-#define MMS_SETTINGS_DEFAULT_SIZE_LIMIT (300*1024)
-#define MMS_SETTINGS_DEFAULT_MAX_PIXELS (3000000)
-#define MMS_SETTINGS_DEFAULT_ALLOW_DR TRUE
+/* Default values. If the GSettings backend is used (mms-settings-dconf)
+ * then these should match the default values defined in the GSettings
+ * schema (org.nemomobile.mms.sim.gschema.xml) */
+#define MMS_SETTINGS_DEFAULT_USER_AGENT "Mozilla/5.0 (Sailfish; Jolla)"
+#define MMS_SETTINGS_DEFAULT_UAPROF "http://www.jolla.com/uaprof/Jolla.xml"
+#define MMS_SETTINGS_DEFAULT_SIZE_LIMIT (300*1024)
+#define MMS_SETTINGS_DEFAULT_MAX_PIXELS (3000000)
+#define MMS_SETTINGS_DEFAULT_ALLOW_DR TRUE
GType mms_settings_get_type(void);
#define MMS_TYPE_SETTINGS (mms_settings_get_type())
diff --git a/mms-lib/src/mms_settings.c b/mms-lib/src/mms_settings.c
index 5e8889d..592a5e9 100644
--- a/mms-lib/src/mms_settings.c
+++ b/mms-lib/src/mms_settings.c
@@ -41,6 +41,7 @@ mms_settings_sim_data_default(
{
memset(data, 0, sizeof(*data));
data->user_agent = MMS_SETTINGS_DEFAULT_USER_AGENT;
+ data->uaprof = MMS_SETTINGS_DEFAULT_UAPROF;
data->size_limit = MMS_SETTINGS_DEFAULT_SIZE_LIMIT;
data->max_pixels = MMS_SETTINGS_DEFAULT_MAX_PIXELS;
data->allow_dr = MMS_SETTINGS_DEFAULT_ALLOW_DR;
@@ -52,11 +53,14 @@ mms_settings_sim_data_copy(
const MMSSettingsSimData* src)
{
g_free(dest->user_agent);
+ g_free(dest->uaprof);
if (src) {
dest->data = *src;
dest->data.user_agent = dest->user_agent = g_strdup(src->user_agent);
+ dest->data.uaprof = dest->uaprof = g_strdup(src->uaprof);
} else {
dest->user_agent = NULL;
+ dest->uaprof = NULL;
mms_settings_sim_data_default(&dest->data);
}
}
diff --git a/mms-lib/src/mms_task_http.c b/mms-lib/src/mms_task_http.c
index 60de42a..8b9555f 100644
--- a/mms-lib/src/mms_task_http.c
+++ b/mms-lib/src/mms_task_http.c
@@ -192,6 +192,12 @@ mms_http_transfer_new(
soup_message_set_flags(tx->message,
SOUP_MESSAGE_NO_REDIRECT |
SOUP_MESSAGE_NEW_CONNECTION);
+ if (cfg->uaprof && cfg->uaprof[0]) {
+ const char* uaprof_header = "x-wap-profile";
+ MMS_VERBOSE("%s %s", uaprof_header, cfg->uaprof);
+ soup_message_headers_append(tx->message->request_headers,
+ uaprof_header, cfg->uaprof);
+ }
/* We shouldn't need this extra reference but otherwise
* SoupMessage gets deallocated too early. Not sure why. */
g_object_ref(tx->message);
diff --git a/mms-settings-dconf/spec/org.nemomobile.mms.sim.gschema.xml b/mms-settings-dconf/spec/org.nemomobile.mms.sim.gschema.xml
index d7d3a24..7b32ddc 100644
--- a/mms-settings-dconf/spec/org.nemomobile.mms.sim.gschema.xml
+++ b/mms-settings-dconf/spec/org.nemomobile.mms.sim.gschema.xml
@@ -7,6 +7,11 @@
User-Agent string.
The value of User-Agent header to use when communicating with the MMS server.
+
+ 'http://www.jolla.com/uaprof/Jolla.xml'
+ User-Agent Profile string.
+ The value of x-wap-profile header to use when communicating with the MMS server.
+
307200
Maximum size of an outbound MMS message.
diff --git a/mms-settings-dconf/src/mms_settings_dconf.c b/mms-settings-dconf/src/mms_settings_dconf.c
index 8dd94ca..2440e38 100644
--- a/mms-settings-dconf/src/mms_settings_dconf.c
+++ b/mms-settings-dconf/src/mms_settings_dconf.c
@@ -41,6 +41,7 @@ G_DEFINE_TYPE(MMSSettingsDconf, mms_settings_dconf, MMS_TYPE_SETTINGS);
#define MMS_DCONF_PATH_PREFIX "/"
#define MMS_DCONF_KEY_USER_AGENT "user-agent"
+#define MMS_DCONF_KEY_UAPROF "user-agent-profile"
#define MMS_DCONF_KEY_SIZE_LIMIT "max-message-size"
#define MMS_DCONF_KEY_MAX_PIXELS "max-pixels"
#define MMS_DCONF_KEY_ALLOW_DR "allow-delivery-reports"
@@ -63,12 +64,29 @@ mms_settings_dconf_update_user_agent(
} else {
MMSSettingsSimDataCopy* copy = &dconf->imsi_data;
g_free(copy->user_agent);
- copy->data.user_agent =
- copy->user_agent = value;
+ copy->data.user_agent = copy->user_agent = value;
MMS_DEBUG("%s = %s", key, copy->data.user_agent);
}
}
+static
+void
+mms_settings_dconf_update_uaprof(
+ MMSSettingsDconf* dconf,
+ const char* key)
+{
+ char* value = g_settings_get_string(dconf->gs, key);
+ if (dconf->settings.flags & MMS_SETTINGS_FLAG_OVERRIDE_UAPROF) {
+ MMS_DEBUG("%s = %s (ignored)", key, value);
+ g_free(value);
+ } else {
+ MMSSettingsSimDataCopy* copy = &dconf->imsi_data;
+ g_free(copy->uaprof);
+ copy->data.uaprof = copy->uaprof = value;
+ MMS_DEBUG("%s = %s", key, copy->data.uaprof);
+ }
+}
+
static
void
mms_settings_dconf_update_size_limit(
@@ -101,7 +119,7 @@ mms_settings_dconf_update_max_pixels(
static
void
-mms_settings_dconf_update_max_allow_dr(
+mms_settings_dconf_update_allow_dr(
MMSSettingsDconf* dconf,
const char* key)
{
@@ -115,10 +133,11 @@ mms_settings_dconf_update_max_allow_dr(
}
static const MMSSettingsDconfKey mms_settings_dconf_keys[] = {
- { MMS_DCONF_KEY_USER_AGENT, mms_settings_dconf_update_user_agent },
- { MMS_DCONF_KEY_SIZE_LIMIT, mms_settings_dconf_update_size_limit },
- { MMS_DCONF_KEY_MAX_PIXELS, mms_settings_dconf_update_max_pixels },
- { MMS_DCONF_KEY_ALLOW_DR, mms_settings_dconf_update_max_allow_dr },
+ { MMS_DCONF_KEY_USER_AGENT, mms_settings_dconf_update_user_agent },
+ { MMS_DCONF_KEY_UAPROF, mms_settings_dconf_update_uaprof },
+ { MMS_DCONF_KEY_SIZE_LIMIT, mms_settings_dconf_update_size_limit },
+ { MMS_DCONF_KEY_MAX_PIXELS, mms_settings_dconf_update_max_pixels },
+ { MMS_DCONF_KEY_ALLOW_DR, mms_settings_dconf_update_allow_dr },
};
static