 /*
 * Copyright (C) 2006 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
#include <alloca.h>
#include <stdlib.h>
#include <stdio.h>
#include <cutils/jstring.h>
#include <stdlib.h>
#include <binder/Parcel.h>
#include <string.h>
#include <strings.h>
#include <log/log.h>

#include "common.h"
#include "ss.h"

#undef LOG_TAG
#define LOG_TAG "MULTI_USER_SS"

static int TOA_International = 0x91;
static int TOA_Unknown = 0x81;

static const int SERVICE_CLASS_NONE     = 0; // no user input
static const int SERVICE_CLASS_VOICE    = (1 << 0);
static const int SERVICE_CLASS_DATA     = (1 << 1); //synonym for 16+32+64+128
static const int SERVICE_CLASS_FAX      = (1 << 2);
static const int SERVICE_CLASS_SMS      = (1 << 3);
static const int SERVICE_CLASS_DATA_SYNC = (1 << 4);
static const int SERVICE_CLASS_DATA_ASYNC = (1 << 5);
static const int SERVICE_CLASS_PACKET   = (1 << 6);
static const int SERVICE_CLASS_PAD      = (1 << 7);
static const int SERVICE_CLASS_MAX      = (1 << 9); // Max SERVICE_CLASS value

// Used for call barring methods below
static char* CB_FACILITY_BAOC         = "AO";
static char* CB_FACILITY_BAOIC        = "OI";
static char* CB_FACILITY_BAOICxH      = "OX";
static char* CB_FACILITY_BAIC         = "AI";
static char* CB_FACILITY_BAICr        = "IR";
static char* CB_FACILITY_BA_ALL       = "AB";
static char* CB_FACILITY_BA_MO        = "AG";
static char* CB_FACILITY_BA_MT        = "AC";
static char* CB_FACILITY_BA_SIM       = "SC";
static char* CB_FACILITY_BA_FD        = "FD";


// Used as parameters for call forward methods below
static const int CF_ACTION_DISABLE          = 0;
static const int CF_ACTION_ENABLE           = 1;
// static const int CF_ACTION_UNUSED           = 2;
static const int CF_ACTION_REGISTRATION     = 3;
static const int CF_ACTION_ERASURE          = 4;

static const int CF_REASON_UNCONDITIONAL    = 0;
static const int CF_REASON_BUSY             = 1;
static const int CF_REASON_NO_REPLY         = 2;
static const int CF_REASON_NOT_REACHABLE    = 3;
static const int CF_REASON_ALL              = 4;
static const int CF_REASON_ALL_CONDITIONAL  = 5;
static const int CF_REASON_NOT_REGISTERED   = 6;

//Called line presentation
static const char* SC_CLIP   = "30";
static const char* SC_CLIR   = "31";

// Call Forwarding
static const char* SC_CFU    = "21";
static const char* SC_CFB    = "67";
static const char* SC_CFNRy   = "61";
static const char* SC_CFNR   = "62";

static const char* SC_CF_All = "002";
static const char* SC_CF_All_Conditional = "004";

// Call Waiting
static const char* SC_WAIT    = "43";

// Call Barring
static const char* SC_BAOC        = "33";
static const char* SC_BAOIC       = "331";
static const char* SC_BAOICxH     = "332";
static const char* SC_BAIC        = "35";
static const char* SC_BAICr       = "351";

static const char* SC_BA_ALL      = "330";
static const char* SC_BA_MO       = "333";
static const char* SC_BA_MT       = "353";

// Supp Service Password registration
static const char* SC_PWD         = "03";

// PIN/PIN2/PUK/PUK2
static const char* SC_PIN         = "04";
static const char* SC_PIN2        = "042";
static const char* SC_PUK         = "05";
static const char* SC_PUK2        = "052";

///M:For query CNAP
static const char* SC_CNAP        = "300";

int toaFromString(char* s) {
    if (s != NULL && strlen(s) > 0 && *s == '+') {
        return TOA_International;
    }

    return TOA_Unknown;
}

char* scToBarringFacility(char* sc) {
    if (sc == NULL) {
        RLOGE("invalid call barring sc");
        return NULL;
    }

    if (strcmp(sc, SC_BAOC) == 0) {
        return CB_FACILITY_BAOC;
    } else if (strcmp(sc, SC_BAOIC) == 0) {
        return CB_FACILITY_BAOIC;
    } else if (strcmp(sc, SC_BAOICxH) == 0) {
        return CB_FACILITY_BAOICxH;
    } else if (strcmp(sc, SC_BAIC) == 0) {
        return CB_FACILITY_BAIC;
    } else if (strcmp(sc, SC_BAICr) == 0) {
        return CB_FACILITY_BAICr;
    } else if (strcmp(sc, SC_BA_ALL) == 0) {
        return CB_FACILITY_BA_ALL;
    } else if (strcmp(sc, SC_BA_MO) == 0) {
        return CB_FACILITY_BA_MO;
    } else if (strcmp(sc, SC_BA_MT) == 0) {
        return CB_FACILITY_BA_MT;
    } else if (strcasecmp(sc, CB_FACILITY_BA_FD) == 0 ) {
        return CB_FACILITY_BA_FD;
    } else if (strcasecmp(sc, CB_FACILITY_BA_SIM) == 0 ) {
        return CB_FACILITY_BA_SIM;
    } else {
        RLOGE("invalid call barring sc");
        return NULL;
    }
}


int scToCallForwardReason(char* sc) {
    if (sc == NULL) {
        RLOGE("invalid call forward sc");
        return -1;
    }

    if (strcmp(sc, SC_CF_All) == 0) {
       return CF_REASON_ALL;
    } else if (strcmp(sc, SC_CFU) == 0) {
        return CF_REASON_UNCONDITIONAL;
    } else if (strcmp(sc, SC_CFB) == 0) {
        return CF_REASON_BUSY;
    } else if (strcmp(sc, SC_CFNR) == 0) {
        return CF_REASON_NOT_REACHABLE;
    } else if (strcmp(sc, SC_CFNRy) == 0) {
        return CF_REASON_NO_REPLY;
    } else if (strcmp(sc, SC_CF_All_Conditional) == 0) {
       return CF_REASON_ALL_CONDITIONAL;
    } else {
        RLOGE("invalid call forward sc");
        return -1;
    }
}

int siToServiceClass(char* si)
{
    if (si == NULL || strcmp(si, "null") == 0)
    {
        return  SERVICE_CLASS_NONE;
    } else {
            // NumberFormatException should cause MMI fail
        int serviceCode = atoi(si);

        switch (serviceCode) {
                case 10: return SERVICE_CLASS_SMS + SERVICE_CLASS_FAX  + SERVICE_CLASS_VOICE;
                case 11: return SERVICE_CLASS_VOICE;
                case 12: return SERVICE_CLASS_SMS + SERVICE_CLASS_FAX;
                case 13: return SERVICE_CLASS_FAX;

                case 16: return SERVICE_CLASS_SMS;

                case 19: return SERVICE_CLASS_FAX + SERVICE_CLASS_VOICE;
/*
    Note for code 20:
     From TS 22.030 Annex C:
                "All GPRS bearer services" are not included in "All tele and bearer services"
                    and "All bearer services"."
....so SERVICE_CLASS_DATA, which (according to 27.007) includes GPRS
*/
                case 20: return SERVICE_CLASS_DATA_ASYNC + SERVICE_CLASS_DATA_SYNC;

                case 21: return SERVICE_CLASS_PAD + SERVICE_CLASS_DATA_ASYNC;
                case 22: return SERVICE_CLASS_PACKET + SERVICE_CLASS_DATA_SYNC;
                case 24: return SERVICE_CLASS_DATA_SYNC;
                //don't support video
                //case 24: return SERVICE_CLASS_DATA_SYNC + SERVICE_CLASS_VIDEO;
                case 25: return SERVICE_CLASS_DATA_ASYNC;
                case 26: return SERVICE_CLASS_DATA_SYNC + SERVICE_CLASS_VOICE;
                case 99: return SERVICE_CLASS_PACKET;

                default:
                    RLOGW("unsupported MMI service code:%s ", si);
                    return SERVICE_CLASS_NONE;
         }
    }
}

int siToTime (char* si) {
    if (si == NULL || strcmp(si, "null") == 0) {
        return 0;
    } else {
        // NumberFormatException should cause MMI fail
        return atoi(si);
    }
}

//xxx ussdString
int sendUSSD(int argc, char **argv, RIL_SOCKET_ID socket_id, RequestInfo *pRI) {
    if(argc != 2)
    {
        RLOGD("the peremeters numbers isn't right , so return");
        return -1;
    }
    android::Parcel p;
    size_t pos = p.dataPosition();
    writeStringToParcel(p, (const char *)argv[1]);//ussdString
    p.setDataPosition(pos);
    pRI->pCI->dispatchFunction(p, pRI);

    return 0;
}

int cancelPendingUssd(int argc, char **argv, RIL_SOCKET_ID socket_id, RequestInfo *pRI) {
    if(argc != 1)
    {
        RLOGD("the peremeters numbers isn't right , so return");
        return -1;
    }

    android::Parcel p;
    pRI->pCI->dispatchFunction(p, pRI);

    return 0;
}

int getCLIR(int argc, char **argv, RIL_SOCKET_ID socket_id, RequestInfo *pRI) {
    if(argc != 1)
    {
        RLOGD("the peremeters numbers isn't right , so return");
        return -1;
    }

    android::Parcel p;
    pRI->pCI->dispatchFunction(p, pRI);

    return 0;
}

//xxx clirMode
int setCLIR(int argc, char **argv, RIL_SOCKET_ID socket_id, RequestInfo *pRI) {
    if(argc != 2)
    {
        RLOGD("the peremeters numbers isn't right , so return");
        return -1;
    }

    android::Parcel p;
    size_t pos = p.dataPosition();
    p.writeInt32(1);
    //0: "user subscription default value;  1:restrict CLI presentation; 2: allow CLI presentation
    p.writeInt32(atoi(argv[1]));//clirMode
    p.setDataPosition(pos);

    pRI->pCI->dispatchFunction(p, pRI);

    return 0;
}

int queryCLIP(int argc, char **argv, RIL_SOCKET_ID socket_id, RequestInfo *pRI) {
    if(argc != 1)
    {
        RLOGD("the peremeters numbers isn't right , so return");
        return -1;
    }
    android::Parcel p;
    pRI->pCI->dispatchFunction(p, pRI);

    return 0;
}

//xxx cfReason serviceClass number
// mCi.queryCallForwardStatus(commandInterfaceCFReason,0,null,resp);
int queryCallForwardStatus(int argc, char **argv, RIL_SOCKET_ID socket_id, RequestInfo *pRI) {
    if(argc != 4)
    {
        RLOGD("the peremeters numbers isn't right , so return");
        return -1;
    }

    android::Parcel p;
    size_t pos = p.dataPosition();

    int cfReason = scToCallForwardReason(argv[1]);
    RLOGD("queryCallForwardStatus() cfReason: %d", cfReason);
    if(cfReason == -1) return -1;
    p.writeInt32(2);
    p.writeInt32(cfReason); //cfReason
    p.writeInt32(siToServiceClass(argv[2])); //serviceClass
    p.writeInt32(toaFromString(argv[3])); //number
    writeStringToParcel(p, argv[3]);//number
    p.writeInt32(0);

    p.setDataPosition(pos);
    pRI->pCI->dispatchFunction(p, pRI);

    return 0;
}

//xxx action cfReason serviceClass number timeSeconds
int setCallForward(int argc, char **argv, RIL_SOCKET_ID socket_id, RequestInfo *pRI) {
    if(argc != 6 )
    {
        RLOGD("the paremeters isn't enough!");
        return -1;
    }
    android::Parcel p;
    size_t pos = p.dataPosition();
    int action = atoi(argv[1]) == 3 ? CF_ACTION_REGISTRATION : CF_ACTION_DISABLE;
    int reason = scToCallForwardReason(argv[2]);
    if(reason == -1) return -1;
    char* number = argv[3];
    int time = siToTime(argv[4]);
    int serviceClass = siToServiceClass(argv[5]);
    p.writeInt32(action); //action
    p.writeInt32(reason); //cfReason
    p.writeInt32(serviceClass); //serviceClass
    p.writeInt32(toaFromString(number)); //number
    writeStringToParcel(p, number);
    p.writeInt32(time); //timeSeconds

    p.setDataPosition(pos);
    
    pRI->pCI->dispatchFunction(p, pRI);

    return 0;
}



//xxx serviceClass
int queryCallWaiting(int argc, char **argv, RIL_SOCKET_ID socket_id, RequestInfo *pRI) {
    if(argc != 2)
    {
        RLOGD("the peremeters numbers isn't right , so return");
        return -1;
    }

    android::Parcel p;
    size_t pos = p.dataPosition();
    p.writeInt32(1);
    p.writeInt32(siToServiceClass(argv[1]));//serviceClass

    p.setDataPosition(pos);
    pRI->pCI->dispatchFunction(p, pRI);

    return 0;
}


//xxx enable serviceClass
int setCallWaiting(int argc, char **argv, RIL_SOCKET_ID socket_id, RequestInfo *pRI) {
    if(argc != 3)
    {
        RLOGD("the peremeters numbers isn't right , so return");
        return -1;
    }


    android::Parcel p;
    size_t pos = p.dataPosition();
    p.writeInt32(2);
    p.writeInt32(atoi(argv[1])? 1 : 0);//enable
    p.writeInt32(siToServiceClass(argv[2])); //serviceClass

    p.setDataPosition(pos);
    pRI->pCI->dispatchFunction(p, pRI);

    return 0;
}

//xxx facility oldPwd newPwd
int changeBarringPassword(int argc, char **argv, RIL_SOCKET_ID socket_id, RequestInfo *pRI) {
    if(argc != 4)
    {
        RLOGD("the peremeters numbers isn't right , so return");
        return -1;
    }

    android::Parcel p;
    size_t pos = p.dataPosition();
    p.writeInt32(3);
    char* facility = scToBarringFacility(argv[1]);
    if(facility == NULL) return -1;
    writeStringToParcel(p, facility); //facility
    writeStringToParcel(p, (const char *)argv[2]); //oldPwd
    writeStringToParcel(p, (const char *)argv[3]); //newPwd

    p.setDataPosition(pos);
    pRI->pCI->dispatchFunction(p, pRI);

    return 0;
}

//xxx enable
int setSuppServiceNotifications(int argc, char **argv, RIL_SOCKET_ID socket_id, RequestInfo *pRI) {
    if(argc != 2)
    {
        RLOGD("the peremeters numbers isn't right , so return");
        return -1;
    }

    android::Parcel p;
    size_t pos = p.dataPosition();
    p.writeInt32(1);
    p.writeInt32(atoi(argv[1])? 1 : 0);//enable

    p.setDataPosition(pos);
    pRI->pCI->dispatchFunction(p, pRI);

    return 0;
}

int setCLIP(int argc, char **argv, RIL_SOCKET_ID socket_id, RequestInfo *pRI) {
    if(argc != 2)
    {
        RLOGD("the peremeters numbers isn't right , so return");
        return -1;
    }


    android::Parcel p;
    size_t pos = p.dataPosition();
    p.writeInt32(1);
    p.writeInt32(atoi(argv[1])? 1 : 0);//enable

    p.setDataPosition(pos);
    pRI->pCI->dispatchFunction(p, pRI);

    return 0;

}

int getCOLP(int argc, char **argv, RIL_SOCKET_ID socket_id, RequestInfo *pRI) {
    if(argc != 1)
    {
        RLOGD("the peremeters numbers isn't right , so return");
        return -1;
    }

    android::Parcel p;
    pRI->pCI->dispatchFunction(p, pRI);

    return 0;

}

int setCOLP(int argc, char **argv, RIL_SOCKET_ID socket_id, RequestInfo *pRI) {
    if(argc != 2)
    {
        RLOGD("the peremeters numbers isn't right , so return");
        return -1;
    }


    android::Parcel p;
    size_t pos = p.dataPosition();
    p.writeInt32(1);
    p.writeInt32(atoi(argv[1])? 1 : 0);//enable

    p.setDataPosition(pos);
    pRI->pCI->dispatchFunction(p, pRI);

    return 0;

}

int getCOLR(int argc, char **argv, RIL_SOCKET_ID socket_id, RequestInfo *pRI) {
    if(argc != 1)
    {
        RLOGD("the peremeters numbers isn't right , so return");
        return -1;
    }

    android::Parcel p;
    pRI->pCI->dispatchFunction(p, pRI);

    return 0;

}

int queryFacilityLockForApp(int argc, char **argv, RIL_SOCKET_ID socket_id, RequestInfo *pRI) {
    if(argc != 4)
    {
        RLOGD("the peremeters numbers isn't right , so return");
        return -1;
    }

    char* facility = scToBarringFacility(argv[1]);
    if(facility == NULL) return -1;

    char *password = argv[2];
    if(strcmp(password, "null") == 0){
        password = "";
    }

    int serviceClassX = SERVICE_CLASS_NONE;
    if (strcmp(facility, CB_FACILITY_BA_FD) == 0) {
        serviceClassX = SERVICE_CLASS_VOICE + SERVICE_CLASS_DATA + SERVICE_CLASS_FAX;
    } else if(strcmp(facility, CB_FACILITY_BA_SIM) == 0) {
        serviceClassX = SERVICE_CLASS_VOICE + SERVICE_CLASS_DATA + SERVICE_CLASS_FAX;
    } else {
        serviceClassX = siToServiceClass(argv[3]);
    }
    char serviceclass[16] = {0};
    sprintf(serviceclass, "%d", serviceClassX);

    char* appId = "";
    if (strcmp(facility, CB_FACILITY_BA_FD) == 0) {
        appId = getAid(socket_id);
    } else if(strcmp(facility, CB_FACILITY_BA_SIM) == 0) {
        appId = getAid(socket_id);
    }

    android::Parcel p;
    size_t pos = p.dataPosition();
    p.writeInt32(4);
    writeStringToParcel(p, facility);
    writeStringToParcel(p, password);
    writeStringToParcel(p, serviceclass);
    writeStringToParcel(p, appId);

    p.setDataPosition(pos);

    pRI->pCI->dispatchFunction(p, pRI);
    return 0;
}


int setFacilityLockForApp(int argc, char **argv, RIL_SOCKET_ID socket_id, RequestInfo *pRI) {
    RLOGD("setFacilityLockForApp %d: " , pRI->pCI->requestNumber);
    if(argc != 5)
    {
        RLOGD("the peremeters numbers isn't right , so return");
        return -1;
    }


    char* facility = scToBarringFacility(argv[1]);
    if(facility == NULL) return -1;

    char *password = argv[2];
    if(strcmp(password, "null") == 0){
        password = "";
    }

    int serviceClassX = SERVICE_CLASS_NONE;
    if (strcmp(facility, CB_FACILITY_BA_FD) == 0) {
        serviceClassX = SERVICE_CLASS_VOICE + SERVICE_CLASS_DATA + SERVICE_CLASS_FAX;
    } else if(strcmp(facility, CB_FACILITY_BA_SIM) == 0) {
        serviceClassX = SERVICE_CLASS_VOICE + SERVICE_CLASS_DATA + SERVICE_CLASS_FAX;
    } else {
        serviceClassX = siToServiceClass(argv[3]);
    }
    char serviceclass[16] = {0};
    sprintf(serviceclass, "%d", serviceClassX);

    char* appId = "";
    if (strcmp(facility, CB_FACILITY_BA_FD) == 0) {
        appId = getAid(socket_id);
    } else if(strcmp(facility, CB_FACILITY_BA_SIM) == 0) {
        appId = getAid(socket_id);
    }


    const char *lockStrings = argv[4];

    android::Parcel p;
    size_t pos = p.dataPosition();
    p.writeInt32(5);
    writeStringToParcel(p, facility);
    writeStringToParcel(p, lockStrings);
    writeStringToParcel(p, password);
    writeStringToParcel(p, serviceclass);
    writeStringToParcel(p, appId);
    p.setDataPosition(pos);
    pRI->pCI->dispatchFunction(p, pRI);

    return 0;
}
