]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
gsmopen: added gsmlib support to outbound smss (eg: PDU mode). Must implement a mecha...
authorGiovanni Maruzzelli <gmaruzz@gmail.com>
Wed, 18 Apr 2012 13:17:31 +0000 (15:17 +0200)
committerGiovanni Maruzzelli <gmaruzz@gmail.com>
Wed, 18 Apr 2012 13:17:31 +0000 (15:17 +0200)
src/mod/endpoints/mod_gsmopen/gsmopen_protocol.cpp

index 041ed8caa6d23094fd2a88648ea7763d5bba80e3..1c656fdf77097ea9916f935eeacb0c82492ac28d 100644 (file)
@@ -593,7 +593,7 @@ read:
                msecs_passed += 20;
 
                if (timeout_in_msec != 100){
-                       ERRORA("TIMEOUT=%d, PASSED=%d\n", GSMOPEN_P_LOG, timeout_in_msec, msecs_passed);
+                       //ERRORA("TIMEOUT=%d, PASSED=%d\n", GSMOPEN_P_LOG, timeout_in_msec, msecs_passed);
                }
                //read_count = tech_pvt->serialPort_serial_control->Readv(tmp_answer_ptr, AT_BUFSIZ - (tmp_answer_ptr - tmp_answer), (timeout_sec * 1000) + (timeout_usec ? (timeout_usec / 1000) : 0));
                read_count = tech_pvt->serialPort_serial_control->Read(tmp_answer_ptr, AT_BUFSIZ - (tmp_answer_ptr - tmp_answer));
@@ -1687,24 +1687,6 @@ read:
 
 
 
-#ifdef NOTDEF_SENDING_EXAMPLE
-                                               SMSMessageRef smsMessage;
-                                               // message text has probably to be in 8859-1
-                                               smsMessage = new SMSSubmitMessage("submit me ", "3472665618");
-                                               cout << smsMessage->toString() << endl;
-                                               string pdu = smsMessage->encode();
-                                               cout << pdu << endl;
-                                               //cout << intToStr(pdu.length() / 2 - getSCAddressLen())  << endl;
-                                               cout << intToStr(pdu.length() / 2 - 1)  << endl;
-
-                                               /*
-                                                  string pdu = encode();
-                                                  Parser p(_at->sendPdu("+CMGS=" +
-                                                  intToStr(pdu.length() / 2 - getSCAddressLen()),
-                                                  "+CMGS:", pdu));
-                                                  */
-#endif// NOTDEF_SENDING_EXAMPLE
-
 #endif// WANT_GSMLIB
 
 
@@ -2353,10 +2335,55 @@ int ucs2_to_utf8(private_t *tech_pvt, char *ucs2_in, char *utf8_out, size_t outb
 #endif //WIN32
        return 0;
 }
+int utf8_to_iso_8859_1(private_t *tech_pvt, char *utf8_in, size_t inbytesleft, char *iso_8859_1_out, size_t outbytesleft)
+{
+       /* cicopet */
+#ifndef WIN32
+       iconv_t iconv_format;
+       int iconv_res;
+       char *outbuf;
+       char *inbuf;
+
+       outbuf = iso_8859_1_out;
+       inbuf = utf8_in;
+
+       iconv_format = iconv_open("ISO_8859-1", "UTF8");
+       if (iconv_format == (iconv_t) -1) {
+               ERRORA("error: %s\n", GSMOPEN_P_LOG, strerror(errno));
+               return -1;
+       }
+       outbytesleft = strlen(utf8_in) * 2;
+
+       DEBUGA_GSMOPEN("in=%s, inleft=%d, out=%s, outleft=%d, utf8_in=%s, iso_8859_1_out=%s\n",
+                                  GSMOPEN_P_LOG, inbuf, (int) inbytesleft, outbuf, (int) outbytesleft, utf8_in, iso_8859_1_out);
+       iconv_res = iconv(iconv_format, &inbuf, &inbytesleft, &outbuf, &outbytesleft);
+       if (iconv_res == (size_t) -1) {
+               ERRORA("error: %s %d\n", GSMOPEN_P_LOG, strerror(errno), errno);
+               return -1;
+       }
+       DEBUGA_GSMOPEN
+               ("iconv_res=%d,  in=%s, inleft=%d, out=%s, outleft=%d, utf8_in=%s, iso_8859_1_out=%s\n",
+                GSMOPEN_P_LOG, iconv_res, inbuf, (int) inbytesleft, outbuf, (int) outbytesleft, utf8_in, iso_8859_1_out);
+       iconv_close(iconv_format);
+#if 0
+       for (i = 0; i < 16000 - outbytesleft; i++) {
+               memset(stringa, '\0', sizeof(stringa));
+               memset(stringa2, '\0', sizeof(stringa2));
+               sprintf(stringa, "%02X", converted[i]);
+               DEBUGA_GSMOPEN("character is |%02X|\n", GSMOPEN_P_LOG, converted[i]);
+               stringa2[0] = stringa[strlen(stringa) - 2];
+               stringa2[1] = stringa[strlen(stringa) - 1];
+               strncat(iso_8859_1_out, stringa2, ((outbytesleft - strlen(iso_8859_1_out)) - 1));       //add the received line to the buffer
+               DEBUGA_GSMOPEN("stringa=%s, stringa2=%s, iso_8859_1_out=%s\n", GSMOPEN_P_LOG, stringa, stringa2, iso_8859_1_out);
+       }
+#endif //0
+#endif //WIN32
+       return 0;
+}
+
 
 int iso_8859_1_to_utf8(private_t *tech_pvt, char *iso_8859_1_in, char *utf8_out, size_t outbytesleft)
 {
-       char converted[16000];
 #ifndef WIN32
        iconv_t iconv_format;
        int iconv_res;
@@ -2368,8 +2395,6 @@ int iso_8859_1_to_utf8(private_t *tech_pvt, char *iso_8859_1_in, char *utf8_out,
        //double hexnum;
        //int i = 0;
 
-       memset(converted, '\0', sizeof(converted));
-
        DEBUGA_GSMOPEN("iso_8859_1_in=%s\n", GSMOPEN_P_LOG, iso_8859_1_in);
 
        outbuf = utf8_out;
@@ -2656,17 +2681,94 @@ int gsmopen_sendsms(private_t *tech_pvt, char *dest, char *text)
        if (tech_pvt->controldevprotocol == PROTOCOL_AT) {
                char smscommand[16000];
                memset(smscommand, '\0', sizeof(smscommand));
+               char pdu2[16000];
+               memset(pdu2, '\0', sizeof(pdu2));
+               int pdulenght = 0;
 
                PUSHA_UNLOCKA(&tech_pvt->controldev_lock);
                LOKKA(tech_pvt->controldev_lock);
 
+#ifndef WANT_GSMLIB
                err = gsmopen_serial_write_AT_ack(tech_pvt, "AT+CMGF=1");
                if (err) {
                        ERRORA("AT+CMGF=1 (set message sending to TEXT (as opposed to PDU)  do not got OK from the phone\n", GSMOPEN_P_LOG);
                }
+#else// WANT_GSMLIB
+               err = gsmopen_serial_write_AT_ack(tech_pvt, "AT+CMGF=0");
+               if (err) {
+                       ERRORA("AT+CMGF=0 (set message sending to TEXT (as opposed to PDU)  do not got OK from the phone\n", GSMOPEN_P_LOG);
+               }
+#endif// WANT_GSMLIB
+
+
+               if (tech_pvt->no_ucs2 || tech_pvt->sms_pdu_not_supported == 0) {
+#ifdef WANT_GSMLIB
+                       SMSMessageRef smsMessage;
+
+                       memset(mesg_test, '\0', sizeof(mesg_test));
+                       sprintf(mesg_test,":) ciao belè новости לק ראת ﺎﻠﺠﻤﻋﺓ 人大aèéàòçù"); //let's test the beauty of utf8
+                       //text=mesg_test;
+
+                       utf8_to_iso_8859_1(tech_pvt, text, strlen(text), smscommand, sizeof(smscommand));
+                       smsMessage = new SMSSubmitMessage(smscommand, dest);
+                       string pdu = smsMessage->encode();
+                       strncpy(pdu2, pdu.c_str(), sizeof(pdu2)-1);
+                       memset(smscommand, '\0', sizeof(smscommand));
+                       pdulenght = pdu.length() / 2 - 1;
+                       sprintf(smscommand, "AT+CMGS=%d", pdulenght);   
+
+#ifdef NOTDEF
+                                               char content2[1000];
+                                               SMSMessageRef sms;
+                                               //MessageType messagetype;
+                                               //Address servicecentreaddress;
+                                               //Timestamp servicecentretimestamp;
+                                               //Address sender_recipient_address;
+
+                                               sms = SMSMessage::decode(tech_pvt->line_array.result[i]);       // dataCodingScheme = 8 , text=ciao 123 belè новости לק ראת ﺎﻠﺠﻤﻋﺓ 人大
+
+                                               DEBUGA_GSMOPEN("SMS=\n%s\n", GSMOPEN_P_LOG, sms->toString().c_str());
+
+                                               memset(content2, '\0', sizeof(content2));
+                                               if (sms->dataCodingScheme().getAlphabet() == DCS_DEFAULT_ALPHABET) {
+                                                       iso_8859_1_to_utf8(tech_pvt, (char *) sms->userData().c_str(), content2, sizeof(content2));
+                                               } else if (sms->dataCodingScheme().getAlphabet() == DCS_SIXTEEN_BIT_ALPHABET) {
+                                                       ucs2_to_utf8(tech_pvt, (char *) bufToHex((unsigned char *) sms->userData().data(), sms->userData().length()).c_str(), content2,
+                                                                       sizeof(content2));
+                                               } else {
+                                                       ERRORA("dataCodingScheme not supported=%d\n", GSMOPEN_P_LOG, sms->dataCodingScheme().getAlphabet());
+
+                                               }
+                                               DEBUGA_GSMOPEN("dataCodingScheme=%d\n", GSMOPEN_P_LOG, sms->dataCodingScheme().getAlphabet());
+                                               DEBUGA_GSMOPEN("dataCodingScheme=%s\n", GSMOPEN_P_LOG, sms->dataCodingScheme().toString().c_str());
+                                               DEBUGA_GSMOPEN("address=%s\n", GSMOPEN_P_LOG, sms->address().toString().c_str());
+                                               DEBUGA_GSMOPEN("serviceCentreAddress=%s\n", GSMOPEN_P_LOG, sms->serviceCentreAddress().toString().c_str());
+                                               DEBUGA_GSMOPEN("serviceCentreTimestamp=%s\n", GSMOPEN_P_LOG, sms->serviceCentreTimestamp().toString().c_str());
+                                               DEBUGA_GSMOPEN("messageType=%d\n", GSMOPEN_P_LOG, sms->messageType());
+                                               DEBUGA_GSMOPEN("userData= |||%s|||\n", GSMOPEN_P_LOG, content2);
+
+
+                                               memset(sms_body, '\0', sizeof(sms_body));
+                                               strncpy(sms_body, content2, sizeof(sms_body));
+                                               DEBUGA_GSMOPEN("body=%s\n", GSMOPEN_P_LOG, sms_body);
+                                               strncpy(tech_pvt->sms_body, sms_body, sizeof(tech_pvt->sms_body));
+                                               strncpy(tech_pvt->sms_sender, sms->address().toString().c_str(), sizeof(tech_pvt->sms_sender));
+                                               strncpy(tech_pvt->sms_date, sms->serviceCentreTimestamp().toString().c_str(), sizeof(tech_pvt->sms_date));
+                                               strncpy(tech_pvt->sms_datacodingscheme, sms->dataCodingScheme().toString().c_str(), sizeof(tech_pvt->sms_datacodingscheme));
+                                               strncpy(tech_pvt->sms_servicecentreaddress, sms->serviceCentreAddress().toString().c_str(),
+                                                               sizeof(tech_pvt->sms_servicecentreaddress));
+                                               tech_pvt->sms_messagetype = sms->messageType();
+                                               //messagetype = sms->messageType();
+                                               //servicecentreaddress = sms->serviceCentreAddress();
+                                               //servicecentretimestamp = sms->serviceCentreTimestamp();
+                                               //sender_recipient_address = sms->address();
+#endif// NOTDEF
+
+#else// WANT_GSMLIB
+                       ERRORA("tech_pvt->no_ucs2 || tech_pvt->sms_pdu_not_supported == 0 && no WANT_GSMLIB\n", GSMOPEN_P_LOG);
+                       return RESULT_FAILURE;
+#endif// WANT_GSMLIB
 
-               if (tech_pvt->no_ucs2) {
-                       sprintf(smscommand, "AT+CMGS=\"%s\"", dest);    //TODO: support phones that only accept pdu mode
                } else {
                        char dest2[1048];
 
@@ -2677,11 +2779,8 @@ int gsmopen_sendsms(private_t *tech_pvt, char *dest, char *text)
 
                        memset(dest2, '\0', sizeof(dest2));
                        utf8_to_ucs2(tech_pvt, dest, strlen(dest), dest2, sizeof(dest2));
-                       sprintf(smscommand, "AT+CMGS=\"%s\"", dest2);   //TODO: support phones that only accept pdu mode
+                       sprintf(smscommand, "AT+CMGS=\"%s\"", dest2);
                }
-               //TODO: support phones that only accept pdu mode
-               //TODO would be better to lock controldev here
-               //sprintf(smscommand, "AT+CMGS=\"%s\"", dest);  //FIXME: nokia e63 want this
                err = gsmopen_serial_write_AT_noack(tech_pvt, smscommand);
                if (err) {
                        ERRORA("Error sending SMS\n", GSMOPEN_P_LOG);
@@ -2716,6 +2815,7 @@ int gsmopen_sendsms(private_t *tech_pvt, char *dest, char *text)
                }
 #endif
 
+#ifndef WANT_GSMLIB
                memset(mesg_test, '\0', sizeof(mesg_test));
                sprintf(mesg_test,":) ciao belè новости לק ראת ﺎﻠﺠﻤﻋﺓ 人大aèéàòçù"); //let's test the beauty of utf8
                //text=mesg_test;
@@ -2726,7 +2826,11 @@ int gsmopen_sendsms(private_t *tech_pvt, char *dest, char *text)
                } else {
                        utf8_to_ucs2(tech_pvt, text, strlen(text), smscommand, sizeof(smscommand));
                }
+#else // WANT_GSMLIB
 
+               memset(smscommand, '\0', sizeof(smscommand));
+                       sprintf(smscommand, "%s", pdu2);
+#endif // WANT_GSMLIB
                smscommand[strlen(smscommand)] = 0x1A;
                DEBUGA_GSMOPEN("smscommand len is: %d, text is:|||%s|||\n", GSMOPEN_P_LOG, (int) strlen(smscommand), smscommand);