Man-Machine Interface (MMI) Codes and oFono
===========================================

1.0 Introduction

3GPP 22.030 describes the structure of MMI codes for User Equipment.  All user
equipment that wishes to be compliant with the Global Certification Forum
(GCF) must recognize such codes in the dialer application.  This document
describes the basic design principles for how to handle MMI codes with oFono.


2.0 Basic MMI structure

The MMI codes fall into two broad categories: codes that are followed by
<SEND> and standalone codes.  oFono handles all codes that are followed by
<SEND> while the UI is expected to handle standalone codes.

2.1 Supplementary Service Control Codes

The following codes are followed by <SEND> and are handled by oFono.  The
general structure of the codes is as follows:

* Activation	- '*SC*SI#'
* Registration	- '*SC*SI#' and '**SC*SI#'
* Erasure	- '##SC*SI#'
* Deactivation	- '#SC*SI#'
* Interrogation	- '*#SC*SI#'

Please refer to 3GPP 22.030 for detailed explanation of the structure of SI
and SC.  oFono currently handles the following SCs:

* 33 - Call Barring - All Outgoing
* 331 - Call Barring - Outgoing International
* 332 - Call Barring - Outgoing International except Home Country
* 35 - Call Barring - All Incoming
* 351 - Call Barring - All Incoming when Roaming
* 330 - Call Barring - All Barrring Services
* 333 - Call Barring - All Outgoing Services (e.g. 33, 331, 332)
* 335 - Call Barring - All Incoming Services (e.g. 35, 351)

* 21 - Unconditional Call Forwarding
* 67 - Call Forwarding on Busy
* 61 - Call Forwarding on No Reply
* 62 - Call Forwarding on Unreachable
* 002 - Call Forwarding All Conditional
* 004 - Call Forwarding All

* 30 - CLIP
* 31 - CLIR
* 76 - COLP
* 77 - COLR
* 43 - Call Waiting
* 300 - CNAP

2.2 Registration of a new password

The following password change strings are followed by <SEND> and are recognized
by oFono:

* 03 * ZZ * OLD_PASSWORD * NEW_PASSWORD * NEW_PASSWORD #
** 03 * ZZ * OLD_PASSWORD * NEW_PASSWORD * NEW_PASSWORD #
* 03 ** OLD_PASSWORD * NEW_PASSWORD * NEW_PASSWORD #
** 03 ** OLD_PASSWORD * NEW_PASSWORD * NEW_PASSWORD #

NOTE: ZZ is the Call Barring supplementary service code.

2.3 Change of PIN/PIN2

The following string allows the user to change the PIN:

PIN1: **04*OLD_PIN*NEW_PIN*NEW_PIN#
PIN2: **042*OLD-PIN2*NEW_PIN2*NEW_PIN2#

The following string allows the user to unblock the PIN:

PIN1: **05*PIN_UNBLOCKING_KEY*NEW_PIN*NEW_PIN#
PIN2: **052*PIN2_UNBLOCKING_KEY*NEW_PIN2*NEW_PIN2#

Please note that this procedure is not followed by <SEND>.  It is up to the
dialer to recognize this string and act accordingly by using the appropriate
method on the SimManager interface.

2.4 IMEI Display

The following string can be used to obtain the IMEI:

*#06#

Please note that this procedure is not followed by <SEND>.  It is up to the
dialer to recognize this string and display the SerialNumber property of the
Modem Interface.

3.0 General Application Guidelines

When the application is taking user input it is expected to match the input
against all possible strings that are not to be followed by <SEND>.  At a
minimum the PIN change or unlock and the IMEI display strings must be handled
by the application.  Any additional manufacturer-specific strings are also to
be handled by the application.

Once the user presses <SEND> the request should be sent to the
SupplementaryServices.Initiate() method.  If the string is recognized as a
control string, then the return value will be interpreted according to
structure specified in doc/supplementaryservices-api.txt.  If the error
NotRecognized is returned, then the string is not recognized as a
supplementary service string and should be treated as a call setup request
instead.  In this case the application should forward the string to
VoiceCallManager.Dial() method.
