01465 {
01466 PrivAT2data *privdata;
01467 Octstr *modem_type_string;
01468 long portno;
01469
01470 privdata = gw_malloc(sizeof(PrivAT2data));
01471 privdata->outgoing_queue = gw_prioqueue_create(sms_priority_compare);
01472 privdata->pending_incoming_messages = gwlist_create();
01473
01474 privdata->configfile = cfg_get_configfile(cfg);
01475
01476 privdata->device = cfg_get(cfg, octstr_imm("device"));
01477 if (privdata->device == NULL) {
01478 error(0, "AT2[-]: 'device' missing in at2 configuration.");
01479 goto error;
01480 }
01481
01482 if (octstr_str_compare(privdata->device, "rawtcp") == 0) {
01483 privdata->rawtcp_host = cfg_get(cfg, octstr_imm("host"));
01484 if (privdata->rawtcp_host == NULL) {
01485 error(0, "AT2[-]: 'host' missing in at2 rawtcp configuration.");
01486 goto error;
01487 }
01488 if (cfg_get_integer(&portno, cfg, octstr_imm("port")) == -1) {
01489 error(0, "AT2[-]: 'port' missing in at2 rawtcp configuration.");
01490 goto error;
01491 }
01492 privdata->rawtcp_port = portno;
01493 privdata->is_serial = 0;
01494 privdata->use_telnet = 0;
01495 }
01496 else if (octstr_str_compare(privdata->device, "telnet") == 0) {
01497 privdata->rawtcp_host = cfg_get(cfg, octstr_imm("host"));
01498 if (privdata->rawtcp_host == NULL) {
01499 error(0, "AT2[-]: 'host' missing in at2 telnet configuration.");
01500 goto error;
01501 }
01502 if (cfg_get_integer(&portno, cfg, octstr_imm("port")) == -1) {
01503 error(0, "AT2[-]: 'port' missing in at2 telnet configuration.");
01504 goto error;
01505 }
01506 privdata->rawtcp_port = portno;
01507 privdata->is_serial = 0;
01508 privdata->use_telnet = 1;
01509 }else {
01510 privdata->is_serial = 1;
01511 privdata->use_telnet = 0;
01512 }
01513
01514 privdata->name = cfg_get(cfg, octstr_imm("smsc-id"));
01515 if (privdata->name == NULL) {
01516 privdata->name = octstr_duplicate(privdata->device);
01517 }
01518
01519 privdata->speed = 0;
01520 cfg_get_integer(&privdata->speed, cfg, octstr_imm("speed"));
01521
01522 privdata->keepalive = 0;
01523 cfg_get_integer(&privdata->keepalive, cfg, octstr_imm("keepalive"));
01524
01525 cfg_get_bool(&privdata->sms_memory_poll_interval, cfg, octstr_imm("sim-buffering"));
01526 if (privdata->sms_memory_poll_interval) {
01527 if (privdata->keepalive)
01528 privdata->sms_memory_poll_interval = privdata->keepalive;
01529 else
01530 privdata->sms_memory_poll_interval = AT2_DEFAULT_SMS_POLL_INTERVAL;
01531 }
01532
01533 privdata->my_number = cfg_get(cfg, octstr_imm("my-number"));
01534 privdata->sms_center = cfg_get(cfg, octstr_imm("sms-center"));
01535 privdata->username = cfg_get(cfg, octstr_imm("smsc-username"));
01536 privdata->password = cfg_get(cfg, octstr_imm("smsc-password"));
01537 privdata->login_prompt = cfg_get(cfg, octstr_imm("login-prompt"));
01538 privdata->password_prompt = cfg_get(cfg, octstr_imm("password-prompt"));
01539 modem_type_string = cfg_get(cfg, octstr_imm("modemtype"));
01540
01541 privdata->modem = NULL;
01542
01543 if (modem_type_string != NULL) {
01544 if (octstr_compare(modem_type_string, octstr_imm("auto")) == 0 ||
01545 octstr_compare(modem_type_string, octstr_imm("autodetect")) == 0)
01546 O_DESTROY(modem_type_string);
01547 }
01548
01549 if (octstr_len(modem_type_string) == 0) {
01550 info(0, "AT2[%s]: configuration doesn't show modemtype. will autodetect",
01551 octstr_get_cstr(privdata->name));
01552 } else {
01553 info(0, "AT2[%s]: configuration shows modemtype <%s>",
01554 octstr_get_cstr(privdata->name),
01555 octstr_get_cstr(modem_type_string));
01556 privdata->modem = at2_read_modems(privdata, privdata->configfile,
01557 modem_type_string, 0);
01558 if (privdata->modem == NULL) {
01559 info(0, "AT2[%s]: modemtype not found, revert to autodetect",
01560 octstr_get_cstr(privdata->name));
01561 } else {
01562 info(0, "AT2[%s]: read modem definition for <%s>",
01563 octstr_get_cstr(privdata->name),
01564 octstr_get_cstr(privdata->modem->name));
01565 }
01566 O_DESTROY(modem_type_string);
01567 }
01568
01569 privdata->ilb = octstr_create("");
01570 privdata->fd = -1;
01571 privdata->lines = NULL;
01572 privdata->pin = cfg_get(cfg, octstr_imm("pin"));
01573 privdata->pin_ready = 0;
01574 privdata->conn = conn;
01575 privdata->phase2plus = 0;
01576 privdata->validityperiod = cfg_get(cfg, octstr_imm("validityperiod"));
01577 if (cfg_get_integer((long *) &privdata->max_error_count, cfg, octstr_imm("max-error-count")) == -1)
01578 privdata->max_error_count = -1;
01579
01580 conn->data = privdata;
01581 conn->name = octstr_format("AT2[%s]", octstr_get_cstr(privdata->name));
01582 conn->status = SMSCCONN_CONNECTING;
01583
01584 privdata->shutdown = 0;
01585
01586 conn->status = SMSCCONN_CONNECTING;
01587 conn->connect_time = time(NULL);
01588
01589 if ((privdata->device_thread = gwthread_create(at2_device_thread, conn)) == -1) {
01590 privdata->shutdown = 1;
01591 goto error;
01592 }
01593
01594 conn->shutdown = at2_shutdown_cb;
01595 conn->queued = at2_queued_cb;
01596 conn->start_conn = at2_start_cb;
01597 conn->send_msg = at2_add_msg_cb;
01598 return 0;
01599
01600 error:
01601 error(0, "AT2[%s]: Failed to create at2 smsc connection",
01602 octstr_len(privdata->name) ? octstr_get_cstr(privdata->name) : "");
01603 if (privdata != NULL) {
01604 gw_prioqueue_destroy(privdata->outgoing_queue, NULL);
01605 }
01606 gw_free(privdata);
01607 conn->why_killed = SMSCCONN_KILLED_CANNOT_CONNECT;
01608 conn->status = SMSCCONN_DEAD;
01609 info(0, "AT2[%s]: exiting", octstr_get_cstr(privdata->name));
01610 return -1;
01611 }