예제 #1
0
gn_error sendringtone(int argc, char *argv[], gn_data *data, struct gn_statemachine *state)
{
	gn_sms sms;
	gn_error error = GN_ERR_NOTSUPPORTED;

	gn_sms_default_submit(&sms);
	sms.user_data[0].type = GN_SMS_DATA_Ringtone;
	sms.user_data[1].type = GN_SMS_DATA_None;

	if ((error = gn_file_ringtone_read(optarg, &sms.user_data[0].u.ringtone))) {
		fprintf(stderr, _("Failed to load ringtone: %s\n"), gn_error_print(error));
		return error;
	}

	/* The second argument is the destination, ie the phone number of recipient. */
	snprintf(sms.remote.number, sizeof(sms.remote.number) - 1, "%s", argv[optind]);
	if (sms.remote.number[0] == '+')
		sms.remote.type = GN_GSM_NUMBER_International;
	else
		sms.remote.type = GN_GSM_NUMBER_Unknown;

	/* Get the SMS Center */
	if (!sms.smsc.number[0]) {
		data->message_center = calloc(1, sizeof(gn_sms_message_center));
		data->message_center->id = 1;
		if (gn_sm_functions(GN_OP_GetSMSCenter, data, state) == GN_ERR_NONE) {
			snprintf(sms.smsc.number, sizeof(sms.smsc.number), "%s", data->message_center->smsc.number);
			sms.smsc.type = data->message_center->smsc.type;
		}
		free(data->message_center);
	}

	if (!sms.smsc.type) sms.smsc.type = GN_GSM_NUMBER_Unknown;

	/* Send the message. */
	data->sms = &sms;
	error = gn_sms_send(data, state);

	if (error == GN_ERR_NONE) {
		if (sms.parts > 1) {
			int j;
			fprintf(stderr, _("Message sent in %d parts with reference numbers:"), sms.parts);
			for (j = 0; j < sms.parts; j++)
				fprintf(stderr, " %d", sms.reference[j]);
			fprintf(stderr, "\n");
		} else
			fprintf(stderr, _("Send succeeded with reference %d!\n"), sms.reference[0]);
	} else
		fprintf(stderr, _("SMS Send failed (%s)\n"), gn_error_print(error));

	return error;
}
gboolean libgnokii_sms_send_api(pegang *unit)
{
    if(!holdgnokii_init)
    {
        printf("hold_gnokii_init aint initialized\n");
        return FALSE;
    }
    //avoiding
    if(unit->sms_send_encapsulation->no_dest == NULL || strlen(unit->sms_send_encapsulation->no_dest) < 2 || unit->sms_send_encapsulation->msg == NULL || strlen(unit->sms_send_encapsulation->msg) < 2)
    {
        return FALSE;
    }

    gn_sms sms;
    gn_error error;
    gn_data data;
    int pos = 0;

    //memset to zero
    gn_sms_default_submit(&sms);
     gn_data_clear(&data);


    //set the dest number
    snprintf(sms.remote.number,sizeof(sms.remote.number),"%s",unit->sms_send_encapsulation->no_dest);
    sms.remote.type = libgnokii_nomorhp_tipe_api(unit->sms_send_encapsulation->no_dest);
    if(sms.remote.type == GN_GSM_NUMBER_Alphanumeric)
    {
        printf("Invalid Phone Number\n");
        return FALSE;
    }

    //set txt to be sent and length of it
    error = libgnokii_bacatext_api(&sms.user_data[pos],unit);
    sms.user_data[pos].type = GN_SMS_DATA_Text;
/*
        if ((sms.dcs.u.general.alphabet != GN_SMS_DCS_8bit) && !gn_char_def_alphabet(sms.user_data[pos].u.text))
		sms.dcs.u.general.alphabet = GN_SMS_DCS_UCS2;
		sms.user_data[++pos].type = GN_SMS_DATA_None;

*/

    //report the delivery
    sms.delivery_report = 1;

    //auto get sms center
    data.message_center      = calloc(1, sizeof(gn_sms_message_center)); //allocate only for one element of data->message_center and size of its element is sizeof(gn_sms_message_center)
    data.message_center->id  = 1;

    error = gn_sm_functions(GN_OP_GetSMSCenter, &data, state);
    if(error == GN_ERR_NONE)
    {
        snprintf(sms.smsc.number,sizeof(sms.smsc.number),"%s",data.message_center->smsc.number); // set to sms.smsc.number from data.sms.smsc.number
        sms.smsc.type = data.message_center->smsc.type;
        //g_slice_free(gn_sms_message_center,data->message_center); // free the ram
        free(data.message_center);
    }
    if(!sms.smsc.number[0])
    {
        printf("failed once getting sms center number\n");
        return FALSE;
    }
    if(!sms.smsc.type)
    {
        sms.smsc.type = GN_GSM_NUMBER_Unknown;
    }

    //now give the data.sms from what all we have in sms, and make sure before these data.sms has been freed...
    data.sms = &sms;

    //send the message
    error = gn_sms_send(&data,state);

    if(error == GN_ERR_NONE)
    {
        if(sms.parts > 1)
        {
            int j;
            printf("sms sent with : %d parts, and reference number is : ", sms.parts);

            for(j=0; j < sms.parts; j++)
            {
                printf("%d\n",sms.reference[j]);
            }
        }
        else
        {
            printf("one sms sent with reference number : %d\n",sms.reference[0]);
        }
    }
    else
    {
        printf("libgnokii error : %s\n",gn_error_print(error));
        return FALSE;
    }

    free(sms.reference);

    return TRUE;
}
예제 #3
0
파일: file.c 프로젝트: pkot/gnokii
GNOKII_API gint DB_Look (const gchar * const phone)
{
  DIR *dir;
  struct dirent *dirent;
  FILE *smsFile;
  GString *buf;
  gint numError, error;
  gint empty = 1;


  if (spool[0] == '\0')  // if user don't set spool dir, sending is disabled
    return (SMSD_NOK);
    
  if ((dir = opendir (spool)) == NULL)
  {
    g_print (_("Cannot open directory %s\n"), spool);
    return (SMSD_NOK);
  }

  buf = g_string_sized_new (64);
  
  while ((dirent = readdir (dir)))
  {
    gn_sms sms;
    gint slen = 0;
    
    if (strcmp (dirent->d_name, ".") == 0 || strcmp (dirent->d_name, "..") == 0 ||
        strncmp (dirent->d_name, "ERR.", 4) == 0)
      continue;
    
    g_string_printf (buf, "%s/%s", spool, dirent->d_name);
    
    if ((smsFile = fopen (buf->str, "r")) == NULL)
    {
      g_print (_("Can't open file %s for reading!\n"), buf->str);
      continue;
    }
    
    empty = 0;
    gn_sms_default_submit (&sms);
    memset (&sms.remote.number, 0, sizeof (sms.remote.number));

    if (fgets (sms.remote.number, sizeof (sms.remote.number), smsFile))
      slen = strlen (sms.remote.number);
    if (slen < 1)
    {
      error = -1;
      fclose (smsFile);
      g_print (_("Remote number is empty in %s!\n"), buf->str);
      goto handle_file;
    }
    
    if (sms.remote.number[slen - 1] == '\n')
      sms.remote.number[slen - 1] = '\0';
    
    /* Initialize SMS text */
    memset (&sms.user_data[0].u.text, 0, sizeof (sms.user_data[0].u.text));
    
    slen = fread ((gchar *) sms.user_data[0].u.text, 1, GN_SMS_MAX_LENGTH, smsFile);
    if (slen > 0 && sms.user_data[0].u.text[slen - 1] == '\n')
      sms.user_data[0].u.text[slen - 1] = '\0';
     
    fclose (smsFile);
    
//    sms.delivery_report = (smsdConfig.smsSets & SMSD_READ_REPORTS);

    if (sms.remote.number[0] == '+')
      sms.remote.type = GN_GSM_NUMBER_International;
    else
      sms.remote.type = GN_GSM_NUMBER_Unknown;
    
    sms.user_data[0].length = strlen ((gchar *) sms.user_data[0].u.text);
    sms.user_data[0].type = GN_SMS_DATA_Text;
    sms.user_data[1].type = GN_SMS_DATA_None;
    if (!gn_char_def_alphabet (sms.user_data[0].u.text))
       sms.dcs.u.general.alphabet = GN_SMS_DCS_UCS2;


    gn_log_xdebug ("Sending SMS: %s, %s\n", sms.remote.number, sms.user_data[0].u.text);
    
    numError = 0;
    do
    {
      if ((error = WriteSMS (&sms)) == GN_ERR_NONE)
        break;
      sleep (1);
    }
    while ((error == GN_ERR_TIMEOUT || error == GN_ERR_FAILED) && numError++ < 3);

 handle_file:
    if (error == GN_ERR_NONE)
    {
      if (unlink (buf->str))
        g_print (_("Cannot unlink %s."), buf->str);
    }
    else
    {
      GString *buf2;
      
      buf2 = g_string_sized_new (64);
      g_string_printf (buf2, "%s/ERR.%s", spool, dirent->d_name);
      
      g_print (_("Cannot send sms from file %s\n"), buf->str);
      if (rename (buf->str, buf2->str))
      {
        g_print (_("Cannot rename file %s to %s. Trying to unlink it.\n"),
                 buf->str, buf2->str);
        if (unlink (buf->str))
          g_print (_("Cannot unlink %s."), buf->str);
      }
      g_string_free (buf2, TRUE);
    }
  }
  
  g_string_free (buf, TRUE);
  closedir (dir);

  if (empty)
    return (SMSD_OUTBOXEMPTY);
  else
    return (SMSD_OK);
}
예제 #4
0
파일: sqlite.c 프로젝트: pkot/gnokii
GNOKII_API gint DB_Look(const gchar * const phone)
{
    GString *buf, *phnStr, *timebuf;
    gint ret1, numError, error;
    time_t rawtime;
    struct tm * timeinfo;
    sqlite3_stmt * stmt;
    gint empty = 1;

    if (phone[0] == '\0')
        phnStr = g_string_new("");
    else {
        phnStr = g_string_sized_new(32);
        g_string_printf(phnStr, "AND phone = '%s'", phone);
    }

    time(&rawtime);
    timeinfo = localtime(&rawtime);

    timebuf = g_string_sized_new(25);
    g_string_printf(timebuf, "'%02d:%02d:%02d'",
            timeinfo->tm_hour, timeinfo->tm_min, timeinfo->tm_sec);

    sqlite3_exec(ppDbOutbox, "BEGIN TRANSACTION;", NULL, NULL, NULL);

    /* poll for outgoing messages */
    buf = g_string_sized_new(256);
    g_string_printf(buf, "SELECT id, number, text, dreport FROM outbox \
                        WHERE processed=0 \
                        AND %s >= not_before \
                        AND %s <= not_after \
                        %s", timebuf->str, timebuf->str, phnStr->str);

    g_string_free(phnStr, TRUE);

    ret1 = sqlite3_prepare_v2(ppDbOutbox, buf->str, -1, &stmt, NULL);
    if (ret1 != SQLITE_OK) {
        g_print(_("%d: Parsing query %s failed!"), __LINE__, buf->str);
        g_print(_("Error: %s"), sqlite3_errmsg(ppDbOutbox));
        return (SMSD_NOK);
    }

    g_string_printf(timebuf, "'%02d-%02d-%02d %02d:%02d:%02d'",
            timeinfo->tm_year, timeinfo->tm_mon,
            timeinfo->tm_mday, timeinfo->tm_hour,
            timeinfo->tm_min, timeinfo->tm_sec
            );

    ret1 = sqlite3_step(stmt);
    while (ret1 == SQLITE_ROW) {
        int gerror = 0;
        gn_sms sms;

        empty = 0;
        gn_sms_default_submit(&sms);
        memset(&sms.remote.number, 0, sizeof (sms.remote.number));
        sms.delivery_report = sqlite3_column_int(stmt, 3);

        strncpy(sms.remote.number, sqlite3_column_text(stmt, 1), sizeof (sms.remote.number) - 1);
        sms.remote.number[sizeof (sms.remote.number) - 1] = '\0';
        if (sms.remote.number[0] == '+')
            sms.remote.type = GN_GSM_NUMBER_International;
        else
            sms.remote.type = GN_GSM_NUMBER_Unknown;

        strncpy((gchar *) sms.user_data[0].u.text, sqlite3_column_text(stmt, 2), 10 * GN_SMS_MAX_LENGTH + 1);
        sms.user_data[0].u.text[10 * GN_SMS_MAX_LENGTH] = '\0';
        sms.user_data[0].length = strlen((gchar *) sms.user_data[0].u.text);
        sms.user_data[0].type = GN_SMS_DATA_Text;
        sms.user_data[1].type = GN_SMS_DATA_None;
        if (!gn_char_def_alphabet(sms.user_data[0].u.text))
            sms.dcs.u.general.alphabet = GN_SMS_DCS_UCS2;

        gn_log_xdebug("Sending SMS: %s, %s\n", sms.remote.number, sms.user_data[0].u.text);

        numError = 0;
        do {
            if ((error = WriteSMS (&sms)) == GN_ERR_NONE)
                break;
            sleep(1);
        } while ((error == GN_ERR_TIMEOUT || error == GN_ERR_FAILED) && numError++ < 3);

        /* mark sended */
        g_string_printf(buf, "UPDATE outbox SET processed=1, error='%d', \
                        processed_date=%s \
                        WHERE id=%d",
                gerror, timebuf->str, sqlite3_column_int(stmt, 0)
                );

        sqlite3_exec(ppDbOutbox, buf->str, NULL, NULL, NULL);
        ret1 = sqlite3_step(stmt);
    }

    /* rollback if found any errors */
    if (ret1 != SQLITE_DONE) {
        g_print(_("%d: SELECT FROM outbox command failed.\n"), __LINE__);
        g_print(_("Error: %s\n"), sqlite3_errmsg(ppDbOutbox));
        sqlite3_finalize(stmt);
        sqlite3_exec(ppDbOutbox, "ROLLBACK TRANSACTION;", NULL, NULL, NULL);

        g_string_free(timebuf, TRUE);
        g_string_free(buf, TRUE);
        return (SMSD_NOK);
    }
    sqlite3_finalize(stmt);
    sqlite3_exec(ppDbOutbox, "COMMIT;", NULL, NULL, NULL);

    g_string_free(timebuf, TRUE);
    g_string_free(buf, TRUE);
    
    if (empty)
      return (SMSD_OUTBOXEMPTY);
    else
      return (SMSD_OK);
}
예제 #5
0
static VALUE sendsms(VALUE self, VALUE  names)
{
	gn_sms sms;
	gn_error error;
	gn_data *data;
	//gn_sms_user_data *udata;
	struct RArray *names_array;
	
	int input_len, i, curpos = 0;
	
	names_array = RARRAY(names);
   
       VALUE current = names_array->ptr[0];
       VALUE mobileno = names_array->ptr[1];

	input_len = GN_SMS_MAX_LENGTH  ;

	gn_sms_default_submit(&sms);

	memset(&sms.remote.number, 0, sizeof(sms.remote.number));
	
	if(rb_respond_to(mobileno, rb_intern("to_s")))
        {
          VALUE receipient_no = rb_funcall(mobileno, rb_intern("to_s"), 0);
	  snprintf(sms.remote.number, 56, "%s",StringValuePtr(receipient_no));
	}

	if (sms.remote.number[0] == '+') 
		sms.remote.type = GN_GSM_NUMBER_International;
	else 
		sms.remote.type = GN_GSM_NUMBER_Unknown;

	sms.dcs.u.general.alphabet = GN_SMS_DCS_DefaultAlphabet;
 	
	if (!sms.smsc.number[0]) {
		data->message_center = calloc(1, sizeof(gn_sms_message_center));
		data->message_center->id = 1;
		
		if (gn_sm_functions(GN_OP_GetSMSCenter, data, state) == GN_ERR_NONE) {
			if (sms.smsc.number[0] == '+') 
		   		sms.smsc.type = GN_GSM_NUMBER_International;
			else
				sms.smsc.type = GN_GSM_NUMBER_Unknown;
			
			snprintf(sms.smsc.number, sizeof(sms.smsc.number), "%s", data->message_center->smsc.number);
			sms.smsc.type = data->message_center->smsc.type;
		} else {
			fprintf(stderr, _("Cannot read the SMSC number from your phone. If the sms send will fail, please use --smsc option explicitely giving the number.\n"));
		}
		free(data->message_center);
	}

	if (!sms.smsc.type) sms.smsc.type = GN_GSM_NUMBER_Unknown;
	
			
	if (curpos != -1) {

	
	sms.user_data[curpos].type = GN_SMS_DATA_Text;
	sms.dcs.u.general.alphabet = GN_SMS_DCS_DefaultAlphabet;
	 if(rb_respond_to(current, rb_intern("to_s")))
       {
           VALUE name = rb_funcall(current, rb_intern("to_s"), 0);
	       	
	 snprintf(sms.user_data[curpos].u.text,255*MAX_SMS_PART,"%s",StringValuePtr(name));;
         sms.user_data[curpos].length =  printf("Message is : %s, ", StringValuePtr(name));
       }
   

	//printf("the length is %d",INT2NUM(strlen(sms.user_data[curpos].u.text)));
		if (sms.user_data[curpos].length < 1) {
			fprintf(stderr, _("Empty message. Quitting.\n"));
			return INT2NUM(GN_ERR_FAILED);
		}
		
		//sms.user_data[curpos].type = GN_SMS_DATA_Text;
		if (!gn_char_def_alphabet(sms.user_data[curpos].u.text))
			sms.dcs.u.general.alphabet = GN_SMS_DCS_UCS2; 
		sms.user_data[++curpos].type = GN_SMS_DATA_None;

	
			


	}
	

	data->sms = &sms;

	/* Send the message. */
	error = gn_sms_send(data, state);

	if (error == GN_ERR_NONE)
		fprintf(stderr, _("Send succeeded!\n"));
	else
		fprintf(stderr, _("SMS Send failed (%s)\n"));

	return INT2NUM(error);
}