Example #1
0
static void get_iccid_cb(struct qmi_result *result, void *user_data)
{
	struct cb_data *cbd = user_data;
	ofono_sim_read_cb_t cb = cbd->cb;
	unsigned char iccid[10];
	int iccid_len, len;
	char *str;

	DBG("");

	if (qmi_result_set_error(result, NULL)) {
		CALLBACK_WITH_FAILURE(cb, NULL, 0, cbd->data);
		return;
	}

	str = qmi_result_get_string(result, QMI_DMS_RESULT_ICCID);
	if (!str) {
		CALLBACK_WITH_FAILURE(cb, NULL, 0, cbd->data);
		return;
	}

	len = strlen(str);
	if (len > 20) {
		CALLBACK_WITH_FAILURE(cb, NULL, 0, cbd->data);
		return;
	}

	sim_encode_bcd_number(str, iccid);
	iccid_len = len / 2;

	qmi_free(str);

	CALLBACK_WITH_SUCCESS(cb, iccid, iccid_len, cbd->data);
}
Example #2
0
static void sim_set_cf_indicator(struct ofono_call_forwarding *cf)
{
	gboolean cfu_voice;
	struct ofono_call_forwarding_condition *uninitialized_var(cond);

	cfu_voice = is_cfu_enabled(cf, &cond);

	if (cf->cfis_record_id) {
		unsigned char data[16];
		int number_len;

		memset(data, 0xff, sizeof(data));

		/* Profile Identifier */
		data[0] = 0x01;

		if (cfu_voice) {
			number_len = strlen(cond->phone_number.number);

			/* CFU indicator Status - Voice */
			data[1] = 0x01;
			number_len = (number_len + 1) / 2;
			data[2] = number_len + 1;
			data[3] = cond->phone_number.type;

			sim_encode_bcd_number(cond->phone_number.number,
						data + 4);
		} else {
			data[1] = 0x00;
			data[2] = 1;
			data[3] = 128;
		}

		ofono_sim_write(cf->sim_context, SIM_EFCFIS_FILEID,
					sim_cfis_update_cb,
					OFONO_SIM_FILE_STRUCTURE_FIXED,
					cf->cfis_record_id, data,
					sizeof(data), cf);
		return;
	}

	if (cf->flags & CALL_FORWARDING_FLAG_CPHS_CFF) {
		unsigned char cff_voice = cfu_voice ? 0x0A : 0x05;

		ofono_sim_write(cf->sim_context, SIM_EF_CPHS_CFF_FILEID,
					sim_cphs_cff_update_cb,
					OFONO_SIM_FILE_STRUCTURE_TRANSPARENT,
					0, &cff_voice, sizeof(cff_voice), cf);
	}
}