+static GSM_Error P7110_CallDivert(GSM_Data *data, GSM_Statemachine *state)
+{
+ unsigned short length = 0x09;
+ char req[55] = { FBUS_FRAME_HEADER, 0x01, 0x00, /* operation */
+ 0x00,
+ 0x00, /* divert type */
+ 0x00, /* call type */
+ 0x00 };
+ if (!data->CallDivert) return GE_UNKNOWN;
+ switch (data->CallDivert->Operation) {
+ case GSM_CDV_Query:
+ req[4] = 0x05;
+ break;
+ case GSM_CDV_Register:
+ req[4] = 0x03;
+ length = 0x16;
+ req[8] = 0x01;
+ req[9] = SemiOctetPack(data->CallDivert->Number.number, req + 10, data->CallDivert->Number.type);
+ req[21] = data->CallDivert->Timeout;
+ break;
+ case GSM_CDV_Erasure:
+ req[4] = 0x04;
+ break;
+ default:
+ return GE_NOTIMPLEMENTED;
+ }
+ switch (data->CallDivert->CType) {
+ case GSM_CDV_AllCalls:
+ break;
+ case GSM_CDV_VoiceCalls:
+ req[7] = 0x0b;
+ break;
+ case GSM_CDV_FaxCalls:
+ req[7] = 0x0d;
+ break;
+ case GSM_CDV_DataCalls:
+ req[7] = 0x19;
+ break;
+ default:
+ return GE_NOTIMPLEMENTED;
+ }
+ switch (data->CallDivert->DType) {
+ case GSM_CDV_AllTypes:
+ req[6] = 0x15;
+ break;
+ case GSM_CDV_Busy:
+ req[6] = 0x43;
+ break;
+ case GSM_CDV_NoAnswer:
+ req[6] = 0x3d;
+ break;
+ case GSM_CDV_OutOfReach:
+ req[6] = 0x3e;
+ break;
+ default:
+ return GE_NOTIMPLEMENTED;
+ }
+ if ((data->CallDivert->DType == GSM_CDV_AllTypes) && (data->CallDivert->CType == GSM_CDV_AllCalls))
+ req[6] = 0x02;
+
+ if (SM_SendMessage(state, length, P7110_MSG_DIVERT, req) != GE_NONE) return GE_NOTREADY;
+ return SM_WaitFor(state, data, P7110_MSG_DIVERT);
+}
+
+static GSM_Error P7110_IncomingCallDivert(int messagetype, unsigned char *message, int length, GSM_Data *data)
+{
+ int i;
+ for (i = 0; i < length; i++) {
+ dprintf("%02x ", message[i]);
+ }
+ dprintf("\n");
+ return GE_NONE;
+}
+