1 /*****************************************************************************\
5 **---------------------------------------------------------------------------**
6 ** Copyright: Andreas Eversberg **
8 ** dialing for answering machine is processed here **
10 \*****************************************************************************/
14 #include <sys/types.h>
22 // note: the given display message (e_vbox_display) may include "%s" for the counter
25 * these are the state, the vbox is in. if the current tone has been played,
26 * an action will be calles as defined in vbox_message_eof(), which is called
27 * from Epoint:handler().
28 * also this state is used to determine the correct processing of the current key press
31 VBOX_STATE_MENU, /* tell the menu */
32 VBOX_STATE_CALLINFO_BEGIN, /* this value defines the start of callinfo */
33 VBOX_STATE_CALLINFO_INTRO, /* tell that the "call is received at" */
34 VBOX_STATE_CALLINFO_MONTH, /* tell the month */
35 VBOX_STATE_CALLINFO_DAY, /* tell the day */
36 VBOX_STATE_CALLINFO_HOUR, /* tell the hour */
37 VBOX_STATE_CALLINFO_OCLOCK, /* tell the word "o'clock" */
38 VBOX_STATE_CALLINFO_MIN, /* tell the minute */
39 VBOX_STATE_CALLINFO_MINUTES, /* tell the word "minutes" */
40 VBOX_STATE_CALLINFO_DIGIT, /* tell the digits */
41 VBOX_STATE_CALLINFO_END, /* this value defines the end of callingo */
42 VBOX_STATE_NOTHING, /* tells that no calls are recorded */
43 VBOX_STATE_PLAY, /* play the current recording */
44 VBOX_STATE_PAUSE, /* tell that the recording is paused */
45 VBOX_STATE_RECORD_ASK, /* ask for recording */
46 VBOX_STATE_RECORD_PLAY, /* play recording */
47 VBOX_STATE_RECORD_RECORD, /* record recording */
48 VBOX_STATE_STORE_ASK, /* ask for store */
49 VBOX_STATE_DELETE_ASK, /* ask for delete */
50 VBOX_STATE_STORE_DONE, /* tell that message is store */
51 VBOX_STATE_DELETE_DONE, /* tell that message is delete */
54 char *months_english[] = {"Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"};
55 char *months_german[] = {"Jan","Feb","Maer","Apr","Mai","Jun","Jul","Aug","Sep","Okt","Nov","Dez"};
62 {'1', "<< previous", "<< zurueck"},
63 {'2', "-> play", "-> anhoeren"},
64 {'3', ">> next", ">> vor"},
65 {'4', "< rewind", "< rueckspulen"},
66 {'5', "[] stop", "[] stop"},
67 {'6', "> wind", "> vorspulen"},
68 {'7', "() record", "() Aufnahme"},
69 {'8', "= store", "= speichern"},
70 {'9', "X delete", "X loeschen"},
71 {'0', "* call", "* anrufen"},
76 * initialize the vbox. this is called at process_dialing(), when the VBOX_PLAY
77 * action has been selected by the caller
79 void EndpointAppPBX::action_init_vbox_play(void)
81 int language = e_ext.vbox_language;
82 struct route_param *rparam;
83 struct lcr_msg *message;
84 struct port_list *portlist = ea_endpoint->ep_portlist;
87 SCPY(e_vbox, e_ext.number);
88 if ((rparam = routeparam(e_action, PARAM_EXTENSION)))
89 SCPY(e_vbox, rparam->string_value);
90 if (e_vbox[0] == '\0')
92 /* facility rejected */
93 message_disconnect_port(portlist, CAUSE_FACILITYREJECTED, LOCATION_PRIVATE_LOCAL, "");
94 new_state(EPOINT_STATE_OUT_DISCONNECT);
95 set_tone(portlist,"cause_22");
99 /* connect, but still accept more digits */
100 new_state(EPOINT_STATE_IN_OVERLAP);
103 message = message_create(ea_endpoint->ep_serial, portlist->port_id, EPOINT_TO_PORT, MESSAGE_CONNECT);
104 message_put(message);
105 logmessage(message->type, &message->param, portlist->port_id, DIRECTION_OUT);
107 /* initialize the vbox */
108 PDEBUG(DEBUG_EPOINT, "EPOINT(%d) initializing answering vbox state\n", ea_endpoint->ep_serial);
110 e_vbox_state = VBOX_STATE_MENU;
111 SCPY(e_vbox_display, (char *)((language)?"druecke 2 f. wiedergabe":"press 2 to play"));
112 e_vbox_display_refresh = 1;
113 set_tone_vbox("menu");
117 vbox_index_read(e_vbox_play);
118 PDEBUG(DEBUG_EPOINT, "EPOINT(%d) number of calls: %d\n", ea_endpoint->ep_serial, e_vbox_index_num);
120 if (e_vbox_index_num == 0)
122 e_vbox_state = VBOX_STATE_NOTHING;
123 SCPY(e_vbox_display, (char *)((language)?"keine Anrufe":"no calls"));
124 e_vbox_display_refresh = 1;
125 set_tone_vbox("nothing");
130 * read index list, and fill the index variables with the given position
131 * if the index is empty (or doesn't exist), the variables are not filled.
132 * but alway the e_vbox_index_num is given.
134 void EndpointAppPBX::vbox_index_read(int num)
139 char name[sizeof(buffer)];
140 char callerid[sizeof(buffer)];
141 int year, mon, mday, hour, min;
144 e_vbox_index_num = 0;
146 SPRINT(filename, "%s/%s/%s/vbox/index", INSTALL_DATA, options.extensions_dir, e_vbox);
147 if (!(fp = fopen(filename, "r")))
149 PDEBUG(DEBUG_EPOINT, "EPOINT(%d) no files in index\n", ea_endpoint->ep_serial);
155 while((fgets(buffer,sizeof(buffer),fp)))
157 buffer[sizeof(buffer)-1] = '\0';
158 if (buffer[0]) buffer[strlen(buffer)-1] = '\0';
160 name[0] = callerid[0] = '\0';
161 mon = mday = hour = min = 0;
162 sscanf(buffer, "%s %d %d %d %d %d %s", name, &year, &mon, &mday, &hour, &min, callerid);
164 if (name[0]=='\0' || name[0]=='#')
167 /* the selected entry */
170 SCPY(e_vbox_index_file, name);
171 e_vbox_index_year = year;
172 e_vbox_index_mon = mon;
173 e_vbox_index_mday = mday;
174 e_vbox_index_hour = hour;
175 e_vbox_index_min = min;
176 SCPY(e_vbox_index_callerid, callerid);
177 PDEBUG(DEBUG_EPOINT, "EPOINT(%d) read entry #%d: '%s', %02d:%02d %02d:%02d cid='%s'\n", ea_endpoint->ep_serial, i, name, mon+1, mday, hour, min, callerid);
183 e_vbox_index_num = i;
191 * removes given index from list
192 * after removing, the list should be reread, since e_vbox_index_num
193 * and the current variabled do not change
195 void EndpointAppPBX::vbox_index_remove(int num)
200 char filename1[256], filename2[256];
202 PDEBUG(DEBUG_EPOINT, "EPOINT(%d) removing entrie #%d\n", ea_endpoint->ep_serial, num);
204 SPRINT(filename1, "%s/%s/%s/vbox/index", INSTALL_DATA, options.extensions_dir, e_vbox);
205 SPRINT(filename2, "%s/%s/%s/vbox/index-temp", INSTALL_DATA, options.extensions_dir, e_vbox);
206 if (!(fpr = fopen(filename1, "r")))
210 if (!(fpw = fopen(filename2, "w")))
218 while((fgets(buffer,sizeof(buffer),fpr)))
220 buffer[sizeof(buffer)-1] = '\0';
221 if (buffer[0]) buffer[strlen(buffer)-1] = '\0';
223 if (buffer[0]=='\0' || buffer[0]=='#')
225 fprintf(fpw, "%s\n", buffer);
229 /* the selected entry will not be written */
232 fprintf(fpw, "%s\n", buffer);
242 rename(filename2, filename1);
247 * process dialing of vbox_play (actually the menu)
248 * it is depended by the state, which action is performed
250 void EndpointAppPBX::action_dialing_vbox_play(void)
252 int language = e_ext.vbox_language;
253 struct port_list *portlist;
256 portlist = ea_endpoint->ep_portlist;
258 if (e_extdialing[0] == '\0')
260 PDEBUG(DEBUG_EPOINT, "EPOINT(%d) called with no digit\n", ea_endpoint->ep_serial);
264 PDEBUG(DEBUG_EPOINT, "EPOINT(%d) dialing digit: %c\n", ea_endpoint->ep_serial, e_extdialing[0]);
266 e_vbox_display_refresh = 1;
268 if (e_vbox_state == VBOX_STATE_RECORD_RECORD)
270 if (e_extdialing[0] == '1' || e_extdialing[0] == '0')
272 PDEBUG(DEBUG_EPOINT, "EPOINT(%d) stopping recording of announcement.\n", ea_endpoint->ep_serial);
274 port = find_port_id(portlist->port_id);
276 port->close_record((e_extdialing[0]=='1')?6000:0, 2000); /* append beep */
282 if (e_vbox_state == VBOX_STATE_RECORD_PLAY)
284 if (e_extdialing[0] == '1')
286 PDEBUG(DEBUG_EPOINT, "EPOINT(%d) stopping playback of announcement.\n", ea_endpoint->ep_serial);
293 if (e_vbox_state == VBOX_STATE_RECORD_ASK)
295 switch(e_extdialing[0])
298 PDEBUG(DEBUG_EPOINT, "EPOINT(%d) quit recoding menu.\n", ea_endpoint->ep_serial);
301 e_vbox_state = VBOX_STATE_MENU;
302 SCPY(e_vbox_display, (char *)((language)?"druecke 2 f. wiedergabe":"press 2 to play"));
303 set_tone_vbox("menu");
307 PDEBUG(DEBUG_EPOINT, "EPOINT(%d) play recoding.\n", ea_endpoint->ep_serial);
308 /* play announcement */
310 e_vbox_counter_last = 0;
311 e_vbox_counter_max = 0;
313 e_vbox_state = VBOX_STATE_RECORD_PLAY;
314 if (e_ext.vbox_language)
315 SCPY(e_vbox_display, "Wied., 1=stop %s");
317 SCPY(e_vbox_display, "play, 1=stop %s");
318 if (e_ext.vbox_display == VBOX_DISPLAY_BRIEF)
319 SCPY(e_vbox_display, "1=stop %s");
320 set_play_vbox("announcement", 0);
324 PDEBUG(DEBUG_EPOINT, "EPOINT(%d) record announcement.\n", ea_endpoint->ep_serial);
325 /* close recording if already recording */
326 port = find_port_id(portlist->port_id);
329 port->close_record(0,0);
330 port->open_record(CODEC_MONO, 1, 4000, e_ext.number, 0, "", 0); /* record announcement, skip the first 4000 samples */
332 e_vbox_state = VBOX_STATE_RECORD_RECORD;
333 if (e_ext.vbox_language)
334 SCPY(e_vbox_display, "Aufnahme, 1=stop");
336 SCPY(e_vbox_display, "recording, 1=stop");
346 if (e_vbox_state==VBOX_STATE_STORE_ASK || e_vbox_state==VBOX_STATE_DELETE_ASK)
348 char filename[256], filename2[256];
350 switch(e_extdialing[0])
353 PDEBUG(DEBUG_EPOINT, "EPOINT(%d) quit store/delete menu.\n", ea_endpoint->ep_serial);
357 PDEBUG(DEBUG_EPOINT, "EPOINT(%d) do store/delete.\n", ea_endpoint->ep_serial);
358 SPRINT(filename, "%s/%s/%s/vbox/%s", INSTALL_DATA, options.extensions_dir, e_vbox, e_vbox_index_file);
361 if (e_vbox_state == VBOX_STATE_STORE_ASK)
363 SPRINT(filename, "%s/%s/%s/recordings", INSTALL_DATA, options.extensions_dir, e_vbox);
364 if (mkdir(filename, 0755) < 0)
368 PERROR("EPOINT(%d) cannot create directory '%s'\n", ea_endpoint->ep_serial, filename);
372 SPRINT(filename2, "%s/%s/%s/recordings/%s", INSTALL_DATA, options.extensions_dir, e_vbox, e_vbox_index_file);
373 rename(filename, filename2);
374 e_vbox_state = VBOX_STATE_STORE_DONE;
375 if (e_ext.vbox_language)
376 SCPY(e_vbox_display, "Nachricht gespeichert!");
378 SCPY(e_vbox_display, "Message stored!");
379 set_tone_vbox("store_done");
383 if (e_vbox_state == VBOX_STATE_DELETE_ASK)
386 e_vbox_state = VBOX_STATE_DELETE_DONE;
387 if (e_ext.vbox_language)
388 SCPY(e_vbox_display, "Nachricht geloescht!");
390 SCPY(e_vbox_display, "Message deleted!");
391 set_tone_vbox("delete_done");
394 /* remove from list */
395 vbox_index_remove(e_vbox_play);
396 vbox_index_read(e_vbox_play);
397 /* stay at the last message+1, so we always get "no messages" */
398 if (e_vbox_play>e_vbox_index_num && e_vbox_play)
400 e_vbox_play = e_vbox_index_num-1;
408 /* dialing during menu */
409 switch(e_extdialing[0])
411 /* process the vbox functions */
412 case '1': /* previous */
413 PDEBUG(DEBUG_EPOINT, "EPOINT(%d) previous call is selected.\n", ea_endpoint->ep_serial);
414 if (e_vbox_index_num == 0) /* nothing to play */
417 e_vbox_state = VBOX_STATE_MENU;
418 SCPY(e_vbox_display, (char *)((language)?"keine Anrufe":"no calls"));
419 set_tone_vbox("nothing");
427 e_vbox_state = VBOX_STATE_MENU;
428 SCPY(e_vbox_display, (char *)((language)?"kein vorheriger Anruf":"no previous call"));
429 set_tone_vbox("nothing");
434 e_vbox_state = VBOX_STATE_CALLINFO_INTRO;
435 SPRINT(e_vbox_display, "#%d", e_vbox_play+1);
436 vbox_index_read(e_vbox_play);
437 if (e_vbox_index_mon!=now_tm->tm_mon || e_vbox_index_year!=now_tm->tm_year)
439 UPRINT(strchr(e_vbox_display,'\0'), " %s", (language)?months_german[e_vbox_index_mon]:months_english[e_vbox_index_mon]);
441 if (e_vbox_index_mday!=now_tm->tm_mday || e_vbox_index_mon!=now_tm->tm_mon || e_vbox_index_year!=now_tm->tm_year)
443 UPRINT(strchr(e_vbox_display,'\0'), " %d", e_vbox_index_mday);
445 UPRINT(strchr(e_vbox_display,'\0'), " %02d:%02d", e_vbox_index_hour, e_vbox_index_min);
446 if (e_ext.vbox_display == VBOX_DISPLAY_DETAILED)
447 UPRINT(strchr(e_vbox_display,'\0'), " (%s)", e_vbox_index_callerid);
448 set_tone_vbox("intro");
452 if (e_vbox_play >= e_vbox_index_num)
454 if (e_vbox_index_num == 0) /* nothing to play */
458 PDEBUG(DEBUG_EPOINT, "EPOINT(%d) play call #%d.\n", ea_endpoint->ep_serial, e_vbox_play+1);
459 if (e_vbox_state>VBOX_STATE_CALLINFO_BEGIN && e_vbox_state<VBOX_STATE_CALLINFO_END)
461 PDEBUG(DEBUG_EPOINT, "EPOINT(%d) play call #%d. abborting announcement and starting with playback\n", ea_endpoint->ep_serial, e_vbox_play+1);
462 /* the callinfo is played, so we start with the call */
464 e_vbox_counter_last = 0;
465 e_vbox_counter_max = 0;
467 e_vbox_state = VBOX_STATE_PLAY;
468 SPRINT(e_vbox_display, "#%d %%s", e_vbox_play+1);
469 if (e_ext.vbox_display == VBOX_DISPLAY_DETAILED)
470 UPRINT(strchr(e_vbox_display,'\0'), " (%s)", e_vbox_index_callerid);
471 set_play_vbox(e_vbox_index_file, 0);
474 if (e_vbox_state==VBOX_STATE_PLAY && e_vbox_speed!=1)
476 PDEBUG(DEBUG_EPOINT, "EPOINT(%d) play call #%d. play speed is different from 1, so we play now with normal speed\n", ea_endpoint->ep_serial, e_vbox_play+1);
477 /* we set play speed to normal */
479 set_play_speed(e_vbox_speed);
481 if (e_vbox_state == VBOX_STATE_PLAY)
483 PDEBUG(DEBUG_EPOINT, "EPOINT(%d) play call #%d. play speed is equals 1, so we pause\n", ea_endpoint->ep_serial, e_vbox_play+1);
484 /* we pause the current play */
485 e_vbox_state = VBOX_STATE_PAUSE;
486 SCPY(e_vbox_display, (char *)((language)?"druecke 2 f. wiedergabe":"press 2 to play"));
487 set_tone_vbox("pause");
489 if (e_vbox_state == VBOX_STATE_PAUSE)
491 PDEBUG(DEBUG_EPOINT, "EPOINT(%d) play call #%d. currently pause, so we continue play\n", ea_endpoint->ep_serial, e_vbox_play+1);
492 /* we continue the current play */
493 e_vbox_state = VBOX_STATE_PLAY;
494 SPRINT(e_vbox_display, "#%d %%s", e_vbox_play+1);
495 if (e_ext.vbox_display == VBOX_DISPLAY_DETAILED)
496 UPRINT(strchr(e_vbox_display,'\0'), " (%s)", e_vbox_index_callerid);
497 set_play_vbox(e_vbox_index_file, e_vbox_counter);
500 /* now we have something else going on, so we announce the call */
501 PDEBUG(DEBUG_EPOINT, "EPOINT(%d) play call #%d. announcing call during any other state\n", ea_endpoint->ep_serial, e_vbox_play+1);
507 PDEBUG(DEBUG_EPOINT, "EPOINT(%d) next call is selected.\n", ea_endpoint->ep_serial);
508 if (e_vbox_index_num == 0) /* nothing to play */
513 if (e_vbox_play >= e_vbox_index_num)
516 e_vbox_play = e_vbox_index_num;
518 e_vbox_state = VBOX_STATE_MENU;
519 SCPY(e_vbox_display, (char *)((language)?"kein weiterer Anruf":"no next call"));
520 set_tone_vbox("nothing");
527 case '4': /* rewind */
528 if (e_vbox_state==VBOX_STATE_PLAY)
530 if (e_vbox_speed >= -1)
532 e_vbox_speed = e_vbox_speed * 2;
533 set_play_speed(e_vbox_speed);
534 PDEBUG(DEBUG_EPOINT, "EPOINT(%d) rewind speed has been changed to: %d\n", ea_endpoint->ep_serial, e_vbox_speed);
539 PDEBUG(DEBUG_EPOINT, "EPOINT(%d) stop is pressed, so we hear the menu\n", ea_endpoint->ep_serial);
540 e_vbox_state = VBOX_STATE_MENU;
541 SCPY(e_vbox_display, (char *)((language)?"druecke 2 f. wiedergabe":"press 2 to play"));
542 set_tone_vbox("menu");
546 if (e_vbox_state==VBOX_STATE_PLAY)
548 if (e_vbox_speed <= 1)
550 e_vbox_speed = e_vbox_speed * 2;
551 set_play_speed(e_vbox_speed);
552 PDEBUG(DEBUG_EPOINT, "EPOINT(%d) wind speed has been changed to: %d\n", ea_endpoint->ep_serial, e_vbox_speed);
556 case '7': /* record announcement */
557 PDEBUG(DEBUG_EPOINT, "EPOINT(%d) entering the record announcement menu\n", ea_endpoint->ep_serial);
559 e_vbox_state = VBOX_STATE_RECORD_ASK;
560 SCPY(e_vbox_display, (char *)((language)?"1=Aufn. 2=Wied. 3=nein":"1=record 2=play 3=back"));
561 set_tone_vbox("record_ask");
564 case '8': /* store file */
565 PDEBUG(DEBUG_EPOINT, "EPOINT(%d) entering the store menu\n", ea_endpoint->ep_serial);
566 if (e_vbox_play >= e_vbox_index_num)
568 if (e_vbox_index_num == 0) /* nothing to play */
572 e_vbox_state = VBOX_STATE_STORE_ASK;
573 SCPY(e_vbox_display, (char *)((language)?"speichern 1=ja 3=nein":"store 1=yes 3=back"));
574 set_tone_vbox("store_ask");
577 case '9': /* delete file */
578 PDEBUG(DEBUG_EPOINT, "EPOINT(%d) entering the delete menu\n", ea_endpoint->ep_serial);
579 if (e_vbox_play >= e_vbox_index_num)
581 if (e_vbox_index_num == 0) /* nothing to play */
585 e_vbox_state = VBOX_STATE_DELETE_ASK;
586 SCPY(e_vbox_display, (char *)((language)?"loeschen 1=ja 3=nein":"delete 1=yes 3=back"));
587 set_tone_vbox("delete_ask");
591 /* process the menu */
597 if (vbox_menu[e_vbox_menu].english == NULL)
601 SPRINT(e_vbox_display, "%c: %s", vbox_menu[e_vbox_menu].digit, (language)?vbox_menu[e_vbox_menu].german:vbox_menu[e_vbox_menu].english);
605 if (e_vbox_menu < 0) /* only if menu selection is pressed before*/
607 /* call if phonenumber is given */
608 if (e_vbox_index_num)
609 if (e_vbox_index_callerid[0]!='\0' && !!strcmp(e_vbox_index_callerid,"anonymous") && !!strcmp(e_vbox_index_callerid,"unknown"))
611 set_tone(portlist, "dialing");
612 SPRINT(e_dialinginfo.id, "extern:%s", e_vbox_index_callerid);
613 e_extdialing = e_dialinginfo.id;
620 e_extdialing[0] = vbox_menu[e_vbox_menu].digit;
621 e_extdialing[1] = '\0';
623 PDEBUG(DEBUG_EPOINT, "EPOINT(%d) executing selected menu:%d\n", e_extdialing[0]);
624 action_dialing_vbox_play(); /* redo this method using the digit */
633 while(vbox_menu[e_vbox_menu+1].english) /* jump to the end */
640 PDEBUG(DEBUG_EPOINT, "EPOINT(%d) unsupported digit '%c'\n", ea_endpoint->ep_serial, e_extdialing);
644 /* reset menu after dialing a function */
645 if (e_extdialing[0]!='*' && e_extdialing[0]!='#')
649 e_extdialing[0] = '\0';
655 * this handler is called by Epoint::handler(), whenever the action is NUMB_ACTION_VBOX_PLAY
657 void EndpointAppPBX::vbox_handler(void)
659 /* refresh if counter changes */
660 if (e_vbox_state==VBOX_STATE_PLAY || e_vbox_state==VBOX_STATE_RECORD_PLAY)
661 if (e_vbox_counter != e_vbox_counter_last)
663 e_vbox_counter_last = e_vbox_counter;
664 e_vbox_display_refresh = 1;
667 /* refresh display, if required (include counter) */
668 if (e_vbox_display_refresh && e_ext.vbox_display!=VBOX_DISPLAY_OFF)
671 struct lcr_msg *message;
673 SPRINT(counter, "%02d:%02d", e_vbox_counter/60, e_vbox_counter%60);
674 if (e_vbox_counter_max)
675 UPRINT(strchr(counter,'\0'), " of %02d:%02d", e_vbox_counter_max/60, e_vbox_counter_max%60);
677 e_vbox_display_refresh = 0;
678 message = message_create(ea_endpoint->ep_serial, ea_endpoint->ep_portlist->port_id, EPOINT_TO_PORT, MESSAGE_NOTIFY);
679 SPRINT(message->param.notifyinfo.display, e_vbox_display, counter);
680 PDEBUG(DEBUG_EPOINT, "EPOINT(%d) terminal %s pending display:%s\n", ea_endpoint->ep_serial, e_ext.number, message->param.notifyinfo.display);
681 message_put(message);
682 logmessage(message->type, &message->param, ea_endpoint->ep_portlist->port_id, DIRECTION_OUT);
688 * the audio file has ended
689 * this is called by Endpoint::message_port(), whenever an audio of has been received
691 void EndpointAppPBX::vbox_message_eof(void)
694 int language = e_ext.vbox_language;
696 PDEBUG(DEBUG_EPOINT, "EPOINT(%d) terminal %s end of file during state: %d\n", ea_endpoint->ep_serial, e_ext.number, e_vbox_state);
700 case VBOX_STATE_MENU:
701 case VBOX_STATE_NOTHING:
702 e_vbox_state = VBOX_STATE_MENU;
703 SCPY(e_vbox_display, (char *)((language)?"druecke 2 f. wiedergabe":"press 2 to play"));
704 e_vbox_display_refresh = 1;
705 set_tone_vbox("menu");
708 case VBOX_STATE_PLAY:
709 if (e_vbox_speed > 0)
711 e_vbox_state = VBOX_STATE_MENU;
712 SCPY(e_vbox_display, (char *)((language)?"druecke 3 f. Naechste":"press 3 for next"));
713 e_vbox_display_refresh = 1;
714 set_tone_vbox("menu");
717 /* if we have endoffile because we were playing backwards, we continue to play forward */
720 set_play_vbox(e_vbox_index_file, e_vbox_counter);
724 case VBOX_STATE_PAUSE:
725 SCPY(e_vbox_display, (char *)((language)?"druecke 2 f. weiterspielen":"press 2 to continue"));
726 e_vbox_display_refresh = 1;
729 case VBOX_STATE_CALLINFO_INTRO:
730 if (e_vbox_index_mday==now_tm->tm_mday && e_vbox_index_mon==now_tm->tm_mon && e_vbox_index_year==now_tm->tm_year)
732 e_vbox_state = VBOX_STATE_CALLINFO_MONTH; //german day
733 if (e_ext.vbox_language)
734 /* german starts with day */
735 SPRINT(buffer, "day_%02d", e_vbox_index_mday);
737 /* english starts with month */
738 SPRINT(buffer, "month_%02d", e_vbox_index_mon+1);
739 set_tone_vbox(buffer);
742 case VBOX_STATE_CALLINFO_MONTH:
743 e_vbox_state = VBOX_STATE_CALLINFO_DAY; //german month
744 if (e_ext.vbox_language)
746 /* done with month, so we send the month*/
747 SPRINT(buffer, "month_%02d", e_vbox_index_mon+1);
750 /* done with day, so we send the day */
751 SPRINT(buffer, "day_%02d", e_vbox_index_mday);
753 set_tone_vbox(buffer);
756 case VBOX_STATE_CALLINFO_DAY: //german month
758 e_vbox_state = VBOX_STATE_CALLINFO_HOUR;
759 if (e_ext.vbox_language)
761 if (e_vbox_index_hour == 1)
762 SCPY(buffer, "number_ein");
764 SPRINT(buffer, "number_%02d", e_vbox_index_hour); /* 1-23 hours */
767 SPRINT(buffer, "number_%02d", ((e_vbox_index_hour+11)%12)+1); /* 12 hours am/pm */
769 set_tone_vbox(buffer);
772 case VBOX_STATE_CALLINFO_HOUR:
773 e_vbox_state = VBOX_STATE_CALLINFO_OCLOCK;
774 if (e_ext.vbox_language)
776 set_tone_vbox("oclock");
779 if (e_vbox_index_hour >= 12)
780 set_tone_vbox("oclock_pm");
782 set_tone_vbox("oclock_am");
786 case VBOX_STATE_CALLINFO_OCLOCK:
787 e_vbox_state = VBOX_STATE_CALLINFO_MIN;
788 if (e_ext.vbox_language)
790 // german says "zwölfuhr und eins"
791 // if (e_vbox_index_min == 1)
792 // SCPY(buffer, "number_eine");
794 SPRINT(buffer, "number_%02d", e_vbox_index_min); /* 1-59 minutes */
797 SPRINT(buffer, "number_%02d", e_vbox_index_min);
799 set_tone_vbox(buffer);
802 case VBOX_STATE_CALLINFO_MIN:
803 if (e_ext.vbox_language)
805 e_vbox_state = VBOX_STATE_CALLINFO_MINUTES;
806 if (e_vbox_index_mday == 1)
807 set_tone_vbox("minute");
809 set_tone_vbox("minutes");
812 case VBOX_STATE_CALLINFO_MINUTES:
814 e_vbox_state = VBOX_STATE_CALLINFO_DIGIT;
815 if (e_vbox_index_callerid[0]=='\0' || !strcmp(e_vbox_index_callerid,"anonymous") || !strcmp(e_vbox_index_callerid,"unknown"))
817 set_tone_vbox("call_anonymous");
818 e_vbox_index_callerid_index = strlen(e_vbox_index_callerid);
821 set_tone_vbox("call_from");
822 e_vbox_index_callerid_index = 0;
826 case VBOX_STATE_CALLINFO_DIGIT:
827 while (e_vbox_index_callerid[e_vbox_index_callerid_index] && (e_vbox_index_callerid[e_vbox_index_callerid_index]<'0' || e_vbox_index_callerid[e_vbox_index_callerid_index]>'9'))
828 e_vbox_index_callerid_index++;
829 if (e_vbox_index_callerid[e_vbox_index_callerid_index])
831 SPRINT(buffer, "number_%02d", e_vbox_index_callerid[e_vbox_index_callerid_index]-'0');
832 set_tone_vbox(buffer);
833 e_vbox_index_callerid_index ++;
836 /* the callinfo is played, so we start with the call */
838 e_vbox_counter_last = 0;
839 e_vbox_counter_max = 0;
841 e_vbox_state = VBOX_STATE_PLAY;
842 SPRINT(e_vbox_display, "#%d %%s", e_vbox_play);
843 if (e_ext.vbox_display == VBOX_DISPLAY_DETAILED)
844 UPRINT(strchr(e_vbox_display,'\0'), " (%s)", e_vbox_index_callerid);
845 e_vbox_display_refresh = 1;
846 set_play_vbox(e_vbox_index_file, 0);
850 case VBOX_STATE_RECORD_ASK:
851 set_tone_vbox("record_ask");
852 e_vbox_display_refresh = 1;
855 case VBOX_STATE_STORE_ASK:
856 set_tone_vbox("store_ask");
857 e_vbox_display_refresh = 1;
860 case VBOX_STATE_DELETE_ASK:
861 set_tone_vbox("delete_ask");
862 e_vbox_display_refresh = 1;
865 case VBOX_STATE_RECORD_PLAY:
866 e_vbox_state = VBOX_STATE_RECORD_ASK;
867 SCPY(e_vbox_display, (char *)((language)?"1=Aufn. 2=Wied. 3=nein":"1=record 2=play 3=no"));
868 e_vbox_display_refresh = 1;
869 set_tone_vbox("record_ask");
872 case VBOX_STATE_STORE_DONE:
873 case VBOX_STATE_DELETE_DONE:
874 if (e_vbox_index_num == 0) /* nothing to play */
876 e_vbox_state = VBOX_STATE_MENU;
877 SCPY(e_vbox_display, (char *)((language)?"keine Anrufe":"no calls"));
878 e_vbox_display_refresh = 1;
879 set_tone_vbox("nothing");
882 e_vbox_state = VBOX_STATE_MENU;
883 SCPY(e_vbox_display, (char *)((language)?"druecke 2 f. wiedergabe":"press 2 to play"));
884 e_vbox_display_refresh = 1;
885 set_tone_vbox("menu");
890 PERROR("vbox_message_eof(ep%d): terminal %s unknown state: %d\n", ea_endpoint->ep_serial, e_ext.number, e_vbox_state);
897 * set the given vbox-tone with full path (without appending)
898 * the tone is played and after eof, a message is received
900 void EndpointAppPBX::set_tone_vbox(char *tone)
902 struct lcr_msg *message;
907 if (!ea_endpoint->ep_portlist)
909 PERROR("EPOINT(%d) no portlist\n", ea_endpoint->ep_serial);
911 message = message_create(ea_endpoint->ep_serial, ea_endpoint->ep_portlist->port_id, EPOINT_TO_PORT, MESSAGE_VBOX_TONE);
912 SCPY(message->param.tone.dir, (char *)((e_ext.vbox_language)?"vbox_german":"vbox_english"));
913 SCPY(message->param.tone.name, tone);
914 message_put(message);
916 PDEBUG(DEBUG_EPOINT, "EPOINT(%d) terminal %s set tone '%s'\n", ea_endpoint->ep_serial, e_ext.number, tone);
921 * set the given recording file
922 * the appendix is removed
923 * the file is played and after eof, a message is received
924 * the current counter value is also received by a message
925 * set the offset in seconds of the current recording
927 void EndpointAppPBX::set_play_vbox(char *file, int offset)
930 struct lcr_msg *message;
932 SPRINT(filename, "%s/%s/%s/vbox/%s", INSTALL_DATA, options.extensions_dir, e_vbox, file);
935 if (!strcmp(filename+strlen(filename)-4, ".wav")) /* filename is always more than 4 digits long */
936 filename[strlen(filename)-4] = '\0';
937 else // to not check twice
939 if (!strcmp(filename+strlen(filename)-5, ".isdn")) /* filename is always more than 5 digits long */
940 filename[strlen(filename)-5] = '\0';
942 if (!ea_endpoint->ep_portlist)
944 PERROR("EPOINT(%d) no portlist\n", ea_endpoint->ep_serial);
946 message = message_create(ea_endpoint->ep_serial, ea_endpoint->ep_portlist->port_id, EPOINT_TO_PORT, MESSAGE_VBOX_PLAY);
947 SCPY(message->param.play.file, filename);
948 message->param.play.offset = offset;
949 message_put(message);
951 PDEBUG(DEBUG_EPOINT, "EPOINT(%d) terminal %s set play '%s'\n", ea_endpoint->ep_serial, e_ext.number, filename);
956 * change speed of the recording file, the default is 1
957 * negative values cause negative speed
959 void EndpointAppPBX::set_play_speed(int speed)
961 struct lcr_msg *message;
963 if (!ea_endpoint->ep_portlist)
965 PERROR("EPOINT(%d) no portlist\n", ea_endpoint->ep_serial);
967 message = message_create(ea_endpoint->ep_serial, ea_endpoint->ep_portlist->port_id, EPOINT_TO_PORT, MESSAGE_VBOX_PLAY_SPEED);
968 message->param.speed = speed;
969 message_put(message);
971 PDEBUG(DEBUG_EPOINT, "EPOINT(%d) terminal %s set speed '%d'\n", ea_endpoint->ep_serial, e_ext.number, speed);