+}
+
+static struct ast_channel *lcr_request(const char *type, int format, void *data, int *cause)
+{
+
+}
+
+
+/* call from asterisk (new instance) */
+static int lcr_call(struct ast_channel *ast, char *dest, int timeout)
+{
+ struct lcr_pvt *lcr=ast->tech_pvt;
+
+ if (!lcr) return -1;
+
+ char buf[128];
+ char *port_str, *dad, *p;
+
+ ast_copy_string(buf, dest, sizeof(buf)-1);
+ p=buf;
+ port_str=strsep(&p, "/");
+ dad=strsep(&p, "/");
+
+ if (lcr_debug)
+ ast_verbose("Call: ext:%s dest:(%s) -> dad(%s) \n", ast->exten,dest, dad);
+
+
+ return 0;
+}
+
+static int lcr_answer(struct ast_channel *c)
+{
+ struct lcr_pvt *lcr=c->tech_pvt;
+ return 0;
+}
+
+static int lcr_hangup(struct ast_channel *c)
+{
+ struct lcr_pvt *lcr=c->tech_pvt;
+ c->tech_pvt=NULL;
+}
+
+
+static int lcr_write(struct ast_channel *c, struct ast_frame *f)
+{
+ struct lcr_pvt *lcrm= c->tech_pvt;
+}
+
+
+static struct ast_frame *lcr_read(struct ast_channel *c)
+{
+ struct lcr_pvt *lcr = c->tech_pvt;
+}
+
+static int lcr_indicate(struct ast_channel *c, int cond, const void *data, size_t datalen)
+{
+ int res = -1;
+
+ switch (cond) {
+ case AST_CONTROL_BUSY:
+ case AST_CONTROL_CONGESTION:
+ case AST_CONTROL_RINGING:
+ return -1;
+ case -1:
+ return 0;
+
+ case AST_CONTROL_VIDUPDATE:
+ res = -1;
+ break;
+ case AST_CONTROL_HOLD:
+ ast_verbose(" << Console Has Been Placed on Hold >> \n");
+ //ast_moh_start(c, data, g->mohinterpret);
+ break;
+ case AST_CONTROL_UNHOLD:
+ ast_verbose(" << Console Has Been Retrieved from Hold >> \n");
+ //ast_moh_stop(c);
+ break;
+
+ default:
+ ast_log(LOG_WARNING, "Don't know how to display condition %d on %s\n", cond, c->name);
+ return -1;
+ }
+
+ return 0;
+}
+
+static struct ast_channel_tech lcr_tech = {
+ .type="lcr",
+ .description="Channel driver for connecting to Linux-Call-Router",
+ .capabilities=AST_FORMAT_ALAW,
+ .requester=lcr_request,
+// .send_digit=lcr_digit,
+ .call=lcr_call,
+// .bridge=lcr_bridge,
+ .hangup=lcr_hangup,
+ .answer=lcr_answer,
+ .read=lcr_read,
+ .write=lcr_write,
+ .indicate=lcr_indicate,
+// .fixup=lcr_fixup,
+// .send_text=lcr_send_text,
+ .properties=0
+};
+
+/*
+ * cli
+ */
+static int cli_show_lcr (int fd, int argc, char *argv[])
+{
+}
+
+static int cli_show_calls (int fd, int argc, char *argv[])
+{
+}
+
+static int cli_reload_routing (int fd, int argc, char *argv[])
+{
+}
+
+static int cli_reload_interfaces (int fd, int argc, char *argv[])
+{
+}
+
+static int cli_port_block (int fd, int argc, char *argv[])
+{
+}
+
+static int cli_port_unblock (int fd, int argc, char *argv[])
+{
+}
+
+static int cli_port_unload (int fd, int argc, char *argv[])
+{
+}
+
+static struct ast_cli_entry cli_show_lcr =
+{ {"lcr", "show", "lcr", NULL},
+ lcr_show_lcr,
+ "Shows current states of LCR core",
+ "Usage: lcr show lcr\n",
+};
+
+static struct ast_cli_entry cli_show_calls =
+{ {"lcr", "show", "calls", NULL},
+ lcr_show_calls,
+ "Shows current calls made by LCR and Asterisk",
+ "Usage: lcr show calls\n",
+};
+
+static struct ast_cli_entry cli_reload_routing =
+{ {"lcr", "reload", "routing", NULL},
+ lcr_reload_routing,
+ "Reloads routing conf of LCR, current uncomplete calls will be disconnected",
+ "Usage: lcr reload routing\n",
+};
+
+static struct ast_cli_entry cli_reload_interfaces =
+{ {"lcr", "reload", "interfaces", NULL},
+ lcr_reload_interfaces,
+ "Reloads interfaces conf of LCR",
+ "Usage: lcr reload interfaces\n",
+};
+
+static struct ast_cli_entry cli_port_block =
+{ {"lcr", "port", "block", NULL},
+ lcr_port_block,
+ "Blocks LCR port for further calls",
+ "Usage: lcr port block \"<port>\"\n",
+};
+
+static struct ast_cli_entry cli_port_unblock =
+{ {"lcr", "port", "unblock", NULL},
+ lcr_port_unblock,
+ "Unblocks or loads LCR port, port is opened my mISDN",
+ "Usage: lcr port unblock \"<port>\"\n",
+};
+
+static struct ast_cli_entry cli_port_unload =
+{ {"lcr", "port", "unload", NULL},
+ lcr_port_unload,
+ "Unloads LCR port, port is closes by mISDN",
+ "Usage: lcr port unload \"<port>\"\n",
+};
+
+
+/*
+ * module loading and destruction
+ */
+int load_module(void)
+{
+// ast_mutex_init(&release_lock);
+
+// lcr_cfg_update_ptp();
+
+ if (!(lcr_sock = open_socket())) {
+ ast_log(LOG_ERROR, "Unable to connect\n");
+ lcr_sock = -1;
+ /* continue with closed socket */
+ }
+
+ if (!bchannel_initialize()) {
+ ast_log(LOG_ERROR, "Unable to open mISDN device\n");
+ return -1;
+ }
+ mISDN_created = 1;
+
+ if (ast_channel_register(&lcr_tech)) {
+ ast_log(LOG_ERROR, "Unable to register channel class\n");
+ return -1;
+ }
+
+#if 0
+ ast_cli_register(&cli_show_lcr);
+ ast_cli_register(&cli_show_calls);
+
+ ast_cli_register(&cli_reload_routing);
+ ast_cli_register(&cli_reload_interfaces);
+ ast_cli_register(&cli_port_block);
+ ast_cli_register(&cli_port_unblock);
+ ast_cli_register(&cli_port_unload);
+
+ ast_register_application("misdn_set_opt", misdn_set_opt_exec, "misdn_set_opt",
+ "misdn_set_opt(:<opt><optarg>:<opt><optarg>..):\n"
+ "Sets mISDN opts. and optargs\n"
+ "\n"
+ "The available options are:\n"
+ " d - Send display text on called phone, text is the optparam\n"
+ " n - don't detect dtmf tones on called channel\n"
+ " h - make digital outgoing call\n"
+ " c - make crypted outgoing call, param is keyindex\n"
+ " e - perform echo cancelation on this channel,\n"
+ " takes taps as arguments (32,64,128,256)\n"
+ " s - send Non Inband DTMF as inband\n"
+ " vr - rxgain control\n"
+ " vt - txgain control\n"
+ );